Rails用Bing API自動繁簡中文轉換


翻譯這種專業的事情通常是交給專業的人來做,但例如繁簡互轉這類比較可以用機器來處理的事情,在Rails上也可以輕鬆完成。

通常我們用的Google翻譯,但他的api我覺得不是非常友善,相對之下Bing的翻譯比較容易串接,直接使用gem bing_translator就可以在Rails專案或是任何Ruby專案中使用。如果你的網站有繁簡轉換的需求,可以考慮使用看看,不用每次都需要靠瀏覽器的外掛來完成,看起來比較不專業。

申請帳號

  1. 首先到Bing翻譯服務的網頁
  2. 如果還沒有帳號,可以點選畫面右上角申請一個。
  3. 在翻譯服務的網頁,選擇最上面的免費版,按下「訂閱」。
  4. 同意使用條款後,到程式管理頁面,點選「註冊」按鈕。
  5. 「識別碼」和「名稱」可以隨便取,「URI」可隨意填入一個URI,「描述」則隨意填寫即可。
  6. 將「用戶端識別碼」和「用戶端密碼」複製起來,這就是你要使用Bing翻譯時,要連帶傳送的key。
  7. 選擇「建立」。

建立完成後,免費服務可以每個月轉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資料時,直接自動翻譯,這樣在讀取時就不用即時翻譯,節省時間。

如果有更好的解法也歡迎大家提供!