Aviary supports internationalization with 15 languages and auto-detected browser locale.
- English (en)
- Spanish (es)
- German (de)
- French (fr)
- Dutch (nl)
- Italian (it)
- Portuguese (pt)
- Norwegian (no)
- Swedish (sv)
- Danish (da)
- Finnish (fi)
- Polish (pl)
- Japanese (ja)
- Korean (ko)
- Chinese Simplified (zh-CN)
All translations were generated by AI and may contain errors or cultural inaccuracies. Native speakers are encouraged to contribute improvements!
To improve existing translations or add support for additional languages:
- Open a GitHub Issue: Create an issue describing the translation corrections needed
- Submit a Pull Request: Fork the repository and submit changes directly
Translation files are located in the /locales/ directory. Each language follows the same JSON structure as the English template.
File naming convention: [language-code].json
Example structure:
{
"common": {
"upload": "Upload",
"cancel": "Cancel",
"loading": "Loading..."
},
"homepage": {
"title": "Send to reMarkable",
"subtitle": "Upload documents to your reMarkable tablet"
},
"errors": {
"upload_failed": "Upload failed",
"network_error": "Network error occurred"
}
}- Copy the English template (
/locales/en.json) - Rename it to your language code (e.g.,
fr.jsonfor French) - Translate all text values while keeping the JSON keys unchanged
- Test your translation by changing your browser language
- Submit a pull request
- Keep placeholders intact: Text like
{{filename}}should remain unchanged - Maintain context: Consider the UI context when translating
- Use appropriate formality: Match the tone of the original English text
- Test thoroughly: Check how translations appear in the actual UI
- Cultural sensitivity: Ensure translations are appropriate for the target culture
Aviary automatically detects the user's preferred language using:
- Browser locale: Detected from
Accept-Languageheader - Fallback: Defaults to English if the detected language isn't supported
- User preference: Users can manually switch languages in the UI, preference is stored in browser LocalStorage
- Translation system uses React i18next for frontend
- All user-facing text should be wrapped in translation functions
- Language switching is persistent per browser session
- Note: Server-side emails (password reset, welcome emails) currently use English-only templates and do not respect user language preferences
To test translations:
- Change browser language: Set your browser to the target language
- Use dev tools: Override
Accept-Languageheader in browser dev tools - Manual switching: Use the language switcher in the Aviary UI
- Check all screens: Verify translations appear correctly across different pages
Run the translation validation script to check for missing keys:
node validate-translations.jsThis will report:
- Missing translation keys
- Extra keys not present in the English template
- Malformed JSON files
This script runs as a Github Actions check.