5

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

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

4

1 回答 1

1

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

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

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

将 manager 想象成一个稍微复杂一点的 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; 
  }
}

(1) 我没有对此进行测试,也不是单例,但这是一个即兴的例子。

于 2012-08-17T18:33:51.763 回答