【问题标题】:Language switching - l10n I18n语言切换 - l10n I18n
【发布时间】:2019-10-18 14:35:46
【问题描述】:

在 Java/Vaadin 中语言切换是如何工作的?我有一个 Web 应用程序并想集成一个组合框,它可以更改此应用程序中每个文本的语言。我是否需要标记应手动翻译的每个文本并定义其翻译?将此功能实现到一个 exting 项目中有多复杂?

【问题讨论】:

标签: java localization internationalization vaadin


【解决方案1】:

我是否需要标记每个应该手动翻译的文本并定义其翻译?

您应该使用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 的方法方面做得非常出色。

【讨论】:

    【解决方案2】:

    大多数人使用某种翻译文件系统进行本地化。基本上,您使用键和值系统为每种语言创建一个文本文件,在其中您使用键和翻译值命名每条翻译的消息。然后,您可以使用这些键(应该是预定义的)来获取您想要的语言的正确消息。这些文件实际上可以是任何东西,但是如果您正在寻找一个简单的 java 实现,那么有很简单的方法可以做到这一点。例如看here

    【讨论】:

    • 因此,每一个需要翻译的字符串都必须被一个关键字替换。这些关键词必须与他们想要的翻译一起存储在一个额外的文件中。这是正确的吗?
    • 是的,没错。查看 Kaspar 发送的博客文章的链接。有代码示例。
    • @nidaav 是的,它的工作方式类似于您使用哈希图的方式。它只是查找该键并插入与之配对的字符串值。不久前我在一个网站上工作时,我们会使用英文句子作为关键,使其易于阅读。这样,您仍然可以阅读原始句子,而无需查看本地化文件。当然,这确实会产生一些开销,因为密钥可能相当长。如果出于明显的原因,不建议将其用于长片段;)
    【解决方案3】:

    【讨论】:

    • 这并不是 Stack Overflow 上预期的真正答案。
    • @BasilBourque 公平地说,问题也不是
    猜你喜欢
    • 2017-02-15
    • 2017-02-01
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 2021-02-19
    • 2013-08-06
    • 2020-06-20
    相关资源
    最近更新 更多