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.json
、en_us.json
,具体还有哪些语言可用,可以参阅 wiki;