paint-brush
Эволюция локализации в Swift: от строк к каталогам строкк@mniagolov
1,082 чтения
1,082 чтения

Эволюция локализации в Swift: от строк к каталогам строк

к Maksim Niagolov8m2024/06/12
Read on Terminal Reader

Слишком долго; Читать

Swift предлагает мощные инструменты для простой локализации приложений. В этом руководстве объясняется переход в локализации в Swift от ранних методов к новейшему инструменту, который поможет разработчикам в полной мере воспользоваться этими возможностями. Локализация улучшает пользовательский опыт, расширяет сферу его применения и может оказать большое влияние на успех программного обеспечения на международном уровне.
featured image - Эволюция локализации в Swift: от строк к каталогам строк
Maksim Niagolov HackerNoon profile picture

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


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


Ранние проблемы локализации

Изначально, когда Swift был впервые представлен, он унаследовал инфраструктуру локализации от Objective-C, которая была построена на основе файла Localizable.strings и функции NSLocalizedString . Таким образом, разработчикам приходилось вручную редактировать локализованные строки и синхронизировать их между разными языковыми файлами — процесс, который подвержен ошибкам и требует много времени.

Основы Localizable.strings

Локализуемый файл — это простой файл пары ключ-значение, в котором строки хранятся в формате «ключ» = «значение» , где «ключ» — это идентификатор кода, а «значение» — локализованная строка, которую увидит пользователь. Этот файл необходимо продублировать, перевести на каждый поддерживаемый язык и поместить в соответствующие каталоги «.lproj» , например «en.lproj» для английского языка и «de.lproj» для немецкого языка.

Пример записи Localizable.strings :

 "hello_world_key" = "Hello, World!";


В коде Swift эту строку можно получить как:

 let greeting = NSLocalizedString("hello_world_key", comment: "The default greeting")


Функция NSLocalizedString упрощает доступ к локализованному содержимому с помощью ключей из Localizable.strings .


Эта функция принимает ключ, предоставляет резервное значение и помещает комментарий для переводчиков. Комментарий имеет решающее значение, поскольку он дает переводчикам подтекст, позволяющий повысить точность и пригодность перевода.


Пример: Приветствие пользователя в зависимости от времени суток:

 func greetingBasedOnTime() -> String { let hour = Calendar.current.component(.hour, from: Date()) let key = hour < 12 ? "good_morning_key" : "good_evening_key" return NSLocalizedString(key, comment: "Greeting based on time of day") }


С соответствующим Localizable.strings записи будут выглядеть так:

 "good_morning_key" = "Good morning!"; "good_evening_key" = "Good evening!";


Вот некоторые проблемы с Localizable. строки, с которыми вы можете столкнуться:
1) Проблемы масштабируемости.

По мере роста количества строк становится все труднее с ними обращаться. Управление несколькими файлами .strings со временем становится затруднительным.


2) Дублирование.

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


3) Отсутствие контекста.

Однако в NSLocalizedString можно добавлять комментарии — даже если они не всегда помогают переводчику полностью понять контекст, это может привести к неточностям в переводе. Разработчики часто ленятся их правильно заполнить.

Переход на stringsdict для плюрализации

Появление файлов stringsdict привело к значительному улучшению локализации Swift, которая в первую очередь решила проблемы множественного числа. Основная причина заключается в том, что множественное число в языках формируется по-разному, и то, что может быть эффективным для английского языка, может быть неэффективным для других языков, таких как русский или арабский.


До появления stringsdict ими было очень сложно управлять. stringsdict позволяет программистам определять правила для таких категорий, как «один», «немногие», «многие» и «другие», которые обеспечивают одинаковый уровень правильности перевода на разные языки.


Понимание файлов stringsdict

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

Структура файла stringsdict :

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


 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>numberOfSongs</key> <dict> <key>NSStringLocalizedFormatKey</key> <string>%#@songs@</string> <key>songs</key> <dict> <key>NSStringFormatSpecTypeKey</key> <string>NSStringPluralRuleType</string> <key>one</key> <string>One song</string> <key>other</key> <string>%d songs</string> </dict> </dict> </dict> </plist>


Пример использования stringsdict для множественного числа

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


Localizable.stringsdict для английского и польского языка:

 <!-- English --> <key>article_count</key> <dict> <key>NSStringLocalizedFormatKey</key> <string>%#@articles@</string> <key>articles</key> <dict> <key>NSStringFormatSpecTypeKey</key> <string>NSStringPluralRuleType</string> <key>one</key> <string>One article</string> <key>other</key> <string>%d articles</string> </dict> </dict> <!-- Polish --> <key>article_count</key> <dict> <key>NSStringLocalizedFormatKey</key> <string>%#@articles@</string> <key>articles</key> <dict> <key>NSStringFormatSpecTypeKey</key> <string>NSStringPluralRuleType</string> <key>one</key> <string>Jeden artykuł</string> <key>few</key> <string>%d artykuły</string> <key>many</key> <string>%d artykułów</string> <key>other</key> <string>%d artykułu</string> </dict> </dict>


Здесь польская локализация ясно демонстрирует сложность форм множественного числа в некоторых языках, где необходимо использовать несколько категорий множественного числа (один, несколько, много, другой) для правильного представления различных числовых контекстов.


Быстрая реализация:

Записи stringsdict можно использовать в коде, просто ссылаясь на ключи, определенные в файле при вызове NSLocalizedString .

 let count = getArticleCount() let formatString = NSLocalizedString("article_count", comment: "Count of articles read by a user") let message = String(format: formatString, count)

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


Преимущества stringsdict

  • Эффективность: это помогает сэкономить время и усилия, которые в противном случае были бы потрачены на управление и изменение файлов локализации.
  • Точность: помогает повысить точность перевода слов, когда больше контекста задается непосредственно в среде разработки.
  • Гибкость: поддержка динамической корректировки локализованного контента в режиме реального времени.

Современные методы локализации с помощью строковых каталогов

Одной из новых функций, представленных в Xcode 15, являются каталоги строк, которые должны помочь разработчикам сделать локализацию приложений iOS и macOS еще проще, чем раньше. Хотя Localizable.strings и stringsdict являются полезными ресурсами для хранения и организации строк, каталоги строк гораздо более связны и более удобны в использовании пользовательского интерфейса для управления локализованными строками.


Вот основные аспекты, которые следует выделить в каталогах струн:

  • Визуальный редактор: в отличие от традиционных простых текстовых файлов, каталоги строк редактируются с помощью визуального редактора в Xcode, что упрощает добавление, изменение или удаление локализованных строк.


  • Встроенная документация: разработчики могут напрямую предоставлять описания и контекст в каталоге строк, что значительно повышает ясность и правильность перевода.


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


  • Расширенное плюрализация и адаптация: он также устраняет некоторые недостатки stringsdict , предлагая более точный контроль над формами множественного числа и текстом с вариациями в зависимости от элементов пользовательского интерфейса и типов устройств.


Быстрая реализация:

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


Пошаговая настройка:

  1. Создайте каталог строк. Добавьте в проект новый каталог строк. Это создаст файл .stringcatalog .


  2. Добавить записи: используйте редактор, чтобы добавлять записи для каждой строки, которую необходимо локализовать. Затем укажите ключи, значения по умолчанию и любые правила множественного числа или адаптивные параметры для каждой записи.


  3. Локализуйте контент: предоставьте переводы для каждого поддерживаемого языка, указав различные формы множественного числа, адаптацию для типов устройств и т. д.


  4. Реализация в коде: ссылайтесь на эти строки, используя локализованные идентификаторы в вашем коде Swift.


 <!-- String Catalog Entry --> <key>unread_messages_count</key> <dict> <key>NSStringLocalizedFormatKey</key> <string>%#@messages@</string> <key>messages</key> <dict> <key>NSStringFormatSpecTypeKey</key> <string>NSStringPluralRuleType</string> <key>one</key> <string>You have one unread message.</string> <key>other</key> <string>You have %d unread messages.</string> </dict> </dict>


Вы можете получить доступ к этой строке следующим образом:

 let unreadCount = fetchUnreadMessagesCount() let message = NSLocalizedString("unread_messages_count", value: "You have \(unreadCount) unread messages.", comment: "Notify about unread messages") print(message)



Преимущества строковых каталогов

  • Эффективность: экономит время и усилия, необходимые для управления файлами локализации.


  • Точность: повышает точность за счет предоставления дополнительного прямого контекста прямо в среде разработки.


  • Гибкость: поддерживает в реальном времени и даже динамические обновления локализованного контента, что особенно полезно в быстром цикле разработки.

Проблемы

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

Заключение

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


Я буду постоянно дополнять эту статью последними разработками в инструментах локализации Swift. Если вам кажется, что я что-то упустил, или у вас есть мысли по поводу того, что я сказал, вы можете поделиться ими в поле для комментариев ниже. Обязательно подписывайтесь на меня, чтобы получать больше интересной информации и последних новостей!