0Pricing
Swift Academy · Урок

Каталоги строк и локализованные строки

Локализуйте текст с помощью современного каталога строк.

«Каталоги строк и локализованные строки» — бесплатный урок Swift Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.

Зачем вообще локализовать

Локализация (l10n) означает отображение текста приложения на языке пользователя, а интернационализация (i18n) — организацию кода таким образом, чтобы локализация была возможна. Первый шаг — перестать жёстко задавать строки, видимые пользователю, и вместо этого получать их из каталога resource.

// Hardcoded — bad for localization
// let title = "Welcome"

// Localized — looked up by key
let title = String(localized: "Welcome")

Каталоги строк

В современных проектах Xcode используется каталог строк (файл .xcstrings). Это единый файл на основе JSON, в котором перечислены все локализуемые ключи, их переводы для каждого языка и такие метаданные, как комментарии и формы множественного числа. Xcode может автоматически извлекать ключи из кода.

// Localizable.xcstrings holds entries like:
// key: "Welcome"
//   en: "Welcome"
//   tr: "Hos geldiniz"
//   ja: "Yokoso"

String(localized:)

В коде String(localized:) во время выполнения разрешает ключ в перевод для текущей локали. Передаваемый строковый литерал одновременно служит ключом и значением fallback для языка разработки.

let greeting = String(localized: "Welcome back")
let cancel = String(localized: "Cancel")
print(greeting)

Добавление комментариев для переводчиков

Такое слово, как «Запустить», может означать выполнение программы или пробежку. Параметр comment: предоставляет переводчикам контекст, чтобы они выбрали подходящую формулировку. Комментарии автоматически попадают в каталог строк.

let runLabel = String(
    localized: "Run",
    comment: "Button that executes the user's code")

Интерполяция значений

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

let name = "Mira"
let count = 3
let msg = String(localized: "\(name) has \(count) new messages")
print(msg)

LocalizedStringKey в SwiftUI

В SwiftUI Вам редко приходится напрямую вызывать String(localized:). Большинство представлений, принимающих текст, используют LocalizedStringKey, поэтому обычный строковый литерал локализуется автоматически.

// In SwiftUI — the literal is a LocalizedStringKey
// Text("Welcome back")        // auto-localized
// Button("Save") { save() }   // auto-localized
let key: LocalizedStringKey = "Welcome back"
_ = key

Как избежать случайной локализации

Поскольку SwiftUI рассматривает литералы как ключи, динамическая переменная String не локализуется. Если составлять текст конкатенацией, каталог никогда не увидит настоящий ключ. Когда нужна локализация, передавайте один литерал, а если локализация явно не нужна, используйте verbatim:.

let userInput = "hello"
// Text(userInput)            // NOT a localization key
// Text(verbatim: userInput)  // explicitly raw, never localized
let verbatimKey = userInput
_ = verbatimKey

Указание таблицы

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

let onboardingTitle = String(
    localized: "Get Started",
    table: "Onboarding",
    bundle: .main)

LocalizedStringResource

LocalizedStringResource представляет локализуемую строку как значение, которое можно сохранить и разрешить позже, в том числе между процессами (что полезно для App Intents и виджетов). Фактический поиск откладывается до момента отображения.

let resource = LocalizedStringResource("Order shipped")
// Resolve later, possibly in another locale context
let resolved = String(localized: resource)
print(resolved)

Локализация по умолчанию

Язык разработки проекта используется как fallback, если перевод отсутствует. Строковый литерал, который Вы записываете в коде, считается значением исходного языка, поэтому код остаётся понятным, а пользователям никогда не передаётся необработанный ключ вроде welcome_screen_title.

// If only 'en' is translated and device is set to 'fr',
// the development-language value is shown as fallback.
let fallback = String(localized: "Settings")
print(fallback)

Практический поиск

Объединим всё вместе: функция, возвращающая полностью локализованное сообщение с контекстом и интерполяцией, готовое для любого пользовательского интерфейса.

func welcomeMessage(for user: String) -> String {
    return String(
        localized: "Welcome, \(user)!",
        comment: "Greeting shown after sign-in")
}
print(welcomeMessage(for: "Ada"))

Быстрая проверка

Вспомните, как SwiftUI решает, нужно ли локализовать текст.

Итоги

Вы создали основу для работы с локализованным текстом:

  • Храните переводы в каталоге строк (.xcstrings).
  • Получайте строки с помощью String(localized:), добавляя comment: для переводчиков.
  • В SwiftUI литералы превращаются в LocalizedStringKey и локализуются автоматически, а переменные — нет.
  • Используйте table:/bundle: для фреймворков, а LocalizedStringResource — для отложенного разрешения.

Часто задаваемые вопросы

Урок «Каталоги строк и локализованные строки» бесплатный?

Да — полный текст урока «Каталоги строк и локализованные строки» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.

Чему я научусь в уроке «Каталоги строк и локализованные строки»?

Локализуйте текст с помощью современного каталога строк. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Swift Academy?

Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Каталоги строк и локализованные строки»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Swift Academy?

Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Каталоги строк и локализованные строки
  2. Множественное число и Stringsdict
  3. Форматирование с учётом локали
  4. Справа налево и направление компоновки
← Назад к Swift Academy