3.5 国际化与本地化

国际化和本地化

国际化,简写为i18n(译者注:“国际化”这个词有20个字母,去尾去首中间有18个),是一种无需改动就能适应各种语言的设计代码。本地化是指将显示的文本转化为用户语言的过程。

i18n是依靠翻译键(translation key)实现的。翻译键是一个用于识别与语言无关的可显示文本的字符串。例如,tile.dirt.name 是泥土块(Dirt Block)名称的翻译键,这样,可显示文本就不需要在被引用的时候考虑某种特定语言的问题。要适应一种新语言也不需要再改动代码。

本地化发生在游戏本地项(locale)。在一个Minecraft客户端中本地项是由语言设置指定的。在专用服务器上,唯一支持的本地项设置是en_US。可用的本地项值列表可以在 Minecraft Wiki(https://minecraft.gamepedia.com/Languages#Available_languages)上找到。

 

语言文件

语言文件位于 assets/[namespace]/lang/[locale].lang(例如 examplemod 中的美式英语翻译位于 assets/examplemod/lang/en_us.lang)中。资源打包格式第三项(在pack.mcmeta中指定)要求本地项名称小写。语言文件的格式是用英文等号分隔的键值对构成的行。以#开头的行将被忽略(译者注:与一般的注释有些许区别,下面会讲到)。该文件必须使用UTF-8编码。

# items
item.examplemod.example_item.name=Example Item Name

# blocks
tile.examplemod.example_block.name=Example Block Name

# commands
commands.examplemod.examplecommand.usage=/example <value>

在文件的任何地方加入注释 #PARSE_ESCAPES 将会启用稍显复杂并且有点不同的Java属性文件格式。要使用多行值的话,请启用该格式。

注意: 启用 #PARSE_ESCAPES 会改变语法分析(parse)的许多部分。在其它符号当中,英文冒号将会被识别为键-值分隔符。要使它作为值的一部分,必须使用转义符号\:。

 

在方块和物品上的用法

注意: 2018年7月14日,MCP(译者注:Minecraft Coder Pack)中的概念“未本地化的名字”已经被“翻译键”所取代。

方块、物品和其他一些Minecraft的类都有用于显示它们名字的内置翻译键。通过调用 setTranslationKey(String) 或者重写方法 getTranslateKey() 可以指定这些翻译键。物品也有一个可以被重写的方法 getTranslationKey(ItemStack) 来根据 ItemStack 的伤害或者NBT来提供不同的翻译键。

默认情况下,getTranslationKey() 会返回 tile. 或者 item. 前置到 setTranslationKey(String) 所设置的东西上,ItemBlock 将会继承它对应的方块的未本地化的名字。此外,在本地化之前 .name 总是会附加在翻译键之后。例如 item.setTranslationKey("examplemod.example_item") 与语言文件中的以下行等效:

item.examplemod.example_item.name=Example Item Name

不像注册表的名字,翻译键是不分命名空间的。因此强烈建议将你的modid作为前缀加在翻译键的某个地方(比如examplemod.example_item)来避免命名冲突。否则,如果发生冲突,一个物品的本地项会覆盖其它的(冲突的数据)。

注意: 翻译键的唯一用途就是国际化。不要将他们用作逻辑,使用注册表的名字来应用逻辑。 一个常见的模式是使用 getUnlocalizedName.substring(5) 来为注册表分配名字。这是危险的,并且将翻译键用作逻辑是一种糟糕的实践。考虑先设置注册表名称,然后后根据注册表名称使用 MODID + "." + getRegistryName().getResourcePath() 来设置翻译键。

 

本地化方法

警告: 有一个常见的问题是让服务器给客户端做本地化。服务器只能在自己的本地为自己实现本地化,可能会与连接的客户端的本地语言不一致。 为了遵守客户端的语言设置,服务器应当让客户端在客户端本地项使用 TextComponentTranslation 或者其他能够预留语言的独立翻译键的方法来本地化文本。

net.minecraft.client.resources.I18n (仅限客户端)

这个I18n类只能在Minecraft客户端中被找到!它用于仅限客户端才能运行的代码。试图在服务器端使用这个类会导致抛出异常并崩溃。

  • format(String, Object...) 用格式化字符串对客户端本地项进行本地化。第一个参数是一个翻译键,剩下的是为 String.format(String, Object...) 准备的格式参数。

net.minecraft.util.text.translation.I18n (已废弃)

这个类已被废弃,并应当永远避免使用。它用于仅限逻辑服务器才能运行的代码。由于本地化操作很少出现在服务器端,因此应当使用其它的可选方案。

  • translateToLocal(String) 使用无格式字符串对游戏本地项进行本地化,参数是一个翻译键。
  • translateToLocalFormatted(String, Object...) 使用格式化字符串对游戏本地进行本地化。第一个参数是一个翻译键,剩下的是为 String.format(String, Object...) 准备的格式参数。

TextComponentTranslation

TextComponentTranslation 是一个格式和本地化较少的 ITextComponent。当发送信息给玩家时它非常有用因为它可以自动使用自己的本地项进行本地化。

TextComponentTranslation(String, Object...) 构造函数的第一个参数是一个翻译键,剩下的参数用于格式化。它支持的格式标识符只有这几种:%s、%1$s、%2$s、%3$s等。格式化参数可能是其它的ITextComponent,ITextComponent会被插入到保留了它们所有属性的格式化的结果文本中。

TextComponentHelper

  • createComponentTranslation(ICommandSender, String, Object...) 会依靠接收者常见一个本地化并格式化的 ITextComponent。如果接收者是一个原版客户端,格式化和本地化会预先完成。如果不是,本地化和格式化会使用 TextComponentTranslation 来较晚完成。这当且只当服务器允许原版客户端连接的时候有效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值