diff --git a/.umirc.ts b/.umirc.ts index 128f8a2..ca5ff79 100644 --- a/.umirc.ts +++ b/.umirc.ts @@ -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() { diff --git a/docs/src/guide/advanced/customformatter.md b/docs/src/guide/advanced/customformatter.md index 4cb54a4..291c0ef 100644 --- a/docs/src/guide/advanced/customformatter.md +++ b/docs/src/guide/advanced/customformatter.md @@ -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 + + |--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`还是空项目,作为开源项目,欢迎大家提交贡献更多的格式化器。 + + + +## 开发格式化器 -作为开源项目,欢迎大家提交贡献更多的格式化器。 diff --git a/docs/src/guide/use/currency.md b/docs/src/guide/use/currency.md index 9887756..ab07ef7 100644 --- a/docs/src/guide/use/currency.md +++ b/docs/src/guide/use/currency.md @@ -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 + + |--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:"" + short:"" + 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') }") `进行格式化,而不需要使用自定义模板字符串的形式。 \ No newline at end of file diff --git a/packages/cli/compile.command.js b/packages/cli/compile.command.js index dd08549..280d365 100644 --- a/packages/cli/compile.command.js +++ b/packages/cli/compile.command.js @@ -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") diff --git a/packages/cli/languages/de.js b/packages/cli/languages/de.js index f4c4610..9c8c69a 100644 --- a/packages/cli/languages/de.js +++ b/packages/cli/languages/de.js @@ -1,4 +1,4 @@ -module.exports = { +export default { "1": "支持的语言\t: {}", "2": "默认语言\t: {}", "3": "激活语言\t: {}", diff --git a/packages/cli/languages/en.js b/packages/cli/languages/en.js index 2cd84b6..60c00bd 100644 --- a/packages/cli/languages/en.js +++ b/packages/cli/languages/en.js @@ -1,4 +1,4 @@ -module.exports = { +export default { "1": "Supported languages\t: {}", "2": "Default language\t: {}", "3": "Active language\t\t: {}", diff --git a/packages/cli/languages/formatters/de.js b/packages/cli/languages/formatters/de.js index e6e2391..a63c1c1 100644 --- a/packages/cli/languages/formatters/de.js +++ b/packages/cli/languages/formatters/de.js @@ -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) => { ... }, } diff --git a/packages/cli/languages/formatters/en.js b/packages/cli/languages/formatters/en.js index e6e2391..a63c1c1 100644 --- a/packages/cli/languages/formatters/en.js +++ b/packages/cli/languages/formatters/en.js @@ -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) => { ... }, } diff --git a/packages/cli/languages/formatters/global.js b/packages/cli/languages/formatters/global.js new file mode 100644 index 0000000..ba68ce8 --- /dev/null +++ b/packages/cli/languages/formatters/global.js @@ -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) => { ... }, +} diff --git a/packages/cli/languages/formatters/zh.js b/packages/cli/languages/formatters/zh.js index e6e2391..a63c1c1 100644 --- a/packages/cli/languages/formatters/zh.js +++ b/packages/cli/languages/formatters/zh.js @@ -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) => { ... }, } diff --git a/packages/cli/languages/idMap.js b/packages/cli/languages/idMap.js index da04811..7d58237 100644 --- a/packages/cli/languages/idMap.js +++ b/packages/cli/languages/idMap.js @@ -1,4 +1,4 @@ -module.exports = { +export default { "支持的语言\t: {}": 1, "默认语言\t: {}": 2, "激活语言\t: {}": 3, diff --git a/packages/cli/languages/index.js b/packages/cli/languages/index.js index 462c81d..2dfc09a 100644 --- a/packages/cli/languages/index.js +++ b/packages/cli/languages/index.js @@ -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 +} diff --git a/packages/cli/languages/runtime.js b/packages/cli/languages/runtime.js index fc09da5..05c31f0 100644 --- a/packages/cli/languages/runtime.js +++ b/packages/cli/languages/runtime.js @@ -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 diff --git a/packages/cli/languages/zh.js b/packages/cli/languages/zh.js index f4c4610..9c8c69a 100644 --- a/packages/cli/languages/zh.js +++ b/packages/cli/languages/zh.js @@ -1,4 +1,4 @@ -module.exports = { +export default { "1": "支持的语言\t: {}", "2": "默认语言\t: {}", "3": "激活语言\t: {}", diff --git a/packages/cli/templates/entry.js b/packages/cli/templates/entry.js index d4f1e6e..26797e9 100644 --- a/packages/cli/templates/entry.js +++ b/packages/cli/templates/entry.js @@ -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}} diff --git a/packages/cli/templates/formatters.js b/packages/cli/templates/formatters.js index 71a9a5d..c6564a8 100644 --- a/packages/cli/templates/formatters.js +++ b/packages/cli/templates/formatters.js @@ -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) => { ... }, } diff --git a/packages/runtime/formatters/default.js b/packages/runtime/formatters/default.js index 6e08f32..cc7a3bb 100644 --- a/packages/runtime/formatters/default.js +++ b/packages/runtime/formatters/default.js @@ -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 diff --git a/packages/runtime/formatters/en.js b/packages/runtime/formatters/en.js index a865c64..ba811db 100644 --- a/packages/runtime/formatters/en.js +++ b/packages/runtime/formatters/en.js @@ -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 // 小数精度 } }, diff --git a/packages/runtime/scope.js b/packages/runtime/scope.js index 8c3b895..d2e0e9c 100644 --- a/packages/runtime/scope.js +++ b/packages/runtime/scope.js @@ -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 {