Разработка AI-системы локализации и интернационализации
Локализация — не просто перевод. Это адаптация продукта к культурному контексту целевого рынка: числовые форматы, направление текста, единицы измерения, цветовые символы, юридические требования. AI-система автоматизирует технические аспекты и ускоряет лингвистическую адаптацию.
I18n-инфраструктура
Предпосылка качественной локализации — правильная интернационализация кода. Основные проблемы в существующих проектах:
- Хардкодированные строки вместо i18n-ключей
- Конкатенация строк вместо placeholder-форматирования
- Игнорирование plural forms (в русском — 4 формы: 1, 2-4, 5+, 0)
- Отсутствие поддержки RTL (арабский, иврит)
- Хардкодированные форматы дат и чисел
# Плохо: конкатенация
message = "Найдено " + str(count) + " результатов"
# Хорошо: ICU MessageFormat
message = t("search.results_count", count=count)
# В файле локализации: "search.results_count": "{count, plural, one {Найден # результат} few {Найдено # результата} many {Найдено # результатов} other {Найдено # результата}}"
AI-анализ кодовой базы
Система сканирует кодовую базу и выявляет:
- Все хардкодированные строки (AST-анализ + регулярные выражения)
- Форматирование дат/чисел без использования Intl API
- Конкатенации строк с переменными
- Изображения с встроенным текстом
class I18nAudit:
def audit_codebase(self, repo_path: str) -> AuditReport:
issues = []
for file in self.scan_files(repo_path, extensions=[".ts", ".tsx", ".jsx", ".py"]):
ast_tree = parse_ast(file)
# Поиск строковых литералов вне i18n-функций
for node in ast_tree.string_literals:
if not self.is_in_i18n_call(node) and self.looks_like_ui_text(node.value):
issues.append(I18nIssue(
file=file,
line=node.line,
text=node.value,
issue_type="hardcoded_string",
suggested_key=self.suggest_key(node.value)
))
return AuditReport(issues=issues, summary=self.summarize(issues))
Автоматический перевод с контекстом
Отличие от просто MT: система учитывает контекст интерфейса. Кнопка «Сохранить» и заголовок раздела «Сохранённые» — разные словоформы. Глоссарий терминов продукта обеспечивает консистентность: одно понятие переводится одинаково везде.
def translate_with_context(
key: str,
source_text: str,
context: UIContext,
target_lang: str,
glossary: Glossary,
tm: TranslationMemory
) -> Translation:
# Проверка Translation Memory
tm_match = tm.find_match(source_text, min_similarity=0.85)
if tm_match and tm_match.similarity > 0.95:
return tm_match.translation # 100% или near-100% match
# Подбор терминов из глоссария
terms = glossary.find_terms(source_text, target_lang)
# Перевод с учётом контекста
translation = mt_engine.translate(
text=source_text,
target_lang=target_lang,
context=f"UI element: {context.element_type}, screen: {context.screen_name}",
enforce_terms=terms
)
# Сохранение в TM для повторного использования
tm.store(source_text, translation, target_lang, context)
return translation
Псевдолокализация для тестирования
До полного перевода — псевдолокализация: замена символов декорированными аналогами + увеличение длины строки (немецкий длиннее английского на 30%). Позволяет выявить проблемы с layout, усечение строк, не i18n-совместимые участки — до того, как реальный переводчик потратит время.
Continuous localization
Интеграция с CI/CD: при коммите новых строк система автоматически отправляет их на перевод в TMS (Phrase, Crowdin, Lokalise). QA-проверка переведённых строк до публикации: длина не превышает лимит поля, плейсхолдеры сохранены, нет машинных артефактов.
Поддерживаемые языки и регионы
| Регион | Языки | Особенности |
|---|---|---|
| СНГ | ru, uk, kk, be | Падежи, склонения, plural forms |
| Западная Европа | en, de, fr, es, it | Длинные немецкие составные слова |
| Ближний Восток | ar, he | RTL, особые числовые форматы |
| Азия | zh, ja, ko | Иероглифы, вертикальный текст |







