Lokalisering är mer än bara översättningen av strängarna i din ansökan på andra språk. Det innebär också att visa data, t.ex. datum och tider, i rätt format för dina användare. Även om du bara vill ha en engelsk version av din ansökan är det bra att veta vilken lokalisering innebär. På det sättet är du redo om du väljer att lägga till stöd för ytterligare platser och du behöver inte leta efter strängar och värden över hela programmets kodbas.
Med Android SDK är språket för de lokala strängarna och det format som används för att visa värden beroende av enhetens språk. Lokalen är en kombination av språket och landet. Språket definieras av ISO 639-1 standard medan landet definieras av ISO 3166-1 standard. Det innebär att Android-lokalen är kompatibel med den kultur eller språk som används av de flesta andra programmeringsspråk och ramverk.
Den enda plats som garanteras vara närvarande på alla Android-enheter är engelsk som talas i Förenta staterna. Det är representerat av sv kod, med svär språkkoden för engelska och oss är landskoden för USA. Du kan också använda svEndast språkkodsom landsting för att representera alla engelsktalande länder och regioner.
För att lokalisera en ansökan för ett språk eller för ett visst land och språk måste du inkludera resurserna för den platsen i / res mapp på din ansökan. Detta inkluderar vanligtvis strängresurser i / RES / värden mappen, men det kan också innehålla andra typer av resurser, till exempel bilder och layouter. Android SDK identifierar de olika alternativa resurserna med konfigurationskvalificatorer, som sedan används för att namnge mappen som innehåller dessa resurser. Konfigurationskvalificatorn för lokalen är språkkoden, eventuellt följd av landskoden.Så, de lokala strängresurserna för din ansökan måste vara i/res / värden-
Du bör komma ihåg att de resurser som identifierats med en konfigurationskvalificator för en specifik lokalitet har företräde framför de flesta andra resurser. Andra vanliga konfigurationskvalificatorer för resurser med lägre prioritet inkluderar skärmstorlek och skärmpunktdensitet för att beskriva olika layouter beroende på skärmens storlek. Endast resurser som identifierats med en mobilkods (MCC) konfigurationskvalificering har en högre prioritet än strängresurser som identifieras med en lokalkonfigurationskvalificering. Mobil landskoden används för att definiera resurser för ett land, som eventuellt kan följas med mobilnätskoden (MNC) från ett SIM-kort för att rikta in sig mot en specifik mobilleverantör i det landet. Det används för att ge innehåll specifikt för ett land som ett kontrakt eller en integritetspolicy.
Varje Android-applikation bör ha alla dess strängresurser i /res/values/strings.xml fil. Detta möjliggör återanvändning av sträng i din ansökan, även om ingen lokalisering behövs. Också, om ingen fil är tillgänglig för enhetens nuvarande språk här filen används. Om du inte har en och din ansökan försöker få åtkomst till en strängresurs som endast är tillgänglig i en strings.xml filspecifika för en lokal, kommer din ansökan att krascha utan varning eftersom resurser laddas i körtid och inte under sammanställning.
en strings.xml filspecifik för en lokal behöver inte ha alla strängresurser från /res/values/strings.xml fil. Det betyder att om en resurs, som namnet på din ansökan, inte behöver vara lokaliserad, behöver du inte inkludera den i varje strängfil.
Vid körning, den /res / värden-
Om du till exempel vill lokalisera din ansökan för alla fransktalande regioner och länder utan att rikta in en specifik, lägger du strängarna för programmet i / res / värden-fr /strings.xml fil. Men om du vill lokalisera några strängar med stavning specifikt för franska som skrivet i Frankrike, måste du sätta dem i /res/values-fr-rFr/strings.xml fil. Se till att du lägger till r före landskoden i mappens namn eller det kommer inte att hittas vid körning när applikationen är lokaliserad.
Här är ett exempel på a / RES / värden /strings.xml fil med några strängresurser på engelska:
Android Localization Demo Hej världen! Hej% s!
Och här är en / Res / värden-fr /strings.xmlfil med samma resurser på franska:
Démo de lokalisering Android Bonjour le monde! Bonjour% s!
Strängarna i dina layouter bör vara strängresurser. Faktum är att en larmvarning visas om en sträng är hårdkodad. Du kan använda resurser överallt där du skulle ställa in strängar i layouter. Strängresurser identifieras av @sträng/
följt av resursens namn från strings.xml fil. Följande visar Hej världen
sträng från föregående exempel i a Textview
enligt anordningens lokalitet:
Detta visar "Bonjour le monde!"på en Android-enhet som är inställd på ett språk som innehåller franska språket. För alla andra platser, "Hej världen!" strängen visas.
Du måste också lokalisera strängar från din kod om du skapar eller ändrar kontroller utanför dina layouter. För att lokalisera dessa strängar måste du först få android.content.res.Resources
objekt som innehåller alla resurser i paketet i programmet för det aktuella sammanhanget. Du ringer sedan på getString
metod på det objektet, som passerar i identifieraren för strängen som ska visas. Till exempel visar följande kodblock hur du ställer in text på a Textview
objekt:
// Hämta den översatta strängen från strängresursen android.content.res.Resources res = context.getResources (); String helloWorld = res.getString (R.string.hello_world); // Ställ in strängen i textvyn TextView helloTextView; helloTextView = (TextView) findViewById (R.id.hello_world_textview); helloTextView.setText (Helloworld);
Mer komplexa strängar, med en eller flera variabla komponenter, måste du använda formatsträngar. Format strängar låter dig ange värdena för parametrar som ska visas. Parametrarna i formatsträngen identifieras med formatspecifikatorer. Det vanligaste formatet specifier är % s
, representerar en sträng. Faktum är att alla format strängar från java.util.Formatter
klass är tillgängliga. Om flera parametrar krävs måste du också numrera dina formatspecifikatorer. När det gäller strängformatspecifiers ska den första vara % 1 $ s
, den andra % 2 $ s
, och så vidare.
När formatsträngar är angivna använder du String.format
Metod för att passera i parametrarna för att visa till din sträng. Så här ställer du in texten som ska visas i en Textview
med hello_world_name
formatera sträng från strings.xml fil. Denna formatsträng innehåller ett formatspecifik för användarens namn:
// Hämta formatsträngen android.content.res.Resources res = context.getResources (); String helloFormatString = res.getString (R.string.hello_world_name); String userName = "Bob"; // Sätt in namnet i formatsträngen String helloWorldName = String.format (helloFormatString, användarnamn); // Ange text i textvyn TextView helloTextView; helloTextView = (TextView) findViewById (R.id.hello_world_textview); helloTextView.setText (helloWorldName);
Detta visar "Bonjour Bob!"sträng för en Android-enhet med en lokal som innehåller franska språket. För alla andra platser "Hello Bob!" strängen visas.
Om strängarna i din ansökan redan är lokaliserade, är din ansökan redan i ganska bra form. Du kan dock i vissa fall visa datum och tider för användaren. Dessa datum och tider bör också anpassas till enhetens aktuella plats. Lyckligtvis innehåller Android SDK klasser som formaterar datum och tider enligt lokal.
I Android SDK hanteras datum och tider av Datum
klass från java.util
namnutrymmet. Nuvarande datum och tid för enheten returneras av java.util.Calendar
.
Datum kan formateras med hjälp av en instans av Datumformat
formaterare från java.text
namnutrymmet. Du måste använda Datumformat
klass från Android SDK i android.text.format
namespace för att få rätt formaterare för enhetens språk. Följande kodsekvens visar hur man får en sträng med det aktuella datumet formaterat för enhetens språk:
// Gets det aktuella datumet och tiden Date currentDate = Calendar.getInstance (). GetTime (); // Går standarddatumformateraren för den aktuella localen av // enheten java.text.DateFormat dateFormat; dateFormat = android.text.format.DateFormat.getDateFormat (detta); // Formaterar det aktuella datumet enligt region String formattedCurrentDate = dateFormat.format (currentDate);
Om den aktuella platsen för enheten är engelska som det talas i USA, innehåller strängen det aktuella datumet i ett kort datumformat, 2014/11/30. De Datumformat
klassen innehåller några andra datumformat. Till exempel, getLongDateFormat
Metoden returnerar ett långt datumformat, Söndag den 30 november 2014.
Eftersom tider representeras som Datum
objekt av Android SDK, måste de också visas med en formaterare som returneras av Datumformat
klass från android.text.format
namnutrymmet. De getTimeFormat
Metoden returnerar ett format som endast visar tiden för a Datum
objekt. Följande kodsekvens visar hur man får en sträng med den aktuella tiden som är formaterad för enhetens språk:
// Gets det aktuella datumet och tiden java.util.Date currentDate = Calendar.getInstance (). GetTime (); // Går en datumformaterare för enhetens aktuella lokalitet // som visar tider. java.text.DateFormat timeFormat; timeFormat = android.text.format.DateFormat.getTimeFormat (detta); // Formaterar den aktuella tiden enligt lokaltexten String formattedTime = timeFormat.format (currentDate);
Om den aktuella platsen för enheten är engelska som det talas i USA, kommer strängen att innehålla aktuell tid i följande format, 8:15 PM.
Det är viktigt att bara lokalisera de strängar som används i programmets användargränssnitt. Det finns till exempel inget behov av att lokalisera felsökningsmeddelanden som endast används under utveckling eller för diagnostiska ändamål. Observera också att du inte ska skriva lokaliserade datum och tider på disk eller till en databas. Inte bara kan en enhets lokal ändra sig, arbeta med lokaliserade datum och tider gör utvecklingen onödigt svår och komplex.