Задумывались ли вы когда-нибудь, зачем нужен файл .stringsdict?

Приходилось ли вам сталкиваться с грамматическими правилами для множественного числа в приложениях для iOS?

Если вы ответили утвердительно на любой из этих вопросов или вам просто интересно узнать что-то новое о локализации в Swift, то эта статья для вас. Здесь я постараюсь объяснить, чем полезен этот мощный инструмент, предоставленный нам компанией Apple.

Пример: локализация строки с тремя состояниями множественного числа

Постараемся сделать всё просто и понятно. В этом примере у нас будет приложение, которое позволяет выбирать «волшебные города» Мексики и удалять их (реализация удаления в статью не входит). Приложение содержит таблицу с городами и позволяет перейти в режим редактирования, выбрать города вручную (или все сразу) и с помощью элемента на панели инструментов удалить их. Перед удалением показывается предупреждение с текстом, который нам нужно локализовать, — просто подтверждение действия. Итак, что это за приложение будет, разобрались. Теперь мы можем предсказать сценарии, с которыми нам предстоит столкнуться (если мы имеем дело с английским языком):

  1. Перед удалением не выбран ни один город.

    1-й сценарий
    1-й сценарий

 2. Выбран только один город. 

2-й сценарий
2-й сценарий

3. Выбрано несколько городов (два и более).

3-й сценарий
3-й сценарий

Решить эту задачу можно различными способами, и один из самых распространенных — использовать пару операторов if/else.

Операторы if/else
Операторы if/else

На сцену выходит .stringsdict

Использовать в этом случае условные операторы — вполне нормально, но если мы планируем поддерживать несколько языков, у нас могут возникнуть сложности из-за различий в правилах грамматики. И здесь на помощь приходит файл .stringsdict, который представляет собой список свойств и позволяет добавлять различные правила для локализованных текстов. Изменяя значения словаря этого файла, можно задать конкретные правила для пустых значений (в нашем случае — городов), одного или нескольких значений и т. д. Вернемся к приложению и внесем изменения, которые позволят использовать .stringsdict.

Во-первых, добавим новый файл типа .stringsdict.

Создание файла .stringsdict
Создание файла .stringsdict

По умолчанию у этого файла следующая структура

Реализация по умолчанию
Реализация по умолчанию

Localized String Key — строковое значение для локализации, как если бы оно было указано в файле .strings.

Localized Format Key — значение, указывающее имя словаря с применяемыми правилами; перед значением строки должно быть %#@, после — @. На изображении выше значение строки — VARIABLE.

VARIABLE — мы создали эту строку в предыдущем ключе, и теперь будем использовать этот словарь для применения правил. Первый ключ внутри словаря (NSStringFormatSpecTypeKey) оставим как есть: он говорит о том, что мы указываем языковые правила. Второй ключ (NSStringFormatValueTypeKey) описывает формат строки, и буква d означает, что в локализованной строке для переменной %d мы будем использовать десятичные числа. Наконец, нам нужно найти ключи для представления правил единственного и множественного числа в текстах. Для английского нужно указать ключ только для правил «one» и «other». (Можно указать ключ для «zero», но это необязательно.) Добавив соответствующие значения, мы получим что-то такое:

Наша реализация
Наша реализация

Теперь приложение готово обрабатывать три состояния в этом файле. Поэтому удалим операторы if/else и напишем следующее:

Код после использования файла .stringsdict
Код после использования файла .stringsdict

Не забывайте, что грамматические правила формирования множественного числа зависят от языка. Например, в арабском языке есть разные формы множественного числа для категорий «zero», «one», «two», «few», «many» и «other» (в русском — для «one», «few», «many» и «other»), поэтому, если вы собираетесь поддерживать несколько языков, нужно аккуратно учесть эти правила.

В завершение статьи добавим поддержку нового языка. В примере мы используем мексиканские города, поэтому, думаю, было бы неплохо добавить в приложение испанский язык.

Исходный код — здесь: https://github.com/JAIRMG/StringsDictExample


О переводчике

Перевод статьи выполнен в Alconost.

Alconost занимается локализацией игр, приложений и сайтов на 70 языков. Переводчики-носители языка, лингвистическое тестирование, облачная платформа с API, непрерывная локализация, менеджеры проектов 24/7, любые форматы строковых ресурсов.

Мы также делаем рекламные и обучающие видеоролики — для сайтов, продающие, имиджевые, рекламные, обучающие, тизеры, эксплейнеры, трейлеры для Google Play и App Store.

Комментарии (3)


  1. pqbd
    29.09.2021 15:15

    почему всегда примеры делают как кружок-кружок-дорисовываем сову?


    Выбрали бы не очень простую логику:


    в русском — для «one», «few», «many» и «other»

    одна статья
    две статьи
    пять статей
    двадцать одна статья… сто восемьдесят одна статья


    один стул
    сто один стул


    1. alconost Автор
      29.09.2021 16:27

      Автор перечисляет формы множественного числа в русском языке согласно CLDR Common Locale Data Repository (Общий репозиторий языковых данных).

      Для статьи и стула из вашего примера нужно создать разные словари.


      1. Florelit
        29.09.2021 16:43

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