Wspieraj różne języki i kultury

Aplikacje zawierają zasoby dopasowane do konkretnej kultury. Na przykład aplikacja może zawierać ciągi tekstowe związane z kulturą, które są przetłumaczone na język bieżącego regionu.

Dobrze jest prowadzić zasobów związanych z kulturą i pozostałych elementów aplikacji. Android rozwiązuje zasobów dotyczących języków i kultury na podstawie ustawień regionalnych systemu. Ty może zapewnić wsparcie dla różnych języków za pomocą katalogu zasobów do swojego projektu na Androida.

Możesz określić zasoby dostosowane do kultury osób korzystających z . Możesz podać dowolny typ zasobów, który jest dostosowane do języka i kultury użytkowników. Na przykład parametr Na tych zrzutach ekranu widać aplikację, w której widać ciąg znaków i zasoby, które można rysować domyślny język urządzenia en_US i hiszpański Język: es_ES.

Aplikacja wyświetla
różne teksty i ikony w zależności od języka.

Rysunek 1. Aplikacja używa różnych zasobów w zależności od dla bieżącego języka.

Gdy tworzysz projekt za pomocą pakietu Android SDK Narzędzia generują katalog res/ na najwyższym poziomie nad projektem. W tym katalogu res/ znajdują się podkatalogi różnych zasobów. . Jest też kilka plików domyślnych, takich jak res/values/strings.xml który zawiera wartości ciągu znaków.

Obsługa różnych języków nie ogranicza się już do korzystania z zasobów dostosowanych do różnych lokalizacji. Niektórzy użytkownicy wybierają język z zapisem od prawej do lewej, na przykład w języku arabskim lub hebrajskim. Innych użytkowników, którzy ustawili język interfejsu na język skrypty LTR, np. angielski, mogą wyświetlać lub generować treści. w języku ze skryptem RTL. Aby zapewnić obsługę obu typów użytkowników, aplikacja musi:

  • W przypadku języków RTL zastosuj układ RTL.
  • Wykrywanie i zadeklarowanie kierunku danych tekstowych, które są wyświetlane w środku sformatowanych wiadomości. Zwykle można wywołaj metodę, tak jak to opisano w w tym przewodniku, który określa kierunek danych tekstowych.

Tworzenie katalogów lokalnych i plików zasobów

Aby dodać obsługę większej liczby języków, utwórz w środku dodatkowe katalogi res/ Nazwa każdego katalogu musi być zgodna z tym formatem:

<resource type>-b+<language code>[+<country code>]

Na przykład values-b+es/ zawiera ciąg znaków zasoby dla lokalizacji z kodem języka es. Podobnie mipmap-b+es+ES/ zawiera ikony języków z atrybutem es kodu języka oraz kodu kraju ES.

Android wczytuje odpowiednie zasoby zgodnie z ustawieniami regionalnymi urządzenia w czasie działania. Więcej informacji: Udostępnij materiały alternatywne.

Po wybraniu obsługiwanych regionów utwórz podkatalogi zasobów i . Na przykład:

MyProject/
    res/
       values/
           strings.xml
       values-b+es/
           strings.xml
       mipmap/
           country_flag.png
       mipmap-b+es+ES/
           country_flag.png

Wypełnij pliki zasobów zlokalizowanymi zasobami. Oto przykłady zlokalizowanych plików zasobów w postaci ciągów znaków i obrazów:

Ciągi w języku angielskim (domyślny język) w /values/strings.xml:

<resources>
    <string name="hello_world">Hello World!</string>
</resources>

Hiszpańskie ciągi tekstowe (es język) w /values-b+es/strings.xml:

<resources>
    <string name="hello_world">¡Hola Mundo!</string>
</resources>

Ikona flagi Stanów Zjednoczonych (domyślny język) w: /mipmap/country_flag.png:

Ikona flagi
Stany Zjednoczone

Rysunek 2. Ikona domyślnego języka (en_US).

Ikona flagi Hiszpanii (es_ES język) w: /mipmap-b+es+ES/country_flag.png:

Ikona flagi
Hiszpania

Rysunek 3. Ikona używana dla języka es_ES.

Uwaga: możesz używać kwalifikatorów konfiguracji, takich jak kwalifikator języka, w przypadku zasobów dowolnego typu. Możesz na przykład udostępnij zlokalizowane wersje obiektów rysowania map bitowych. Więcej informacji znajdziesz w artykule Lokalizacja aplikacji.

Korzystanie z zasobów w aplikacji

Odwoływanie się do zasobów w kodzie źródłowym i innych plikach XML za pomocą atrybutu atrybut name każdego zasobu: R.<resource type>.<resource name> Dostępne są różne typy treści. metod, które akceptują zasoby w ten sposób, co pokazano w następujących przykładach:

Kotlin

// Get a string resource
val hello = resources.getString(R.string.hello_world)

// Or supply a string resource to a method that requires a string
TextView(this).apply {
    setText(R.string.hello_world)
}

Java

// Get a string resource
String hello = getResources().getString(R.string.hello_world);

// Or supply a string resource to a method that requires a string
TextView textView = new TextView(this);
textView.setText(R.string.hello_world);

W plikach XML możesz odwoływać się do zasobu za pomocą @<resource type>/<resource name>, jeśli kod XML atrybut przyjmuje zgodną wartość, jak w tym przykładzie:

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@mipmap/country_flag" />

Uwaga: aby ustawienia języka użytkownika były priorytetowe, określ języki, które obsługuje Twoja aplikacja, używając właściwości resConfigs. Dla: więcej informacji znajdziesz w Określ języki obsługiwane przez aplikację.

Formatowanie tekstu w wiadomościach

Jednym z najczęstszych zadań w aplikacji jest formatowanie tekstu. Zlokalizowane wiadomości są formatowane przez wstawienie w odpowiednich miejscach danych tekstowych i liczbowych. Niestety w przypadku interfejsu RTL lub danych RTL proste formatowanie może wyświetlać nieprawidłowe lub nawet nieczytelne dane wyjściowe.

W przypadku języków takich jak arabski, hebrajski, perski i urdu używany jest zapis RTL. Jednak niektóre elementy, takie jak liczby czy osadzone Tekst LTR jest zapisany w tekście od prawej do lewej. Języki używające skryptów LTR, w tym angielski, również są dwukierunkowe, bo mogą zawierać osadzone skrypty RTL, które muszą wyświetlać się w formacie RTL.

Aplikacje często generują wystąpienia tego typu osadzonego tekstu odwrotnego, np. przez wstawienie danych tekstowych dowolnego i dowolnego kierunku tekstu w zlokalizowane wiadomości. Takie połączenie wskazówek często nie ułatwia wyraźnego określenia, gdzie należy tekst w przeciwnym kierunku zaczyna się i kończy, więc generowane przez aplikację tekstu może negatywnie wpłynąć na wrażenia użytkowników.

Chociaż domyślna obsługa dwukierunkowego tekstu przez system zazwyczaj renderuje tekstu zgodnie z oczekiwaniami, tekst może nie renderować się prawidłowo, gdy aplikacja wstawia go do zlokalizowanej wiadomości. Oto przykłady sytuacji: w których mogą się wyświetlać nieprawidłowo:

  • Tekst wstawiony na początku wiadomości:

    PERSON_NAME dzwoni do Ciebie

  • Tekst zaczynający się od cyfry, np. adres lub numer telefonu:

    987 654 3210

  • Tekst zaczynający się znakiem interpunkcyjnym, np. numer telefonu:

    +19876543210

  • Tekst kończący się znakami interpunkcyjnymi:

    Czy na pewno chcesz to zrobić?

  • Tekst, który zawiera już oba kierunki:

    Słowo część Ameryka Północna oznacza banan w języku hebrajskim.

Przykład

Załóżmy, że jakaś aplikacja musi czasami wyświetlić komunikat „Czy czy chodzi Ci o %s?" z adresem wstawionym w miejscu działania %s. Aplikacja obsługuje różne języki interfejsu, więc komunikat pochodzi z konkretnego języka zasobu i korzysta z kierunku RTL, gdy na urządzeniu jest ustawiony język RTL. Na przykład w przypadku języka hebrajskiego będzie wyglądać tak:

Tętniąca życiem informacja o pochodzeniu drogowym w pomieszczeniu %s

Proponowany adres może jednak pochodzić z bazy danych, która nie zawiera tekstu w języku lokalnym. Jeśli na przykład adres jest miejscem w Kalifornii, pojawia się w bazie danych jako tekst w języku angielskim. Jeśli umieścisz parametr adres „15 Bay Street, Laurel, CA” do wiadomości RTL bez podawania żadnych wskazówki dotyczące kierunku tekstu, wynik jest nieoczekiwany lub nieprawidłowy:

Dowiedz się więcej o pochodzeniu audycji z powodu umiejscowienia w USA 15 Bay Street, Laurel, Kalifornia?

Numer domu jest widoczny po prawej stronie adresu, a nie nie narusza zasad. Przez to numer domu wygląda bardziej jak dziwny urząd pocztowy w kodzie. Ten sam problem może wystąpić, jeśli w wiadomości umieścisz tekst od prawej do lewej, korzysta z kierunku tekstu LTR.

Wyjaśnienie i rozwiązanie

Problem w tym przykładzie występuje, ponieważ narzędzie do formatowania tekstu nie określ, że „15” jest częścią adresu, więc system nie może stwierdzić, czy "15" jest częścią tekstu od prawej do lewej przed nim lub tekstu LTR, który pojawia się co potem.

Aby rozwiązać ten problem, użyj metody unicodeWrap() z biblioteki BidiFormatter zajęcia. Ta metoda wykrywa kierunek ciągu znaków i zawija go w standardzie Unicode. formatujące znaki, które deklarują ten kierunek.

Fragment kodu poniżej pokazuje, jak używać unicodeWrap():

Kotlin

val mySuggestion = "15 Bay Street, Laurel, CA"
val myBidiFormatter: BidiFormatter = BidiFormatter.getInstance()

// The "did_you_mean" localized string resource includes
// a "%s" placeholder for the suggestion.
String.format(getString(R.string.did_you_mean), myBidiFormatter.unicodeWrap(mySuggestion))

Java

String mySuggestion = "15 Bay Street, Laurel, CA";
BidiFormatter myBidiFormatter = BidiFormatter.getInstance();

// The "did_you_mean" localized string resource includes
// a "%s" placeholder for the suggestion.
String.format(getString(R.string.did_you_mean),
        myBidiFormatter.unicodeWrap(mySuggestion));

Bo 15 jest teraz wyświetlana w tekście, który jest zadeklarowany jako LTR, wyświetla się w prawidłowym miejscu:

Dowiedz się więcej o tym, jak radzą sobie z Twoją wiadomością w USA 15 Bay Street, Laurel, Kalifornia.

Użyj metody unicodeWrap() na każdy fragment tekstu wstawiony do zlokalizowanej wiadomości, chyba że spełniony jest jeden z tych warunków:

  • Tekst jest wstawiany do zrozumiałego dla komputera ciągu znaków, np. identyfikatora URI lub zapytanie SQL.
  • Wiesz już, że fragment tekstu jest już prawidłowo zawinięty.

Uwaga: jeśli aplikacja jest kierowana na Androida 4.3 (poziom interfejsu API 18) lub użyj wersji BidiFormatter znalezionej w Android Framework. W przeciwnym razie użyj wersji Element BidiFormatter został znaleziony w bibliotece pomocy.

Formatowanie liczb

Używaj format ciągi tekstowe, a nie wywołania metod, do konwertowania liczb na ciągi tekstowe w aplikacji logika:

Kotlin

var myIntAsString = "$myInt"

Java

String myIntAsString = String.format("%d", myInt);

Dzięki temu liczby będą odpowiednio sformatowane w Twoim języku, co może należy użyć innego zestawu cyfr.

Jeśli używasz String.format(), aby utworzyć Zapytanie SQL na urządzeniu ustawionym na język, który korzysta z własnego zestawu cyfr, np. perski i większości języków arabskich, problemy występują, jeśli którykolwiek z parametrów zapytania są liczbami. Dzieje się tak, ponieważ numer jest sformatowany zgodnie z cyframi lokalnymi, a te cyfry są nieprawidłowe w SQL.

Aby zachować liczby w formacie ASCII i zadbać o poprawność zapytania SQL, musisz zamiast tego użyć przeciążona wersja String.format(), które uwzględnia język jako pierwszy parametr. Używanie argumentu języka Locale.US

Obsługa powielania układu

Osoby używające pisma RTL wolą interfejs RTL, który zawiera menu wyrównane do prawej, tekst wyrównany do prawej oraz strzałki do przodu, które wskazują Użytkownik rozłączył się.

Rysunek 4 przedstawia kontrast między wersją LTR ekranu Aplikacja Ustawienia i jej odpowiednik w formacie RTL:

Obszar powiadomień jest wyrównany do prawego górnego rogu ekranu,
           przycisk menu na pasku aplikacji znajduje się w lewym górnym rogu,
           treści w głównej części ekranu są wyrównane do lewej i są wyświetlane
           po lewej stronie, a przycisk Wstecz znajduje się w lewym dolnym rogu i jest
           w lewo. Obszar powiadomień jest wyrównany do lewej
            znajduje się w prawym górnym rogu,
            głównej części ekranu jest wyrównany do prawej strony i ma format RTL,
            przycisk Wstecz znajduje się w prawym dolnym rogu i kieruje na
            po prawej
. Rysunek 4. Warianty LTR i RTL ekranu ustawień.

Podczas dodawania do aplikacji obsługi RTL używaj weź pod uwagę następujące kwestie:

  • Powielanie tekstu RTL jest obsługiwane tylko w aplikacjach na urządzeniach z Android 4.2 (poziom interfejsu API 17) lub nowszy. Aby dowiedzieć się, jak obsługiwać odbicie lustrzane tekstu na starszych urządzeniach: uzyskiwanie pomocy w przypadku starszych aplikacji w tym przewodniku.
  • Aby sprawdzić, czy aplikacja obsługuje kierunek tekstu od prawej do lewej: testuj, korzystając z opcji dla programistów, zgodnie z opisem w tym przewodniku, i zaproś innych którzy używają skryptów RTL w aplikacji.

Uwaga: aby wyświetlić dodatkowe wskazówki dotyczące projektowania związane z powielanie układu, w tym listę elementów, które są i nie są odpowiednie; do odbicia lustrzanego, Dwukierunkowa łączność z wytycznymi Material Design.

Aby odzwierciedlić układ interfejsu w aplikacji i wyświetlać go jako RTL w języku RTL, wykonaj czynności opisane w poniższych sekcjach.

Modyfikowanie plików kompilacji i manifestu

Zmodyfikuj plik build.gradle i plik manifestu aplikacji modułu aplikacji. w następujący sposób:

build.gradle (Module: app)

Odlotowe

android {
    ...
    defaultConfig {
        targetSdkVersion 17 // Or higher
        ...
    }
}

Kotlin

android {
    ...
    defaultConfig {
        targetSdkVersion(17) // Or higher
        ...
    }
}

AndroidManifest.xml

<manifest ... >
    ...
    <application ...
        android:supportsRtl="true">
    </application>
</manifest>

Uwaga: jeśli aplikacja jest kierowana na Androida 4.1.1 (poziom API 16) lub poniżej, atrybut android:supportsRtl jest ignorowany, wraz z każdym Wartości atrybutów start i end, które pojawiają się w plików układu aplikacji. W takim przypadku odbicie lustrzane układu od prawej do lewej nie jest możliwe. automatycznie w aplikacji.

Aktualizowanie istniejących zasobów

Przekonwertuj left i right na start i end w istniejących plikach zasobów układu. Pozwala to wyrównać elementy interfejsu aplikacji na podstawie ustawienia języka użytkownika.

Uwaga: zanim zaktualizujesz zasoby, dowiedz się, jak: zapewniają pomoc dotyczącą starszych aplikacji lub na Androida 4.1.1 (poziom interfejsu API 16) lub starszego.

Aby korzystać z funkcji dopasowania od prawej do lewej, zmień atrybuty w pliki układu wyświetlane w tabeli 1.

Tabela 1. Atrybuty użyj, gdy aplikacja obsługuje wiele kierunków tekstowych

Atrybut obsługujący tylko LTR Atrybut obsługujący LTR i RTL
android:gravity="left" android:gravity="start"
android:gravity="right" android:gravity="end"
android:layout_gravity="left" android:layout_gravity="start"
android:layout_gravity="right" android:layout_gravity="end"
android:paddingLeft android:paddingStart
android:paddingRight android:paddingEnd
android:drawableLeft android:drawableStart
android:drawableRight android:drawableEnd
android:layout_alignLeft android:layout_alignStart
android:layout_alignRight android:layout_alignEnd
android:layout_marginLeft android:layout_marginStart
android:layout_marginRight android:layout_marginEnd
android:layout_alignParentLeft android:layout_alignParentStart
android:layout_alignParentRight android:layout_alignParentEnd
android:layout_toLeftOf android:layout_toStartOf
android:layout_toRightOf android:layout_toEndOf

Tabela 2 pokazuje, jak system obsługuje atrybuty wyrównania interfejsu na podstawie docelowa wersja pakietu SDK, niezależnie od tego, czy atrybuty left i right oraz czy atrybuty start i end są zdefiniowano jego definicję.

Tabela 2. Z uwzględnieniem zachowania wyrównania elementów interfejsu docelowej wersji pakietu SDK i zdefiniowanych atrybutów.

Kierowanie na Androida 4.2
(poziom interfejsu API 17) lub wyższy?
Definiujesz lewą i prawą stronę? Określić początek i koniec? Wynik
Tak Tak Tak Używane są start i end, zastępujące left i right
Tak Tak Nie W użyciu left i right
Tak Nie Tak W użyciu start i end
Nie Tak Tak left i right są używane (start i end są ignorowane)
Nie Tak Nie W użyciu left i right
Nie Nie Tak start i end widzą left i right

Dodawanie zasobów związanych z kierunkami i językami

Ten krok obejmuje dodanie określonych wersji układu, elementów rysunkowych wartości plików zasobów, które zawierają niestandardowe wartości dla różnych języków; i wskazówki tekstowe.

W Androidzie 4.2 (poziom interfejsu API 17) i nowszych możesz używać interfejsu -ldrtl (układ-kierunek-od prawej do lewej) i -ldltr kwalifikatory zasobów (układ, kierunek: od lewej do prawej). Aby utrzymać się do tyłu zgodność z istniejącymi zasobami, starsze wersje Androida wykorzystują kwalifikatory języka zasobu, aby określić właściwy kierunek tekstu.

Załóżmy, że chcesz dodać plik układu z obsługą skryptów RTL, takich jak język hebrajski, arabski i perski. Aby to zrobić, dodaj layout-ldrtl/ w katalogu res/, jak w tym przykładzie:

res/
    layout/
        main.xml This layout file is loaded by default.
    layout-ldrtl/
        main.xml This layout file is loaded for languages using an
                 RTL text direction, including Arabic, Persian, and Hebrew.

Jeśli chcesz dodać wersję układu, która jest przeznaczona tylko W języku arabskim struktura katalogu wygląda tak:

res/
    layout/
        main.xml This layout file is loaded by default.
    layout-ar/
        main.xml This layout file is loaded for Arabic text.
    layout-ldrtl/
        main.xml This layout file is loaded only for non-Arabic
                 languages that use an RTL text direction.

Uwaga: zasoby specyficzne dla danego języka mają pierwszeństwo przed specyficzne dla układu, które mają pierwszeństwo przed zasobami domyślnymi. i zasobami Google Cloud.

Korzystanie z obsługiwanych widżetów

Od Androida 4.2 (poziom interfejsu API 17) większość elementów interfejsu platformy obsługuje RTL. kierunek tekstu. Kilka elementów struktury, takich jak ViewPager, nie obsługuj tekstu od prawej do lewej kierunek.

Widżety na ekranie głównym obsługują kierunek tekstu od prawej do lewej, o ile ich odpowiednie pliki manifestu zawierają przypisanie atrybutu android:supportsRtl="true"

Obsługa starszych aplikacji

Jeśli Twoja aplikacja jest kierowana na Androida 4.1.1 (poziom interfejsu API 16) lub starszego, dopisz Atrybuty left i right, a także start i end.

Aby sprawdzić, czy w układzie musi być używany kierunek tekstu od prawej do lewej, użyj funkcji następującą logikę:

Kotlin

private fun shouldUseLayoutRtl(): Boolean {
    return if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) {
        View.LAYOUT_DIRECTION_RTL == layoutDirection
    } else {
        false
    }
}

Java

private boolean shouldUseLayoutRtl() {
    if (android.os.Build.VERSION.SDK_INT >=
            android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) {
        return View.LAYOUT_DIRECTION_RTL == getLayoutDirection();
    } else {
        return false;
    }
}

Uwaga: aby uniknąć problemów ze zgodnością, użyj wersji 23.0.1 lub większą wartość Android Narzędzia do tworzenia pakietów SDK.

Testowanie za pomocą opcji programisty

Na urządzeniach z Androidem 4.4 (poziom interfejsu API 19) lub nowszym Wymuś układ od prawej do lewej w opcji programisty na urządzeniu. To ustawienie umożliwia wyświetlenie tekstu korzystającego ze skryptów LTR, np. tekstu polskiego, w zapisie RTL i trybu uzyskiwania zgody.

Zaktualizuj logikę aplikacji

Ta sekcja opisuje określone aspekty logiki aplikacji, aby aktualizować podczas dostosowywania aplikacji do obsługi wielu wskazówek tekstowych.

Zmiany usługi

Do obsługi zmian w dowolnej właściwości związanej z wersją od prawej do lewej, np. układem kierunek, parametry układu, dopełnienie, kierunek tekstu, wyrównanie tekstu lub rysowalnej pozycji – użyj onRtlPropertiesChanged() oddzwanianie. To wywołanie zwrotne umożliwia uzyskanie bieżącego kierunku układu odpowiednio zaktualizować obiekty View aktywności.

Wyświetlenia

Jeśli tworzysz widżet interfejsu, który nie jest bezpośrednio częścią aktywności hierarchię widoków, na przykład okno lub taki element interfejsu, ustaw prawidłową w zależności od kontekstu. Następujący fragment kodu: pokazuje, jak ukończyć ten proces:

Kotlin

val config: Configuration = context.resources.configuration
view.layoutDirection = config.layoutDirection

Java

final Configuration config =
    getContext().getResources().getConfiguration();
view.setLayoutDirection(config.getLayoutDirection());

Kilka metod klasy View wymaga dodatkowych rozważanie zakupu:

onMeasure()
Pomiary w widoku mogą się różnić w zależności od kierunku tekstu.
onLayout()
Jeśli tworzysz własną implementację układu, musisz zadzwonić super() w swojej wersji aplikacji onLayout() i dostosuj niestandardową logikę do obsługi skryptów RTL.
onDraw()
Jeśli implementujesz widok niestandardowy lub dodajesz zaawansowane funkcje do rysowania, musisz zaktualizować swój kod, aby obsługiwał skrypty RTL. Użyj następujący kod, aby określić, czy widżet działa w trybie RTL:

Kotlin

// On devices running Android 4.1.1 (API level 16) and lower,
// you can call the isLayoutRtl() system method directly.
fun isLayoutRtl(): Boolean = layoutDirection == LAYOUT_DIRECTION_RTL

Java

// On devices running Android 4.1.1 (API level 16) and lower,
// you can call the isLayoutRtl() system method directly.
public boolean isLayoutRtl() {
    return (getLayoutDirection() == LAYOUT_DIRECTION_RTL);
}

Elementy rysowalne

Jeśli masz element rysowalny, który musi zostać zduplikowany w przypadku układu od prawej do lewej, ukończ wykonaj jedną z tych czynności w zależności od wersji Androida na urządzeniu:

  • Na urządzeniach z Androidem 4.3 (poziom interfejsu API 18) lub starszym dodać i zdefiniować pliki zasobów -ldrtl.
  • W Androidzie 4.4 (poziom interfejsu API 19) i nowszych android:autoMirrored="true" podczas określania obiektu rysowalnego, który pozwala systemowi na odbicie lustrzane układu RTL.

    Uwaga: android:autoMirrored działa tylko w przypadku prostych obiektów rysowalnych, których dwukierunkowe odbicie lustrzane jest po prostu odbiciem graficznym całego elementu, który można rysować. Jeśli obiekt rysowalny zawiera wiele elementów lub jeśli obiekt rysowalny zmienia jego możecie wykonać odbicie lustrzane. Kiedykolwiek skonsultuj się z ekspertem dwukierunkowym, aby ustalić, czy lustrzane obiekty rysunkowe są bardziej zrozumiałe dla użytkowników.

Grawitacja

Jeśli kod układu aplikacji zawiera właściwość Gravity.LEFT lub Gravity.RIGHT, zmień te wartości do Gravity.START oraz Gravity.END.

Jeśli masz kod w Kotlin lub Java, który zależy od usługi Gravity.LEFT lub Gravity.RIGHT, możesz dostosować go do tej zmiany, ustawiając absoluteGravity tak, by odpowiadał parametrowi layoutDirection

Na przykład, jeśli korzystasz z tego kodu:

Kotlin

when (gravity and Gravity.HORIZONTAL_GRAVITY_MASK) {
    Gravity.LEFT -> {
        // Handle objects that are left-aligned.
    }
    Gravity.RIGHT -> {
        // Handle objects that are right-aligned.
    }
}

Java

switch (gravity & Gravity.HORIZONTAL_GRAVITY_MASK) {
    case Gravity.LEFT:
        // Handle objects that are left-aligned.
        break;
    case Gravity.RIGHT:
        // Handle objects that are right-aligned.
        break;
}

Zmień go na taki:

Kotlin

val absoluteGravity: Int = Gravity.getAbsoluteGravity(gravity, layoutDirection)
when (absoluteGravity and Gravity.HORIZONTAL_GRAVITY_MASK) {
    Gravity.LEFT -> {
        // Handle objects that are left-aligned.
    }
    Gravity.RIGHT -> {
        // Handle objects that are right-aligned.
    }
}

Java

final int layoutDirection = getLayoutDirection();
final int absoluteGravity =
        Gravity.getAbsoluteGravity(gravity, layoutDirection);
switch (absoluteGravity & Gravity.HORIZONTAL_GRAVITY_MASK) {
    case Gravity.LEFT:
        // Handle objects that are left-aligned.
        break;
    case Gravity.RIGHT:
        // Handle objects that are right-aligned.
        break;
}

Oznacza to, że możesz zachować dotychczasowy kod, który jest wyrównany do lewej i wyrównane do prawej, nawet jeśli używasz start i end dla wartości grawitacji.

Uwaga: podczas wprowadzania ustawień grawitacji użyj przeciążona wersja Gravity.apply(), która zawiera layoutDirection.

Marginesy i dopełnienie

Aby umożliwić obsługę skryptów RTL w aplikacji, postępuj zgodnie z tymi sprawdzonymi metodami dotyczącymi wartości marginesów i dopełnienia:

  • Używaj tych identyfikatorów: getMarginStart() i getMarginEnd() zamiast atrybuty kierunków odpowiadają wartościom leftMargin i rightMargin
  • Jeśli używasz funkcji setMargins(), zamień wartości parametrów left na right argumentów, jeśli aplikacja wykrywa skrypty RTL.
  • Jeśli aplikacja zawiera niestandardową logikę dopełnienia, zastąp ją setPadding() i setPaddingRelative()

Obsługa preferencji językowych dla poszczególnych aplikacji

W wielu przypadkach użytkownicy wielojęzyczni ustawiają język systemu na jeden – np. angielski – ale w konkretnych aplikacjach, np. niderlandzki, chiński lub hindi. Aby pomóc są wygodniejsze dla wszystkich użytkowników. Android 13 wprowadza te funkcje: aplikacje obsługujące wiele języków:

  • Ustawienia systemu: scentralizowane miejsce, w którym użytkownicy mogą wybrać preferowanego języka dla każdej aplikacji.

    Aplikacja musi zadeklarować atrybut android:localeConfig w swoim manifestu, aby poinformować system, że obsługuje on wiele języków. Aby dowiedzieć się więcej, przeczytaj instrukcje dla utworzenie zasobu i zadeklaruj go w pliku manifestu aplikacji.

  • Dodatkowe interfejsy API: publiczne interfejsy API, takie jak setApplicationLocales(). oraz getApplicationLocales(). metod w zakresie LocaleManager zezwól aplikacjom na ustawianie języka innego niż język systemu na stronie w środowisku wykonawczym.

    Aplikacje, które używają niestandardowych selektorów języka w aplikacji, mogą używać tych interfejsów API, aby przekazywać użytkownikom spójne wrażenia użytkowników niezależnie od tego, gdzie wybrali język ustawieniach. Publiczne interfejsy API pomagają również ograniczyć ilość powtarzalnego kodu oraz obsługują dzielone pliki APK. Obsługują też Automatyczną kopię zapasową dla Google Apps do przechowywania ustawień języka użytkownika na poziomie aplikacji.

    Aby zapewnić zgodność wsteczną z poprzednimi wersjami Androida, dostępne są również odpowiadające im interfejsy API w Androidzie X. Zalecamy użycie Appcompat 1.6.0-beta01 lub wyższe.

    Aby dowiedzieć się więcej, zapoznaj się z instrukcjami dotyczącymi wdrożenie nowej interfejsów API.

Zobacz również

Dodatkowe materiały

Aby dowiedzieć się więcej o obsłudze starszych urządzeń, zapoznaj się z tymi materiałami:

Posty na blogu