Lokalizowanie aplikacji

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ślny
  • res/anim/: wymagane, jeśli masz jakieś res/anim-<qualifiers> folderu
  • res/xml/: wymagane, jeśli masz jakieś res/xml-<qualifiers> folderu
  • res/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:

  1. res/values/strings.xml,
    wszystkie ciągi tekstowe w aplikacji zawierają tekst w języku angielskim; łącznie z tekstem ciągu o nazwie title.
  2. res/values-fr/strings.xml,
    Zawierać wszystkie ciągi tekstowe w języku francuskim, w tym title.
  3. res/values-ja/strings.xml,
    Zawierać tekst w języku japońskim we wszystkich ciągach oprócz title.

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 pliku res/values/strings.xml.
  • Jeśli na urządzeniu jest ustawiony język francuski, Android wczytuje title z res/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 tym text_a w domyślnym języku aplikacji (w tym przypadku) Angielski.
    • res/values-hi/strings.xml, w tym text_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:

  1. Wybierz język, który chcesz przetestować, i określ tag języka BCP-47. np. fr-CA w przypadku języka francuskiego kanadyjskiego.
  2. Uruchom emulator.
  3. 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
  4. 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:

  1. 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ńskim res/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.
  2. Uruchom aplikację.
  3. 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.