在java程序中扩展locale对象的良好实践

在java程序中扩展locale对象的良好实践,java,internationalization,locale,Java,Internationalization,Locale,我目前正在用西班牙语制作一个国际化的程序。我的程序结构遵循MVC模式 但是,数据对象有一些依赖于区域设置的方法(例如,在提供错误数据时抛出异常,消息中有特定错误) 要使整个程序依赖于区域设置,第一个解决方案是将区域设置传递给这些数据对象,但在我看来,这将打破MVC原则 我认为的第二个解决方案是,例如,在数据对象返回字符串的方法中,返回捆绑包中字符串的键,但这将导致混乱,因为我为每个包都有一个捆绑包文件,并且可以从另一个包调用该方法 那么,解决这个问题的更好方法是什么 谢谢 如果可以的话 Loca

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

但是,数据对象有一些依赖于区域设置的方法(例如,在提供错误数据时抛出异常,消息中有特定错误)

要使整个程序依赖于区域设置,第一个解决方案是将区域设置传递给这些数据对象,但在我看来,这将打破MVC原则

我认为的第二个解决方案是,例如,在数据对象返回字符串的方法中,返回捆绑包中字符串的键,但这将导致混乱,因为我为每个包都有一个捆绑包文件,并且可以从另一个包调用该方法

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

谢谢

如果可以的话

Locale.setDefault(locale);

Locale locale = Locale.getDefault();
带有用于显示(用户界面)或格式(数字、货币)的可选参数

MessageFormat等将是正确的

文本的来源是另一个故事

通常,有许多项目每个包都有一个包,这导致了许多包。这在提取同一包中的文本时有效

出于翻译目的,这些多个包是次优的:如果对于N种语言,会弹出相同的重复文本,或者简单地使用相同的公式进行简明翻译。 解决方案是使用翻译内存(如tmx格式)。也许最重要的是,有些人应该对所有的翻译负责,并使事情井然有序。可能与文档/帮助一致。一定要写一些检查工具,比较翻译的完整性等等

仅仅给出翻译键(加上bundle名称?)似乎只是推迟了问题的解决。在某种形式上,我确实遇到了后来国际化日志的这种用法:使用多种语言的用户可以用自己的语言读取数据

答案是:在好看的时候使用依赖注入。否则会产生全局翻译功能。通过一个技巧,一个函数调用或更好的方法,一个字段可以找到它的类(mind embedded/anonymous classes,lambdas),这样就可以按照默认值加载包绑定的“Bundle.properties”:

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

依赖注入听起来是一个很好的解决方案。非常感谢你!