bcdice / BCDice

The most popular TRPG dice command engine in Japan
https://bcdice.org
BSD 3-Clause "New" or "Revised" License
138 stars 183 forks source link

i18n #185

Closed ysakasin closed 2 years ago

ysakasin commented 4 years ago

現状

ソースコード上の文字列リテラルをそのまま置き換えて別ファイルにすることで対応

問題点

元の日本語ファイルにロジックのミス等があった時に、多言語対応したファイルに反映させるのが困難

ysakasin commented 4 years ago

https://github.com/ruby-i18n/i18n

ysakasin commented 4 years ago

ruby-i18nは全てがモジュールで管理されており、ロケールをモジュールの特異メソッドで指定することでロケールを変更する。

一つのアプリケーションで複数のロケールを同時に扱いたいことを加味すると、BCDiceで利用するのは適切でないように思える。

ochaochaocha3 commented 4 years ago

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

ysakasin commented 4 years ago

いちいちロケールを指定するのは正直面倒なので、wapperメソッドを作ればいけそうですかね

ochaochaocha3 commented 4 years ago

いちいちロケールを指定するのは正直面倒なので、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
ysakasin commented 4 years ago

メモ

以下のようにして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"]}