跳到主要内容

国际化

通常在你的插件中支持翻译是一个好主意,特别是如果你想吸引最广泛的用户群。Adventure通过在几乎所有最终显示给客户端的文本中添加服务器端翻译层来简化这一过程。

Javadocs

Adventure关于翻译的所有Javadocs可以在这里找到。

GlobalTranslator

所有翻译都通过GlobalTranslator完成。 你可以自己渲染翻译并添加新的翻译源。

你可以通过创建TranslationRegistry实例 或自己实现Translator接口来向GlobalTranslator添加源。

翻译在哪里工作

原版Minecraft通过使用客户端捆绑的语言文件或通过资源包提供的语言文件在客户端处理翻译。如果你不想在资源包中发送自定义语言文件,服务器端翻译是唯一的替代方案。它们在组件API存在的任何地方都可以工作,除了ItemStack的显示文本,如显示名称或说明文字。所以聊天、实体显示名称、记分板、标签列表等都支持翻译。

警告

客户端在设置数据包中声明的玩家语言是在玩家加入服务器之后到达的,所以在PlayerJoinEvent或任何更早的事件中,无法保证翻译会对正在加入的客户端生效。 你可以监听加入后的第一个PlayerClientOptionsChangeEvent 来100%确定加入的客户端使用的是什么语言。

示例

ResourceBundle

src/main/resources/your/plugin/Bundle_en_US.properties
some.translation.key=翻译的消息: {0}
TranslationRegistry registry = TranslationRegistry.create(Key.key("namespace:value"));

ResourceBundle bundle = ResourceBundle.getBundle("your.plugin.Bundle", Locale.US, UTF8ResourceBundleControl.get());
registry.registerAll(Locale.US, bundle, true);
GlobalTranslator.translator().addSource(registry);

这创建了一个在指定命名空间下的新TranslationRegistry。然后,从类路径上使用指定Locale的位置创建一个ResourceBundle。 最后,将该ResourceBundle添加到注册表中。然后将该注册表作为源添加到GlobalTranslator中。 这使所有翻译在服务器端可用。

现在你可以在可翻译组件中使用翻译键。

final Component message = Component.translatable("some.translation.key", Component.text("参数"))

这将向使用美式英语语言的客户端显示:翻译的消息: 参数