В этом руководстве шаг за шагом показано, как перевести один React-компонент от начала до конца: установить рантайм, обернуть приложение, написать перевод, извлечь его и отрендерить результат в другой локали.
Установите рантайм
npm install @lingo.dev/reactЕсли вы используете Next.js, дополнительно установите @lingo.dev/react-next — он добавляет хелперы с учётом роутера поверх того же рантайма.
Оберните приложение в LingoProvider
import { LingoProvider } from "@lingo.dev/react";
import esMessages from "./locales/es.json";
export function App() {
return (
<LingoProvider locale="es" messages={esMessages}>
<Page />
</LingoProvider>
);
}messages — это объект, где ключами выступают хэши содержимого, — именно в таком виде CLI записывает данные в locales/<locale>.json. При первом запуске он будет пустым, и это нормально: непереведённые строки просто подставляются в исходном виде.
Напишите перевод в исходном коде
import { useLingo } from "@lingo.dev/react";
function Page() {
const l = useLingo();
return <h1>{l.text("Hello", { context: "Hero heading" })}</h1>;
}l.text(source, { context }) — основной способ вызова. context обязателен: он помогает переводчикам различать строки, которые в английском пишутся одинаково, но в других языках переводятся по-разному (например, "Save" как глагол и "Save" как существительное).
Извлеките строку
lingo extractКоманда сканирует исходный код, вычисляет стабильный хэш для "Hello" + контекста и записывает его в файл исходной локали (locales/en.jsonc по умолчанию). Запускайте её заново после любых изменений — извлечение идемпотентно.
Отправьте на перевод
lingo push --backfill-missingCLI загружает исходный файл, просит движок перевести его на настроенные целевые локали и скачивает результат обратно в locales/<locale>.json. После этого при каждой отправке будут передаваться только изменения.
Отрендерите переведённый текст
Импортируйте JSON-файл для локали, в которой рендерится ваше приложение, — или выбирайте его динамически в зависимости от пользователя — и передайте в LingoProvider. Вызов хука из шага 3 остаётся тем же: l.text("Hello", ...) теперь возвращает переведённое значение, потому что хэш совпадает с тем, что было скачано.
Вот и весь цикл: пишете код на исходном языке, извлекаете, отправляете, рендерите. Не нужно поддерживать отдельное пространство i18n-ключей — исходная строка и есть ключ (через хэш).
Куда двигаться дальше#
- LingoProvider — как должен выглядеть
messages, когда стоит вкладывать провайдеры друг в друга и как переключать локаль. - useLingo — полный API хука, включая
l.rich()для React-поддеревьев внутри переводов. - Plurals and select — как правильно обрабатывать "1 item" / "N items".
