Android
Internationalisering en lokalisatie (I18N en L10N)
Zoeken…
Invoering
Internationalisatie (i18n) en Localization (L10n) worden gebruikt om software aan te passen aan verschillen in talen, regionale verschillen en doelgroep.
Internationalisering: het planningsproces voor toekomstige lokalisatie, dwz het flexibel maken van het softwareontwerp zodat het zich kan aanpassen en aanpassen aan toekomstige lokalisatie-inspanningen.
Lokalisatie: het proces van aanpassing van de software aan een bepaalde regio / land / markt (locale).
Opmerkingen
Om een apparaat te testen op lokalisatie, kan het apparaat of de emulator opnieuw worden opgestart op een bepaalde locatie door adb
als volgt te gebruiken:
- Run adb met het commando:
adb shell
- Voer de volgende opdracht uit bij de adb-opdrachtprompt:
setprop persist.sys.locale [BCP-47 language tag];stop;sleep 5;start
waar [BCP-47- taaltag ] de taalspecifieke code is zoals hier beschreven: BCP47-codes
bijv. om de Japanse lokalisatie in de app te controleren, gebruik de opdracht: setprop persist.sys.locale ja-JP;stop;sleep 5;start
Planning voor lokalisatie: schakel RTL-ondersteuning in Manifest in
RTL-ondersteuning (van rechts naar links) is een essentieel onderdeel van de planning voor i18n en L10n. In tegenstelling tot de Engelse taal die van links naar rechts wordt geschreven, worden veel talen zoals Arabisch, Japans, Hebreeuws, etc. van rechts naar links geschreven. Om een meer wereldwijd publiek aan te spreken, is het een goed idee om uw lay-outs te plannen om deze taal vanaf het allereerste begin van het project te ondersteunen, zodat het later gemakkelijker is om lokalisatie toe te voegen.
RTL ondersteuning kan in een Android-app worden ingeschakeld door het toevoegen van de supportsRtl
tag in de AndroidManifest
, als volgt:
<application
...
android:supportsRtl="true"
...>
...
</application>
Planning voor lokalisatie: voeg RTL-ondersteuning toe in Layouts
Vanaf SDK 17 (Android 4.2) is RTL-ondersteuning toegevoegd in Android-lay-outs en is een essentieel onderdeel van de lokalisatie. Voortaan moet de left/right
notatie in lay-outs worden vervangen door start/end
eindnotatie. Als uw project echter een minSdk
waarde van minder dan 17
, moeten zowel de left/right
als de start/end
minSdk
in lay-outs worden gebruikt.
Voor relatieve lay-outs moeten alignParentStart
en alignParentEnd
als volgt worden gebruikt:
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"/>
</RelativeLayout>
Voor het specificeren van de zwaartekracht en de zwaartekracht van de layout moet een soortgelijke notatie worden gebruikt, zoals hier:
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left|start"
android:gravity="left|start"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right|end"
android:gravity="right|end"/>
Opvullingen en marges moeten ook als volgt worden gespecificeerd:
<include layout="@layout/notification"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="12dp"
android:layout_marginStart="12dp"
android:paddingLeft="128dp"
android:paddingStart="128dp"
android:layout_toLeftOf="@id/cancel_action"
android:layout_toStartOf="@id/cancel_action"/>
<include layout="@layout/notification2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginRight="12dp"
android:layout_marginEnd="12dp"
android:paddingRight="128dp"
android:paddingEnd="128dp"
android:layout_toRightOf="@id/cancel_action"
android:layout_toEndOf="@id/cancel_action"/>
Planning voor lokalisatie: testlay-outs voor RTL
Om te testen of de gemaakte lay-outs RTL-compatibel zijn, doet u het volgende:
Ga naar Instellingen -> Ontwikkelaarsopties -> Tekening -> Forceer RTL-indelingsrichting
Als u deze optie inschakelt, wordt het apparaat gedwongen RTL-landinstellingen te gebruiken en kunt u eenvoudig alle delen van de app verifiëren voor RTL-ondersteuning. Merk op dat u tot dit punt geen nieuwe ondersteuning voor landinstellingen / taal hoeft toe te voegen.
Codering voor lokalisatie: standaardreeksen en bronnen maken
De eerste stap voor het coderen voor lokalisatie is het maken van standaardbronnen. Deze stap is zo impliciet dat veel ontwikkelaars er niet eens aan denken. Het maken van standaardbronnen is echter belangrijk, omdat als het apparaat op een niet-ondersteunde landinstelling wordt uitgevoerd, alle bronnen uit de standaardmappen worden geladen. Als zelfs een van de bronnen ontbreekt in de standaardmappen, crasht de app gewoon.
De standaardreeks strings moet in de volgende map op de opgegeven locatie worden geplaatst:
res/values/strings.xml
Dit bestand moet de tekenreeksen bevatten in de taal die van de meeste gebruikers van de app wordt verwacht.
Ook moeten standaardbronnen voor de app in de volgende mappen en locaties worden geplaatst:
res/drawable/
res/layout/
Als uw app mappen zoals anim
of xml
vereist, moeten de standaardbronnen worden toegevoegd aan de volgende mappen en locaties:
res/anim/
res/xml/
res/raw/
Codering voor lokalisatie: alternatieve tekenreeksen bieden
Om vertalingen in andere talen (landinstellingen) te bieden, moeten we een strings.xml
in een afzonderlijke map volgens de volgende conventie:
res/values-<locale>/strings.xml
Een voorbeeld hiervan wordt hieronder gegeven:
In dit voorbeeld hebben we standaard Engelse tekenreeksen in het bestand res/values/strings.xml
, Franse vertalingen zijn beschikbaar in de map res/values-fr/strings.xml
en Japanse vertalingen zijn beschikbaar in de map res/values-ja/strings.xml
Andere vertalingen voor andere locaties kunnen op dezelfde manier aan de app worden toegevoegd.
Een complete lijst met landcode is hier te vinden: ISO 639-codes
Niet-vertaalbare tekenreeksen:
Uw project heeft mogelijk bepaalde tekenreeksen die niet moeten worden vertaald. Tekenreeksen die worden gebruikt als sleutels voor SharedPreferences of tekenreeksen die worden gebruikt als symbolen, vallen in deze categorie. Deze strings mogen alleen worden opgeslagen in de standaard strings.xml
en moeten worden gemarkeerd met een kenmerk translatable="false"
. bv
<string name="pref_widget_display_label_hot">Hot News</string>
<string name="pref_widget_display_key" translatable="false">widget_display</string>
<string name="pref_widget_display_hot" translatable="false">0</string>
Dit kenmerk is belangrijk omdat vertalingen vaak worden uitgevoerd door tweetalige professionals. Hierdoor zouden deze personen die bij vertalingen betrokken zijn, strings kunnen identificeren die niet moeten worden vertaald, wat tijd en geld bespaart.
Codering voor lokalisatie: alternatieve lay-outs bieden
Het maken van taalspecifieke lay-outs is vaak niet nodig als u de juiste start/end
eindnotatie hebt opgegeven, zoals beschreven in het eerdere voorbeeld. Er kunnen echter situaties zijn waarin de standaardlay-outs mogelijk niet correct werken voor bepaalde talen. Soms kunnen van links naar rechts lay-outs niet worden vertaald voor RTL-talen. In dergelijke gevallen moet u de juiste lay-outs opgeven.
Om volledige optimalisatie voor RTL-lay-outs te bieden, kunnen we volledig afzonderlijke lay- ldrtl
gebruiken met behulp van de kwalificatie ldrtl
( ldrtl
staat voor layout-richting-rechts-naar-links}). We kunnen bijvoorbeeld uw standaardlay res/layout-ldrtl/
opslaan in res/layout/
en onze voor RTL geoptimaliseerde lay-outs in res/layout-ldrtl/
.
De kwalificatie ldrtl
is geweldig voor tekenbare bronnen, zodat u afbeeldingen kunt maken die zijn georiënteerd in de richting die overeenkomt met de leesrichting.
Hier is een geweldige post die de prioriteit van de ldrtl
lay-outs beschrijft: ldrtl
lay- outs