【发布时间】:2019-10-18 14:35:46
【问题描述】:
在 Java/Vaadin 中语言切换是如何工作的?我有一个 Web 应用程序并想集成一个组合框,它可以更改此应用程序中每个文本的语言。我是否需要标记应手动翻译的每个文本并定义其翻译?将此功能实现到一个 exting 项目中有多复杂?
【问题讨论】:
标签: java localization internationalization vaadin
在 Java/Vaadin 中语言切换是如何工作的?我有一个 Web 应用程序并想集成一个组合框,它可以更改此应用程序中每个文本的语言。我是否需要标记应手动翻译的每个文本并定义其翻译?将此功能实现到一个 exting 项目中有多复杂?
【问题讨论】:
标签: java localization internationalization vaadin
我是否需要标记每个应该手动翻译的文本并定义其翻译?
您应该使用ResourceBundles 来存储/读取字符串的翻译。
在 Java/Vaadin 中语言切换是如何工作的?
您需要提供一个实现I18NProvider 的类。可以在here 找到相关文档
一旦正确实施,您将能够在任何组件上调用getTranslation("HelloWorld")(因此在任何视图上,因为它们必须扩展组件),以接收定义在 ResourceBundle 文件中的键“HelloWorld”的翻译当前的 UI 语言环境。
扩展 LocaleChangeObserver 的视图会在 Locale 更改时收到通知,然后您可以再次调用 getTranslation("HelloWorld") 以查找新设置的语言的翻译。
我想集成一个组合框,它可以更改此应用程序中每个文本的语言。
参见我的this SO answer,我在其中发布了用作语言切换器的Select 组件的示例代码。它同时使用 ResourceBundle 和 I18NProvider。 (您也可以使用 ComboBox,但缺点是您只能为所选值显示字符串)
该代码中的重要部分是 Select 具有设置 VaadinSession 的区域设置的 ValueChangeListener,这反过来将触发您的视图现在应该实现的 LocaleChangeObserver 的 localeChange 方法。在 localeChange 方法中,可以重新翻译视图中每个组件的可翻译字符串;在Labels 中设置新文本,为TextFields 设置新标签和占位符等。
将此功能实现到一个exting项目中有多复杂?
这在很大程度上取决于您对complex 的定义,以及您对 ResourceBundles 的熟悉程度。当然还有比这更复杂的话题,但 I18N 从来都不是一件容易的事。在我看来,Vaadin 在为我们的开发人员提供了一种在我们的应用程序中使用 I18N 的方法方面做得非常出色。
【讨论】:
大多数人使用某种翻译文件系统进行本地化。基本上,您使用键和值系统为每种语言创建一个文本文件,在其中您使用键和翻译值命名每条翻译的消息。然后,您可以使用这些键(应该是预定义的)来获取您想要的语言的正确消息。这些文件实际上可以是任何东西,但是如果您正在寻找一个简单的 java 实现,那么有很简单的方法可以做到这一点。例如看here。
【讨论】:
【讨论】: