Lokalizacja systemu Android

W tym dokumencie przedstawiono funkcje lokalizacji zestawu Android SDK oraz sposób uzyskiwania do nich dostępu za pomocą platformy Xamarin.

Funkcje platformy systemu Android

W tej sekcji opisano główne funkcje lokalizacji systemu Android. Przejdź do następnej sekcji , aby zobaczyć konkretny kod i przykłady.

Ustawienia regionalne

Użytkownicy wybierają swój język w Ustawienia > Język i dane wejściowe. Ten wybór steruje zarówno wyświetlanymi językami, jak i ustawieniami regionalnymi (np. w przypadku formatowania daty i liczby).

Bieżące ustawienia regionalne można wykonywać za pośrednictwem bieżącego kontekstu Resources:

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

Ta wartość będzie identyfikatorem ustawień regionalnych, który zawiera zarówno kod języka, jak i kod ustawień regionalnych oddzielony znakiem podkreślenia. Poniżej przedstawiono listę ustawień regionalnych Java i ustawień regionalnych obsługiwanych przez system Android za pośrednictwem usługi StackOverflow.

Do powszechnych przykładów należą:

  • en_USdla języka angielskiego (Stany Zjednoczone)
  • es_ES dla hiszpańskich (Hiszpania)
  • ja_JP dla japońskich (Japonia)
  • zh_CN dla chin (Chiny)
  • zh_TW dla chin (Tajwan)
  • pt_PT dla portugalskich (Portugalia)
  • pt_BR dla portugalskich (Brazylia)

LOCALE_CHANGED

System Android generuje android.intent.action.LOCALE_CHANGED , gdy użytkownik zmieni wybór języka.

Działania mogą zdecydować się na obsługę tego, ustawiając android:configChanges atrybut dla działania, w następujący sposób:

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

Podstawy internacjonalizacji w systemie Android

Strategia lokalizacji systemu Android ma następujące kluczowe części:

  • Foldery zasobów zawierające zlokalizowane ciągi, obrazy i inne zasoby.

  • GetText metoda, która służy do pobierania zlokalizowanych ciągów w kodzie

  • @string/id w plikach AXML, aby automatycznie umieszczać zlokalizowane ciągi w układach.

Foldery zasobów

Aplikacje systemu Android zarządzają większością zawartości w folderach zasobów, takich jak:

  • layout — zawiera pliki układu AXML.
  • drawable — zawiera obrazy i inne zasoby do rysowania.
  • values — zawiera ciągi.
  • raw — zawiera pliki danych.

Większość deweloperów jest już zaznajomiona z używaniem sufiksów dpi w katalogu z możliwością rysowania, aby udostępnić wiele wersji obrazu, pozwalając systemowi Android wybrać poprawną wersję dla każdego urządzenia. Ten sam mechanizm służy do zapewniania wielu tłumaczeń języków przez sufiksowanie katalogów zasobów z identyfikatorami języka i kultury.

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

Uwaga

Podczas określania języka najwyższego poziomu, takiego jak es tylko dwa znaki, są wymagane, jednak podczas określania pełnych ustawień regionalnych format nazwy katalogu wymaga kreski i małych liter r , aby oddzielić obie części, na przykład pt-rBR lub zh-rCN. Porównaj tę wartość z wartością zwróconą w kodzie, która ma podkreślenie (np. pt_BR). Oba te elementy różnią się od wartości używanej przez klasę .NET CultureInfo , która ma tylko kreskę (np. pt-BR). Należy pamiętać o tych różnicach podczas pracy na platformach Xamarin.

format pliku Strings.xml

Zlokalizowany katalog wartości (np. wartości-es lub values-pt-rBR) powinien zawierać plik o nazwie Strings.xml, który będzie zawierać przetłumaczony tekst dla tych ustawień regionalnych.

Każdy ciąg do tłumaczenia jest elementem XML z identyfikatorem zasobu określonym jako name atrybut i przetłumaczonym ciągiem jako wartością:

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

Należy stosować ucieczkę zgodnie z normalnymi regułami XML i name musi być prawidłowym identyfikatorem zasobu systemu Android (bez spacji ani kresek). Oto przykład pliku ciągów domyślnych (angielski):

wartości/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>

Wartości katalogu hiszpańskiego zawierają plik o tej samej nazwie (Strings.xml), który zawiera tłumaczenia:

wartości/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

Po skonfigurowaniu plików ciągów przetłumaczone wartości można odwoływać się zarówno w układach, jak i w kodzie.

Pliki układu AXML

Aby odwołać się do zlokalizowanych ciągów w plikach układu, użyj @string/id składni. Ten fragment kodu XML z przykładu pokazuje text właściwości ustawiane przy użyciu zlokalizowanych identyfikatorów zasobów (niektóre inne atrybuty zostały pominięte):

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

GetText, metoda

Aby pobrać przetłumaczone ciągi w kodzie, użyj GetText metody i przekaż identyfikator zasobu:

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

Ciągi ilości

Zasoby ciągów systemu Android umożliwiają również tworzenie ciągów ilościowych, które umożliwiają tłumaczom udostępnianie różnych tłumaczeń dla różnych ilości, takich jak:

  • "Pozostało 1 zadanie".
  • "Nadal należy wykonać 2 zadania".

(zamiast ogólnego "Istnieją n zadań po lewej stronie").

W 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>

Aby renderować pełny ciąg, użyj GetQuantityString metody , przekazując identyfikator zasobu i wartość do wyświetlenia (która jest przekazywana dwa razy). Drugi parametr jest używany przez system Android do określenia , któryquantity ciąg ma być używany, trzeci parametr jest wartością faktycznie zastąpioną ciągiem (oba są wymagane).

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

Prawidłowe quantity przełączniki to:

  • zero
  • jeden
  • dwa
  • Kilka
  • wiele
  • other

Opisano je bardziej szczegółowo w dokumentacji systemu Android. Jeśli dany język nie wymaga obsługi "specjalnej", te quantity ciągi zostaną zignorowane (na przykład język angielski używa one tylko wartości i other; określenie zero ciągu nie będzie miało żadnego efektu, nie będzie używane).

Obrazy

Zlokalizowane obrazy są zgodne z tymi samymi regułami co pliki ciągów: wszystkie obrazy, do których odwołuje się aplikacja, powinny być umieszczane w katalogach z możliwością rysowania, więc istnieje rezerwowy.

Obrazy specyficzne dla ustawień regionalnych należy następnie umieścić w kwalifikowanych folderach z możliwością rysowania, takich jak drawable-es lub drawable-ja (można również dodać specyfikatory dpi).

Na tym zrzucie ekranu cztery obrazy są zapisywane w katalogu z możliwością rysowania, ale tylko jeden, flag.png, ma zlokalizowane kopie w innych katalogach.

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

Inne typy zasobów

Można również udostępniać inne typy alternatywnych zasobów specyficznych dla języka, w tym układy, animacje i nieprzetworzone pliki. Oznacza to, że można podać konkretny układ ekranu dla co najmniej jednego z języków docelowych, na przykład można utworzyć układ specjalnie dla języka niemieckiego, który umożliwia bardzo długie etykiety tekstowe.

System Android 4.2 wprowadził obsługę języków od prawej do lewej (RTL), jeśli ustawisz ustawienie android:supportsRtl="true"aplikacji . Kwalifikator "ldrtl" zasobów może być uwzględniony w nazwie katalogu, aby zawierał układy niestandardowe przeznaczone do wyświetlania biblioteki RTL.

Aby uzyskać więcej informacji na temat nazewnictwa i rezerwowania katalogów zasobów, zapoznaj się z dokumentacją systemu Android, aby zapewnić zasoby alternatywne.

Nazwa aplikacji

Nazwa aplikacji jest łatwa do zlokalizowania przy użyciu elementu @string/id in dla MainLauncher działania:

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

Języki od prawej do lewej (RTL)

System Android 4.2 i nowsze zapewniają pełną obsługę układów RTL opisanych szczegółowo w blogu Natywna obsługa biblioteki RTL.

W przypadku korzystania z systemu Android 4.2 (poziom 17 interfejsu API) i nowszych wartości wyrównania można określić za pomocą start elementów i zamiast i endright (na przykład android:paddingStart).left Istnieją również nowe interfejsy API, takie jak LayoutDirection, TextDirectioni TextAlignment , które ułatwiają tworzenie ekranów dostosowanych do czytników bibliotekI RTL.

Poniższy zrzut ekranu przedstawia zlokalizowany przykład Tasky w języku arabskim:

Screenshot of Tasky app in Arabic

Następny zrzut ekranu przedstawia zlokalizowany przykład Tasky w języku hebrajskim:

Screenshot of Tasky app in Hebrew

Tekst RTL jest zlokalizowany przy użyciu plików Strings.xml w taki sam sposób jak tekst LTR.

Testowanie

Upewnij się, że dokładnie przetestuj ustawienia regionalne domyślne. Aplikacja ulegnie awarii, jeśli nie można załadować domyślnych zasobów z jakiegoś powodu (tj. brakuje ich).

Testowanie emulatora

Zapoznaj się z sekcją Testowanie google w emulatorze systemu Android, aby uzyskać instrukcje dotyczące ustawiania emulatora na określone ustawienia regionalne przy użyciu powłoki ADB.

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

Testowanie urządzeń

Aby przetestować urządzenie, zmień język w aplikacji Ustawienia.

Napiwek

Zanotuj ikony i lokalizację elementów menu, aby przywrócić język do oryginalnego ustawienia.

Podsumowanie

W tym artykule opisano podstawy lokalizowania aplikacji systemu Android przy użyciu wbudowanej obsługi zasobów. Więcej informacji na temat aplikacji i18n i L10n dla systemów iOS, Android i międzyplatformowych (w tym aplikacji Xamarin.Forms) można dowiedzieć się w tym przewodniku dla wielu platform.