我了解如何国际化Java程序,但我有一个问题。我的程序中的语言可以随时切换,但我的程序可以存在于许多状态中,这意味着它可能打开了也可能没有打开多个 JLabels、JPanels、JFrames 等。是否有一个类或方法可以将当前 GUI 更新为切换的语言,还是必须手动完成?
如果没有其他工作,我只需要用户重新启动程序来切换语言,但运行时更改会很好......
通常使用的解决方案是在中央管理器类中具有面向用户的字符串的哈希。每当你想要用数据填充字段时,你都会调用该类:
JLabel label = new JLabel();
label.setText(LocalizationManager.get("MY_LABEL_TEXT"));
在LocalizationManager
中,您必须获取程序的当前语言,然后查找适当的字符串以使用适当的语言进行MY_LABEL_TEXT
。然后,管理器返回现在的"本地化"字符串,如果语言或字符串不可用,则返回一些默认值。
把管理器想象成一个稍微复杂的地图;它从一个键(即"MY_LABEL_TEXT")映射到你想要显示的内容("美好的一天!"或"Bienvenido!"),这取决于你使用的语言。有很多方法可以实现这一点,但出于内存/性能原因,您希望管理器是静态的或单一实例(加载一次)。
例如:(1)
public class LocalizationManager {
private SupportedLanguage currentLanguage = SupportedLanguage.ENGLISH;//defaults to english
private Map<SupportedLanguage, Map<String, String>> translations;
public LocalizationManager() {
//Initialize the strings.
//This is NOT a good way; don't hardcode it. But it shows how they're set up.
Map<String, String> english = new HashMap<String, String>();
Map<String, String> french = new HashMap<String, String>();
english.set("MY_LABEL_TEXT", "Good day!");
french.set("MY_LABEL_TEXT", "Beinvenido!");//is that actually french?
translations.set(SupportedLanguage.ENGLISH, english);
translations.set(SupportedLanguage.FRENCH, french);
}
public get(String key) {
return this.translations.get(this.currentLanguage).get(key);
}
public setLanguage(SupportedLanguage language) {
this.currentLanguage = language;
}
public enum SupportedLanguage {
ENGLISH, CHINESE, FRENCH, KLINGON, RUSSIAN;
}
}
(1)我没有测试过这个,也不是单例,但它是一个即兴的例子。