2014-06-19 33 views
5

Mam trzy pliki zasobów na ścieżce klasy:Jak uzyskać domyślnego ResourceBundle niezależnie od aktualnego domyślnego Locale

labels.properties:

language = Default 

labels_en.properties:

language = English 

labels_fr .properties:

language = French 

Czy istnieje sposób uzyskania obiektu ResourceBundle, który zawsze ładuje labels.properties NIE MA, jaki jest mój domyślny Locale?

ResourceBundle.getBundle("labels") zwraca wartość odpowiadającą bieżącym domyślnym ustawieniom regionalnym (zgodnie z oczekiwaniami).

Jedyny sposób, w jaki mogę znaleźć to ustawienie domyślnych ustawień regionalnych dla nieistniejących ustawień regionalnych, ale może to spowodować uszkodzenie innych modułów.

Dziękujemy!

Locale.setDefault(Locale.ENGLISH); 
Assert.assertEquals("English", ResourceBundle.getBundle("labels").getString("language")); 
Locale.setDefault(Locale.FRENCH); 
Assert.assertEquals("French", ResourceBundle.getBundle("labels").getString("language")); 
Assert.assertEquals("French", ResourceBundle.getBundle("labels", new Locale("do-not-exist")).getString("language")); 
Locale.setDefault(new Locale("do-not-exist")); 
Assert.assertEquals("Default", ResourceBundle.getBundle("labels").getString("language")); 
+0

Być może trzeba zadzwonić 'ResourceBundle.clearCache()' przed próbą: 'ResourceBundle .getBundle ("etykiety", nowe ustawienia regionalne ("nieistniejące")). getString ("language"));.. (Od [to pytanie] (http://stackoverflow.com/questions/10981521/dynamically-change-resourcebundle-locale-in-java?rq=1)). –

+1

@Duncan Dziękuję za komentarz. To jednak nie zadziałało. Jeśli 'new locale (" nie-nie-istnieje ")' (powinienem był nazwać to "nie-istnieje" ...) nie zostanie znaleziony, 'ResourceBundle' spróbuje załadować go za pomocą' Locale.getDefault() ' zamiast tego nie jest to domyślna wersja pakietu. –

Odpowiedz

8

można przekazać w ResourceBundle.Control które, niezależnie od żądanej lokalizacji, zawsze przeszukuje tylko ResourceBundle root:

ResourceBundle rootOnly = ResourceBundle.getBundle("labels", 
    new ResourceBundle.Control() { 
     @Override 
     public List<Locale> getCandidateLocales(String name, 
               Locale locale) { 
      return Collections.singletonList(Locale.ROOT); 
     } 
    }); 
+1

Dziękujemy! To działa! Nie wiedziałem o istnieniu 'Locale.ROOT', myślałem, że' nowe locale ("") 'nie są dozwolone ... Przy okazji, czy twój kod nie jest równoważny' ResourceBundle.getBundle ("labels", Locale.ROOT) '? Czy istnieją inne powody, aby rozszerzyć "Kontrolę" (dla tego konkretnego problemu)? Po przejściu przypadków testowych: 'Locale.setDefault (Locale.ENGLISH); Assert.assertEquals ("Default", ResourceBundle.getBundle ("labels", Locale.ROOT) .getString ("language")); ' –

+0

1. Tak, przekazanie Locale.ROOT do każdego wywołania ResourceBundle.getBundle spowoduje wykonanie tego samego rzecz. 2. Istnieje wiele innych powodów użycia ResourceBundle.Control, takich jak kontrolowanie buforowania pakietów i kontrolowanie, czy należy wyszukiwać tylko zasoby .properties i/lub podklasy w ResourceBundle. Jawadok (do którego się połączyłem) wymienia wszystkie zachowania, które można przesłonić. – VGR