Спросите свой вопрос и получите сводку документа, используя эту страницу и выбранного вами поставщика AI
История версий
- "Обновление использования API useIntlayer в Solid для прямого доступа к свойствам"v8.9.004.05.2026
- "Добавить команду init"v7.5.930.12.2025
- "Обновление для интеграции с Astro, конфигурация, использование"v6.2.003.10.2025
Содержимое этой страницы было переведено с помощью ИИ.
Смотреть последнюю версию оригинального контента на английскомЕсли у вас есть идея по улучшению этой документации, не стесняйтесь внести свой вклад, подав запрос на вытягивание на GitHub.
Ссылка на документацию GitHubКопировать Markdown документа в буфер обмена
Переведите ваш сайт Astro + React с помощью Intlayer | Интернационализация (i18n)
Содержание
Что такое Intlayer?
Intlayer - это инновационная библиотека интернационализации (i18n) с открытым исходным кодом, разработанная для упрощения многоязычной поддержки в современных веб-приложениях.
С Intlayer вы можете:
- Легко управлять переводами, используя декларативные словари на уровне компонентов.
- Динамически локализовать метаданные, маршруты и контент.
- Обеспечить поддержку TypeScript с помощью автогенерируемых типов, улучшая автодополнение и обнаружение ошибок.
- Пользоваться расширенными функциями, такими как динамическое определение локали и переключение языков.
Пошаговое руководство по настройке Intlayer в Astro + React
Посмотреть Шаблон приложения на GitHub.
Шаг 1: Установка зависимостей
Установите необходимые пакеты с помощью вашего менеджера пакетов:
Копировать код в буфер обмена
npm install intlayer astro-intlayer react react-dom react-intlayer @astrojs/reactnpx intlayer initЕсли вы хотите использовать свой контент в атрибутестроки, таком какalt,title,href,aria-labelи т. д., вы можете использовать значение функции, например:
htmlКопировать кодКопировать код в буфер обмена
<img src="{content.image.src.value}" alt="{content.image.value}" /><img src="{content.image.src.toString()}" alt="{content.image.toString()}" /><img src="{String(content.image.src)}" alt="{String(content.image)}" />
intlayer Основной пакет, предоставляющий инструменты интернационализации для управления конфигурацией, переводами, объявлением контента, транспиляцией и командами CLI.
astro-intlayer Включает плагин интеграции для Astro для интеграции Intlayer с бандлером Vite, а также промежуточное ПО для определения предпочтительной локали пользователя, управления куки и обработки перенаправлений URL.
react, react-dom Основные пакеты React, необходимые для отрисовки компонентов React в браузере.
react-intlayer Пакет, который интегрирует Intlayer с приложениями React. Он предоставляет
IntlayerProvider, а также хукиuseIntlayerиuseLocaleдля интернационализации в React.@astrojs/react Официальная интеграция Astro, которая позволяет использовать острова (islands) компонентов React.
Шаг 2: Настройка вашего проекта
Создайте конфигурационный файл для настройки языков вашего приложения:
Копировать код в буфер обмена
import { Locales, type IntlayerConfig } from "intlayer";const config: IntlayerConfig = { internationalization: { locales: [ Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH, // Ваши другие локали ], defaultLocale: Locales.ENGLISH, },};export default config;Через этот конфигурационный файл вы можете настроить локализованные URL, перенаправления middleware, названия куки, расположение и расширение ваших объявлений контента, отключить логи Intlayer в консоли и многое другое. Полный список доступных параметров см. в документации по конфигурации.
Шаг 3: Интеграция Intlayer в конфигурацию Astro
Добавьте плагин intlayer и интеграцию React в вашу конфигурацию.
Копировать код в буфер обмена
// @ts-checkimport { intlayer } from "astro-intlayer";import react from "@astrojs/react";import { defineConfig } from "astro/config";// https://astro.build/configexport default defineConfig({ integrations: [intlayer(), react()],});Плагин интеграции intlayer() используется для интеграции Intlayer с Astro. Он обеспечивает сборку файлов объявления контента и отслеживает их изменения в режиме разработки. Он определяет переменные окружения Intlayer внутри приложения Astro. Кроме того, он предоставляет псевдонимы для оптимизации производительности.
Интеграцияreact()позволяет использовать острова компонентов React черезclient:only="react".
Шаг 4: Объявление контента
Создавайте и управляйте объявлениями контента для хранения переводов:
Копировать код в буфер обмена
import { t, type Dictionary } from "intlayer";import type { ReactNode } from "react";const appContent = { key: "app", content: { title: t({ en: "Hello World", fr: "Bonjour le monde", es: "Hola mundo", ru: "Привет, мир", }), },} satisfies Dictionary;export default appContent;Ваши объявления контента могут быть определены в любом месте вашего приложения, если они включены в каталогcontentDir(по умолчанию./src) и соответствуют расширению файла объявления контента (по умолчанию.content.{json,ts,tsx,js,jsx,mjs,cjs}).
Более подробную информацию см. в документации по объявлению контента.
Шаг 5: Использование контента в Astro
Вы можете использовать словари напрямую в файлах .astro, используя основные хелперы, экспортируемые из intlayer. Вам также следует добавить SEO-метаданные, такие как hreflang и канонические ссылки, на каждую страницу и встроить остров React для интерактивного контента на стороне клиента.
Копировать код в буфер обмена
---import { getIntlayer, getLocaleFromPath, getLocalizedUrl, getHTMLTextDir, getPrefix, localeMap, defaultLocale, type LocalesValues,} from "intlayer";import { ReactIsland } from "../../components/react/ReactIsland";export const getStaticPaths = () => { return localeMap(({ locale }) => ({ params: { locale: getPrefix(locale).localePrefix }, }));};const locale = getLocaleFromPath(Astro.url.pathname) as LocalesValues;const { title } = getIntlayer("app", locale);---<!doctype html><html lang={locale} dir={getHTMLTextDir(locale)}> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width" /> <link rel="icon" type="image/svg+xml" href="/favicon.svg" /> <title>{title}</title> <!-- Каноническая ссылка: Сообщает поисковым системам, какая версия страницы является основной --> <link rel="canonical" href={new URL(getLocalizedUrl(Astro.url.pathname, locale), Astro.site)} /> <!-- Hreflang: Сообщает Google о наличии всех локализованных версий --> { localeMap(({ locale: mapLocale }) => ( <link rel="alternate" hreflang={mapLocale} href={new URL( getLocalizedUrl(Astro.url.pathname, mapLocale), Astro.site )} /> )) } <!-- x-default: Резервный вариант для пользователей с несовпадающими языками --> <link rel="alternate" hreflang="x-default" href={new URL( getLocalizedUrl(Astro.url.pathname, defaultLocale), Astro.site )} /> </head> <body> <!-- Остров React отрисовывает весь интерактивный контент, включая переключатель языков --> <ReactIsland locale={locale} client:only="react" /> </body></html>Примечание по конфигурации маршрутизации: Структура каталогов, которую вы используете, зависит от настройки
middleware.routingв вашемintlayer.config.ts:
prefix-no-default(по умолчанию): Сохраняет локаль по умолчанию в корне (без префикса) и добавляет префиксы к остальным. Используйте[...locale]для обработки всех случаев.prefix-all: Все URL имеют префикс языка. Вы можете использовать стандартный[locale], если вам не нужно обрабатывать корень отдельно.search-paramилиno-prefix: Папка локали не нужна. Локаль обрабатывается через параметры поиска или куки.
Шаг 6: Создание компонента Острова React
Создайте компонент острова, который оборачивает ваше приложение React и получает локаль, определенную сервером:
Копировать код в буфер обмена
/** @jsxImportSource react */import { IntlayerProvider, useIntlayer } from "react-intlayer";import { type LocalesValues } from "intlayer";import { LocaleSwitcher } from "./LocaleSwitcher";function App() { const { title } = useIntlayer("app"); return ( <div> <h1>{title}</h1> <LocaleSwitcher /> </div> );}export function ReactIsland({ locale }: { locale: LocalesValues }) { return ( <IntlayerProvider locale={locale}> <App /> </IntlayerProvider> );}Пропlocaleпередается со страницы Astro (определенной сервером) вIntlayerProvider, что делает её начальной локалью для всех хуков React в дереве компонентов.
Шаг 7: Добавление переключателя языков
Создайте React-компонент LocaleSwitcher, который считывает доступные локали и переходит по локализованному URL, когда пользователь выбирает новый язык:
Копировать код в буфер обмена
/** @jsxImportSource react */import { useLocale } from "react-intlayer";import { getLocalizedUrl, getLocaleName, type LocalesValues } from "intlayer";export function LocaleSwitcher() { const { locale, availableLocales, setLocale } = useLocale({ onLocaleChange: (newLocale: LocalesValues) => { // Перейти по локализованному URL при смене языка window.location.href = getLocalizedUrl( window.location.pathname, newLocale ); }, }); return ( <div className="locale-switcher"> <span className="switcher-label">Сменить язык:</span> <div className="locale-buttons"> {availableLocales.map((localeItem) => ( <button key={localeItem} onClick={() => setLocale(localeItem)} className={`locale-btn ${localeItem === locale ? "active" : ""}`} disabled={localeItem === locale} > <span className="ls-own-name">{getLocaleName(localeItem)}</span> <span className="ls-current-name"> {getLocaleName(localeItem, locale)} </span> <span class="ls-code">{localeItem.toUpperCase()}</span> </button> ))} </div> </div> );}Примечание по сохранению состояния: Использование
onLocaleChangeдля перенаправления черезwindow.location.hrefгарантирует посещение нового языкового URL, позволяя middleware Intlayer установить куки языка и запомнить предпочтение пользователя для будущих посещений.
LocaleSwitcherдолжен отрисовываться внутриIntlayerProvider- используйте его внутри вашего компонента острова (как показано в Шаге 6).
Шаг 8: Sitemap и Robots.txt
Intlayer предоставляет утилиты для динамического создания локализованных карт сайта и файлов robots.txt.
Sitemap
Intlayer поставляется со встроенным генератором карты сайта, который поможет вам легко создать карту сайта для вашего приложения. Он учитывает локализованные маршруты и добавляет необходимые метаданные для поисковых систем.
Создаваемая Intlayer карта сайта поддерживает пространство именxhtml:link(Hreflang XML Extensions). В отличие от стандартных генераторов карт сайта, которые просто перечисляют прямые URL-адреса, Intlayer автоматически создает необходимые двусторонние связи между всеми языковыми версиями страницы (например,/about,/about?lang=frи/about?lang=es). Это гарантирует, что поисковые системы будут правильно индексировать и показывать нужную языковую версию соответствующей аудитории.
Создайте src/pages/sitemap.xml.ts для генерации карты сайта, включающей все ваши локализованные маршруты.
Копировать код в буфер обмена
import type { APIRoute } from "astro";import { generateSitemap, type SitemapUrlEntry } from "intlayer";const pathList: SitemapUrlEntry[] = [ { path: "/", changefreq: "daily", priority: 1.0 }, { path: "/about", changefreq: "monthly", priority: 0.7 },];const SITE_URL = import.meta.env.SITE ?? "http://localhost:4321";export const GET: APIRoute = async ({ site }) => { const xmlOutput = generateSitemap(pathList, { siteUrl: SITE_URL }); return new Response(xmlOutput, { headers: { "Content-Type": "application/xml" }, });};Robots.txt
Создайте src/pages/robots.txt.ts для управления сканированием поисковыми системами.
Копировать код в буфер обмена
import type { APIRoute } from "astro";import { getMultilingualUrls } from "intlayer";const getAllMultilingualUrls = (urls: string[]) => urls.flatMap((url) => Object.values(getMultilingualUrls(url)) as string[]);const disallowedPaths = getAllMultilingualUrls(["/admin", "/private"]);export const GET: APIRoute = ({ site }) => { const robotsTxt = [ "User-agent: *", "Allow: /", ...disallowedPaths.map((path) => `Disallow: ${path}`), "", `Sitemap: ${new URL("/sitemap.xml", site).href}`, ].join("\n"); return new Response(robotsTxt, { headers: { "Content-Type": "text/plain" }, });};Настройка TypeScript
Intlayer использует расширение модулей, чтобы воспользоваться преимуществами TypeScript и сделать вашу кодовую базу более надежной.


Убедитесь, что ваша конфигурация TypeScript включает автогенерируемые типы.
Копировать код в буфер обмена
{ // ... Ваши существующие конфигурации TypeScript include: [ // ... Ваши существующие конфигурации TypeScript ".intlayer/**/*.ts", // Включить автогенерируемые типы ],}Настройка Git
Рекомендуется игнорировать файлы, созданные Intlayer. Это позволит избежать их добавления в ваш Git-репозиторий.
Для этого вы можете добавить следующие инструкции в ваш файл .gitignore:
Копировать код в буфер обмена
# Игнорировать файлы, созданные Intlayer.intlayerРасширение для VS Code
Для улучшения процесса разработки с помощью Intlayer вы можете установить официальное расширение Intlayer для VS Code.
Установить из VS Code Marketplace
Это расширение предоставляет:
- Автодополнение для ключей перевода.
- Обнаружение ошибок в реальном времени для отсутствующих переводов.
- Встроенный предпросмотр переведенного контента.
- Быстрые действия для легкого создания и обновления переводов.
Для получения более подробной информации об использовании расширения см. документацию расширения Intlayer для VS Code.
(Опционально) Шаг 15: Извлечение содержимого ваших компонентов
Если у вас есть существующая кодовая база, преобразование тысяч файлов может занять много времени.
Чтобы упростить этот процесс, Intlayer предлагает компилятор / экстрактор для преобразования ваших компонентов и извлечения содержимого.
Чтобы настроить его, вы можете добавить раздел compiler в ваш файл intlayer.config.ts:
Копировать код в буфер обмена
import { type IntlayerConfig } from "intlayer";
const config: IntlayerConfig = {
// ... Остальная часть вашей конфигурации
compiler: {
/**
* Указывает, должен ли быть включен компилятор.
*/
enabled: true,
/**
* Определяет путь к выходным файлам
*/
output: ({ fileName, extension }) => `./${fileName}${extension}`,
/**
* Указывает, должны ли компоненты сохраняться после преобразования. Таким образом, компилятор можно запустить только один раз для преобразования приложения, а затем удалить.
*/
saveComponents: false,
/**
* Префикс ключа словаря
*/
dictionaryKeyPrefix: "",
},
};
export default config;Запустите экстрактор для преобразования компонентов и извлечения содержимого
Копировать код в буфер обмена
npx intlayer extractДальнейшие шаги
Вы также можете внедрить визуальный редактор или вынести ваш контент во внешнюю CMS.