2011-12-07 10 views
0

私は私のリソースフォルダ内のこの2つのプロパティファイルがあります。Javaの負荷間違ったリソース

:私は私は私を使用javasのLocaleクラスカスタムロケールクラスを使用していない messages_hr_HR.propertiesmessages.properties

public class Messages { 

    private Messages() { 
     // do not instantiate 
    } 


    private static List<Locale> availableLocales; 
    private static Locale defaultLocale = new Locale("messages.messages", "EN", "/images/icons/locale/en.png"); 
    static { 
     availableLocales = new ArrayList<Locale>(); 

     availableLocales.add(defaultLocale); 
     availableLocales.add(new Locale("messages.messages_hr_HR", "HR", "/images/icons/locale/hr.png")); 
    } 

    private static Locale LOCALE = defaultLocale; 
    private static ResourceBundle RESOURCE_BUNDLE = loadBundle(); 
    private static ResourceBundle loadBundle() { 
     return ResourceBundle.getBundle(LOCALE.getBundleName()); 
    } 

    public static String getString(String key) { 
     try { 
      ResourceBundle bundle = RESOURCE_BUNDLE == null ? loadBundle() : RESOURCE_BUNDLE; 
      return bundle.getString(key); 
     } catch (MissingResourceException e) { 
      return "!" + key + "!"; 
     } 
    } 

    public static void setLocale(Locale locale) { 
     LOCALE = locale; 
     RESOURCE_BUNDLE = loadBundle(); 
    } 

    public static Locale getLocale() { 
     return LOCALE; 
    } 
    public static List<Locale> getAvailableLocales() { 

     return availableLocales; 
    } 
} 
public class Locale { 

    private String bundleName; 
    private String localeName; 
    private String iconPath; 

    public Locale(String bundleName, String localeName, String iconPath) { 
     super(); 

     this.bundleName = bundleName; 
     this.localeName = localeName; 
     this.iconPath = iconPath; 
    } 

    public String getBundleName() { 
     return bundleName; 
    } 
    public void setBundleName(String bundleName) { 
     this.bundleName = bundleName; 
    } 
    public String getLocaleName() { 
     return localeName; 
    } 
    public void setLocaleName(String localeName) { 
     this.localeName = localeName; 
    } 

    public String getIconPath() { 
     return iconPath; 
    } 

    public void setIconPath(String iconPath) { 
     this.iconPath = iconPath; 
    } 
} 

は、私は、キーの値を返すための静的メソッドを持つメッセージクラスを持っています

はその後、私のGUIで私が利用可能な言語でラジオボタンのメニューを持っており、ユーザーは、いくつかの上でクリックしたときに、私はちょうど

Messages.setLocale(clickedLanguageLocale);は、だから、私は特定のファイルではなく、Javaのロードの責任だということを見ることができます呼び出します。

問題は、一部のコンピュータでは異常な動作です。一部のテキストは英語(messages.properties)で、一部はクロアチア語(messages_hr_HR)です。私の頭に浮かんだのは、OSのデフォルトのロケールでしたが、私が鉱山のクラスを使用して以来、意味がありません。

この現象のアイデアはありますか?

答えて

0

コード全体が表示されずにメッセージが読み込まれる順序を推測するのは難しいです。 GUIアプリケーションに複数のスレッドが含まれている場合、RESOURCE_BUNDLEにデータ競合があると思います。 新しいRESOURCE_BUNDLEがロードされる前にGUIが新しいテキストキーの読み込みを開始します。 その一部は英語で表示され、残りはクロアチア語で表示されます。

編集:以下のコメントで述べたように、これは実際のソリューションであることが判明:

をまた、あなたがgetBundleの(このバージョンを使用することができます)docs.oracle.com/javase/6/docs/api/ java/util/...を使用して、使用するLocaleを明示的に渡します。

+0

ええと、これらの静的な読み込みの可能性がありますか?しかし、私はそれが問題だとは思わない。なぜなら、GUIが必要な言語を選択するためにロードする必要があるからだ。したがって、GUIがロードされると、リソースもロードされます。 'localeMenuItem.addActionListener(新しいのActionListener(){ \t \t \t \t \t \t \t \t @Override \t \t \t \tます。public void actionPerformedの(のActionEvent e)の{ \t:そして、GUIクラスで私はそのラジオボタングループのリスナーを持っています\t \t \t \t Messages.setLocale(ロケール); \t \t \t \t \t setStringValues()。 \t \t \t \t} \t \t \t}); 'Iは、新しいロケールを設定します。 – vale4674

+0

ええと、デフォルトのgetBundle()を使用していることが問題になるようです。マニュアル:http://docs.oracle.com/javase/6/docs/api/java/util/ResourceBundle.html#getBundle%28java.langを参照してください。文字列、%20java.util.Locale、%20java.lang.ClassLoader%29。 getBundle()はユーザーのシステムでデフォルトのjava.util.Localeを使用しますが、Localeクラスのデフォルトとして指定したものと必ずしも同じではありません。 – shams

+0

これは問題かもしれません。その名前でバンドルをロードするにはどうすればよいですか?しかし、奇妙なもう一つのことは、ロケールクラスにHRロケールが存在せず、何とか 'getBundle()'メソッドがそれをデフォルトとして使用することを決定するということです。 – vale4674

0

ブレークポイントでString getString(String key)にデバッグしようとしましたが、その結果、英語のメッセージが表示されましたか?

+0

問題は、私のコンピュータ上では正常に動作することです。他のコンピュータは私の大学(私の教授)にありますので、そこに行ってEclipseをインストールしてデバッグすることはできません。 – vale4674