mirror of
https://github.com/armbian/imager.git
synced 2026-01-06 12:31:28 -08:00
Adds automated translation file synchronization with AI-powered
translations using LibreTranslate API.
Features:
- Auto-detects missing translation keys from en.json source
- Translates new keys using LibreTranslate (free/public API)
- Preserves i18next placeholders like {{count}} and {{boardName}}
- Batch processing with rate limiting
- Falls back to TODO: prefix on translation failures
- GitHub Action runs daily and creates PRs automatically
- Supports custom LibreTranslate instances and API keys
245 lines
7.2 KiB
Markdown
245 lines
7.2 KiB
Markdown
# Translation Sync Scripts
|
|
|
|
This directory contains automation scripts for managing i18n translations.
|
|
|
|
## sync-locales.js
|
|
|
|
Automatically syncs all translation files with `src/locales/en.json` (the source of truth) and translates missing keys using AI.
|
|
|
|
### Features
|
|
|
|
- **Automatic Detection**: Finds missing keys in all locale files
|
|
- **AI Translation**: Uses OpenAI API to automatically translate new keys with high quality
|
|
- **Context-Aware**: Provides section/key context to the AI for better translations
|
|
- **Placeholder Preservation**: Maintains i18next placeholders like `{{count}}` and `{{boardName}}`
|
|
- **Adaptive Rate Limiting**: Automatically adjusts based on model and payment tier
|
|
- **Error Handling**: Falls back to `TODO:` prefix if translation fails
|
|
- **Smart Prompts**: Uses specialized prompts for technical UI translation
|
|
|
|
### Usage
|
|
|
|
#### Local Development
|
|
|
|
```bash
|
|
# Basic usage (requires OpenAI API key)
|
|
export OPENAI_API_KEY=sk-...
|
|
node scripts/sync-locales.js
|
|
|
|
# With custom model (default: gpt-4o-mini)
|
|
OPENAI_MODEL=gpt-4o node scripts/sync-locales.js
|
|
|
|
# With custom OpenAI-compatible API endpoint
|
|
OPENAI_API=https://api.openai.com/v1 node scripts/sync-locales.js
|
|
|
|
# For paid tier (much faster - 50-100x speedup)
|
|
OPENAI_TIER=paid node scripts/sync-locales.js
|
|
|
|
# Retry failed translations (keys marked with TODO:)
|
|
RETRY_FAILED=true node scripts/sync-locales.js
|
|
```
|
|
|
|
#### GitHub Actions
|
|
|
|
The workflow runs automatically:
|
|
- **Daily** at 00:00 UTC
|
|
- **On push** to the branch
|
|
- **On manual trigger** via workflow_dispatch
|
|
|
|
### Configuration
|
|
|
|
#### Environment Variables
|
|
|
|
| Variable | Description | Default | Required |
|
|
|----------|-------------|---------|----------|
|
|
| `OPENAI_API_KEY` | OpenAI API key | - | Yes |
|
|
| `OPENAI_MODEL` | Model to use for translation | `gpt-4o-mini` | No |
|
|
| `OPENAI_API` | API endpoint URL | `https://api.openai.com/v1` | No |
|
|
| `OPENAI_TIER` | Account tier for rate limits | `free` | No |
|
|
| `RETRY_FAILED` | Retry keys marked with `TODO:` | `false` | No |
|
|
|
|
#### GitHub Secrets/Variables
|
|
|
|
To configure the GitHub Action:
|
|
|
|
1. **Required - Add API key**:
|
|
```bash
|
|
gh secret set OPENAI_API_KEY
|
|
```
|
|
|
|
2. **Optional - Custom model** (for cost/quality tuning):
|
|
```bash
|
|
gh variable set OPENAI_MODEL --value "gpt-4o-mini"
|
|
```
|
|
|
|
3. **Optional - Custom endpoint** (for OpenAI-compatible APIs):
|
|
```bash
|
|
gh variable set OPENAI_API --value "https://api.openai.com/v1"
|
|
```
|
|
|
|
4. **Optional - Set account tier** (for faster translations with paid account):
|
|
```bash
|
|
gh variable set OPENAI_TIER --value "paid"
|
|
```
|
|
|
|
5. **Optional - Retry failed translations** (re-attempt keys marked with `TODO:`):
|
|
```bash
|
|
gh variable set RETRY_FAILED --value "true"
|
|
```
|
|
|
|
### OpenAI Setup
|
|
|
|
#### Getting an API Key
|
|
|
|
1. Visit [platform.openai.com](https://platform.openai.com/)
|
|
2. Sign up or log in
|
|
3. Navigate to API Keys section
|
|
4. Create a new API key
|
|
5. Add it to your environment or GitHub secrets
|
|
|
|
#### Account Tier & Rate Limits
|
|
|
|
The script automatically adjusts speed based on your account tier:
|
|
|
|
| Tier | RPM Limit | Batch Size | Delay | 100 Keys Time |
|
|
|------|-----------|------------|-------|---------------|
|
|
| **Free** | 3/min | 1 | 21s | ~35 min |
|
|
| **Paid (Tier 1-2)** | 200/min | 50 | 300ms | ~1 min |
|
|
| **Paid (Tier 3-5)** | 500/min | 50 | 120ms | ~30 sec |
|
|
|
|
To use paid tier rates:
|
|
1. Add a payment method to your OpenAI account (even $5 works)
|
|
2. Set `OPENAI_TIER=paid` environment variable
|
|
|
|
**Recommendation**: With just a $5 balance, you get Tier 1-2 rates which are **65x faster** than free tier.
|
|
|
|
#### Choosing a Model
|
|
|
|
| Model | Cost | Quality | Speed | Best For |
|
|
|-------|------|---------|-------|----------|
|
|
| `gpt-4o-mini` | Low | High | Fast | Most translations (default) |
|
|
| `gpt-4o` | Medium | Very High | Fast | Complex UI text |
|
|
| `gpt-3.5-turbo` | Very Low | Medium | Very Fast | Simple translations |
|
|
|
|
**Recommendation**: Start with `gpt-4o-mini` for the best balance of cost, quality, and speed.
|
|
|
|
### Supported Languages
|
|
|
|
| Code | Language |
|
|
|------|----------|
|
|
| `de` | German |
|
|
| `es` | Spanish |
|
|
| `fr` | French |
|
|
| `it` | Italian |
|
|
| `ja` | Japanese |
|
|
| `ko` | Korean |
|
|
| `nl` | Dutch |
|
|
| `pl` | Polish |
|
|
| `pt` | Portuguese |
|
|
| `ru` | Russian |
|
|
| `sl` | Slovenian |
|
|
| `tr` | Turkish |
|
|
| `uk` | Ukrainian |
|
|
| `zh` | Chinese (Simplified) |
|
|
|
|
### Output
|
|
|
|
The script will:
|
|
1. ✅ Show which keys are missing for each language
|
|
2. 🤖 Translate missing keys with OpenAI
|
|
3. 📊 Show translation statistics (success/failure)
|
|
4. ⚠️ Warn about any translation failures
|
|
5. 💾 Update locale files with translated content
|
|
6. 🔍 Exit with code 1 if changes were made (useful for CI/CD)
|
|
|
|
### Example Output
|
|
|
|
```
|
|
🔍 Syncing translation files with en.json (source of truth)
|
|
|
|
🤖 Using OpenAI API: https://api.openai.com/v1
|
|
📦 Model: gpt-4o-mini
|
|
✅ API key is configured
|
|
|
|
✅ Source file has 93 keys
|
|
|
|
📝 Processing de (German)...
|
|
✅ de is up to date (93 keys)
|
|
|
|
📝 Processing hr (Croatian)...
|
|
⚠️ Found 64 missing keys
|
|
🤖 Translating 64 strings with OpenAI...
|
|
✅ Updated hr with 64 new keys
|
|
|
|
✨ Translation files updated successfully!
|
|
|
|
📊 Summary:
|
|
- Total translated: 64 keys
|
|
- Please review translations for accuracy and context
|
|
```
|
|
|
|
### AI Translation Features
|
|
|
|
The script uses specialized prompts to ensure:
|
|
|
|
1. **Context Awareness**: Provides section/key context for each translation
|
|
2. **Technical Terminology**: Knows when to keep terms like "Flash", "SD card", "USB" in English
|
|
3. **Placeholder Preservation**: Maintains `{{variables}}` exactly as they appear
|
|
4. **UI Appropriateness**: Uses concise, natural text for buttons and labels
|
|
5. **Plural Forms**: Handles i18next plural suffixes (_one, _other) correctly
|
|
6. **Consistent Tone**: Maintains formal but friendly tone throughout
|
|
|
|
### Best Practices
|
|
|
|
1. **Review Translations**: AI translations are excellent but may need context-specific adjustments
|
|
2. **Test in App**: Always test translations in the actual application
|
|
3. **Handle Plurals**: The script preserves `_one` and `_other` suffixes for plural forms
|
|
4. **Check Placeholders**: Verify that `{{variables}}` are correctly preserved
|
|
5. **Cultural Nuances**: Review translations for cultural appropriateness
|
|
6. **Cost Management**: Use `gpt-4o-mini` for best cost/quality balance
|
|
|
|
### Troubleshooting
|
|
|
|
#### API Key Not Found
|
|
|
|
```
|
|
❌ OPENAI_API_KEY is not set!
|
|
```
|
|
|
|
**Solution**: Set the environment variable or GitHub secret:
|
|
```bash
|
|
export OPENAI_API_KEY=sk-...
|
|
```
|
|
|
|
#### Translation Failures
|
|
|
|
If some translations fail with `TODO:`:
|
|
- Check your API key has sufficient credits
|
|
- Verify API endpoint is accessible
|
|
- Check rate limits (especially for larger translation batches
|
|
|
|
#### Poor Quality Translations
|
|
|
|
If translations seem off:
|
|
- The AI might lack specific UI context
|
|
- Try a more capable model like `gpt-4o`
|
|
- Manually edit the JSON files to fix issues
|
|
- Consider the translation context provided in the prompt
|
|
|
|
#### Cost Concerns
|
|
|
|
For cost optimization:
|
|
- Use `gpt-4o-mini` (very cost-effective)
|
|
- Run the script less frequently
|
|
- Review and merge translations in batches
|
|
- Consider caching previous translations
|
|
|
|
### Cost Estimation
|
|
|
|
Approximate costs for translating missing keys (using `gpt-4o-mini`):
|
|
|
|
- **10 keys**: ~$0.00001
|
|
- **50 keys**: ~$0.00005
|
|
- **100 keys**: ~$0.0001
|
|
|
|
*Costs vary based on text length and model used.*
|