Skip to content

格式化器

概念

格式化器是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-CNen-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格式化器接受两个参数beginend,分别用来指定书名的前缀和后缀。

注册后就可以在翻译内容中使用{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)   

提示

格式化器是基于flexvars,更详细的开发细节请参阅其官网文档