Files
Fabric/docs/i18n.md
Kayvan Sylvan 20080fcb78 feat: add i18n support with Spanish localization and documentation improvements
- Add internationalization system with Spanish support
- Create contexts and sessions tutorial documentation
- Fix broken Warp sponsorship image URL
- Add locale detection from environment variables
- Update VSCode settings with new dictionary words
- Exclude VSCode settings from version workflows
- Update pattern descriptions and explanations
- Add comprehensive i18n test coverage
2025-09-08 09:17:23 -07:00

183 lines
4.6 KiB
Markdown

# Internationalization (i18n) in Fabric
Fabric supports multiple languages through its internationalization system. The system automatically detects your preferred language from environment variables and provides localized messages.
## How Locale Detection Works
Fabric follows POSIX standards for locale detection with the following priority order:
1. **Explicit language flag**: `--language` or `-g` (highest priority)
2. **LC_ALL**: Complete locale override environment variable
3. **LC_MESSAGES**: Messages-specific locale environment variable
4. **LANG**: General locale environment variable
5. **Default fallback**: English (`en`) if none are set or valid
### Examples
```bash
# Use explicit language flag
fabric --language es --pattern summarize
# Use LC_ALL environment variable
LC_ALL=fr_FR.UTF-8 fabric --pattern summarize
# Use LANG environment variable
LANG=de_DE.UTF-8 fabric --pattern summarize
# Multiple environment variables (LC_ALL takes priority)
LC_ALL=es_ES.UTF-8 LANG=fr_FR.UTF-8 fabric --pattern summarize
# Uses Spanish (es_ES) because LC_ALL has higher priority
```
## Supported Locale Formats
The system automatically normalizes various locale formats:
- `en_US.UTF-8``en-US`
- `fr_FR@euro``fr-FR`
- `zh_CN.GB2312``zh-CN`
- `de_DE.UTF-8@traditional``de-DE`
Special cases:
- `C` or `POSIX` → treated as invalid, falls back to English
## Translation File Locations
Translations are loaded from multiple sources in this order:
1. **Embedded files** (highest priority): Compiled into the binary
- Location: `internal/i18n/locales/*.json`
- Always available, no download required
2. **User config directory**: Downloaded on demand
- Location: `~/.config/fabric/locales/`
- Downloaded from GitHub when needed
3. **GitHub repository**: Source for downloads
- URL: `https://raw.githubusercontent.com/danielmiessler/Fabric/main/internal/i18n/locales/`
## Currently Supported Languages
- **English** (`en`): Default language, always available
- **Spanish** (`es`): Available in embedded files
## Adding New Languages
To add support for a new language:
1. Create a new JSON file: `internal/i18n/locales/{lang}.json`
2. Add translations in the format:
```json
{
"message_id": "localized message text"
}
```
3. Rebuild Fabric to embed the new translations
### Translation File Format
Translation files use JSON format with message IDs as keys:
```json
{
"html_readability_error": "use original input, because can't apply html readability"
}
```
Spanish example:
```json
{
"html_readability_error": "usa la entrada original, porque no se puede aplicar la legibilidad de html"
}
```
## Error Handling
The i18n system is designed to be robust:
- **Download failures**: Non-fatal, falls back to embedded translations
- **Invalid locales**: Skipped, next priority locale used
- **Missing translations**: Falls back to English
- **Missing files**: Uses embedded defaults
Error messages are logged to stderr but don't prevent operation.
## Environment Variable Examples
### Common Unix Locale Settings
```bash
# Set system-wide locale
export LANG=en_US.UTF-8
# Override all locale categories
export LC_ALL=fr_FR.UTF-8
# Set only message locale (for this session)
LC_MESSAGES=es_ES.UTF-8 fabric --pattern summarize
# Check current locale settings
locale
```
### Testing Locale Detection
You can test locale detection without changing your system settings:
```bash
# Test with French
LC_ALL=fr_FR.UTF-8 fabric --version
# Test with Spanish (if available)
LC_ALL=es_ES.UTF-8 fabric --version
# Test with German (will download if available)
LC_ALL=de_DE.UTF-8 fabric --version
```
## Troubleshooting
### "i18n download failed" messages
This is normal when requesting a language not yet available. The system will fall back to English.
### Locale not detected
Check your environment variables:
```bash
echo $LC_ALL
echo $LC_MESSAGES
echo $LANG
```
Ensure they're in a valid format like `en_US.UTF-8` or `fr_FR`.
### Wrong language used
Remember the priority order:
1. `--language` flag overrides everything
2. `LC_ALL` overrides `LC_MESSAGES` and `LANG`
3. `LC_MESSAGES` overrides `LANG`
## Implementation Details
The locale detection system:
- Uses `golang.org/x/text/language` for parsing and validation
- Follows BCP 47 language tag standards
- Implements POSIX locale environment variable precedence
- Provides comprehensive test coverage
- Handles edge cases gracefully
For developers working on the codebase, see the implementation in:
- `internal/i18n/locale.go`: Locale detection logic
- `internal/i18n/i18n.go`: Main i18n initialization
- `internal/i18n/locale_test.go`: Test suite