Чтобы завершить работу над меткой Mac-приложения с формами множественного числа, добавьте варианты множественного числа в Xcode, заполните все категории, необходимые для каждой поддерживаемой локализации, и проверьте отображаемый результат. В этом руководстве используется условное сообщение о выборе элементов.

Задача — завершить одну метку в приложении SwiftUI для Mac, форма которой зависит от количества. Сообщение сообщает, сколько элементов выбрано, принимает неотрицательное целое число и сохраняет этот смысл в переводах. Этот процесс объединяет проверку категорий, заполнителей и результатов во время выполнения, чтобы для заполненной записи каталога был установлен ясный критерий приемки.

Что требуется для полного охвата форм множественного числа?

Apple рекомендует использовать каталоги строк для локализации форм множественного числа в Xcode 15 и более поздних версиях. В документации Apple по формам множественного числа различаются обязательный запасной вариант и полнота грамматического охвата: other обязателен в словаре строк, но отсутствие дополнительных языковых категорий может привести к грамматическим ошибкам. Для английского обязательны one и other; категория zero необязательна. Локализация строк с формами множественного числа.

Возможные названия категорий: zero, one, two, few, many и other. Они обозначают грамматические группы, зависящие от языка, а не шесть числовых диапазонов, общих для всех языков. Категорию one не следует превращать в универсальное правило приложения, которое проверяет только, равно ли количество единице. Unicode определяет категории через изменения, которые числа вызывают во фразе, включая изменения не только самого существительного. Правила образования форм множественного числа.

Для этой задачи используйте следующий контракт сообщения. Это пример требований приложения, а не требования Apple.

Поле контракта Требование в этом примере
Ключ сообщения selection.count
Значение по умолчанию для английского \(count) items selected
Входные данные Одно неотрицательное значение Swift Int с именем count
Значение Количество выбранных в данный момент элементов
Выходные данные Одна полная локализованная метка, содержащая количество
Охват Все поддерживаемые локализации, включая исходную
Критерии приемки Заполнены обязательные категории, подстановка числа сохранена, проверены типичные варианты вывода

Для этой метки выбрано требование отображать число. Apple допускает варианты множественного числа, в которых число записывается словами или в которых отсутствует числовой спецификатор формата. Для другого контракта сообщения это могло бы быть допустимо. Здесь отображение количества упрощает сопоставление метки с описываемым ею выбором. Локализация строк с формами множественного числа.

Свяжите сообщение Swift с каталогом

String.LocalizationValue в Swift поддерживает локализуемый текст с интерполяцией во время выполнения. Если стабильный идентификатор должен отличаться от исходного английского текста, Apple рекомендует использовать инициализатор String с отдельным defaultValue. Для selection.count это подходит: идентификатор задаёт имя сообщения, а значение по умолчанию содержит английский текст. String.LocalizationValue.

Для небольшого тестового приложения создайте в Xcode 15 или более поздней версии проект приложения для macOS на базе SwiftUI с минимальной версией macOS 12. Замените сгенерированный файл точки входа приложения приведённой ниже программой; в целевом объекте должна остаться только одна декларация @main. Перед выполнением инструкций по каталогу добавьте Localizable.xcstrings в цель приложения. Для программы нужны Xcode и SDK macOS; в этой исследовательской среде она не компилировалась.

import Foundation
import SwiftUI

@main
struct PluralSampleApp: App {
    var body: some Scene {
        WindowGroup {
            PluralSampleView()
        }
    }
}

struct PluralSampleView: View {
    @State private var count: Int = 1

    private let samples: [Int] = [
        0, 1, 2, 3, 4, 5, 10, 11, 12,
        20, 21, 22, 100, 101, 102, 1_000_000
    ]

    private var selectionLabel: String {
        String(
            localized: "selection.count",
            defaultValue: "\(count) items selected",
            comment: "Selection summary. The integer is the number of selected items. Keep the count visible in every plural variant."
        )
    }

    var body: some View {
        VStack(alignment: .leading, spacing: 16) {
            Picker("Sample count", selection: $count) {
                ForEach(samples, id: \.self) { value in
                    Text(verbatim: String(value)).tag(value)
                }
            }

            Text(verbatim: selectionLabel)
        }
        .padding(24)
        .frame(minWidth: 360)
    }
}

Элементы числового переключателя служат тестовыми входными данными. Локализованная сводка формируется с помощью String(localized:defaultValue:comment:), а затем отображается как итоговая строка. Согласно документации Apple, первый аргумент инициализатора задаёт ключ поиска, значение по умолчанию — исходный текст, а комментарии дают контекст для перевода. При сборке Xcode извлекает строки, переданные через локализуемые API. Подготовка текста приложения к переводу.

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

Заполните категории для каждой поддерживаемой локализации

Создайте структуру вариантов в редакторе Xcode:

  1. Выберите Product > Build, чтобы заполнить каталог.
  2. Откройте Localizable.xcstrings и выберите исходную локализацию.
  3. Щёлкните по selection.count при нажатой клавише Control и выберите Vary by Plural.
  4. Заполните каждый вариант для исходного языка.
  5. Добавьте поддерживаемые локализации кнопкой Add на боковой панели, затем заполните их варианты.

Xcode добавляет формы множественного числа, специфичные для языка, и определяет спецификатор формата интерполяции. Добавление вариации множественного числа для исходной локализации сохраняет синхронность структуры вариантов между языками; если применить её только к другой локализации, она затронет только эту локализацию. Локализация и варьирование текста с помощью каталога строк.

Для этой целочисленной интерполяции английские записи могут выглядеть так:

Английская категория Значение в каталоге
one %lld item selected
other %lld items selected

Для фактического типа интерполяции используйте спецификатор, который сгенерировал Xcode. В документированном примере Apple с целым числом используется %lld; подстановка другого заполнителя в перевод может нарушить контракт аргумента. Изначально Xcode заполняет поля вариантов значением ключа, поэтому проверьте формулировку в каждом поле. Локализация и варьирование текста с помощью каталога строк.

Составьте таблицу охвата, добавив по строке для каждого фактического идентификатора локализации. Запишите категории, которые Xcode создаёт для этого сообщения, отметьте, для каких из них готов текст, и укажите входные данные для тестирования. Реальные идентификаторы проекта не позволят общему названию языка скрыть локализацию, которую ещё не проверили.

Не копируйте набор английских категорий в каждую строку. Также не требуйте повсюду все шесть категорий. Используйте созданную каталогом структуру, а затем при выборе тестовых входных данных сверяйтесь с правилами образования количественных форм множественного числа для нужного языка. Количественные правила относятся к количеству, а порядковые — к позиции и отвечают на другой вопрос. В стандартах Unicode эти типы правил описаны отдельно. Технический стандарт Unicode № 35: числа.

Отдельно проверьте структуру, заполнители и отображаемый текст

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

Проверьте охват категорий

Для каждой строки таблицы сравните ожидаемые категории с заполненными записями каталога. Убедитесь, что other существует и ни одна ожидаемая категория не содержит пустого значения или незавершённой копии исходного текста.

Для простой проверки полноты определите ожидаемый набор как категории, созданные для этой локализации, плюс любые намеренно поддерживаемые переопределения. Множество отсутствующих категорий — это ожидаемый набор за вычетом категорий с готовым текстом. Если отсутствует хотя бы одна категория, по критериям приемки этой статьи сообщение ещё не завершено. Это практический способ проверки, основанный на описанном процессе работы с вариантами, а не утверждение, что Xcode требует именно такой проверки.

Если у двух категорий могут быть одинаковые формулировки, оставьте нужные формулировки и проверьте обе записи. Цель — сохранить смысл сообщения во всех необходимых категориях; не обязательно, чтобы каждая пара строк визуально различалась.

Проверьте подстановку числа

Соберите проект и проверьте диагностику каталога. Apple описывает проверку каталогов строк на распространённые ошибки, например несовпадение спецификаторов формата. Устраните такие ошибки, а затем убедитесь, что в каждом варианте по-прежнему выполняется требование этого сообщения отображать количество. Создание приложений с поддержкой нескольких языков.

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

Проверьте типичные значения в приложении для Mac

Выберите Product > Scheme > Edit Scheme, затем Run и откройте Options. Установите App Language и подходящий App Region, закройте диалоговое окно и запустите приложение для Mac. Повторите для каждой поддерживаемой локализации. Apple описывает эту процедуру тестирования локализованного вывода с помощью схемы. Тестирование локализаций при запуске приложения.

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

Вариант тестирования Что проверяется
0, 1 и 2 Пустой выбор, выбор одного элемента и небольшой выбор нескольких элементов
Не менее одного типичного значения для каждой обязательной категории Охват грамматических различий локализации
Значения по обе стороны значимых границ правил Смена категорий при увеличении количества за пределами самых малых значений
Большое допустимое значение Подстановка числа и доступное место для метки
Каждое проверяемое значение Смысл, полнота формулировки и отображение количества

Правила Unicode связывают категории с условиями и примерами значений; значение могут иметь и числовые детали, включая количество дробных разрядов. Этот контракт принимает только целые числа. Если приложение начнёт принимать дробные значения, одновременно пересмотрите интерполяцию, исходный текст и тесты, а не полагайте, что результаты для целых чисел по-прежнему обеспечивают полный охват. Технический стандарт Unicode № 35: числа.

Разберитесь с неожиданным результатом

Выберите, что проверить дальше, по наблюдаемому симптому:

Симптом Следующее действие
selection.count отсутствует в каталоге Ещё раз выполните сборку и проверьте локализуемый вызов и выбранную таблицу
Варианты множественного числа есть только для одной локализации Проверьте, где применена команда Vary by Plural
Вариант по-прежнему содержит английскую форму множественного числа Проверьте предварительно заполненное поле и добавьте готовый перевод
Отображаемое число отсутствует или искажено Сравните заполнитель варианта со спецификатором, созданным Xcode, и контрактом сообщения
Для большего количества используется неожиданная формулировка Проверьте правила категорий этой локализации и добавьте типичный тест
Правильный текст не помещается Измените представление и повторно проверьте метку целиком

В старом проекте с версией Xcode до 15 Apple рекомендует использовать ресурсы .strings и .stringsdict. Словарь форм множественного числа содержит языковые варианты и требует other; при этом всё равно нужно заполнить остальные категории, необходимые для правильной грамматики. Локализация строк с формами множественного числа.

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

Источники