翻訳知りたいけど、irbの外の世界って面倒くさいよね
上記のような思いをもって、解決作を探りました。
結局はString
クラス自体に翻訳機能をつけることにしました。
このGemの目的はあくまで遊びです。
コード的には以下で行けました:
class String
include Translation
end
Stringというクラスを開いて、今回の怪しい翻訳機能を中にいれています。
これで以下のような動作ができるようになりました:
これで翻訳も簡単だ!
DeepLのAPIキーを取得して、
$ gem install translate_self
$ export DEEPL_AUTH_KEY="your-api-token"
上記操作だけで翻訳がString自身でできるようになります。
今回はdefine_method
を初めてちゃんと使って、それで対応言語全部にたいしてtranslate_to_#{言語}
のような使い方ができるようになりました。ソースでいうと以下のようになっています:
%w[bg cs da de el en es et fi fr hu it ja lt lv nl pl pt ro ru sk sl sv zh].each do |lan|
define_method("translate_to_#{lan}") do |language = lan|
call_deepl(self, self.language, language)
end
end
25個のメソッドを上記だけで定義できたと考えると気持ちいいですね。
Benchmark
実はパフォーマンスはそんなに悪くないかもしれない?
C:\home\sampo\translate_self> ruby benchmark.rb
Rehearsal -------------------------------------------------------
normal string 0.252435 0.000000 0.252435 ( 0.252490)
translatable string 0.299736 0.000000 0.299736 ( 0.299789)
---------------------------------------------- total: 0.552171sec
user system total real
normal string 0.237091 0.000000 0.237091 ( 0.237091)
translatable string 0.237607 0.000000 0.237607 ( 0.237611)
ソースは以下リンクから確認できます:
https://github.com/sampokuokkanen/translate_self