Slik lokaliserer du et Android-program

Lokalisering er mer enn bare oversettelsen av strengene i søknaden din på andre språk. Det innebærer også å vise data, for eksempel datoer og tider, i riktig format for brukerne. Selv om du bare vil ha en engelsk versjon av søknaden din, er det godt å vite hva lokalisering innebærer. På den måten vil du være klar hvis du bestemmer deg for å legge til støtte for flere lokaler, og du trenger ikke å lete etter strenger og verdier over hele programmets kodebase.

Med Android SDK, er språket for de lokale strenger og formatet som brukes til å vise verdier, avhengig av lokaliteten til enheten. Lokalen er en kombinasjon av språket og landet. Språket er definert av ISO 639-1 standard mens landet er definert av ISO 3166-1 standard. Dette betyr at Android-lokalene er kompatible med kulturen eller lokalen som brukes av de fleste andre programmeringsspråk og -rammer.

Den eneste locale som er garantert å være til stede på alle Android-enheter er Engelsk som det er sagt i forente stater. Det er representert av no kode, med noÅ være språkkoden for engelsk og OSS å være landskoden for USA. Du kan også bruke nokun språkkodesom lokalbefolkningen til å representere alle engelsktalende land og regioner.

For å lokalisere en søknad for et språk eller for et bestemt land og språk, må du inkludere ressursene for den aktuelle lokaliteten i / res mappe av søknaden din. Dette inkluderer vanligvis strengressurser i / RES / verdiene mappe, men det kan også inkludere andre typer ressurser, for eksempel bilder og layouter. Android SDK identifiserer de forskjellige alternative ressursene med konfigurasjonskvalifikatorer, som deretter brukes til å navngi mappen som inneholder disse ressursene. Konfigurasjonskvalifikatoren for lokalen er språkkoden, eventuelt etterfulgt av landskoden.Så, de lokaliserte strengressursene for søknaden din må være i/RES / verdiene- eller /RES / verdiene--r mappe.

Du bør huske på at ressursene som er identifisert med en konfigurasjonskvalifikator for en bestemt lokalitet, har forrang over de fleste andre ressurser. Andre vanlige konfigurasjonskvalifiserere for ressurser med lavere prioritet inkluderer skjermstørrelse og skjermpikseldensitet for å beskrive forskjellige layouter avhengig av skjermstørrelsen. Kun ressurser som er identifisert med en mobil landskode (MCC) konfigurasjonskvalifikator, har en høyere prioritet enn strengressurser identifisert med en lokalkonfigurasjonskvalifikator. Mobil landskoden brukes til å definere ressurser for et land, som eventuelt kan følges med mobilnettetkoden (MNC) fra et SIM-kort for å målrette mot en bestemt mobilleverandør i det landet. Det brukes til å gi innhold spesifikt til et land som en kontrakt eller en personvernpolicy.

1. Lokalisering av strenger

Hver Android-applikasjon skal ha alle sine strengressurser i /res/values/strings.xml fil. Dette tillater gjenbruk av streng i søknaden din selv om det ikke er behov for lokalisering. Også, hvis ingen fil er tilgjengelig for enhetens nåværende språk dette filen brukes. Hvis du ikke har en, og søknaden din forsøker å få tilgang til en strengressurs som bare er tilgjengelig i en strings.xml filspesifikke for en lokal, vil søknaden din krasje uten advarsel siden ressursene er lastet på kjøretid og ikke under kompilering.

EN strings.xml filspesifikke for en lokalitet trenger ikke å ha alle strengressursene fra /res/values/strings.xml fil. Dette betyr at hvis en ressurs, som navnet på søknaden din, ikke behøver å være lokalisert, trenger du ikke å inkludere den i hver strengfil.

På kjøretid, den /RES / verdiene--r/strings.xml filen for lokaliteten til enheten er merket etterfulgt av / rES / verdiene-/strings.xml bare for språket. Hvis den angitte strengen ikke er tilgjengelig i disse filene, faller programmet tilbake til / res / verdier / strings.xml.

Hvis du for eksempel vil lokalisere søknaden din for alle de fransktalende regionene og landene uten å målrette mot en bestemt, setter du strengene for programmet i / res / verdiene-fr /strings.xml fil. Men hvis du vil lokalisere noen strenger med stavemåte som er spesifikk for fransk som skrevet i Frankrike, må du sette dem inn i /res/values-fr-rFr/strings.xml fil. Pass på å legge til r før landskoden i mappenes navn, eller det vil ikke bli funnet på kjøretid når søknaden er lokalisert.

Her er et eksempel på a / RES verdier / /strings.xml fil med noen få snorressurser på engelsk:

  Android Localization Demo Hei Verden! Hei% s!  

Og her er en / Res / verdiene-fr /strings.xmlfil med samme ressurser på fransk:

  Démo de lokalisering Android Bonjour le monde! Bonjour% s! 

Lokalisering av strenger i layouter

Strengene i layoutene dine bør være strengressurser. Faktisk vises en Lint-advarsel hvis en streng er hardkodet. Du kan bruke ressurser overalt hvor du vil sette strenger i oppsett. Strengressurser identifiseres av @ Snor / etterfulgt av ressursens navn fra strings.xml fil. Følgende viser Hei Verden streng fra forrige eksempel i a TextView i henhold til lokaliteten til enheten:

Dette viser "Bonjour le monde!"på en Android-enhet satt til en lokal som inneholder fransk språket. For alle de andre lokalene, "Hello world!" streng er vist.

Lokalisering av strenger i kode

Du må også lokalisere strenger fra koden din hvis du oppretter eller endrer kontroller utenfor layoutene dine. For å lokalisere disse strengene må du først få tak i android.content.res.Resources objekt som inneholder alle ressursene i pakken i programmet for gjeldende kontekst. Du ringer deretter på getString metode på objektet, passerer inn i identifikatoren for strengen som skal vises. For eksempel viser følgende kodeblokk deg hvordan du setter inn teksten til a TextView gjenstand:

// Få oversatt streng fra strengen ressurs android.content.res.Resources res = context.getResources (); String helloWorld = res.getString (R.string.hello_world); // Sett streng til tekstvisning TextView helloTextView; helloTextView = (TextView) findViewById (R.id.hello_world_textview); helloTextView.setText (Hello);

Mer komplekse strenger, med en eller flere variable komponenter, må du bruke formatstrenger. Format strengene lar deg angi verdiene for parametere som skal vises. Parametrene i formatstrengen identifiseres med formatspecifikatorer. Det mest brukte formatet spesifiserer er % s, som representerer en streng. Faktisk er alt formatet strenger fra java.util.Formatter klassen er tilgjengelig. Også, hvis flere parametre er påkrevet, må du nummerere formatet spesifiserer. I tilfelle av strengformat spesifiserer, bør den første være % 1 $ s, den andre % 2 $ s, og så videre.

Når format strengene er angitt, bruker du String.format metode for å passere i parametrene som skal vises til din streng. Slik angir du teksten som skal vises i en TextView med hello_world_name format streng fra strings.xml fil. Denne formatstrengen inneholder et format spesifiserer for brukerens navn:

// Hent formatstrengen android.content.res.Resources res = context.getResources (); String helloFormatString = res.getString (R.string.hello_world_name); String userName = "Bob"; // Sett inn navnet i formatstrengen String helloWorldName = String.format (helloFormatString, userName); // Sett tekst i tekstvisningen TextView helloTextView; helloTextView = (TextView) findViewById (R.id.hello_world_textview); helloTextView.setText (helloWorldName);

Dette viser "Bonjour Bob!"streng for en Android-enhet med en språk som inneholder fransk språket. For alle de andre lokalene, "Hello Bob!" streng er vist.

2. Lokalisering av datoer og tider

Hvis strengene i søknaden din allerede er lokalisert, er søknaden din allerede i god form. Det kan imidlertid hende du må vise datoer og klokkeslett til brukeren i mange tilfeller. Disse datoene og tidspunktene bør også tilpasses til gjeldende lokalitet på enheten. Heldigvis inneholder Android SDK klasser som formaterer datoer og tider i henhold til lokalene.

I Android SDK administreres datoer og tider av Dato klasse fra java.util navnerom. Gjeldende dato og klokkeslett for enheten returneres av java.util.Calendar.

Lokaliseringsdatoer

Datoer kan formateres ved hjelp av en forekomst av dateformat formatter fra java.text navnerom. Du må bruke dateformat klasse fra Android SDK i android.text.format namespace for å få riktig formatter for lokaliteten til enheten. Følgende kodestykke viser hvordan du får en streng med gjeldende dato formatert for enhetens språk:

// Går gjeldende dato og klokkeslett Dato currentDate = Calendar.getInstance (). GetTime (); // Går standard datoformater for gjeldende lokalitet av // enheten java.text.DateFormat dateFormat; dateFormat = android.text.format.DateFormat.getDateFormat (dette); // Formater gjeldende dato i henhold til lokalområdet String formattedCurrentDate = dateFormat.format (currentDate);

Hvis den gjeldende lokaliteten til enheten er engelsk som det er snakkes i USA, vil strengen inneholde gjeldende dato i et kort datoformat, 11/30/2014. De dateformat klassen inneholder noen andre datoformater. For eksempel, getLongDateFormat Metoden returnerer et langt datoformat, Søndag 30. november 2014.

Lokaliseringstider

Siden ganger er representert som Dato objekter av Android SDK, må de også vises ved hjelp av en formatter returnert av dateformat klasse fra android.text.format navnerom. De getTimeFormat Metoden returnerer et format som bare viser tidspunktet for a Dato gjenstand. Følgende kodestykke viser hvordan du får en streng med gjeldende tid formatert for enhetens språk:

// Går gjeldende dato og klokkeslett java.util.Date currentDate = Calendar.getInstance (). GetTime (); // Går en datoformater for den aktuelle lokaliteten til enheten // som viser ganger. java.text.DateFormat timeFormat; timeFormat = android.text.format.DateFormat.getTimeFormat (dette); // Formaterer gjeldende tid i henhold til lokalområdet String formattedTime = timeFormat.format (currentDate);

Hvis gjeldende språk på enheten er engelsk som det er snakkes i USA, vil strengen inneholde gjeldende tid i følgende format, 8:15 PM.

Konklusjon

Det er viktig å bare lokalisere strengene som brukes i programmets brukergrensesnitt. For eksempel er det ikke nødvendig å lokalisere feilsøkingsmeldinger som bare brukes under utvikling eller for diagnostiske formål. Vær også oppmerksom på at du ikke bør skrive lokaliserte datoer og tider til disk eller til en database. Ikke bare kan lokaliteten til en enhet skifte, arbeider med lokaliserte datoer og tider gjør utviklingen unødvendig vanskelig og kompleks.