2.1. Поддержка различных языков и культур Android Studio

Приложения включают ресурсы, которые могут быть специфическими для конкретной культуры. Например, приложение может включать в себя строки (sstrings), специфичные для конкретной культуры, которые переводятся на язык текущего языкового стандарта. Хорошей практикой является сохранение ресурсов, связанных с языком, отдельно от остальной части вашего приложения. Android поддерживает хранение ресурсов языка и культуры, основанные на настройке локали системы. Вы можете предоставить поддержку для разных локалей, используя каталог ресурсов в вашем проекте Android.

Вы можете указать ресурсы, адаптированные к культуре людей, которые используют ваше приложение. Вы можете указать любой тип ресурса, подходящий для языка и культуры ваших пользователей. Например, на следующем скриншоте показано приложение, отображающее строку и извлекаемые ресурсы в локали (en_US) устройства по умолчанию и в испанском (es_ES) языке.

The app shows a
different text and icon depending on the current locale

Если вы создали свой проект с помощью Android SDK Tools (см. «Создание проекта Android»), инструменты создадут каталог res/ на верхнем уровне проекта. Внутри каталога res/ находятся подкаталоги для разных типов ресурсов. Также есть несколько файлов по умолчанию, таких как res/ values/ strings.xml, которые содержат ваши строковые значения.

Поддержка разных языков выходит за рамки использования локальных ресурсов. Некоторые пользователи выбирают язык, который использует скрипты справа налево (RTL), такие как арабский или иврит. Другие пользователи просматривают контент на языке, который использует RTL-скрипты, даже если они установили язык, который использует сценарии LTR, такие как английский. Для поддержки обоих типов пользователей ваше приложение должно выполнить следующие действия:

Используйте макет интерфейса RTL для локалей RTL.
Обнаружить и объявить направление текстовых данных, отображаемых внутри форматированных сообщений. Обычно вы можете просто вызвать метод, который определяет направление текстовых данных.

 

Создание локальных каталогов и файлов ресурсов

Чтобы добавить поддержку для большего количества локалей, создайте дополнительные каталоги внутри res /. Имя каждого каталога должно соответствовать следующему формату:

-b+[+]

Например, values-b + es / содержит строковые ресурсы для локалей с кодом языка es. Аналогично, mipmap-b + es + ES / содержит значки для локалей с кодом языка es и кодом страны ES. Android загружает соответствующие ресурсы в соответствии с языковыми настройками устройства во время выполнения. Для получения дополнительной информации см. Раздел «Предоставление альтернативных ресурсов».

После того, как вы решите, какие локали будут поддерживаться, создайте подкаталоги ресурсов и файлы. Например:

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

Например, следующие несколько файлов ресурсов для разных языков:

Английские строки (язык по умолчанию), /values/strings.xml:


     name="hello_world">Hello World!

Испанская строка (es locale), /values-es/strings.xml:


     name="hello_world">¡Hola Mundo!

Значок флага Соединенных Штатов (стандарт по умолчанию),

The icon of flag of the
United States

Значок флага Испании (es_ES locale), /mipmap-b+es+ES/country_flag.png:

The icon of flag of
Spain

Использование ресурсов в приложении

Вы можете ссылаться на ресурсы в исходном коде и других файлах XML, используя атрибут имени каждого ресурса.

В исходном коде вы можете ссылаться на ресурс, используя синтаксис R. <тип ресурса>. <Имя ресурса>. Существует множество методов, которые принимают ресурс таким образом.

Например:

//  Получить строковый ресурс из ресурсов вашего приложения
String hello = getResources().getString(R.string.hello_world);

// Или предоставить строковый ресурс методу, который требует строку
TextView textView = new TextView(this);
textView.setText(R.string.hello_world);

В файлах XML вы можете ссылаться на ресурс с синтаксисом @ <тип ресурса> / <имя ресурса> всякий раз, когда атрибут XML принимает совместимое значение.

Например:


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

Форматируем текст в сообщениях

Одной из наиболее распространенных задач в приложении является форматирование текста. Локализованные сообщения форматируются путем вставки текстовых и числовых данных в соответствующие позиции. К сожалению, при работе с данными RTL UI или RTL простое форматирование может отображать неправильный или даже нечитаемый текст.

Языки, такие как арабский, иврит, персидский и урду, записываются в направлении RTL в целом. Некоторые из их элементов, например, числа и встроенный текст LTR, записываются в направлении LTR в другом RTL-тексте. Языки, которые используют сценарии LTR, включая английский, также двунаправлены, поскольку они могут содержать встроенные RTL-скрипты, которые должны отображаться в направлении RTL.

Большую часть времени сами приложения создают такие экземпляры встроенного текста противоположного направления. Они вставляют текстовые данные произвольного языка – и произвольного направления текста – в локализованные сообщения. Это смешение направлений часто не включает четкое указание того, где начинается и заканчивается текст противоположного направления. Эти характеристики текста, созданного приложением, вызывают большинство проблем.

Хотя обработка по умолчанию двунаправленного текста по умолчанию обычно выводит текст так, как ожидалось, возможно, что текст не будет отображаться должным образом, когда ваше приложение вставляет его в локализованное сообщение. В следующих ситуациях приводятся примеры случаев, когда более вероятно, что текст будет отображаться неправильно:

  1. Вставляется в самом начале сообщения:

PERSON_NAME звонит вам

2. Начинается с номера, например, по адресам или телефонным номерам:

987 654-3210

3. Начинается с пунктуации, например, в номере телефона:

+19876543210

4. Конец с пунктуацией:

Ты уверен?

5. Содержит оба направления:

Слово בננה является ивритом для банана.

Чтобы решить проблему с направлением текста, используйте метод unicodeWrap (), который находится в классе BidiFormatter, на каждый фрагмент текста, который вы вставляете в локализованное сообщение. Единственные случаи, когда вы не должны использовать unicodeWrap (), включают следующее:

– Текст вставляется в машиночитаемую строку, такую как URI или SQL-запрос.
– Вы уже знаете, что часть текста правильно оформлена.

Метод unicodeWrap () определяет направление строки и преобразует ее в символах форматирования Unicode, которые объявляют это направление.

Пример:

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

// Локализованный строковый ресурс «did_you_mean» включает
// «% s» заполнитель для предложения.
String.format(R.string.did_you_mean,
        myBidiFormatter.unicodeWrap(mySuggestion));

Примечание. Если ваше приложение предназначено для Android 4.3 (API уровня 18) или выше, используйте версию BidiFormatter из  Android Framework. В противном случае используйте версию BidiFormatter из Support Library.

Форматируем числа

Используйте строки форматирования, а не вызовы методов, чтобы преобразовать числа в строки в логике вашего приложения:

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

Это позволит соответствующим образом форматировать номера для вашей локали, которые могут включать использование другого набора цифр.

Когда вы используете String.format () для создания SQL-запроса на устройстве, язык которого использует свой собственный набор цифр, например, персидский и большинство арабских локалей, возникают проблемы, если какой-либо из параметров запроса является числом. Это связано с тем, что число отформатировано в разрядах локали, и эти цифры недействительны в SQL.

Чтобы сохранить ASCII-форматированные номера и сохранить запрос SQL действительным, вместо этого вы должны использовать перегруженную версию String.format (), которая включает в себя локаль в качестве первого параметра. Аргументом locale должен быть Locale.US.

Поддержка зеркального отображения компоновки

Люди, использующие RTL-скрипты, предпочитают интерфейс RTL, который включает в себя выравнивание по правому краю меню, выравнивание по правому краю текста и стрелки вправо, указывающие влево.

The notification area is right-aligned near the top-right corner,
           the menu button in the app bar is near the top-left corner, the
           content in the main part of the screen is left-aligned and appears
           LTR, and the back button is near the bottom-left corner and is
           pointing to the left.The notification area is left-aligned near the top-left corner, the
            menu button in the app bar is near the top-right corner, the content
            in the main part of the screen is right-aligned and appears RTL, and
            the back button is near the bottom-right corner and is pointing to
            the right

 

При добавлении поддержки RTL в ваше приложение особенно важно учитывать следующие моменты:

Текстовое отзеркаливание RTL поддерживается только в приложениях при использовании на устройствах под управлением Android 4.2 (API уровня 17) или выше. Чтобы узнать, как поддерживать зеркальное отражение текста на более старых устройствах, см. Предоставление поддержки устаревших приложений.
Чтобы проверить, поддерживает ли ваше приложение текстовое направление RTL, протестируйте его с помощью параметров разработчика и предложите пользователям, использующим RTL-скрипты, использовать ваше приложение.

Чтобы отзеркалить макет пользовательского интерфейса в вашем приложении, чтобы он отображался RTL в локали RTL, выполните шаги в следующих разделах.

Измените файлы сборки и манифеста

В указанных файлах нужно сделать следующее

build.gradle (Module: app)

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

AndroidManifest.xml

 ... >
    ...
     ...
        android:supportsRtl="true">
    

Примечание. Если ваше приложение предназначено для Android 4.1.1 (API-уровень 16) или ниже, атрибут android: supportsRtl игнорируется вместе с любыми значениями атрибутов начала и конца, которые отображаются в файлах макета вашего приложения. В этом случае зеркальное отображение макетов RTL не выполняется автоматически в вашем приложении.

Обновите существующие ресурсы

Преобразование влево и вправо для начала и конца, соответственно, в каждом из существующих файлов ресурсов макета. Делая это, вы позволяете структуре выравнивать элементы пользовательского интерфейса вашего приложения на основе языковых настроек пользователя.

Примечание. Прежде чем обновлять свои ресурсы, узнайте, как обеспечить поддержку устаревших приложений или приложений, ориентированных на Android 4.1.1 (уровень API 16) и ниже.

Чтобы использовать возможности выравнивания RTL, измените атрибуты в файлах макета, которые представлены в таблице.

Attribute supporting LTR only Attribute supporting LTR and 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

Добавление ресурсов, относящихся к направлению и языку

Этот шаг включает добавление определенных версий ваших макетов, чертежей и значений файлов ресурсов, которые содержат настроенные значения для разных языков и текстовых указаний.

В Android 4.2 (API-уровень 17) и выше вы можете использовать квалификаторы ресурсов -ldrtl (layout-direction-right-to-left) и -ldltr (layout-direction-left-right-right). Чтобы поддерживать обратную совместимость с загрузкой существующих ресурсов, более старые версии Android используют квалификаторы языка ресурсов для вывода правильного направления текста.

Предположим, что вы хотите добавить определенный файл макета для поддержки RTL-скриптов, таких как иврит, арабский и персидский языки. Для этого вы добавляете каталог layout-ldrtl / в каталог res /, как показано в следующем примере:

res/
    layout/
        main.xml Этот файл макета загружается по умолчанию.
    layout-ldrtl/
        main.xml Этот файл макета загружается для языков, используя
                  RTL, включая арабский, персидский и иврит.

Если вы хотите добавить определенную версию макета, предназначенную только для арабского текста, ваша структура каталогов станет следующей:

res/
    layout/
        main.xml Этот файл макета загружается по умолчанию.
    layout-ar/
        main.xml Этот файл макета загружается для арабского текста.
    layout-ldrtl/
        main.xml Этот файл макета загружается только для неарабского
                  языки, которые используют текстовое направление RTL.

Ресурсы, специфичные для языка, имеют приоритет над ресурсами, ориентированными на макет, которые имеют приоритет над ресурсами по умолчанию.

Использование поддерживаемых виджетов

Начиная с Android 4.2 (API уровня 17), большинство элементов интерфейса UI автоматически поддерживают направление текста RTL. Однако несколько элементов структуры, например ViewPager, не поддерживают текстовое направление RTL.

Виджеты на главном экране поддерживают текстовое направление RTL, если в их соответствующие файлы манифеста включены назначение атрибутов android: supportsRtl = “true”.

 

Обеспечение поддержки устаревших приложений

Если ваше приложение предназначено для Android 4.1.1 (уровень API 16) или ниже, также включают левый и правый атрибуты, в дополнение к началу и концу.

Чтобы проверить, должен ли ваш макет использовать текстовое направление RTL, используйте следующее:

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;
    }
}

Проверка с помощью параметров разработчика

На устройствах под управлением Android 4.4 (API уровня 19) или выше вы можете включить форматирование Force RTL в настройках разработчика на устройстве. Этот параметр позволяет вам видеть текст, который использует сценарии LTR, такие как текст на английском языке, в режиме RTL.

 

Обновление логики приложения

В этом разделе описываются конкретные подходы в логике вашего приложения, которые необходимо обновлять при адаптации приложения для обработки нескольких текстовых указаний.

Изменение свойств

Чтобы обрабатывать изменение любого свойства, связанного с RTL, например, направление макета, параметры макета, отступы, направление текста, выравнивание текста или рисованное позиционирование, вы можете использовать обратный вызов onRtlPropertiesChanged (). Этот вызов позволяет вам получить текущее направление макета и соответствующим образом обновить объекты вида деятельности.

Views

Если вы создаете виджет пользовательского интерфейса, который не является непосредственно частью иерархии представлений активности, например диалогом или похожим на тост элементом пользовательского интерфейса, задайте правильное направление макета в зависимости от контекста. Посмотрите следующий фрагмент кода:

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


Рассмотрим несколько методов класса View:

onMeasure()
Просмотр измерений может зависеть от направления текста
onLayout()
Если вы создаете свою собственную реализацию макета, вам нужно будет вызвать super () в вашей версии onLayout () и адаптировать вашу логику для поддержки RTL-скриптов.
onDraw()
Если вы реализуете пользовательский вид или добавляете дополнительные функции к чертежу, вам необходимо обновить код для поддержки RTL-скриптов. Используйте следующий код, чтобы определить, находится ли ваш виджет в режиме RTL:

// На устройствах под управлением Android 4.1.1 (API-уровень 16) и ниже,
// вы можете напрямую вызвать системный метод isLayoutRtl ().
public boolean isLayoutRtl() {
    return (getLayoutDirection() == LAYOUT_DIRECTION_RTL);
}

Drawables

Если у вас есть drawable , который нужно отразить для макета RTL, выполните один из этих шагов на основе версии Android, запущенной на устройстве:

На устройствах под управлением Android 4.3 (API уровня 18) и ниже вам нужно добавить и определить файлы ресурсов -ldrtl.
На Android 4.4 (API-уровень 19) и выше вы можете использовать android: autoMirrored = «true» при определении вашего drawable, что позволяет системе обрабатывать зеркалирование RTL-макетов автоматически.

Gravity

Если код вашего приложения использует Gravity.LEFT или Gravity.RIGHT, вам нужно будет изменить эти значения на Gravity.START и Gravity.END соответственно.

Например, если вы используете следующий код:

switch (gravity & Gravity.HORIZONTAL_GRAVITY_MASK) {
    case Gravity.LEFT:
        // Обрабатываем объекты, выровненные по левому краю.
        break;
    case Gravity.RIGHT:
        // Обрабатываем объекты, выровненные по правому краю.
        break;
}

… вам нужно изменить его на следующее:

final int layoutDirection = getLayoutDirection();
final int absoluteGravity =
        Gravity.getAbsoluteGravity(gravity, layoutDirection);
switch (absoluteGravity & Gravity.HORIZONTAL_GRAVITY_MASK) {
    case Gravity.LEFT:
        // Обрабатываем объекты, выровненные по левому краю.
        break;
    case Gravity.RIGHT:
        // Обрабатываем объекты, выровненные по правому краю.
        break;
}

Это означает, что вы можете сохранить свой существующий код, который обрабатывает выровненные по левому краю и выровненные по правому краю значения, даже если вы используете начало и конец для значений Gravity.

Примечание. При применении настроек гравитации используйте перегруженную версию Gravity.apply (), которая включает аргумент layoutDirection.

Margin and padding

Чтобы поддерживать RTL-скрипты в вашем приложении, следуйте этим рекомендациям, связанным с значениями полей и заполнения:

  • Используйте getMarginStart () и getMarginEnd () вместо эквивалентов атрибутов, относящихся к направлению, leftMargin и rightMargin.
  • При использовании setMargins () замените значения левого и правого аргументов, если ваше приложение содержит RTL-скрипты.
  • Если ваше приложение включает пользовательскую логику дополнений, переопределите setPadding () и setPaddingRelative ().

 

You may also like...

36 комментариев

  1. Furosemide 40 Mg Without Perscription Buy now isotretinoin oratane generic cialis Cialis E Simili Cialis Medicament Prix

  2. Acheter Viagra Hollande Viagra Et Mode D’Emploi viagra Discount Pharmacy In Us Online Finasteride Online Mastercard

  3. Discount Tadalifil priligy come funziona Break 25 Mg Viagra Para Que Sirve La Pastilla Cialis

  4. The alternative lenders may start to see the negative
    impacts of the rules — and potential loss of business —
    offset if prime borrowers get rejected by
    banks and find yourself becoming their clients, RBC said.
    mortgage calculator canada If you live away from United Kingdom, English
    law shall apply only on the extent that English law shall not
    deprive you associated with a legal protection accorded in accordance with all the
    law in the place where you are habitually resident (“Local Law”).v

  5. Find all your bookmarks by selecting your profile name.

    mortgage calculator canada If you’re getting an insured mortgage
    (that’s usually required in case you have lower than 20 % equity), you need to prove you have enough money a payment with
    the Bank of Canada’s five-year benchmark” rate.v

  1. 19.08.2019

    viagra tablets

    viagra tablets

  2. 19.08.2019

    generic viagra 100mg

    generic viagra 100mg

  3. 19.08.2019

    generic cialis at walmart

    generic cialis at walmart

  4. 19.08.2019

    sildenafil

    sildenafil

  5. 19.08.2019

    cheap viagra

    cheap viagra

  6. 19.08.2019

    viagra for sale

    viagra for sale

  7. 20.08.2019

    buy generic cialis

    buy generic cialis

  8. 20.08.2019

    generic viagra

    generic viagra

  9. 20.08.2019

    generic cialis

    generic cialis

  10. 24.08.2019

    sildenafil citrate

    sildenafil citrate

  11. 24.08.2019

    viagra coupons

    viagra coupons

  12. 24.08.2019

    cialis generic

    cialis generic

  13. 24.08.2019

    generic cialis tadalafil

    generic cialis tadalafil

  14. 25.08.2019

    viagra prices

    viagra prices

  15. 25.08.2019

    viagra without doctor prescription

    viagra without doctor prescription

  16. 25.08.2019

    cialis cost

    cialis cost

  17. 25.08.2019

    viagra generic

    viagra generic

  18. 27.08.2019

    viagra without a doctor prescription

    viagra without a doctor prescription

  19. 28.08.2019

    generic viagra available

    generic viagra available

  20. 28.08.2019

    cialis pills

    cialis pills

  21. 28.08.2019

    viagra 100mg

    viagra 100mg

  22. 28.08.2019

    sildenafil generic

    sildenafil generic

  23. 28.08.2019

    tadalafil generic

    tadalafil generic

Добавить комментарий

Ваш e-mail не будет опубликован.

Lost your password? Please enter your username or email address. You will receive a link to create a new password via email.
Регистрация не требуется. В качестве логина укажите рабочую почту, в качестве пароля - пароль от компьютера.