Интернационализация: словари, ICU plural/gender, Intl formatting, RTL и поиск пользовательских строк мимо i18n-слоя.
Scanned 9/11/2026
Install to Claude Code
npx -y skills add Vitammiin/agent-vorcl-flow --skill i18n --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of I18n?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/vitammiin-i18n)More formats (shields.io, HTML) on the badges page.
---
name: i18n
description: "Интернационализация: словари, ICU plural/gender, Intl formatting, RTL и поиск пользовательских строк мимо i18n-слоя."
---
# Навык: Интернационализация (i18n / l10n)
Правило: **в мультиязычном коде — ноль языкового хардкода**. Любая строка, которую видит пользователь, идёт через слой перевода. Подход — **определять и адаптировать**.
**Навигатор.** С чего начать: [режим проекта](#определять-и-адаптировать-сначала--всегда) → [что переводится, что нет](#что-переводится-а-что-нет) → перед сдачей [анти-паттерны](#анти-паттерны) и [чек-лист](#чек-лист). Как писать: [ключи и словари](#ключи-словари-интерполяция) · [плюрализация/род и Intl](#плюрализациярод-и-форматирование). Справочно: [библиотеки по стеку](#библиотеки-по-стеку) · [Frontend / Backend / RTL](#frontend--backend--rtl).
## Определять и адаптировать (сначала — всегда)
Признаки мультиязычности репо: i18n-пакет в `package.json` (`next-intl`, `i18next`/`react-i18next`, `@formatjs/*`, `vue-i18n`); каталоги `messages/`/`locales/`/`i18n/` с `<locale>.json`; сегмент `app/[locale]/`, middleware локалей; `SUPPORTED_LOCALES`/`LANGUAGES`/`defaultLocale`.
- **Мультиязычный** → строгий запрет хардкода: каждая пользовательская строка через `t()`/`useTranslations`/`getTranslations` в существующий формат ключей; нет ключа — заведи в словари всех локалей, но не оставляй литерал.
- **Одноязычный** → полный i18n не навязывай, но строки держи вынесенными (не в JSX), хардкод помечай как долг; даты/числа/валюты всё равно через `Intl`.
- **Неоднозначно** → уточни целевые локали; по умолчанию считай мультиязычным при наличии не-дефолтного языкового потока.
## Что переводится, а что нет
Переводится: UI-текст, кнопки, лейблы, плейсхолдеры, `alt`/`aria-*`, тосты, сообщения об ошибках/валидации, письма/пуши, PDF/квитанции, пустые состояния.
НЕ переводится: логи (один язык), стабильные машинные коды ошибок, идентификаторы/enum, имена полей API/ключи JSON, ключи аналитики.
## Ключи, словари, интерполяция
- Ключи по смыслу (`feature.section.action`), не по тексту; единый стиль; типизация ключей (опечатка ловится компилятором).
- Хранение — как в проекте: централизованный `messages/<locale>.json` или feature-level `locales/`.
- Никакой конкатенации переведённых кусков; интерполяция — именованными плейсхолдерами (`{name}`, `{count}`).
- Фолбэк-локаль задан; отсутствующий ключ не рушит UI.
## Плюрализация/род и форматирование
- Множественное число — ICU `plural` (не `if (n===1)`; у ru/pl/ar сложные правила); род/выбор — ICU `select`.
- Даты/время — `Intl.DateTimeFormat` (+ таймзона, хранение в UTC); числа/валюты — `Intl.NumberFormat` (`currency`); относительное время — `RelativeTimeFormat`; списки — `ListFormat`; сортировка — `Intl.Collator`. Формат не хардкодить.
## Библиотеки по стеку
- **Next.js App Router** → **next-intl**: `app/[locale]/`, `next-intl/middleware`, `getTranslations` (сервер) / `useTranslations` (клиент), локализованные `generateMetadata`/`hreflang` (см. `$nextjs`).
- **React SPA** → **react-i18next** (`i18next`): namespaces, ленивая загрузка, `useTranslation`, ICU через `i18next-icu` (см. `$react`).
- **Node-бэкенд** → **i18next** (+ `i18next-http-middleware`) или `@formatjs/intl`: локаль из `Accept-Language`/профиля, перевод на границе ответа; письма — по локали получателя (см. `$backend-architecture`, `$api-design`).
## Frontend / Backend / RTL
- **Frontend:** server (`getTranslations`) vs client (хук); не тащи весь словарь в бандл; SEO — `hreflang`, `<html lang dir>`.
- **Backend:** локализуй на границе; API отдаёт стабильный `code` + параметры, а не готовый переведённый текст (или переводит по локали запроса); валидация — локализуемые ключи (см. `$error-handling`).
- **RTL** (ar/he/fa): `dir="rtl"`, логические CSS-свойства (`margin-inline`, Tailwind `ms-*`/`me-*`/`ps-*`/`pe-*`, `start/end`), зеркалирование иконок (см. `$tailwind`).
## Анти-паттерны
Литерал строки в JSX/ответе (мультиязычный проект); конкатенация переводов и `"Показано " + n`; ручная плюрализация; хардкод формата даты/валюты; перевод логов/кодов ошибок; ключ = текст; отсутствие фолбэка; локаль не учтена в кэш-ключах; физические CSS-отступы, ломающие RTL.
## Чек-лист
Режим определён; строки через `t()`; ключи типизированы и согласованы; ICU для plural/род; `Intl` для дат/чисел/валют; логи и коды ошибок не переведены; RTL учтён при наличии RTL-локалей.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!