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

Kar*_*120 5 java swing internationalization

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

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

Nat*_*ord 2

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

JLabel label = new JLabel();
label.setText(LocalizationManager.get("MY_LABEL_TEXT"));
Run Code Online (Sandbox Code Playgroud)

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

将管理器视为稍微复杂一点的 Map;它从键(即“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; 
  }
}
Run Code Online (Sandbox Code Playgroud)

(1) 我没有测试过这个,也不是单例,但它是一个即兴的例子。

  • 不够好:这仅涉及存储。否决票是为了在这方面重新发明轮子 - 定义特定于语言环境的键/值对的方法是 ResourceBundle,存储这些键/值对的单例是 UIManager,让管理器了解本地化的方法是添加资源包)。挑战是动态更新组件属性.. (2认同)