README.md

May 23, 2026 ยท View on GitHub

Translator

An Android translator app that performs text, PDF/ODT documents and image translation completely offline using on-device models.

Supports automatic language detection and transliteration for non-latin scripts. There's also a built-in word dictionary.

Get it on F-Droid

This project is hosted on GitHub and mirrored to Codeberg.

How It Works

Complete offline translation - download language packs once, translate forever without internet.

Language packs contain the full translation models, translation happens on your device, no requests are sent to external servers.

Screenshots

https://github.com/user-attachments/assets/bf774a4f-3d58-49b7-b4e2-cb30eb395b39

Tech

Features & How to Use

FeatureHow to trigger
Translate textShare text from any app, or type directly
Translate text (mini popup)Long-press text on any app โ†’ tap "Translate" in the copy/share bar
Translate a URLShare a link from any app
Translate an imageShare an image from any app
Translate a documentOpen the documents tab inside the app
Dictionary lookupLong-press a word inside the app
Change TTS voice / speedLong-press the play button

For developers

This app exposes an API (see ITranslationService.aidl) that other apps can use to request translations.

Manual offline setup

If you want to use this app on a device with no internet access, you can put the language files on Documents/dev.davidv.translator. Check OFFLINE_SETUP.md for details.

Verification info

SHA-256 hash of signing certificate: 2B:38:06:E7:45:D8:09:01:8A:51:BE:58:D0:63:5F:FC:74:CC:97:33:43:94:07:AB:1E:D0:42:4A:4D:B3:E1:FB

Funding

This project was funded through the NGI Mobifree Fund, a fund established by NLnet.


If you want, you can help pay for the CDN costs:

Donate using Liberapay

Building

bash build.sh

will trigger a build in a docker container, matching the CI environment.

Releasing

  • Bump app/build.gradle.kts versionName and versionCode
  • Create a changelog in fastlane/metadata/android/en-US/changelogs as ${versionCode*10+1}.txt (and +2)
  • Build: bash build.sh
  • Sign: bash sign-apk.sh keystore.jks keystorepass pass alias
  • Create a tag that is v${versionName} (eg: v0.1.0)
  • Create a Github release named v${versionName} (eg: v0.1.0)
    • Upload both signed APKs to the release
    • gh release create --prerelease v0.4.0-rc1 -F fastlane/metadata/android/en-US/changelogs/XX1.txt signed/translator-arm64-0.4.0.apk signed/translator-armv7-0.4.0.apk

Each ABI gets a unique versionCode: versionCode * 10 + abiOffset (armv7=1, arm64=2, x86=3, x86_64=4).

Signing APK

bash sign-apk.sh keystore.jks keystorepass pass alias

will sign the APKs built by build.sh and place the signed copies in signed/translator-{arm64,armv7}-${version}.apk