5

Javaプログラムを国際化する方法は理解していますが、問題があります。私のプログラムの言語はいつでも切り替えることができますが、私のプログラムは多くの状態で存在する可能性があります。つまり、複数のJLabel、JPanels、JFrameなどが開いている場合と開いていない場合があります。現在のGUIを切り替えられた言語に更新するクラスまたはメソッドはありますか、それとも手動で実行する必要がありますか?

他に何も機能しない場合は、言語を切り替えるためにユーザーにプログラムを再起動するように要求しますが、実行時の変更は素晴らしいでしょう...

4

1 に答える 1

1

一般的に使用される解決策は、中央マネージャー クラスにユーザー向け文字列のハッシュを配置することです。フィールドにデータを入力するときはいつでも、そのクラスを呼び出します。

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

内部LocalizationManagerでは、プログラムの現在の言語を取得しMY_LABEL_TEXT、適切な言語で適切な文字列を検索する必要があります。次に、マネージャーは現在「ローカライズされた」文字列を返すか、言語または文字列が利用できない場合はデフォルトを返します。

マネージャは、もう少し複雑な Map と考えてください。キー (つまり、'MY_LABEL_TEXT') から表示したいもの ("Good day!" または "Bienvenido!") へのマッピングです。使用している言語に応じて異なります。これを実装するには多くの方法がありますが、メモリ/パフォーマンス上の理由から、マネージャーを静的またはシングルトン (1 回ロード) にする必要があります。

例: (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 に答える