Java Language
Lokalisatie en internationalisering
Zoeken…
Opmerkingen
Java wordt geleverd met een krachtig en flexibel mechanisme voor het lokaliseren van uw toepassingen, maar het is ook gemakkelijk te misbruiken en te eindigen met een programma dat de landinstelling van de gebruiker negeert of vervormt, en dus hoe zij verwachten dat uw programma zich gedraagt.
Uw gebruikers verwachten dat gegevens worden gelokaliseerd in de formaten die ze gewend zijn, en proberen dit handmatig te ondersteunen is een dwaze boodschap. Hier is slechts een klein voorbeeld van de verschillende manieren waarop gebruikers verwachten dat inhoud waarvan u denkt dat deze "altijd" op een bepaalde manier wordt weergegeven:
data | Numbers | Lokale munteenheid | Buitenlandse valuta | Afstanden | |
---|---|---|---|---|---|
Brazilië | |||||
China | |||||
Egypte | |||||
Mexico | 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 | |
Verenigde Staten van Amerika | 3/20/16 | 1,234.56 | $ 1,000.50 | 1.000,50 MXN | 60 mijl |
Algemene bronnen
- Wikipedia: Internationalisering en lokalisatie
Java-bronnen
- Java-zelfstudie: internationalisering
- Oracle: Internationalisering: locale begrijpen in het Java-platform
- JavaDoc:
Locale
Datums automatisch opgemaakt met 'locale'
SimpleDateFormatter
is geweldig in een snuifje, maar zoals de naam al doet vermoeden is het niet goed schaalbaar.
Als u "MM/dd/yyyy"
in uw toepassing hard codeert, zullen uw internationale gebruikers niet tevreden zijn.
Laat Java het werk voor u doen
Gebruik de static
methoden in DateFormat
om de juiste opmaak voor uw gebruiker op te halen. Voor een desktoptoepassing (waarbij u zult vertrouwen op de standaardlocale ), belt u eenvoudig:
String localizedDate = DateFormat.getDateInstance(style).format(date);
Waar style
een van de opmaakconstanten is ( FULL
, LONG
, MEDIUM
, SHORT
, enz.) Opgegeven in DateFormat
.
Voor een server-side applicatie waarbij de gebruiker zijn locale opgeeft als onderdeel van het verzoek, moet je dit expliciet doorgeven aan getDateInstance()
plaats daarvan:
String localizedDate =
DateFormat.getDateInstance(style, request.getLocale()).format(date);
String vergelijking
Vergelijk twee tekenreeksen die case negeren:
"School".equalsIgnoreCase("school"); // true
Niet gebruiken
text1.toLowerCase().equals(text2.toLowerCase());
Talen hebben verschillende regels voor het omzetten van hoofdletters en kleine letters. Een 'I' zou worden omgezet in 'i' in het Engels. Maar in het Turks wordt een 'ik' een 'ı'. Als u toLowerCase()
gebruiken, gebruikt u de overbelasting die een Locale
: String.toLowerCase(Locale)
.
Twee strings vergelijken waarbij kleine verschillen worden genegeerd:
Collator collator = Collator.getInstance(Locale.GERMAN);
collator.setStrength(Collator.PRIMARY);
collator.equals("Gärten", "gaerten"); // returns true
Sorteer strings met inachtneming van de natuurlijke taalvolgorde, zonder hoofdlettergebruik (gebruik de sorteertoets om:
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"}
locale
De klasse java.util.Locale
wordt gebruikt om een "geografische, politieke of culturele" regio voor te stellen om een gegeven tekst, nummer, datum of operatie te lokaliseren. Een object Locale kan dus een land, regio, taal en ook een variant van een taal bevatten, bijvoorbeeld een dialect dat in een bepaalde regio van een land wordt gesproken, of in een ander land wordt gesproken dan het land waaruit de taal afkomstig is.
De instantie Locale wordt overhandigd aan componenten die hun acties moeten lokaliseren, of het nu de invoer, uitvoer of gewoon voor interne bewerkingen is. De klasse Locale kan op zichzelf geen internationalisatie of lokalisatie uitvoeren
Taal
De taal moet een ISO 639 taalcode van 2 of 3 tekens zijn, of een geregistreerde subtag van maximaal 8 tekens. Als een taal zowel een taalcode van 2 als 3 tekens heeft, gebruik dan de code van 2 tekens. Een volledige lijst met taalcodes is te vinden in het IANA Language Subtag Registry.
Taalcodes zijn niet hoofdlettergevoelig, maar de klasse Locale gebruikt altijd kleine versies van de taalcodes
Een landinstelling maken
Het maken van een java.util.Locale
instantie kan op vier verschillende manieren worden gedaan:
Locale constants
Locale constructors
Locale.Builder class
Locale.forLanguageTag factory method
Java ResourceBundle
U maakt een instantie ResourceBundle als volgt:
Locale locale = new Locale("en", "US");
ResourceBundle labels = ResourceBundle.getBundle("i18n.properties");
System.out.println(labels.getString("message"));
Overweeg dat ik een eigenschappenbestand i18n.properties
:
message=This is locale
Output:
This is locale
Landinstelling instellen
Als u de status met andere talen wilt reproduceren, kunt u de methode setDefault()
gebruiken. Het gebruik ervan:
setDefault(Locale.JAPANESE); //Set Japanese