TextTranslatorOpenSource-文本翻译器开源版
TextTranslatorOpenSource-文本翻譯器開源版
僅用于學習研究之用,請勿商用
介紹
【文本翻譯器】是一款免費的簡潔實用的翻譯軟件。文本翻譯器應用程序完全免費,可以非常快速翻譯您的單詞,幫助您與外國人交流。文本翻譯器適用于旅行者、學生、商人和其他語言愛好者,使用文本翻譯器可以輕松了解其他語言。文本翻譯器支持多國語言,全新領先的翻譯引擎,讓各種變得更加可靠有保證。界面設計簡潔、優雅,體積小巧,但是功能很強大哦。趕快下載來試試吧~
功能特點:
*【詞典解析】除了基本的翻譯外,提供更詳細的詞典功能,詞性分類
*【多語言】目前支持主流語言:中文,中文繁體,英語,日語,法語,德語
*【單詞本】收藏喜歡的單詞
*【歷史記錄】記錄翻譯記錄
*【離線翻譯】如果已經翻譯過的即使沒有網絡也能翻譯
*【數據備份和恢復】備份歷史翻譯記錄和恢復記錄
*【自動朗讀】翻譯后為您朗讀
*【自動復制】將翻譯文本自動復制到剪貼板
*【全局復制查詞】在任何界面點復制就能查單詞
*【免費】使用功能過程中完全免費
*【界面簡潔】界面設計優雅、簡潔
展示
如果無法顯示圖片,請移步到這里
下載
Google Play
https://play.google.com/store/apps/details?id=com.allever.app.translation.text
Baidu
https://shouji.baidu.com/software/26838949.html
項目地址
https://github.com/devallever/TranslationTextOpenSource
項目架構
項目采用多組件 + MVP 架構
項目組件架構圖
- common:通用模塊,包括基類和通用工具類,基本上所有模塊都依賴此模塊
- commont:評分模塊
- permission:申請權限模塊
- recomend:推廣模塊
- umeng:友盟統計
- widget:通用UI組件模塊
項目包圖
- app:基類和全局類
- bean:實體類和EventBus事件類
- function:功能類
- ui:界面,包括mvp
- util:工具類
其中主要代碼是在ui和function這兩個包
如何使用
- 項目需要依賴AndroidDependencyLib中的一個或多個模塊,請預先配置
https://github.com/devallever/AndroidDependencyLib
-
把AndroidDependencyLib項目和本項目放同一個目錄下
-
項目需要依賴AndroidUIKit中的一個或多個模塊,請預先配置
https://github.com/devallever/AndroidUIKit
接口
https://translate.google.cn/
翻譯接口
https://translate.google.cn/translate_a/single?client=gtx&dt=t&dt=bd&dt=rm&dj=1&ie=UTF-8&oe=UTF-8&sl=auto&tl=zh-CN&hl=zh-CN&tk=&q=cat
可以參考以下默認值
@GET("translate_a/single")fun translate(@Query("q") q: String,@Query("client") content: String = "gtx",@Query("dt") dt: String = "t",@Query("dt") dt1: String = "bd",@Query("dt") dt2: String = "rm",@Query("dj") dj: String = "1",@Query("ie") ie: String = "UTF-8",@Query("oe") oe: String = "UTF-8",@Query("sl") sl: String = "auto",@Query("tl") tl: String = "en",@Query("hl") hl: String = "zh-CN",@Query("tk") tk: String = ""): Observable<TranslationBean>主要用到sl、tl和q這幾個參數
- sl:原語種
- tl:翻譯語種
- q:翻譯文本
關于語種可以參考項目中Languages這個類,包含了100多個語種代碼
- Languages
返回json對應TranslationBean.kt這個實體類
/**** {"sentences":[{"trans":"串","orig":"string","backend":2},{"translit":"Chuàn","src_translit":"striNG"}],"dict":[{"pos":"名詞","terms":["串","弦","線","繩","繩子","細線","鞭","緄"],"entry":[{"word":"串","reverse_translation":["string"],"score":0.13323711},{"word":"弦","reverse_translation":["string","chord","bowstring","hypotenuse","subtense","string of musical instrument"],"score":0.016418032},{"word":"線","reverse_translation":["line","wire","thread","string","route","filament"],"score":0.0058540297},{"word":"繩","reverse_translation":["rope","cord","string"],"score":0.00477792},{"word":"繩子","reverse_translation":["rope","string","cord"],"score":0.0023652418},{"word":"細線","reverse_translation":["thread","string"],"score":2.2698537E-4},{"word":"鞭","reverse_translation":["whip","lash","string","firecracker","iron staff used as a weapon"],"score":8.139759E-6},{"word":"緄","reverse_translation":["cord","embroidered sash","string"],"score":2.4439987E-6}],"base_form":"string","pos_enum":1},{"pos":"動詞","terms":["紉"],"entry":[{"word":"紉","reverse_translation":["thread","string"],"score":4.860472E-6}],"base_form":"string","pos_enum":2}],"src":"en","confidence":0.9488189,"ld_result":{"srclangs":["en"],"srclangs_confidences":[0.9488189],"extended_srclangs":["en"]}}*/ @Keep class TranslationBean {/*** sentences : [{"trans":"串","orig":"string","backend":2},{"translit":"Chuàn","src_translit":"striNG"}]* dict : [{"pos":"名詞","terms":["串","弦","線","繩","繩子","細線","鞭","緄"],"entry":[{"word":"串","reverse_translation":["string"],"score":0.13323711},{"word":"弦","reverse_translation":["string","chord","bowstring","hypotenuse","subtense","string of musical instrument"],"score":0.016418032},{"word":"線","reverse_translation":["line","wire","thread","string","route","filament"],"score":0.0058540297},{"word":"繩","reverse_translation":["rope","cord","string"],"score":0.00477792},{"word":"繩子","reverse_translation":["rope","string","cord"],"score":0.0023652418},{"word":"細線","reverse_translation":["thread","string"],"score":2.2698537E-4},{"word":"鞭","reverse_translation":["whip","lash","string","firecracker","iron staff used as a weapon"],"score":8.139759E-6},{"word":"緄","reverse_translation":["cord","embroidered sash","string"],"score":2.4439987E-6}],"base_form":"string","pos_enum":1},{"pos":"動詞","terms":["紉"],"entry":[{"word":"紉","reverse_translation":["thread","string"],"score":4.860472E-6}],"base_form":"string","pos_enum":2}]* src : en* confidence : 0.9488189* ld_result : {"srclangs":["en"],"srclangs_confidences":[0.9488189],"extended_srclangs":["en"]}*/var src: String? = nullvar confidence: Double = 0.toDouble()var ld_result: LdResultBean? = nullvar sentences: List<SentencesBean>? = nullvar dict: List<DictBean>? = null@Keepclass LdResultBean {var srclangs: List<String>? = nullvar srclangs_confidences: List<Double>? = nullvar extended_srclangs: List<String>? = null}@Keepclass SentencesBean {/*** trans : 串* orig : string* backend : 2* translit : Chuàn* src_translit : striNG*/var trans: String? = nullvar orig: String? = nullvar backend: Int = 0var translit: String? = nullvar src_translit: String? = null}@Keepclass DictBean {/*** pos : 名詞* terms : ["串","弦","線","繩","繩子","細線","鞭","緄"]* entry : [{"word":"串","reverse_translation":["string"],"score":0.13323711},{"word":"弦","reverse_translation":["string","chord","bowstring","hypotenuse","subtense","string of musical instrument"],"score":0.016418032},{"word":"線","reverse_translation":["line","wire","thread","string","route","filament"],"score":0.0058540297},{"word":"繩","reverse_translation":["rope","cord","string"],"score":0.00477792},{"word":"繩子","reverse_translation":["rope","string","cord"],"score":0.0023652418},{"word":"細線","reverse_translation":["thread","string"],"score":2.2698537E-4},{"word":"鞭","reverse_translation":["whip","lash","string","firecracker","iron staff used as a weapon"],"score":8.139759E-6},{"word":"緄","reverse_translation":["cord","embroidered sash","string"],"score":2.4439987E-6}]* base_form : string* pos_enum : 1*/var pos: String? = nullvar base_form: String? = nullvar pos_enum: Int = 0var terms: List<String>? = nullvar entry: List<EntryBean>? = null@Keepclass EntryBean {/*** word : 串* reverse_translation : ["string"]* score : 0.13323711*/var word: String? = nullvar score: Double = 0.toDouble()var reverse_translation: List<String>? = null}} }- sentences 字段含原文本和翻譯文本
- dict 字段包含詞典信息
- 解析獲取對應字段的內容在 TranslationHelper 中
語音接口
https://translate.google.cn/translate_tts?client=gtx&ie=UTF-8&tl=zh-CN&total=1&idx=0&textlen=2&tk=&q=setting
其中主要用到 tl 和 q 參數,同上
可以參考以下默認值
@GET("translate_tts")fun requestTTS(@Query("q") q: String,@Query("client") content: String = "gtx",@Query("ie") ie: String = "UTF-8",@Query("tl") tl: String = "en",@Query("hl") hl: String = "zh-CN",@Query("total") total: String = "1",@Query("idx") idx: String = "0",@Query("textlen") textlen: String = "0",@Query("tk") tk: String = ""): Call<ResponseBody>翻譯基本流程
項目采用MVP架構
- TranslationFragment:調用presenter接口進行請求翻譯
- TranslationPresenter:調用RetrofitUtil進行網絡請求,并回調TranslationView的接口刷新界面
- DBHelper:負責存取翻譯記錄
- TranslationHelper:負責解析數據
- TranslationView:刷新界面
以上就是翻譯的基本流程
復制查詞功能實現
- 監聽粘貼板變化并彈出Dialog風格的Activity,當在應用內復制時候,不彈出。
通知欄常駐
- 啟動一個前臺服務 TranslationService 保活
離線翻譯功能
將翻譯過的記錄保存下來,即每次請求網絡翻譯時候就保存記錄
//sl:原語種代碼 //translateLanguage:翻譯語種代碼 //bean:TranslationBean請求翻譯的實體類 DBHelper.addHistory(content, sl, translateLanguage, bean)通過History這個實體類保存翻譯記錄
fun addHistory(content: String, sl: String, tl: String, bean: TranslationBean) {run {try {val history = History()history.srcText = contenthistory.sl = slhistory.tl = tlhistory.time = System.currentTimeMillis()history.liked = 0history.result = Gson().toJson(bean)history.ttsPath = MD5.getMD5StrToLowerCase("$content$tl.mp3")val saveResult = history.save()if (saveResult) {log("保存翻譯成功")} else {loge("保存翻譯失敗")}} catch (e: Exception) {e.printStackTrace()loge("保存翻譯失敗")}}}History實體類
@Keep class History : LitePalSupport() {var srcText: String = ""var sl: String = "en"var tl: String = "en"var time: Long = 0var liked: Int = 0//全路徑var ttsPath: String = ""var result: String = "" }每次請求就先獲取本地記錄
val history = DBHelper.getHistory(content, sl, translateLanguage)val translationBean =JsonHelper.json2Object(history?.result ?: "", TranslationBean::class.java)if (translationBean != null) {parse(translationBean)mViewRef?.get()?.refreshLiked(history?.liked == 1)val translateText = TranslationHelper.getTranslateText(translationBean)if (translateText.isNotEmpty()) {play(translateText, translateLanguage)copyToClipBoard(translateText)}log("獲取到數據庫翻譯內容")DBHelper.updateHistoryTime(history)EventBus.getDefault().post(UpdateRecordEvent())return}歷史記錄和單詞本
- 單詞本從數據庫中按條件查找like = 1 的記錄,,四種情況就是選中所要查找的語言
- 歷史記錄就是全部記錄,四種情況就是選中所要查找的語言
數據備份和恢復功能
將所有History記錄取出來,封裝成BackupBean,再轉成json保存到文件中
val historyList = DBHelper.getAllHistory() if (historyList.isEmpty()) {toast(R.string.no_backup_data)task.run()return } val backupBean = BackupBean() backupBean.data = historyList val result = Gson().toJson(backupBean) log("backupResult = $result") val success = FileUtil.saveStringToFile(result, BACKUP_FILE_PATH) if (success) {toast(R.string.backup_success) } else {toast(R.string.backup_fail) } ...最后一個是百度的語音識別功能
項目中集成了百度語音識別,但控件被隱藏,邏輯還是有的,通過一個ImageView觸發。
識別功能封裝在baiduvoice模塊中的BaiduVoiceHelper
用到的開源項目
- Eventbus
- LitePal: 數據庫
- RxJava/RxAndroid
- Retrofit/Okhttp
- Glide
更多項目
VirtualCallOpenSource-虛擬來電開源版
LoseWeight-減肥健身App開源版
最后
如果喜歡,請star
最重要一點,請勿商用。
如非必要,請更改包名,類名,包結構。
謝謝。
我的Github
https://github.com/devallever
總結
以上是生活随笔為你收集整理的TextTranslatorOpenSource-文本翻译器开源版的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CSS 之 Flex布局
- 下一篇: springboot 微信登入