Обзор
Приложения Twenty создаются на английском: строки в вашем исходном коде и манифесте являются исходным текстом на английском,en — это исходная локаль, с которой вы переводите, а
любая непереведенная локаль будет использовать ее по умолчанию.
В вашем приложении есть два типа переводимого текста, и оба проходят через один и тот же
каталог locales/:
- Метки манифеста — имена объектов и полей, заголовки представлений, пункты меню и другие строки, объявленные в метаданных вашего приложения.
- Строки фронтенд-компонентов — текст интерфейса, который отображают ваши фронтенд-компоненты React.
Пометка строк front-component
Импортируйте вспомогательные функции перевода изtwenty-sdk/front-component:
Когда что использовать
Trans— статический текст в JSX. Используйте пропсыmessageиvaluesдля интерполяции, как вTrans message="Hi {name}" values={{ name }}; интерполяция напрямую в дочерних элементах не может быть статически извлечена.useTranslate().t— динамические строки внутри компонента. Повторно рендерится, когда пользователь переключает язык. Предпочтительно использовать это внутри render.t(...)(импортируемая напрямую) — немедленный перевод, который можно использовать где угодно, включая обработчики событий, вспомогательные функции и область видимости модуля, — не только внутри render.msg(...)— ленивый дескриптор для строк, объявленных как данные (константы, конфигурация). Разрешите его позже с помощьюt(descriptor).
Контекст
Передайтеcontext, чтобы различать одинаковые исходные строки, которые переводятся
по-разному:
"\<context>": { "\<message>": "\<translation>" }. Манифестные метки являются
контекстными по своей природе — каждая из них несёт метаданные о своей роли
(objectMetadata.labelSingular, fieldMetadata.label, view.name, …), поэтому
одно и то же слово может переводиться по‑разному как имя объекта и как имя представления.
Извлечение и перевод
Выполните команду извлечения из каталога вашего приложения:t()/msg()/Trans
из исходного кода вашего фронт‑компонента в locales/\<locale>.json, где ключом
является исходная строка. Заполните переводы:
{name}, подставляются во время выполнения — сохраните их в
переводе. Для любой пустой строки используется исходный текст.
Как это работает
twenty app build компилирует каталоги и предоставляет нужный язык для
текущего пользователя: метки манифеста разрешаются на стороне сервера, а каталоги фронтенд-компонентов
встраиваются в каждый бандл компонента. Во время выполнения компонент считывает
локаль из своего контекста выполнения (текущий язык хоста) и разрешает
каждую строку по своему каталогу, используя исходный текст, если перевод
отсутствует. Переключение языка в хосте повторно рендерит строки Trans и
useTranslate().t в реальном времени.
Метки манифеста компилируются при каждой синхронизации — одинаково при twenty app build, twenty app apply
и непрерывном отслеживании twenty app dev, — поэтому достаточно отредактировать файл локали и
выполнить синхронизацию, чтобы увидеть новый текст. Каталоги фронтенд-компонентов встраиваются в
каждый бандл компонента во время сборки, поэтому изменение одного из них по-прежнему требует
повторного запуска twenty app build (и повторного развертывания).
Получение переводов
twenty app pull записывает опубликованные переводы приложения обратно в
locales/. Опубликованный каталог индексируется по идентификатору сообщения, поэтому pull восстанавливает
читаемую форму только для строк, исходный текст которых он может видеть: меток
полученных им метаданных и строк t()/msg()/Trans фронтенд-компонентов,
присутствующих в проекте. Всё остальное сохраняется как есть в
locales/compiled/\<locale>.json с ключом в виде идентификатора сообщения. Сборка объединяет эти
файлы в каталог (запись в locales/\<locale>.json имеет приоритет над
скомпилированной записью с тем же идентификатором), twenty app translations extract оставляет их без изменений,
а каждое получение перезаписывает их, поэтому они сокращаются по мере добавления в
dерево исходного кода приложения. Не редактируйте их вручную; выполняйте перевод в locales/\<locale>.json.
Проект без папки locales/ ничего не сообщает о переводах, поэтому
синхронизация из него не изменяет уже опубликованные приложением данные. Чтобы намеренно удалить
опубликованные переводы, сохраните папку и удалите файлы локалей
внутри неё: папка locales/, которая не компилируется ни в одну локаль, является явным
объявлением, и синхронизация выполняет очистку соответствующим образом.
Дочерние текстовые элементы Trans могут занимать несколько строк — пробельные символы схлопываются
так же, как их схлопывает JSX, поэтому оба этих варианта извлекаются в ключ Welcome back: