在写一个APP的过程当中, 难免会碰到要做国际化的时刻. 也就是须要依据差别的区域, 展现差别的案牍. 关于简朴的文本, 直接用一个xml或许json或许一个变量就能够搞定, 然则有时刻须要在一句话中到场变量, 就比较贫苦或许说比较恶心了. 比方如许的状况:
cn: 有xx个人喜好了你.
en: xx People liked you.
i18n-json-compiler应运而生, 其作用是将json模板编译成TypeScript(或许JavaScript)函数或许字符串.
比方对以下json:
[
{ "cn": "你好", "en": "Hello" },
{ "cn": "{n}个挚友", "en": "{n} friends" },
]
能够直接编译出ts文件, 内容大抵以下:
export const cn = {
Hello: "你好",
n_friends: (n: any) => n + "个挚友",
}
export const en = {
Hello: "Hello",
n_friends: (n: any) => n + " friends",
}
在代码中直接挪用响应的属性或函数即可.
装置
yarn add i18n-json-compiler
# 或许运用npm/cnpm
npm i -S i18n-json-compiler
运用
在敕令行中, 实行./node_modules/.bin/i18n
, 参数以下:
i18n [options] - Parse i18n json files to typescript files.
Options:
-i, --input-files The json files to parse [string] [required]
-o, --output-dir The directory to emit output [string] [required]
-h, --help Show help [boolean]
-v, --version Show version number [boolean]
--default-lang [string] [default: "cn"]
JSON文档的花样
i18n
敕令接收参数-i
指定输入文件列表(glob), 比方./strings/*.json
, 文件花样为json
, 内容为一个数组. 每一个数组元素为一组须要编译的字符串. key为言语, value为值. 值中被{}
包起来的处所会被转换为函数参数, 其花样为{name:type:default}
, 个中:
-
name
是必须的, 能够是字符串或数字 -
type
为数据类型, 能够是int
,double
,string
,boolean
,any
, 默以为any
, 即接收恣意参数 -
default
为参数默认值
比方:
[
{
"cn": "{n:int:1}个人喜好了你",
"en": "{n}people liked you"
}
]
得出的效果为:
const n_people_liked_you = (n: int = 1) => n + '个人喜好了你'
输出花样
i18n
接收参数-o
指定输出目次, 输入目次中, 包含一个index.ts
文件, 以及多少言语文件夹, 个中index.ts
为所用到的文件, 其导出一个变量strings
, 构造以下:
export interface I18n<T, L> {
// 设置言语
set(lang: string, defaultLang?: L): void;
// 猎取言语下的字符串对象
get(lang: string, defaultLang?: L): T;
// 当前言语
lang: L;
// 当前言语的字符串构造
value: T;
}
例子
参考https://github.com/acrazing/i…, 个中input
为输入目次, output
为输出目次. 在代码中, 只须要:
import { strings } from './output/index.ts'
console.log(strings.value.world.$0_people_liked_you(1))
TODO
- 编译成js
- 差别言语参数位置差别
- 指定称号key
更多内容, 请稳步 https://github.com/acrazing/i…