update formatters及生成逻辑

This commit is contained in:
wxzhang 2022-08-25 18:14:43 +08:00
parent 5b7f6bc750
commit ac5ea795dc
19 changed files with 831 additions and 470 deletions

View File

@ -3,13 +3,13 @@ import { defineConfig } from 'dumi';
// more config: https://d.umijs.org/config
export default defineConfig({
title: 'VoerkaI18n全流程国际化解决方案',
base:"/voerka-i18n/",
publicPath:"/voerka-i18n/",
mode: 'site',
logo: "/voerka-i18n/images/i18n.png",
outputPath:"docs/dist",
resolve:{
title : 'VoerkaI18n全流程国际化解决方案',
base : "/voerka-i18n/",
publicPath: "/voerka-i18n/",
mode : 'site',
logo : "/voerka-i18n/images/i18n.png",
outputPath: "docs/dist",
resolve : {
includes:["docs/src"]
},
locales: [['zh-CN', '中文']],
@ -20,7 +20,8 @@ export default defineConfig({
ul.__dumi-default-layout-toc > li[data-depth=2] {
font-weight: bold;
}
`],
`],
mfsu:{},
scripts:[`
var _hmt = _hmt || [];
(function() {

View File

@ -1,72 +1,48 @@
# 自定义格式化器
# 格式化器
## 概念
当我们使用`voerkai18n compile`编译后,会生成`languages/formatters.js`文件,可以在该文件中自定义您自己的格式化器
格式化器是`voerkai18n`中引入的用来对待翻译内容中的插值变量进行链式处理的一种机制,目的是为不同的语言下对内容中的插值变量进行动态处理机制。格式化器机制为`voerkai18n`中的日期时间、货币等多语言输出提供了强大灵活、可扩展、可配置的处理方案
`formatters.js`文件内容如下
格式化器具有以下特点
```javascript | pure
module.exports = {
// 在所有语言下生效的格式化器
"*":{
//[格式化名称]:(value)=>{...},
//[格式化名称]:(value,arg)=>{...},
},
// 在所有语言下只作用于特定数据类型的格式化器
$types:{
// [数据类型名称]:(value)=>{...},
// [数据类型名称]:(value)=>{...},
},
zh:{
$types:{
// 所有类型的默认格式化器
"*":{
},
Date:{},
Number:{},
Boolean:{ },
String:{},
Array:{
- 本质上是一个普通的同步函数
- 支持有参和无参两种调用方式
- 支持通过管道符`|`进行链式调用
- 可以通过`$config`为格式化器传入配置参数
},
Object:{
## 指南
}
},
[格式化名称]:(value)=>{.....},
//.....
},
en:{
$types:{
// [数据类型名称]:(value)=>{...},
},
[格式化名称]:(value)=>{.....},
//.....更多的格式化器.....
}
}
```
## 格式化器函数
### 格式化器函数
**每一个格式化器就是一个普通的同步函数**,不支持异步函数,格式化器函数可以支持无参数或有参数。
- 无参数的格式化器:`(value)=>{....返回格式化的结果...}`
- 无参数的格式化器:`(value,$config)=>{....返回格式化的结果...}`
- 带参数的格式化器:`(value,arg1,...,$config)=>{....返回格式化的结果...}`,其中`value`是上一个格式化器的输出结果。
- 带参数的格式化器:`(value,arg1,...)=>{....返回格式化的结果...}`,其中`value`是上一个格式化器的输出结果。
## 类型格式化器
格式化器函数的第一个参数是上一个格式化器的输出,最后一个参数是定义在`$config`中的配置参数。
可以为每一种数据类型指定一个默认的格式化器,支持对`String``Date``Error``Object``Array``Boolean``Number`等数据类型的格式化。
**调用方式:**
当插值变量传入时,如果有定义了对应的的类型格式化器,会默认调用该格式化器对数据进行转换。
```javascript | pure
t("商品价格:{ value | currency }") // 参数调用
t("商品价格:{ value | currency('long') }") /// 有参调用
t("商品价格:{ value | currency('long') | prefix('人民币') }") /// 有参调用且链式调用
```
### 类型格式化器
可以为每一种数据类型指定一个默认的格式化器,支持对`String``Date``Error``Object``Array``Boolean``Number`等数据类型的格式化。当插值变量传入时,如果有定义了对应的的类型格式化器,会默认调用该格式化器对数据进行转换。
比如我们定义对`Boolean`类型格式化器,
```javascript | pure
//formatters.js
module.exports = {
// 在所有语言下只作用于特定数据类型的格式化器
//languages/formatters/<语言名称>.js
export default {
// 只作用于特定数据类型的格式化器
$types:{
Boolean:(value)=> value ? "ON" : "OFF"
}
@ -78,17 +54,16 @@ t("灯状态:{status}",false) // === 灯状态OFF
在上例中,如果我们想在不同的语言环境下,翻译为不同的显示文本,则可以为不同的语言指定类型格式化器
```javascript | pure
//formatters.js
module.exports = {
zh:{
$types:{
Boolean:(value)=> value ? "开" : "关"
}
},
en:{
$types:{
Boolean:(value)=> value ? "ON" : "OFF"
}
//languages/formatters/zh.js
export default {
$types:{
Boolean:(value)=> value ? "开" : "关"
}
}
//languages/formatters/en.js
export default {
$types:{
Boolean:(value)=> value ? "ON" : "OFF"
}
}
// 当切换到中文时
@ -101,97 +76,125 @@ t("灯状态:{status}",false) // === 灯状态OFF
**说明:**
- 完整的类型格式化器定义形式
```javascript | pure
module.exports = {
"*":{
$types:{...}
},
zh:{
$types:{...}
},
en:{
$types:{....}
}
}
```
在匹配应用格式化时会先在当前语言的`$types`中查找匹配的格式化器,如果找不到再上`*.$types`中查找。
- `*.$types`代表当所有语言中均没有定义时才匹配的类型格式化。
- 在匹配应用格式化时会先在当前语言的`$types`中查找匹配的格式化器。
- 类型格式化器是**默认执行的,不需要指定名称**。
- 当前作用域的格式化器优先于全局的格式化器。
- 当指定了其他格式化器时,类型格式化器就失败,比如`t("灯状态:{status | xxx}",true)`时,上面定义的`$types.Boolean`就无效。
## 通用的格式化器
### 通用的格式化器
类型格式化器只针对特定数据类型,并且会默认调用。而通用的格式化器需要使用`|`管道符进行显式调用。
同样的,通用的格式化器定义在`languages/formatters.js`中。
同样的,通用的格式化器定义在`languages/formatters/<语言名称>.js`中。
```javascript | pure
module.exports = {
"*":{
$types:{...},
[格式化名称]:(value)=>{.....},
},
zh:{
$types:{...},
[格式化名称]:(value)=>{.....},
},
en:{
$types:{....},
[格式化名称]:(value)=>{.....},
[格式化名称]:(value,arg)=>{.....},
}
// languages/formatters/zh.js
export default {
$config:{...},
$types:{...},
[格式化名称]:(value)=>{.....},
}
// languages/formatters/en.js
export default {
$config:{...},
$types:{....},
[格式化名称]:(value)=>{.....},
[格式化名称]:(value,arg)=>{.....},
}
```
每一个格式化器均需要指定一个名称,在进行插值替换时会优先依据当前语言来匹配查找格式化器,如果找不到,再到键名为`*`中查找。
如果要注册在所有语言中均生效的,可以声明在`languages/formatters/global.js`
```javascript | pure
module.exports = {
"*":{
uppercase:(value)=>value
},
zh:{
uppercase:(value)=>["一","二","三","四","五","六","七","八","九","十"][value-1]
},
en:{
uppercase:(value)=>["One","Two","Three","Four","Five","Six","seven","eight","nine","ten"][value-1]
},
jp:{
}
// languages/formatters/global.js
export default {
$config:{...},
$types:{....},
[格式化名称]:(value)=>{.....},
[格式化名称]:(value,arg)=>{.....},
}
```
```javascript | pure
// 当切换到中文时
t("{value | uppercase}",1) // == 一
t("{value | uppercase}",2) // == 二
t("{value | uppercase}",3) // == 三
// 当切换到英文时
t("{value | uppercase}",1) // == One
t("{value | uppercase}",2) // == Two
t("{value | uppercase}",3) // == Three
// 当切换到日文时由于在该语言下没有定义uppercase格式式因此到*中查找
// 当切换到日文时由于在该语言下没有定义uppercase因此到global中查找
t("{value | uppercase}",1) // == 1
t("{value | uppercase}",2) // == 2
t("{value | uppercase}",3) // == 3
```
## 作用域格式化器
定义`languages/formatters.js`里面的格式化器仅在当前工程生效,也就是仅在当前作用域生效。一般由应用开发者自行扩展。
### 自定义格式化器
## 全局格式化器
当使用`voerkai18n compile`后,项目结构中会生成`formatters`如下:
```javascript | pure
<myapp>
|--src
| |-- languages
| | |-- formatters
| | | |-- zh.js
| | | |-- en.js
| | | |-- de.js
....
```
您可以在`formatters`文件夹中的`zh.js``en.js``de.js`文件中配置或者增加自己的自定义的格式化器。
`languages/formatters/<语言名称>.js`内容大概如下:
```javascript | pure
export default {
$config:{
// 在此配置各格式化器的参数
},
// 在所有语言下只作用于特定数据类型的格式化器
$types:{
// [数据类型名称]:(value)=>{...},
// [数据类型名称]:(value)=>{...},
},
// 自定义的格式化器
[格式化名称]:(value,$config)=>{.....},
[格式化名称]:(value,$config)=>{.....},
[格式化名称]:(value,$config)=>{.....},
//.....更多的格式化器.....
}
```
### 配置机制
### 格式化器作用域
定义在`languages/formatters/<语言名称>.js`里面的格式化器仅在当前工程生效,也就是仅在当前作用域生效。
### 全局格式化器
定义在`@voerkai18n/runtime`里面的格式化器则全局有效,在所有场合均可以使用,但是其优先级低于作用域内的同名格式化器。
目前内置的全局格式化器请参阅API参考
## 扩展格式化器
### 扩展格式化器
除了可以在当前项目`languages/formatters.js`自定义格式化器和`@voerkai18n/runtime`里面的全局格式化器外,单列了`@voerkai18n/formatters`项目用来包含了更多的格式化器。
除了可以在当前项目`languages/formatters/<语言名称>.js`自定义格式化器和`@voerkai18n/runtime`里面的全局格式化器外,计划单列了`@voerkai18n/formatters`项目用来包含了一些不常用的格式化器。
目前`@voerkai18n/formatters`还是空项目,作为开源项目,欢迎大家提交贡献更多的格式化器。
## 开发格式化器
作为开源项目,欢迎大家提交贡献更多的格式化器。

View File

@ -3,26 +3,8 @@
`voerkai18n`内置支持`currency``rmb`两个货币相关的格式化器,用来输出多语言场景下的货币显示。
- **货币组成**
为了支持灵活的货币格式输出,`currency`格式化器将一个完整的货币字符串划分为五部分:
| 前缀 | 符号 | 值 | 单位 | 后缀 |
| :---: | :---: | :---: | :---: | :---: |
| prefix | symbol | value | unit | suffix |
货币表示可以由`prefix``symbol``value``unit``suffix`五部份组成。然后,可以配置一个`format`模板字符串来输出货币。
不同语言或不同的应用场景,可以通过配置`format`模板字符串,自由组合货币输出格式。
**例:**
- `format = "{symbol} {value}{unit}"` ==> `¥123.45元`
- `format = "{prefix} {symbol} {value}{unit}"` ==> `人民币¥123.45元`
## 基本用法
## 指南
### 基本用法
当需要对货币本地化显示时,请使用相对应的`currency`格式化器,可以在`t`函数中使用来对`Number`类型进行本地化格式输出。
@ -80,14 +62,24 @@
t("{ value | currency({format:'long',suffix:'<后缀>'})}",1234.56)
```
## 格式化器
### **货币组成**
为了支持灵活的货币格式输出,`currency`格式化器将一个完整的货币字符串划分为五部分:
| 前缀 | 符号 | 值 | 单位 | 后缀 |
| :---: | :---: | :---: | :---: | :---: |
| prefix | symbol | value | unit | suffix |
货币表示可以由`prefix``symbol``value``unit``suffix`五部份组成。然后,可以配置一个`format`模板字符串,该模板字符串可以由五个占位符(`{prefix}``{symbol}``{value}``{unit}``{suffix}`)自由组合来输出货币。
### 通用货币 - `currency`
并且不同语言或不同的应用场景,可以通过配置`format`模板字符串,自由组合货币输出格式。
#### 参数
**例:**
- `format = "{symbol} {value}{unit}"` ==> `¥123.45元`
- `format = "{prefix} {symbol} {value}{unit}"` ==> `人民币¥123.45元`
### 参数
`currency`格式化器支持参数:
@ -119,7 +111,7 @@
而中文`radix=4`,就对应`万``亿``万亿`、...
也说是说,`radix`参数仅当指定`unit``>0`时用来计算出合适的单位使用的。
**示例**
### **示例**
`activeLanguage='zh'`时,`radix=4`,units = ["","万","亿","万亿","万万亿"]
@ -183,7 +175,7 @@
t("{ value | currency('short',4)}",123456789.88) // $0.00012345678988 trillions
```
#### 配置
### 配置
- **配置文件**`languages/formatters/<语言名称>.js`
- **配置位置** `$config.currency`
@ -225,9 +217,9 @@ t("我有{value | currency({format:'bitcoin',symbol:'฿') }个比特币",123443
```
## 人民币 - `rmb`
### 人民币 - `rmb`
用来输出中文货币,这个格式化器事实上跟国际化关系不大,在其语言中不存在对应的翻译。
用来输出中文货币,这个格式化器事实上跟国际化关系不大,在其语言中不存在对应的翻译。
```javascript | pure
// 中文数字 = 一亿二千三百四十五万六千七百八十九元八角八分
@ -237,3 +229,134 @@ t("{value |rmb(true) }",123456789.88)
// 自定义格式 = 人民币:壹億貳仟參佰肆拾伍萬陸仟柒佰捌拾玖元捌角捌分整
t("{value |rmb({big:true,prefix:'人民币:', unit:'元',suffix:'整'})}",123456789.88)
```
## 扩展配置
`voerkai18n`运行时已经内置了`zh``en`两种语言的货币输出的格式化器,主要是`currency`格式式化器,该格式化器被设计为可以进行配置。当以上格式化器不能满足要求,或者缺少某种语言的货币格式化时,可以非常容易地进行扩展。
扩展支持不同语言言的日期时间格式化非常简单,当使用`voerkai18n compile`后,项目结构中会生成`formatters`如下:
```javascript | pure
<myapp>
|--src
| |-- languages
| | |--
| | |-- formatters
| | | |-- zh.js
| | | |-- en.js
| | | |-- de.js
....
```
`formatters`文件夹中的`zh.js``en.js``de.js`文件中包括了您自定义的格式化器。
当您第一次打开这些文件时,会发现里面除了一些注释来引导您如何编写扩展格式化器外,并没有其他有效的内容。
如果您对现有的日货币格式化器的输出不满意,或者缺少某种语言的货币格式化,您可以按下面介绍的方式来进行扩展。
**放心**,整个扩展过程非常简单,大部分情况下,只需要配置一些模板字符串即可。
以下开始介绍内容:
- **通过简单的配置修改内置的货币格式化规则**
- **为运行时没有支持的语言增加货币格式化规则**
- **自定义预设的规则**
- **编写货币格式化模板**
### **修改内置规则**
由于`@voerkai18n/runtime`中已经内置了`zh``en`两种语言的货币格式化器,大多数情况下,我们会定时更新确保其有效工作,一般情况下,您是不需要修改`zh.js``en.js`这两个文件了。
但是如果内置的`zh``en`两种语言的货币格式化器不能满足要求,您可以选择性地修改`zh.js``en.js`这两个文件,这些文件会覆盖合并到内置的日期和时间格式化规则。
当您第一次打开`languages/formatters/<语言名称>.js`时会发现里面是空的(除了一些注释外)。内容大概如下:
```javascript | pure
export default {
$config:{
}
}
```
接下来,我们只需要在`languages/formatters/<语言名称>.js`文件中按需调整货币格式化的配置参数即可。比如:
- **我们想让`zh`语言的默认格式采用`long`格式,则需要修改:**
```javascript | pure
export default {
$config:{
datetime:{
currency:{
format : "long",
}
}
}
}
```
- **将修改德国的货币符号为`€`**
```javascript | pure
export default {
$config:{
datetime:{
currency:{
symbol : "€",
}
}
}
}
```
- **修改中文`long`预设格式**
中文`long`预设格式是`{prefix} {symbol}{value}{unit}{suffix}`,修改为`RMB {symbol}{value}元`.则需要修改`languages/formatters/zh.js`,如下:
```javascript | pure
export default {
$config:{
datetime:{
currency:{
long : "RMB {symbol}{value}元",
}
}
}
}
```
那么`t("{value | currency('long')}",123.88)`将输出`RMB 123.88元`
完整的配置项见下文。
### **增加格式化规则**
目前,`voerkai18n`只内置了`zh`,`en`两种语言的货币规则支持。其中,`en`语言的货币格式化器被注册到全局。当切换到`zh`,`en`两种语言之外的其他语言时,会使用`en`语言的货币格式化规则。
很明显,`en`语言的日期时间格式化规则并不能适应所有语言的要求,在官方提供该语言支持前,您可以自行配置语言支持。
方法很简单,以`de`语言为例,打开`languages/formatters/de.js`文件。
```javascript | pure
export default {
$config:{
datetime:{
date:{
long:"<de语言的长格式货币模板>"
short:"<de语言的短格式货币模板>"
format:"long" // 默认使用long格式也可以使用一个模板字符串
}
}
}
}
```
这样,当切换到`de`语言时date格式化器就会读取`languages/formatters/de.js`文件中的配置,从而实现符合要求的`de`语言的货币格式化。
### **扩展预设规则**
除了预设的`long``short``default``custom`等规则外,您可以通过模板字符串来自定义更加灵活的格式化规则。
您也可以自己定义一个预设格式化规则。
比如可以定义一个`rmb`的规则来显示更加完整的人民币,方法如下:
`languages/formatters/zh.json`中,增加一个`rmb`配置项即可。
```javascript | pure
export default {
$config: {
rmb: "人民币: {symbol}{value}元整"
}
}
```
有了自定义的`rmb`预设规则,应用中就可以直接使用`t("现在是{ value | currency('rmb') }") `进行格式化,而不需要使用自定义模板字符串的形式。

View File

@ -42,6 +42,27 @@ function normalizeCompileOptions(opts={}) {
return options;
}
function generateFormatterFile(langName,{formattersFolder,templateContext,moduleType}={}){
const formattersFile = path.join(formattersFolder,`${langName}.js`)
if(!fs.existsSync(formattersFile)){
const formattersContent = artTemplate(path.join(__dirname,"templates","formatters.js"), templateContext )
fs.writeFileSync(formattersFile,formattersContent)
logger.log(t(" - 格式化器:{}"),path.basename(formattersFile))
}else{ // 格式化器如果存在,则需要更改对应的模块类型
let formattersContent = fs.readFileSync(formattersFile,"utf8").toString()
if(moduleType == "esm"){
formattersContent = formattersContent.replaceAll(/^[^\n\r\w]*module.exports\s*\=/gm,"export default ")
formattersContent = formattersContent.replaceAll(/^[^\n\r\w]*module.exports\./gm,"export ")
}else{
formattersContent = formattersContent.replaceAll(/^[^\n\r\w]*export\s*default\s*/gm,"module.exports = ")
formattersContent = formattersContent.replaceAll(/^[^\n\r\w]*export\s*/gm,"module.exports.")
}
fs.writeFileSync(formattersFile,formattersContent)
logger.log(t(" - 更新格式化器:{}"),path.basename(formattersFile))
}
}
module.exports =async function compile(langFolder,opts={}){
const options = normalizeCompileOptions(opts);
let { moduleType,inlineRuntime } = options;
@ -144,49 +165,15 @@ module.exports =async function compile(langFolder,opts={}){
JSON,
settings:JSON.stringify(langSettings,null,4)
}
// 5 . 生成编译后的格式化函数文件
// const formattersFile = path.join(langFolder,"formatters.js")
// if(!fs.existsSync(formattersFile)){
// const formattersContent = artTemplate(path.join(__dirname,"templates","formatters.js"), templateContext )
// fs.writeFileSync(formattersFile,formattersContent)
// logger.log(t(" - 格式化器:{}"),path.basename(formattersFile))
// }else{ // 格式化器如果存在,则需要更改对应的模块类型
// let formattersContent = fs.readFileSync(formattersFile,"utf8").toString()
// if(moduleType == "esm"){
// formattersContent = formattersContent.replaceAll(/^[^\n\r\w]*module.exports\s*\=/gm,"export default ")
// formattersContent = formattersContent.replaceAll(/^[^\n\r\w]*module.exports\./gm,"export ")
// }else{
// formattersContent = formattersContent.replaceAll(/^[^\n\r\w]*export\s*default\s*/gm,"module.exports = ")
// formattersContent = formattersContent.replaceAll(/^[^\n\r\w]*export\s*/gm,"module.exports.")
// }
// fs.writeFileSync(formattersFile,formattersContent)
// logger.log(t(" - 更新格式化器:{}"),path.basename(formattersFile))
// }
const formattersFolder = path.join(langFolder,"formatters")
if(!fs.existsSync(formattersFolder)) fs.mkdirSync(formattersFolder)
// 为每一个语言生成一个对应的式化器
languages.forEach(lang=>{
const formattersFile = path.join(formattersFolder,`${lang.name}.js`)
if(!fs.existsSync(formattersFile)){
const formattersContent = artTemplate(path.join(__dirname,"templates","formatters.js"), templateContext )
fs.writeFileSync(formattersFile,formattersContent)
logger.log(t(" - 格式化器:{}"),path.basename(formattersFile))
}else{ // 格式化器如果存在,则需要更改对应的模块类型
let formattersContent = fs.readFileSync(formattersFile,"utf8").toString()
if(moduleType == "esm"){
formattersContent = formattersContent.replaceAll(/^[^\n\r\w]*module.exports\s*\=/gm,"export default ")
formattersContent = formattersContent.replaceAll(/^[^\n\r\w]*module.exports\./gm,"export ")
}else{
formattersContent = formattersContent.replaceAll(/^[^\n\r\w]*export\s*default\s*/gm,"module.exports = ")
formattersContent = formattersContent.replaceAll(/^[^\n\r\w]*export\s*/gm,"module.exports.")
}
fs.writeFileSync(formattersFile,formattersContent)
logger.log(t(" - 更新格式化器:{}"),path.basename(formattersFile))
}
generateFormatterFile(lang.name,{formattersFolder,templateContext,moduleType})
})
templateContext.comments = "注册到全局的格式化器"
generateFormatterFile("global",{formattersFolder,templateContext,moduleType})
// 6. 生成编译后的访问入口文件
const entryFile = path.join(langFolder,"index.js")

View File

@ -1,4 +1,4 @@
module.exports = {
export default {
"1": "支持的语言\t: {}",
"2": "默认语言\t: {}",
"3": "激活语言\t: {}",

View File

@ -1,4 +1,4 @@
module.exports = {
export default {
"1": "Supported languages\t: {}",
"2": "Default language\t: {}",
"3": "Active language\t\t: {}",

View File

@ -1,69 +1,106 @@
/**
格式化器用来对翻译文本内容中的插值变量进行处理
比如将一个数字格式化为货币格式或者将一个日期格式化为友好的日期格式
如何编写格式器请参阅官网
- 以下定义了一些格式化器在中文场景下会启用这些格式化器
import dayjs from "dayjs";
module.exports = {
$config:{...},
$types:{
Date:(value)=>dayjs(value).format("YYYY年MM月DD日 HH:mm:ss"),
},
date:(value)=>dayjs(value).format("YYYY年MM月DD日")
bjTime:(value)=>"北京时间"+ value,
[格式化器名称]:(value)=>{...},
[格式化器名称]:(value)=>{...},
[格式化器名称]:(value)=>{...},
}
}
- 在翻译函数中使用格式化器的方法,示例如下
t("Now is { value | date | bjTime }",{value: new Date()})
其等效于
t(`Now is ${bjTime(date(value))",{value: new Date()})
由于value分别经过两个管道符转换上一个管道符的输出作为下一个管道符的输入,可以多次使用管道符
最终的输出结果
中文: "现在是北京时间2022年3月1日"
英文: "Now is BeiJing 2022/03/01"
*/
module.exports = {
// 格式化器参数
$config:{
},
// 指定数据类型的默认格式化器
$types:{
// "*" : { },
// Date : { },
// Number: { },
// String: { },
// Array : { },
// Object: { }
}
// 允许重载内置的格式化器
// --- 日期 ------
// date : value => { ... },
// shortdate : value => { ... },
// time : value => { ... },
// shorttime : value => { ... },
// year : value => { ... },
// month : value => { ... },
// day : value => { ... },
// weekdayValue : value => { ... },
// weekday : value => { ... },
// shortWeekday : value => { ... },
// monthName : value => { ... },
// shorMonthName : value => { ... },
// --- 时间 ------
// hour : value => { ... },
// hour12 : value => { ... },
// minute : value => { ... },
// second : value => { ... },
// millisecond : value => { ... },
// timestamp : value => { ... },
// currency : value => { ... },
// number : value => { ... },
// import { Formatter,FlexFormatter } from "./runtime"
export default {
// 直接对内置格式化器进行配置,请参阅官网文档
// $config:{
// datetime : {
// units : ["Year","Quarter","Month","Week","Day","Hour","Minute","Second","Millisecond","Microsecond"],
// date :{
// long : 'YYYY/MM/DD HH:mm:ss',
// short : "YYYY/MM/DD",
// format : "local"
// },
// quarter : {
// long : ["First Quarter","Second Quarter","Third Quarter","Fourth Quarter"],
// short : ["Q1","Q2","Q3","Q4"],
// format : "short"
// },
// month:{
// long : ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
// short : ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"],
// format : "long" // 0-长名称1-短名称2-数字
// },
// weekday:{
// long : ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
// short : ["Sun", "Mon", "Tues", "Wed", "Thur", "Fri", "Sat"],
// format : "long", // 0-长名称1-短名称2-数字
// },
// time : {
// long : "HH:mm:ss",
// short : "HH:mm:ss",
// format : 'local'
// },
// timeSlots : {
// slots : [12],
// lowerCases : ["am","pm"],
// upperCases : ["AM","PM"]
// },
// relativeTime : {
// units : ["seconds","minutes","hours","days","weeks","months","years"],
// now : "Now",
// before : "{value} {unit} ago",
// after : "after {value} {unit}"
// }
// },
// currency : {
// default : "{symbol}{value}{unit}",
// long : "{prefix} {symbol}{value}{unit}{suffix}",
// short : "{symbol}{value}{unit}",
// custom : "{prefix} {symbol}{value}{unit}{suffix}",
// format : "default",
// //--
// units : [""," thousands"," millions"," billions"," trillions"], //千,百万,十亿,万亿
// radix : 3, // 进制即三位一进中文是4位一进
// symbol : "$", // 符号
// prefix : "USD", // 前缀
// suffix : "", // 后缀
// division : 3, // ,分割位
// precision : 2, // 精度
// },
// number : {
// division : 3, // , 分割位3代表每3位添加一个,
// precision : 0 // 精度,即保留小数点位置,0代表不限
// },
// empty:{
// //values : [], // 可选定义空值如果想让0,''也为空值可以指定values=[0,'']
// escape : "", // 当空值时显示的备用值
// next : 'break' // 当空值时下一步的行为: break=中止;skip=跳过
// },
// error : {
// //当错误时显示的内容支持的插值变量有message=错误信息,error=错误类名,也可以是一个返回上面内容的同步函数
// escape : null, // 默认当错误时显示空内容
// next : 'break' // 当出错时下一步的行为: break=中止;skip=忽略
// },
// fileSize:{
// brief : ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB","NB","DB"],
// whole : ["Bytes", "Kilobytes", "Megabytes", "Gigabytes", "TeraBytes", "PetaBytes", "ExaBytes", "ZetaBytes", "YottaBytes","DoggaBytes"],
// precision: 2 // 小数精度
// }
// },
// 改变特定数据类型的默认格式化器
// $types:{
// Date : dateFormatter,
// Null : value =>"",
// Undefined: value =>"",
// Error : value => "ERROR",
// Boolean : value =>value ? "True":"False",
// Number : numberFormartter
// }
// 以下可以自定义编写格式化器
// xxxx : value => { ... },
// xxxx : (value,$config) => { ... },
// xxxx : (value,...args,$config) => { ... },
// xxxx : Formatter(value,...args,$config) => { ... },
// xxxx : FlexFormatter(value,params,$config) => { ... },
}

View File

@ -1,69 +1,106 @@
/**
格式化器用来对翻译文本内容中的插值变量进行处理
比如将一个数字格式化为货币格式或者将一个日期格式化为友好的日期格式
如何编写格式器请参阅官网
- 以下定义了一些格式化器在中文场景下会启用这些格式化器
import dayjs from "dayjs";
module.exports = {
$config:{...},
$types:{
Date:(value)=>dayjs(value).format("YYYY年MM月DD日 HH:mm:ss"),
},
date:(value)=>dayjs(value).format("YYYY年MM月DD日")
bjTime:(value)=>"北京时间"+ value,
[格式化器名称]:(value)=>{...},
[格式化器名称]:(value)=>{...},
[格式化器名称]:(value)=>{...},
}
}
- 在翻译函数中使用格式化器的方法,示例如下
t("Now is { value | date | bjTime }",{value: new Date()})
其等效于
t(`Now is ${bjTime(date(value))",{value: new Date()})
由于value分别经过两个管道符转换上一个管道符的输出作为下一个管道符的输入,可以多次使用管道符
最终的输出结果
中文: "现在是北京时间2022年3月1日"
英文: "Now is BeiJing 2022/03/01"
*/
module.exports = {
// 格式化器参数
$config:{
},
// 指定数据类型的默认格式化器
$types:{
// "*" : { },
// Date : { },
// Number: { },
// String: { },
// Array : { },
// Object: { }
}
// 允许重载内置的格式化器
// --- 日期 ------
// date : value => { ... },
// shortdate : value => { ... },
// time : value => { ... },
// shorttime : value => { ... },
// year : value => { ... },
// month : value => { ... },
// day : value => { ... },
// weekdayValue : value => { ... },
// weekday : value => { ... },
// shortWeekday : value => { ... },
// monthName : value => { ... },
// shorMonthName : value => { ... },
// --- 时间 ------
// hour : value => { ... },
// hour12 : value => { ... },
// minute : value => { ... },
// second : value => { ... },
// millisecond : value => { ... },
// timestamp : value => { ... },
// currency : value => { ... },
// number : value => { ... },
// import { Formatter,FlexFormatter } from "./runtime"
export default {
// 直接对内置格式化器进行配置,请参阅官网文档
// $config:{
// datetime : {
// units : ["Year","Quarter","Month","Week","Day","Hour","Minute","Second","Millisecond","Microsecond"],
// date :{
// long : 'YYYY/MM/DD HH:mm:ss',
// short : "YYYY/MM/DD",
// format : "local"
// },
// quarter : {
// long : ["First Quarter","Second Quarter","Third Quarter","Fourth Quarter"],
// short : ["Q1","Q2","Q3","Q4"],
// format : "short"
// },
// month:{
// long : ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
// short : ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"],
// format : "long" // 0-长名称1-短名称2-数字
// },
// weekday:{
// long : ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
// short : ["Sun", "Mon", "Tues", "Wed", "Thur", "Fri", "Sat"],
// format : "long", // 0-长名称1-短名称2-数字
// },
// time : {
// long : "HH:mm:ss",
// short : "HH:mm:ss",
// format : 'local'
// },
// timeSlots : {
// slots : [12],
// lowerCases : ["am","pm"],
// upperCases : ["AM","PM"]
// },
// relativeTime : {
// units : ["seconds","minutes","hours","days","weeks","months","years"],
// now : "Now",
// before : "{value} {unit} ago",
// after : "after {value} {unit}"
// }
// },
// currency : {
// default : "{symbol}{value}{unit}",
// long : "{prefix} {symbol}{value}{unit}{suffix}",
// short : "{symbol}{value}{unit}",
// custom : "{prefix} {symbol}{value}{unit}{suffix}",
// format : "default",
// //--
// units : [""," thousands"," millions"," billions"," trillions"], //千,百万,十亿,万亿
// radix : 3, // 进制即三位一进中文是4位一进
// symbol : "$", // 符号
// prefix : "USD", // 前缀
// suffix : "", // 后缀
// division : 3, // ,分割位
// precision : 2, // 精度
// },
// number : {
// division : 3, // , 分割位3代表每3位添加一个,
// precision : 0 // 精度,即保留小数点位置,0代表不限
// },
// empty:{
// //values : [], // 可选定义空值如果想让0,''也为空值可以指定values=[0,'']
// escape : "", // 当空值时显示的备用值
// next : 'break' // 当空值时下一步的行为: break=中止;skip=跳过
// },
// error : {
// //当错误时显示的内容支持的插值变量有message=错误信息,error=错误类名,也可以是一个返回上面内容的同步函数
// escape : null, // 默认当错误时显示空内容
// next : 'break' // 当出错时下一步的行为: break=中止;skip=忽略
// },
// fileSize:{
// brief : ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB","NB","DB"],
// whole : ["Bytes", "Kilobytes", "Megabytes", "Gigabytes", "TeraBytes", "PetaBytes", "ExaBytes", "ZetaBytes", "YottaBytes","DoggaBytes"],
// precision: 2 // 小数精度
// }
// },
// 改变特定数据类型的默认格式化器
// $types:{
// Date : dateFormatter,
// Null : value =>"",
// Undefined: value =>"",
// Error : value => "ERROR",
// Boolean : value =>value ? "True":"False",
// Number : numberFormartter
// }
// 以下可以自定义编写格式化器
// xxxx : value => { ... },
// xxxx : (value,$config) => { ... },
// xxxx : (value,...args,$config) => { ... },
// xxxx : Formatter(value,...args,$config) => { ... },
// xxxx : FlexFormatter(value,params,$config) => { ... },
}

View File

@ -0,0 +1,106 @@
/**
注册到全局的格式化器
格式化器用来对翻译文本内容中的插值变量进行处理
如何编写格式器请参阅官网
*/
// import { Formatter,FlexFormatter } from "./runtime"
export default {
// 直接对内置格式化器进行配置,请参阅官网文档
// $config:{
// datetime : {
// units : ["Year","Quarter","Month","Week","Day","Hour","Minute","Second","Millisecond","Microsecond"],
// date :{
// long : 'YYYY/MM/DD HH:mm:ss',
// short : "YYYY/MM/DD",
// format : "local"
// },
// quarter : {
// long : ["First Quarter","Second Quarter","Third Quarter","Fourth Quarter"],
// short : ["Q1","Q2","Q3","Q4"],
// format : "short"
// },
// month:{
// long : ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
// short : ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"],
// format : "long" // 0-长名称1-短名称2-数字
// },
// weekday:{
// long : ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
// short : ["Sun", "Mon", "Tues", "Wed", "Thur", "Fri", "Sat"],
// format : "long", // 0-长名称1-短名称2-数字
// },
// time : {
// long : "HH:mm:ss",
// short : "HH:mm:ss",
// format : 'local'
// },
// timeSlots : {
// slots : [12],
// lowerCases : ["am","pm"],
// upperCases : ["AM","PM"]
// },
// relativeTime : {
// units : ["seconds","minutes","hours","days","weeks","months","years"],
// now : "Now",
// before : "{value} {unit} ago",
// after : "after {value} {unit}"
// }
// },
// currency : {
// default : "{symbol}{value}{unit}",
// long : "{prefix} {symbol}{value}{unit}{suffix}",
// short : "{symbol}{value}{unit}",
// custom : "{prefix} {symbol}{value}{unit}{suffix}",
// format : "default",
// //--
// units : [""," thousands"," millions"," billions"," trillions"], //千,百万,十亿,万亿
// radix : 3, // 进制即三位一进中文是4位一进
// symbol : "$", // 符号
// prefix : "USD", // 前缀
// suffix : "", // 后缀
// division : 3, // ,分割位
// precision : 2, // 精度
// },
// number : {
// division : 3, // , 分割位3代表每3位添加一个,
// precision : 0 // 精度,即保留小数点位置,0代表不限
// },
// empty:{
// //values : [], // 可选定义空值如果想让0,''也为空值可以指定values=[0,'']
// escape : "", // 当空值时显示的备用值
// next : 'break' // 当空值时下一步的行为: break=中止;skip=跳过
// },
// error : {
// //当错误时显示的内容支持的插值变量有message=错误信息,error=错误类名,也可以是一个返回上面内容的同步函数
// escape : null, // 默认当错误时显示空内容
// next : 'break' // 当出错时下一步的行为: break=中止;skip=忽略
// },
// fileSize:{
// brief : ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB","NB","DB"],
// whole : ["Bytes", "Kilobytes", "Megabytes", "Gigabytes", "TeraBytes", "PetaBytes", "ExaBytes", "ZetaBytes", "YottaBytes","DoggaBytes"],
// precision: 2 // 小数精度
// }
// },
// 改变特定数据类型的默认格式化器
// $types:{
// Date : dateFormatter,
// Null : value =>"",
// Undefined: value =>"",
// Error : value => "ERROR",
// Boolean : value =>value ? "True":"False",
// Number : numberFormartter
// }
// 以下可以自定义编写格式化器
// xxxx : value => { ... },
// xxxx : (value,$config) => { ... },
// xxxx : (value,...args,$config) => { ... },
// xxxx : Formatter(value,...args,$config) => { ... },
// xxxx : FlexFormatter(value,params,$config) => { ... },
}

View File

@ -1,69 +1,106 @@
/**
格式化器用来对翻译文本内容中的插值变量进行处理
比如将一个数字格式化为货币格式或者将一个日期格式化为友好的日期格式
如何编写格式器请参阅官网
- 以下定义了一些格式化器在中文场景下会启用这些格式化器
import dayjs from "dayjs";
module.exports = {
$config:{...},
$types:{
Date:(value)=>dayjs(value).format("YYYY年MM月DD日 HH:mm:ss"),
},
date:(value)=>dayjs(value).format("YYYY年MM月DD日")
bjTime:(value)=>"北京时间"+ value,
[格式化器名称]:(value)=>{...},
[格式化器名称]:(value)=>{...},
[格式化器名称]:(value)=>{...},
}
}
- 在翻译函数中使用格式化器的方法,示例如下
t("Now is { value | date | bjTime }",{value: new Date()})
其等效于
t(`Now is ${bjTime(date(value))",{value: new Date()})
由于value分别经过两个管道符转换上一个管道符的输出作为下一个管道符的输入,可以多次使用管道符
最终的输出结果
中文: "现在是北京时间2022年3月1日"
英文: "Now is BeiJing 2022/03/01"
*/
module.exports = {
// 格式化器参数
$config:{
},
// 指定数据类型的默认格式化器
$types:{
// "*" : { },
// Date : { },
// Number: { },
// String: { },
// Array : { },
// Object: { }
}
// 允许重载内置的格式化器
// --- 日期 ------
// date : value => { ... },
// shortdate : value => { ... },
// time : value => { ... },
// shorttime : value => { ... },
// year : value => { ... },
// month : value => { ... },
// day : value => { ... },
// weekdayValue : value => { ... },
// weekday : value => { ... },
// shortWeekday : value => { ... },
// monthName : value => { ... },
// shorMonthName : value => { ... },
// --- 时间 ------
// hour : value => { ... },
// hour12 : value => { ... },
// minute : value => { ... },
// second : value => { ... },
// millisecond : value => { ... },
// timestamp : value => { ... },
// currency : value => { ... },
// number : value => { ... },
// import { Formatter,FlexFormatter } from "./runtime"
export default {
// 直接对内置格式化器进行配置,请参阅官网文档
// $config:{
// datetime : {
// units : ["Year","Quarter","Month","Week","Day","Hour","Minute","Second","Millisecond","Microsecond"],
// date :{
// long : 'YYYY/MM/DD HH:mm:ss',
// short : "YYYY/MM/DD",
// format : "local"
// },
// quarter : {
// long : ["First Quarter","Second Quarter","Third Quarter","Fourth Quarter"],
// short : ["Q1","Q2","Q3","Q4"],
// format : "short"
// },
// month:{
// long : ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
// short : ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"],
// format : "long" // 0-长名称1-短名称2-数字
// },
// weekday:{
// long : ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
// short : ["Sun", "Mon", "Tues", "Wed", "Thur", "Fri", "Sat"],
// format : "long", // 0-长名称1-短名称2-数字
// },
// time : {
// long : "HH:mm:ss",
// short : "HH:mm:ss",
// format : 'local'
// },
// timeSlots : {
// slots : [12],
// lowerCases : ["am","pm"],
// upperCases : ["AM","PM"]
// },
// relativeTime : {
// units : ["seconds","minutes","hours","days","weeks","months","years"],
// now : "Now",
// before : "{value} {unit} ago",
// after : "after {value} {unit}"
// }
// },
// currency : {
// default : "{symbol}{value}{unit}",
// long : "{prefix} {symbol}{value}{unit}{suffix}",
// short : "{symbol}{value}{unit}",
// custom : "{prefix} {symbol}{value}{unit}{suffix}",
// format : "default",
// //--
// units : [""," thousands"," millions"," billions"," trillions"], //千,百万,十亿,万亿
// radix : 3, // 进制即三位一进中文是4位一进
// symbol : "$", // 符号
// prefix : "USD", // 前缀
// suffix : "", // 后缀
// division : 3, // ,分割位
// precision : 2, // 精度
// },
// number : {
// division : 3, // , 分割位3代表每3位添加一个,
// precision : 0 // 精度,即保留小数点位置,0代表不限
// },
// empty:{
// //values : [], // 可选定义空值如果想让0,''也为空值可以指定values=[0,'']
// escape : "", // 当空值时显示的备用值
// next : 'break' // 当空值时下一步的行为: break=中止;skip=跳过
// },
// error : {
// //当错误时显示的内容支持的插值变量有message=错误信息,error=错误类名,也可以是一个返回上面内容的同步函数
// escape : null, // 默认当错误时显示空内容
// next : 'break' // 当出错时下一步的行为: break=中止;skip=忽略
// },
// fileSize:{
// brief : ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB","NB","DB"],
// whole : ["Bytes", "Kilobytes", "Megabytes", "Gigabytes", "TeraBytes", "PetaBytes", "ExaBytes", "ZetaBytes", "YottaBytes","DoggaBytes"],
// precision: 2 // 小数精度
// }
// },
// 改变特定数据类型的默认格式化器
// $types:{
// Date : dateFormatter,
// Null : value =>"",
// Undefined: value =>"",
// Error : value => "ERROR",
// Boolean : value =>value ? "True":"False",
// Number : numberFormartter
// }
// 以下可以自定义编写格式化器
// xxxx : value => { ... },
// xxxx : (value,$config) => { ... },
// xxxx : (value,...args,$config) => { ... },
// xxxx : Formatter(value,...args,$config) => { ... },
// xxxx : FlexFormatter(value,params,$config) => { ... },
}

View File

@ -1,4 +1,4 @@
module.exports = {
export default {
"支持的语言\t: {}": 1,
"默认语言\t: {}": 2,
"激活语言\t: {}": 3,

View File

@ -1,11 +1,14 @@
const messageIds = require("./idMap")
const { translate,i18nScope } = require("./runtime.js")
const defaultFormatters = require("./formatters/zh.js")
const activeFormatters = defaultFormatters
import messageIds from "./idMap.js" // 语言ID映射文件
import runtime from "./runtime.js" // 运行时
const { translate,i18nScope } = runtime
import globalFormatters from "./formatters/global.js" // 注册到全局的格式化器
import defaultFormatters from "./formatters/zh.js" // 默认语言格式化器
const activeFormatters = defaultFormatters // 激活语言格式化器
const defaultMessages = require("./zh.js") // 默认语言包
const activeMessages = defaultMessages
import defaultMessages from "./zh.js"
const activeMessages = defaultMessages
// 语言配置文件
const scopeSettings = {
@ -27,8 +30,8 @@ const scopeSettings = {
"activeLanguage": "zh",
"namespaces": {}
}
// 格式化器
const formatters = {
"*" : globalFormatters,
'zh' : defaultFormatters,
'en' : ()=>import("./formatters/en.js"),
'de' : ()=>import("./formatters/de.js")
@ -53,6 +56,8 @@ const scope = new i18nScope({
// 翻译函数
const scopedTtranslate = translate.bind(scope)
module.exports.t = scopedTtranslate
module.exports.i18nScope = scope
export {
scopedTtranslate as t,
scope as i18nScope
}

View File

@ -1,5 +1,3 @@
'use strict';
/**
* 判断是否是JSON对象
* @param {*} obj
@ -1661,8 +1659,8 @@ var en = {
next : 'break' // 当出错时下一步的行为: break=中止;skip=忽略
},
fileSize:{
brief: ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB","NB","DB"],
whole:["Bytes", "Kilobytes", "Megabytes", "Gigabytes", "TeraBytes", "PetaBytes", "ExaBytes", "ZetaBytes", "YottaBytes","DoggaBytes"],
brief : ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB","NB","DB"],
whole : ["Bytes", "Kilobytes", "Megabytes", "Gigabytes", "TeraBytes", "PetaBytes", "ExaBytes", "ZetaBytes", "YottaBytes","DoggaBytes"],
precision: 2 // 小数精度
}
},
@ -1967,8 +1965,6 @@ const empty = Formatter$1(function(value,escapeValue,next,$config){
{ value | error('ERROR:{ error}',) } == 显示error.constructor.name
* @param {*} value
* @param {*} escapeValue
* @param {*} next 下一步的行为取值break,ignore
@ -2175,11 +2171,7 @@ var scope = class i18nScope {
if (!isFunction$2(formatter) || typeof name !== "string") {
throw new TypeError("Formatter must be a function");
}
language = Array.isArray(language)
? language
: language
? language.split(",")
: [];
language = Array.isArray(language) ? language: language ? language.split(","): [];
if (asGlobal) {
this.global.registerFormatter(name, formatter, { language });
} else {
@ -2742,5 +2734,5 @@ var runtime ={
getDataTypeName
};
module.exports = runtime;
//# sourceMappingURL=runtime.cjs.map
export { runtime as default };
//# sourceMappingURL=runtime.mjs.map

View File

@ -1,4 +1,4 @@
module.exports = {
export default {
"1": "支持的语言\t: {}",
"2": "默认语言\t: {}",
"3": "激活语言\t: {}",

View File

@ -2,6 +2,7 @@
import messageIds from "./idMap.js" // 语言ID映射文件
{{if inlineRuntime }}import runtime from "./runtime.js" // 运行时
const { translate,i18nScope } = runtime
import globalFormatters from "./formatters/global.js" // 注册到全局的格式化器
import defaultFormatters from "./formatters/{{defaultLanguage}}.js" // 默认语言格式化器
{{if defaultLanguage === activeLanguage}}const activeFormatters = defaultFormatters{{else}}import activeFormatters from "./formatters/{{activeLanguage}}.js"{{/if}} // 激活语言格式化器
{{else}}import { translate,i18nScope } from "@voerkai18n/runtime"
@ -12,6 +13,7 @@ import defaultMessages from "./{{defaultLanguage}}.js"
{{else}}
const messageIds = require("./idMap")
{{if inlineRuntime }}const { translate,i18nScope } = require("./runtime.js")
const globalFormatters = require("./formatters/global.js") // 注册到全局的格式化器
const defaultFormatters = require("./formatters/{{defaultLanguage}}.js")
{{if defaultLanguage === activeLanguage}}const activeFormatters = defaultFormatters{{else}}const activeFormatters = require("./formatters/{{activeLanguage}}.js"){{/if}}
{{else}}const { translate,i18nScope } = require("@voerkai18n/runtime")
@ -23,8 +25,8 @@ const defaultMessages = require("./{{defaultLanguage}}.js") // 默认语
// 语言配置文件
const scopeSettings = {{@ settings}}
// 格式化器
const formatters = {
"*" : globalFormatters,
{{each languages}}{{if $value.name == defaultLanguage}}'{{defaultLanguage}}' : defaultFormatters{{if $index !== languages.length - 1}},{{/if}}
{{else if $value.name == activeLanguage}}{{if defaultLanguage !== activeLanguage}}'{{activeLanguage}}':activeFormatters{{/if}}{{if $index !== languages.length - 1}},{{/if}}
{{else}}'{{$value.name}}' : ()=>import("./formatters/{{$value.name}}.js"){{if $index !== languages.length - 1}},{{'\n\t'}}{{/if}}{{/if}}{{/each}}

View File

@ -1,70 +1,107 @@
/**
{{comments}}
格式化器用来对翻译文本内容中的插值变量进行处理
比如将一个数字格式化为货币格式或者将一个日期格式化为友好的日期格式
如何编写格式器请参阅官网
- 以下定义了一些格式化器在中文场景下会启用这些格式化器
import dayjs from "dayjs";
export default {
$config:{...},
$types:{
Date:(value)=>dayjs(value).format("YYYY年MM月DD日 HH:mm:ss"),
},
date:(value)=>dayjs(value).format("YYYY年MM月DD日")
bjTime:(value)=>"北京时间"+ value,
[格式化器名称]:(value)=>{...},
[格式化器名称]:(value)=>{...},
[格式化器名称]:(value)=>{...},
}
}
- 在翻译函数中使用格式化器的方法,示例如下
t("Now is { value | date | bjTime }",{value: new Date()})
其等效于
t(`Now is ${bjTime(date(value))",{value: new Date()})
由于value分别经过两个管道符转换上一个管道符的输出作为下一个管道符的输入,可以多次使用管道符
最终的输出结果
中文: "现在是北京时间2022年3月1日"
英文: "Now is BeiJing 2022/03/01"
*/
{{if moduleType === "esm"}}
export default{{else}}module.exports = {{/if}} {
// 格式化器参数
$config:{
},
// 指定数据类型的默认格式化器
$types:{
// "*" : { },
// Date : { },
// Number: { },
// String: { },
// Array : { },
// Object: { }
}
// 允许重载内置的格式化器
// --- 日期 ------
// date : value => { ... },
// shortdate : value => { ... },
// time : value => { ... },
// shorttime : value => { ... },
// year : value => { ... },
// month : value => { ... },
// day : value => { ... },
// weekdayValue : value => { ... },
// weekday : value => { ... },
// shortWeekday : value => { ... },
// monthName : value => { ... },
// shorMonthName : value => { ... },
// --- 时间 ------
// hour : value => { ... },
// hour12 : value => { ... },
// minute : value => { ... },
// second : value => { ... },
// millisecond : value => { ... },
// timestamp : value => { ... },
// currency : value => { ... },
// number : value => { ... },
// import { Formatter,FlexFormatter } from "./runtime"
export default{{else}}//const { Formatter,FlexFormatter } = require("./runtime")
module.exports = {{/if}} {
// 直接对内置格式化器进行配置,请参阅官网文档
// $config:{
// datetime : {
// units : ["Year","Quarter","Month","Week","Day","Hour","Minute","Second","Millisecond","Microsecond"],
// date :{
// long : 'YYYY/MM/DD HH:mm:ss',
// short : "YYYY/MM/DD",
// format : "local"
// },
// quarter : {
// long : ["First Quarter","Second Quarter","Third Quarter","Fourth Quarter"],
// short : ["Q1","Q2","Q3","Q4"],
// format : "short"
// },
// month:{
// long : ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
// short : ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"],
// format : "long" // 0-长名称1-短名称2-数字
// },
// weekday:{
// long : ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
// short : ["Sun", "Mon", "Tues", "Wed", "Thur", "Fri", "Sat"],
// format : "long", // 0-长名称1-短名称2-数字
// },
// time : {
// long : "HH:mm:ss",
// short : "HH:mm:ss",
// format : 'local'
// },
// timeSlots : {
// slots : [12],
// lowerCases : ["am","pm"],
// upperCases : ["AM","PM"]
// },
// relativeTime : {
// units : ["seconds","minutes","hours","days","weeks","months","years"],
// now : "Now",
// before : "{value} {unit} ago",
// after : "after {value} {unit}"
// }
// },
// currency : {
// default : "{symbol}{value}{unit}",
// long : "{prefix} {symbol}{value}{unit}{suffix}",
// short : "{symbol}{value}{unit}",
// custom : "{prefix} {symbol}{value}{unit}{suffix}",
// format : "default",
// //--
// units : [""," thousands"," millions"," billions"," trillions"], //千,百万,十亿,万亿
// radix : 3, // 进制即三位一进中文是4位一进
// symbol : "$", // 符号
// prefix : "USD", // 前缀
// suffix : "", // 后缀
// division : 3, // ,分割位
// precision : 2, // 精度
// },
// number : {
// division : 3, // , 分割位3代表每3位添加一个,
// precision : 0 // 精度,即保留小数点位置,0代表不限
// },
// empty:{
// //values : [], // 可选定义空值如果想让0,''也为空值可以指定values=[0,'']
// escape : "", // 当空值时显示的备用值
// next : 'break' // 当空值时下一步的行为: break=中止;skip=跳过
// },
// error : {
// //当错误时显示的内容支持的插值变量有message=错误信息,error=错误类名,也可以是一个返回上面内容的同步函数
// escape : null, // 默认当错误时显示空内容
// next : 'break' // 当出错时下一步的行为: break=中止;skip=忽略
// },
// fileSize:{
// brief : ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB","NB","DB"],
// whole : ["Bytes", "Kilobytes", "Megabytes", "Gigabytes", "TeraBytes", "PetaBytes", "ExaBytes", "ZetaBytes", "YottaBytes","DoggaBytes"],
// precision: 2 // 小数精度
// }
// },
// 改变特定数据类型的默认格式化器
// $types:{
// Date : dateFormatter,
// Null : value =>"",
// Undefined: value =>"",
// Error : value => "ERROR",
// Boolean : value =>value ? "True":"False",
// Number : numberFormartter
// }
// 以下可以自定义编写格式化器
// xxxx : value => { ... },
// xxxx : (value,$config) => { ... },
// xxxx : (value,...args,$config) => { ... },
// xxxx : Formatter(value,...args,$config) => { ... },
// xxxx : FlexFormatter(value,params,$config) => { ... },
}

View File

@ -66,8 +66,6 @@ const empty = Formatter(function(value,escapeValue,next,$config){
{ value | error('ERROR:{ error}',) } == 显示error.constructor.name
* @param {*} value
* @param {*} escapeValue
* @param {*} next 下一步的行为取值break,ignore

View File

@ -143,8 +143,8 @@ module.exports = {
next : 'break' // 当出错时下一步的行为: break=中止;skip=忽略
},
fileSize:{
brief: ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB","NB","DB"],
whole:["Bytes", "Kilobytes", "Megabytes", "Gigabytes", "TeraBytes", "PetaBytes", "ExaBytes", "ZetaBytes", "YottaBytes","DoggaBytes"],
brief : ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB","NB","DB"],
whole : ["Bytes", "Kilobytes", "Megabytes", "Gigabytes", "TeraBytes", "PetaBytes", "ExaBytes", "ZetaBytes", "YottaBytes","DoggaBytes"],
precision: 2 // 小数精度
}
},

View File

@ -80,11 +80,7 @@ module.exports = class i18nScope {
if (!isFunction(formatter) || typeof name !== "string") {
throw new TypeError("Formatter must be a function");
}
language = Array.isArray(language)
? language
: language
? language.split(",")
: [];
language = Array.isArray(language) ? language: language ? language.split(","): [];
if (asGlobal) {
this.global.registerFormatter(name, formatter, { language });
} else {