i18n (英语) 
在 JavaScript 应用程序或模块中添加多语言支持,使用此轻量级包. 用于 形式。 。 。 .
特征 :
- Isomorphic/Universal:在浏览器和节点工作(无)
fetch语言预装时需要) - 静态文本文件的简单翻译
- 好处:任何人都可以翻译,不再使用 xliff
- 减少出错幅度.
- 可变支持
- 后退地块和复数
- 包含类型脚本
- 无依赖性
- 快点
安装
npm install @draggable/i18n
使用量
默认导出是一个共享的单通实例, I18N 是班级.
import i18n, { I18N } from '@draggable/i18n'
const i18nOptions = {
extension: '.lang', // extension used by your language files, defaults to ".lang"
location: 'https://location.of/language/files/', // absolute or relative url to language files
langs: [
// locales you would like to be active
'en-US',
'pt-BR',
'de-DE', // will attempt to load `https://location.of/language/files/de-DE.lang` with current config
],
locale: 'en-US', // default locale
override: {
'en-US': {
autocomplete: 'Autofinish', // override individual keys or provide entire language definition
},
},
}
// configure the singleton and load the current locale
await i18n.init(i18nOptions)
// or create a separate instance
const myI18n = new I18N(i18nOptions)
await myI18n.init()
I18N(options) (无) new)返回单通,与默认导出相同。 这样的选项
仅在单子尚未创建的情况下使用; 使用 i18n.init(options) 要重新配置它.
在你的应用中
<label>{i18n.get('addOption')}</label>
选项
| 选项 | 类型 | 默认 | 说明 |
|---|---|---|---|
extension | string | '.lang' | 远程语言文件扩展名 |
location | string | 'assets/lang/' | 包含语言文件的目录的url 或路径 |
langs | string[] | ['en-US'] | 可用语言选择器的本地语言, 方便使用 |
locale | string | 'en-US' | 初始区域,回到第一个区域 langs 空时 |
preloaded | { [locale]: { [key]: string } } | {} | 不获取而可用语言 |
override | { [locale]: { [key]: string } } | {} | 优先于已装入和预装语言的密钥 |
fallbackLocale | string | string[] | – 说吧 – | 返回到缺少密钥时的位置,参见 后退区域 |
onMissing | (info) => string | void | – 说吧 – | 请求缺少密钥和参数,参见 缺少密钥 |
翻译
// languages: { 'en-US': { greeting: 'Hello {name}', total: '{count} of {count}' } }
i18n.get('greeting', { name: 'Ana' }) // 'Hello Ana'
i18n.get('total', 3) // '3 of 3', a primitive replaces every placeholder
i18n.get('greeting') // 'Hello {name}', no args: no replacement
i18n.get('missing') // undefined
// t() always returns a string, falling back to the key
i18n.t('greeting', { name: 'Ana' }) // 'Hello Ana'
i18n.t('missing') // 'missing'
// per-call locale, without changing the current locale
i18n.get('greeting', { name: 'Ana' }, 'de-DE') // 'Hallo Ana'
i18n.t('greeting', { name: 'Ana' }, 'de-DE') // 'Hallo Ana'
i18n.getValue('greeting', 'de-DE') // 'Hallo {name}', raw string
// t() bound to a locale, handy on servers handling several locales at once
const t = i18n.forLocale('de-DE')
t('greeting', { name: 'Ana' }) // 'Hallo Ana'
缺少的占位符参数被空字符串所取代 .
后退区域
无 fallbackLocale 缺少的密钥会用任何装入的语句( 遗留行为) 查找 .
与 fallbackLocale 设置查询顺序为:
- 请求的地块, 例如 .
pt-BR - 其基础语言,如果装入,例如:.
pt - 按顺序排列
t()返回密钥,get()返回时undefined
const i18n = new I18N({
locale: 'pt-BR',
fallbackLocale: ['pt', 'en'],
preloaded: {
'pt-BR': { save: 'Salvar' },
pt: { cancel: 'Cancelar' },
en: { save: 'Save', cancel: 'Cancel', help: 'Help' },
},
})
i18n.t('save') // 'Salvar'
i18n.t('cancel') // 'Cancelar'
i18n.t('help') // 'Help'
i18n.getLocaleChain('pt-BR') // ['pt-BR', 'pt', 'en']
何时 fallbackLocale 设置,其值为空字符串的密钥('') 计为已翻译,返回为 ''
而不是掉下来。 没有它,空字符串就被视为缺失.
init() 还装入尚未装入的后退方位 .
复数
键缺失时 args 是数字还是数字 count,则使用密钥的复数形式.
选择表单时 Intl.PluralRules 语言:
key.zero (仅用于计算) 0,则 key.<category> (单位:千美元)zero, (中文(简体) ), one, (中文(简体) ), two, (中文(简体) ), few, (中文(简体) ), many, (中文(简体) ), other,则 key.other。 。 。 .
{count} 其他占位符照常更换。 若为 Intl.PluralRules 不详, 1 实值 one 还有什么是 other。 。 。 .
items.zero = No items
items.one = {count} item
items.other = {count} items
files.other = {count} files in {folder}
i18n.t('items', 0) // 'No items'
i18n.t('items', { count: 1 }) // '1 item'
i18n.t('items', 5) // '5 items'
i18n.t('files', { count: 2, folder: 'docs' }) // '2 files in docs'
一个存在于当前状态的密钥( 如 :. items)总是优先于其多元形式.
缺少密钥和参数
const i18n = new I18N({
onMissing: ({ key, locale, type, arg }) => {
console.warn(`missing ${type}`, locale, key, arg)
if (type === 'key') return `[${key}]` // optional replacement
},
})
onMissing 名为 get() 财务报告和审定财务报表 t() 缺少的密钥 (type: 'key')和缺失的占位符值
(单位:千美元)type: 'arg',与 arg 设置到占位符名称。 返回字符串时使用它; 返回时没有保留
默认( e)undefined 从 get()键 t(), (中文(简体) ), '' (关于辩论).
初始化后添加语言
i18n.addLanguage('fr-FR', {
addOption: 'Ajouter une option',
})
// or from the contents of a .lang file
i18n.addLanguage('fr-FR', 'addOption = Ajouter une option')
再次添加同一地块会合并密钥; getLangs 财务报告和审定财务报表 loaded 请不要重复.
设置字符串
i18n.put('greeting', 'Hi {name}') // current language
i18n.put('greeting', 'Oi {name}', 'pt-BR') // a specific locale
更改语言
await i18n.setCurrent('de-DE') // fetches de-DE.lang unless already loaded or preloaded
处理一个配置
i18n.processConfig({ locale: 'de-DE', override: { 'de-DE': { save: 'Speichern' } } })
processConfig(options) 应用选项而不获取任何东西; init(options) 应用它们并装入电流
语言.
服务器侧用法
没有 fetch 当语言从字符串中预装或添加时需要:
import { readFileSync } from 'node:fs'
import { I18N } from '@draggable/i18n'
const i18n = new I18N({
locale: 'en-US',
fallbackLocale: 'en-US',
preloaded: {
'en-US': I18N.parse(readFileSync('lang/en-US.lang', 'utf8')),
},
})
i18n.addLanguage('de-DE', readFileSync('lang/de-DE.lang', 'utf8'))
// per request
const t = i18n.forLocale(request.locale)
t('greeting', { name: user.name })
setCurrent() 财务报告和审定财务报表 init() 不获取预加载或添加的地块 addLanguage()。 。 。 .
通用JS也得到支持: const { I18N } = require('@draggable/i18n')。 。 。 .
类型脚本
类型包括:
import i18n, { I18N, type I18NOptions, type I18NInstance } from '@draggable/i18n'
const options: I18NOptions = { locale: 'en-US', fallbackLocale: 'en-US' }
const instance: I18NInstance = new I18N(options)
const label: string = instance.t('addOption')
.lang 文件
# comments start with # or ; at the beginning of a line
de-DE = Deutsch
en-US = German
addOption = Option hinzufügen
allFieldsRemoved = Alle Felder wurden entfernt.
allowMultipleFiles = Upload mehrerer Dateien erlauben
autocomplete = Autovervollständigung
; a trailing backslash continues the value on the next line,
; leading whitespace of the next line is ignored
longText = Dies ist ein langer Text, \
der über mehrere Zeilen geht.
- 一个
key = value每行、按键和值被修剪 \n财务报告和审定财务报表\r\n支持行尾, 忽略空白行#或者说;仅在行首( 在可选的空白后) 开始注释, 不在数值后- 一条线索
\加入下一行,\\将行尾保持为-is
解析文件内容 I18N.parse(text) (别名: I18N.processFile(text)) (中文(简体) ).