我一直遵循Google的Window Builder Pro扩展指南,以使我的应用程序国际化。现在,将在标签中显示的字符串存储在由“外部字符串”向导创建的属性文件中(我使用了经典的日食消息文件)。
在我的initialize方法内部,所有标签都被初始化,其文本设置如下:
JLabel lblLanguage = new JLabel(Messages.getString("App.lblLanguage.text")); //$NON-NLS-1$
Run Code Online (Sandbox Code Playgroud)
我在类中创建了一个App包含GUI 的枚举类型:
private enum Lang { German(Locale.GERMAN), English(Locale.ENGLISH);
private Locale loc;
Lang (Locale l) {
loc = l;
}
Locale getLocale() {
return loc;
}
}
Run Code Online (Sandbox Code Playgroud)
将使用组合框设置语言,该组合框使用枚举类型Lang来显示可用的语言:
JComboBox cboLanguage = new JComboBox();
cboLanguage.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JComboBox cb = (JComboBox)e.getSource();
Lang l = (Lang)cb.getSelectedItem();
// TODO: update language
}
});
cboLanguage.setModel(new DefaultComboBoxModel(Lang.values()));
Run Code Online (Sandbox Code Playgroud)
我发现了许多其他的howto和教程,它们涵盖了swing应用程序的国际化,但是它们都没有涉及如何更新所有标签(以及可能包含文本的其他控件)。SO上有这个答案,如果链接没有死的话,可能会有所帮助。
因为我是Java GUI编程的新手,所以我现在真的不知道该做什么,这是我的问题:
updateLanguage …我正在重构现有的Java桌面应用程序,以从.properties文件加载国际化的UI文本标签.在应用程序生命周期中是否适合加载属性文件并在内存中填充字符串?现有的实现将每个组件的标签定义为:例如:public static final String foo = "bar";在构造函数中加载文本似乎效率低(因为它将在所有实例之间共享),但是在static {...}块中执行所有操作似乎也不是很明智.这里的最佳做法是什么?