provisioning/docs/src/features/multilingual-support.md

389 lines
12 KiB
Markdown
Raw Normal View History

2026-01-17 03:58:28 +00:00
# Multilingual Support
Provisioning includes comprehensive multilingual support for help text, forms, and
interactive interfaces. The system uses Mozilla Fluent for translations with automatic
fallback chains.
## Supported Languages
Currently supported with 100% translation coverage:
| Language | Locale | Status | Strings |
| --- | --- | --- | --- |
| English (US) | en-US | ✅ Complete | 245 |
| Spanish (Spain) | es-ES | ✅ Complete | 245 |
| Portuguese (Brazil) | pt-BR | 🔄 Planned | - |
| French (France) | fr-FR | 🔄 Planned | - |
| Japanese (Japan) | ja-JP | 🔄 Planned | - |
**Coverage Requirement**: 95% of strings translated to critical locales (en-US, es-ES).
## Using Different Languages
### Setting Language via Environment Variable
Select language using the `LANG` environment variable:
```bash
# English (default)
provisioning help infrastructure
# Spanish
LANG=es_ES provisioning help infrastructure
# Fallback to English if locale not available
LANG=fr_FR provisioning help infrastructure
# Output: English (en-US) [fallback chain]
```
### Locale Resolution
Language selection follows this order:
1. Check `LANG` environment variable (e.g., `es_ES`)
2. Match to configured locale (es-ES)
3. If not found, follow fallback chain (es-ES → en-US)
4. Default to en-US if no match
**Format**: `LANG` uses underscore (es_ES), locales use hyphen (es-ES). System handles conversion automatically.
## Translation System Architecture
### Mozilla Fluent Format
All translations use Mozilla Fluent (.ftl files), which provides:
- **Simple Syntax**: Key-value pairs with rich formatting
- **Pluralization**: Support for language-specific plural rules
- **Attributes**: Multiple values per key for contextual translation
- **Automatic Fallback**: Chain resolution when keys missing
- **Extensibility**: Support for custom formatting functions
**Example Fluent syntax**:
```text
help-infra-server-create = Create a new server
form-database_type-option-postgres = PostgreSQL (Recommended)
form-replicas-prompt = Number of replicas
form-replicas-help = How many replicas to run
```
### File Organization
```text
provisioning/locales/
├── i18n-config.toml # Central i18n configuration
├── en-US/ # English base language
│ ├── help.ftl # Help system strings (65 keys)
│ └── forms.ftl # Form strings (180 keys)
└── es-ES/ # Spanish translations
├── help.ftl # Help system translations
└── forms.ftl # Form translations
```
**String Categories**:
- **help.ftl** (65 strings): Help text, menu items, category descriptions, error messages
- **forms.ftl** (180 strings): Form labels, placeholders, help text, options
## Help System Translations
Help system provides multi-language support for all command categories:
### Categories Covered
| Category | Coverage | Example Keys |
| --- | --- | --- |
| Infrastructure | ✅ 21 strings | server commands, taskserv, clusters, VMs |
| Orchestration | ✅ 18 strings | workflows, batch operations, orchestrator |
| Workspace | ✅ Complete | workspace management, templates |
| Setup | ✅ Complete | system configuration, initialization |
| Authentication | ✅ Complete | JWT, MFA, sessions |
| Platform | ✅ Complete | services, Control Center, MCP |
| Development | ✅ Complete | modules, versions, plugins |
| Utilities | ✅ Complete | providers, SOPS, SSH |
### Example: Help Output in Spanish
```bash
$ LANG=es_ES provisioning help infrastructure
SERVIDOR E INFRAESTRUCTURA
Gestión de servidores, taskserv, clusters, VM e infraestructura.
COMANDOS DE SERVIDOR
server create Crear un nuevo servidor
server delete Eliminar un servidor existente
server list Listar todos los servidores
server status Ver estado de un servidor
COMANDOS DE TASKSERV
taskserv create Crear un nuevo servicio de tarea
taskserv delete Eliminar un servicio de tarea
taskserv configure Configurar un servicio de tarea
taskserv status Ver estado del servicio de tarea
```
## Form Translations (TypeDialog Integration)
Interactive forms automatically use the selected language:
### Setup Form
Project information, database configuration, API settings, deployment options, security, etc.
```bash
# English form
$ provisioning setup profile
📦 Project name: [my-app]
# Spanish form
$ LANG=es_ES provisioning setup profile
📦 Nombre del proyecto: [mi-app]
```
### Translated Form Fields
Each form field has four translated strings:
| Component | Purpose | Example en-US | Example es-ES |
| --- | --- | --- | --- |
| prompt | Field label | "Project name" | "Nombre del proyecto" |
| help | Helper text | "Project name (lowercase alphanumeric with hyphens)" | "Nombre del proyecto (minúsculas alfanuméricas con guiones)" |
| placeholder | Example value | "my-app" | "mi-app" |
| option | Dropdown choice | "PostgreSQL (Recommended)" | "PostgreSQL (Recomendado)" |
### Supported Forms
- **Unified Setup**: Project info, database, API, deployment, security, terms
- **Authentication**: Login form (username, password, remember me, forgot password)
- **Setup Wizard**: Quick/standard/advanced modes
- **MFA Enrollment**: TOTP, SMS, backup codes, device management
- **Infrastructure**: Delete confirmations, resource prompts, data retention
## Fallback Chain Configuration
When a translation string is missing, the system automatically falls back to the parent locale:
```toml
# From i18n-config.toml
[fallback_chains]
es-ES = ["en-US"]
pt-BR = ["pt-PT", "es-ES", "en-US"]
fr-FR = ["en-US"]
ja-JP = ["en-US"]
```
**Resolution Example**:
1. User requests Spanish (es-ES): `provisioning help`
2. Look for string in `es-ES/help.ftl`
3. If missing, fallback to en-US (`help-infra-server-create = "Create a new server"`)
4. If still missing, use literal key name as display text
## Adding New Languages
### 1. Add Locale Configuration
Edit `provisioning/locales/i18n-config.toml`:
```toml
[locales.pt-BR]
name = "Portuguese (Brazil)"
direction = "ltr"
plurals = 2
decimal_separator = ","
thousands_separator = "."
date_format = "DD/MM/YYYY"
[fallback_chains]
pt-BR = ["pt-PT", "es-ES", "en-US"]
```
**Configuration Fields**:
- **name**: Display name of locale
- **direction**: Text direction (ltr/rtl)
- **plurals**: Number of plural forms (1-6 depending on language)
- **decimal_separator**: Locale-specific decimal format
- **thousands_separator**: Number formatting
- **date_format**: Locale-specific date format
- **currency_symbol**: Currency symbol (optional)
- **currency_position**: "prefix" or "suffix" (optional)
### 2. Create Locale Directory
```bash
mkdir -p provisioning/locales/pt-BR
```
### 3. Create Translation Files
Copy English files as base:
```bash
cp provisioning/locales/en-US/help.ftl provisioning/locales/pt-BR/help.ftl
cp provisioning/locales/en-US/forms.ftl provisioning/locales/pt-BR/forms.ftl
```
### 4. Translate Strings
Edit `pt-BR/help.ftl` and `pt-BR/forms.ftl` with translated content. Follow naming conventions:
```text
# Help strings: help-{category}-{element}
help-infra-server-create = Criar um novo servidor
# Form prompts: form-{element}-prompt
form-project_name-prompt = Nome do projeto
# Form help: form-{element}-help
form-project_name-help = Nome do projeto (alfanumérico minúsculo com hífens)
# Form options: form-{element}-option-{value}
form-database_type-option-postgres = PostgreSQL (Recomendado)
```
### 5. Validate Translation
Check coverage and syntax:
```bash
# Validate Fluent file syntax
provisioning i18n validate --locale pt-BR
# Check translation coverage
provisioning i18n coverage --locale pt-BR
# List missing translations
provisioning i18n missing --locale pt-BR
```
### 6. Update Documentation
Document new language support in translations_status.md.
## Validation & Quality Standards
### Translation Quality Rules
**Naming Conventions** (REQUIRED):
- Help strings: `help-{category}-{element}` (e.g., `help-infra-server-create`)
- Form prompts: `form-{element}-prompt` (e.g., `form-project_name-prompt`)
- Form help: `form-{element}-help` (e.g., `form-project_name-help`)
- Form placeholders: `form-{element}-placeholder`
- Form options: `form-{element}-option-{value}` (e.g., `form-database_type-option-postgres`)
- Section headers: `section-{name}-title`
**Coverage Requirements**:
- **Critical Locales**: en-US, es-ES require 95% minimum coverage
- **Warning Threshold**: 80% triggers warnings during build
- **Incomplete Locales**: 0% coverage allowed (inherit via fallback chain)
### Testing Localization
Test translations via different methods:
```bash
# Test help system in Spanish
LANG=es_ES provisioning help infrastructure
# Test form display in Spanish
LANG=es_ES provisioning setup profile
# Validate all translation files
provisioning i18n validate --all
# Generate coverage report
provisioning i18n coverage --format=json > coverage.json
```
## Implementation Details
### TypeDialog Integration
TypeDialog forms reference Fluent keys via `locales_path` configuration:
```toml
# In form.toml
locales_path = "../../../locales"
[[elements]]
name = "project_name"
prompt = "form-project_name-prompt" # References: locales/*/forms.ftl
help = "form-project_name-help"
placeholder = "form-project_name-placeholder"
```
**Resolution Process**:
1. Read `locales_path` from form configuration
2. Check `LANG` environment variable (converted to locale format: es_ES → es-ES)
3. Load Fluent file (e.g., `locales/es-ES/forms.ftl`)
4. Resolve string key → value
5. If key missing, follow fallback chain
6. If still missing, use literal key name
### Help System Integration
Help system uses Fluent catalog loader in `provisioning/core/nulib/main_provisioning/help_system.nu`:
```nushell
# Load help strings for current locale
let help_strings = (load_fluent_catalog $locale)
# Display localized help text
print ($help_strings | get help-infrastructure-title)
```
## Maintenance
### Adding New Translations
When new help text or forms are added:
1. Add English strings to `en-US/help.ftl` or `en-US/forms.ftl`
2. Add Spanish translations to `es-ES/help.ftl` or `es-ES/forms.ftl`
3. Run validation: `provisioning i18n validate`
4. Update `translations_status.md` with new counts
5. If coverage drops below 95%, fix before release
### Updating Existing Translations
To modify existing translated string:
1. Edit key in `en-US/*.ftl` and all locale-specific files
2. Run validation to ensure consistency
3. Test in both languages: `LANG=en_US provisioning help` and `LANG=es_ES provisioning help`
## Current Translation Status
**Last Updated**: 2026-01-13 | **Status**: 100% Complete
### String Count
| Component | en-US | es-ES | Status |
| --- | --- | --- | --- |
| Help System | 65 | 65 | ✅ Complete |
| Forms | 180 | 180 | ✅ Complete |
| **Total** | **245** | **245** | **✅ Complete** |
### Features Enabled
| Feature | Status | Purpose |
| --- | --- | --- |
| Pluralization | ✅ Enabled | Support language-specific plural rules |
| Number Formatting | ✅ Enabled | Locale-specific number/currency formatting |
| Date Formatting | ✅ Enabled | Locale-specific date display |
| Fallback Chains | ✅ Enabled | Automatic fallback to English |
| Gender Agreement | ⚠️ Disabled | Not needed for Spanish help strings |
| RTL Support | ⚠️ Disabled | No RTL languages configured yet |
## Related Documentation
- [System Setup](../setup/initial-setup.md) - Configure Provisioning after installation
- [Workspace Management](./workspace-management.md) - Workspace configuration and usage
- [Design Principles](../architecture/design-principles.md) - Architecture and design
- [API Reference](../api-reference/cli-commands.md) - CLI commands and help system