Реализация AI-перевода контента сайта
Машинный перевод прошёл долгий путь от PROMT до нейросетевых моделей. Современные LLM-переводы сопоставимы с профессиональными по качеству для большинства языковых пар и предметных областей, а по скорости и стоимости — вне конкуренции.
Выбор провайдера
DeepL API — лучшее качество для европейских языков, особенно немецкого, французского, нидерландского. Бесплатный тариф: 500 000 символов в месяц. Платный от $5.49/месяц за 1M символов. Поддерживает сохранение форматирования HTML.
Google Cloud Translation — 135 языков, включая редкие. Basic API (v2) работает с простым текстом, Advanced (v3) понимает HTML и поддерживает глоссарии. Цена: $20 за 1M символов после бесплатного лимита в 500 000 символов.
OpenAI / Anthropic — не специализированные переводчики, но отлично справляются с контекстуальным переводом, сохранением тона и специфической терминологии. Дороже DeepL, но гибче в настройке.
LibreTranslate — open-source, можно развернуть локально. Качество ниже, но нет зависимости от внешних API и нет стоимости за запрос.
Интеграция DeepL
import deepl
translator = deepl.Translator(auth_key="your-api-key")
def translate_text(text: str, target_lang: str = "RU", source_lang: str = None) -> str:
result = translator.translate_text(
text,
target_lang=target_lang,
source_lang=source_lang,
tag_handling="html", # сохраняет HTML-теги
preserve_formatting=True
)
return result.text
def translate_batch(texts: list[str], target_lang: str) -> list[str]:
results = translator.translate_text(texts, target_lang=target_lang)
return [r.text for r in results]
Перевод HTML-контента
Прямой перевод HTML-строки без обработки разрушает разметку. DeepL и Google Translation API поддерживают tag_handling="html" — они переводят только текстовые узлы, не трогая атрибуты и теги.
Для кастомной обработки используйте BeautifulSoup:
from bs4 import BeautifulSoup
def translate_html_content(html: str, target_lang: str) -> str:
soup = BeautifulSoup(html, "html.parser")
text_nodes = soup.find_all(text=True)
for node in text_nodes:
if node.parent.name in ["script", "style", "code", "pre"]:
continue
if node.strip():
translated = translate_text(str(node), target_lang)
node.replace_with(translated)
return str(soup)
Глоссарии и терминология
Для специализированных сайтов (медицина, право, техника) стандартный перевод даёт неточную терминологию. DeepL поддерживает глоссарии:
glossary = translator.create_glossary(
"Medical terms RU-EN",
source_lang="RU",
target_lang="EN-US",
entries={
"инфаркт миокарда": "myocardial infarction",
"артериальное давление": "blood pressure",
"анамнез": "medical history"
}
)
result = translator.translate_text(
text,
target_lang="EN-US",
glossary=glossary
)
Стратегия кэширования
Переводить один и тот же контент при каждом запросе — расточительство. Стратегии хранения:
Отдельная таблица переводов — content_translations(content_id, locale, field, translated_text, translated_at, source_hash). При изменении исходного контента source_hash меняется, перевод помечается устаревшим.
Файловый кэш для статических сайтов — переводы сохраняются как JSON-файлы рядом с исходным контентом.
Redis для временного кэша — ключ translation:{lang}:{sha256(text)}, TTL 30 дней.
Автоматический перевод при публикации
Типичный воркфлоу для многоязычного CMS:
- Редактор публикует контент на основном языке
- Webhook или событие в очереди запускает задачу перевода
- Воркер переводит все поля параллельно через batch-запросы
- Переводы сохраняются со статусом
auto_translated - Переводчик-редактор проверяет и при необходимости правит; статус меняется на
reviewed - Фронтенд показывает предупреждение для
auto_translatedконтента (опционально)
Обнаружение языка
Перед переводом нужно знать исходный язык. Не полагайтесь только на настройки сайта — пользователь может вставить текст на другом языке.
# Google Cloud Translation
from google.cloud import translate_v2 as translate
def detect_language(text: str) -> str:
client = translate.Client()
result = client.detect_language(text)
return result["language"] # "ru", "en", "de", ...
Сроки
Интеграция DeepL/Google Translation API с базовым кэшем — 3–4 дня. Автоматический перевод при публикации через очередь — плюс 2–3 дня. Глоссарии и workflow проверки — плюс 2 дня.







