Skip to main content

auto-i18n-lib

Автоматический перевод интерфейса проекта без единой правки кода самого проекта.

Библиотека сама находит тексты в исходниках (HTML-шаблоны и JS/JSX/TSX), переводит их через ИИ и на лету подменяет их в уже отрисованной странице. Чтобы подключить её к проекту, код проекта дорабатывать не нужно — ни t('key'), ни data-i18n, ни любые другие вызовы в компонентах не требуются.


Требования

  • Python >= 3.9
  • Node.js (обязательно) — используется для разбора JS/JSX/TSX через настоящий AST-парсер (@babel/parser + @babel/traverse), а не через регулярные выражения. Без Node.js извлечение строк из JS/JSX-файлов работать не будет. Node нужен только на этапе сканирования проекта (autoi18n scan / воркер), в рантайме отдачи страниц он не требуется.
  • Перед первым использованием — установить зависимости JS-моста:
    cd <папка_библиотеки>/src/autoi18n/extractor/js_bridge
    npm install
    

Архитектура в двух словах

  • Ключ хранения — это хэш текста на исходном языке, а не семантический ID, который придумывает разработчик. Совпадающий текст в разных местах проекта — это одна и та же фраза.
  • Файл исходного языка (translations/<source_lang>.json) — сам по себе реестр всех известных фраз проекта. Отдельного файла-словаря ключей нет.
  • Сканирование (extract) сравнивает найденные в файлах фразы только с этим реестром. Новые фразы добавляются в реестр и ставятся в очередь на перевод на все активные целевые языки. Уже известные фразы повторно никуда не ставятся.
  • Библиотека сканирует только файлы проекта (HTML-шаблоны, JS/JSX/TSX). Контент, который заполняется в момент рендера — данные из БД, ответы пользователя, вопросы/ответы квиза и т.п. — она никогда не видит и не трогает.
  • Исходный язык и целевые языки — из .env, это единственный источник истины (SOURCE_LANG, AUTO_I18N_TARGET_LANGS). Новый целевой язык можно добавить в любой момент — add_target_lang() (например, из админки проекта) сразу дописывает .env (переживает рестарт) и переводит на него весь текущий реестр, не дожидаясь следующего цикла воркера.
  • Обязательный отладочный этап до подключения ИИ: autoi18n scan --dry-run показывает, что именно нашла библиотека — без записи чего-либо и без обращения к ИИ (ключ API для этой команды не нужен). Проверяете список руками на мусор/пропуски и только после этого запускаете реальное сканирование и перевод.
  • Клиентский рантайм ничего не требует от кода компонентов. После отрисовки страницы он обходит уже готовый DOM (TreeWalker) и подменяет видимый текст на перевод; изменения DOM после первой отрисовки (React-перерисовка, обновление счётчика) подхватываются через MutationObserver. Параметризованные фразы («Вопрос {{0}} / {{1}}») сопоставляются с живым текстом на странице по маске, скомпилированной из перевода с плейсхолдерами.

Быстрый старт

from autoi18n import Translator

t = Translator(env_path=".env")

.env проекта:

SOURCE_LANG=ru
AUTO_I18N_TARGET_LANGS=en,az
OPENAI_API_KEY=sk-...

1. Отладочный этап (обязательно перед подключением ИИ)

autoi18n scan --dry-run

Выводит список найденных фраз (файл, строка, текст, число параметров) — ничего не пишет на диск. Проверьте на мусор и пропуски.

2. Реальное сканирование

autoi18n scan

Новые фразы уходят в реестр исходного языка и в очередь на перевод для всех целевых языков из .env.

3. Перевод очереди

autoi18n translate

Требует настроенного ИИ (по умолчанию — OpenAI, OPENAI_API_KEY).

4. Добавить язык «на лету» (например, из админки)

autoi18n add-lang en

или из кода:

t.add_target_lang("en")

Дописывает .env и сразу переводит весь реестр на новый язык.

Фоновый цикл (сканирование + перевод по расписанию)

t.run_translation_loop(interval=300)  # раз в 5 минут: extract() -> process_queue()

Какие файлы сканируются

Сканируются только исходники проекта — стандартный набор путей (config.py, DEFAULT_SCAN_PATHS):

Папка Расширения Тип
frontend/src .js .jsx .ts .tsx JS/JSX (AST)
src .js .jsx .ts .tsx JS/JSX (AST)
app .js .jsx .ts .tsx JS/JSX (AST)
templates .html HTML
app/templates .html HTML
backend/templates .html HTML

Поиск файлов — явный обход папок (os.walk) по списку расширений, без glob-паттернов и без brace-expansion (*.{js,jsx}) — именно такие паттерны в v1 молча находили ноль файлов, так как glob в Python их не поддерживает. Служебные папки (node_modules, .git, dist, build, .venv и т.п.) пропускаются автоматически.

Что именно считается «текстом интерфейса»

  • JSX — текст между тегами и переводимые атрибуты (label, placeholder, title, aria-label).
  • HTML — видимый текст и переводимые атрибуты; содержимое <script> внутри HTML разбирается тем же JS/AST-парсером.
  • Императивные изменения текста в JS — только там, где строка структурно и есть видимый текст страницы: el.textContent = ..., el.innerText = ..., el.innerHTML = ..., а также аргументы alert()/confirm().

Обычные строковые литералы вне этих мест (CSS-в-JS значения, id, классы, URL и т.п.) намеренно не трогаются — иначе в реестр попадал бы технический мусор.


Методы Translator

Метод Назначение
extract(dry_run=False) Сканирует проект; dry_run=True — только отчёт, ничего не пишет.
process_queue(batch_size=50) Переводит накопленную очередь.
run_translation_loop(interval, batch_size) Фоновый цикл: extract()process_queue().
get_target_langs() Текущий список целевых языков из .env.
add_target_lang(lang) Добавляет язык в .env и сразу переводит на него весь реестр.
apply_to_html(html, lang) Подставляет перевод в уже отрисованный HTML.
apply_to_dict(source_dict, lang, filter_keys=None) Переводит значения вложенного словаря (например, JSON-ответ API).
build_runtime(lang, dynamic_dom_enabled=False) Генерирует клиентский JS-рантайм для языка.
register_keys(items, dict_name="bot") Регистрирует бэкенд-фразы, которых нет в файлах проекта (например, генерируемые сообщения).
translate_key(default, lang, dict_name="bot") Перевод бэкенд-фразы по её тексту (не по ключу — ключей больше нет).
get_translation_coverage(lang) Процент готовых переводов для языка.

translate_key больше не принимает семантический key — только текст на исходном языке (default) и язык. Если перевода ещё нет — ставит фразу в очередь и возвращает исходный текст.


Интеграция с проектом (без правок кода компонентов)

  1. На бэкенде — один хук в месте рендера страницы:
    html = t.apply_to_html(rendered_html, lang=current_lang)
    
    Для JSON-ответов API — аналогично apply_to_dict(...).
  2. На фронтенде — один <script> с рантаймом, подключённый один раз в точке входа:
    <script>
    // t.build_runtime(lang, dynamic_dom_enabled=True)
    </script>
    
  3. Переключение языка на клиенте:
    window.autoI18n.setLanguage('en');
    
    Рантайм сам подгрузит словарь нового языка и пройдёт по DOM — код компонентов трогать не нужно.

Переменные окружения

Переменная Описание
OPENAI_API_KEY Ключ ИИ-провайдера — нужен только для translate/add-lang, не для scan --dry-run.
SOURCE_LANG Исходный язык (по умолчанию ru).
AUTO_I18N_TARGET_LANGS Целевые языки через запятую — источник истины, редактируется через add_target_lang().
AUTO_I18N_CACHE_DIR Папка для файлов переводов (по умолчанию ./translations).

CLI

autoi18n scan --dry-run [--json]   отладочный этап: показать найденное, ничего не писать
autoi18n scan                      реальное сканирование
autoi18n translate [--batch-size]  перевести очередь
autoi18n add-lang <lang>           добавить целевой язык и перевести на него реестр
autoi18n coverage <lang>           процент покрытия перевода
autoi18n langs                     исходный и текущие целевые языки

Лицензия

MIT

Release files for auto-i18n-lib 2.0.5

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for auto-i18n-lib 2.0.5
File Size Uploaded
auto_i18n_lib-2.0.5.tar.gz 38.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for auto-i18n-lib 2.0.5
File Interpreter ABI Platform
auto_i18n_lib-2.0.5-py3-none-any.whl Python 3 none any Details

Total release size: 82.5 kB

Release files / auto_i18n_lib-2.0.5.tar.gz

Download URL auto_i18n_lib-2.0.5.tar.gz
Size 38.4 kB
Tags Source
SHA-256 checksum
How to use checksums
84012e460765979ebb1aab42a4806e8ffa1a8ab0b1d7b2e67d67ac62cc6af09c
BLAKE2b-256 checksum
How to use checksums
33f9827c782b3de6eb73af299ed2602c7ef35679485348fe06742e29fbc1d832
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.0

Release files / auto_i18n_lib-2.0.5-py3-none-any.whl

Download URL auto_i18n_lib-2.0.5-py3-none-any.whl
Size 44.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
4605eccd37636bc31f9d950577075f058ee919887bf54f629a4833f5305d6e9d
BLAKE2b-256 checksum
How to use checksums
fdc12085b3251d5d956ce29a03bbcfa992a713e4102f96d0e965c254c0ac3084
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.0

Release history Release notifications | RSS feed

2.1.1

2 release files

2.0.9

2 release files

2.0.8

2 release files

2.0.7

2 release files

2.0.6

2 release files

This release

2.0.5 This release

2 release files

2.0.4

2 release files

2.0.3

2 release files

2.0.2

2 release files

2.0.1

2 release files

1.2.0

2 release files

1.1.9

2 release files

1.1.8

2 release files

1.1.7

2 release files

1.1.6

2 release files

1.1.5

2 release files

1.1.4

2 release files

1.1.3

2 release files

1.1.2

2 release files

1.1.1

2 release files

1.1.0

2 release files

1.0.9

2 release files

1.0.8

2 release files

1.0.7

2 release files

1.0.6

2 release files

1.0.5

2 release files

1.0.4

2 release files

1.0.3

2 release files

1.0.2

2 release files

1.0.1

2 release files

0.5.1

2 release files

0.5.0

2 release files

0.4.0

2 release files

0.2.3

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page