Skip to main content
Wire Android uses Crowdin to manage translations. All string resources are sourced from English base files and translated by the community through the Crowdin platform.

Getting access

1

Create a Crowdin account

Sign up at crowdin.com if you do not already have an account.
2

Request access to the Wire Android project

Visit the wire-android-reloaded Crowdin project and request access to contribute translations.
3

Start translating

Once access is granted, you can translate strings directly in the Crowdin editor.

Supported languages

For the official list of supported languages and which are open for community contributions, refer to the Wire language support page. The following locale directories are currently present in the repository: ar, bg, bs, cs, da, de, el, es, et, fi, fr, hr, hu, it, ja, lb, lt, lv, mk, mt, nl, pl, pt, ro, ru, si, sk, sl, sq, sr, sv, tr, uk, zh, and Serbian variants (b+sr+Cyrl+ME, b+sr+Latn, b+sr+Latn+ME).

String resource structure

String resources are split across several modules. Each module has its own strings.xml source file that Crowdin manages independently.
ModuleSource file
appapp/src/main/res/values/strings.xml
core/ui-commoncore/ui-common/src/main/res/values/strings.xml
features/cellsfeatures/cells/src/main/res/values/strings.xml
features/meetingsfeatures/meetings/src/main/res/values/strings.xml
features/sketchfeatures/sketch/src/main/res/values/strings.xml
features/syncfeatures/sync/src/main/res/values/strings.xml
Translated files follow the Android resource convention for locale qualifiers:
app/src/main/res/
├── values/
│   └── strings.xml          # English source (default)
├── values-de/
│   └── strings.xml          # German translation
├── values-fr/
│   └── strings.xml          # French translation
└── values-zh/
    └── strings.xml          # Chinese translation

Translatable vs non-translatable strings

Some strings in the source file are marked translatable="false" and are intentionally excluded from translation (for example, debug identifiers). These strings do not appear in the Crowdin editor.
<!-- Translatable string — appears in Crowdin -->
<string name="label_cancel">Cancel</string>

<!-- Non-translatable string — excluded from Crowdin -->
<string name="debug_id" translatable="false">Debug Identifier</string>

Crowdin configuration

The Crowdin integration is configured in crowdin.yml at the repository root. It maps each source file to its translated output using the %two_letters_code% placeholder for the locale qualifier.
preserve_hierarchy: true

files:
  - source: /app/src/main/res/values/strings.xml
    translation: /app/src/main/res/values-%two_letters_code%/%original_file_name%
New module string files are added to crowdin.yml via the addEntryToCrowdinFile Gradle task, but existing entries are not removed automatically.

How translations get merged

Translation synchronisation is fully automated through GitHub Actions.

Source upload

When changes are pushed to the develop branch, new and updated English strings are automatically uploaded to Crowdin for translation.

Translation download

Completed translations are periodically downloaded from Crowdin and a pull request is opened automatically against the develop (or release/candidate) branch.
The automated PR is created by the AndroidBob bot with:
  • Branch name: chore/sync-and-update-localization-<base-branch>
  • Labels: l10n, crowdin
  • Reviewers: @wireapp/android
Only translated strings are downloaded; untranslated strings are skipped (skip_untranslated_strings: true), so the English fallback in values/strings.xml is used at runtime for any language with incomplete coverage.

Build docs developers (and LLMs) love