суббота, 9 октября 2021 г.

Поддержка нескольких языков в приложении . Sketchware pro

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

Почитал я про разные способы, как люди адаптируют приложение для поддержки нескольких локалей и честно говоря меня все эти способы слегка смутил. Проверять установленный язык в системе и по условию выставлять определенные слова во всём приложении та еще затея. Теперь же это всё можно реализовать нативным способом благодаря pro модификации sketchware, так как нам доступны внутренние каталоги, в которых можно расположить ресурсы приложения. В чём же плюс данного подхода ? Дело в том что в программировании под Android, да собственно и во многих других, принято держать строковые ресурсы отдельно от исходного кода. Этот метод более лаконичен и удобен в том случае если разработчику в дальнейшем например часто будет необходимо вносить изменения/исправления в строках. Так же несомненным плюсом можно считать то что android умеет автоматически выбирать данные из древа ресурсов, содержащих разные значения в зависимости от конфигурации системы и выбранного языка. Другими словами , если мы таким способом добавим, например, английскую локализацию то пользователю не нужно будет лезть в настройки , переключать язык в приложении. Программа при запуске уже будет на английском.
Итак приступим к реализации. Создаем новый проект. Добавим Textview на главный экран. В свойствах объекта text обязательно убираем весь текст, иначе получим ошибку "дубликата атрибутов" в дальнейшем.  В меню нас интересует раздел "Resource". 

раздел Resource

 

Изначально, стандартный проект, включает в себя несколько директорий. Каждая из них служит для хранения определенных разметок, ресурсов проекта. Строковые ресурсы обычно принято хранить в папке value. Заходим в папку и создаем в ней файл string.xml. Вносим необходимые нам данные указывая тип содержания - string и его название - id по которому мы будем обращаться к нужной нам строке. Все это заключим в тег

<?xml version="1.0" encoding="utf-8"?>

<resources>

    <string name="hello">hello world</string>

    </resources>

Разметка в папке value будет использоваться в приложении по умолчанию, для того чтобы добавить ресурсы для других локалей нам необходимо создать дополнительные директории с определенным "индетификатором" в названиии. Для каждого языка свой. Так например для английского языка это "en" для русского языка это "ru". Добавим поддержку английского языка в нашем приложении. Создадим в корне директории resource папку с названием "value-en". В ней создаем файл string.xml с идентичной разметкой что и в value, подобно тому что мы создавали ранее, меняя только содержимое строки , теперь на английском языке. Ну и проделаем то же самое с русской локализацией (value-en)

директории для разных локалей


Мы подготовили все необходимое для локализации нашего приложение. Далее вопрос - "как нам это все использовать?". Нам нужно объяснить нашему textview использовать в качестве содержимого наши строки из value. Жмем на добавленный нами элемент textview >> inject и прописываем туда строку - android:text="@string/hello". Где указываем что передаем строку с определенным идентификатором (который мы указали в нашей разметке). 


берем строку из разметки

 

Все готово. Сохраняем и запускаем проект. Теперь если в настройках смартфона мы переключим язык системы на английский то, при запуске нашего приложения, textview будет принимать строку из файла value-en/string.xml. Таким образом мы можем добавить поддержку множества языков в нашем приложении.
 


3 комментария:

  1. Поправлю немного android:text="@+string/test" после значка @ плюс ставить не нужно, с плюсом не работает, должно быть так
    android:text="@string/test"

    ОтветитьУдалить
    Ответы
    1. Спасибо за поправку. Статья писалась ещё несколько месяцев назад. И в "тогдашней бетке" была обратная ситуация. Плюс этот означает что если нет такой строки то её необходимо добавить автоматически. Позже видать починили. На днях , когда заканчивал оформлять заметил это , но в итоге забыл поправить.

      Удалить
  2. Думаю что этот текст лучше немного поправить:
    "Из параметра text необходимо удалить весь текст".
    А то получается недвусмысленность, или удалить параметр из "main.xml", или удалить текст из параметра text.
    Немного каламбурчик, но зато понятно.

    ОтветитьУдалить