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