mirror of
https://github.com/danielmiessler/Fabric.git
synced 2026-01-10 06:48:04 -05:00
- 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
183 lines
4.6 KiB
Markdown
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
|