java - 在 java 程序中传播 locale 对象的良好实践

标签 java internationalization locale

我目前正在用西类牙语进行一个程序的国际化。我的程序结构遵循 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/

相关文章:

java - java中具有固定平均值的随机整数数组

javascript - 使用 expressjs 和 jade 的动态 (i18n) 链接

python - string.isdigit() 语言环境如何以及为何依赖?

android - 根据设备的默认语言更改应用程序的语言

java - WEB-INF内容访问又一场 war

java - 性能Image.SCALE_DEFAULT与Image.SCALE_SMOOTH

java - 配置 Spring 4 MVC Controller

java - 未找到页面 :1136 - No mapping found for HTTP request with URI [] in DispatcherServlet with name 'spring'

c# - 这是在 .Net 中维护国际化资源的好方法

c - Visual Studio 2010 中的 Langinfo.h