update formatters及生成逻辑
This commit is contained in:
parent
5b7f6bc750
commit
ac5ea795dc
15
.umirc.ts
15
.umirc.ts
@ -3,13 +3,13 @@ import { defineConfig } from 'dumi';
|
|||||||
// more config: https://d.umijs.org/config
|
// more config: https://d.umijs.org/config
|
||||||
|
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
title: 'VoerkaI18n全流程国际化解决方案',
|
title : 'VoerkaI18n全流程国际化解决方案',
|
||||||
base:"/voerka-i18n/",
|
base : "/voerka-i18n/",
|
||||||
publicPath:"/voerka-i18n/",
|
publicPath: "/voerka-i18n/",
|
||||||
mode: 'site',
|
mode : 'site',
|
||||||
logo: "/voerka-i18n/images/i18n.png",
|
logo : "/voerka-i18n/images/i18n.png",
|
||||||
outputPath:"docs/dist",
|
outputPath: "docs/dist",
|
||||||
resolve:{
|
resolve : {
|
||||||
includes:["docs/src"]
|
includes:["docs/src"]
|
||||||
},
|
},
|
||||||
locales: [['zh-CN', '中文']],
|
locales: [['zh-CN', '中文']],
|
||||||
@ -21,6 +21,7 @@ export default defineConfig({
|
|||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
`],
|
`],
|
||||||
|
mfsu:{},
|
||||||
scripts:[`
|
scripts:[`
|
||||||
var _hmt = _hmt || [];
|
var _hmt = _hmt || [];
|
||||||
(function() {
|
(function() {
|
||||||
|
@ -1,72 +1,48 @@
|
|||||||
# 自定义格式化器
|
# 格式化器
|
||||||
|
|
||||||
|
## 概念
|
||||||
|
|
||||||
当我们使用`voerkai18n compile`编译后,会生成`languages/formatters.js`文件,可以在该文件中自定义您自己的格式化器。
|
格式化器是`voerkai18n`中引入的用来对待翻译内容中的插值变量进行链式处理的一种机制,目的是为不同的语言下对内容中的插值变量进行动态处理机制。格式化器机制为`voerkai18n`中的日期时间、货币等多语言输出提供了强大灵活、可扩展、可配置的处理方案。
|
||||||
|
|
||||||
`formatters.js`文件内容如下:
|
格式化器具有以下特点:
|
||||||
|
|
||||||
```javascript | pure
|
- 本质上是一个普通的同步函数
|
||||||
module.exports = {
|
- 支持有参和无参两种调用方式
|
||||||
// 在所有语言下生效的格式化器
|
- 支持通过管道符`|`进行链式调用
|
||||||
"*":{
|
- 可以通过`$config`为格式化器传入配置参数
|
||||||
//[格式化名称]:(value)=>{...},
|
|
||||||
//[格式化名称]:(value,arg)=>{...},
|
|
||||||
},
|
|
||||||
// 在所有语言下只作用于特定数据类型的格式化器
|
|
||||||
$types:{
|
|
||||||
// [数据类型名称]:(value)=>{...},
|
|
||||||
// [数据类型名称]:(value)=>{...},
|
|
||||||
},
|
|
||||||
zh:{
|
|
||||||
$types:{
|
|
||||||
// 所有类型的默认格式化器
|
|
||||||
"*":{
|
|
||||||
},
|
|
||||||
Date:{},
|
|
||||||
Number:{},
|
|
||||||
Boolean:{ },
|
|
||||||
String:{},
|
|
||||||
Array:{
|
|
||||||
|
|
||||||
},
|
## 指南
|
||||||
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`类型格式化器,
|
比如我们定义对`Boolean`类型格式化器,
|
||||||
|
|
||||||
```javascript | pure
|
```javascript | pure
|
||||||
//formatters.js
|
//languages/formatters/<语言名称>.js
|
||||||
|
export default {
|
||||||
module.exports = {
|
// 只作用于特定数据类型的格式化器
|
||||||
// 在所有语言下只作用于特定数据类型的格式化器
|
|
||||||
$types:{
|
$types:{
|
||||||
Boolean:(value)=> value ? "ON" : "OFF"
|
Boolean:(value)=> value ? "ON" : "OFF"
|
||||||
}
|
}
|
||||||
@ -78,18 +54,17 @@ t("灯状态:{status}",false) // === 灯状态:OFF
|
|||||||
在上例中,如果我们想在不同的语言环境下,翻译为不同的显示文本,则可以为不同的语言指定类型格式化器
|
在上例中,如果我们想在不同的语言环境下,翻译为不同的显示文本,则可以为不同的语言指定类型格式化器
|
||||||
|
|
||||||
```javascript | pure
|
```javascript | pure
|
||||||
//formatters.js
|
//languages/formatters/zh.js
|
||||||
module.exports = {
|
export default {
|
||||||
zh:{
|
|
||||||
$types:{
|
$types:{
|
||||||
Boolean:(value)=> value ? "开" : "关"
|
Boolean:(value)=> value ? "开" : "关"
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
en:{
|
//languages/formatters/en.js
|
||||||
|
export default {
|
||||||
$types:{
|
$types:{
|
||||||
Boolean:(value)=> value ? "ON" : "OFF"
|
Boolean:(value)=> value ? "ON" : "OFF"
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// 当切换到中文时
|
// 当切换到中文时
|
||||||
t("灯状态:{status}",true) // === 灯状态:开
|
t("灯状态:{status}",true) // === 灯状态:开
|
||||||
@ -101,97 +76,125 @@ t("灯状态:{status}",false) // === 灯状态:OFF
|
|||||||
|
|
||||||
**说明:**
|
**说明:**
|
||||||
|
|
||||||
- 完整的类型格式化器定义形式
|
- 在匹配应用格式化时会先在当前语言的`$types`中查找匹配的格式化器。
|
||||||
|
|
||||||
```javascript | pure
|
|
||||||
module.exports = {
|
|
||||||
"*":{
|
|
||||||
$types:{...}
|
|
||||||
},
|
|
||||||
zh:{
|
|
||||||
$types:{...}
|
|
||||||
},
|
|
||||||
en:{
|
|
||||||
$types:{....}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
在匹配应用格式化时会先在当前语言的`$types`中查找匹配的格式化器,如果找不到再上`*.$types`中查找。
|
|
||||||
|
|
||||||
- `*.$types`代表当所有语言中均没有定义时才匹配的类型格式化。
|
|
||||||
|
|
||||||
- 类型格式化器是**默认执行的,不需要指定名称**。
|
- 类型格式化器是**默认执行的,不需要指定名称**。
|
||||||
|
|
||||||
- 当前作用域的格式化器优先于全局的格式化器。
|
- 当前作用域的格式化器优先于全局的格式化器。
|
||||||
|
- 当指定了其他格式化器时,类型格式化器就失败,比如`t("灯状态:{status | xxx}",true)`时,上面定义的`$types.Boolean`就无效。
|
||||||
|
|
||||||
## 通用的格式化器
|
### 通用的格式化器
|
||||||
|
|
||||||
类型格式化器只针对特定数据类型,并且会默认调用。而通用的格式化器需要使用`|`管道符进行显式调用。
|
类型格式化器只针对特定数据类型,并且会默认调用。而通用的格式化器需要使用`|`管道符进行显式调用。
|
||||||
|
|
||||||
同样的,通用的格式化器定义在`languages/formatters.js`中。
|
同样的,通用的格式化器定义在`languages/formatters/<语言名称>.js`中。
|
||||||
|
|
||||||
```javascript | pure
|
```javascript | pure
|
||||||
module.exports = {
|
|
||||||
"*":{
|
// languages/formatters/zh.js
|
||||||
|
export default {
|
||||||
|
$config:{...},
|
||||||
$types:{...},
|
$types:{...},
|
||||||
[格式化名称]:(value)=>{.....},
|
[格式化名称]:(value)=>{.....},
|
||||||
},
|
}
|
||||||
zh:{
|
// languages/formatters/en.js
|
||||||
$types:{...},
|
export default {
|
||||||
[格式化名称]:(value)=>{.....},
|
$config:{...},
|
||||||
},
|
|
||||||
en:{
|
|
||||||
$types:{....},
|
$types:{....},
|
||||||
[格式化名称]:(value)=>{.....},
|
[格式化名称]:(value)=>{.....},
|
||||||
[格式化名称]:(value,arg)=>{.....},
|
[格式化名称]:(value,arg)=>{.....},
|
||||||
}
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
每一个格式化器均需要指定一个名称,在进行插值替换时会优先依据当前语言来匹配查找格式化器,如果找不到,再到键名为`*`中查找。
|
如果要注册在所有语言中均生效的,可以声明在`languages/formatters/global.js`
|
||||||
|
|
||||||
```javascript | pure
|
```javascript | pure
|
||||||
module.exports = {
|
// languages/formatters/global.js
|
||||||
"*":{
|
export default {
|
||||||
uppercase:(value)=>value
|
$config:{...},
|
||||||
},
|
$types:{....},
|
||||||
zh:{
|
[格式化名称]:(value)=>{.....},
|
||||||
uppercase:(value)=>["一","二","三","四","五","六","七","八","九","十"][value-1]
|
[格式化名称]:(value,arg)=>{.....},
|
||||||
},
|
|
||||||
en:{
|
|
||||||
uppercase:(value)=>["One","Two","Three","Four","Five","Six","seven","eight","nine","ten"][value-1]
|
|
||||||
},
|
|
||||||
jp:{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```javascript | pure
|
||||||
// 当切换到中文时
|
// 当切换到中文时
|
||||||
t("{value | uppercase}",1) // == 一
|
t("{value | uppercase}",1) // == 一
|
||||||
t("{value | uppercase}",2) // == 二
|
t("{value | uppercase}",2) // == 二
|
||||||
t("{value | uppercase}",3) // == 三
|
t("{value | uppercase}",3) // == 三
|
||||||
|
|
||||||
// 当切换到英文时
|
// 当切换到英文时
|
||||||
t("{value | uppercase}",1) // == One
|
t("{value | uppercase}",1) // == One
|
||||||
t("{value | uppercase}",2) // == Two
|
t("{value | uppercase}",2) // == Two
|
||||||
t("{value | uppercase}",3) // == Three
|
t("{value | uppercase}",3) // == Three
|
||||||
// 当切换到日文时,由于在该语言下没有定义uppercase格式式,因此到*中查找
|
|
||||||
|
// 当切换到日文时,由于在该语言下没有定义uppercase,因此到global中查找
|
||||||
t("{value | uppercase}",1) // == 1
|
t("{value | uppercase}",1) // == 1
|
||||||
t("{value | uppercase}",2) // == 2
|
t("{value | uppercase}",2) // == 2
|
||||||
t("{value | uppercase}",3) // == 3
|
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`里面的格式化器则全局有效,在所有场合均可以使用,但是其优先级低于作用域内的同名格式化器。
|
定义在`@voerkai18n/runtime`里面的格式化器则全局有效,在所有场合均可以使用,但是其优先级低于作用域内的同名格式化器。
|
||||||
|
|
||||||
目前内置的全局格式化器请参阅API参考
|
目前内置的全局格式化器请参阅API参考
|
||||||
|
|
||||||
## 扩展格式化器
|
### 扩展格式化器
|
||||||
|
|
||||||
除了可以在当前项目`languages/formatters.js`自定义格式化器和`@voerkai18n/runtime`里面的全局格式化器外,单列了`@voerkai18n/formatters`项目用来包含了更多的格式化器。
|
除了可以在当前项目`languages/formatters/<语言名称>.js`自定义格式化器和`@voerkai18n/runtime`里面的全局格式化器外,计划单列了`@voerkai18n/formatters`项目用来包含了一些不常用的格式化器。
|
||||||
|
|
||||||
|
目前`@voerkai18n/formatters`还是空项目,作为开源项目,欢迎大家提交贡献更多的格式化器。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 开发格式化器
|
||||||
|
|
||||||
作为开源项目,欢迎大家提交贡献更多的格式化器。
|
|
||||||
|
@ -3,26 +3,8 @@
|
|||||||
|
|
||||||
`voerkai18n`内置支持`currency`和`rmb`两个货币相关的格式化器,用来输出多语言场景下的货币显示。
|
`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`类型进行本地化格式输出。
|
当需要对货币本地化显示时,请使用相对应的`currency`格式化器,可以在`t`函数中使用来对`Number`类型进行本地化格式输出。
|
||||||
|
|
||||||
@ -80,14 +62,24 @@
|
|||||||
t("{ value | currency({format:'long',suffix:'<后缀>'})}",1234.56)
|
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`格式化器支持参数:
|
`currency`格式化器支持参数:
|
||||||
|
|
||||||
|
|
||||||
@ -119,7 +111,7 @@
|
|||||||
而中文`radix=4`,就对应`万`、`亿`、`万亿`、...
|
而中文`radix=4`,就对应`万`、`亿`、`万亿`、...
|
||||||
也说是说,`radix`参数仅当指定`unit`值`>0`时用来计算出合适的单位使用的。
|
也说是说,`radix`参数仅当指定`unit`值`>0`时用来计算出合适的单位使用的。
|
||||||
|
|
||||||
**示例:**
|
### **示例**
|
||||||
|
|
||||||
当`activeLanguage='zh'`时,`radix=4`,units = ["","万","亿","万亿","万万亿"]
|
当`activeLanguage='zh'`时,`radix=4`,units = ["","万","亿","万亿","万万亿"]
|
||||||
|
|
||||||
@ -183,7 +175,7 @@
|
|||||||
t("{ value | currency('short',4)}",123456789.88) // $0.00012345678988 trillions
|
t("{ value | currency('short',4)}",123456789.88) // $0.00012345678988 trillions
|
||||||
```
|
```
|
||||||
|
|
||||||
#### 配置
|
### 配置
|
||||||
|
|
||||||
- **配置文件**:`languages/formatters/<语言名称>.js`
|
- **配置文件**:`languages/formatters/<语言名称>.js`
|
||||||
- **配置位置**: `$config.currency`
|
- **配置位置**: `$config.currency`
|
||||||
@ -225,9 +217,9 @@ t("我有{value | currency({format:'bitcoin',symbol:'฿') }个比特币",123443
|
|||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## 人民币 - `rmb`
|
### 人民币 - `rmb`
|
||||||
|
|
||||||
用来输出中文货币,这个格式化器事实上跟国际化关系不大,在其中语言中不存在对应的翻译。
|
用来输出中文货币,这个格式化器事实上跟国际化关系不大,在其他语言中不存在对应的翻译。
|
||||||
|
|
||||||
```javascript | pure
|
```javascript | pure
|
||||||
// 中文数字 = 一亿二千三百四十五万六千七百八十九元八角八分
|
// 中文数字 = 一亿二千三百四十五万六千七百八十九元八角八分
|
||||||
@ -237,3 +229,134 @@ t("{value |rmb(true) }",123456789.88)
|
|||||||
// 自定义格式 = 人民币:壹億貳仟參佰肆拾伍萬陸仟柒佰捌拾玖元捌角捌分整
|
// 自定义格式 = 人民币:壹億貳仟參佰肆拾伍萬陸仟柒佰捌拾玖元捌角捌分整
|
||||||
t("{value |rmb({big:true,prefix:'人民币:', unit:'元',suffix:'整'})}",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') }") `进行格式化,而不需要使用自定义模板字符串的形式。
|
@ -42,6 +42,27 @@ function normalizeCompileOptions(opts={}) {
|
|||||||
return options;
|
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={}){
|
module.exports =async function compile(langFolder,opts={}){
|
||||||
const options = normalizeCompileOptions(opts);
|
const options = normalizeCompileOptions(opts);
|
||||||
let { moduleType,inlineRuntime } = options;
|
let { moduleType,inlineRuntime } = options;
|
||||||
@ -144,49 +165,15 @@ module.exports =async function compile(langFolder,opts={}){
|
|||||||
JSON,
|
JSON,
|
||||||
settings:JSON.stringify(langSettings,null,4)
|
settings:JSON.stringify(langSettings,null,4)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 5 . 生成编译后的格式化函数文件
|
// 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")
|
const formattersFolder = path.join(langFolder,"formatters")
|
||||||
if(!fs.existsSync(formattersFolder)) fs.mkdirSync(formattersFolder)
|
if(!fs.existsSync(formattersFolder)) fs.mkdirSync(formattersFolder)
|
||||||
// 为每一个语言生成一个对应的式化器
|
// 为每一个语言生成一个对应的式化器
|
||||||
languages.forEach(lang=>{
|
languages.forEach(lang=>{
|
||||||
const formattersFile = path.join(formattersFolder,`${lang.name}.js`)
|
generateFormatterFile(lang.name,{formattersFolder,templateContext,moduleType})
|
||||||
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))
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
|
templateContext.comments = "注册到全局的格式化器"
|
||||||
|
generateFormatterFile("global",{formattersFolder,templateContext,moduleType})
|
||||||
|
|
||||||
// 6. 生成编译后的访问入口文件
|
// 6. 生成编译后的访问入口文件
|
||||||
const entryFile = path.join(langFolder,"index.js")
|
const entryFile = path.join(langFolder,"index.js")
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
module.exports = {
|
export default {
|
||||||
"1": "支持的语言\t: {}",
|
"1": "支持的语言\t: {}",
|
||||||
"2": "默认语言\t: {}",
|
"2": "默认语言\t: {}",
|
||||||
"3": "激活语言\t: {}",
|
"3": "激活语言\t: {}",
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
module.exports = {
|
export default {
|
||||||
"1": "Supported languages\t: {}",
|
"1": "Supported languages\t: {}",
|
||||||
"2": "Default language\t: {}",
|
"2": "Default language\t: {}",
|
||||||
"3": "Active language\t\t: {}",
|
"3": "Active language\t\t: {}",
|
||||||
|
@ -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:{
|
|
||||||
|
|
||||||
},
|
// import { Formatter,FlexFormatter } from "./runtime"
|
||||||
// 指定数据类型的默认格式化器
|
export default {
|
||||||
$types:{
|
// 直接对内置格式化器进行配置,请参阅官网文档
|
||||||
// "*" : { },
|
// $config:{
|
||||||
// Date : { },
|
// datetime : {
|
||||||
// Number: { },
|
// units : ["Year","Quarter","Month","Week","Day","Hour","Minute","Second","Millisecond","Microsecond"],
|
||||||
// String: { },
|
// date :{
|
||||||
// Array : { },
|
// long : 'YYYY/MM/DD HH:mm:ss',
|
||||||
// Object: { }
|
// short : "YYYY/MM/DD",
|
||||||
}
|
// format : "local"
|
||||||
// 允许重载内置的格式化器
|
// },
|
||||||
// --- 日期 ------
|
// quarter : {
|
||||||
// date : value => { ... },
|
// long : ["First Quarter","Second Quarter","Third Quarter","Fourth Quarter"],
|
||||||
// shortdate : value => { ... },
|
// short : ["Q1","Q2","Q3","Q4"],
|
||||||
// time : value => { ... },
|
// format : "short"
|
||||||
// shorttime : value => { ... },
|
// },
|
||||||
// year : value => { ... },
|
// month:{
|
||||||
// month : value => { ... },
|
// long : ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
|
||||||
// day : value => { ... },
|
// short : ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"],
|
||||||
// weekdayValue : value => { ... },
|
// format : "long" // 0-长名称,1-短名称,2-数字
|
||||||
// weekday : value => { ... },
|
// },
|
||||||
// shortWeekday : value => { ... },
|
// weekday:{
|
||||||
// monthName : value => { ... },
|
// long : ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
|
||||||
// shorMonthName : value => { ... },
|
// short : ["Sun", "Mon", "Tues", "Wed", "Thur", "Fri", "Sat"],
|
||||||
// --- 时间 ------
|
// format : "long", // 0-长名称,1-短名称,2-数字
|
||||||
// hour : value => { ... },
|
// },
|
||||||
// hour12 : value => { ... },
|
// time : {
|
||||||
// minute : value => { ... },
|
// long : "HH:mm:ss",
|
||||||
// second : value => { ... },
|
// short : "HH:mm:ss",
|
||||||
// millisecond : value => { ... },
|
// format : 'local'
|
||||||
// timestamp : value => { ... },
|
// },
|
||||||
// currency : value => { ... },
|
// timeSlots : {
|
||||||
// number : value => { ... },
|
// 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) => { ... },
|
||||||
}
|
}
|
||||||
|
@ -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:{
|
|
||||||
|
|
||||||
},
|
// import { Formatter,FlexFormatter } from "./runtime"
|
||||||
// 指定数据类型的默认格式化器
|
export default {
|
||||||
$types:{
|
// 直接对内置格式化器进行配置,请参阅官网文档
|
||||||
// "*" : { },
|
// $config:{
|
||||||
// Date : { },
|
// datetime : {
|
||||||
// Number: { },
|
// units : ["Year","Quarter","Month","Week","Day","Hour","Minute","Second","Millisecond","Microsecond"],
|
||||||
// String: { },
|
// date :{
|
||||||
// Array : { },
|
// long : 'YYYY/MM/DD HH:mm:ss',
|
||||||
// Object: { }
|
// short : "YYYY/MM/DD",
|
||||||
}
|
// format : "local"
|
||||||
// 允许重载内置的格式化器
|
// },
|
||||||
// --- 日期 ------
|
// quarter : {
|
||||||
// date : value => { ... },
|
// long : ["First Quarter","Second Quarter","Third Quarter","Fourth Quarter"],
|
||||||
// shortdate : value => { ... },
|
// short : ["Q1","Q2","Q3","Q4"],
|
||||||
// time : value => { ... },
|
// format : "short"
|
||||||
// shorttime : value => { ... },
|
// },
|
||||||
// year : value => { ... },
|
// month:{
|
||||||
// month : value => { ... },
|
// long : ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
|
||||||
// day : value => { ... },
|
// short : ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"],
|
||||||
// weekdayValue : value => { ... },
|
// format : "long" // 0-长名称,1-短名称,2-数字
|
||||||
// weekday : value => { ... },
|
// },
|
||||||
// shortWeekday : value => { ... },
|
// weekday:{
|
||||||
// monthName : value => { ... },
|
// long : ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
|
||||||
// shorMonthName : value => { ... },
|
// short : ["Sun", "Mon", "Tues", "Wed", "Thur", "Fri", "Sat"],
|
||||||
// --- 时间 ------
|
// format : "long", // 0-长名称,1-短名称,2-数字
|
||||||
// hour : value => { ... },
|
// },
|
||||||
// hour12 : value => { ... },
|
// time : {
|
||||||
// minute : value => { ... },
|
// long : "HH:mm:ss",
|
||||||
// second : value => { ... },
|
// short : "HH:mm:ss",
|
||||||
// millisecond : value => { ... },
|
// format : 'local'
|
||||||
// timestamp : value => { ... },
|
// },
|
||||||
// currency : value => { ... },
|
// timeSlots : {
|
||||||
// number : value => { ... },
|
// 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) => { ... },
|
||||||
}
|
}
|
||||||
|
106
packages/cli/languages/formatters/global.js
Normal file
106
packages/cli/languages/formatters/global.js
Normal 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) => { ... },
|
||||||
|
}
|
@ -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:{
|
|
||||||
|
|
||||||
},
|
// import { Formatter,FlexFormatter } from "./runtime"
|
||||||
// 指定数据类型的默认格式化器
|
export default {
|
||||||
$types:{
|
// 直接对内置格式化器进行配置,请参阅官网文档
|
||||||
// "*" : { },
|
// $config:{
|
||||||
// Date : { },
|
// datetime : {
|
||||||
// Number: { },
|
// units : ["Year","Quarter","Month","Week","Day","Hour","Minute","Second","Millisecond","Microsecond"],
|
||||||
// String: { },
|
// date :{
|
||||||
// Array : { },
|
// long : 'YYYY/MM/DD HH:mm:ss',
|
||||||
// Object: { }
|
// short : "YYYY/MM/DD",
|
||||||
}
|
// format : "local"
|
||||||
// 允许重载内置的格式化器
|
// },
|
||||||
// --- 日期 ------
|
// quarter : {
|
||||||
// date : value => { ... },
|
// long : ["First Quarter","Second Quarter","Third Quarter","Fourth Quarter"],
|
||||||
// shortdate : value => { ... },
|
// short : ["Q1","Q2","Q3","Q4"],
|
||||||
// time : value => { ... },
|
// format : "short"
|
||||||
// shorttime : value => { ... },
|
// },
|
||||||
// year : value => { ... },
|
// month:{
|
||||||
// month : value => { ... },
|
// long : ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
|
||||||
// day : value => { ... },
|
// short : ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"],
|
||||||
// weekdayValue : value => { ... },
|
// format : "long" // 0-长名称,1-短名称,2-数字
|
||||||
// weekday : value => { ... },
|
// },
|
||||||
// shortWeekday : value => { ... },
|
// weekday:{
|
||||||
// monthName : value => { ... },
|
// long : ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
|
||||||
// shorMonthName : value => { ... },
|
// short : ["Sun", "Mon", "Tues", "Wed", "Thur", "Fri", "Sat"],
|
||||||
// --- 时间 ------
|
// format : "long", // 0-长名称,1-短名称,2-数字
|
||||||
// hour : value => { ... },
|
// },
|
||||||
// hour12 : value => { ... },
|
// time : {
|
||||||
// minute : value => { ... },
|
// long : "HH:mm:ss",
|
||||||
// second : value => { ... },
|
// short : "HH:mm:ss",
|
||||||
// millisecond : value => { ... },
|
// format : 'local'
|
||||||
// timestamp : value => { ... },
|
// },
|
||||||
// currency : value => { ... },
|
// timeSlots : {
|
||||||
// number : value => { ... },
|
// 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) => { ... },
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
module.exports = {
|
export default {
|
||||||
"支持的语言\t: {}": 1,
|
"支持的语言\t: {}": 1,
|
||||||
"默认语言\t: {}": 2,
|
"默认语言\t: {}": 2,
|
||||||
"激活语言\t: {}": 3,
|
"激活语言\t: {}": 3,
|
||||||
|
@ -1,12 +1,15 @@
|
|||||||
|
|
||||||
const messageIds = require("./idMap")
|
import messageIds from "./idMap.js" // 语言ID映射文件
|
||||||
const { translate,i18nScope } = require("./runtime.js")
|
import runtime from "./runtime.js" // 运行时
|
||||||
const defaultFormatters = require("./formatters/zh.js")
|
const { translate,i18nScope } = runtime
|
||||||
const activeFormatters = defaultFormatters
|
import globalFormatters from "./formatters/global.js" // 注册到全局的格式化器
|
||||||
|
import defaultFormatters from "./formatters/zh.js" // 默认语言格式化器
|
||||||
|
const activeFormatters = defaultFormatters // 激活语言格式化器
|
||||||
|
|
||||||
const defaultMessages = require("./zh.js") // 默认语言包
|
import defaultMessages from "./zh.js"
|
||||||
const activeMessages = defaultMessages
|
const activeMessages = defaultMessages
|
||||||
|
|
||||||
|
|
||||||
// 语言配置文件
|
// 语言配置文件
|
||||||
const scopeSettings = {
|
const scopeSettings = {
|
||||||
"languages": [
|
"languages": [
|
||||||
@ -27,8 +30,8 @@ const scopeSettings = {
|
|||||||
"activeLanguage": "zh",
|
"activeLanguage": "zh",
|
||||||
"namespaces": {}
|
"namespaces": {}
|
||||||
}
|
}
|
||||||
// 格式化器
|
|
||||||
const formatters = {
|
const formatters = {
|
||||||
|
"*" : globalFormatters,
|
||||||
'zh' : defaultFormatters,
|
'zh' : defaultFormatters,
|
||||||
'en' : ()=>import("./formatters/en.js"),
|
'en' : ()=>import("./formatters/en.js"),
|
||||||
'de' : ()=>import("./formatters/de.js")
|
'de' : ()=>import("./formatters/de.js")
|
||||||
@ -53,6 +56,8 @@ const scope = new i18nScope({
|
|||||||
// 翻译函数
|
// 翻译函数
|
||||||
const scopedTtranslate = translate.bind(scope)
|
const scopedTtranslate = translate.bind(scope)
|
||||||
|
|
||||||
module.exports.t = scopedTtranslate
|
export {
|
||||||
module.exports.i18nScope = scope
|
scopedTtranslate as t,
|
||||||
|
scope as i18nScope
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,3 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 判断是否是JSON对象
|
* 判断是否是JSON对象
|
||||||
* @param {*} obj
|
* @param {*} obj
|
||||||
@ -1661,8 +1659,8 @@ var en = {
|
|||||||
next : 'break' // 当出错时下一步的行为: break=中止;skip=忽略
|
next : 'break' // 当出错时下一步的行为: break=中止;skip=忽略
|
||||||
},
|
},
|
||||||
fileSize:{
|
fileSize:{
|
||||||
brief: ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB","NB","DB"],
|
brief : ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB","NB","DB"],
|
||||||
whole:["Bytes", "Kilobytes", "Megabytes", "Gigabytes", "TeraBytes", "PetaBytes", "ExaBytes", "ZetaBytes", "YottaBytes","DoggaBytes"],
|
whole : ["Bytes", "Kilobytes", "Megabytes", "Gigabytes", "TeraBytes", "PetaBytes", "ExaBytes", "ZetaBytes", "YottaBytes","DoggaBytes"],
|
||||||
precision: 2 // 小数精度
|
precision: 2 // 小数精度
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -1967,8 +1965,6 @@ const empty = Formatter$1(function(value,escapeValue,next,$config){
|
|||||||
{ value | error('ERROR:{ error}',) } == 显示error.constructor.name
|
{ value | error('ERROR:{ error}',) } == 显示error.constructor.name
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
* @param {*} value
|
* @param {*} value
|
||||||
* @param {*} escapeValue
|
* @param {*} escapeValue
|
||||||
* @param {*} next 下一步的行为,取值,break,ignore
|
* @param {*} next 下一步的行为,取值,break,ignore
|
||||||
@ -2175,11 +2171,7 @@ var scope = class i18nScope {
|
|||||||
if (!isFunction$2(formatter) || typeof name !== "string") {
|
if (!isFunction$2(formatter) || typeof name !== "string") {
|
||||||
throw new TypeError("Formatter must be a function");
|
throw new TypeError("Formatter must be a function");
|
||||||
}
|
}
|
||||||
language = Array.isArray(language)
|
language = Array.isArray(language) ? language: language ? language.split(","): [];
|
||||||
? language
|
|
||||||
: language
|
|
||||||
? language.split(",")
|
|
||||||
: [];
|
|
||||||
if (asGlobal) {
|
if (asGlobal) {
|
||||||
this.global.registerFormatter(name, formatter, { language });
|
this.global.registerFormatter(name, formatter, { language });
|
||||||
} else {
|
} else {
|
||||||
@ -2742,5 +2734,5 @@ var runtime ={
|
|||||||
getDataTypeName
|
getDataTypeName
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = runtime;
|
export { runtime as default };
|
||||||
//# sourceMappingURL=runtime.cjs.map
|
//# sourceMappingURL=runtime.mjs.map
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
module.exports = {
|
export default {
|
||||||
"1": "支持的语言\t: {}",
|
"1": "支持的语言\t: {}",
|
||||||
"2": "默认语言\t: {}",
|
"2": "默认语言\t: {}",
|
||||||
"3": "激活语言\t: {}",
|
"3": "激活语言\t: {}",
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
import messageIds from "./idMap.js" // 语言ID映射文件
|
import messageIds from "./idMap.js" // 语言ID映射文件
|
||||||
{{if inlineRuntime }}import runtime from "./runtime.js" // 运行时
|
{{if inlineRuntime }}import runtime from "./runtime.js" // 运行时
|
||||||
const { translate,i18nScope } = runtime
|
const { translate,i18nScope } = runtime
|
||||||
|
import globalFormatters from "./formatters/global.js" // 注册到全局的格式化器
|
||||||
import defaultFormatters from "./formatters/{{defaultLanguage}}.js" // 默认语言格式化器
|
import defaultFormatters from "./formatters/{{defaultLanguage}}.js" // 默认语言格式化器
|
||||||
{{if defaultLanguage === activeLanguage}}const activeFormatters = defaultFormatters{{else}}import activeFormatters from "./formatters/{{activeLanguage}}.js"{{/if}} // 激活语言格式化器
|
{{if defaultLanguage === activeLanguage}}const activeFormatters = defaultFormatters{{else}}import activeFormatters from "./formatters/{{activeLanguage}}.js"{{/if}} // 激活语言格式化器
|
||||||
{{else}}import { translate,i18nScope } from "@voerkai18n/runtime"
|
{{else}}import { translate,i18nScope } from "@voerkai18n/runtime"
|
||||||
@ -12,6 +13,7 @@ import defaultMessages from "./{{defaultLanguage}}.js"
|
|||||||
{{else}}
|
{{else}}
|
||||||
const messageIds = require("./idMap")
|
const messageIds = require("./idMap")
|
||||||
{{if inlineRuntime }}const { translate,i18nScope } = require("./runtime.js")
|
{{if inlineRuntime }}const { translate,i18nScope } = require("./runtime.js")
|
||||||
|
const globalFormatters = require("./formatters/global.js") // 注册到全局的格式化器
|
||||||
const defaultFormatters = require("./formatters/{{defaultLanguage}}.js")
|
const defaultFormatters = require("./formatters/{{defaultLanguage}}.js")
|
||||||
{{if defaultLanguage === activeLanguage}}const activeFormatters = defaultFormatters{{else}}const activeFormatters = require("./formatters/{{activeLanguage}}.js"){{/if}}
|
{{if defaultLanguage === activeLanguage}}const activeFormatters = defaultFormatters{{else}}const activeFormatters = require("./formatters/{{activeLanguage}}.js"){{/if}}
|
||||||
{{else}}const { translate,i18nScope } = require("@voerkai18n/runtime")
|
{{else}}const { translate,i18nScope } = require("@voerkai18n/runtime")
|
||||||
@ -23,8 +25,8 @@ const defaultMessages = require("./{{defaultLanguage}}.js") // 默认语
|
|||||||
|
|
||||||
// 语言配置文件
|
// 语言配置文件
|
||||||
const scopeSettings = {{@ settings}}
|
const scopeSettings = {{@ settings}}
|
||||||
// 格式化器
|
|
||||||
const formatters = {
|
const formatters = {
|
||||||
|
"*" : globalFormatters,
|
||||||
{{each languages}}{{if $value.name == defaultLanguage}}'{{defaultLanguage}}' : defaultFormatters{{if $index !== languages.length - 1}},{{/if}}
|
{{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 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}}
|
{{else}}'{{$value.name}}' : ()=>import("./formatters/{{$value.name}}.js"){{if $index !== languages.length - 1}},{{'\n\t'}}{{/if}}{{/if}}{{/each}}
|
||||||
|
@ -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"}}
|
{{if moduleType === "esm"}}
|
||||||
export default{{else}}module.exports = {{/if}} {
|
// import { Formatter,FlexFormatter } from "./runtime"
|
||||||
// 格式化器参数
|
export default{{else}}//const { Formatter,FlexFormatter } = require("./runtime")
|
||||||
$config:{
|
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 : {
|
||||||
$types:{
|
// division : 3, // , 分割位,3代表每3位添加一个,
|
||||||
// "*" : { },
|
// precision : 0 // 精度,即保留小数点位置,0代表不限
|
||||||
// Date : { },
|
// },
|
||||||
// Number: { },
|
// empty:{
|
||||||
// String: { },
|
// //values : [], // 可选,定义空值,如果想让0,''也为空值,可以指定values=[0,'']
|
||||||
// Array : { },
|
// escape : "", // 当空值时显示的备用值
|
||||||
// Object: { }
|
// next : 'break' // 当空值时下一步的行为: break=中止;skip=跳过
|
||||||
}
|
// },
|
||||||
// 允许重载内置的格式化器
|
// error : {
|
||||||
// --- 日期 ------
|
// //当错误时显示的内容,支持的插值变量有message=错误信息,error=错误类名,也可以是一个返回上面内容的同步函数
|
||||||
// date : value => { ... },
|
// escape : null, // 默认当错误时显示空内容
|
||||||
// shortdate : value => { ... },
|
// next : 'break' // 当出错时下一步的行为: break=中止;skip=忽略
|
||||||
// time : value => { ... },
|
// },
|
||||||
// shorttime : value => { ... },
|
// fileSize:{
|
||||||
// year : value => { ... },
|
// brief : ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB","NB","DB"],
|
||||||
// month : value => { ... },
|
// whole : ["Bytes", "Kilobytes", "Megabytes", "Gigabytes", "TeraBytes", "PetaBytes", "ExaBytes", "ZetaBytes", "YottaBytes","DoggaBytes"],
|
||||||
// day : value => { ... },
|
// precision: 2 // 小数精度
|
||||||
// weekdayValue : value => { ... },
|
// }
|
||||||
// weekday : value => { ... },
|
// },
|
||||||
// shortWeekday : value => { ... },
|
// 改变特定数据类型的默认格式化器
|
||||||
// monthName : value => { ... },
|
// $types:{
|
||||||
// shorMonthName : value => { ... },
|
// Date : dateFormatter,
|
||||||
// --- 时间 ------
|
// Null : value =>"",
|
||||||
// hour : value => { ... },
|
// Undefined: value =>"",
|
||||||
// hour12 : value => { ... },
|
// Error : value => "ERROR",
|
||||||
// minute : value => { ... },
|
// Boolean : value =>value ? "True":"False",
|
||||||
// second : value => { ... },
|
// Number : numberFormartter
|
||||||
// millisecond : value => { ... },
|
// }
|
||||||
// timestamp : value => { ... },
|
// 以下可以自定义编写格式化器
|
||||||
// currency : value => { ... },
|
// xxxx : value => { ... },
|
||||||
// number : value => { ... },
|
// xxxx : (value,$config) => { ... },
|
||||||
|
// xxxx : (value,...args,$config) => { ... },
|
||||||
|
// xxxx : Formatter(value,...args,$config) => { ... },
|
||||||
|
// xxxx : FlexFormatter(value,params,$config) => { ... },
|
||||||
}
|
}
|
||||||
|
@ -66,8 +66,6 @@ const empty = Formatter(function(value,escapeValue,next,$config){
|
|||||||
{ value | error('ERROR:{ error}',) } == 显示error.constructor.name
|
{ value | error('ERROR:{ error}',) } == 显示error.constructor.name
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
* @param {*} value
|
* @param {*} value
|
||||||
* @param {*} escapeValue
|
* @param {*} escapeValue
|
||||||
* @param {*} next 下一步的行为,取值,break,ignore
|
* @param {*} next 下一步的行为,取值,break,ignore
|
||||||
|
@ -143,8 +143,8 @@ module.exports = {
|
|||||||
next : 'break' // 当出错时下一步的行为: break=中止;skip=忽略
|
next : 'break' // 当出错时下一步的行为: break=中止;skip=忽略
|
||||||
},
|
},
|
||||||
fileSize:{
|
fileSize:{
|
||||||
brief: ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB","NB","DB"],
|
brief : ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB","NB","DB"],
|
||||||
whole:["Bytes", "Kilobytes", "Megabytes", "Gigabytes", "TeraBytes", "PetaBytes", "ExaBytes", "ZetaBytes", "YottaBytes","DoggaBytes"],
|
whole : ["Bytes", "Kilobytes", "Megabytes", "Gigabytes", "TeraBytes", "PetaBytes", "ExaBytes", "ZetaBytes", "YottaBytes","DoggaBytes"],
|
||||||
precision: 2 // 小数精度
|
precision: 2 // 小数精度
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -80,11 +80,7 @@ module.exports = class i18nScope {
|
|||||||
if (!isFunction(formatter) || typeof name !== "string") {
|
if (!isFunction(formatter) || typeof name !== "string") {
|
||||||
throw new TypeError("Formatter must be a function");
|
throw new TypeError("Formatter must be a function");
|
||||||
}
|
}
|
||||||
language = Array.isArray(language)
|
language = Array.isArray(language) ? language: language ? language.split(","): [];
|
||||||
? language
|
|
||||||
: language
|
|
||||||
? language.split(",")
|
|
||||||
: [];
|
|
||||||
if (asGlobal) {
|
if (asGlobal) {
|
||||||
this.global.registerFormatter(name, formatter, { language });
|
this.global.registerFormatter(name, formatter, { language });
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user