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中的标准方式。这种方法的问题是:
- 没有编译时检查资源所需参数的数量和类型。
- 很难保持文件干净,例如,没有机制可以帮助删除未使用的字符串
- 将所有文本翻译成所有支持的语言是很困难的。
等等……
可能更好的国际化机制是Google在他们的GWT中提出的。它们用每个字符串的方法生成类。例如,如果您有文本Hello, {0}
,它们将生成方法String hello(String name);
所以,你既不能传递0也不能传递2个参数给这个方法。只有一个。
这也部分地解决了第二个问题。更容易看出该方法是否在整个项目中使用。这并不能解决第三个问题