← Назад к вопросам

Делал ли интернационализацию

2.0 Middle🔥 181 комментариев
#Браузер и сетевые технологии

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Интернационализация (i18n) в Frontend

Да, я имею опыт внедрения интернационализации в различных проектах. Это критически важная функция для глобальных приложений.

Что такое интернационализация

Интернационализация (i18n) — это процесс адаптации приложения для работы с различными языками и культурными особенностями. Включает:

  • Перевод пользовательского интерфейса
  • Локализацию дат, чисел, валют
  • Адаптацию текстов для разных языков
  • Поддержку RTL (right-to-left) языков

Популярные библиотеки для i18n

Next.js и i18next

import i18n from "i18next";
import { initReactI18next } from "react-i18next";

i18n.use(initReactI18next).init({
  resources: {
    en: {
      translation: {
        greeting: "Hello",
        welcome: "Welcome to our app"
      }
    },
    ru: {
      translation: {
        greeting: "Привет",
        welcome: "Добро пожаловать в наше приложение"
      }
    }
  },
  lng: "en",
  fallbackLng: "en",
  interpolation: { escapeValue: false }
});

export default i18n;

Использование в компонентах

import { useTranslation } from "react-i18next";

export function Header() {
  const { t, i18n } = useTranslation();

  const changeLanguage = (lng: string) => {
    i18n.changeLanguage(lng);
  };

  return (
    <header>
      <h1>{t("greeting")}</h1>
      <button onClick={() => changeLanguage("en")}>English</button>
      <button onClick={() => changeLanguage("ru")}>Русский</button>
    </header>
  );
}

Структура файлов переводов

public/locales/
  en/
    common.json
    home.json
    errors.json
  ru/
    common.json
    home.json
    errors.json
// public/locales/en/common.json
{
  "header": {
    "title": "My App",
    "menu": "Menu"
  },
  "footer": {
    "copyright": "© 2026 My Company"
  }
}

Лучшие практики i18n

1. Динамическая загрузка переводов

import i18next from "i18next";
import HttpBackend from "i18next-http-backend";

i18next.use(HttpBackend).init({
  fallbackLng: "en",
  backend: {
    loadPath: "/locales/{{lng}}/{{ns}}.json"
  },
  ns: ["common", "home", "errors"],
  defaultNS: "common"
});

2. Перевод с параметрами

{
  "greeting": "Hello, {{name}}!",
  "itemCount": "You have {{count}} item",
  "itemCount_plural": "You have {{count}} items"
}
const { t } = useTranslation();

t("greeting", { name: "John" }); // Hello, John!
t("itemCount", { count: 1 }); // You have 1 item
t("itemCount", { count: 5 }); // You have 5 items

3. Форматирование дат и чисел

const { i18n } = useTranslation();
const formatter = new Intl.DateTimeFormat(i18n.language, {
  year: "numeric",
  month: "long",
  day: "numeric"
});

const formatted = formatter.format(new Date());

4. Сохранение выбранного языка

const changeLanguage = async (lng: string) => {
  await i18n.changeLanguage(lng);
  localStorage.setItem("language", lng);
};

// При инициализации приложения
const savedLng = localStorage.getItem("language") || "en";
i18n.init({ lng: savedLng });

SEO и i18n

Для Next.js с SSR/ISR использую next-i18next:

// next.config.js
const { i18n } = require("./next-i18next.config");

module.exports = {
  i18n,
  output: "standalone"
};
// next-i18next.config.js
module.exports = {
  i18n: {
    defaultLocale: "en",
    locales: ["en", "ru", "de"]
  }
};

Рурлы с поддержкой локалей:

/en/products
/ru/products
/de/products

Тестирование i18n

import { render, screen } from "@testing-library/react";
import { I18nextProvider } from "react-i18next";
import i18n from "./i18n";

test("renders with correct translation", () => {
  render(
    <I18nextProvider i18n={i18n}>
      <Header />
    </I18nextProvider>
  );

  expect(screen.getByText("Hello")).toBeInTheDocument();
});

Итоговые рекомендации

  • Используй i18next как универсальное решение
  • next-i18next для Next.js проектов
  • Храни переводы в JSON-файлах или базе данных
  • Реализуй ленивую загрузку для больших приложений
  • Не забывай про плюрализацию и интерполяцию
  • Регулярно обновляй переводы через переводчиков или краудсорсинг