iT邦幫忙

2021 iThome 鐵人賽

DAY 19
0
Mobile Development

如何開發適合電子書閱讀器使用的瀏覽器 Android APP系列 第 19

電子書閱讀器上的瀏覽器 [Day19] 翻譯功能 (I) 支援 Onyx 內建翻譯

  • 分享至 

  • xImage
  •  

有些時候需要看外文網頁,而外文裡可能有許多單字,或是看外文的速度沒有那麼快,閱讀起來會很辛苦。這時如果能夠跟 Chrome 一樣提供全文翻譯的話,對於使用體驗上會好很多。如果是有學習語言需求的話,能讓翻譯的結果跟原文對照著看,會是更好的呈現方式。

在文石(Onyx)的電子書閱讀器上透過內建 NeoReader App 閱讀書籍時,可以開啟雙畫面,一邊是電子書的內容,另一邊是原文翻譯出來的結果。原文翻譯的功能,其實是利用了 Android 系統的 Multi-Window 功能,把畫面切成兩半,一邊是 NeoReader App;另一邊則是文石設備內建的字典 App。內建的字典 App 可以用來查詢單字,句子,以及文章全文翻譯。NeoReader App 很巧妙地把這兩件事串起來,讓使用者只要點選雙開翻譯畫面,就能馬上看到電子書中內的翻譯結果。

雙開翻譯畫面對我來說用途很大,而且我發現它的翻譯品質比想像中來得好,大概每一頁有八九成以上是準確的翻譯,少部分內容才需要自己看著原文推敲它真正的意思是什麼。下面附上一頁 Kilian Jornet (越野跑步大神) 的書籍 Courir ou mourir 法文版內容,右邊是翻譯出來的中文效果。要不是有些句子一看就不合理,大部分的句子通順到連我自己都寫不出來。

https://ithelp.ithome.com.tw/upload/images/20210918/201402609KBCEBjIsw.png

既然 Onyx 自己內建的 Reader App 可以這麼做,不曉得第三方的 App 是不是也有可能在文石的閱讀器上達成類似的功能呢?下面就要來解釋怎麼做到的。

實作細節

開關 Multi-Window 模式

Multi-Window 模式是在 Android 7.0 加入的功能。隨著手機愈來愈大,和平板的普及化,Android 開始支援同時開啟兩個 App。但是提供的支援很陽春,只能把畫面切成兩半,一邊一個 App。而且啟動方式很很很難用,必須先進到最近開啟的程式列表,長按其中一個程式的 icon,才會跳出一個選單讓使用者啟動分割畫面。在大部分的 Android 設備中,Multi-Window 模式都是要使用者手動點擊才能啟動。

https://developer.android.com/guide/topics/ui/multi-window

但是,既然在 Onyx 上的 NeoReader App 能夠一鍵就進入分割畫面模式,經一番研究,我找到了它的實作方式:其實方式很簡單,只要透過 intent 發個 action 就行了!

https://ithelp.ithome.com.tw/upload/images/20210918/201402600OmOGEK9KA.png

第 756 行可以分別看到啟動和關閉分割畫面的 action 字串。把它塞到 intent 中再餵給 sendBroadcast() 就可以了。

呼叫字典程式的全文翻譯功能

在系統中,NeoReader App 和字典 App 分屬兩個不同的程式。NeoReader App 能把字典 App 叫起來,也是透過 intent 的傳遞,把相關的參數傳入。系統會幫忙找到能處理該 intent 的 App,並把參數餵給它。
觀察了一下當 Reader App 進入雙開翻譯模式時,字典 App 的 CloudTranslationActivity 被啟動了。所以應該是該 Activity 收到了需要翻譯的需求,進而開始執行。在經過另一番研究後,找到了所需要的 intent action 和參數資料格式。這麼一來我也可以正確地啟動字典翻譯功能。

https://ithelp.ithome.com.tw/upload/images/20210918/20140260O65p7UtmMl.png

今天先講解到這邊。明天再接著把上述研究出來的方式與 browser 整合在一起,變成完整的功能。


上一篇
電子書閱讀器上的瀏覽器 [Day18] 支援夜間模式
下一篇
電子書閱讀器上的瀏覽器 [Day20] 翻譯功能 (II) 取得網頁全文
系列文
如何開發適合電子書閱讀器使用的瀏覽器 Android APP30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言