Key features implemented: - New i18n module with JSON-based message catalogs for multi-language support - Added Russian (ru-RU) and English (en-US) localization files with 100+ messages - PowerShell module ActivityWatch.Windows.I18n.psm1 with fallback mechanism - Node.js validation and coverage analysis scripts for locale management - Package.json configuration with semantic versioning and build tools - README_RU.md documentation with integration examples and best practices The implementation provides comprehensive internationalization support with automated validation, versioning, and fallback capabilities for robust multilingual deployments.
265 lines
9.7 KiB
Markdown
265 lines
9.7 KiB
Markdown
# Интернационализация (i18n) в AWatch-rus
|
|
|
|
## Обзор
|
|
|
|
Модуль интернационализации обеспечивает поддержку многоязычного интерфейса для PowerShell-скриптов проекта AWatch-rus.
|
|
|
|
## Возможности
|
|
|
|
- **JSON-based каталоги сообщений** — удобное хранение и редактирование переводов
|
|
- **Автоматический fallback** — при отсутствии перевода используется резервный язык
|
|
- **Параметризованные сообщения** — поддержка форматирования с плейсхолдерами `{0}`, `{1}`, etc.
|
|
- **Автоверсионизация** — семантическое версионирование каталогов переводов
|
|
- **Валидация** — проверка структуры и консистентности переводов
|
|
- **Анализ покрытия** — отчет о полноте переводов по языкам
|
|
|
|
## Структура
|
|
|
|
```
|
|
i18n/
|
|
├── en-US.json # Reference locale (English)
|
|
├── ru-RU.json # Russian translation
|
|
├── package.json # Node.js scripts configuration
|
|
└── scripts/
|
|
├── validate-locales.js # Валидация JSON-файлов
|
|
├── check-coverage.js # Анализ покрытия переводов
|
|
└── bump-version.js # Автоверсионирование
|
|
```
|
|
|
|
## Быстрый старт
|
|
|
|
### 1. Инициализация локали в PowerShell скрипте
|
|
|
|
```powershell
|
|
# Импортируйте модуль i18n
|
|
Import-Module "$PSScriptRoot\ActivityWatch.Windows.I18n.psm1" -Force
|
|
|
|
# Инициализируйте русскую локаль с английским fallback
|
|
Initialize-Locale -Culture "ru-RU" -FallbackCulture "en-US"
|
|
|
|
# Или автодетект культуры системы
|
|
Initialize-Locale -AutoDetect
|
|
```
|
|
|
|
### 2. Использование локализованных строк
|
|
|
|
```powershell
|
|
# Простое сообщение
|
|
$message = Get-LocalizedString -Key "errors.admin_required"
|
|
|
|
# Сообщение с параметрами
|
|
$message = Get-LocalizedString -Key "errors.binary_missing" -FormatArgs @("aw-watcher-afk.exe")
|
|
|
|
# Вывод информации
|
|
Get-LocalizedInfo -Key "starting_deployment" -FormatArgs @("v0.13.2")
|
|
|
|
# Вывод предупреждения
|
|
Get-LocalizedWarning -Key "insecure_connection"
|
|
|
|
# Создание ошибки
|
|
$errorRecord = Get-LocalizedError -Key "config_not_found" -FormatArgs @($configPath)
|
|
throw $errorRecord
|
|
|
|
# Статусы
|
|
$status = Get-LocalizedStatus -Key "installation_success"
|
|
|
|
# Подтверждение от пользователя
|
|
if (Read-LocalizedConfirm -PromptKey "confirm_install" -FormatArgs @($userCount)) {
|
|
# Продолжить установку
|
|
}
|
|
```
|
|
|
|
### 3. Категории сообщений
|
|
|
|
| Категория | Префикс ключа | Пример использования |
|
|
|-----------|---------------|---------------------|
|
|
| Errors | `errors.*` | Сообщения об ошибках, исключения |
|
|
| Info | `info.*` | Информационные сообщения |
|
|
| Warnings | `warnings.*` | Предупреждения |
|
|
| Prompts | `prompts.*` | Запросы к пользователю |
|
|
| Status | `status.*` | Статусы операций |
|
|
| Choices | `choices.*` | Варианты выбора |
|
|
|
|
## Формат JSON каталога
|
|
|
|
```json
|
|
{
|
|
"version": "1.0.0",
|
|
"language": "ru",
|
|
"fallback": "en",
|
|
"messages": {
|
|
"errors.admin_required": "Запустите этот скрипт из сеанса PowerShell с правами администратора.",
|
|
"errors.binary_missing": "Отсутствует требуемый двоичный файл ActivityWatch: {0}",
|
|
"info.starting_deployment": "Начало развертывания ActivityWatch версии {0}...",
|
|
"prompts.confirm_install": "Вы уверены, что хотите установить ActivityWatch для {0} пользователей?"
|
|
}
|
|
}
|
|
```
|
|
|
|
### Поля каталога
|
|
|
|
| Поле | Тип | Обязательное | Описание |
|
|
|------|-----|--------------|----------|
|
|
| `version` | string | Да | Семантическая версия (X.Y.Z) |
|
|
| `language` | string | Да | Код языка (например, "ru", "en") |
|
|
| `fallback` | string/null | Да | Код резервного языка или null |
|
|
| `messages` | object | Да | Объект с сообщениями |
|
|
|
|
## Скрипты управления
|
|
|
|
### Валидация переводов
|
|
|
|
Проверяет структуру JSON, наличие обязательных полей, консистентность плейсхолдеров:
|
|
|
|
```bash
|
|
cd i18n
|
|
npm install
|
|
npm run validate
|
|
```
|
|
|
|
### Анализ покрытия
|
|
|
|
Сравнивает все локали с reference (en-US) и показывает процент покрытия:
|
|
|
|
```bash
|
|
npm run coverage
|
|
```
|
|
|
|
Пример вывода:
|
|
```
|
|
┌──────────────────────────────────────────────────────────────────────────────┐
|
|
│ Locale │ Version │ Language │ Coverage │ Missing │ Extra │
|
|
├──────────────────────────────────────────────────────────────────────────────┤
|
|
│ ru-RU │ 1.0.0 │ ru │ 100.00% ✅ │ 0 │ 0 │
|
|
└──────────────────────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
### Автоверсионирование
|
|
|
|
Бump версии всех каталогов одновременно:
|
|
|
|
```bash
|
|
# Patch bump (1.0.0 → 1.0.1)
|
|
npm run bump
|
|
|
|
# Minor bump (1.0.0 → 1.1.0)
|
|
npm run bump -- --minor
|
|
|
|
# Major bump (1.0.0 → 2.0.0)
|
|
npm run bump -- --major
|
|
```
|
|
|
|
## Интеграция с существующими скриптами
|
|
|
|
### Обновление ActivityWatch.Windows.Common.psm1
|
|
|
|
Замените хардкодные строки на вызовы i18n:
|
|
|
|
**До:**
|
|
```powershell
|
|
throw 'Run this script from an elevated PowerShell session.'
|
|
```
|
|
|
|
**После:**
|
|
```powershell
|
|
throw (Get-LocalizedString -Key "errors.admin_required")
|
|
```
|
|
|
|
### Обновление deploy-ensemble.ps1
|
|
|
|
**До:**
|
|
```powershell
|
|
Write-Host "Starting ActivityWatch deployment..." -ForegroundColor Cyan
|
|
```
|
|
|
|
**После:**
|
|
```powershell
|
|
Get-LocalizedInfo -Key "starting_deployment"
|
|
```
|
|
|
|
## Добавление нового языка
|
|
|
|
1. Скопируйте `en-US.json` как шаблон:
|
|
```bash
|
|
cp i18n/en-US.json i18n/fr-FR.json
|
|
```
|
|
|
|
2. Отредактируйте `fr-FR.json`:
|
|
- Измените `language` на `"fr"`
|
|
- Установите `fallback` в `"en"`
|
|
- Переведите все сообщения в `messages`
|
|
|
|
3. Проверьте валидность:
|
|
```bash
|
|
npm run validate fr-FR.json
|
|
```
|
|
|
|
4. Протестируйте в PowerShell:
|
|
```powershell
|
|
Initialize-Locale -Culture "fr-FR"
|
|
```
|
|
|
|
## Best Practices
|
|
|
|
### ✅ Делайте
|
|
|
|
- Используйте семантическое версионирование для каталогов
|
|
- Всегда указывайте fallback для resilience
|
|
- Группируйте сообщения по категориям (errors.*, info.*, etc.)
|
|
- Нумеруйте плейсхолдеры последовательно: `{0}`, `{1}`, `{2}`
|
|
- Проверяйте покрытие перед релизом (`npm run coverage`)
|
|
|
|
### ❌ Не делайте
|
|
|
|
- Не хардкодьте строки в коде скриптов
|
|
- Не смешивайте языки в одном сообщении
|
|
- Не пропускайте плейсхолдеры в переводах
|
|
- Не забывайте обновлять версию при изменении сообщений
|
|
|
|
## Troubleshooting
|
|
|
|
### Ошибка: "Localization file not found"
|
|
|
|
Убедитесь, что путь к i18n директории правильный:
|
|
```powershell
|
|
$env:I18N_ROOT = "C:\Path\To\i18n"
|
|
Initialize-Locale -Culture "ru-RU" -I18nRoot $env:I18N_ROOT
|
|
```
|
|
|
|
### Ошибка: "Failed to format message"
|
|
|
|
Проверьте соответствие количества аргументов плейсхолдерам:
|
|
```powershell
|
|
# ❌ Неправильно: 2 аргумента для 1 плейсхолдера
|
|
Get-LocalizedString -Key "errors.binary_missing" -FormatArgs @("file.exe", "extra")
|
|
|
|
# ✅ Правильно
|
|
Get-LocalizedString -Key "errors.binary_missing" -FormatArgs @("file.exe")
|
|
```
|
|
|
|
### Missing keys после обновления en-US
|
|
|
|
Запустите анализ покрытия и добавьте отсутствующие ключи:
|
|
```bash
|
|
npm run coverage
|
|
# Отредактируйте ru-RU.json, добавив missing keys
|
|
npm run validate
|
|
```
|
|
|
|
## Миграция с хардкодных строк
|
|
|
|
1. Экспортируйте существующие строки в шаблон:
|
|
```powershell
|
|
Export-LocaleTemplate -OutputPath ".\i18n\template.json"
|
|
```
|
|
|
|
2. Заполните переводы
|
|
|
|
3. Постепенно заменяйте строки в коде на вызовы i18n функций
|
|
|
|
4. Протестируйте с обоими локалями
|
|
|
|
## Лицензия
|
|
|
|
MIT
|