Luk*_*uth 5 java translation internationalization
我目前正在开发一个更大的Java桌面应用程序,现在正处于我想要添加翻译的程度.让我对l18n系统感到困扰的是,它没有提供任何类型的编译时间检查.
在java的系统中,你有类似a的东西HashMap,其中每个本地化的字符串都有一个"Key",然后翻译的字符串就是"Value".这看起来像这样(取自教程示例):
Locale currentLocale;
ResourceBundle messages;
currentLocale = new Locale(language, country);
messages = ResourceBundle.getBundle("MessagesBundle", currentLocale);
System.out.println(messages.getString("greetings"));
Run Code Online (Sandbox Code Playgroud)
如果你有一个简单/小的应用程序,这很好用.但是在一个包含数千个翻译字符串的大型应用程序中,可能会发生"Key"中的拼写错误,从而得到一个空字符串或错误的字符串.
运气不错,应用程序会抛出一个RuntimeException告诉你的信息,但即便如此,你甚至可能没有达到这一点,因为在某些情况下可能没有显示的对话框中使用了错误的"密钥" (说这是一个错误对话框).
为了防止这种情况发生,使用提供所用"密钥"的编译时检查的系统将是更好的主意.例如,这在Android中使用,您可以在XML文件中指定Resources,然后将其编入索引并映射到类(包括要使用的"Keys").通过这种方式,您可以获得类似的内容(来自Android文档):
// Set the text on a TextView object using a resource ID
TextView msgTextView = (TextView) findViewById(R.id.msg);
msgTextView.setText(R.string.hello_message);
Run Code Online (Sandbox Code Playgroud)
如果你在"密钥"中输入错误,你将在编译时遇到错误(你的IDE也有"自动完成").
现在,为了做这样的工作,你需要一个小工具/脚本来完成索引部分并生成Resource-class(R.java).在Android中,Eclipse插件(或一般的IDE)为您完成.
我现在的问题是:是否已有一个系统可用于Java中的普通桌面应用程序?或者我说的话可怕的错误?
对于这个问题有一个相当简单的解决方案。首先,不要使用魔术字符串作为代码,定义常量并引用它们。所以你改变..
messages.getString("greetings");
Run Code Online (Sandbox Code Playgroud)
到
messages.getString(I18.GREETINGS_CODE);
Run Code Online (Sandbox Code Playgroud)
并有相应的班级;
public class I18 {
public static final String GREETINGS_CODE = "greetings";
}
Run Code Online (Sandbox Code Playgroud)
接下来编写一个测试用例,I18在每个语言资源文件中查找类中的每个代码。如果任何资源文件缺少代码,则测试失败。这不是编译时间,但如果出现任何问题,您的项目将无法通过测试。
| 归档时间: |
|
| 查看次数: |
451 次 |
| 最近记录: |