# General Translation React SDKs (gt-react, gt-next, gt-react-native): Правила линтера
URL: https://generaltranslation.com/ru/docs/react/reference/lint-rules.mdx
Docs index: https://generaltranslation.com/llms.txt
Description: Поддерживайте переводимый контент статичным и корректным с помощью правил линтера React Core. Справочник по правилам линтера React Core.

Линтер General Translation React Core (`@generaltranslation/react-core-linter`) — это плагин ESLint, который выявляет типичные ошибки интеграции: динамический контент внутри переводимых компонентов, нестатические строки в функциях перевода и неподдерживаемые атрибуты. Его конфигурация `recommended` включает все правила с уровнем ошибки, а два из трёх правил поддерживают автоисправление. Инструкции по установке и настройке ESLint см. в руководстве [Проверка кода линтером](/docs/react/guides/linting-your-code).

*Правила определяют компоненты и функции General Translation по источнику импорта. `gt-react`, `gt-next` и `gt-react-native` распознаются по умолчанию; чтобы добавить другие пакеты, например `gt-tanstack-start`, используйте параметр [`libs`](#libs).*

## Правила [#rules]

| Правило                                     | Что выявляет                                                                                                                                                                                                                                                    | Автоисправление |
| ------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------- |
| [`static-string`](#static-string)           | Динамические или нестатические строки, передаваемые в функции перевода ([`useGT`](/docs/react/reference/hooks/use-gt), [`getGT`](/docs/node/reference/functions/get-gt), [`msg`](/docs/react/reference/functions/msg)), а также нестатические sugar-переменные. | Да              |
| [`static-jsx`](#static-jsx)                 | Динамический контент внутри [`<T>`](/docs/react/reference/components/t), не обёрнутый в variable component.                                                                                                                                                     | Да              |
| [`no-data-attrs-on-branch`](#no-data-attrs) | Атрибуты `data-*` в [`<Branch>`](/docs/react/reference/components/branch), которые компонент игнорирует.                                                                                                                                                        | Нет             |

Все три правила имеют уровень `error` в конфигурации `recommended` и принимают общий параметр [`libs`](#libs).

## `static-string` [#static-string]

**Автоисправление** Да · **Рекомендуется** `error`

Функции регистрации, такие как `gt` (из [`useGT`](/docs/react/reference/hooks/use-gt) или `getGT`) и [`msg`](/docs/react/reference/functions/msg), могут принимать только статические строки, потому что компилятор извлекает их содержимое во время сборки. Это правило помечает динамический первый аргумент и рекомендует использовать интерполяцию в стиле ICU, при которой переменные передаются через объект параметров, а не конкатенируются со строкой.

### Как это работает

* **Требуется статический контент.** Первый аргумент должен быть строковым литералом (или, в случае [`msg`](/docs/react/reference/functions/msg), массивом строковых литералов). Конкатенация строк и шаблонные литералы с интерполяцией переменных помечаются как ошибки.
* **Автоисправление ICU.** Если используется формат ICU (по умолчанию), правило преобразует исправимые динамические выражения в ICU-строку и объект параметров. Тернарные операторы превращаются в конструкции `select`, а остальные выражения — в заполнители `{varN}`.
* **[`derive`](/docs/react/reference/functions/derive) допускается.** Вызов [`derive`](/docs/react/reference/functions/derive) — отдельно или в конкатенации со статическими частями — разрешён, поскольку его варианты вычисляются на этапе сборки.
* **Статические служебные переменные.** Ключи метаданных в объекте параметров должны быть статическими, но требуемый тип у них различается: `$id` и `$format` должны быть статическими строками, `$context` — статической строкой или вызовом [`derive`](/docs/react/reference/functions/derive), `$maxChars` — числовым литералом, а `$requiresReview` — булевым литералом.
* **Проверка ICU.** Если строка использует формат ICU, правило проверяет её синтаксис и сообщает об ошибке `Invalid ICU message format`, если сообщение некорректно.

### Примеры

```tsx
// ❌ Неверно — динамическое значение конкатенируется со строкой
const gt = useGT();
gt('Hello ' + name);
gt(`Hello ${name}!`);

// ✅ Верно — интерполяция ICU, переменная передаётся в объект параметров
const gt = useGT();
gt('Hello {name}!', { name });
```

```tsx
// ❌ Неверно — sugar-переменная не является статической строкой
msg('Save', { $context: label });

// ✅ Верно — статическая sugar-переменная
msg('Save', { $context: 'a button label' });

// ✅ Верно — варианты времени сборки с derive
gt('Hello ' + derive(getName()));
```

### Параметры

Поддерживает общий параметр [`libs`](#libs).

## `static-jsx` [#static-jsx]

**Автоисправление** Да · **Рекомендуется** `error`

Компонент [`<T>`](/docs/react/reference/components/t) должен содержать только статические дочерние элементы, чтобы компилятор мог их извлечь. Это правило помечает динамический контент — переменные, вызовы функций и выражения доступа к свойствам — внутри [`<T>`](/docs/react/reference/components/t) и требует оборачивать такой контент в компонент переменной: [`<Var>`](/docs/react/reference/components/var), [`<Num>`](/docs/react/reference/components/num), [`<Currency>`](/docs/react/reference/components/currency) или [`<DateTime>`](/docs/react/reference/components/datetime).

### Как это работает

* **Только статические дочерние элементы.** Внутри [`<T>`](/docs/react/reference/components/t) допускаются только строки, числа, булевы значения и шаблонные литералы без интерполяции. Любое другое выражение помечается.
* **Автоматическое оборачивание в [`<Var>`](/docs/react/reference/components/var).** Помеченное выражение оборачивается в [`<Var>`](/docs/react/reference/components/var) (при необходимости с добавлением импорта), чтобы значение отображалось без перевода.
* **Преобразование ветвлений.** Тернарное выражение (`cond ? a : b`) или выражение с логическим И (`cond && a`) вместо этого преобразуется в [`<Branch>`](/docs/react/reference/components/branch).
* **Атрибуты с ветвлением.** Правило также проверяет ветви содержимого [`<Branch>`](/docs/react/reference/components/branch) и [`<Plural>`](/docs/react/reference/components/plural), требуя, чтобы значение в каждой ветви было статическим или JSX.

### Примеры

```tsx
// ❌ Неверно — динамический контент напрямую внутри <T>
<T>{name}</T>;
<T>{getGreeting()}</T>;

// ✅ Верно — динамический контент обёрнут в компонент переменной
<T><Var>{name}</Var></T>;
<T>You have <Num>{count}</Num> messages.</T>;
```

```tsx
// ❌ Неверно — inline условие внутри <T>
<T>{isActive ? 'Active' : 'Inactive'}</T>;

// ✅ Верно — автоисправление преобразует это в <Branch>
<T>
  <Branch branch={isActive} true="Active">Inactive</Branch>
</T>;
```

### Параметры

Поддерживает общий параметр [`libs`](#libs).

## `no-data-attrs-on-branch` [#no-data-attrs]

**Автоисправление** Нет · **Рекомендуется** `error`

Компонент [`<Branch>`](/docs/react/reference/components/branch) игнорирует любые атрибуты с префиксом `data-`, потому что воспринимает все незарезервированные пропсы как значения ветки. Это правило помечает атрибуты `data-*` у [`<Branch>`](/docs/react/reference/components/branch), чтобы они не терялись без предупреждения. Автоисправления нет; удалите атрибут или перенесите его на оборачивающий элемент.

### Примеры

```tsx
// ❌ Неверно — атрибут data-* игнорируется компонентом <Branch>
<Branch branch={status} data-testid="status" active="Active" inactive="Inactive" />;

// ✅ Верно — перенесите атрибут в оборачивающий элемент
<span data-testid="status">
  <Branch branch={status} active="Active" inactive="Inactive" />
</span>;
```

### Параметры

Поддерживает общий параметр [`libs`](#libs).

## Общие параметры [#shared-options]

У всех правил один и тот же параметр.

### `libs` [#libs]

**Тип** `string[]` · **Необязательно** · **По умолчанию** `['gt-react', 'gt-next', 'gt-react-native', 'gt-i18n', '@generaltranslation/react-core/components', '@generaltranslation/react-core/components-rsc', '@generaltranslation/react-core/hooks', '@generaltranslation/react-core/pure']`

Список исходных модулей, которые правило считает пакетами General Translation. Компонент или функция проверяется только в том случае, если они импортируются из одного из этих модулей, поэтому импорты с алиасами разрешаются корректно. Добавьте пакет своего фреймворка, если его нет в списке по умолчанию — например, `gt-tanstack-start`:

```js title="eslint.config.js"
const libs = ['gt-tanstack-start'];

export default [
  {
    plugins: { '@generaltranslation/react-core-linter': gtLint },
    rules: {
      '@generaltranslation/react-core-linter/static-jsx': ['error', { libs }],
      '@generaltranslation/react-core-linter/static-string': ['error', { libs }],
      '@generaltranslation/react-core-linter/no-data-attrs-on-branch': ['error', { libs }],
    },
  },
];
```

## Sitemap

See the full [sitemap](https://generaltranslation.com/sitemap.md) for all pages.
