Java教程建议使用首选项API而不是属性文件。属性文件和ResourceBundles是处理应用程序国际化要求的推荐方法。
我正在考虑在桌面应用程序中同时使用两者,以以本地特定方式显示首选项。有人能指出这种方法存在的问题吗?
也许我只应该使用属性文件?
我正在考虑在桌面应用程序中同时使用两者,以以本地特定方式显示首选项。有人能指出这种方法存在的问题吗?
也许我只应该使用属性文件?
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中,使用资源束本地化应用程序是标准方式。这种方式存在以下问题:
等等....
Google在其GWT中提出了可能更好的国际化机制。他们会生成每个字符串的方法的类。例如,如果您有文本Hello, {0}
,他们将生成方法String hello(String name);
因此,您无法向此方法传递0个或2个参数,只能传递一个参数。
这部分解决了第二个问题。更容易看到整个项目中是否未使用该方法。但它仍然无法解决第三个问题。