【问题标题】:Good practices in spreading the locale object in a java program在 Java 程序中传播语言环境对象的良好实践
【发布时间】:2014-01-29 14:06:45
【问题描述】:

我目前正在用西班牙语对一个程序进行国际化。我的程序结构遵循 MVC 模式。

然而,数据对象有一些依赖于语言环境的方法(例如,在给它们不正确的数据时抛出异常,并在消息中显示特定的错误)。

为了使整个程序依赖于语言环境,第一个解决方案是将语言环境传递给这些数据对象,但在我看来它会破坏 MVC 原则。

我认为的第二种解决方案是,例如,在数据对象的方法返回字符串的情况下,返回包中字符串的真正键,但这会导致混淆,因为我有一个包文件对于每个包,并且可以从另一个包调用该方法。

那么,解决这个问题的更好方法是什么?

谢谢!!

【问题讨论】:

    标签: java internationalization locale


    【解决方案1】:

    如果可以的话

    Locale.setDefault(locale);
    
    Locale locale = Locale.getDefault();
    

    带有 DISPLAY(用户界面)或 FORMAT(数字、货币)的可选参数。

    MessageFormat 等就对了。

    文字的出处是另一回事。

    一般来说,每个包都有很多项目,导致很多包。这在提取同一包中的文本时有效。

    出于翻译目的,这些多个包不是最理想的:如果对于 N 种语言,弹出相同的重复文本,或者只是为了使用相同的公式进行一致的翻译。 解决方案是使用翻译记忆库(如 tmx 格式)。也许最重要的是有人应该对所有的翻译负责,并让事情井井有条。也许与文档/帮助一致。一定要写一些检查工具,比较翻译的完整性等等。

    只提供翻译密钥(加上包名称?)似乎只是推迟了问题。在一个表单中,我确实遇到了后来国际化日志的这种用法:使用多种语言的用户可以用他们自己的语言读取数据。

    答案:好看的时候使用依赖注入。否则进行全局翻译功能。通过函数调用或更好的技巧,字段可能会找到它的类(记住嵌入/匿名类,lambdas),因此可以按默认加载绑定包的“Bundle.properties”:

    class T {
        MyTranslator i18n = new MyTranslator(); // Loads bundles
        ...
        i18n.t("This kind of {0} is {1}.")
    

    【讨论】:

    • 依赖注入听起来不错。非常感谢!
    猜你喜欢
    • 2020-03-20
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 2015-12-06
    相关资源
    最近更新 更多