- Kotlin 73.3%
- JavaScript 9.8%
- Python 8.5%
- Rust 7.8%
- Shell 0.3%
- Other 0.1%
| .github/workflows | ||
| .idea | ||
| app | ||
| catalog_sources | ||
| data_sources | ||
| fastlane/metadata/android/en-US | ||
| gradle | ||
| screenshots | ||
| third_party | ||
| website | ||
| .dockerignore | ||
| .editorconfig | ||
| .gitattributes | ||
| .gitignore | ||
| .gitmodules | ||
| .pre-commit-config.yaml | ||
| add_license.sh | ||
| build.gradle.kts | ||
| build.sh | ||
| catalog_adblock.py | ||
| catalog_base.py | ||
| catalog_doc_detect.py | ||
| catalog_mirror.py | ||
| catalog_ppocr.py | ||
| catalog_tts.py | ||
| catalog_tts_samples.py | ||
| catalog_upstream.py | ||
| Dockerfile | ||
| download.py | ||
| download_bucket.py | ||
| extract_ppocr_charsets.py | ||
| generate_index.py | ||
| gradle.properties | ||
| gradlew | ||
| gradlew.bat | ||
| LICENSE | ||
| Makefile | ||
| new_voices.md | ||
| OFFLINE_SETUP.md | ||
| README.md | ||
| REFACTOR_OVERLAY_PIPELINE.md | ||
| regen_index.sh | ||
| settings.gradle.kts | ||
| sign-apk.sh | ||
| zapstore.yaml | ||
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.
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
- Translation models are Firefox' translations models
- OCR models are PaddleOCR (with Tesseract for unsupported langs)
- Automatic language detection is done via cld2
- Dictionary is based on data from Wiktionary, exported by Kaikki
- For Japanese specifically, there's a second "word dictionary" (Mecab) for transliterating Kanji
- TTS uses Piper, Coqui, Kokoro, MMS, Sherpa ONNX, Mimic3 voices
- PDF surgery uses mupdf and lopdf
- Inference engines are:
- Translation models: slimt
- Paddle OCR, Kokoro TTS: MNN
- Other TTS: OnnxRuntime
Features & How to Use
| Feature | How to trigger |
|---|---|
| Translate text | Share 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 URL | Share a link from any app |
| Translate an image | Share an image from any app |
| Translate a document | Open the documents tab inside the app |
| Dictionary lookup | Long-press a word inside the app |
| Change TTS voice / speed | Long-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:
Building
bash build.sh
will trigger a build in a docker container, matching the CI environment.
Releasing
- Bump
app/build.gradle.ktsversionName and versionCode - Create a changelog in
fastlane/metadata/android/en-US/changelogsas${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






