- Add multi-language support with i18next and react-i18next - Implement user-selectable date format preferences (5 formats) - Add time format preferences (12-hour/24-hour) - Implement RTL (right-to-left) support for Arabic, Hebrew, Persian, Urdu - Add first day of week preference - Create LocalizationContext for managing i18n settings - Add LocalizationSettings component to Settings page - Include sample translations: English, Spanish, Arabic - Configure 10 languages: en, es, fr, de, ar, he, zh, ja, pt, ru - Add translation management documentation and Crowdin config - Create date formatting utilities that respect user preferences - Add RTL CSS styles for proper layout mirroring - Update Settings and ThemeToggle components to use translations - Add comprehensive documentation (implementation guide, quick reference, translation guide) All user preferences are persisted to localStorage and apply throughout the app.
247 lines
5.9 KiB
Markdown
247 lines
5.9 KiB
Markdown
# Translation Management
|
|
|
|
This document explains how to manage translations for Donetick using free translation platforms available for open-source projects.
|
|
|
|
## Translation Structure
|
|
|
|
Translations are organized in the `/public/locales/{language}/` directory:
|
|
|
|
```
|
|
public/locales/
|
|
├── en/
|
|
│ ├── common.json # Common UI elements
|
|
│ ├── settings.json # Settings page translations
|
|
│ └── chores.json # Chores-related translations
|
|
├── es/ # Spanish translations
|
|
├── fr/ # French translations
|
|
└── ...
|
|
```
|
|
|
|
## Supported Languages
|
|
|
|
The application currently supports the following languages:
|
|
|
|
- English (en) - Default
|
|
- Spanish (es)
|
|
- French (fr)
|
|
- German (de)
|
|
- Arabic (ar) - RTL supported
|
|
- Hebrew (he) - RTL supported
|
|
- Chinese (zh)
|
|
- Japanese (ja)
|
|
- Portuguese (pt)
|
|
- Russian (ru)
|
|
|
|
## Translation Platforms
|
|
|
|
### Recommended Platforms (Free for Open Source)
|
|
|
|
#### 1. Crowdin (Recommended)
|
|
**Website:** https://crowdin.com/
|
|
|
|
**Features:**
|
|
- Free for open-source projects
|
|
- Easy GitHub integration
|
|
- Automatic pull requests
|
|
- Translation memory
|
|
- Context and screenshots
|
|
- Collaborative translation
|
|
- Quality assurance checks
|
|
|
|
**Setup Steps:**
|
|
1. Sign up at https://crowdin.com/
|
|
2. Create a new project and apply for open-source plan
|
|
3. Connect your GitHub repository
|
|
4. Upload translation files from `public/locales/en/`
|
|
5. Configure the `crowdin.yml` file (see example below)
|
|
6. Invite translators or open for community contributions
|
|
|
|
**crowdin.yml Example:**
|
|
```yaml
|
|
project_id: "your-project-id"
|
|
api_token_env: CROWDIN_API_TOKEN
|
|
preserve_hierarchy: true
|
|
files:
|
|
- source: /public/locales/en/*.json
|
|
translation: /public/locales/%two_letters_code%/%original_file_name%
|
|
```
|
|
|
|
#### 2. Lokalise
|
|
**Website:** https://lokalise.com/
|
|
|
|
**Features:**
|
|
- Free for open-source projects (contact for approval)
|
|
- GitHub integration
|
|
- Translation memory
|
|
- Advanced filtering
|
|
- Glossary management
|
|
- API access
|
|
|
|
**Setup Steps:**
|
|
1. Sign up at https://lokalise.com/
|
|
2. Apply for open-source plan
|
|
3. Create a project
|
|
4. Upload translation files
|
|
5. Set up GitHub integration
|
|
6. Configure auto-pull/push
|
|
|
|
#### 3. POEditor
|
|
**Website:** https://poeditor.com/
|
|
|
|
**Features:**
|
|
- Free tier available
|
|
- Open-source friendly
|
|
- Simple interface
|
|
- API access
|
|
- GitHub integration
|
|
- Translation memory
|
|
|
|
**Setup Steps:**
|
|
1. Sign up at https://poeditor.com/
|
|
2. Create a new project
|
|
3. Import JSON files from `public/locales/en/`
|
|
4. Add languages you want to support
|
|
5. Invite contributors
|
|
6. Set up GitHub integration for auto-sync
|
|
|
|
#### 4. Weblate
|
|
**Website:** https://weblate.org/
|
|
|
|
**Features:**
|
|
- Completely free for open-source
|
|
- Self-hosted or hosted option
|
|
- Git integration
|
|
- Quality checks
|
|
- Translation memory
|
|
- Glossary
|
|
|
|
**Setup Steps:**
|
|
1. Go to https://hosted.weblate.org/
|
|
2. Sign in with GitHub
|
|
3. Add a new component
|
|
4. Configure repository access
|
|
5. Set file format to JSON
|
|
6. Invite translators
|
|
|
|
## Adding a New Language
|
|
|
|
1. Create a new directory in `public/locales/` with the language code
|
|
2. Copy all JSON files from `public/locales/en/` to the new directory
|
|
3. Translate the content
|
|
4. Add the language to `AVAILABLE_LANGUAGES` in `src/contexts/LocalizationContext.jsx`
|
|
5. If the language is RTL, add it to `RTL_LANGUAGES` array
|
|
|
|
Example:
|
|
```javascript
|
|
export const AVAILABLE_LANGUAGES = [
|
|
// ... existing languages
|
|
{ code: 'it', name: 'Italian', nativeName: 'Italiano' },
|
|
]
|
|
|
|
export const RTL_LANGUAGES = ['ar', 'he', 'fa', 'ur']
|
|
```
|
|
|
|
## Translation Files
|
|
|
|
### common.json
|
|
Contains general UI elements used across the application:
|
|
- Buttons (save, cancel, delete, etc.)
|
|
- Common messages
|
|
- Navigation items
|
|
|
|
### settings.json
|
|
Contains all text from the Settings page:
|
|
- Section titles
|
|
- Form labels
|
|
- Help text
|
|
- Notifications
|
|
|
|
### chores.json
|
|
Contains chores-related translations:
|
|
- Task management
|
|
- Status labels
|
|
- Action buttons
|
|
|
|
## Contributing Translations
|
|
|
|
### For Translators
|
|
|
|
1. **Via Translation Platform:**
|
|
- Visit our project on [Platform Name]
|
|
- Sign up and request access
|
|
- Select a language you want to contribute to
|
|
- Start translating!
|
|
|
|
2. **Via GitHub (Direct):**
|
|
- Fork the repository
|
|
- Create a new branch: `git checkout -b translation/language-code`
|
|
- Add your translations to `public/locales/{language}/`
|
|
- Submit a pull request
|
|
|
|
### Translation Guidelines
|
|
|
|
1. **Keep formatting:** Preserve placeholders like `{{variable}}`
|
|
2. **Context matters:** Consider the UI context when translating
|
|
3. **Be consistent:** Use the same terminology throughout
|
|
4. **Character limits:** Some UI elements have space constraints
|
|
5. **Test your translations:** If possible, test in the actual application
|
|
6. **RTL languages:** Ensure proper text direction is maintained
|
|
|
|
## Testing Translations
|
|
|
|
To test translations locally:
|
|
|
|
1. Add your translation files to `public/locales/{language}/`
|
|
2. Start the development server: `npm run dev`
|
|
3. Change language in Settings → Localization
|
|
4. Navigate through the app to verify translations
|
|
|
|
## CI/CD Integration
|
|
|
|
### GitHub Actions for Crowdin
|
|
|
|
Create `.github/workflows/crowdin.yml`:
|
|
|
|
```yaml
|
|
name: Crowdin Sync
|
|
|
|
on:
|
|
push:
|
|
branches: [main]
|
|
schedule:
|
|
- cron: '0 0 * * *'
|
|
|
|
jobs:
|
|
sync:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v3
|
|
- uses: crowdin/github-action@v1
|
|
with:
|
|
upload_sources: true
|
|
upload_translations: false
|
|
download_translations: true
|
|
create_pull_request: true
|
|
env:
|
|
CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }}
|
|
CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }}
|
|
```
|
|
|
|
## Translation Coverage
|
|
|
|
Track translation progress:
|
|
- Use platform analytics to monitor completion
|
|
- Set up automated reports
|
|
- Create issues for missing translations
|
|
|
|
## Questions?
|
|
|
|
For translation-related questions:
|
|
- Create an issue on GitHub
|
|
- Contact the maintainers
|
|
- Join our community discussions
|
|
|
|
## License
|
|
|
|
All translations are subject to the same license as the main project.
|