Java Language
Lokalisierung und Internationalisierung
Suche…
Bemerkungen
Java verfügt über einen leistungsstarken und flexiblen Mechanismus zum Lokalisieren Ihrer Anwendungen. Es ist jedoch auch leicht zu missbrauchen und mit einem Programm zu beenden, das das Gebietsschema des Benutzers außer Acht lässt oder das Verhalten des Programms davon abhängig macht.
Ihre Benutzer werden erwarten, dass Daten in den von ihnen gewohnten Formaten lokalisiert werden. Wenn Sie versuchen, dies manuell zu unterstützen, ist dies eine dumme Angelegenheit. Hier ist nur ein kleines Beispiel für die verschiedenen Arten, wie Benutzer erwarten, Inhalte zu sehen, von denen Sie annehmen, dass sie "immer" auf eine bestimmte Weise angezeigt werden:
Termine | Zahlen | Landeswährung | Fremdwährung | Entfernungen | |
---|---|---|---|---|---|
Brasilien | |||||
China | |||||
Ägypten | |||||
Mexiko | 20/3/16 | 1.234,56 | 1.000,50 $ | 1.000,50 USD | |
Vereinigtes Königreich | 20/3/16 | 1,234,56 | 1.000,50 £ | 100 km | |
Vereinigte Staaten von Amerika | 3/20/16 | 1,234,56 | 1.000,50 $ | 1.000,50 MXN | 60 mi |
Allgemeine Ressourcen
- Wikipedia: Internationalisierung und Lokalisierung
Java-Ressourcen
- Java-Tutorial: Internationalisierung
- Oracle: Internationalisierung: Lokalisierung in der Java-Plattform
- JavaDoc:
Locale
Automatisch formatierte Daten mit "locale"
SimpleDateFormatter
ist prima, aber wie der Name schon sagt, skaliert es nicht gut.
Wenn Sie in Ihrer gesamten Anwendung "MM/dd/yyyy"
Ihre internationalen Benutzer nicht zufrieden sein.
Lassen Sie Java die Arbeit für Sie erledigen
Verwenden Sie die static
Methoden in DateFormat
, um die richtige Formatierung für Ihren Benutzer abzurufen. Rufen Sie für eine Desktopanwendung (bei der Sie sich auf das Standardgebietsschema verlassen ) einfach an:
String localizedDate = DateFormat.getDateInstance(style).format(date);
Dabei ist style
eine der Formatierungskonstanten ( FULL
, LONG
, MEDIUM
, SHORT
usw.), die in DateFormat
angegeben DateFormat
.
Für eine serverseitige Anwendung, in der der Benutzer als Teil der Anforderung das Gebietsschema angibt, sollten Sie es stattdessen explizit an getDateInstance()
:
String localizedDate =
DateFormat.getDateInstance(style, request.getLocale()).format(date);
Stringvergleich
Vergleichen Sie zwei Strings, die den Fall ignorieren:
"School".equalsIgnoreCase("school"); // true
Nicht verwenden
text1.toLowerCase().equals(text2.toLowerCase());
Sprachen haben unterschiedliche Regeln für die Konvertierung von Groß- und Kleinschreibung. Ein "Ich" würde auf Englisch in "Ich" umgewandelt. Aber auf Türkisch wird ein Ich zu einem I. Wenn Sie verwenden müssen toLowerCase()
verwenden , um die Überlastung , die einen erwartet Locale
: String.toLowerCase(Locale)
.
Beim Vergleich zweier Strings werden geringfügige Unterschiede ignoriert:
Collator collator = Collator.getInstance(Locale.GERMAN);
collator.setStrength(Collator.PRIMARY);
collator.equals("Gärten", "gaerten"); // returns true
Sortieren Sie Strings unter Berücksichtigung der Reihenfolge der natürlichen Sprache und ignorieren Sie die Groß- / Kleinschreibung (verwenden Sie den Kollatierungsschlüssel, um:
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"}
Gebietsschema
Die Klasse java.util.Locale
wird verwendet, um eine "geografische, politische oder kulturelle" Region zu repräsentieren, um einen bestimmten Text, eine bestimmte Anzahl, ein bestimmtes Datum oder eine bestimmte Operation zu lokalisieren. Ein Gebietsschema-Objekt kann somit ein Land, eine Region, eine Sprache und auch eine Variante einer Sprache enthalten, beispielsweise einen Dialekt, der in einer bestimmten Region eines Landes oder in einem anderen Land als dem Land, aus dem die Sprache stammt, gesprochen wird.
Die Locale-Instanz wird an Komponenten übergeben, die ihre Aktionen lokalisieren müssen, unabhängig davon, ob sie die Eingabe oder Ausgabe konvertieren oder nur für interne Vorgänge benötigen. Die Locale-Klasse kann selbst keine Internationalisierung oder Lokalisierung durchführen
Sprache
Die Sprache muss ein 2- oder 3-stelliger Sprachcode nach ISO 639 oder ein registrierter Sprachuntertitel mit bis zu 8 Zeichen sein. Wenn eine Sprache sowohl aus zwei als auch aus drei Zeichen besteht, verwenden Sie den aus zwei Zeichen bestehenden Code. Eine vollständige Liste der Sprachcodes finden Sie in der IANA Language Subtag Registry.
Bei Sprachcodes wird die Groß- und Kleinschreibung nicht beachtet, die Locale-Klasse verwendet jedoch immer Versionen der Sprachcodes in Kleinbuchstaben
Ein Gebietsschema erstellen
Das Erstellen einer java.util.Locale
Instanz kann auf vier verschiedene Arten erfolgen:
Locale constants
Locale constructors
Locale.Builder class
Locale.forLanguageTag factory method
Java ResourceBundle
Sie erstellen eine ResourceBundle-Instanz wie folgt:
Locale locale = new Locale("en", "US");
ResourceBundle labels = ResourceBundle.getBundle("i18n.properties");
System.out.println(labels.getString("message"));
i18n.properties
ich habe eine Eigenschaftendatei i18n.properties
:
message=This is locale
Ausgabe:
This is locale
Gebietsschema einstellen
Wenn Sie den Status mit anderen Sprachen reproduzieren möchten, können Sie die setDefault()
-Methode verwenden. Seine Verwendung:
setDefault(Locale.JAPANESE); //Set Japanese