LoginSignup
2

More than 1 year has passed since last update.

RubyのStringクラスに翻訳機能をつけてしまった話

Last updated at Posted at 2021-06-03

翻訳知りたいけど、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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
2