【问题标题】:Java Internationalization (i18n) Libraries/FrameworksJava 国际化 (i18n) 库/框架
【发布时间】:2023-12-06 06:45:01
【问题描述】:

我的组织即将开始其公司网站的国际化(i16g?)漫长的过程。该网站混合了 Java EE(JSP/Servlets,无 EJB)和从(Documentum)WCM 推送的静态内容。

虽然我有使用 ResourceBundle 的“内置”机制以及每种语言/区域设置的关联属性文件(包含“KEY=Translated value”方法)的经验,但我们只是在其中引用我们希望翻译文本出现的 KEY 值。

我的主管提到他在以前的组织中使用了一种不同的方法,他们使用了第 3 方库(他不记得实际名称),其中包括网页中的实际 [英文] 文本(以帮助开发人员) 在运行时替换为配置 xml 文件中的翻译内容。 (有人知道这是哪个库吗?)

我对可能有哪些其他方法/库/框架来促进这一点感兴趣。

谢谢

【问题讨论】:

标签: java jakarta-ee internationalization


【解决方案1】:

您的老板可能指的是gettext,就像@Pawel Dyda 提到的那样,但您也可能对cosmopolitan 感兴趣。

【讨论】:

  • 是的,“gettext”似乎是以前的组织使用的 - 我仍在研究它,看看我们是否想走这条路。
  • 我选择了这个答案作为正确的答案,主要是因为它完全符合我的要求,并且不会针对未要求的问题发起攻击。
【解决方案2】:

我的公司还为 Java 维护了一个与 GNU gettext 相关的库(很快就会有针对 Scala 的扩展)。

它不仅支持 GNU gettext 的所有优点,还简化了日期/时间戳和货币的输出和输入,包括在翻译中使用“wiki”格式的工具(因此您可以在单词上输出 HTML 粗体,例如)、java 消息格式、通用的“转义”支持(因此输出可以自动转义以包含在 HTML 中)和货币四舍五入。

它是开源的,目前在 github 上https://github.com/awkay/easy-i18n/

【讨论】:

    【解决方案3】:

    当我听说你在使用ResourceBundles 时,我看到了这样的内容:

    ResourceBundle rb = ResourceBundle.getBundle("messages", locale);
    String someString = rb.getString("some.key");
    

    如果这是您的 Java 服务器页面方法(在 scriplets 中使用此类 sn-ps),这是错误。相反,您应该使用 JSTL 或 Spring 消息标签。

    至于您的询问,我相信他们使用了 Gettext(抱歉没有链接,因为我的时间不多了)。 这不是最好的方法。 JSTL 方法是 JSP 最常见的方法,您应该坚持下去,除非您有充分的理由不这样做。

    【讨论】:

    • 抱歉,我应该更明确一点 - 是的,我的意思是我会使用 ResourceBumndle's 和 JSTL 标签(我们不做脚本):) - 谢谢您的意见,我会调查 gettext 看看是否响起任何铃声。
    【解决方案4】:

    值得一看 http://alexsexton.com/blog/2012/03/the-ux-of-language/ 它很好地解释了 gettext 背后的想法和 gettext 设计的局限性 gettext 更好的方法是 ICU 消息格式,这是 JDK MessageFormat 类所基于的,基于 @987654322 @还有一个基于ICU消息格式的javascript库https://github.com/SlexAxton/messageformat.js

    【讨论】:

      【解决方案5】:

      我希望,现在建议另一种解决方案还为时不晚:https://github.com/resource4j/resource4j

      该库与 Thymeleaf 网页渲染器集成,解决了您提到的问题:您在页面模板中包含英文文本,然后在运行时将其替换为本地化版本。

      【讨论】: