2011-01-17 15 views
7

Sto cercando un modo per aggiungere più locali alle versioni locali disponibili in Java 1.6. Ma le Locales che voglio creare non hanno codici paese ISO-3166, né codici lingua ISO-639. C'è un modo per farlo comunque? Le localizzazioni Voglio aggiungere differiscono solo per i nomi delle lingue, ma il più piccolo gruppo etnico, più pignoli che ricevono sulla loro identità ;-)Come estendere l'elenco di Java Locales disponibili

Così ho pensato di estendere un locale esistente, qualcosa come

UserDefinedLocale extends Locale { 
    UserDefinedLocale (Locale parentLocale) {...} 
} 

ma java.util.Locale è definitiva, che lo rende particolarmente difficile incidere qualcosa intorno ...

Quindi, è l'idea che l'elenco delle versioni locali Java è esaustivo? Sono il primo a perdere qualche altro locale?

risposta

1

Vedi this answer:

... è possibile collegare il supporto per ulteriori locali attraverso le SPI (descritte here). Ad esempio, per fornire un formattatore di date per una nuova localizzazione, lo si fare implementando un servizio DateFormatProvider. Potresti riuscire a farlo decorando un'implementazione esistente - darei un'occhiata alla libreria ICU4J per vedere se fornisce il supporto che desideri.

+0

Grazie. Gestendo tristemente tutti gli utenti, JRE non è un'opzione per la mia applicazione: "Poiché gli SPI di Servizi sensibili internazionali sono basati sul meccanismo di estensione Java standard, è possibile comprimerli come file JAR (con alcuni accorgimenti nel file MANIFEST, che può essere trovato qui) e metterlo nella directory di estensione. " – alfonx

4

Leggere la javadoc per java.util Locale.

Dice: "Creare un oggetto Locale utilizzando i costruttori in questa classe:"

Si dice anche: "Poiché un oggetto Locale è solo un identificatore per una regione, nessun controllo di validità viene eseguita quando si costruire un locale "

si dice anche: ". a locale è il meccanismo per identificare il tipo di oggetto (NumberFormat) che si desidera ottenere il locale è solo un meccanismo per identificare gli oggetti, non è un contenitore per il oggetti stessi "

E, infine, il javadoc per le getAvailableLocales() Metodo dice: "La matrice restituita rappresenta l'unione delle zone supportate da l'ambiente di runtime Java e installati implementazioni LocaleServiceProvider"

Quindi, non resta che inventare un codice di linguaggio che non è nella lista standard e lo usa come identificativo per la tua localizzazione.

+0

_ "Quindi devi solo inventare un codice lingua che non è nella lista standard, e usarlo come identificativo per la tua localizzazione." _ - hai perso il bit che hai citato sull'installazione di un 'LocaleServiceProvider'? –

+0

Sono d'accordo che è una scorciatoia. Ma poiché l'OP non spiegava esplicitamente cosa intendesse con "estendere la lista dei locali disponibili", sospettavo che ciò che voleva semplicemente gli servisse per istanziarne uno nuovo. L'utilizzo di ResourceBundle non richiede nient'altro che una nuova Locale. La formattazione di numeri e date potrebbe riutilizzare le regole da un'altra lingua. Dovrebbe quindi solo utilizzare un nuovo codice paese o codice variante. –