- Изменение языка интерфейса в Android
- Устанавливаем русский язык в девайсе на Android
- Способ 1: Системные настройки
- Способ 2: MoreLocale2
- Смена языка интерфейса на мобильном устройстве с Android
- Локализация Android-приложений: о чем умалчивает документация
- Введение
- Проблема № 1. Приложение отображается не на том языке
- «Один случай»
- Проблема № 2. Как узнать текущую локаль приложения?
- Проблема № 3. Как получить список предпочитаемых языков устройства?
- Заключение
- О переводчике
Изменение языка интерфейса в Android
Устанавливаем русский язык в девайсе на Android
В большинстве прошивок на Android-аппарата русский язык, так или иначе, присутствует – соответствующий языковой пакет есть в них по умолчанию, его нужно только включить.
Способ 1: Системные настройки
Этого варианта достаточно в большинстве случаев — как правило, обычно русский язык в купленных за границей смартфонах не установлен по умолчанию, но переключиться на него можно.
- Зайдите в настройки девайса. Если в вашем аппарате по умолчанию включен, допустим, китайский, то ориентируйтесь по иконкам – например, «Настройки» («Settings»)в меню приложений выглядит как шестерня.
Еще проще – зайти в «Настройки» через строку состояния.
Как видите – все довольно просто. Однако может быть ситуация, когда среди доступных языков русского нет. Такое случается, когда на аппарате установлена прошивка, не предназначенная для СНГ или РФ в частности. Её можно русифицировать с помощью следующего способа.
Способ 2: MoreLocale2
Комбинация из приложения и ADB-консоли позволяет добавить к неподдерживаемой прошивке русский язык.
- Установите приложение. Если у вас есть root-доступ — переходите сразу к шагу 7. Если нет — читайте дальше.
- Включите режим отладки по USB — сделать это можно способами, описанными в статье ниже.
Теперь переходите к ПК. Распакуйте архив с ADB в любом месте и перенесите получившуюся папку в корневой каталог диска C.
Запустите командную строку (способы для Windows 7, Windows 8, Windows 10) и введите команду cd c:\adb .
Введите последовательно следующие команды:
pm list packages morelocale
pm grant jp.co.c_lis.ccl.morelocale android.permission.CHANGE_CONFIGURATION
Окно командной строки при этой должно выглядеть так:
Теперь можно отключать аппарат от ПК.
Откройте на девайсе MoreLocale2 и найдите в списке «Русский» («Russian»), тапните по нему для выбора.
Готово — отныне ваш девайс русифицирован.
Способ довольно сложный, однако и он не гарантирует результата — если пакет не заблокирован программно, а отсутствует вообще, то вы получите либо частичную русификацию, либо метод вообще не сработает. Если метод с ADB и MoreLocale2 не помог, то единственным решением этой проблемы будет установка русифицированной «из коробки» прошивки или посещение сервисного центра: как правило, его работники охотно помогут вам за небольшую сумму.
Мы рассмотрели все доступные варианты установки русского языка в телефон. Если вы знаете еще какие-нибудь хитрые методы, поделитесь ими в комментариях.
Помимо этой статьи, на сайте еще 12473 инструкций.
Добавьте сайт Lumpics.ru в закладки (CTRL+D) и мы точно еще пригодимся вам.
Отблагодарите автора, поделитесь статьей в социальных сетях.
Источник
Смена языка интерфейса на мобильном устройстве с Android
Изменение языка интерфейса на Андроид-девайсе выполняется в одном из разделов системных настроек, точное расположение которого зависит от версии мобильной ОС и ее оболочки.
Примечание: В примере далее будет использован смартфон с изначально установленной в качестве основной английской локализацией. Если на вашем устройстве используется другой, неизвестный вам язык, ориентируйтесь на порядок и расположение пунктов в параметрах, а также на значки, которыми они отмечены.
- Запустите «Settings» («Настройки») – значок, с изображением шестеренки, ярлык которого есть в меню приложений и на главном экране. Также перейти в данный раздел ОС можно из панели с элементами быстрого доступа (шторки), вызываемой свайпом от верхней границы экрана вниз.
Пролистайте список доступных параметров и найдите в нем «System» («Система», обычно один из последних).
Обратите внимание! На устройствах с отличной от чистой и близкой к ней оболочкой ОС Android вместо «Системы» может потребоваться перейти к «Расширенным настройкам» — «Additional Settings».
Выберите пункт «Languages & input» («Язык и ввод», также может называться просто «Languages» и обычно обозначен изображением планеты).
Совет: Значительно более быстро перейти к данному разделу можно, если в поиске по настройкам ввести его название, а затем перейти к соответствующей подсказке в результатах выдачи, ориентируясь в том числе на значок.
Далее перейдите к «Languages» («Языки», обычно обозначен иконкой по типу той, что используется многими переводчиками, в том числе Google и Яндекс).
Если в списке доступных локализаций есть та, которую вы хотите использовать в качестве основной, переместите ее на первое место. В противном случае воспользуйтесь пунктом «Add a language» («Добавить язык», может обозначаться «+»).
Примечание: На сторонних оболочках при выполнении предыдущего шага инструкции может сразу открыться показанный в следующем пункте раздел со списком всех поддерживаемых локализаций.
Совет: Если на клавиатуре еще нет нужной вам раскладки, например, русской, и требуется указать запрос на ней, просто вводите его на латинице – «Russian».
Выберите язык касанием и сделайте его основным. В большинстве случаев для этого необходимо переместить соответствующую ему запись на первое место в списке используемых системой.
На сторонних же оболочках может быть достаточно банального подтверждения выбора во всплывающем окне.
После выполнения вышеописанных действий выбранный вами язык будет установлен в качестве основного для всей ОС Андроид и используемых в ее рамках приложений.
Если же, помимо этого, требуется добавить недостающую раскладку в клавиатуру, ознакомьтесь с представленной по ссылке ниже статьей.
Примечание: Если тот или иной вариант локализации потребуется удалить из списка доступных к использованию на мобильном девайсе, повторите действия из пунктов №1-4 инструкции выше, затем вызовите меню, выберите в нем «Удалить», отметьте более ненужный язык галочкой, тапните по значку с изображением мусорной корзины и подтвердите свое намерение во всплывающем окне.
Источник
Локализация Android-приложений: о чем умалчивает документация
Локализация Android-приложений — намного более сложная задача, чем должна была бы быть. Описание в документации недостаточное: чтобы разобраться в происходящем «под капотом», нужно искать информацию во внешних источниках (на StackOverflow и в блогах) и тренироваться на базовых приложениях типа «Hello World».
В этой статье я разберу некоторые трудности процесса локализации, с которыми я столкнулся в своих приложениях. Решения, которые я буду приводить, не описаны в документации, поэтому я постараюсь быть максимально точным. (Примечание: термины «локаль» и «язык» в статье используются как синонимы.)
Многобукаф? Нажмите Ctrl-F и введите «вывод №».
Введение
В статье говорится о некоторых трудностях локализации, которые не рассматриваются в официальных ресурсах, — то есть, это не руководство по локализации «для чайников».
Перед чтением полезно будет изучить основы локализации Android-приложений (если вы еще не знакомы с этой темой) — прочтите следующие документы:
Проблема № 1. Приложение отображается не на том языке
Разберемся, что происходит в этом случае «под капотом». Допустим, языковые настройки телефона следующие:
Если перевести этот список в псевдокод, получим:
(Примечание. Язык по умолчанию для приложения определяется самим приложением. В одном случае это может быть польский, в другом — немецкий, и так далее, — это язык, файл которого размещен по пути values/strings.xml . К сожалению, указать системе Android язык по умолчанию для конкретного приложения нельзя — и мы с этой особенностью еще столкнемся позже.)
В основе этого списка лежит вроде бы простая логика. Однако в некоторых случаях приложение использует не тот язык, который должно было бы, и переключается на свою локаль по умолчанию, когда вы этого не ожидаете.
Чтобы увидеть, как это происходит, установите языковые настройки так, как показано на скриншоте выше, а затем создайте в Android Studio новое приложение из шаблона «Empty Activity». Откройте res/values/strings.xml и для строки app_name (название приложения) задайте значение «App In Default Language» («Приложение на языке по умолчанию»).
Запустите приложение и проверьте, чтобы оно работало. Название приложения появится слева вверху экрана.
Теперь добавим еще два файла values.xml :
Приложение можно снова запускать, но перед этим подумайте: какое значение app_name будет отображаться?
Разумно предположить, что это будет название на французском: испанский — предпочитаемый язык пользователя, но для этой локали файла strings.xml нет, поэтому система выберет следующий предпочитаемый язык — то есть, французский, для которого файл strings.xml у нас есть. Верно же?
А теперь запустите приложение:
Какого… Как так? Почему не на французском? У нас проблемы с логикой?
Нет. С нашей логикой всё в порядке. Дело в другом.
При создании проекта в Android Studio с ним идут кое-какие библиотеки по умолчанию. Взгляните на файл app/build.gradle :
В этих библиотеках содержатся файлы ресурсов для многих локалей — в том числе в них могут быть файлы values-es/strings.xml . Поэтому в скомпилированном и упакованном приложении у вас наверняка найдутся файлы strings.xml на испанском.
В итоге Android будет считать, что в приложении есть испанская локаль, и попытается найти app_name на испанском. Но мы эту переменную не определили, поэтому приложение берет ее в strings.xml по умолчанию и, соответственно, отображает строку «App In Default Language».
Такая ситуация называется загрязнением ресурсов: Android наступает на свои же грабли. Подробнее — здесь и здесь.
Чтобы обойти эту проблему, нужно объявить поддерживаемые языки в файле app/build.gradle .
Таким образом мы удаляет все ресурсы, за исключением французской и английской локали: это позволяет не только избежать загрязнения ресурсов, но и снизить размер APK-файла.
Измените файл app/build.gradle так, как показано выше, и перезапустите приложение:
Отлично. А если удалить французский язык из списка поддерживаемых?
Работает как ожидалось… за исключением одного случая.
«Один случай»
Давайте кое-что немного поменяем. Приведем список предпочитаемых языков к такому виду:
Теперь удалим папку resources/values-en из проекта и добавим новый файл values-es/strings.xml :
Итак, теперь у нас есть файл по умолчанию strings.xml (по-прежнему со строкой «App In Default Language»), его французская и испанская версии.
Удалим английский из списка поддерживаемых языков и добавим испанский:
Прежде чем запускать приложение, подумайте: на каком языке оно будет отображаться?
Если следовать той же логике, что и раньше, это должен быть испанский.
А теперь запустите приложение:
Черт побери… опять?! Мы же только что всё исправили! Или нет?
Поэкспериментировав несколько часов с таким поведением, я пришел к следующему заключению: где-то в кодовой базе Android предполагается, что ресурсы по умолчанию — на английском языке.
Это, на мой взгляд, неверно, но что уж поделаешь.
Выше я говорил, что resConfig удаляет ресурсы всех локалей, кроме объявленных… но я соврал: ресурсы по умолчанию resConfig НЕ УДАЛЯЕТ.
Итак, что у нас есть? В настройках пользователя английский указан как предпочитаемый язык. В пакете нашего приложения есть кое-какие строковые файлы по умолчанию (ведь они не были удалены), Android считает, что они на английском, и поэтому решает использовать файлы ресурсов по умолчанию.
Вывод № 1. Обязательно объявляйте языки, поддерживаемые в приложении, — с помощью resConfigs .
Вывод № 2. Если нужно, чтобы приложение поддерживало английский язык, файлы ресурсов по умолчанию должны быть на английском: Android рассчитывает на такое положение дел, поэтому так у вас будет меньше головной боли.
(Если вам английский в приложении не нужен, пропустите второй вывод.)
Проблема № 2. Как узнать текущую локаль приложения?
Казалось бы, найти ответ на такой вопрос должно быть легко, но, к сожалению, это не так: погуглив, вы увидите, что на StackOverflow об этом спрашивали, и не раз.
Причем там есть несколько вводящих в заблуждение ответов, например:
О каждом из этих методов я расскажу подробнее. Но прежде проясним кое-что очевидное, что путают советчики на StackOverflow:
Язык устройства != язык приложения
Первое — это язык, выбранный пользователем в настройках устройства. Второе — это язык, который Android решил использовать для конкретного приложения.
Узнать значение для языка устройства легко:
Итак, с языком устройства мы разобрались — перейдем к языку приложения. К сожалению, официального способа узнать локаль приложения во время выполнения, гарантированно не наткнувшись на ошибку, не существует.
Еще раз: не существует официального способа надежным образом узнать язык приложения во время выполнения.
Почему? Рассмотрим два случая:
Случай 1. Android нашел соответствующий файл «strings.xml» и использует его.
Случай 2. Android не нашел соответствующий файл «strings.xml» и использует файл по умолчанию.
В первом случае следующий код всегда будет возвращать правильное значение:
[[[[ НАЧАЛО БОЛЬШОГО ПРИМЕЧАНИЯ. Ребята на StackOverflow предлагают использовать Locale.getDefault() . Чем это отличается от только что описанного способа?
Я рекомендую почитать документацию по классу Locale. Если вкратце, то Locale.getDefault() используется для целей самой JVM: некоторые операции зависят от локали (например, выбор формата дат), и если не указать для них язык, JVM будет использовать значение, получаемое методом Locale.getDefault() .
Но самое главное отличие в том, что Locale.getDefault() определяется во время запуска приложения, и единственный способ изменить это значение — вызвать Locale.setDefault(новаяЛокаль) самостоятельно. Другими словами, если пользователь изменит настройки языка по умолчанию во время работы приложения, то Locale.getDefault() всё равно будет возвращать значение, определенное во время запуска.
А вот метод getResources().getConfiguration().getLocales().get(0) всегда будет давать актуальное значение (если вы его не кешировали, конечно).
КОНЕЦ БОЛЬШОГО ПРИМЕЧАНИЯ ]]]]
Ладно. Это был первый случай. А что насчет второго?
К сожалению, для случая 2 получить текущую локаль приложения нельзя. Нет официального способа узнать, какой файл strings.xml используется системой Android: локализованный или по умолчанию. Если применить способ для случая 1, мы просто получим локаль устройства.
Еще раз: если у вас случай 2, то метод getResources().getConfiguration().getLocales.get(0) вернет вам локаль устройства, а не приложения.
Однако для решения этой задачи есть обходной путь: нужно добавить в каждый из файлов strings.xml специальную строку (допустим, это будет current_locale ). В испанской версии strings.xml будет current_locale = ‘es’ , в итальянской — current_locale = ‘it’ , в файле по умолчанию — current_locale = ‘en’ (смотрите второй вывод статьи). Теперь достаточно будет в коде приложения вызвать следующий метод: getString(R.strings.current_locale)
Вывод № 3. Получение текущей локали устройства: Resources.getSystem().getConfiguration().getLocales().get(0) . Если уровень API равен 23 или ниже: Resources.getSystem().getConfiguration().locale .
Вывод № 4. Не существует надежного официального способа получить текущую локаль стандартными методами. Но есть обходной путь — см. чуть выше.
Проблема № 3. Как получить список предпочитаемых языков устройства?
В руководствах по Android сказано, что для этого есть новый API — LocaleList (для Android API с уровня 24). Теоретически, при вызове LocaleList.getDefault() вы должны получить список предпочитаемых языков пользователя, заданный в настройках, и он не должен зависеть от приложения — по крайней мере, так говорится в руководствах…
Я поэкспериментировал с LocaleList.getDefault() и могу сказать, что этот метод не всегда возвращает список предпочитаемых языков точно как в настройках.
В каких случаях бывает несоответствие? Проиллюстрирую на примере: предположим, немецкий НЕ ВЫБРАН как предпочитаемый язык и ваше приложение его тоже не поддерживает. Сделаем так:
Каким-то образом в списке, возвращенном методом LocaleList.getDefault() , оказался немецкий… хотя ни телефон, ни приложение его не поддерживают. Смотрим документацию LocaleList.getDefault() :
«Результат обязательно включает в себя локаль по умолчанию, получаемую из Locale.getDefault(), но не обязательно в верхней части списка. Если локаль по умолчанию не вверху списка, это значит, что система установила в качестве ее одну из других предпочитаемых локалей пользователя, заключив, что основной вариант не поддерживается, но вторичный поддерживается.
Внимание: для API >= 24 список LocaleList по умолчанию изменится, если вызвать Locale.setDefault(). В этом методе это учитывается: проверяется вывод Locale.getDefault() и при необходимости пересчитывается список LocaleList по умолчанию.»
Чего-о-о? Я прочел это трижды и всё равно не понял.
Давайте лучше я сам расскажу, как получить список предпочитаемых локалей на устройстве — и это будет последний вывод статьи.
Вывод № 5. Получение списка предпочитаемых локалей устройства (заданных в настройках): Resources.getSystem().getConfiguration().getLocales() . Это применимо только в API уровня 24 и выше: раньше в качестве предпочитаемого пользователь мог выбрать только один язык.
Заключение
В документации (а также в кодовой базе) Android не учитываются многие варианты использования локализации, и это может быть неприятно, поскольку разработчикам приходится учитывать крайние случаи, и делается это не всегда удобным и логичным образом.
Надеюсь, в этой статье мне удалось объяснить, как Android работает с локализацией, и какой API лучше выбрать для конкретного случая.
О переводчике
Перевод статьи выполнен в Alconost.
Alconost занимается локализацией игр, приложений и сайтов на 70 языков. Переводчики-носители языка, лингвистическое тестирование, облачная платформа с API, непрерывная локализация, менеджеры проектов 24/7, любые форматы строковых ресурсов.
Мы также делаем рекламные и обучающие видеоролики — для сайтов, продающие, имиджевые, рекламные, обучающие, тизеры, эксплейнеры, трейлеры для Google Play и App Store.
Источник