2014-06-19 11 views
5

Ho tre file di risorse nel percorso di classe:Come ottenere il ResourceBundle predefinita a prescindere dalla corrente Locale di default

labels.properties:

language = Default 

labels_en.properties:

language = English 

labels_fr .properties:

language = French 

C'è un modo per ottenere un oggetto ResourceBundle che carica sempre labels.properties NO MATTER cosa è il mio default Locale?

ResourceBundle.getBundle("labels") restituisce quello corrispondente alla locale predefinita corrente (come previsto).

L'unico modo che riesco a trovare è impostare le impostazioni internazionali predefinite su una locale non esistente, ma ciò potrebbe danneggiare altri moduli.

Grazie!

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

Potrebbe essere necessario chiamare 'ResourceBundle.clearCache()' prima di tentare: 'ResourceBundle .getBundle ("labels", nuova Locale ("do-not-exist")). getString ("language")); '. (Da [questa domanda] (http://stackoverflow.com/questions/10981521/dynamically-change-resourcebundle-locale-in-java?rq=1)). –

+1

@Duncan Grazie per il tuo commento. Non ha funzionato, però. Se 'new Locale (" do-not-exist ")' (avrei dovuto chiamarlo "does-not-exist" ...) non è stato trovato, 'ResourceBundle' prova a caricarne uno con' Locale.getDefault() ' invece, non la versione predefinita del pacchetto. –

risposta

8

È possibile passare in un ResourceBundle.Control che, a prescindere dalla Locale richiesto, cerca sempre solo il ResourceBundle radice:

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

Grazie! Funziona! Non conoscevo l'esistenza di 'Locale.ROOT', pensavo che 'new Locale (" ")' non fosse permesso ... A proposito, non è il tuo codice equivalente a 'ResourceBundle.getBundle (" labels ", Locale.ROOT) '? Ci sono altri motivi per estendere 'Control' (per questo problema specifico)? Dopo il test case passa: 'Locale.setDefault (Locale.ENGLISH); Assert.assertEquals ("Default", ResourceBundle.getBundle ("labels", Locale.ROOT) .getString ("language")); ' –

+0

1. Sì, passando Locale.ROOT ad ogni chiamata a ResourceBundle.getBundle compirà lo stesso cosa. 2. Esistono molti altri motivi per utilizzare ResourceBundle.Control, come controllare la memorizzazione nella cache dei bundle e controllare se cercare solo risorse .properties e/o sottoclassi di ResourceBundle. Il javadoc (a cui ho collegato) elenca tutti i comportamenti che è possibile ignorare. – VGR

Problemi correlati