Skip to main content

Localization & Language

这一章不是必要的,主要讲述如何给之前的物品添加名称,并且提供语言支持。前面的章节创建的 item 名称都是内部的类名,开发者也许懂,但使用者可能会不理解。

这是 minecraft 为了提升可维护性,方便本地化,默认是没有物体名称,item 只有自己的编号(transitionKey,也就是之前看到的和类名/包名/属性名很像的 XXX.XXX.XXX

可以看出翻译的方法是:获取名称时就使用 TranslationTextComponent 传入 translationKey,显然是用这个 key 到翻译文件中映射出本地化的名称,然后渲染在客户端;

而拿取的 getTranslationKey() 在私有成员为 translationKey = null 的时候使用默认的 getDefaultTranslationKey(),计算方法是调用了 Util.makeTranslationKey,获取了 item 注册的包前缀名,和 item 拼在一起。

所以,我们可以通过定义 Item 对象的 translationKey 来手动指定翻译的键。

另一方面,实际命名和语言的本地化则需要开发者自己完成,有两者方法,第一种比较简单,用 JSON 文件组成从前面的翻译键到名字的映射工作;第二种是使用 I18n.format 的方法,以后用到再提。

前者使用比较容易,首先找到前面说的 item 的编号(在 Item 类内部,大家可以自己到源码中找一找);下一步,是创建一个 lang 目录,位置如下:

resources/
├── META-INF/
│   └── mods.toml
├── assets/
│   ├── mymod/ # 你的 modid,之前材质存放的地方(作用域为 mymod:/)
│   | ├── models/
│   | ├── textures/
| | └── lang/ # 这里是新建的 lang 目录
| |
| └── minecraft/
|
└── pack.mcmeta

lang/ 中写一个简体中文的 JSON map,举个例子:

// file: zh_cn.json
{
"item.XXX.obsidian_ingot": "黑曜石锭",
"item.XXX.obsidian_apple":"黑曜石苹果",
"item.XXX.obsidian_sword":"黑曜石剑",
"itemGroup.obsidian_group": "黑曜石物品栏"
}

当然如果想让自己的 mod 国际化,还可以写 zh_tw.jsonen_us.json,具体还有哪些语言可用,可以参阅 wiki