auto-i18n-lib
Автоматическая библиотека для перевода интерфейсов без ручного сбора строк.
Что содержит библиотека
- Класс
Translator– публичное API для рендеринга и управления переводом. - Воркер – фоновый процесс, который:
- сканирует указанные файлы и папки (HTML, JS/JSX/TSX, UI-словари),
- извлекает все тексты интерфейса,
- переводит их через OpenAI,
- сохраняет в JSON-кэш,
- обновляет переводы при изменении кода.
- Парсеры для HTML, JSX/TSX, UI-словарей (рекурсивный обход).
- Клиентский рантайм – готовый JavaScript с функциями
translateKey()иsetLanguage()для динамического перевода DOM. - Storage – атомарное управление кэшем и очередями.
Что выполняет библиотека
- В фоне – автоматически находит все строки в проекте, переводит на целевые языки, поддерживает кэш актуальным.
- При рендеринге – методы
translate_html,translate_dict,translate_keyмгновенно отдают готовые переводы из локального кэша (без синхронных вызовов OpenAI). - На клиенте – смена языка подгружает новый JSON и перерисовывает интерфейс без перезагрузки страницы.
Быстрый старт
from autoi18n import Translator
t = Translator(
api_key="YOUR_OPENAI_API_KEY",
source_lang="ru",
target_langs=["en", "uk", "az", "tr"],
# Пути для сканирования
js_globs=["frontend/src/**/*.{js,jsx,tsx}"],
html_globs=["templates/**/*.html"],
)
# Запустить воркер (один раз или в фоновом потоке)
t.run_translation_loop(interval=300) # каждые 5 минут
Поиск файлов для перевода (scan_paths)
Библиотека сама решает, какие файлы сканировать. Список путей собирается из трёх источников, в порядке приоритета:
-
Аргумент
scan_pathsв конструкторе:t = Translator(scan_paths=[ {"path": "frontend/src/**/*.{js,jsx,tsx}", "type": "js"}, {"path": "backend/templates/**/*.html", "type": "html"}, {"path": "content/**/*", "type": "auto"}, ])
-
Env-переменная
AUTO_I18N_SCAN_PATHS(JSON-массив) — если аргумент не задан:AUTO_I18N_SCAN_PATHS=[{"path":"/app/frontend_src/**/*.js","type":"js"},{"path":"/app/templates/**/*.html","type":"html"}] -
Стандартный набор путей (
DEFAULT_SCAN_PATHS) — если ни аргумент, ни env не заданы:[ {"path": "frontend/src/**/*.{js,jsx,tsx}", "type": "js"}, {"path": "src/**/*.{js,jsx,tsx}", "type": "js"}, {"path": "app/**/*.{js,jsx,tsx}", "type": "js"}, {"path": "templates/**/*.html", "type": "html"}, {"path": "app/templates/**/*.html", "type": "html"}, {"path": "backend/templates/**/*.html", "type": "html"}, ]
Типы файлов
type |
Что делает |
|---|---|
js |
JS/JSX/TSX: только t('key', 'текст'), JSX-текст, JSX-атрибуты (label, placeholder, title, aria-label). |
html |
HTML-шаблоны (Jinja/Django/FastAPI): видимый текст, атрибуты, а также <script> внутри — через JS-парсер. |
auto |
По расширению: .html → HTML, .js/.jsx/.tsx/.ts → JS. |
Когда что использовать
- 0 конфига — если у вас стандартный проект (React в
frontend/, Jinja вtemplates/), ничего указывать не надо. - Через
.env— если на dev и prod пути разные (например, внутри контейнера/app/frontend_srcвместоfrontend/src). Env полностью заменяет дефолт. - Через аргумент — если пути нестандартные (
content/,docs/, внешние папки).
Метод extract_keys()
Единая точка входа для обхода всех путей:
report = t.extract_keys()
# {'files': 28, 'extracted': 142, 'queued': 568}
Старый extract_js_keys(js_globs=[...]) сохранён для обратной совместимости.
Методы рендеринга
| Метод | Назначение |
|---|---|
translate_html(html, target_lang, page_name) |
Переводит готовый HTML (текст и атрибуты). |
translate_dict(page_name, dict_name, source_dict, target_lang) |
Переводит вложенный словарь (UI). |
translate_key(key, lang, default, dict_name) |
Возвращает перевод бэкенд-фразы по ключу. |
register_keys(items, dict_name) |
Регистрирует исходные бэкенд-фразы. |
build_frontend_runtime(lang) |
Генерирует JS-рантайм для клиента. |
Пример интеграции с React
-
Настройте
Translatorс путями к вашему фронтенду. -
Запустите воркер – он сам найдёт все строки в компонентах (включая JSX-тексты, атрибуты, вызовы
t()). -
Вставьте сгенерированный рантайм в
index.html:<script> // Результат t.build_frontend_runtime('ru') </script>
-
В компонентах используйте:
// Любой текст, обёрнутый в translateKey, будет автоматически переведён <h1>{window.autoI18n.translateKey('dashboard_welcome', 'Добро пожаловать')}</h1>
Или атрибут
data-i18n="dashboard_welcome"на любом элементе. -
Переключение языка:
window.autoI18n.setLanguage('en');
Переменные окружения
| Переменная | Описание |
|---|---|
OPENAI_API_KEY |
Обязательный API‑ключ |
SOURCE_LANG |
Исходный язык (по умолчанию ru) |
AUTO_I18N_TARGET_LANGS |
Целевые языки через запятую |
AUTO_I18N_JS_GLOBS |
Glob-паттерны для JS/JSX (JSON-массив) |
AUTO_I18N_HTML_GLOBS |
Glob-паттерны для HTML |
AUTO_I18N_CACHE_DIR |
Папка для кэша (по умолчанию ./cache) |
AUTO_I18N_DYNAMIC_DOM_ENABLED |
Включить MutationObserver |
Требования к доработке (ТЗ)
Чтобы библиотека работала полностью автоматически, необходимо:
- Улучшенный JSX-парсер – должен находить все текстовые узлы в JSX, атрибуты (
label,placeholder,title,aria-label), вызовыt()иtranslateKey()в любом синтаксисе (включая шаблонные строки и переменные). - Автоматическое обновление переводов – воркер должен пересканивать файлы при их изменении (watch mode) и переводить только новые/изменённые строки.
- Клиентский рантайм – должен уметь подгружать переводы по требованию (lazy loading) и работать с React без дополнительных обёрток.
- Поддержка динамических атрибутов –
data-i18nдолжен работать для любых атрибутов, а не только для текста.
Лицензия
MIT
Release files for auto-i18n-lib 1.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| auto_i18n_lib-1.2.0.tar.gz | 24.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| auto_i18n_lib-1.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 53.5 kB
Release files / auto_i18n_lib-1.2.0.tar.gz
| Download URL | auto_i18n_lib-1.2.0.tar.gz |
|---|---|
| Size | 24.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
23f3a7c814755a9fccc7fea78e30aa97f524a85aa19f649800cd1b44a568fa73
|
|
BLAKE2b-256 checksum How to use checksums |
8572c484e15acc1d845037585dba7abc3b9d552f2629bc291c9c45135d3a58a7
|
| 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-1.2.0-py3-none-any.whl
| Download URL | auto_i18n_lib-1.2.0-py3-none-any.whl |
|---|---|
| Size | 29.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
71f2118d0ca1f7dab2987c902d70d79d19531942ad3246f046f60002c1f050a3
|
|
BLAKE2b-256 checksum How to use checksums |
661ae09da037c720da56c0b2e862475d3f8689650970a96637ad4cd4765bcfaf
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.0
|