playtranslate
A real-time game translation Android app, built for both language learners and people who just want to play. Supports 23 game languages and 59 user languages!
Download the latest release by clicking here
To report issues, receive support, or make requests, please join the Discord server
PlayTranslate with Persona 3 Reload
Features
- One-tap Translation: Capture the game screen and translate Japanese text with one tap
- Auto Translation Mode: Automatically translates as dialogue changes, no tapping required
- Word lookup: Hover the floating lens over any word for immediate dictionary definitionss
- Offline: OCR and dictionary lookups work without an internet connection, with optional offline translation models
- Furigana/Pinyin Mode: Show reading hints above characters in real time
- Hotkeys: Configure a physical key to hold-to-preview translations or furigana, great for handhelds with dedicated buttons
- Dual Screen & Split Screen: Works across both screens on dual-display devices like the Ayn Thor, or in Android split-screen alongside windowed games
- Capture regions: Crop to just the dialogue box, subtitles, or any custom area
- Text-to-speech: Hear text spoken aloud. Change the default voice in settings
- Anki export: Save sentences to AnkiDroid with the original text, translation, word list, target words, text-to-speech, and a screenshot. Even record and include game audio! Card type selection with presets for popular decks.
- Yomitan integration: Yomitan dictionaries seamlessly integrate, including pitch accent, frequency chips, kanji enrichment, and merged term definitions everywhere (incl. Anki). Look for deeper integration in the future
- Camera translation: point your camera at text in the world and read it live, or freeze a frame to tap words and look them up.
- Text History: keep a record of captured sentences. Off by default.
How to Use
- Download the latest release by clicking here
- On your Android, enable Settings → Security → Install unknown apps for your file manager or browser
- Open the APK and tap Install
- On first launch, follow the onboarding steps to grant the necessary permissions
Won't install?
On some Android devices, Google Play Protect blocks sideloaded APKs and shows a vague "App not installed" or "harmful app" warning. If that happens, temporarily disable the scanner:
- Open the Play Store
- Tap your profile icon (top right)
- Tap Play Protect
- Tap the gear icon (top right)
- Turn off Scan apps with Play Protect
Install the APK, then re-enable Play Protect afterward to keep scanning your other apps.
Can't enable accessibility?
A few advanced features (like hotkey hold-to-preview) will prompt you to enable accessibility permissions. Some Android OEMs block sideloaded apps from receiving accessibility permissions by default, and the toggle in Settings might be grayed out or show a "Restricted setting" message. To unblock it:
- Open Settings → Apps → PlayTranslate
- Tap the ⋮ menu (top right)
- Tap Allow restricted settings
- Authenticate when prompted
You can now turn on accessibility for PlayTranslate.
Support
To report issues, receive support, or make requests, please join the Discord server
You can support PlayTranslate on Ko-fi at https://ko-fi.com/playtranslate
Supported Languages
PlayTranslate translates from 25 game languages (the text it can read off the screen) into 59 translation languages (the language shown to you). Both tables are sorted by total worldwide speakers.
Game languages (read from the screen)
| Language | Native name | Code |
|---|---|---|
| English | English | en |
| Chinese (Simplified) | 简体中文 | zh |
| Chinese (Traditional) | 繁體中文 | zh-Hant |
| Hindi | हिन्दी | hi |
| Spanish | Español | es |
| Arabic | العربية | ar |
| French | Français | fr |
| Portuguese | Português | pt |
| Russian | Русский | ru |
| Indonesian | Bahasa Indonesia | id |
| German | Deutsch | de |
| Japanese | 日本語 | ja |
| Turkish | Türkçe | tr |
| Vietnamese | Tiếng Việt | vi |
| Korean | 한국어 | ko |
| Italian | Italiano | it |
| Thai | ไทย | th |
| Dutch | Nederlands | nl |
| Romanian | Română | ro |
| Hungarian | Magyar | hu |
| Swedish | Svenska | sv |
| Catalan | Català | ca |
| Danish | Dansk | da |
| Finnish | Suomi | fi |
| Norwegian | Norsk | no |
Translation languages (translated for you)
| Language | Native name | Code |
|---|---|---|
| English | English | en |
| Chinese | 中文 | zh |
| Hindi | हिन्दी | hi |
| Spanish | Español | es |
| Arabic | العربية | ar |
| French | Français | fr |
| Bengali | বাংলা | bn |
| Portuguese | Português | pt |
| Russian | Русский | ru |
| Urdu | اردو | ur |
| Indonesian | Bahasa Indonesia | id |
| Swahili | Kiswahili | sw |
| German | Deutsch | de |
| Japanese | 日本語 | ja |
| Marathi | मराठी | mr |
| Telugu | తెలుగు | te |
| Turkish | Türkçe | tr |
| Vietnamese | Tiếng Việt | vi |
| Korean | 한국어 | ko |
| Tamil | தமிழ் | ta |
| Persian | فارسی | fa |
| Italian | Italiano | it |
| Thai | ไทย | th |
| Gujarati | ગુજરાતી | gu |
| Polish | Polski | pl |
| Ukrainian | Українська | uk |
| Tagalog | Tagalog | tl |
| Malay | Bahasa Melayu | ms |
| Kannada | ಕನ್ನಡ | kn |
| Dutch | Nederlands | nl |
| Romanian | Română | ro |
| Hungarian | Magyar | hu |
| Greek | Ελληνικά | el |
| Czech | Čeština | cs |
| Swedish | Svenska | sv |
| Belarusian | Беларуская | be |
| Hebrew | עברית | he |
| Bulgarian | Български | bg |
| Catalan | Català | ca |
| Slovak | Slovenčina | sk |
| Haitian Creole | Kreyòl Ayisyen | ht |
| Croatian | Hrvatski | hr |
| Danish | Dansk | da |
| Finnish | Suomi | fi |
| Norwegian | Norsk | no |
| Albanian | Shqip | sq |
| Galician | Galego | gl |
| Slovenian | Slovenščina | sl |
| Lithuanian | Lietuvių | lt |
| Latvian | Latviešu | lv |
| Afrikaans | Afrikaans | af |
| Macedonian | Македонски | mk |
| Estonian | Eesti | et |
| Georgian | ქართული | ka |
| Welsh | Cymraeg | cy |
| Maltese | Malti | mt |
| Icelandic | Íslenska | is |
| Irish | Gaeilge | ga |
| Esperanto | Esperanto | eo |
Optional: Online Translation Backends
By default, translation uses Lingva with ML Kit as an offline fallback. For higher quality translations, you can plug in an API key for any of the following under Settings → Translation services. Add as many as you like — each service is its own entry in the list, so you can keep several configured and reorder them to pick which one translates first:
- DeepL: free tier at deepl.com/en/pro#developer
- OpenAI: platform.openai.com — pick a model at runtime
- Gemini: aistudio.google.com — pick a model at runtime
- DeepSeek: platform.deepseek.com — pick a model at runtime
- Mistral: console.mistral.ai — pick a model at runtime
- Groq: console.groq.com — pick a model at runtime
- OpenRouter: openrouter.ai — pick a model at runtime
- Custom: any other OpenAI-compatible endpoint — point it at your own base URL
Optional: Anki Flashcards
Install AnkiDroid and grant PlayTranslate access in Settings to export cards directly to your decks.
Credits
Libraries and services
- ML Kit: on-device OCR and translation
- Sudachi: Japanese morphological analysis (Apache 2.0)
- HanLP: Chinese word segmentation
- KOMORAN: Korean morphological analysis
- Snowball stemmers via Apache Lucene: Latin/European stemming
- Lingva: online translation
- AnkiDroid: flashcard integration
- MNN: on-device LLM and OCR inference engine (Apache 2.0)
- PaddleOCR: on-device OCR from the bundled PP-OCRv6 text detector and unified recognizer, plus optional per-script recognizers (Apache 2.0)
- OpenCV: image processing for OCR (DBNet contour postprocessing, crop rectification) and for the camera tool's planar tracker (ORB features, pyramidal Lucas-Kanade flow, RANSAC homography fitting) (Apache 2.0)
- OpenCC4j: Simplified/Traditional Chinese conversion (Apache 2.0)
- slimt: tiny Marian-based NMT engine that runs the Bergamot offline models (GPL-2.0-or-later, with MPL-2.0 Marian components)
- OkHttp: HTTP client for online translation and downloads (Apache 2.0)
- kotlinx.serialization: JSON (de)serialization for the translation backends and data models (Apache 2.0)
- Gson: streaming JSON parsing for Yomitan dictionary banks (Apache 2.0)
- CameraX: camera preview and analysis frames for the camera tool (Apache 2.0)
- Material Components for Android and Material Symbols: UI components, and icons traced from the Outlined symbol set (Apache 2.0)
Adapted from other projects
Work we reimplemented rather than linked. No source was copied verbatim.
- offline-translator (David Ventura): its
translator-rsplanar tracking engine is the design reference for the camera tool's keyframe-OCR tracker. We took the split between optical flow that sustains correspondences and descriptor re-matching that corrects drift, the Idle/Locked/Lost lifecycle with inlier hysteresis, the anchor cache that re-locks a previously seen scene without re-running OCR, and several tuned thresholds. Independently reimplemented in Kotlin over OpenCV, without the reference's IMU prior and with a smoothing filter of our own (offline-translator GPL 3.0;translator-rsMIT) - PyThaiNLP: Thai word segmentation, a faithful Kotlin port of its
newmmmaximal-matcher, run over a word list that includes its CC0 list (Apache 2.0) - docTR and EasyOCR: line-grouping logic adapted for OCR word-box assembly, following docTR's recognize-then-group architecture with thresholds modelled on docTR
_resolve_linesand EasyOCRgroup_text_box(Apache 2.0)
(Optional) Downloadable Offline Models
- TranslateGemma 4B (Google): translation-tuned Gemma 3, downloadable as an optional offline pack (Gemma terms of use)
- Qwen 2.5 1.5B Instruct (Alibaba): downloadable as an optional offline pack (Apache 2.0)
- Gemma 4 E2B (Google): downloadable as an optional offline pack (Gemma terms of use)
- Hunyuan-MT 1.5 1.8B (Tencent): translation-specialised model, downloadable as an optional offline pack (Tencent HY Community License; not available in the EU, UK, or South Korea)
- PaddleOCR PP-OCRv5+v6 recognizers: optional per-script OCR recognizer packs for additional scripts (e.g. Korean, Arabic, Cyrillic, Thai), downloadable per source language (Apache 2.0)
- Meiki: high-accuracy Japanese OCR model (D-FINE), downloadable as an optional offline pack (LGPL 3.0)
- MangaOCR: Japanese OCR refinement for stylized and vertical text, downloadable as an optional offline pack.
manga-ocr-base-2025by jzhang533, based on manga-ocr by kha-white (Maciej Budyś), both Apache 2.0, converted to fp16 MNN for on-device use. The manga-ocr model family is trained using the Manga109-s dataset, whose use is acknowledged per its terms - Firefox Translations (Bergamot): Mozilla's offline NMT model pairs, downloadable for offline translation (CC BY-SA 4.0)
Linguistic data
- JMdict, KANJIDIC2, and JMnedict: Japanese dictionary, kanji, and proper-name data (EDRDG licence; JMnedict offered as an optional in-app Yomitan download)
- CC-CEDICT: Chinese-English dictionary (CC BY-SA 4.0)
- CFDICT: Chinese-French dictionary, used for French-target glosses (CC BY-SA 3.0)
- HanDeDict: Chinese-German dictionary, used for German-target glosses (CC BY-SA 2.0 DE)
- Wiktionary via kaikki.org: multilingual dictionary entries (CC BY-SA)
- Tatoeba: example sentences (CC BY 2.0)
- PanLex: multilingual translation pairs (CC0)
- wordfreq: word frequency data
- Camel Morph MSA: Arabic morphology, used to map inflected and broken-plural surface forms to dictionary lemmas (© CAMeL Lab, NYU Abu Dhabi; CC BY 4.0, modified)
- Arramooz: Arabic morphological dictionary (© Taha Zerrouki; GPL 3.0)
- SudachiDict: Japanese tokenizer dictionary bundled for Sudachi, including UniDic (© NINJAL) and part of mecab-ipadic-NEologd (Apache 2.0)
- Jiten: Japanese frequency data, offered as an optional in-app Yomitan dictionary download (CC BY-SA 4.0)
- Wikimedia Commons: pronunciation audio for word playback and Anki cards, fetched on demand. Each clip carries its own author and license (typically CC BY / CC BY-SA / public domain), shown as a credit that travels onto exported cards
