Skip to main content
AI agent network visualization

Перевод каталогов строк Xcode за секунды

Формы множественного числа соответствуют CLDR. Варианты для устройств сохраняются. Состояния перевода отслеживаются. Ваши файлы .xcstrings переводятся прямо в IDE.

Перевод каталогов строк сложнее, чем кажется

В Xcode 15 каталоги строк заменили .strings и .stringsdict одним файлом JSON, но сложность никуда не исчезла. Для каждого языка нужны правильные категории множественного числа CLDR, варианты для устройств (iPhone, iPad и Mac) должны оставаться связанными со своими ключами, а из-за отслеживания состояний в Xcode одно неверное поле делает всю запись недействительной.

Для каждого языка нужны разные категории множественного числа CLDR: для арабского — все шесть, для японского — только other, для русского — четыре разные формы

Варианты строк для отдельных устройств (iPhone, iPad, Mac, Apple Watch) должны оставаться правильно связанными с родительскими ключами

Xcode отслеживает состояния перевода (new, needs_review, translated, stale): неверные значения состояния приводят к тому, что Xcode игнорирует или неправильно помечает переводы

При переходе с устаревших .strings/.stringsdict на .xcstrings возникают различия форматов, с которыми универсальные инструменты не справляются

Исходный текст (английский)
Localizable.xcstrings
{
  "sourceLanguage": "en",
  "version": "1.0",
  "strings": {
    "welcome_title": {
      "extractionState": "manual",
      "localizations": {
        "en": {
          "stringUnit": {
            "state": "translated",
            "value": "Welcome to the App"
          }
        }
      }
    },
    "item_count": {
      "localizations": {
        "en": {
          "variations": {
            "plural": {
              "zero": {
                "stringUnit": {
                  "state": "translated",
                  "value": "No items"
                }
              },
              "one": {
                "stringUnit": {
                  "state": "translated",
                  "value": "%lld item"
                }
              },
              "other": {
                "stringUnit": {
                  "state": "translated",
                  "value": "%lld items"
                }
              }
            }
          }
        }
      }
    },
    "device_greeting": {
      "localizations": {
        "en": {
          "variations": {
            "device": {
              "iphone": {
                "stringUnit": {
                  "state": "translated",
                  "value": "Tap to continue"
                }
              },
              "ipad": {
                "stringUnit": {
                  "state": "translated",
                  "value": "Tap or click to continue"
                }
              },
              "mac": {
                "stringUnit": {
                  "state": "translated",
                  "value": "Click to continue"
                }
              }
            }
          }
        }
      }
    }
  }
}
Перевод (немецкий)
Localizable.xcstrings (с de)
{
  "sourceLanguage": "en",
  "version": "1.0",
  "strings": {
    "welcome_title": {
      "extractionState": "manual",
      "localizations": {
        "de": {
          "stringUnit": {
            "state": "translated",
            "value": "Willkommen in der App"
          }
        }
      }
    },
    "item_count": {
      "localizations": {
        "de": {
          "variations": {
            "plural": {
              "zero": {
                "stringUnit": {
                  "state": "translated",
                  "value": "Keine Elemente"
                }
              },
              "one": {
                "stringUnit": {
                  "state": "translated",
                  "value": "%lld Element"
                }
              },
              "other": {
                "stringUnit": {
                  "state": "translated",
                  "value": "%lld Elemente"
                }
              }
            }
          }
        }
      }
    },
    "device_greeting": {
      "localizations": {
        "de": {
          "variations": {
            "device": {
              "iphone": {
                "stringUnit": {
                  "state": "translated",
                  "value": "Tippen zum Fortfahren"
                }
              },
              "ipad": {
                "stringUnit": {
                  "state": "translated",
                  "value": "Tippen oder klicken zum Fortfahren"
                }
              },
              "mac": {
                "stringUnit": {
                  "state": "translated",
                  "value": "Klicken zum Fortfahren"
                }
              }
            }
          }
        }
      }
    }
  }
}

Что сохраняет i18n Agent

Формы множественного числа

Для каждого целевого языка создаются правильные категории множественного числа CLDR: от одной категории для японского до шести для арабского

Варианты для устройств

Варианты строк для iPhone, iPad, Mac и Apple Watch остаются правильно связанными с родительскими ключами

Учёт состояний

Состояния перевода (new, needs_review, translated) задаются правильно, чтобы процесс локализации в Xcode работал корректно

Совместимость форматов

Результат полностью совместим с редактором каталогов строк Xcode и без проблем интегрируется как в новые, так и в перенесённые проекты

Работает со средствами разработки Apple

Каталоги строк Xcode 15+
Локализация SwiftUI
UIKit / AppKit
Пакеты Swift

Как это работает

How i18n Agent works: Install, Translate, Done
1
2
3
terminal
$translate_filesrc/messages/en.json
 --target["de", "ja", "es"]
Done.3 languages, 142 keys translated.

Без ручного копирования, извлечения строк и лишних действий. Только переведённые файлы.

Попробовать i18n Agent

Перетащите сюда файл перевода

JSON, YAML, PO, XML, CSV, Markdown, Properties

или нажмите, чтобы выбрать

Целевые языки

Регистрация не требуетсяМгновенный расчёт

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

Для разработчиков

Установите инструмент CLI и переведите первый файл за 2 минуты.

Установить инструмент CLI

Для корпоративных команд

Всё ещё связаны контрактом с TMS? Обсудим переход.