BCDice
BCDice copied to clipboard
i18n
現状
ソースコード上の文字列リテラルをそのまま置き換えて別ファイルにすることで対応
問題点
元の日本語ファイルにロジックのミス等があった時に、多言語対応したファイルに反映させるのが困難
https://github.com/ruby-i18n/i18n
ruby-i18nは全てがモジュールで管理されており、ロケールをモジュールの特異メソッドで指定することでロケールを変更する。
一つのアプリケーションで複数のロケールを同時に扱いたいことを加味すると、BCDiceで利用するのは適切でないように思える。
ruby-i18nは全てがモジュールで管理されており、ロケールをモジュールの特異メソッドで指定することでロケールを変更する。
それでは対応できない場合もあることから、I18n.locale
では、キーワード引数 locale:
でロケールを明示できます。
https://railsguides.jp/i18n.html#%E3%83%AD%E3%82%B1%E3%83%BC%E3%83%AB%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%81%A8%E5%8F%97%E3%81%91%E6%B8%A1%E3%81%97
いちいちロケールを指定するのは正直面倒なので、wapperメソッドを作ればいけそうですかね
いちいちロケールを指定するのは正直面倒なので、wapperメソッドを作ればいけそうですかね
ですね。Railsのコントローラ/ビュー風だと、例えばこんな雰囲気になりそうです。
class DiceBot
# @return [Symbol]
attr_accessor :lang
private
# t('karidice.nanika') のように使える
def t(key, **options)
options_with_locale = { locale: @lang }.merge(options)
I18n.translate(key, **options_with_locale)
end
end
メモ
以下のようにしてYAMLの内部構造を配列にしても、配列のまま取り出せる。 途中のkeyを取り出すと、Hashが帰ってくる
jp_ja:
ほげ表:
name: 'ホゲ今日'
rows: [
'hououin',
'shiina',
'hashida',
'makise',
]
require 'i18n'
I18n.load_path << Dir["./*.yaml"]
I18n.default_locale = :jp_ja
p I18n.t('ほげ表.rows') #=> ["hououin", "shiina", "hashida", "makise"]
p I18n.t('ほげ表') #=> {:name=>"ホゲ今日", :rows=>["hououin", "shiina", "hashida", "makise"]}