Важно (9.07.22)

Если картинки в постах не отображаются, зайдите в блог через прокси. РКН заблокировал поддомены blogger.com на которые загружались картинки.

пятница, 29 апреля 2016 г.

Автоматическая смена названия приложения в зависимости от языка системы

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


Начнём…

Запускаем студию, создаём новый проект. Проект автоматически получит название ProjectX (где Х – это число), изменить можно в Project Manager, это же название будет отображаться после установки приложения на устройство.



Мы знаем, чтобы изменить отображаемое название приложения, необходимо зайти в меню «Project->Options->Version Info» и там изменить свойство «label». Подробнее о свойствах можно почитать тут: Delphi XE5/XE6 - Project->Options->Version Info(Android)

Но, как вы понимаете, название будет всегда одинаковое. Т.е. если мы указали название на русском языке и приложение установил англичанин/француз/немец, то все они будут видеть русское название, что крайне неудобно.

Теперь-то мы и попробуем решить эту задачку.


Что необходимо запомнить:
  1. Название приложения для выбранного на устройстве языка будет выбираться автоматически
  2. Для каждого языка создаётся отдельная папка в ресурсах (Об этом, более подробно, я расскажу ниже).
  3. Если в ресурсах приложения не найден каталог с языком системы и нет общего каталога для всех языков, то будет отображаться название вашего проекта из Project Manager

С первым пунктом всё ясно, перейдём сразу ко второму.

У приложения есть папка «res\», в ней хранятся все ресурсы (иконки, стили, SplashScreen и т.д.) приложения.


Из неё понимаем, что Андроид поддерживает несколько квалификаторов для одного имени каталога. Квалификаторы пишутся через дефис после имени каталога. В нашем случае, квалификаторами будут двухбуквенные коды языка ISO 639-1. Также допускается указание региона через дефис после языка (подробнее читайте в справке по ссылке выше).

Примеры:
  •     en
  •     fr
  •     en-rUS
  •     fr-rFR
  •     fr-rCA

Теперь остаётся понять, как должна выглядеть структура папок для мульти-язычного приложения.


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

Остаётся дело за малым. Выбираем язык по умолчанию, я выбрал английский, и создаём каталоги для необходимых нам языков.

Создаём каталог «res» в корневой папке проекта и заполняем его такими каталогами и файлами.
  • res\values\strings.xml (Название для отсутствующих языков, в моём примере, на английском языке)
<?xml version="1.0" encoding="utf-8"?> 
<resources> 
  <string name="app_name">English lang</string> 
</resources>

  • res\values-ru\strings.xml (Русский язык)
<?xml version="1.0" encoding="utf-8"?> 
<resources> 
  <string name="app_name">Русский язык</string> 
</resources>

  • res\values-fr\strings.xml (Французский язык)
<?xml version="1.0" encoding="utf-8"?> 
<resources> 
  <string name="app_name">Français langue</string> 
</resources>


В итоге получится вот такая структура:


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

Задеплоили файлы:



Ну и последний шаг. Забываем про «Project->Options->Version Info: label», т.к. теперь мы сами контролируем вывод названия.

Делаем сборку проекта через меню «Build» в Project Manager. После сборки, открываем файл «AndroidManifest.template.xml» из корневой папки проекта и …

Находим

%label%

Заменяем на

@string/app_name

Находим

%activityLabel%

Заменяем на

@string/app_name


Сохраняем файл.

Получится примерно так:



Компилируем на устройстве и тестим.

На видео, виден результат наших трудов, задачу мы полностью выполнили.



Спасибо за внимание. :)

Проект: Скачать с Google Drive

Скрины: