2012-08-17 14 views
5

Javaプログラムを国際化する方法を理解していますが、問題があります。 私のプログラムの言語はいつでも切り替えることができますが、私のプログラムは多くの状態で存在することができます。つまり、いくつかのJLabel、JPanels、JFramesなどが開いていてもいなくてもかまいません。現在のGUIを切り替えられた言語に更新するクラスまたはメソッドがありますか、それとも手動で行う必要がありますか?Java Swing - 実行時に動的にロケールを切り替える

何もないが動作するかどうか、私は言語を切り替えるには、プログラムを再起動するようにユーザーに要求しますが、実行時の変更はいいだろう...一般的に使用さ

+0

可能な言語ごとにローカライズされた文字列がありますか?どのようにこれらの文字列を現在取得していますか?または、現在各文字列が各要素にハードコードされていますか? –

+0

私はまだ、その問題を避けるために、ちょうど2行のプログラムを書いていません。私はすべてにオープン! – Karlovsky120

+0

どのような種類のJavaプログラムを作成しますか? JavaEE/JSF/etcなどのWebアプリケーションを使用していますか? – jahroy

答えて

1

ソリューションは、ユーザー向けのハッシュを持つことですセントラルマネージャクラスの文字列。あなたがデータを持つフィールドを移入したいときはいつでも、そのクラスへの呼び出しを行う:内部

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)私はこれをテストしていませんが、またそれはシングルトンですが、それは、カフ例オフです。

+0

言語切り替え時にマネージャを呼び出すと、更新されるすべての文字列が更新されます。彼の管轄下)? – Karlovsky120

+0

LocalizationManagerについてもっと教えてください。私はGoogleで何かを見つけることができません。 – Karlovsky120

+1

@ Karlovsky120私は例を提供しようと私の応答を更新しました。言語を切り替える際にすべての文字列を更新しないでください。一度やってください。もっと良いことに、それは怠惰なことですが、それは次のステップです。私が示したようなインターフェースがあれば、実装を改善することができます。 –

関連する問題