Rails用Bing API自動繁簡中文轉換
翻譯這種專業的事情通常是交給專業的人來做,但例如繁簡互轉這類比較可以用機器來處理的事情,在Rails上也可以輕鬆完成。
通常我們用的Google翻譯,但他的api我覺得不是非常友善,相對之下Bing的翻譯比較容易串接,直接使用gem bing_translator就可以在Rails專案或是任何Ruby專案中使用。如果你的網站有繁簡轉換的需求,可以考慮使用看看,不用每次都需要靠瀏覽器的外掛來完成,看起來比較不專業。
申請帳號
- 首先到Bing翻譯服務的網頁
- 如果還沒有帳號,可以點選畫面右上角申請一個。
- 在翻譯服務的網頁,選擇最上面的免費版,按下「訂閱」。
- 同意使用條款後,到程式管理頁面,點選「註冊」按鈕。
- 「識別碼」和「名稱」可以隨便取,「URI」可隨意填入一個URI,「描述」則隨意填寫即可。
- 將「用戶端識別碼」和「用戶端密碼」複製起來,這就是你要使用Bing翻譯時,要連帶傳送的key。
- 選擇「建立」。
建立完成後,免費服務可以每個月轉2,000,000個字,對一般內容的網站來說算是夠用了,除非是新聞網站可能另當別論。
用法
這時到Rails專案(或是你的Ruby專案)當中安裝用bing_translator,在Gemfile輸入:
gem 'bing_translator'
並在Terminal跑bundle
安裝。
接著在你要翻譯的model、controller、service底下的method輸入:
# 建立BingTranslator物件
translator = BingTranslator.new('用戶端識別碼', '用戶端密碼')
# 繁轉簡
translator.translate("mysql資料庫", from: "zh-TW", to: "zh-CN")
# => "mysql数据库"
# 自動偵測語系
translator.translate("hello", to: "fr")
# => "bonjour"
另外可以利用帳戶資訊的內容內的「主要帳戶金鑰」查詢目前剩下的字數上線:
translator = BingTranslator.new('用戶端識別碼', '用戶端密碼', false, '主要帳戶金鑰')
translator.balance
# => 200000
其他用法可參考該repo的說明文件。
其他問題
本人目前遇到的問題是Bing Translator會把空格莫名其妙的吃掉,解法是要翻譯一整段文章時,只把中文字送進去翻譯,不要把空格也丟進去翻譯。
首先先新增一個String
的method來判斷是否為漢字,詳細用法可參考Stackoverflow
class String
def cjk?
!!(self =~ /\p{Han}|\p{Katakana}|\p{Hiragana}|\p{Hangul}/)
end
end
接著可以用一個一個字判斷的方式只將中文字翻譯。
def translate(source)
translated = ""
# 檢察開頭是中文字或英文字
if not source[0].cjk?
source.each_char do |char|
break if char.cjk?
translated += char
source = source[1..-1]
end
end
# 迴圈
while source.length > 0
temp = ""
# 如果第一個字是中文字就送到翻譯字串當中
source.each_char do |char|
break unless char.cjk?
temp += char
source = source[1..-1]
end
# 中文段落抓取完成,進行翻譯
translated += @bing.translate(temp, from: "zh-TW", to: "zh-CN")
# 翻譯完成,尋找下一個中文字
source.each_char do |char|
break if char.cjk?
translated += char
source = source[1..-1]
end
end
return translated
end
這樣的缺點是速度會慢五倍左右,而且寫法有點亂,但可以省下空白被吃掉的問題,目前我是用在db當中,配合I18n
進行使用,在儲存model資料時,直接自動翻譯,這樣在讀取時就不用即時翻譯,節省時間。
如果有更好的解法也歡迎大家提供!