Чтобы перевести локализации приложения для Mac туда и обратно, экспортируйте каталог локализаций Xcode, сохраните структуру форм множественного числа и сопоставления аргументов, затем импортируйте возвращённый пакет и протестируйте его. В этом руководстве на примере условной подписи выбора показано, что именно нужно передать и проверить.
Эта задача предназначена для тех, кто готовит материалы для переводчиков в Xcode на Mac: нужно отправить на перевод одно сообщение, зависящее от количества, и получить его обратно, сохранив исходное поведение. Пример подписи: Selected 3 tiles in 2 groups. Оба числа могут меняться независимо друг от друга, поэтому в материалах для перевода важно сохранить не только читаемый текст.
Определите требования к сообщению до экспорта
Рассматривайте требования к сообщению как краткую спецификацию: какую запись ищет приложение, какие значения оно передаёт во время выполнения и какие значения влияют на грамматические формы. В документации Apple указано, что String.LocalizationValue поддерживает локализуемые строки с интерполяцией, в том числе со значениями, передаваемыми во время выполнения. Там также описано, как использовать статический ключ и отдельное значение по умолчанию, если идентификатор должен отличаться от отображаемого исходного текста. String.LocalizationValue
Для этого примера запишите следующие требования рядом с запросом на перевод. Это иллюстративные требования к условной подписи, а не формат файла Apple.
| Элемент требований | Требование для этого примера |
|---|---|
| Назначение сообщения | Кратко описать текущий выбор |
| Исходный текст на английском | Selected 3 tiles in 2 groups.; оба числа передаются во время выполнения |
| Аргумент 1 | Количество плиток; определяет форму слова tile |
| Аргумент 2 | Количество групп; определяет форму слова group |
| Числовое представление | Сохранить тип и спецификатор формата, записанные Xcode для каждого аргумента |
| Свобода перевода | Менять порядок слов в предложении, сохраняя значение каждого аргумента |
| Требуемое поведение | Каждое существительное согласуется со своим числом |
Также запишите фактические каталог, таблицу и ключ из проекта. Не придумывайте замену ключа во время перевода. В руководстве Apple по подготовке к переводу объясняется, что локализуемые API заполняют каталоги при сборке и что параметр table или tableName выбирает каталог. Там также описана поддержка комментариев с пояснением контекста строки. Preparing your app’s text for translation
Полезный условный комментарий: Краткое описание выбора. Аргумент 1 — количество выбранных плиток. Аргумент 2 — количество групп, содержащих эти плитки. Оба значения могут меняться независимо. Связывайте каждое число с соответствующим существительным. Это поможет переводчику различать два аргумента, даже если для них используется один числовой тип.
Подготовьте в каталоге независимые варианты форм множественного числа
Сначала добавьте сообщение в локализуемый исходный код приложения, затем соберите проект. В редакторе каталога строк щёлкните нужный ключ, удерживая Control, и выберите Vary by Plural. По документации Apple, Xcode определяет спецификатор формата интерполяции, добавляет формы множественного числа для языка и сначала заполняет поля вариантов существующим значением. Эти предварительно заполненные значения всё равно нужно отредактировать. Localizing and varying text with a string catalog
Для исходного английского текста ожидаемый результат включает строки Selected 1 tile in 1 group., Selected 3 tiles in 1 group. и Selected 1 tile in 2 groups. Одного выбора, зависящего только от количества плиток, недостаточно, чтобы правильно обработать все сочетания.
В демонстрации Apple каталога строк показано, как варьировать несколько аргументов с помощью подстановок. Каждая подстановка содержит варианты форм множественного числа, а её инспектор показывает позицию аргумента и спецификатор формата в стиле C. Во время выполнения приложение объединяет выбранные подстановки с окружающим сообщением. Discover String Catalogs
Используйте этот механизм для двух независимых значений. Слова, которые должны согласовываться с числом, помещайте внутрь соответствующего варианта, а не оставляйте неизменяемое существительное в предложении. Если редактор позволяет, присвойте подстановкам понятные имена, затем проверьте сопоставления: для подстановки плиток должен использоваться аргумент 1, а для подстановки групп — аргумент 2.
Не требуйте, чтобы в каждой целевой локализации повторялся набор вариантов английского языка. В документации Apple указано, что Xcode добавляет варианты форм множественного числа, специфичные для языка. Добавление вариантов в исходную локализацию также распространяет их на переводы; добавление вариантов только в другой локализации влияет лишь на неё. Перед экспортом проверьте фактические варианты целевого языка. Localizing and varying text with a string catalog
Сохраняйте соответствие аргументов при изменении порядка слов
Положение заполнителя в предложении и номер аргумента выполняют разные функции. Переводчику может понадобиться поставить количество групп перед количеством плиток, не меняя порядок, в котором приложение передаёт эти значения.
В справочнике Apple по спецификаторам формата описана позиционная запись с использованием n$. Например, %1$lld обозначает аргумент 1 с преобразованием целого числа long long, а %2$lld — аргумент 2 с таким же преобразованием. %d обозначает другое представление целого числа; это не сокращённая запись %lld. Справочник устаревший, поэтому используйте его для этих устоявшихся правил форматирования вместе с текущим процессом работы с каталогами. String Format Specifiers
Рассмотрим иллюстративный фрагмент формата Groups: %2$lld; tiles: %1$lld. Если аргумент 1 равен 3, а аргумент 2 равен 2, ожидаемый результат — Groups: 2; tiles: 3. Этот фрагмент демонстрирует только порядок аргументов; он не реализует грамматический выбор формы множественного числа и не должен заменять подстановки каталога.
Проверяйте заполнители по смыслу, индексу и типу. Проверка лишь на наличие двух знаков процента не выявит перепутанные числа. Проверка только типов тоже не обнаружит перестановку, поскольку оба значения — целые числа. И наоборот, изменение порядка передачи аргументов в приложении ради соответствия одному переводу изменит требования для всех остальных переводов, использующих эту запись.
В задании для переводчика попросите сохранить связи экспортированных аргументов и типы форматирования, адаптируя при этом формулировку. Структурное изменение подстановки требует отдельной проверки на соответствие заданным требованиям. Изменение порядка слов может быть вполне уместным.
Экспортируйте пакет, который переводчик сможет вернуть
Перед экспортом включите в настройках сборки проекта Use Compiler to Extract Swift Strings, чтобы в него попали локализуемые строки Swift. Выберите проект в навигаторе проекта, затем Product > Export Localizations, укажите нужные локализации и папку назначения и выполните экспорт. В документации Apple описаны эти действия и получаемый пакет .xcloc. Exporting localizations
У двух расширений каталога разные назначения. Файл .xcstrings проекта содержит каталог строк. Экспортированный пакет .xcloc предназначен для передачи переводчику: его папка Localized Contents содержит XLIFF, а в папке Notes можно разместить пояснительные материалы. Передавайте пакет вместе с примечанием о требованиях, а не сводите сообщение к списку видимых предложений в двух столбцах. Exporting localizations
Убедитесь, что инструмент перевода поддерживает варианты каталога строк в XLIFF. Apple объясняет, что идентификаторы вариантов, созданные из каталога, кодируют ключ строки и конфигурацию вариантов, и описывает настройку Localization Prefers String Catalogs, которая задаёт такое представление при экспорте. Эти структуры необходимо сохранить при обратной передаче. Discover String Catalogs
При подготовке материалов используйте этот практический список. Это рекомендация по процессу, основанная на документированной структуре пакета и требованиях примера.
- Верните переведённый пакет
.xcloc, сохранив нужные ресурсы. - Сохраните идентификаторы сообщений и пути вариантов, если только запланированное структурное изменение не задокументировано.
- Заполните целевой текст для обязательных вариантов форм множественного числа в локализации целевого языка.
- Сохраните идентификаторы аргументов, числовые типы и сопоставления подстановок.
- Укажите все изменения исходного текста, полученные после экспорта, чтобы согласовать их до импорта.
Если инструмент переводчика не сохраняет варианты записей, отредактируйте экспортированную локализацию в Xcode или внесите переводы в каталог проекта. Apple описывает редактирование целевых текстов XLIFF и каталогов строк в Xcode; последующие экспорты будут включать изменения каталога. При обмене только обычным текстом кому-то придётся восстанавливать структуру вариантов вручную. Editing XLIFF and string catalog files
Импортируйте результат и проверьте фактические изменения
Сохраните исходный экспорт для сравнения. Когда вернётся переведённый пакет, выберите проект и выполните Product > Import Localizations. Укажите папку каталога локализаций Xcode. В интерфейсе импорта просмотрите предупреждения и ошибки в Issues View, а изменения — в File View до завершения импорта. Apple сообщает, что в редакторе сравнения импортируемая версия отображается слева, а текущая версия проекта — справа. Importing localizations
Для строк, полученных из каталога, Apple описывает импорт переводов обратно в соответствующий каталог строк. После импорта снова откройте запись с кратким описанием выбора и проверьте обе подстановки, их сопоставления с аргументами и варианты целевого языка. Discover String Catalogs
Если что-то выглядит неверно, выполните последовательную диагностику. Если запись отсутствует, сравните её таблицу и ключ с исходным экспортом. Если отсутствуют варианты форм множественного числа, сравните структуру вариантов в возвращённом пакете. Если числа стоят рядом с неверными существительными, проверьте сопоставления аргументов. Если неверно читается только одно сочетание, проверьте текст соответствующего варианта, прежде чем менять код приложения. Эта последовательность учитывает зависимости примера; она не означает, что Xcode автоматически обнаруживает все нарушения требований.
Проверяйте неравные значения, чтобы выявить перепутанные аргументы
Успешный импорт означает, что Xcode принял материалы. Но поведение примера всё равно нужно проверить. Используйте тестовые данные приложения или тестовый набор для разработки, чтобы вывести следующие сочетания. Ожидаемые предложения показывают требования к исходному английскому тексту; формулировки и выбор вариантов в целевом языке должны соответствовать его локализации.
| Количество плиток | Количество групп | Ожидаемый результат для английского исходного текста | Что помогает выявить |
|---|---|---|---|
| 1 | 1 | Selected 1 tile in 1 group. |
Обе формы единственного числа |
| 3 | 1 | Selected 3 tiles in 1 group. |
Независимое изменение формы слова «плитка» |
| 1 | 2 | Selected 1 tile in 2 groups. |
Независимое изменение формы слова «группа» |
| 3 | 2 | Selected 3 tiles in 2 groups. |
Неравные значения, позволяющие выявить перестановку аргументов |
Добавьте проверку нулевого количества, если приложение может отображать пустой выбор. Также выберите значения, которые охватывают все категории множественного числа, необходимые для каждой целевой локализации. В четырёх строках выше представлены сочетания единственного и множественного числа в английском языке, но не все возможные варианты целевых языков.
Чтобы запустить приложение для Mac на целевом языке, выберите Product > Scheme > Edit Scheme, укажите Run и откройте Options. Задайте App Language и, при необходимости, App Region, закройте редактор, выберите среду запуска Mac и запустите приложение. В документации Apple описан этот способ проверки локализаций через схему. Testing localizations when running your app
Прочитайте выведенное сообщение и проверьте, как оно помещается в интерфейсе рабочего стола. Если числа связаны с правильными существительными, каждый нужный вариант работает, а полученная структура соответствует заданным требованиям, значит перевод этого ярлыка туда и обратно сохранил необходимое поведение. Сохраните примечание с требованиями вместе с материалами, чтобы при следующем изменении формулировки её можно было проверить по тем же явным условиям.
Источники
- String.LocalizationValue — Apple
- Preparing your app’s text for translation — Apple
- Localizing and varying text with a string catalog — Apple
- Discover String Catalogs — Apple
- String Format Specifiers — Apple
- Exporting localizations — Apple
- Editing XLIFF and string catalog files — Apple
- Importing localizations — Apple
- Testing localizations when running your app — Apple