Java Swing - 在运行时动态切换语言环境

时间:2012-08-17 18:24:00

标签: java swing internationalization

我理解如何国际化java程序,但我有一个问题。 我的程序中的语言可以随时切换,但我的程序可以存在于许多状态,这意味着它可能有也可能没有多个JLabel,JPanel,JFrame等打开。是否有一个类或方法将当前GUI更新为切换语言,还是必须手动完成?

如果没有其他工作,我只需要用户重启程序来切换语言,但运行时更改会很好......

1 个答案:

答案 0 :(得分:1)

通常使用的解决方案是在中央管理器类中具有面向用户的字符串的哈希值。只要您想用数据填充字段,就可以调用该类:

JLabel label = new JLabel();
label.setText(LocalizationManager.get("MY_LABEL_TEXT"));

LocalizationManager内,您必须获取程序的当前语言,然后以适当的语言查找MY_LABEL_TEXT的相应字符串。然后管理器返回现在的“本地化”字符串,如果语言或字符串不可用,则返回默认值。

将经理视为稍微复杂的地图;它是从一个键(即'MY_LABEL_TEXT')映射到你想要显示的内容(“Good day!”或“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)我没有对此进行测试,也不是单身,但这是一个不合时宜的例子。