Java教程建议在Properties文件上使用Preferences API。 属性文件和ResourceBundle是处理应用程序中内部化要求的推荐方法。
我正在考虑将两者用于桌面应用程序,该应用程序将以特定于语言环境的方式显示首选项。
有人能指出这种方法的问题吗?
也许我应该只使用属性文件期间?
答案 0 :(得分:2)
使用资源包来本地化应用程序是java中的标准方法。这种方式的问题是:
等...
谷歌在其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();
}
}