Java Language
Localizzazione e internazionalizzazione
Ricerca…
Osservazioni
Java è dotato di un meccanismo potente e flessibile per localizzare le tue applicazioni, ma è anche facile da usare impropriamente e finire con un programma che ignora o manipola le impostazioni locali dell'utente, e quindi come si aspettano che il tuo programma si comporti.
I tuoi utenti si aspetteranno di vedere i dati localizzati nei formati a cui sono abituati, e il tentativo di supportarli manualmente è un errore. Qui c'è solo un piccolo esempio dei diversi modi in cui gli utenti si aspettano di vedere il contenuto che si potrebbe presumere sia "sempre" visualizzato in un certo modo:
Date | Numeri | Moneta locale | Moneta straniera | distanze | |
---|---|---|---|---|---|
Brasile | |||||
Cina | |||||
Egitto | |||||
Messico | 20/3/16 | 1.234,56 | $ 1,000.50 | 1.000,50 USD | |
UK | 20/3/16 | 1,234.56 | £ 1,000.50 | 100 km | |
Stati Uniti d'America | 3/20/16 | 1,234.56 | $ 1,000.50 | 1,000.50 MXN | 60 miglia |
Risorse generali
- Wikipedia: internazionalizzazione e localizzazione
Risorse Java
- Tutorial Java: internazionalizzazione
- Oracle: internazionalizzazione: comprensione delle impostazioni internazionali nella piattaforma Java
- JavaDoc:
Locale
Date formattate automaticamente usando "locale"
SimpleDateFormatter
è ottimo in un pizzico, ma come suggerisce il nome, non scala bene.
Se digiti "MM/dd/yyyy"
su tutta la tua applicazione, i tuoi utenti internazionali non saranno felici.
Lascia che Java faccia il lavoro per te
Utilizzare i metodi static
in DateFormat
per recuperare la formattazione corretta per l'utente. Per un'applicazione desktop (dove ti affidi alle impostazioni internazionali predefinite ), chiama semplicemente:
String localizedDate = DateFormat.getDateInstance(style).format(date);
Dove lo style
è una delle costanti di formattazione ( FULL
, LONG
, MEDIUM
, SHORT
, ecc.) Specificate in DateFormat
.
Per un'applicazione lato server in cui l'utente specifica la propria locale come parte della richiesta, è necessario passarla esplicitamente a getDateInstance()
:
String localizedDate =
DateFormat.getDateInstance(style, request.getLocale()).format(date);
Confronto di stringhe
Confronta due stringhe che ignorano il caso:
"School".equalsIgnoreCase("school"); // true
Non usare
text1.toLowerCase().equals(text2.toLowerCase());
Le lingue hanno regole diverse per la conversione di lettere maiuscole e minuscole. Un "I" verrebbe convertito in "i" in inglese. Ma in turco un 'io' diventa un 'io'. Se devi usare toLowerCase()
usa il sovraccarico che si aspetta un Locale
: String.toLowerCase(Locale)
.
Confrontando due stringhe ignorando le differenze minori:
Collator collator = Collator.getInstance(Locale.GERMAN);
collator.setStrength(Collator.PRIMARY);
collator.equals("Gärten", "gaerten"); // returns true
Ordina le stringhe rispettando l'ordine della lingua naturale, ignorando il caso (usa la chiave di confronto per:
String[] texts = new String[] {"Birne", "äther", "Apfel"};
Collator collator = Collator.getInstance(Locale.GERMAN);
collator.setStrength(Collator.SECONDARY); // ignore case
Arrays.sort(texts, collator::compare); // will return {"Apfel", "äther", "Birne"}
località
La classe java.util.Locale
viene utilizzata per rappresentare una regione "geografica, politica o culturale" per localizzare un determinato testo, numero, data o operazione. Un oggetto Locale può quindi contenere un paese, una regione, una lingua e anche una variante di una lingua, ad esempio un dialetto parlato in una certa regione di un paese, o parlato in un paese diverso dal paese da cui proviene la lingua.
L'istanza Locale viene consegnata ai componenti che devono localizzare le loro azioni, sia che si tratti di convertire l'input, l'output o semplicemente di averne bisogno per le operazioni interne. La classe Locale non può effettuare internazionalizzazione o localizzazione da sola
linguaggio
La lingua deve essere un codice lingua ISO 639 a 2 o 3 caratteri o una sottotag della lingua registrata composta da un massimo di 8 caratteri. Nel caso in cui una lingua abbia un codice lingua a 2 e 3 caratteri, utilizzare il codice a 2 caratteri. Un elenco completo dei codici di lingua può essere trovato nel registro di sottotag della lingua IANA.
I codici lingua non fanno distinzione tra maiuscole e minuscole, ma la classe Locale utilizza sempre le versioni minuscole dei codici lingua
Creare un locale
La creazione di un'istanza java.util.Locale
può essere eseguita in quattro modi diversi:
Locale constants
Locale constructors
Locale.Builder class
Locale.forLanguageTag factory method
Java ResourceBundle
Si crea un'istanza ResourceBundle in questo modo:
Locale locale = new Locale("en", "US");
ResourceBundle labels = ResourceBundle.getBundle("i18n.properties");
System.out.println(labels.getString("message"));
Considera che ho un file di proprietà i18n.properties
:
message=This is locale
Produzione:
This is locale
Impostazione locale
Se si desidera riprodurre lo stato utilizzando altre lingue, è possibile utilizzare il metodo setDefault()
. Il suo uso:
setDefault(Locale.JAPANESE); //Set Japanese