Translate the App
Contributing translations helps make Meshtastic accessible to a wider audience. The app uses Crowdin to manage community translations for both the user interface and in-app documentation.
What Gets Translated
| Resource | Source Location | Notes |
|---|---|---|
| UI strings | core/resources/src/commonMain/composeResources/values/strings.xml | Buttons, labels, messages, and all user-visible text |
| User Guide pages | docs/en/user/*.md | In-app documentation shown in Help & Documentation |
| Fastlane metadata | fastlane/metadata/android/en-US/ | App Store listing title, description, and changelogs |
⚠️ Note: Developer Guide pages are English-only. Code-focused documentation targeting contributors is not translated.
How to Contribute
- Visit the Crowdin project. Open the Meshtastic Android Crowdin project and sign in or create a free account.
- Choose your language. Select an existing language or request a new one by opening a GitHub issue.
- Translate strings. Crowdin shows the English source on the left and your translation on the right. Translate each string and save.
- Review context. Many strings include screenshots or context comments — check these to understand where the text appears in the app.
- Submit. Approved translations are automatically merged into the next release.
💡 Tip: Keep translations short. UI strings often appear in buttons, chips, or narrow columns. If a translation is significantly longer than the English original, consider abbreviating where the meaning stays clear.
Adding a New Language
If your language is not yet listed on Crowdin:
- Open an issue on GitHub requesting the new locale.
- A maintainer will add the language to Crowdin and configure
crowdin.yml. - Once added, you can begin translating immediately.
How Translations Are Organized
The Android app uses Compose Multiplatform resources for all user-visible strings:
core/resources/src/commonMain/composeResources/
├── values/ ← English (default)
│ └── strings.xml
├── values-de/ ← German
│ └── strings.xml
├── values-fr/ ← French
│ └── strings.xml
└── ...
In-app documentation follows a similar pattern under docs/:
docs/
├── en/user/ ← English source (default)
│ ├── onboarding.md
│ └── ...
├── fr-rFR/user/ ← French (France)
│ ├── onboarding.md
│ └── ...
├── de-rDE/user/ ← German (Germany)
│ └── ...
└── ...
Locale folders use the Android resource convention {lang}-r{REGION} (e.g. fr-rFR, de-rDE, ja-rJP), matching the values-* directories used for app strings.
The app automatically selects the correct locale based on your device's Language & Region settings.
Translation Guidelines
- Do not translate technical terms like "LoRaLoRaA low-power, long-range wireless communication technology used by Meshtastic devices to enable communication over distances of several kilometers without the need for cellular, Wi-Fi, or other traditional network infrastructures.", "MQTTMQTT (Message Queuing Telemetry Transport). A lightweight messaging protocol designed for small sensors and mobile devices, enabling efficient data transmission in the Meshtastic network for Internet connectivity and integration with IoT platforms. See https://en.wikipedia.org/wiki/MQTT. In Meshtastic, MQTT is used to connect a node to the internet, and can be used to connect multiple meshes to each other.", "BLEBLE (Bluetooth Low Energy). The default wireless connection between a node and a phone client.", "TAKTAK (Team Awareness Kit). A situational awareness ecosystem. Meshtastic bridges to it by converting mesh messages to and from Cursor on Target format.", "SNRSNR (Signal-to-Noise Ratio). A measure used in communications to quantify the level of a desired signal to the level of background noise. In Meshtastic and other wireless systems, a higher SNR indicates a clearer signal that can enhance the reliability and quality of data transmission.", or "RSSIRSSI (Received Signal Strength Indicator). The raw power level of a received signal, where a value closer to zero is stronger. Clients rate signal quality from SNR rather than RSSI." — these are universal.
- Keep placeholders intact. Strings like
%1$sor%dare filled in at runtime. Do not remove or reorder them unless the grammar of your language requires it. - Match tone. The app uses a friendly, direct voice. Avoid overly formal language.
- Test if possible. Switch your device language and open the app to see how translations look in context.
Questions?
If you have questions about a specific string's context or need help getting started, open a discussion on the Meshtastic GitHub Discussions page.
Thank you for helping expand the reach of Meshtastic!