格式化器
概念
格式化器是voerkai18n中引入的用来对翻译内容中的插值变量进行链式处理的一种机制,目的是为不同的语言下对内容中的插值变量进行动态处理。格式化器机制为voerkai18n中的日期时间、货币等多语言输出提供了强大灵活、可扩展、可配置的处理方案。
@voerkai18n/formatters提供了以下格式化器:
| 格式化器名称 | 说明 |
|---|---|
currency | 货币格式化器 |
date | 日期格式化器 |
month | 月份格式化器 |
time | 时间格式化器 |
timeSlots | 时间格式化器 |
quarter | 季度格式化器 |
weekday | 星期格式化器 |
number | 数字格式化器 |
relativeTime | 相对时间格式化器 |
指南
默认配置
默认情况下,voerkai18n提供了一些内置的格式化器。
ts
import formatters from "@voerkai18n/formatters"
export const i18nScope = new VoerkaI18nScope({
formatters,
// ...
})按需配置
@voerkai18n/formatters提供了一些内置的格式化器,但也需要额外增加应用包大小。如果你的应用中只需要部分格式化器,也可以按需要配置需要的格式化器。
ts
import timeFormatter from "@voerkai18n/formatters/time"
import currencyFormatter from "@voerkai18n/formatters/currency"
import dateFormatter from "@voerkai18n/formatters/date"
import numberFormatter from "@voerkai18n/formatters/number"
import relativeTimeFormatter from "@voerkai18n/formatters/relativeTime"
import quarterFormatter from "@voerkai18n/formatters/quarter"
import weekdayFormatter from "@voerkai18n/formatters/weekday"
import monthFormatter from "@voerkai18n/formatters/month"
import timeSlotsFormatter from "@voerkai18n/formatters/timeSlots"
export const i18nScope = new VoerkaI18nScope({
formatters: [
timeFormatter
currencyFormatter
dateFormatter
numberFormatter
relativeTimeFormatter
quarterFormatter
weekdayFormatter
monthFormatter
timeSlotsFormatter
],
// ...
})配置格式化器
@voerkai18n/formatters内置支持zh-CN、en-US两种语言的格式化器,其他语言的格式化器需要自行配置。
比如,内置的currency格式化器不支持日语,要增加ja-JP支持,可以在languages/formatters.json文件中进行配置。
json
{
"ja-JP":{
"currency" : {
"units" : ["","千","百万","十亿","万亿"],
"radix" : 4,
"symbol" : "¥",
"prefix" : "JPY",
"suffix" : "円",
"division" : 3,
"precision": 2,
// 指定默认的格式化规则模板名称
"format" : "long",
// 预定义格式化规则模板
"default" : "{symbol}{value}{unit}",
"long" : "{prefix} {symbol}{value}{unit}{suffix}",
"short" : "{symbol}{value}{unit}",
"custom" : "{prefix} {symbol}{value}{unit}{suffix}",
"bitcoin" : "BTC {symbol}{value}{unit}{suffix}"
}
},
// ... 其他语言的货币格式化规则
}提示
欢迎大家贡献更多的格式化器,可以提交PR到@voerkai18n/formatters项目。
自定义格式化器
格式化器是基于flexvars开发实现。
格式化器具有以下特点:
- 本质上是一个普通的同步函数
- 支持
有参和无参两种调用方式 - 支持通过管道符
|进行链式调用 - 格式化器函数最后一个参数是当前语言的格式化器配置参数
$config - 格式化器函数
this指向scope实例
下面我们来开发一个简单的book格式化器,用来格式化书名。在en_US时输出<书名>,在zh_CN时输出《书名》。
ts
import { i18nScope } from "./languages"
import { createFormatter } from "@voerkai18n/formatters"
const book = createFormatter<NumberFormatterArgs,NumberFormatterConfig>({
name: "book",
args:["begin","end"],
next(value,args,ctx){
const config = ctx.getConfig()
return `${config.begin}value${config.end}`
}
},
// 以下是不同语言的格式化器配置
{
"en-US":{
begin : "<"
end : ">"
},
"zh-CN":{
begin : "《"
end : "》"
}
})
i18nScope.formatters.register(book) - 上面的代码中,我们定义了一个
book格式化器,用来格式化书名,然后在i18nScope中注册。 book格式化器接受两个参数begin和end,分别用来指定书名的前缀和后缀。
注册后就可以在翻译内容中使用{book}格式化器了。
ts
t("书名:{name | book }", "《三体》")
await changeLanguage("en-US")
t("书名:{name | book }", "<三体>")- 格式化支持通过有参调用方式覆盖格式化默认参数。
ts
t("书名:{name | book('[') }", "[三体》")
t("书名:{name | book('[',']') }", "[三体]")
t("书名:{name | book({begin:'[',end:']'}) }", "[三体]")全局格式化器
使用创建格式化时可以指定global=true将该文件声明的格式化器均注册到全局中,这样格式化可以在所有VoerkaI18nScope中生效。
ts
i18nScope.formatters.register(book,true) - 在
languages/index.ts中注册格式化器自动注册为全局。
ts
import formatters from "@voerkai18n/formatters"
const i18nScope = new VoerkaI18nScope({
formatters, // 自动注册为全局格式化器
// ...
})
// 仅在当前作用域生效
i18nScope.formatters.register(book)
// 全局生效
i18nScope.formatters.register(book,true)