Translations

August 5, 2025 ยท View on GitHub

Aviary supports internationalization with 15 languages and auto-detected browser locale.

Supported Languages

  • 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)

Translation Quality

All translations were generated by AI and may contain errors or cultural inaccuracies. Native speakers are encouraged to contribute improvements!

Contributing Translations

Correcting Existing Translations

To improve existing translations or add support for additional languages:

  1. Open a GitHub Issue: Create an issue describing the translation corrections needed
  2. Submit a Pull Request: Fork the repository and submit changes directly

Translation File Structure

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"
  }
}

Adding a New Language

  1. Copy the English template (/locales/en.json)
  2. Rename it to your language code (e.g., fr.json for French)
  3. Translate all text values while keeping the JSON keys unchanged
  4. Test your translation by changing your browser language
  5. Submit a pull request

Translation Guidelines

  • 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

Language Detection

Aviary automatically detects the user's preferred language using:

  1. Browser locale: Detected from Accept-Language header
  2. Fallback: Defaults to English if the detected language isn't supported
  3. User preference: Users can manually switch languages in the UI, preference is stored in browser LocalStorage

Implementation Details

  • 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

Testing Translations

To test translations:

  1. Change browser language: Set your browser to the target language
  2. Use dev tools: Override Accept-Language header in browser dev tools
  3. Manual switching: Use the language switcher in the Aviary UI
  4. Check all screens: Verify translations appear correctly across different pages

Validation

Run the translation validation script to check for missing keys:

node validate-translations.js

This will report:

  • Missing translation keys
  • Extra keys not present in the English template
  • Malformed JSON files

This script runs as a Github Actions check.