我目前正在用西类牙语进行一个程序的国际化。我的程序结构遵循 MVC 模式。
但是,数据对象有一些与区域设置相关的方法(例如,在向它们提供不正确的数据时抛出异常,并在消息中显示特定错误)。
为了使整个程序依赖于语言环境,第一个解决方案是将语言环境传递给这些数据对象,但在我看来,这会打破 MVC 原则。
我想到的第二个解决方案是,例如,如果数据对象的方法返回字符串,则返回 bundle 中字符串的键,但这会导致困惑,因为我有一个 bundle 文件对于每个包,可以从另一个包调用该方法。
那么,解决这个问题的更好方法是什么?
谢谢!!
最佳答案
如果你能做到
Locale.setDefault(locale);
Locale locale = Locale.getDefault();
带有用于显示(用户界面)或格式(数字、货币)的可选参数。
MessageFormat 等就正确了。
文本的来源是另一个故事。
一般来说,每个包都有很多项目,导致有很多 bundle 。当提取同一包中的文本时,这有效。
出于翻译目的,这些多个包并不是最理想的:如果对于 N 种语言,会弹出相同的重复文本,或者只是为了使用相同的公式进行一致的翻译。 解决方案是使用翻译内存库(如 tmx 格式)。也许最重要的是,应该有人对所有翻译负责,并使事情井井有条。也许与文档/帮助一致。一定要编写一些检查工具,比较翻译的完整性等等。
仅仅提供翻译 key (加上 bundle 名称?)似乎只是推迟了问题。在一个表单中,我确实遇到了后来国际化日志的这种用法:使用多种语言的用户可以用自己的语言读取数据。
答案:当美观时使用依赖注入(inject)。否则进行全局翻译功能。通过一个技巧,函数调用或更好的字段可以找到它的类(注意嵌入/匿名类、lambda),因此可以根据默认值加载绑定(bind)“Bundle.properties”的包:
class T {
MyTranslator i18n = new MyTranslator(); // Loads bundles
...
i18n.t("This kind of {0} is {1}.")
关于java - 在 java 程序中传播 locale 对象的良好实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21433450/