В данной статье речь пойдёт о том как добавить в своё приложение поддержку нескольких языков в зависимости от конфигураций системы пользователя и выбранного языка в настройках.
Почитал я про разные способы, как люди адаптируют приложение для поддержки нескольких локалей и честно говоря меня все эти способы слегка смутил. Проверять установленный язык в системе и по условию выставлять определенные слова во всём приложении та еще затея. Теперь же это всё можно реализовать нативным способом благодаря 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. Таким образом мы можем добавить поддержку множества языков в нашем приложении.
Поправлю немного android:text="@+string/test" после значка @ плюс ставить не нужно, с плюсом не работает, должно быть так
ОтветитьУдалитьandroid:text="@string/test"
Спасибо за поправку. Статья писалась ещё несколько месяцев назад. И в "тогдашней бетке" была обратная ситуация. Плюс этот означает что если нет такой строки то её необходимо добавить автоматически. Позже видать починили. На днях , когда заканчивал оформлять заметил это , но в итоге забыл поправить.
УдалитьДумаю что этот текст лучше немного поправить:
ОтветитьУдалить"Из параметра text необходимо удалить весь текст".
А то получается недвусмысленность, или удалить параметр из "main.xml", или удалить текст из параметра text.
Немного каламбурчик, но зато понятно.