Java偏好和国际化(i18n)

时间:2011-04-07 23:35:45

标签: java localization internationalization properties preferences

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

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

有人能指出这种方法的问题吗?

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

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

答案 1 :(得分:2)

  

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

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

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();
    }

}
相关问题