Java偏好设置和国际化(i18n)

9
Java教程建议使用首选项API而不是属性文件。属性文件和ResourceBundles是处理应用程序国际化要求的推荐方法。
我正在考虑在桌面应用程序中同时使用两者,以以本地特定方式显示首选项。有人能指出这种方法存在的问题吗?
也许我只应该使用属性文件?
2个回答

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

}

好的,假设我有一个窗口大小的偏好设置。 - user697750
对于窗口大小的偏好设置,您可以选择Preference API或Properties。这与本地化无关... - Paweł Dyda
抱歉,我的评论被截断了。 - user697750
假设我有一个窗口大小的偏好设置。在英语中,我会说“size”,而在法语中,我会说“taille”。我只对提供翻译后的偏好设置描述感兴趣,而不是用户返回的值(例如大小为1280x1024)。 - user697750
我想我终于明白你想要什么了 - 你想要翻译后的配置文件。那让我修改我的回答。 - Paweł Dyda
感谢Pawel提供了非常有启发性的答案,我投了+1的赞成票。 - user697750

2

在Java中,使用资源束本地化应用程序是标准方式。这种方式存在以下问题:

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

等等....

Google在其GWT中提出了可能更好的国际化机制。他们会生成每个字符串的方法的类。例如,如果您有文本Hello, {0},他们将生成方法String hello(String name);

因此,您无法向此方法传递0个或2个参数,只能传递一个参数。

这部分解决了第二个问题。更容易看到整个项目中是否未使用该方法。但它仍然无法解决第三个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接