Android działa na wielu urządzeniach w wielu regionach. Aby dotrzeć do jak największej liczby użytkowników, zadbaj o to, aplikacja obsługuje tekst, pliki audio, liczby, walutę i grafikę w zależności od regionu, w którym jest używana aplikacja.
Ta strona zawiera sprawdzone metody lokalizacji Androida aplikacji.
Wymagana jest praktyczna wiedza o programowaniu w języku Kotlin lub w Javie i znajdź wczytywanie zasobów Androida, deklarowania elementów interfejsu użytkownika w języku XML, oraz kwestii deweloperskich, takich jak cykl życia działań, oraz ogólne zasady internacjonalizacji i lokalizacji.
Warto używać platformy zasobów Androida do oddzielania zlokalizowane aspekty aplikacji w jak najszerszym zakresie z jej głównej funkcji.
- Umieść większość zawartości interfejsu aplikacji lub jej część zgodnie z opisem na tej stronie i w Omówienie zasobów aplikacji
- Działanie interfejsu zależy natomiast od tego, za pomocą kodu opartego na Kotlin lub Javie. Jeśli na przykład użytkownicy podają dane, które mają sformatowanego lub posortowane w różny sposób w zależności od regionu, możesz użyć narzędzia Kotlin lub w języku Java do programowego obsługi danych. Ta strona nie jak zlokalizować kod w języku Kotlin lub w Javie.
Krótki przewodnik po lokalizacji ciągów tekstowych w aplikacji znajdziesz tutaj Obsługa różnych języków .
Omówienie: przełączanie zasobów na Androidzie
Zasoby to na przykład ciągi tekstowe, układy, dźwięki, grafiki i wszelkie inne elementy statyczne. niezbędne dane aplikacji na Androida. Aplikacja może zawierać wiele elementów zbiorów zasobów, z których każdy jest dostosowany do różnych konfiguracji urządzeń. Gdy użytkownik uruchamia aplikację, Android automatycznie wybiera i wczytuje zasoby które najlepiej pasują do urządzenia.
Ta strona koncentruje się na lokalizacji. Pełny opis przełączania zasobów i wszystkich typów konfiguracji, jakie można takich jak orientacja ekranu lub typ ekranu dotykowego, patrz Dostarczaj alternatywnych zasobów.
Podczas pisania aplikacji tworzysz zasoby domyślne i alternatywne
których aplikacja ma używać. Gdy użytkownicy uruchamiają Twoją aplikację, system Android
wybiera zasoby do załadowania w zależności od języka urządzenia.
Aby tworzyć zasoby, umieść pliki w
specjalnie nazwane podkatalogi katalogu res/
projektu.
Dlaczego zasoby domyślne są ważne
Gdy aplikacja działa w dowolnym języku, który nie został podany
tekstu odpowiedniego dla języka, Android wczytuje domyślne ciągi znaków z
res/values/strings.xml
Jeśli nie ma tego pliku domyślnego lub jest on
brakuje ciągu tekstowego, którego potrzebuje Twoja aplikacja, aplikacja się nie uruchamia
i wyświetla błąd. Poniższy przykład pokazuje, co może się stać, gdy
domyślny plik tekstowy jest niekompletny.
Przykład:
Kod aplikacji w kotlinie lub w języku Java oznacza tylko 2 ciągi: text_a
i text_b
. Aplikacja zawiera zlokalizowany plik zasobów
(res/values-en/strings.xml
), która definiuje text_a
i
text_b
po angielsku. Aplikacja zawiera też domyślny
plik zasobów (res/values/strings.xml
) zawierający
definicja dla text_a
, ale nie dla text_b
.
- Gdy aplikacja zostanie uruchomiona na urządzeniu z ustawionym językiem angielskim,
aplikacja może działać bez problemów,
Pole
res/values-en/strings.xml
zawiera obydwa wymagane fragmenty tekstu ciągi tekstowe. - Jednak po uruchomieniu tej aplikacji na urządzeniu ustawionym na języka innego niż angielski, użytkownik zobaczy komunikat o błędzie i przycisk Wymuś zamknięcie. Przycisk Aplikacja się nie wczytuje.
Aby temu zapobiec, upewnij się, że res/values/strings.xml
i że definiuje każdy potrzebny ciąg znaków. Ta sytuacja dotyczy
wszystkich typów zasobów, nie tylko ciągów tekstowych: musisz utworzyć
pliki zasobów zawierające wszystkie zasoby wywoływane przez aplikację,
takich jak układy, elementy rysowane i animacje. Informacje o testowaniu znajdziesz tutaj:
Przetestuj zasoby domyślne.
Korzystanie z zasobów do lokalizacji
W tej sekcji omawiamy tworzenie zasobów domyślnych oraz alternatywnych. Wyjaśniono również, jak jest przydzielany pierwszeństwo zasobom oraz jak odnosi się do w kodzie.
Tworzenie zasobów domyślnych
Umieść domyślny tekst aplikacji w tym języku: res/values/strings.xml
. W przypadku tych ciągów skorzystaj z funkcji
domyślny – to język, którego oczekujesz
użytkownikom aplikacji.
Domyślny zestaw zasobów zawiera też wszystkie domyślne elementy rysowane i układy Mogą też zawierać inne rodzaje zasobów, np. animacje. Te materiały przejdź do następujących katalogów:
res/drawable/
: wymagany katalog zawierający co najmniej jeden plik graficzny dla ikony aplikacji w Google Play.res/layout/
: wymagany katalog zawierający plik XML plik określający układ domyślnyres/anim/
: wymagane, jeśli masz jakieśres/anim-<qualifiers>
folderures/xml/
: wymagane, jeśli masz jakieśres/xml-<qualifiers>
folderures/raw/
: wymagane, jeśli masz jakieśres/raw-<qualifiers>
folderu
Wskazówka: sprawdź w kodzie każde odniesienie do zasób Android. Upewnij się, że dla każdego z nich zdefiniowany jest zasób domyślny. Upewnij się też, że domyślny plik z ciągiem znaków jest pełny: zlokalizowany może zawierać podzbiór ciągów, ale domyślny ciąg musi zawierać je wszystkie.
Utwórz alternatywne zasoby
Znaczna część lokalizacji aplikacji polega na udostępnieniu tekstu alternatywnego różnych językach. W niektórych przypadkach można również udostępnić inne grafiki, dźwięki, układy i inne zasoby związane z lokalizacją.
Aplikacja może określić wiele elementów res/<qualifiers>/
każdy z innym kwalifikatorem. Aby utworzyć alternatywny zasób dla
innej lokalizacji, użyjesz kwalifikatora określającego język lub
kombinacji języka i regionu. Nazwa katalogu zasobów musi być zgodna z
zgodnie ze schematem nazewnictwa opisanym w
Dostarczaj
alternatywnych zasobów, w przeciwnym razie aplikacja nie będzie się w stanie skompilować.
Przykład:
Załóżmy, że domyślnym językiem Twojej aplikacji jest angielski i że
chcesz przetłumaczyć cały tekst aplikacji na francuski
tekstu oprócz tytułu aplikacji
japońskiego. W tym przypadku tworzysz 3 strings.xml
.
każdy z nich jest przechowywany w katalogu zasobów dla określonego języka:
res/values/strings.xml
,
wszystkie ciągi tekstowe w aplikacji zawierają tekst w języku angielskim; łącznie z tekstem ciągu o nazwietitle
.res/values-fr/strings.xml
,
Zawierać wszystkie ciągi tekstowe w języku francuskim, w tymtitle
.res/values-ja/strings.xml
,
Zawierać tekst w języku japońskim we wszystkich ciągach oprócztitle
.
Jeśli Twój kod oparty na Kotlin lub Javie odnosi się do R.string.title
, oto co
odbywa się w czasie działania:
- Jeśli na urządzeniu jest ustawiony dowolny język inny niż francuski, Android się wczyta.
title
z plikures/values/strings.xml
. - Jeśli na urządzeniu jest ustawiony język francuski, Android wczytuje
title
zres/values-fr/strings.xml
.
Jeśli na urządzeniu jest ustawiony język japoński, Android szuka
title
w pliku res/values-ja/strings.xml
. Ale
ponieważ taki ciąg nie znajduje się w tym pliku, Android korzysta z metody
i wczytuje title
w języku angielskim z programu
res/values/strings.xml
.
Które zasoby mają pierwszeństwo?
Jeśli wiele plików zasobów pasuje do konfiguracji urządzenia, Android stosuje dla wyboru odpowiedniego pliku. Wśród kryteriów, które mogą być określony w nazwie katalogu zasobów, język prawie zawsze przyjmuje pierwszeństwo.
Przykład:
Załóżmy, że aplikacja zawiera domyślny zestaw grafik i dwie inne zestawów grafik, które są zoptymalizowane pod kątem różnych konfiguracji urządzeń:
res/drawable/
,
Zawiera domyślną grafikę.res/drawable-small-land-stylus/
,
Zawiera grafikę zoptymalizowaną do użycia na urządzeniu, które oczekuje danych wejściowych rysik i ekran QVGA o niskiej gęstości w orientacji poziomej.
(res/drawable-ja/
) Zawiera grafikę zoptymalizowaną pod kątem języka japońskiego.
Jeśli aplikacja działa na urządzeniu skonfigurowanym do obsługi języka japońskiego,
Android wczytuje grafikę z urządzenia res/drawable-ja/
, nawet jeśli urządzenie
wymaga wprowadzania danych z rysika i ma QVGA o niskiej gęstości.
ekranu w orientacji poziomej.
Wyjątek: jedyne kwalifikatory, które kwalifikują się do w procesie wyboru mają pierwszeństwo przed kodem kraju (MCK) i siecią komórkową (MNC).
Przykład:
Załóżmy, że masz następującą sytuację:
- Kod aplikacji wywołuje
R.string.text_a
.
- Dostępne są 2 odpowiednie pliki zasobów:
res/values-mcc404/strings.xml
, w tymtext_a
w domyślnym języku aplikacji (w tym przypadku) Angielski.res/values-hi/strings.xml
, w tymtext_a
w języku hindi.
- Aplikacja działa na urządzeniu, które spełnia te wymagania:
Konfiguracja:
- Karta SIM jest połączona z siecią komórkową w Indiach (MCK 404).
- Ustawiony język to hindi (
hi
).
Android wczytuje text_a
z
res/values-mcc404/strings.xml
(w języku angielskim), nawet jeśli urządzenie jest
skonfigurowane dla języka hindi. Dzieje się tak, ponieważ w procesie wyboru zasobów Android
preferuje dopasowanie MCK niż dopasowanie języka.
Proces wyboru nie zawsze jest tak prosty, jak te przykłady sugestie. Bardziej szczegółowy opis tego procesu zawiera artykuł Jak Android znajduje z najlepszym zasobem. Wszystkie kwalifikatory zostały opisane i wymienione w kolejności ich obowiązywania w Omówienie zasobów dotyczących aplikacji.
Zapoznaj się z zasobami w kodzie
W kodzie aplikacji opartym na Kotlin lub Javie odwołujesz się do zasobów za pomocą składni
R.resource_type.resource_name
lub
android.R.resource_type.resource_name
Więcej informacji:
Uzyskaj dostęp do zasobów aplikacji.
Zarządzanie ciągami tekstowymi do lokalizacji
W tej sekcji znajdziesz sprawdzone metody zarządzania ciągami tekstowymi związanymi z lokalizacją.
Przenieś wszystkie ciągi do string.xml
Podczas tworzenia aplikacji nie koduj na stałe żadnych ciągów znaków. Zamiast tego zadeklaruj wszystkie
ciągi tekstowe jako zasoby w domyślnym pliku strings.xml
, co ułatwia aktualizację,
i ich zlokalizowanie. Ciągi znaków w pliku strings.xml
można łatwo wyodrębnić,
przetłumaczone i z powrotem zintegrowane z aplikacją, z odpowiednimi kwalifikatorami, bez żadnych
w skompilowanym kodzie.
Jeśli generujesz obrazy z tekstem, umieść też te ciągi w polu strings.xml
.
ponownie wygenerować obrazy po przetłumaczeniu.
Przestrzegaj wytycznych Androida dotyczących ciągów tekstowych w interfejsie
Projektując i rozwijając interfejsy, zwróć uwagę na to, jak rozmowy z użytkownikiem. Ogólnie używaj zwięzłego stylu, który jest przyjazny, ale zwięzły i używany w spójnym stylu w całym interfejsie.
Przeczytaj zalecenia dotyczące Material Design i zastosuj się do nich pisanie stylu i doboru słów. Dzięki temu aplikacje będą wyglądały na dopracowane, a użytkownicy będą mogli lepiej zrozumieć, szybsze działanie interfejsu.
W miarę możliwości używaj standardowej terminologii Androida – na przykład w elementach interfejsu, takich jak pasek aplikacji, menu opcji, pasek systemowy i powiadomienia. Korzystanie z Androida poprawnie i konsekwentnie ułatwia tłumaczenie i zapewnia lepszy efekt końcowy. użytkowników.
Podaj wystarczający kontekst dla zadeklarowanych ciągów
Deklarując ciągi znaków w pliku strings.xml
, pamiętaj, aby opisać kontekst.
w których ten ciąg jest używany. Te informacje są bezcenne dla tłumacza i powodują
lepszej jakości tłumaczenia. Dzięki temu możesz efektywniej zarządzać tekstami.
Oto przykład:
<!-- The action for submitting a form. This text is on a button that can fit 30 chars --> <string name="login_submit_button">Sign in</string>
Warto dodać takie informacje kontekstowe:
- Do czego służy ten ciąg znaków? Kiedy i gdzie jest on przedstawiany użytkownikowi?
- Gdzie znajduje się to ustawienie? Na przykład tłumaczenia są mniej elastyczne w niż w polach tekstowych.
Oznaczanie fragmentów wiadomości, które nie mają być przetłumaczone
Często ciągi tekstowe zawierają tekst, który nie jest przeznaczony do tłumaczenia na inne języki. Powszechny np. fragment kodu, obiekt zastępczy wartości, specjalny symbol lub nazwa. Gdy przygotuj ciągi tekstowe do tłumaczenia, szukaj i zaznaczaj tekst, który musi pozostać bez zmian, tak aby tłumacz go nie zmienił.
Aby oznaczyć tekst, którego nie należy przetłumaczyć, użyj atrybutu <xliff:g>
tagu zastępczego. Oto przykładowy tag, który wskazuje, że tekst "%1$s"
nie jest
można zmienić podczas tłumaczenia, tak aby nie zepsuć przekazu:
<string name="countdown"> <xliff:g id="time" example="5 days">%1$s</xliff:g> until holiday </string>
Przy zadeklarowaniu tagu zastępczego dodaj atrybut identyfikator, który wyjaśnia, do czego służy Obiekt zastępczy dotyczy. Jeśli Twoja aplikacja później zastąpi wartość zastępczą, podaj atrybut przykładowego atrybutu w celu wyjaśnienia oczekiwanego użycia.
Oto kilka dodatkowych przykładów tagów zastępczych:
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <!-- Example placeholder for a special Unicode symbol --> <string name="star_rating">Check out our 5 <xliff:g id="star">\u2605</xliff:g> </string> <!-- Example placeholder for a URL --> <string name="app_homeurl"> Visit us at <xliff:g id="application_homepage">http://my/app/home.html</xliff:g> </string> <!-- Example placeholder for a name --> <string name="prod_name"> Learn more at <xliff:g id="prod_gamegroup">Game Group</xliff:g> </string> <!-- Example placeholder for a literal --> <string name="promo_message"> Please use the "<xliff:g id="promotion_code">ABCDEFG</xliff:g>" to get a discount. </string> ... </resources>
Lista kontrolna lokalizacji
Pełny opis procesu lokalizacji i dystrybucji aplikacji na Androida patrz Przetłumacz i zlokalizuj aplikację
Wskazówki dotyczące lokalizacji
Podczas lokalizowania aplikacji postępuj zgodnie z tymi wskazówkami.
Projektowanie aplikacji w taki sposób, aby działały w każdym języku
Nie zakładaj niczego na temat urządzenia, na którym użytkownik uruchamia Twoją . Urządzenie może być wyposażone w nieoczekiwany sprzęt. może być ustawiony na niezaplanowany język lub którego nie możesz przetestować. Zaprojektuj aplikację w taki sposób, aby działała normalnie lub bez problemów bez względu na to, na jakim urządzeniu się ona uruchamia.
Ważne: upewnij się, że aplikacja
zawiera pełny zestaw zasobów domyślnych: m.in.
res/drawable/
i res/values/
foldery bez żadnych
dodatkowe modyfikatory w nazwach folderów, które zawierają wszystkie obrazy i tekst
których potrzebuje Twoja aplikacja.
Jeśli w aplikacji brakuje nawet 1 zasobu domyślnego, nie będzie działać
na urządzeniu ustawionym na nieobsługiwany język. Na przykład, jeśli plik
res/values/strings.xml
plik domyślny nie zawiera jednego ciągu,
których potrzebuje aplikacja, gdy działa w nieobsługiwanym języku lub
próbuje wczytać plik res/values/strings.xml
, użytkownik widzi błąd
i przycisk Wymuś zamknięcie.
Więcej informacji znajdziesz w artykule Testowanie domyślnych .
Projektowanie układu elastycznego
Jeśli chcesz zmienić układ układu,
aby dostosować go do konkretnego języka,
można utworzyć alternatywny układ dla tego języka, taki jak
res/layout-de/main.xml
dla układu w języku niemieckim. Jednak wykonanie
może utrudnić zarządzanie aplikacją. Lepiej utworzyć jeden
bardziej elastyczny układ.
Inną typową sytuacją jest konieczność wprowadzenia czegoś innego i układu strony. Możesz na przykład mieć formularz kontaktowy z dwoma jeśli aplikacja działa w języku japońskim, ale trzeba podać trzy pola nazw, gdy aplikacja działa w języku japońskim. a aplikacja działa w innym języku. Możesz to zrobić w dowolnym z tych języków na dwa sposoby:
- Utwórz jeden układ z polem, który możesz automatycznie włączyć lub wyłączyć na podstawie języka.
- Niech układ główny zawiera inny układ, który zawiera wymienne . Drugi układ może mieć różne konfiguracje w zależności od języki.
Unikaj tworzenia większej liczby plików zasobów i ciągów tekstowych, niż potrzebujesz
Prawdopodobnie nie musisz tworzyć osobnej wersji dla każdego
w aplikacji. Na przykład układ zdefiniowany w tagu
W takim przypadku plik res/layout/main.xml
może działać w dowolnym języku
nie musisz tworzyć żadnych plików układu alternatywnego.
Nie musisz też tworzyć alternatywnego tekstu dla każdego ciągu. Dla: Załóżmy na przykład, że:
- Domyślnym językiem aplikacji jest angielski (Stany Zjednoczone). Każdy ciąg, który
używane przez aplikację w amerykańskiej pisowni angielskiej,
res/values/strings.xml
- W przypadku kilku ważnych wyrażeń ustaw brytyjską pisownię angielskiego. Chcesz, aby te alternatywne ciągi były używane, gdy Twoja aplikacja działa na urządzenia w Wielkiej Brytanii.
W tym celu utwórz mały plik o nazwie
res/values-en-rGB/strings.xml
obejmujący tylko ciągi, w których
są różne, jeśli aplikacja działa w Wielkiej Brytanii. W przypadku
aplikacji powróci do wartości domyślnych i użyje
zdefiniowane w: res/values/strings.xml
.
Używanie obiektu Kontekst Androida do ręcznego wyszukiwania ustawień regionalnych
Możesz sprawdzić język, używając obiektu Context
które udostępnia Android, jak widać w tym przykładzie:
Kotlin
val primaryLocale: Locale = context.resources.configuration.locales[0] val locale: String = primaryLocale.displayName
Java
Locale primaryLocale = context.getResources().getConfiguration().getLocales().get(0); String locale = primaryLocale.getDisplayName();
Korzystanie z usługi tłumaczenia aplikacji
Tłumaczenie aplikacji Konsola Play. Pozwala uzyskaj natychmiastową wycenę i złóż zamówienie firmy tłumaczeniowej. Możesz zamówić tłumaczenie na jeden lub kilka języków w przypadku ciągów tekstowych interfejsu aplikacji, tekstu na stronie aplikacji w Sklepie Play, nazw zakupów w aplikacji i tekstu kampanii reklamowej.
Testuj zlokalizowane aplikacje
Przetestuj zlokalizowaną aplikację na urządzeniu lub za pomocą emulatora Androida. W szczególności przetestować aplikację, by upewnić się, że zawiera wszystkie niezbędne zasoby domyślne.
Testowanie na urządzeniu
Pamiętaj, że urządzenie, na którym testujesz, może znacznie się różnić od na urządzeniach dostępnych dla klientów w innych miejscach. Dostępne języki na Twoim urządzeniu mogą się różnić od tych dostępnych na innych urządzeniach. Dodatkowo rozdzielczość i gęstość ekranu urządzenia mogą się różnić, co ma wpływ wyświetlanie ciągów tekstowych i elementów rysowalnych w interfejsie.
Aby zmienić ustawienia regionalne lub język na urządzeniu, użyj aplikacji Ustawienia.
Przeprowadź test za pomocą emulatora
Informacje o korzystaniu z emulatora znajdziesz w artykule Uruchamianie aplikacji przy użyciu emulatora Androida.
Tworzenie i używanie języka niestandardowego
„Niestandardowy” „region” to kombinacja języka i regionu, którą system Android obraz systemu nie obsługuje bezpośrednio. Możesz przetestować działanie aplikacji w niestandardowym języku, tworząc niestandardowe ustawienia w emulatorze. Dostępne są 2 Jak to zrobić:
- Użyj aplikacji Język niestandardowy, która jest dostępna z na karcie aplikacji. Po utworzeniu regionu niestandardowego możesz się na niego przełączyć, dotykając opcji & trzymając i podać nazwę regionu.
- Zmień język na niestandardowy z powłoki
adb
zgodnie z opisem w następnej sekcji.
Jeśli ustawisz emulator na język, który nie jest dostępny na Androidzie system wyświetla się w języku domyślnym. Twoje jednak działa poprawnie.
Zmień język emulatora z powłoki adb
Aby zmienić ustawienia regionalne w emulatorze za pomocą powłoki adb
, wykonaj te czynności:
- Wybierz język, który chcesz przetestować, i określ tag języka BCP-47.
np.
fr-CA
w przypadku języka francuskiego kanadyjskiego.
- Uruchom emulator.
- Z poziomu wiersza poleceń na hoście uruchom następujące polecenie
polecenie:
adb shell
lub, jeśli masz podłączone urządzenie, określ, czy emulator ma być włączony, dodając opcja-e
:
adb -e shell
- W wierszu powłoki
adb
(#
) uruchom to polecenie:
setprop persist.sys.locale [BCP-47 language tag];stop;sleep 5;start
Zastąp sekcje w nawiasach odpowiednimi kodami z kroku 1.
Na przykład do przetestowania w języku kanadyjskim francuskim:
setprop persist.sys.locale fr-CA;stop;sleep 5;start
Spowoduje to ponowne uruchomienie emulatora. Gdy znowu zobaczysz ekran główny, uruchom ponownie aplikację. a aplikacja zostanie udostępniona w nowym języku.
Testowanie zasobów domyślnych
Aby sprawdzić, czy aplikacja zawiera wszystkie potrzebne zasoby w postaci ciągu znaków, wykonaj te czynności:
- Ustaw emulator lub urządzenie na język, którego aplikacja nie obsługuje
. Jeśli na przykład aplikacja zawiera francuskie ciągi tekstowe w
res/values-fr/
, ale nie zawiera żadnych ciągów znaków w języku hiszpańskimres/values-es/
, a następnie ustaw język emulatora na hiszpański. Możesz użyć aplikacji Niestandardowe języki, aby ustawić emulator na nieobsługiwany język. - Uruchom aplikację.
- Jeśli w aplikacji wyświetli się komunikat o błędzie i przycisk Wymuś zamknięcie, być może
w poszukiwaniu ciągów, które nie są dostępne. Upewnij się, że atrybuty
res/values/strings.xml
plik zawiera definicję każdy ciąg znaków używany przez aplikację.
Jeśli test się powiedzie, powtórz go dla innych typów konfiguracji. Dla:
Jeśli na przykład aplikacja ma plik układu o nazwie
res/layout-land/main.xml
, ale nie zawiera pliku o nazwie
res/layout-port/main.xml
, a następnie ustaw emulator lub urządzenie na
do orientacji pionowej i sprawdzić, czy aplikacja się uruchamia.