Sdílet prostřednictvím


Lokalizace Androidu

Tento dokument představuje lokalizační funkce sady Android SDK a přístup k nim pomocí Xamarinu.

Funkce platformy Android

Tato část popisuje hlavní funkce lokalizace Androidu. Přeskočte na další část a podívejte se na konkrétní kód a příklady.

Národní prostředí

Uživatelé vyberou svůj jazyk ve Nastavení > Jazyk a vstup. Tento výběr určuje jazyk zobrazený i místní nastavení (např. pro formátování data a čísla).

Aktuální národní prostředí lze dotazovat prostřednictvím aktuálního Resourceskontextu:

var lang = Resources.Configuration.Locale; // eg. "es_ES"

Tato hodnota bude identifikátor národního prostředí, který obsahuje kód jazyka i kód národního prostředí oddělený podtržítkem. Tady je seznam národních prostředí Java a národních prostředí podporovaných Androidem prostřednictvím StackOverflow.

K běžným příkladům patří:

  • en_USpro angličtinu (USA)
  • es_ES pro španělštinu (Španělsko)
  • ja_JP pro japonštinu (Japonsko)
  • zh_CN pro čínštinu (Čína)
  • zh_TW pro čínštinu (Tchaj-wan)
  • pt_PT pro portugalštinu (Portugalsko)
  • pt_BR pro portugalštinu (Brazílie)

LOCALE_CHANGED

Android se vygeneruje android.intent.action.LOCALE_CHANGED , když uživatel změní výběr jazyka.

Aktivity se můžou rozhodnout zpracovat nastavením android:configChanges atributu aktivity, například takto:

[Activity (Label = "@string/app_name", MainLauncher = true, Icon="@drawable/launcher",
    ConfigurationChanges = ConfigChanges.Locale | ConfigChanges.ScreenSize | ConfigChanges.Orientation)]

Základy internacionalizace v Androidu

Strategie lokalizace Androidu má následující klíčové části:

  • Složky prostředků, které obsahují lokalizované řetězce, obrázky a další prostředky.

  • GetText metoda, která se používá k načtení lokalizovaných řetězců v kódu

  • @string/id v souborech AXML pro automatické umístění lokalizovaných řetězců do rozložení.

Složky prostředků

Aplikace pro Android spravují většinu obsahu ve složkách prostředků, například:

  • layout – obsahuje soubory rozložení AXML.
  • kreslení – obsahuje obrázky a další nakreslené zdroje.
  • hodnoty – obsahuje řetězce.
  • raw – obsahuje datové soubory.

Většina vývojářů už umí používat přípony dpi v kreslitelném adresáři k poskytování více verzí obrázku a umožňuje Androidu zvolit správnou verzi pro každé zařízení. Stejný mechanismus se používá k poskytování více překladů jazyka příponou adresářů prostředků s identifikátory jazyka a jazykové verze.

Screenshot of Resources/drawable and Resources/values folders for multiple cultural identifiers

Poznámka:

Při zadávání jazyka nejvyšší úrovně jako es jsou vyžadovány pouze dva znaky. Při zadávání celého národního prostředí však formát názvu adresáře vyžaduje pomlčku a malá písmena r k oddělení dvou částí, například pt-rBR nebo zh-rCN. Porovnejte ji s hodnotou vrácenou v kódu, která má podtržítko (např. pt_BR). Obě tyto hodnoty se liší od použití třídy .NET CultureInfo , která má pouze pomlčku (např. pt-BR). Při práci na platformách Xamarin mějte na paměti tyto rozdíly.

formát souboru Strings.xml

Adresář lokalizovaných hodnot (např. values-es nebo values-pt-rBR) by měly obsahovat soubor s názvem Strings.xml , který bude obsahovat přeložený text pro dané národní prostředí.

Každý přeložitelný řetězec je element XML s ID prostředku zadaným jako name atribut a přeložený řetězec jako hodnota:

<string name="app_name">TaskyL10n</string>

Potřebujete utéct podle normálních pravidel XML a name musí to být platné ID prostředku Androidu (bez mezer nebo pomlček). Tady je příklad výchozího (anglického) souboru řetězců pro příklad:

hodnoty/Strings.xml

<resources>
    <string name="app_name">TaskyL10n</string>
    <string name="taskadd">Add Task</string>
    <string name="taskname">Name</string>
    <string name="tasknotes">Notes</string>
    <string name="taskdone">Done</string>
    <string name="taskcancel">Cancel</string>
</resources>

Hodnoty španělského adresáře obsahují soubor se stejným názvem (Strings.xml), který obsahuje překlady:

values-es/Strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">TaskyLeon</string>
    <string name="taskadd">agregar tarea</string>
    <string name="taskname">Nombre</string>
    <string name="tasknotes">Notas</string>
    <string name="taskdone">Completo</string>
    <string name="taskcancel">Cancelar</string>
</resources>

Screenshot of multiple values folders, each containing a Strings.xml file

Při nastavení souborů řetězců lze přeložené hodnoty odkazovat jak v rozloženích, tak v kódu.

Soubory rozložení AXML

Pokud chcete odkazovat na lokalizované řetězce v souborech rozložení, použijte @string/id syntaxi. Tento fragment kódu XML z ukázky ukazuje text vlastnosti, které se nastavují s lokalizovanými ID prostředků (některé další atributy byly vynechány):

<TextView
    android:id="@+id/NameLabel"
    android:text="@string/taskname"
    ... />
<CheckBox
    android:id="@+id/chkDone"
    android:text="@string/taskdone"
    ... />

GetText – metoda

Pokud chcete načíst přeložené řetězce v kódu, použijte metodu GetText a předejte ID prostředku:

var cancelText = Resources.GetText (Resource.String.taskcancel);

Řetězce množství

Prostředky řetězců androidu také umožňují vytvářet řetězce množství, které umožňují překladatelům poskytovat různé překlady pro různá množství, například:

  • "Zbývá 1 úkol."
  • "Stále je potřeba provést 2 úkoly."

(místo obecného pole "Zbývá n úkolů").

V Strings.xml

<plurals name="numberOfTasks">
   <!--
      As a developer, you should always supply "one" and "other"
      strings. Your translators will know which strings are actually
      needed for their language.
    -->
   <item quantity="one">There is %d task left.</item>
   <item quantity="other">There are %d tasks still to do.</item>
 </plurals>

K vykreslení celého řetězce použijte metodu GetQuantityString předáním ID prostředku a hodnoty, která se má zobrazit (což je předáno dvakrát). Druhý parametr používá Android k určení , kterýquantity řetězec se má použít, třetí parametr je hodnota ve skutečnosti nahrazena řetězcem (obě jsou povinné).

var translated = Resources.GetQuantityString (
                    Resource.Plurals.numberOfTasks, taskcount, taskcount);`

Platné quantity přepínače jsou:

  • žádný
  • jeden
  • dva
  • Několik
  • mnoho
  • other

Podrobněji jsou popsány v dokumentaci k Androidu. Pokud daný jazyk nevyžaduje speciální zpracování, budou tyto quantity řetězce ignorovány (například pouze angličtina používá one a otherzadávání zero řetězce nebude mít žádný vliv, nebude použit).

Obrázky

Lokalizované obrázky se řídí stejnými pravidly jako soubory řetězců: všechny obrázky odkazované v aplikaci by měly být umístěny do nakreslených adresářů, takže je tam náhradní.

Obrázky specifické pro národní prostředí by se pak měly umístit do kvalifikovaných kreslených složek, jako jsou kreslené es nebo drawable-ja (lze také přidat specifikátory dpi).

Na tomto snímku obrazovky jsou čtyři obrázky uloženy v kreslitelném adresáři, ale pouze jeden, flag.png, má lokalizované kopie v jiných adresářích.

Screenshot of multiple drawable folders, each containing one or more localized .png files

Jiné typy prostředků

Můžete také poskytnout další typy alternativních prostředků, prostředků specifických pro jazyk, včetně rozložení, animací a nezpracovaných souborů. To znamená, že můžete zadat konkrétní rozložení obrazovky pro jeden nebo více cílových jazyků, například můžete vytvořit rozložení speciálně pro němčinu, která umožňuje velmi dlouhé textové popisky.

Android 4.2 zavedl podporu jazyků zprava doleva (RTL), pokud jste nastavili nastavení android:supportsRtl="true"aplikace . Kvalifikátor "ldrtl" prostředků lze zahrnout do názvu adresáře, aby obsahovala vlastní rozložení navržená pro zobrazení RTL.

Další informace o pojmenování a náhradním pojmenování adresářů prostředků najdete v dokumentaci k Androidu, kde najdete alternativní zdroje informací.

Název aplikace

Název aplikace se snadno lokalizuje pomocí in @string/id pro MainLauncher aktivitu:

[Activity (Label = "@string/app_name", MainLauncher = true, Icon="@drawable/launcher",
    ConfigurationChanges =  ConfigChanges.Orientation | ConfigChanges.Locale)]

Jazyky zprava doleva (RTL)

Android 4.2 a novější poskytuje úplnou podporu rozložení RTL, která jsou podrobně popsána v blogu podpory nativní verze RTL.

Při použití Androidu 4.2 (úroveň rozhraní API 17) a novějších je možné hodnoty zarovnání zadat startend místo left a right (například android:paddingStart). K dispozici jsou také nová rozhraní API, jako LayoutDirectionje , TextDirectiona TextAlignment pomáhají vytvářet obrazovky, které se přizpůsobí čtečkám RTL.

Následující snímek obrazovky ukazuje lokalizovanou ukázku Tasky v arabštině:

Screenshot of Tasky app in Arabic

Následující snímek obrazovky ukazuje lokalizovanou ukázku Tasky v hebrejštině:

Screenshot of Tasky app in Hebrew

Text RTL se lokalizuje pomocí Strings.xml souborů stejným způsobem jako text LTR.

Testování

Nezapomeňte důkladně otestovat výchozí národní prostředí. Pokud se z nějakého důvodu nedají načíst výchozí prostředky (tj. chybí), aplikace se chybově ukončí.

Testování emulátoru

Pokyny k nastavení emulátoru na konkrétní národní prostředí pomocí prostředí ADB najdete v části Testování Google v emulátoru Androidu .

adb shell setprop persist.sys.locale fr-CA;stop;sleep 5;start

Testování zařízení

Pokud chcete testovat na zařízení, změňte jazyk v aplikaci Nastavení.

Tip

Poznamenejte si ikony a umístění položek nabídky, abyste mohli vrátit jazyk k původnímu nastavení.

Shrnutí

Tento článek popisuje základy lokalizace aplikací pro Android pomocí integrovaného zpracování prostředků. Další informace o i18n a L10n pro iOS, Android a multiplatformní aplikace (včetně Xamarin.Forms) najdete v této příručce pro různé platformy.