在写一个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...


acrazing
839 声望26 粉丝

天涯海角