【发布时间】:2012-04-20 15:09:24
【问题描述】:
我目前正在开发一个更大的 Java 桌面应用程序,现在我想添加翻译。 l18n 系统让我困扰的是,它不提供任何类型的编译时检查。
在 java 的系统中,你有类似 HashMap 的东西,其中每个本地化字符串都有一个“Key”,翻译后的字符串就是“Value”。这看起来像这样(取自tutorials example):
Locale currentLocale;
ResourceBundle messages;
currentLocale = new Locale(language, country);
messages = ResourceBundle.getBundle("MessagesBundle", currentLocale);
System.out.println(messages.getString("greetings"));
如果您有一个简单/小型的应用程序,这很好用。但是在一个包含数千个翻译字符串的大型应用程序中,您可能会在“Key”中出现拼写错误,从而得到一个空字符串或错误字符串。
运气好的话,应用程序会抛出一个RuntimeException 来告诉你它,但即使这样你也可能没有到达这一点,因为在对话框中使用了错误的“键”,可能在某些情况下不显示(比如说这是一个错误对话框)。
为了防止这种情况发生,使用一个提供编译时检查所用“键”的系统会是更好的主意。这例如在 Android 中使用,您在 XML 文件中指定资源,然后将其索引并映射到类(包括要使用的“键”)。这样,你会得到这样的东西(来自Android Docs):
// 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 中的普通桌面应用程序?还是我说的话大错特错?
【问题讨论】:
-
使用 C10n github.com/rodionmoiseev/c10n 而不是
messages.getString("greetings"),您可以这样做messages.greetings()并使用注释定义每种语言。
标签: java internationalization translation