Как организована автоматическая проверка локализации?
Комментарии (2)
Ответ сгенерирован нейросетью и может содержать ошибки
Организация автоматической проверки локализации
Автоматическая проверка локализации — критически важный процесс в современных интернациональных проектах, который я организую с помощью многоуровневого подхода, сочетающего статический анализ, интеграционные тесты и CI/CD пайплайны.
Ключевые компоненты системы проверки
1. Статический анализ переводов
Использую специализированные линтеры для проверки качества и полноты локализационных файлов:
// Пример конфигурации i18next-scanner с правилами валидации
module.exports = {
input: ['src/**/*.{js,jsx,ts,tsx}'],
output: './public/locales/',
options: {
debug: true,
removeUnusedKeys: true,
sort: true,
func: {
list: ['t', 'i18n.t'],
extensions: ['.js', '.jsx']
},
lngs: ['en', 'ru', 'de', 'fr'],
defaultLng: 'en',
resource: {
loadPath: 'public/locales/{{lng}}/{{ns}}.json',
savePath: 'public/locales/{{lng}}/{{ns}}.json',
jsonIndent: 2
}
}
};
2. Валидация форматов и плейсхолдеров
Реализую скрипты для проверки согласованности плейсхолдеров и форматов:
// Типизированная проверка плейсхолдеров
interface TranslationValidation {
missingKeys: string[];
placeholderMismatches: Array<{
key: string;
expected: string[];
actual: string[];
}>;
pluralizationIssues: string[];
}
function validateTranslations(
baseLang: Record<string, string>,
targetLang: Record<string, string>
): TranslationValidation {
// Логика сравнения ключей и плейсхолдеров
return {
missingKeys: [],
placeholderMismatches: [],
pluralizationIssues: []
};
}
Основные проверки в автоматизированном пайплайне
Проверка полноты переводов
- Сравнение ключей между эталонным языком (обычно en) и целевыми языками
- Обнаружение отсутствующих ключей переводов
- Выявление неиспользуемых ключей (dead keys)
Валидация интерполяций
- Проверка соответствия плейсхолдеров
{{variable}}между языками - Валидация форматов дат, чисел и валют
- Проверка правильности работы pluralization
Лингвистические проверки
- Детектирование "hardcoded strings" в коде
- Проверка максимальной длины строк для UI элементов
- Валидация специальных символов и HTML-тегов
Интеграция в CI/CD процесс
Конфигурация GitHub Actions Workflow:
name: Localization Checks
on: [push, pull_request]
jobs:
localization-validation:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
- name: Install dependencies
run: npm ci
- name: Extract translation keys
run: npm run i18n:extract
- name: Validate translations
run: npm run i18n:validate
- name: Check for missing translations
run: |
npm run i18n:check-missing
npm run i18n:check-unused
- name: Run visual regression tests for RTL
run: npm run test:rtl -- --languages=ar,he
- name: Upload report
uses: actions/upload-artifact@v3
if: always()
with:
name: localization-report
path: reports/localization/
Инструментарий и библиотеки
Основной стек:
- i18next с react-i18next для React-приложений
- i18next-scanner для автоматического извлечения ключей
- i18next-parser для синхронизации переводов
- Lokalise API или Crowdin CLI для интеграции с платформами переводов
- Jest + i18next-validate для юнит-тестов переводов
- Cypress или Playwright для E2E-тестирования локализованного UI
Пример комплексного теста локализации
describe('Localization Integration', () => {
const SUPPORTED_LOCALES = ['en', 'ru', 'de', 'es'];
SUPPORTED_LOCALES.forEach(locale => {
it(`should render correctly for ${locale} locale`, () => {
cy.visit('/', {
onBeforeLoad(win) {
Object.defineProperty(win.navigator, 'language', {
value: locale
});
}
});
// Проверка заголовков и ключевых элементов
cy.get('[data-testid="main-title"]')
.should('be.visible')
.and('not.contain', 'translation-missing');
// Проверка форматирования чисел и дат
cy.get('[data-testid="product-price"]')
.should('match.locale.format', locale);
});
});
});
Мониторинг и отчетность
Создаю дашборды для отслеживания:
- Процент переведенного контента
- Количество непереведенных ключей
- История изменений переводов
- Статус проверки качества переводов
Лучшие практики, которые я применяю
- Единый источник истины — все строки только в локализационных файлах
- Ключевая нормализация — структурированные имена ключей по функциональности
- Контекст для переводчиков — добавление комментариев к сложным переводам
- Псевдо-локализация в dev-сборках для выявления проблем макета
- RTL-тестирование для правосторонних языков
Такая система позволяет обнаруживать 95% локализационных проблем до попадания в прод, значительно сокращая время на исправление и улучшая пользовательский опыт для международной аудитории. Автоматизация экономит десятки человеко-часов ежемесячно и обеспечивает консистентность локализации на всем протяжении жизненного цикла продукта.