Начало работы с интернационализацией (i18n) с Intlayer, Lynx и React

    Что такое Intlayer?

    Intlayer — это инновационная, открытая библиотека интернационализации (i18n), которая упрощает поддержку нескольких языков в современных приложениях. Она работает во многих средах JavaScript/TypeScript, включая Lynx (через пакет react-intlayer).

    С помощью Intlayer вы можете:

    • Легко управлять переводами, используя декларативные словари на уровне компонентов.
    • Обеспечить поддержку TypeScript с помощью автоматически генерируемых типов.
    • Динамически локализовать контент, включая строки пользовательского интерфейса (а в React для веба также можно локализовать HTML-метаданные и т.д.).
    • Использовать расширенные функции, такие как динамическое определение и переключение локали.

    Шаг 1: Установите зависимости

    Из вашего проекта Lynx установите следующие пакеты:

    bash
    npm install intlayer react-intlayer lynx-intlayer

    Пакеты

    • intlayer
      Основной инструмент i18n для конфигурации, содержания словарей, генерации типов и CLI-команд.

    • react-intlayer
      Интеграция с React, предоставляющая провайдеры контекста и хуки React, которые вы будете использовать в Lynx для получения и переключения локалей.

    • lynx-intlayer
      Интеграция с Lynx, предоставляющая плагин для интеграции Intlayer с бандлером Lynx.


    Шаг 2: Создайте конфигурацию Intlayer

    В корне вашего проекта (или в любом удобном месте) создайте файл конфигурации Intlayer. Он может выглядеть так:

    intlayer.config.ts
    import { Locales, type IntlayerConfig } from "intlayer";const config: IntlayerConfig = {  internationalization: {    locales: [      Locales.ENGLISH,      Locales.FRENCH,      Locales.SPANISH,      // ... Добавьте любые другие локали, которые вам нужны    ],    defaultLocale: Locales.ENGLISH,  },};export default config;

    В этой конфигурации вы можете:

    • Настроить список поддерживаемых локалей.
    • Установить локаль по умолчанию.
    • Позже вы можете добавить более сложные опции (например, логи, пользовательские директории контента и т.д.).
    • См. документацию по конфигурации Intlayer для получения дополнительной информации.

    Шаг 3: Добавьте плагин Intlayer в бандлер Lynx

    Чтобы использовать Intlayer с Lynx, вам нужно добавить плагин в файл lynx.config.ts:

    lynx.config.ts
    import { defineConfig } from "@lynx-js/rspeedy";import { pluginIntlayerLynx } from "lynx-intlayer/plugin";export default defineConfig({  plugins: [    // ... другие плагины    pluginIntlayerLynx(),  ],});

    Шаг 4: Добавьте провайдер Intlayer

    Чтобы синхронизировать язык пользователя по всему приложению, вам нужно обернуть ваш корневой компонент в компонент IntlayerProvider из react-intlayer.

    Также вам нужно добавить файл функции intlayerPolyfill, чтобы Intlayer работал корректно.

    src/index.tsx
    import { root } from "@lynx-js/react";import { App } from "./App.js";import { IntlayerProvider } from "react-intlayer";import { intlayerPolyfill } from "lynx-intlayer";intlayerPolyfill();root.render(  <IntlayerProvider>    <App />  </IntlayerProvider>);if (import.meta.webpackHot) {  import.meta.webpackHot.accept();}

    Шаг 5: Объявите ваш контент

    Создайте файлы объявления контента в любом месте вашего проекта (обычно в src/), используя любой из форматов расширений, поддерживаемых Intlayer:

    • .content.ts
    • .content.mjs
    • .content.cjs
    • .content.json
    • и т.д.

    Пример (TypeScript с узлами TSX для Lynx):

    src/app.content.tsx
    import { t, type Dictionary } from "intlayer";const appContent = {  key: "app",  content: {    title: "React",    subtitle: t({      ru: "на Lynx",      en: "on Lynx",      fr: "sur Lynx",      es: "en Lynx",    }),    description: t({      ru: "Нажмите на логотип и повеселитесь!",      en: "Tap the logo and have fun!",      fr: "Appuyez sur le logo et amusez-vous!",      es: "¡Toca el logo y diviértete!",    }),    hint: [      t({        ru: "Редактировать",        en: "Edit",        fr: "Modifier",        es: "Editar",      }),      " src/App.tsx ",      t({        ru: "чтобы увидеть обновления!",        en: "to see updates!",        fr: "pour voir les mises à jour!",        es: "para ver actualizaciones!",      }),    ],  },} satisfies Dictionary;export default appContent;

    Для получения подробной информации о декларациях контента, см. документацию по контенту Intlayer.


    Шаг 4: Используйте Intlayer в ваших компонентах

    Используйте хук useIntlayer в дочерних компонентах для получения локализованного контента.

    src/App.tsx
    import { useCallback, useState } from "@lynx-js/react";import { useIntlayer } from "react-intlayer";import "./App.css";import arrow from "./assets/arrow.png";import lynxLogo from "./assets/lynx-logo.png";import reactLynxLogo from "./assets/react-logo.png";import { LocaleSwitcher } from "./components/LocaleSwitcher.jsx";export const App = () => {  const [alterLogo, setAlterLogo] = useState(false);  const { title, subtitle, description, hint } = useIntlayer("app");  const onTap = useCallback(() => {    // только фон    setAlterLogo(!alterLogo);  }, [alterLogo]);  return (    <view>      <view className="Background" />      <view className="App">        <view className="Banner">          <view className="Logo" bindtap={onTap}>            {alterLogo ? (              <image src={reactLynxLogo} className="Logo--react" />            ) : (              <image src={lynxLogo} className="Logo--lynx" />            )}          </view>          <text className="Title">{title}</text>          <text className="Subtitle">{subtitle}</text>        </view>        <view className="Content">          <image src={arrow} className="Arrow" />          <text className="Description">{description}</text>          <text className="Hint">            {hint[0]}            <text style={{ fontStyle: "italic" }}>{hint[1]}</text>            {hint[2]}          </text>        </view>        <LocaleSwitcher />        <view style={{ flex: 1 }}></view>      </view>    </view>  );};

    При использовании content.someKey в строковых свойствах (например, title кнопки или children компонента Text), вызывайте content.someKey.value, чтобы получить строку.


    (Опционально) Шаг 5: Измените локаль приложения

    Для переключения локалей из ваших компонентов вы можете использовать метод setLocale из хука useLocale:

    src/components/LocaleSwitcher.tsx
    import { type FC } from "react";import { getLocaleName } from "intlayer";import { useLocale } from "react-intlayer";export const LocaleSwitcher: FC = () => {  const { setLocale, availableLocales, locale } = useLocale();  return (    <view      style={{        display: "flex",        flexDirection: "row",        justifyContent: "center",        alignItems: "center",        gap: 10,      }}    >      {availableLocales.map((localeEl) => (        <text          key={localeEl}          style={{            color: localeEl === locale ? "#fff" : "#888",            fontSize: "12px",          }}          bindtap={() => setLocale(localeEl)}        >          {getLocaleName(localeEl)}        </text>      ))}    </view>  );};

    Это вызывает повторный рендер всех компонентов, использующих контент Intlayer, теперь с переводами для новой локали.

    См. документацию по useLocale для получения дополнительной информации.

    Настройка TypeScript (если вы используете TypeScript)

    Intlayer генерирует определения типов в скрытой папке (по умолчанию .intlayer) для улучшения автозаполнения и обнаружения ошибок перевода:

    json5
    // tsconfig.json{  // ... ваш существующий TS конфиг  "include": [    "src", // ваш исходный код    ".intlayer", // <-- убедитесь, что автоматически сгенерированные типы включены    // ... все остальное, что вы уже включили  ],}

    Это позволяет использовать такие функции, как:

    • Автозаполнение для ключей вашего словаря.
    • Проверка типов, которая предупреждает, если вы обращаетесь к несуществующему ключу или несовместимому типу.

    Конфигурация Git

    Чтобы избежать коммита автоматически сгенерированных файлов Intlayer, добавьте следующее в ваш .gitignore:

    plaintext
    # Игнорировать файлы, сгенерированные Intlayer.intlayer

    Узнайте больше

    • Визуальный редактор: Используйте визуальный редактор Intlayer для управления переводами визуально.
    • Интеграция с CMS: Вы также можете вынести и получить содержимое вашего словаря из CMS.
    • CLI команды: Изучите CLI Intlayer для выполнения задач, таких как извлечение переводов или проверка отсутствующих ключей.

    Если у вас есть идея по улучшению этой документации, не стесняйтесь внести свой вклад, подав запрос на вытягивание на GitHub.

    Ссылка на документацию GitHub