2 个版本

0.1.1 2023年7月28日
0.1.0 2023年7月7日

#161 in 国际化 (i18n)

MIT/Apache

11KB
137

easy i18n

一个 easy i18n 工具

示例

use easy_i18n::{self, i18n, I18N};
use std::path::Path;

// set source
easy_i18n::set_source(Path::new("./src/source"));

// set lang
easy_i18n::set_lang("EN");

i18n!("这是一个测试"); // This is a test

// Sometimes, the same text has different translation results in different contexts. At this time, we can set different namespaces
i18n!("这是一个测试", ns="namespace1"); // This is a test, but it is different

// If there is a dynamic value in the text, we can use %1, %2, %3.. as a placeholder, where the number represents the position of the dynamic value
i18n!("他的成绩是,语文:%1, 数学:%2", 88, 100); // His grades are Chinese: 88, Mathematics: 100

// If you have different translation results in other contexts, you can set the namespace
i18n!("他的成绩是,语文:%1, 数学:%2", ns="namespace1", 88, 100); // His grades are Chinese: 88, Mathematics: 100, and the test is not bad.

source 目录包含一些翻译文本及其对应的翻译结果

your_project
  |--src
    |--source
      |-- cn.json
      |-- en.json
      |-- de.json

每个 json 文件的格式如下,必需的 common 字段,可选的 namespace 字段表示不同的上下文

{
  "common": {
    "这是一个测试": "This is a test",
    ...
  }
}

如果相同的文本在不同的上下文中有不同的翻译结果,可以在 json 文件中添加 namespace,例如,en.json 的内容是

{
  "common": {
    "这是一个测试": "This is a test"
  },
  "namespace1": {
    "这是一个测试": "This is a test, but it is different"
  },
  "other_ns": {
    "这是一个测试": "This is a test, haha!"
  }
}

然后只需传入相应的 namespace,例如

i18n!("这是一个测试"); // This is a test
i18n!("这是一个测试", ns="namespace1"); // This is a test, but it is different
i18n!("这是一个测试", ns="other_ns"); // This is a test, haha!

如果文本包含动态值,可以使用 %1%2 作为占位符,其中 1、2 表示动态值的位置,从 1 开始,例如,en.json 的内容是

{
  "common": {
    "这是一个测试": "This is a test",
    "他的成绩是,语文:%1, 数学:%2": "His grades are Chinese: %1, Mathematics: %2"
  }
}

使用方法:

i18n!("他的成绩是,语文:%1, 数学:%2", 88, 100); // His grades are Chinese: 88, Mathematics: 100

当动态值和 namesapce 同时存在时,namespace 放在动态值之前,例如,en.json 的内容是

{
  "common": {
    "这是一个测试": "This is a test",
    "他的成绩是,语文:%1, 数学:%2": "His grades are Chinese: %1, Mathematics: %2"
  },
  "ns":{
    "他的成绩是,语文:%1, 数学:%2": "His grades are Chinese: %1, Mathematics: %2, and the test is not bad."
  }
}
i18n!("他的成绩是,语文:%1, 数学:%2", ns="ns", 88, 100); // His grades are Chinese: 88, Mathematics: 100, and the test is not bad.

依赖

~3–5MB
~91K SLoC