![](https://habrastorage.org/getpro/habr/upload_files/b62/1a4/493/b621a4493bd4cf20a6db62289bc5ad4f.png)
Задумывались ли вы когда-нибудь, зачем нужен файл .stringsdict
?
Приходилось ли вам сталкиваться с грамматическими правилами для множественного числа в приложениях для iOS?
Если вы ответили утвердительно на любой из этих вопросов или вам просто интересно узнать что-то новое о локализации в Swift, то эта статья для вас. Здесь я постараюсь объяснить, чем полезен этот мощный инструмент, предоставленный нам компанией Apple.
Пример: локализация строки с тремя состояниями множественного числа
Постараемся сделать всё просто и понятно. В этом примере у нас будет приложение, которое позволяет выбирать «волшебные города» Мексики и удалять их (реализация удаления в статью не входит). Приложение содержит таблицу с городами и позволяет перейти в режим редактирования, выбрать города вручную (или все сразу) и с помощью элемента на панели инструментов удалить их. Перед удалением показывается предупреждение с текстом, который нам нужно локализовать, — просто подтверждение действия. Итак, что это за приложение будет, разобрались. Теперь мы можем предсказать сценарии, с которыми нам предстоит столкнуться (если мы имеем дело с английским языком):
Перед удалением не выбран ни один город.
1-й сценарий
2. Выбран только один город.
![2-й сценарий 2-й сценарий](https://habrastorage.org/getpro/habr/upload_files/355/f9e/2ea/355f9e2eac1b80adefd6dbad71358216.png)
3. Выбрано несколько городов (два и более).
![3-й сценарий 3-й сценарий](https://habrastorage.org/getpro/habr/upload_files/d5d/021/ae8/d5d021ae87666d633917218e47ff25a8.png)
Решить эту задачу можно различными способами, и один из самых распространенных — использовать пару операторов if/else
.
![Операторы if/else Операторы if/else](https://habrastorage.org/getpro/habr/upload_files/32f/6d7/780/32f6d778017bd54d1d0e39838eb7ac6b.png)
На сцену выходит .stringsdict
Использовать в этом случае условные операторы — вполне нормально, но если мы планируем поддерживать несколько языков, у нас могут возникнуть сложности из-за различий в правилах грамматики. И здесь на помощь приходит файл .stringsdict
, который представляет собой список свойств и позволяет добавлять различные правила для локализованных текстов. Изменяя значения словаря этого файла, можно задать конкретные правила для пустых значений (в нашем случае — городов), одного или нескольких значений и т. д. Вернемся к приложению и внесем изменения, которые позволят использовать .stringsdict
.
Во-первых, добавим новый файл типа .stringsdict
.
![Создание файла .stringsdict Создание файла .stringsdict](https://habrastorage.org/getpro/habr/upload_files/d1d/57b/1a4/d1d57b1a495f106cc87e9b29b1d68ad3.png)
По умолчанию у этого файла следующая структура
![Реализация по умолчанию Реализация по умолчанию](https://habrastorage.org/getpro/habr/upload_files/6b7/155/012/6b715501241400bf9c439eafaed82d35.png)
Localized String Key — строковое значение для локализации, как если бы оно было указано в файле .strings
.
Localized Format Key — значение, указывающее имя словаря с применяемыми правилами; перед значением строки должно быть %#@
, после — @
. На изображении выше значение строки — VARIABLE.
VARIABLE — мы создали эту строку в предыдущем ключе, и теперь будем использовать этот словарь для применения правил. Первый ключ внутри словаря (NSStringFormatSpecTypeKey) оставим как есть: он говорит о том, что мы указываем языковые правила. Второй ключ (NSStringFormatValueTypeKey) описывает формат строки, и буква d
означает, что в локализованной строке для переменной %d
мы будем использовать десятичные числа. Наконец, нам нужно найти ключи для представления правил единственного и множественного числа в текстах. Для английского нужно указать ключ только для правил «one» и «other». (Можно указать ключ для «zero», но это необязательно.) Добавив соответствующие значения, мы получим что-то такое:
![Наша реализация Наша реализация](https://habrastorage.org/getpro/habr/upload_files/95f/e6f/ac4/95fe6fac4a5a6a9e1bf144ee5cb016af.png)
Теперь приложение готово обрабатывать три состояния в этом файле. Поэтому удалим операторы if/else
и напишем следующее:
![Код после использования файла .stringsdict Код после использования файла .stringsdict](https://habrastorage.org/getpro/habr/upload_files/589/68e/e6f/58968ee6fea2747ca916020e20f351e7.png)
Не забывайте, что грамматические правила формирования множественного числа зависят от языка. Например, в арабском языке есть разные формы множественного числа для категорий «zero», «one», «two», «few», «many» и «other» (в русском — для «one», «few», «many» и «other»), поэтому, если вы собираетесь поддерживать несколько языков, нужно аккуратно учесть эти правила.
В завершение статьи добавим поддержку нового языка. В примере мы используем мексиканские города, поэтому, думаю, было бы неплохо добавить в приложение испанский язык.
![](https://habrastorage.org/getpro/habr/upload_files/e36/59e/0d9/e3659e0d98a5319ea31b1c6d37e5c44d.png)
Исходный код — здесь: https://github.com/JAIRMG/StringsDictExample
О переводчике
Перевод статьи выполнен в Alconost.
Alconost занимается локализацией игр, приложений и сайтов на 70 языков. Переводчики-носители языка, лингвистическое тестирование, облачная платформа с API, непрерывная локализация, менеджеры проектов 24/7, любые форматы строковых ресурсов.
Мы также делаем рекламные и обучающие видеоролики — для сайтов, продающие, имиджевые, рекламные, обучающие, тизеры, эксплейнеры, трейлеры для Google Play и App Store.