Java偏好和国际化(i18n)



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

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

谁能指出这种方法的问题?

也许我应该使用属性文件,句号?

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

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

some_translated_key=some_value

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

根据我的经验,配置文件应该是语言独立的(中立文化),不应该手工编辑(也就是说翻译键并不重要)。

我认为字符编码可能有问题,但以下代码片段工作没有问题(文件是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. 将所有文本翻译成所有支持的语言是很困难的。

等等……

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

所以,你既不能传递0也不能传递2个参数给这个方法。只有一个。

这也部分地解决了第二个问题。更容易看出该方法是否在整个项目中使用。这并不能解决第三个问题

相关内容

  • 没有找到相关文章

最新更新