Android Localization (Android-Lokalisierung)

In diesem Dokument werden die Lokalisierungsfeatures des Android SDK und der Zugriff auf diese mit Xamarin erläutert.

Android-Plattformfeatures

In diesem Abschnitt werden die Standard Lokalisierungsfeatures von Android beschrieben. Fahren Sie mit dem nächsten Abschnitt fort, um spezifischen Code und Beispiele anzuzeigen.

Gebietsschema

Benutzer wählen ihre Sprache in Einstellungen > Sprache und Eingabe aus. Diese Auswahl steuert sowohl die verwendete Sprache als auch die verwendeten regionalen Einstellungen (z. B. für Die Datums- und Zahlenformatierung).

Das aktuelle Gebietsschema kann über die aktuellen Kontexte Resourcesabgefragt werden:

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

Dieser Wert ist ein Gebietsschemabezeichner, der sowohl einen Sprachcode als auch einen Gebietsschemacode enthält, getrennt durch einen Unterstrich. Hier ist eine Liste der Java-Gebietsschemas und android-unterstützten Gebietsschemas über StackOverflow.

Häufige Beispiele sind:

  • en_USfür Englisch (USA)
  • es_ES für Spanisch (Spanien)
  • ja_JP für Japanisch (Japan)
  • zh_CN für Chinesisch (China)
  • zh_TW für Chinesisch (Taiwan)
  • pt_PT für Portugiesisch (Portugal)
  • pt_BR für Portugiesisch (Brasilien)

LOCALE_CHANGED

Android generiert android.intent.action.LOCALE_CHANGED , wenn der Benutzer seine Sprachauswahl ändert.

Aktivitäten können dies durch Festlegen des android:configChanges Attributs für die Aktivität wie folgt behandeln:

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

Internationalisierungsgrundlagen in Android

Die Lokalisierungsstrategie von Android umfasst die folgenden wichtigen Teile:

  • Ressourcenordner, die lokalisierte Zeichenfolgen, Bilder und andere Ressourcen enthalten sollen.

  • GetText -Methode, die zum Abrufen lokalisierter Zeichenfolgen im Code verwendet wird

  • @string/id in AXML-Dateien, um lokalisierte Zeichenfolgen automatisch in Layouts zu platzieren.

Ressourcenordner

Android-Anwendungen verwalten die meisten Inhalte in Ressourcenordnern, z. B.:

  • layout - enthält AXML-Layoutdateien.
  • drawable - enthält Bilder und andere zeichnungsfähige Ressourcen.
  • - enthält Zeichenfolgen.
  • raw - enthält Datendateien.

Die meisten Entwickler sind bereits mit der Verwendung von DPI-Suffixen im zeichnungsfähigen Verzeichnis vertraut, um mehrere Versionen eines Bilds bereitzustellen, sodass Android die richtige Version für jedes Gerät auswählen kann. Derselbe Mechanismus wird verwendet, um mehrere Sprachübersetzungen durch Suffixing von Ressourcenverzeichnissen mit Sprach- und Kulturbezeichnern bereitzustellen.

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

Hinweis

Wenn Sie eine Sprache auf oberster Ebene wie es nur zwei Zeichen angeben, sind jedoch beim Angeben eines vollständigen Gebietsschemas ein Gedankenstrich- und Kleinbuchstabe erforderlich, um die beiden Teile zu trennen, z. B. pt-rBR oder zh-rCN. Vergleichen Sie dies mit dem wert, der im Code zurückgegeben wird, der einen Unterstrich aufweist (z. B. pt_BR). Beide unterscheiden sich von der .NET-Klasse CultureInfo , die nur einen Gedankenstrich aufweist (z. B. pt-BR). Beachten Sie diese Unterschiede beim Arbeiten auf Xamarin-Plattformen.

Strings.xml-Dateiformat

Ein lokalisiertes Werteverzeichnis (z. B. values-es oder values-pt-rBR) sollte eine Datei namens Strings.xml enthalten, die den übersetzten Text für dieses Gebietsschema enthält.

Jede übersetzbare Zeichenfolge ist ein XML-Element mit der als Attribut angegebenen name Ressourcen-ID und der übersetzten Zeichenfolge als Wert:

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

Sie müssen gemäß normalen XML-Regeln escapen, und dies name muss eine gültige Android-Ressourcen-ID (keine Leerzeichen oder Gedankenstriche) sein. Hier ist ein Beispiel für die Standardzeichenfolgendatei (Englisch) für das Beispiel:

values/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>

Das spanische Verzeichnis "values-es " enthält eine Datei mit demselben Namen (Strings.xml), die die Übersetzungen enthält:

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

Bei der Einrichtung der Zeichenfolgendateien können auf die übersetzten Werte sowohl in Layouts als auch in Code verwiesen werden.

AXML-Layoutdateien

Verwenden Sie die @string/id Syntax, um lokalisierte Zeichenfolgen in Layoutdateien zu referenzieren. Dieser XML-Codeausschnitt aus dem Beispiel zeigt text Eigenschaften, die mit lokalisierten Ressourcen-IDs festgelegt werden (einige andere Attribute wurden weggelassen):

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

GetText-Methode

Verwenden Sie die Methode, und übergeben Sie die GetText Ressourcen-ID, um übersetzte Zeichenfolgen im Code abzurufen:

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

Mengenzeichenfolgen

Mit Android-Zeichenfolgenressourcen können Sie auch Mengenzeichenfolgen erstellen, mit denen Übersetzer unterschiedliche Übersetzungen für unterschiedliche Mengen bereitstellen können, z. B.:

  • "Es ist 1 Vorgang übrig."
  • "Es gibt noch 2 Aufgaben."

(anstelle eines generischen "Es gibt n Vorgänge links").

In " 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>

Um die vollständige Zeichenfolge zu rendern, verwenden Sie die GetQuantityString Methode, und übergeben Sie die Ressourcen-ID und den anzuzeigenden Wert (der zweimal übergeben wird). Der zweite Parameter wird von Android verwendet, um zu bestimmen , welchequantity Zeichenfolge verwendet werden soll, der dritte Parameter ist der Wert, der tatsächlich in die Zeichenfolge ersetzt wird (beide sind erforderlich).

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

Gültige quantity Schalter sind:

  • null
  • Einen
  • Zwei
  • few
  • vielen
  • Andere

Sie werden in den Android-Dokumenten ausführlicher beschrieben. Wenn eine bestimmte Sprache keine "spezielle" Behandlung erfordert, werden diese quantity Zeichenfolgen ignoriert (z. B. wird englisch nur verwendet one und other; das Angeben einer zero Zeichenfolge hat keine Auswirkung, sie wird nicht verwendet).

Bilder

Lokalisierte Bilder folgen den gleichen Regeln wie Zeichenfolgendateien: Alle Bilder, auf die in der Anwendung verwiesen wird, sollten in gezeichneten Verzeichnissen platziert werden, sodass ein Fallback vorhanden ist.

Gebietsschemaspezifische Bilder sollten dann in qualifizierten zeichnungsfähigen Ordnern wie drawable-es oder drawable-ja platziert werden (DPI-Bezeichner können ebenfalls hinzugefügt werden).

In diesem Screenshot werden vier Bilder im zeichnungsfähigen Verzeichnis gespeichert, aber nur eine, flag.png, hat lokalisierte Kopien in anderen Verzeichnissen.

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

Andere Ressourcentypen

Sie können auch andere Arten von alternativen, sprachspezifischen Ressourcen bereitstellen, einschließlich Layouts, Animationen und Rohdateien. Dies bedeutet, dass Sie ein bestimmtes Bildschirmlayout für eine oder mehrere Ihrer Zielsprachen bereitstellen können, z. B. können Sie ein Layout speziell für Deutsch erstellen, das sehr lange Textbeschriftungen ermöglicht.

Android 4.2 hat Unterstützung für Sprachen von rechts nach links (RTL) eingeführt, wenn Sie die Anwendungseinstellung android:supportsRtl="true" festlegen. Der Ressourcenqualifizierer "ldrtl" kann in einen Verzeichnisnamen aufgenommen werden, um benutzerdefinierte Layouts zu enthalten, die für die RTL-Anzeige konzipiert sind.

Weitere Informationen zum Benennen und Ausweichen von Ressourcenverzeichnissen finden Sie in den Android-Dokumenten für die Bereitstellung alternativer Ressourcen.

App-Name

Der Anwendungsname ist einfach zu lokalisieren, indem ein @string/id In für die MainLauncher Aktivität verwendet wird:

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

Sprachen von rechts nach links (RTL)

Android 4.2 und neuer bietet vollständige Unterstützung für RTL-Layouts, die im Native RTL Support-Blog ausführlich beschrieben werden.

Bei Verwendung von Android 4.2 (API-Ebene 17) und neuer können Ausrichtungswerte mit start und end anstelle und rightleft (z. Bandroid:paddingStart. ) angegeben werden. Es gibt auch neue APIs wie LayoutDirection, TextDirectionund TextAlignment um Bildschirme zu erstellen, die sich für RTL-Leser anpassen.

Der folgende Screenshot zeigt das lokalisierte Tasky-Beispiel in Arabisch:

Screenshot of Tasky app in Arabic

Der nächste Screenshot zeigt das lokalisierte Tasky-Beispiel in Hebräisch:

Screenshot of Tasky app in Hebrew

RTL-Text wird mit Strings.xml-Dateien auf die gleiche Weise wie LTR-Text lokalisiert.

Testen

Testen Sie unbedingt das Standardgebietsschema. Ihre Anwendung stürzt ab, wenn die Standardressourcen aus irgendeinem Grund nicht geladen werden können (d. h. sie fehlen).

Emulatortests

Anweisungen zum Festlegen eines Emulators auf ein bestimmtes Gebietsschema mithilfe der ADB-Shell finden Sie im Abschnitt "Google-Tests auf einem Android-Emulator ".

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

Gerätetests

Um auf einem Gerät zu testen, ändern Sie die Sprache in der Einstellungen-App.

Tipp

Notieren Sie sich die Symbole und die Position der Menüelemente, damit Sie die Sprache in die ursprüngliche Einstellung rückgängig machen können.

Zusammenfassung

In diesem Artikel werden die Grundlagen der Lokalisierung von Android-Anwendungen mithilfe der integrierten Ressourcenbehandlung behandelt. In diesem plattformübergreifenden Leitfaden erfahren Sie mehr über i18n- und L10n-Apps für iOS, Android und plattformübergreifende Apps (einschließlich Xamarin.Forms).