Java偏好和国际化(i18n)

Java教程建议在Properties文件上使用Preferences API。 属性文件和ResourceBundle是处理应用程序中的内部化要求的推荐方法。

我正在考虑将两者用于桌面应用程序,该应用程序将以特定于语言环境的方式显示首选项。

任何人都可以指出这种方法的问题吗?

也许我应该只使用属性文件期间?

我正在考虑将两者用于桌面应用程序,该应用程序将以特定于语言环境的方式显示首选项。

好的,所以你想要的是以下列forms翻译的配置文件:

some_translated_key=some_value 

好吧,除非你想在某些时候支持MUI ,否则它应该不是什么大问题。 但是,如果这样做,以便同一台计算机上的不同用户可以使用不同的语言,或者用户可能能够切换语言,则在将键与属性匹配时会遇到麻烦。 您必须在读取密钥时扫描所有翻译,并且您肯定会为同一个密钥输入多个条目。 怎么解决? 嗯,这是一个很好的问题。

根据我的经验,配置文件应该是与语言无关的(中性文化),不应该手工编辑(即翻译密钥并不重要)。

我认为字符编码可能有问题,但是下面的代码片段没有问题(文件是UTF-8编码的):

 public class Main { private static final String FILE_NAME = "i18ned.properties"; private File propertiesFile; private Properties properties; public Main() { properties = new Properties(); propertiesFile = new File(FILE_NAME); if (propertiesFile.exists()) { try { properties.load(new BufferedReader(new FileReader( propertiesFile))); } catch (FileNotFoundException e) { // not likely, but should be logged either way } catch (IOException e) { // logger should be used instead e.printStackTrace(); } } } public void saveProperties() { try { properties .store(new BufferedWriter(new FileWriter(propertiesFile)), ""); } catch (IOException e) { // oops, use logger instead e.printStackTrace(); } } public static void main(String[] args) { Main main = new Main(); main.storeSome(); main.readSome(); } private void readSome() { String highAsciiKey = "żółć"; String value = properties.getProperty(highAsciiKey); System.out.println(value); } private void storeSome() { String highAsciiKey = "żółć"; String highAsciiValue = "łąkę"; properties.setProperty(highAsciiKey, highAsciiValue); saveProperties(); } } 

使用资源包来本地化应用程序是java中的标准方法。 这种方式的问题是:

  1. 没有编译时间检查资源所需的参数的数量和类型。
  2. 很难保持文件干净,例如,没有任何机制可以帮助删除未使用的字符串
  3. 很难将所有文本翻译成所有支持的语言。

等等….

谷歌在其GWT中建议可能更好的国际化机制。 它们使用每个字符串的方法生成类。 例如,如果你有文本Hello, {0}他们将生成方法String hello(String name);

因此,您不能将0或2参数都传递给此方法。 只有一个。

这部分地解决了第二个问题。 更容易看出方法是否未在整个项目中使用。 无论如何,它并没有解决第三个问题。