Java Language
Lokalisering och internationalisering
Sök…
Anmärkningar
Java kommer med en kraftfull och flexibel mekanism för att lokalisera dina applikationer, men det är också lätt att missbruka och avveckla ett program som bortser från eller misslyckar användarens landskap, och därför hur de förväntar sig att ditt program ska bete sig.
Dina användare kommer att förvänta sig att se data lokaliserade till de format de är vana med, och att försöka stödja detta manuellt är ett dåligt ärende. Här är bara ett litet exempel på olika sätt som användare förväntar sig att se innehåll som du kan anta att "alltid" visas på ett visst sätt:
datum | Tal | Lokal valuta | Utländsk valuta | Avstånden | |
---|---|---|---|---|---|
Brasilien | |||||
Kina | |||||
egypten | |||||
mexico | 20/3/16 | 1.234,56 | $ 1,000.50 | 1 000,50 USD | |
Storbritannien | 20/3/16 | 1,234.56 | £ 1,000.50 | 100 km | |
USA | 3/20/16 | 1,234.56 | $ 1,000.50 | 1 000,50 MXN | 60 mil |
Allmänna resurser
- Wikipedia: Internationalisering och lokalisering
Java-resurser
- Java Tutorial: Internationalisering
- Oracle: Internationalisering: Förstå språk i Java-plattformen
- JavaDoc:
Locale
Formaterade datum automatiskt med "språk"
SimpleDateFormatter
är bra i en nypa, men som namnet antyder att den inte skalas bra.
Om du hårdkodar "MM/dd/yyyy"
över hela din applikation kommer dina internationella användare inte att vara nöjda.
Låt Java göra jobbet åt dig
Använd de static
metoderna i DateFormat
att hämta rätt formatering för din användare. För en stationär applikation (där du litar på standardinställningen ), ring bara:
String localizedDate = DateFormat.getDateInstance(style).format(date);
Där style
är en av formateringskonstanterna ( FULL
, LONG
, MEDIUM
, SHORT
, etc.) som anges i DateFormat
.
För en applikation på serversidan där användaren anger sitt land som en del av begäran ska du skicka det uttryckligen till getDateInstance()
istället:
String localizedDate =
DateFormat.getDateInstance(style, request.getLocale()).format(date);
Strängjämförelse
Jämför två strängar som ignorerar fallet:
"School".equalsIgnoreCase("school"); // true
Använd inte
text1.toLowerCase().equals(text2.toLowerCase());
Språk har olika regler för konvertering av versaler och versaler. Ett "jag" skulle konverteras till "i" på engelska. Men på turkiska blir ett 'jag' ett 'ı'. Om du måste använda toLowerCase()
använder du överbelastningen som förväntar sig ett Locale
: String.toLowerCase(Locale)
.
Jämförelse av två strängar som ignorerar mindre skillnader:
Collator collator = Collator.getInstance(Locale.GERMAN);
collator.setStrength(Collator.PRIMARY);
collator.equals("Gärten", "gaerten"); // returns true
Sortera strängar som respekterar naturligt språkordning, ignorerar fall (använd samlingsnyckel för:
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
java.util.Locale
används för att representera en "geografisk, politisk eller kulturell" region för att lokalisera en given text, nummer, datum eller operation till. Ett språkobjekt kan sålunda innehålla ett land, en region, ett språk och även en variant av ett språk, till exempel en dialekt som talas i en viss region i ett land, eller som talas i ett annat land än det land som språket kommer från.
Locale-instansen överlämnas till komponenter som behöver lokalisera sina handlingar, oavsett om det konverterar ingången, utgången eller bara behöver den för interna operationer. Locale-klassen kan inte göra någon internationalisering eller lokalisering av sig själv
Språk
Språket måste vara en ISO 639 2 eller 3 tecken språkkod, eller en registrerad språkundtagg på upp till 8 tecken. Om ett språk har både en 2 och 3 tecken språkkod, använd 2 teckenkoden. En fullständig lista över språkkoder finns i IANA Language Subtag Registry.
Språkkoder är okänsliga för versaler, men klassen Locale använder alltid småversioner av språkkoderna
Skapa en språk
Skapa en java.util.Locale
instans kan göras på fyra olika sätt:
Locale constants
Locale constructors
Locale.Builder class
Locale.forLanguageTag factory method
Java ResourceBundle
Du skapar en ResourceBundle-instans på så sätt:
Locale locale = new Locale("en", "US");
ResourceBundle labels = ResourceBundle.getBundle("i18n.properties");
System.out.println(labels.getString("message"));
Tänk på att jag har en egendomsfil i18n.properties
:
message=This is locale
Produktion:
This is locale
Ställer in språk
Om du vill reproducera tillståndet med andra språk kan du använda setDefault()
. Dess användning:
setDefault(Locale.JAPANESE); //Set Japanese