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_US
dla 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.
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>
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.
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 end
right
(na przykład android:paddingStart
).left
Istnieją również nowe interfejsy API, takie jak LayoutDirection
, TextDirection
i 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:
Następny zrzut ekranu przedstawia zlokalizowany przykład Tasky w języku hebrajskim:
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.