Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Railsで海外9ヵ国にサービス展開している話 / Rails i18n

rince
February 26, 2021

Railsで海外9ヵ国にサービス展開している話 / Rails i18n

2021/2/26 @銀座Rails#30

Railsでのi18nの進め方と少人数で海外展開する上での設計・実装・テスト・デプロイの工夫についてお話ししました。

rince

February 26, 2021
Tweet

More Decks by rince

Other Decks in Programming

Transcript

  1. • デフォルトのロケールを変更する場合 config/application.rb • パラメータやドメインに応じてロケールを変更する場合 application_controller.rb 1. ロケールの設定 config.i18n.default_locale =

    :en around_action :switch_locale def switch_locale(&action) locale = extract_locale || I18n.default_locale # paramsやドメインからlocaleを抜き出す I18n.with_locale(locale, &action) end ※ I18n.locale= を使うと同じスレッドで処理される以後のリクエストも影響を受けてしまう 1. Railsのi18nの基本
  2. 各国の辞書ファイルに訳文を追加する 3. 訳文を与えて翻訳する 1. Railsのi18nの基本 # config/locales/en.yml en: hello: 'Hello!'

    greeting: 'Hello, %{name}!' # config/locales/pt-BR.yml pt-BR: hello: 'Olá!' greeting: 'Olá, %{name}!' %{} で変数を式展開できる
  3. Viewファイルのパスに沿った階層で訳文を定義すると、対応するView 内で「. +キー名」で訳文を参照できる • 同じキー名がいろんなページで使われる場合に便利 補足2: 訳文の遅延探索 1. Railsのi18nの基本 en:

    users: index: title: 'Title A' show: title: 'Title B' app/views/users/index.html.erb <%= t '.title' %> <%# => "Title A" %> <%= t '.title' %> <%# => "Title B" %> app/views/users/show.html.erb config/locales/en.yml
  4. 世界11ヵ国にサービス展開 アメリカ ブラジル イギリス 中国 日本 タイ ベトナム インドネシア 台湾

    展開国数 11 ヵ国 インド フィリピン 2. どんなサービスを海外展開してるのか ブラジル・インドネシア・タイ・台湾では既に月間数百万PVのアクセス
  5. • 開発メンバーが少なく、できるだけ運用コストを減らすため • 現状では国ごとの機能のローカライズはそこまで必要ないため 1リポジトリ複数DBで運用 選択肢 説明 向くケース 複数リポジトリ 複数DB

    国ごとにコードもDBも分ける ・開発リソースがある / 展開国が少ない ・各国で機能のローカライズが必要 1リポジトリ 複数DB 各国コードは共通で、国ごとに DBを分ける ・開発リソースがない / 展開国が多い ・各国で機能のローカライズが少ない 1リポジトリ 1DB 各国コードもDBも共通で、カラ ムやテーブルでデータを分ける ・データは同じで言語が異なる ・翻訳サイト 3. 少人数で開発/運用するための工夫(設計・実装)
  6. • 開発メンバーが少なく、できるだけ運用コストを減らすため • 現状では国ごとの機能のローカライズはそこまで必要ないため 1リポジトリ複数DBで運用 選択肢 説明 向くケース 複数リポジトリ 複数DB

    国ごとにコードもDBも分ける ・開発リソースがある / 展開国が少ない ・各国で機能のローカライズが必要 1リポジトリ 複数DB 各国コードは共通で、国ごとに DBを分ける ・開発リソースがない / 展開国が多い ・各国で機能のローカライズが少ない 1リポジトリ 1DB 各国コードもDBも共通で、カラ ムやテーブルでデータを分ける ・データは同じで言語が異なる ・翻訳サイト 3. 少人数で開発/運用するための工夫(設計・実装) どの国かを環境変数で持ち、database.ymlのdatabaseやhostの値を切り替える 👈
  7. https://github.com/rubyconfig/config を使って定数を出し分ける コード内に国ごとの分岐を入れない 3. 少人数で開発/運用するための工夫(設計・実装) # config/settings/br/settings.yml time_zone: 'Brasilia' #

    config/settings/id/settings.yml time_zone: 'Jakarta' # config/application.rb Settings.add_source!("#{Rails.root}/config/settings/#{ENV['OVS_CODE']}/settings.yml") Settings.add_source!("#{Rails.root}/config/settings/#{ENV['OVS_CODE']}/#{Rails.env}.yml") Settings.reload! config.time_zone = Settings.time_zone
  8. GitHub Actionsのstrategy.matrixを用いて各国でRSpecを並列実行 各国並列でテストを行う jobs: rspec: ... strategy: fail-fast: false matrix:

    ovs_code: ['br', 'id', 'in', 'ph', 'th', 'tw', 'uk', 'us', 'vn'] env: ... OVS_CODE: ${{ matrix.ovs_code }} 3. 少人数で開発/運用するための工夫(テスト・デプロイ)