# General Translation Integrations: Добавление форматов файлов
URL: https://generaltranslation.com/ru/docs/integrations/paraglide/guides/adding-file-formats.mdx
Docs index: https://generaltranslation.com/llms.txt
Description: Как анализировать файлы компонентов в формате, который не поддерживается встроенными языками.

Файлы, отличные от JavaScript, TypeScript или JSX, преобразуются в TypeScript с помощью языка — небольшого адаптера поверх собственных инструментов фреймворка. Добавьте язык, если в вашем приложении используются сообщения в формате, которого нет среди [поддерживаемых форматов файлов](/docs/integrations/paraglide/reference/file-formats).

Языки задаются через опцию библиотеки, поэтому в этом руководстве вместо CLI используется [`collectContext`](/docs/integrations/paraglide/reference/collect-context).

## Прежде чем начать [#before-start]

Вам понадобится компилятор или языковой инструмент для этого формата, который возвращает:

* Файл в виде кода на JavaScript или TypeScript.
* Source map или сопоставления Volar, связывающие этот код с исходным файлом.

Код без сопоставления никогда не считается использованием, поэтому именно от сопоставлений зависит, какие использования будут найдены и где будет обрезан их контекст.

## Напишите язык [#write-language]

[`SourceLanguage`](/docs/integrations/paraglide/reference/extension-api#languages) объявляет расширения файлов, которые он обрабатывает, и необходимые ему пакеты, а также возвращает сгенерированный модуль:

```ts title="riot-language.ts"
import {
  mappingsFromSourceMap,
  type SourceLanguage,
} from '@generaltranslation/paraglide-js/compiler';

export const riotLanguage: SourceLanguage = {
  name: 'riot',
  extensions: ['.riot'],
  requires: ['@riotjs/compiler'], // упоминается в предупреждении, если пакет отсутствует
  async generate(source, file, context) {
    // Загружается из приложения; undefined, если пакет не установлен.
    const compiler =
      await context.load<typeof import('@riotjs/compiler')>('@riotjs/compiler');
    if (!compiler) return undefined; // формат пропускается

    const { code, map } = compiler.compile(source, { file });
    const mappings = mappingsFromSourceMap(map, code, source);

    return { code, lang: 'js', mappings };
  },
};
```

1. Загрузите инструмент через `context.load`, чтобы его версия совпадала с версией в приложении. Если инструмент не установлен, верните `undefined`: формат будет пропущен с одним предупреждением, в котором перечислены пакеты из `requires`.
2. Сформируйте `mappings` с помощью `mappingsFromSourceMap` для source map версии 3 или `mappingsFromVolar` для сопоставлений инструмента на базе Volar.
3. Выбрасывайте исключение, если инструмент отклоняет файл. Такой файл будет пропущен с предупреждением.

## Зарегистрируйте язык [#register-language]

Передайте его вместе со значениями по умолчанию:

```ts
import {
  collectContext,
  defaultLanguages,
} from '@generaltranslation/paraglide-js/compiler';
import { riotLanguage } from './riot-language.js';

await collectContext({ languages: [...defaultLanguages, riotLanguage] });
```

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

## Поддержка скриптов и расширений скриптов [#scripts]

* **Отдельные скрипты:** скрипты, которые являются самостоятельными модулями (например, клиентские скрипты страницы Astro), возвращайте в `scripts`, каждый в виде `{ code, lang, mappings }`. Они не используют общих имён ни друг с другом, ни с основным `code`.
* **Расширения скриптов:** чтобы обрабатывать файлы со скриптовым расширением (как это делают компоненты Angular с `.ts`), добавьте `detect(source, file)` и возвращайте `true` только для файлов вашего формата.

## Next steps

- /docs/integrations/paraglide/guides/resolving-imports

## Sitemap

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