跳转至

🛫 国际化 API

随着我们的社区越来越大,语言成为了各个国家的用户和玩家之间交流的障碍。为了解决这个问题,我们提供了I18nAPI并鼓励插件创作者使用国际化接口。

加载翻译数据

i18n.load(path, defaultLocaleName, defaultLangData)

  • 参数:
  • path: String
    翻译数据所在的文件1/目录2
  • defaultLocaleName: String
    默认的语言名称,形如zh_CNen(如果没有提供目标语言给i18n.tri18n.get的翻译,这个参数将被使用)
    若传入空字符串,则默认跟随系统语言
  • defaultLangData: Object
    该参数将用于补全或创建翻译文件,形如
    JavaScript
    1
    2
    3
    4
    5
    6
    7
    8
    9
    {
      localeName: {
        "src": "translation"
      },
      zh_CN: {
        "a.b.c.d.114514": "1919810",
        "src": "源"
      }
    }
    
  • 抛出:
  • 参数无效


获取文本的指定语言翻译

i18n.get(key[,localeName])

  • 参数:
  • key: String
    文本或ID
  • localeName: String(可选)
    目标语言,默认为i18n.load时传入的defaultLocaleName
  • 返回值: String 翻译内容(若经过多次回落仍未找到翻译,则返回key
  • 抛出:
  • 参数无效


使用指定语言翻译文本并格式化

i18n.trl(localeName, key, ...)

  • 参数:
  • localeName: String
    目标语言
  • key: String
    文本或ID
  • ...: Any
    格式化参数
  • 返回值: String 翻译并格式化后的文本
  • 注意: 格式化应遵循语法
  • 抛出:
  • 参数无效


使用默认语言翻译文本并格式化

i18n.tr(key, ...)

  • 参数:
  • key: String
    文本或ID
  • ...: Any
    格式化参数
  • 返回值: String 翻译并格式化后的文本
  • 注意: 格式化应遵循语法
  • 抛出:
  • 参数无效


完整样例

JavaScript
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
i18n.load("plugins/feature-llse-i18n-test/language.json", "" /* "zh_CN" */, {
  "zh_CN": {
    "{1}, {0}, named_arg(float.2): {named_arg:.2f}": "测试: {1}, {0}, named_arg(float.2): {named_arg:.2f}",
    "{} {} {a} {b}": "测试2: {} {} {a} {b}",
    "welcome": "Hi, {}! 欢迎来到服务器!"
  },
  "en": {
    "welcome": "Hi, {}! Welcome to the SERVER!"
  }
});

LLSE_Player.prototype._sendText = LLSE_PLayer.prototype.sendText;
LLSE_Player.prototype.sendText = function() {
  let args = Array.from(arguments);
  let text = args.shift();
  pl._sendText(i18n.trl(this.langCode, text, ...args));
}

logger.info(tr("{1}, {0}, named_arg(float.2): {named_arg:.2f}", "string0", 1, {
  named_arg: 114.51419 // Named arguments should be object
}));
// Out: 测试: 1, string0, named_arg(float.2): 114.51

logger.info(tr("{} {} {a} {b}", "arg0", "arg1", {
  a: "114514",
  b: "1919810"
}));

mc.listen("onJoin", (pl) => {
  pl.sendText("welcome", pl.realName);
});

  1. 文件必须为JSON格式,且文件内容应类似:

    JSON
    1
    2
    3
    4
    5
    6
    7
    8
    9
    {
      "localeName": {
        "src": "translation"
      },
      "zh_CN": {
        "a.b.c.d.114514": "1919810",
        "src": "源"
      }
    }
    
     

  2. 请在路径的末尾加上路径分隔符(/\\)。
    目录内容应类似:

    Text Only
    1
    2
    3
          ┌ LOCALE_name.json
    [Dir] ┼ en.json
          └ zh_CN.json
    
    其中的每个文件内容都应类似:
    JSON
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    {
      "a.c.b.d": "translation",
      "use": {
        "nested": {
          "src": "translation"
        },
        "114514": {
          "1919810": "heng heng aaaaaaaaaaaaaaaaaaaaaaaaa",
          "a": "此处的ID为use.nested.114514.a",
          "b": "The ID of this will be use.nested.114514.b"
        }
      }
    }