Перевод JSON-файла i18n: все ключи, плейсхолдеры и формы множественного числа без изменений
Загрузите en.json (или несколько файлов пространств имён) и получите es.json с теми же вложенными ключами, в том же порядке и с теми же отступами. Переводятся только значения, а каждый {name}, {{count}} и ICU-плюраль проверяется в каждой строке. Первые строки бесплатно и без регистрации; вся задача — до 5,000 строк — стоит $5, разовый платёж.
- Ключи и вложенность не переводятся; массивы, числа и булевы значения остаются как есть
- Проверяются плейсхолдеры: {name}, {{count}}, %s, :attribute, $t(key), @:key
- ICU-плюрали сохраняют структуру и получают категории, нужные целевому языку
- Flutter ARB: @metadata сохраняются и используются как контекст, @@locale обновляется
- Файл называется по языку: en.json превращается в es.json, app_en.arb — в app_es.arb
{
"home.greeting": "Good morning, {name}Buenos días, {name}",
"home.nearby": "{count, plural, =0 {No trails near you yet} one {# trail near you} other {# trails near you}}{count, plural, =0 {Aún no hay rutas cerca de ti} one {# ruta cerca de ti} other {# rutas cerca de ti}}",
"trail.offline_done": "<b>{name}</b> is saved on this phone. You can use the map without a signal.<b>{name}</b> está guardado en este teléfono. Puedes usar el mapa sin señal.",
"trail.share_text": "I just finished {trail} with Trailbook! {km} km and {meters} m up. 🥾¡Acabo de terminar {trail} con Trailbook! {km} km y {meters} m de subida. 🥾",
"saved.empty": "You have not saved any trails yet.\nTap the heart on a trail to keep it here.Aún no has guardado ninguna ruta.\nToca el corazón en una ruta para guardarla aquí."
}
Жёлтый: плейсхолдеры и синтаксис множественного числа ICU, проверяются в каждой строке. Бирюзовый: теги, экранирование и эмодзи — остаются как есть.
Те же ключи. Те же плейсхолдеры. Новый язык.
Меняются только значения. Файл возвращается с той же вложенностью и в том же порядке, под именем es.json, а любая строка, потерявшая плейсхолдер, переводится заново ещё до того, как попадёт в вашу сборку.
Демо-приложение придумано для этой страницы; испанские строки — реальный результат работы инструмента, из файла на 85 строк.
Что переводится, а что нет
Каждое строковое значение отправляется на перевод вместе с полным ключом как контекстом, поэтому «settings.save» и «cart.save» могут получить разные переводы. Сами ключи никогда не отправляются. Значения, которые не являются текстом (URL, адрес электронной почты или значение только из плейсхолдеров вроде «{count}»), остаются как есть.
Теги форматированного текста, которые используют react-intl и похожие библиотеки, например <b>{name}</b> или <link>Undo</link>, перед переводом заменяются маркерами, а после возвращаются на место. Буквальные последовательности \n и эмодзи тоже должны сохраниться; если строка теряет что-то из этого, она переводится заново, а если не получается и со второго раза, остаётся английский вариант, а ключ попадает в список для вас.
Множественные числа
ICU-сообщение вроде {count, plural, one {# trail} other {# trails}} переводится как одна строка. Переводчику сообщают, какие категории множественного числа есть в целевом языке, например one, few, many и other для русского или польского, а результат проверяется: имя переменной и ключевое слово plural должны сохраниться. Файлы i18next с отдельными ключами вроде trail_one и trail_other переводятся ключ за ключом; ключи, которых нет для целевого языка (trail_few, trail_many), не добавляются.
Как работает инструмент, сколько он стоит и как обрабатываются ваши файлы — на странице Перевод файлов локализации; цены на все инструменты — на странице цены.
Обновлено
Вопросы и ответы
Сохранится ли форматирование в результате?
Да. Отступы (два пробела, четыре пробела или табуляция), порядок ключей, пробел после двоеточий и завершающий перевод строки копируются из вашего файла. Минифицированный файл остаётся в одной строке.
Можно загрузить сразу несколько файлов пространств имён?
Да, до 20 файлов в одной задаче, например common.json, cart.json и errors.json. Скачиваются они вместе одним ZIP-архивом.
А как быть со строками, которые переводить не нужно?
Перечислите названия продуктов и брендов в поле «Не переводить»; в каждой строке, где они встречаются, проверяется, что название сохранено. Значения, состоящие только из URL, адреса электронной почты или плейсхолдеров, пропускаются автоматически.
Сколько это стоит?
Первые строки бесплатно. Вся задача — до 5,000 строк — стоит $5, разовый платёж. Unlimited покрывает до 15,000 строк в одной задаче. Небольшие задачи — исключение: задача до 300 строк бесплатна полностью, включая скачивание.