我目前正在开发一个更大的 Java 桌面应用程序,现在我想添加翻译。 l18n 系统让我困扰的是,它不提供任何类型的编译时检查。
在java的系统中,你有类似的东西HashMap
,其中每个本地化字符串都有一个“Key”,翻译后的字符串就是“Value”。这看起来像这样(取自教程示例 http://docs.oracle.com/javase/tutorial/i18n/intro/after.html):
Locale currentLocale;
ResourceBundle messages;
currentLocale = new Locale(language, country);
messages = ResourceBundle.getBundle("MessagesBundle", currentLocale);
System.out.println(messages.getString("greetings"));
如果您有一个简单/小型的应用程序,这会很有效。但在具有数千个翻译字符串的大型应用程序中,可能会发生“Key”中出现拼写错误并因此得到空字符串或错误字符串的情况。
运气好的话,应用程序会抛出一个RuntimeException
告诉您这一点,但即使这样,您也可能没有到达这一点,因为在某些情况下可能不会显示的对话框中使用了错误的“键”(假设这是一个错误对话框)。
为了防止这种情况发生,使用提供所用“密钥”编译时检查的系统将是更好的主意。例如,这在 Android 中使用,您在 XML 文件中指定资源,然后将其索引并映射到类(包括要使用的“键”)。这样,你会得到类似这样的东西(来自安卓文档 http://developer.android.com/guide/topics/resources/accessing-resources.html):
// Set the text on a TextView object using a resource ID
TextView msgTextView = (TextView) findViewById(R.id.msg);
msgTextView.setText(R.string.hello_message);
如果该“键”中有拼写错误,您将在编译时收到错误(IDE 中还具有“自动完成”功能)。
现在,要完成这样的工作,您需要一个小工具/脚本来执行索引部分并生成资源类(R.java
)。在 Android 中,Eclipse 插件(或一般的 IDE)会为您完成此操作。
我现在的问题是:是否已经有一个系统可以用于 Java 中的普通桌面应用程序?还是我说的话严重错误?