【问题标题】: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}.")