PostgreSQLをHomebrewでmacにインストールする

FBCSinatraを使ったプラクティスでPostgreSQLを使うのでHomebrewでのインストールから起動までをメモ。

PostgreSQL: macOS packages

環境

  • macOS 12.3.1
  • Homebrew 3.5.3

手順

インストールからパス確認。

# インストール
$ brew update
$ brew install postgresql
$ psql --version
psql (PostgreSQL) 14.4

# パス確認
$ which psql
/opt/homebrew/bin/psql

起動からテーブルの確認。

# 起動
$ brew services start postgresql
==> Successfully started `postgresql` (label: homebrew.mxcl.postgresql)
$ brew services list
Name       Status  User    File
postgresql started karlley ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

# データベース確認
$ psql -l
                           List of databases
   Name    |  Owner  | Encoding | Collate | Ctype |  Access privileges
-----------+---------+----------+---------+-------+---------------------
 postgres  | karlley | UTF8     | C       | C     |
 template0 | karlley | UTF8     | C       | C     | =c/karlley         +
           |         |          |         |       | karlley=CTc/karlley
 template1 | karlley | UTF8     | C       | C     | =c/karlley         +
           |         |          |         |       | karlley=CTc/karlley
(3 rows)

postgresqlの再起動と停止。

# 再起動
$ brew services restart postgresql
Stopping `postgresql`... (might take a while)
==> Successfully stopped `postgresql` (label: homebrew.mxcl.postgresql)
==> Successfully started `postgresql` (label: homebrew.mxcl.postgresql)

# 停止
$ brew services stop postgresql
Stopping `postgresql`... (might take a while)
==> Successfully stopped `postgresql` (label: homebrew.mxcl.postgresql)
$ brew services list
Name       Status User File
postgresql none

感想

brew 経由でインストールしておくとアンインストールも楽なので気軽に色々インストールできるので良い。 SinatraのDB化はサクッと終わらせたいなー。

参照

PostgreSQL: macOS packages

[macOS High Sierra][Homebrew] PostgreSQL のインストールからDB作成まで - Qiita

i18nで多言語化する

前回の記事ではi18nを使った多言語化用の設定を行いました。 i18_generaor gemを使った方が簡単に生成できそうでしたが理解を深める為に今回はあえて手動で翻訳情報を追加します。

tメソッドについて

  • t メソッドはi18nに用意されているtranslate メソッドの略。
  • ロケールファイルから翻訳情報を参照できる。

下記のようなロケールファイルをrailsコンソールからtitle: を参照してみます。

# config/locales/ja.yml

ja:
  books:
    index:
      title: 書籍一覧
$ rails c
> I18n.translate('books.index.title')
=> "書籍一覧"

> I18n.t('books.index.title')
=> "書籍一覧"

遅延検索

  • 参照する翻訳情報を短縮してアクセスできる仕組み。
  • view、controllerから使用可能。
  • ロケールファイルからview、contoller名を自動で判断して翻訳情報を参照しているっぽい。

Rails 国際化(i18n)API - Railsガイド

翻訳情報の追加

ロケールファイルを下記のように区分分けして翻訳情報を追加します。

  • view: 各viewファイル毎に固定化された文字列
  • activerecord: DBから取得するデータのカラム名など
  • controller: CRUD処理後のフラッシュメッセージなど
  • helpers: CRUD処理を実行するボタンの文字列など
  • その他: 複数のファイルで使い回す文字列

view

各viewファイル毎の固定化された文字列の翻訳情報を追加します。 app/views/ ディレクトリ内の各viewファイル毎に階層を分けて翻訳情報を追加することで多言語化できます。

例) app/views/books/index.html.erb のタイトルの翻訳情報を参照します。

ロケールファイルにapp/views/ ディレクトリ以下から翻訳情報を追加します。 翻訳情報はリソース名 → HTTPメソッド → 翻訳情報 の順で階層で表現します。

# config/locales/ja.yml

ja:
  books: # app/views/books/ の部分(リソース名)
    index: # app/views/books/index.html.erb の部分(HTTPメソッド)
      title: 書籍一覧 # 参照する翻訳情報

viewファイルにt メソッドで参照先を追加します。

# app/views/books/index.html.erb

<%= t('books.index.title') %>

遅延検索を使い参照先を省略して書くこともできます。

# app/views/books/index.html.erb

<%= t('.title') %>

controller

CRUD処理後のフラッシュメッセージなど動的に表示される文字列の翻訳情報を追加します。 viewと同様に遅延検索での参照が行えるので最終的にt('.success') のように省略して参照できるようにします。

例) app/controllers/books_controller.rb 内のCRUD処理後のフラッシュメッセージを多言語化する。

ロケールファイルにapp/controllers/ ディレクトリ以下から翻訳情報を追加します。 翻訳情報はviewと同様にリソース名 → HTTPメソッド → 翻訳情報 の順で階層で表現します。

# config/locales/ja.yml

ja:
  books: #app/controllers/books_controller.rbの部分(リソース名)
    create: # HTTPメソッド
      success: 登録されました。 # 参照する翻訳情報
# app/controllers/books_controller.rb
class BooksController < ApplicationController

  def create
      ...
        format.html { redirect_to @book, notice: t('.success') } # t('books.create.success') の省略形
      ...
  end

end

activerecord

DBから取得するデータのカラム名などの翻訳情報を追加します。

例) Bookモデルのモデル名、カラム名を多言語化する。

  • activerecord: 直下のmodel: に翻訳するモデル名を追加する。
  • activerecord: 直下のattributes: にモデル毎の翻訳情報を追加する。
# config/locales/ja.yml

ja:
  activerecord:
    models:
      book: 書籍 # 翻訳するモデル名
    attributes:
      book: # モデル毎の翻訳情報
        title: 書籍名
        memo: 概要
        author: 著者
        picture: 画像

viewファイルからは以下の方法で参照できます。

  • モデル名: Model.model_name.human
  • モデル毎のカラム名: Model.human_attribute_name(attribute)

Rails 国際化(i18n)API - Railsガイド

# app/views/books/index.html.erb

# モデル名
<%= Book.model_name.human %>

# カラム名
<%= Book.human_attribute_name(:title) %>
<%= Book.human_attribute_name(:memo) %>
<%= Book.human_attribute_name(:author) %>
<%= Book.human_attribute_name(:picture) %>

railsコンソールでモデル名とカラム名(タイトル)を取得できるのを確認できます。

$ rails c
> Book.model_name.human
=> "書籍"

> Book.human_attribute_name(:title)
=> "書籍名"

helpers

CRUD処理を実行するボタンの文字列などの翻訳情報を追加します。 Railsであらかじめ設定されている翻訳情報を上書きすることで翻訳できます。

例) app/views/_form.html.erbform_with 内のsubmit ボタンを多言語化する。

helpers を起点にして翻訳情報を追加します。 レコードが存在する場合はupdate、存在しない場合はcreate の翻訳情報が適応されます。

【Rails】 I18n入門書~日本語化対応の手順と応用的な使い方 | Pikawaka

# config/locales/ja.yml

ja:
  helpers:
    submit:
      create: 登録する
      update: 更新する
# app/views/_form.html.erb

<%= form_with(model: book, local: true) do |form| %>
    <%= form.label :title %>
    <%= form.text_field :title %>
 
    <%= form.submit %>
<% end %>

helpers 以下の翻訳情報を参照する理由はi18nの仕様について調べた記事で詳しく書いていますので参考にして下さい。

その他

複数のファイルで使い回す文字列の翻訳情報を追加します。 今回はviewファイルで共通するリンクの文字列をviews: にまとめて追加します。

# config/locales/ja.yml

ja:
  views:
    common:
      show: 詳細
      edit: 編集
      delete: 削除
      new: 新規作成
<%= link_to t('views.common.show'), book %>
<%= link_to t('views.common.edit'), edit_book_path(book) %>
<%= link_to t('views.common.delete'), book, method: :delete, data: { confirm: 'Are you sure?' } %>
<%= link_to t('views.common.new'), new_book_path %>

上記のように独自で追加したい翻訳情報はja: 直下に階層を追加することで翻訳できるようになります。翻訳情報を遅延検索できないので参照先をt('.show') のように省略して記述できない点に注意してください。

まとめ

言語化は設定から翻訳情報の追加までとにかくめんどくさかったです笑 ソースコードを読んだり新たなことにチャレンジできたので結果的には良かったと感じています。 実際の現場ではgemを使ってサクッと終わらせるような作業だと思うので、次はi18n_generators gemを使って多言語化してみたいと思います。

参照

Rails 国際化(i18n)API - Railsガイド

i18nとは - karlley's tech blog

日本語対応のためのGem 'rails-i18n'の使い方

【Rails】 I18n入門書~日本語化対応の手順と応用的な使い方 | Pikawaka

Railsのフォームのsubmitをhelpers.submit.createで翻訳できる理由を調べた - karlley's tech blog

Railsのフォームのsubmitをhelpers.submit.createで翻訳できる理由を調べた

FBCRailsi18nのプラクティスを進めています。 _form.html.erb 内のフォーム内のsubmitボタンの翻訳情報をhelpers.submit.createhelpers.submit.update などで参照できるのか分からなかったのでソースコードを読んで調べてみました。 ちなみにVSCodeソースコードを開く設定は前回の記事に書いたので参考にしてみてくださ。

調べる対象のRailsのコードです。

# app/views/books/_form.html.erb

<%= form_with(model: book, local: true) do |form| %>
...
    <%= form.label :title %>
    <%= form.text_field :title %>
...

    <%= form.submit %> # ここの翻訳情報をどう参照しているのか知りたい
<% end %>
# config/locales/ja.yml

ja:
  helpers:
    submit:
      create: 登録する # newメソッド時に参照される
      update: 更新する # editメソッド時に参照される

ソースコードを読むこと自体が初めてだったので解釈や読む場所が違うなど間違っている可能性があるかもしれません。 間違い等はコメント等で指摘していただけると助かります。

結論

i18n gemとrails gem で以下3点が設定されており、自動で翻訳情報の参照先を切り替えているということが分かりました。

仕組みを調べるにあたって特に分からなかった以下の4つを個別にまとめました。

  • Q1: helpers.submit.create で参照するロケールファイルはどこにあるのか?
  • Q2. helpers.submit.create で参照するロケールファイルはどこで設定されているのか?
  • Q3. i18nt メソッドのロケールの切り替えはどこで設定されているのか?
  • Q4. 翻訳情報の参照先のcreateupdate の切替はどこで設定されているのか?

Q1. helpers.submit.create で参照するロケールファイルはどこにあるのか?

以下のファイルに参照するロケールファイルが定義されていました。

  • gem: rails
  • ファイル: actionview/lib/action_view/locale/en.yml
"en":
...

  helpers:
  ...
    submit:
      create: 'Create %{model}'
      update: 'Update %{model}'
      submit: 'Save %{model}'

rails/en.yml at main · rails/rails

この翻訳情報を参照してhelpers.submit.create で翻訳できるようになっているようです。

Q2. helpers.submit.create で参照するロケールファイルはどこ設定でされているのか?

以下のファイルで設定されていました。

  • gem: rails
  • ファイル: actionview/lib/actionview.rb
# lib/action_view.rb

ActiveSupport.on_load(:i18n) do
  I18n.load_path << File.expand_path("action_view/locale/en.yml", __dir__)
end

rails/action_view.rb at main · rails/rails

参照するロケールファイルのactionview/lib/action_view/locale/en.ymlload_path に設定されています。load_path についてはRailsガイドに詳細が記載されています。load_path にデフォルトのロケールファイルであるactionview/lib/action_view/locale/en.yml を設定することで結果的にen.helpers.submit.create で翻訳できるようになっているのだと思います。

訳文読み込みパス (I18n.load_path) はファイルへのパスの配列であり、自動的に読み込まれます。このパスを設定することで、訳文のディレクトリ構造やファイル命名スキームをカスタマイズできます。

Rails 国際化(i18n)API - Railsガイド

Q3. i18nt メソッドのロケールの切り替えはどこで設定されているのか?

以下のファイルでメソッドが定義されていました。

  • gem: i18n
  • ファイル: lib/i18n.rb
  • メソッド: translate

translate メソッドのソースコード

# lib/i18n.rb

module I18n
...

    def translate(key = nil, throw: false, raise: false, locale: nil, **options) # TODO deprecate :raise
      locale ||= config.locale # ロケール設定
      raise Disabled.new('t') if locale == false
      enforce_available_locales!(locale)

      backend = config.backend

      result = catch(:exception) do
        if key.is_a?(Array)
          key.map { |k| backend.translate(locale, k, options) }
        else
          backend.translate(locale, key, options)
        end
      end

      if result.is_a?(MissingTranslation)
        handle_exception((throw && :throw || raise && :raise), result, locale, key, options)
      else
        result
      end
    end
    alias :t :translate # tメソッドを定義(エイリアス)

...
end

trancelate メソッドのロケール設定で呼ばれるlocaledefault_locale メソッドについては以下のファイルで定義されていました。

  • gem: i18n
  • ファイル: lib/i18n/config.rb
  • メソッド: localedefault_locale

trancelate メソッドのロケール設定で呼ばれるlocale メソッド、その中で呼ばれるdefault_localeソースコード

# lib/i18n/config.rb

module I18n
  class Config
  ...

    def locale
      defined?(@locale) && @locale != nil ? @locale : default_locale
    end

    def locale=(locale)
      I18n.enforce_available_locales!(locale) # 渡されたロケールが使用不可で例外を発生させる
      @locale = locale && locale.to_sym
    end
    ...

    def default_locale
      @@default_locale ||= :en
    end

    ...
end

i18n/i18n.rb at master · ruby-i18n/i18n

i18ntメソッドはtranslate メソッドのエイリアスとして定義されており、メソッド内のconfig.localeロケール設定されています。 translate メソッドのlocale オプションがnil の場合はデフォルトロケールen が設定され、そうでない場合は指定したロケールがシンボルで渡されてロケールが設定されるようです。

Q4. 翻訳情報の参照先のcreateupdate の切替はどこで設定されているのか?

form_with メソッド内のsubmit はレコードの有無によって翻訳情報の参照先を自動的に選択される仕様になっています。

  • レコード無し: helpers.submit.create を参照
  • レコード有り: helpers.submit.update を参照
# app/views/books/_form.html.erb

<%= form_with(model: book, local: true) do |form| %>
...
    <%= form.label :title %>
    <%= form.text_field :title %>
...

    <%= form.submit %> 
<% end %>
# config/locales/ja.yml

ja:
  helpers:
    submit:
      create: 登録する # newメソッド時に参照される
      update: 更新する # editメソッド時に参照される

以下のファイルで翻訳情報の参照先を自動的に切り替えるsubmit_default_value メソッドが定義されていました。

  • gem: rails
  • ファイル: lib/action_view/helpers/form_helper.rb
  • メソッド: submit_default_value

submit_default_value メソッドのソースコード

# 
module ActionView
  module Helpers
  ...
        def submit_default_value
          object = convert_to_model(@object)
          key    = object ? (object.persisted? ? :update : :create) : :submit # レコードが存在する場合はupdate、存在しない場合はcreate

          model = if object.respond_to?(:model_name)
            object.model_name.human
          else
            @object_name.to_s.humanize
          end

          defaults = []
          # Object is a model and it is not overwritten by as and scope option.
          if object.respond_to?(:model_name) && object_name.to_s == model.downcase
            defaults << :"helpers.submit.#{object.model_name.i18n_key}.#{key}"
          else
            defaults << :"helpers.submit.#{object_name}.#{key}"
          end
          defaults << :"helpers.submit.#{key}"
          defaults << "#{key.to_s.humanize} #{model}"

          I18n.t(defaults.shift, model: model, default: defaults)
        end
        ...

  end
end

rails/form_helper.rb at main · rails/rails

persisted? メソッドでレコードの有無を判断し:update:create を切り替えてkey に代入し、:"helpers.submit.#{key}" で文字列展開して参照するキーを作成しているようです。

persisted? | Railsドキュメント

送信されているhttpメソッドで切り替えていると予想していましたが、レコードの有無で判断していると知ることができました。

まとめ

調べた結果を簡単にまとめると「railsi18n の2つのgemがいい感じに翻訳情報の参照先を切り替えてsubmitボタンの多言語化ができるようになっている」ということになりました。 初めてgemのソースコードを読んでみて難しさと学びの多さを感じることができました。 Railsはとても複雑で全てを理解することは不可能ですがポイントを絞って読んでみることで理解が深まりそうです。 今後も気になる部分は積極的にソースコードを読んでみたいと思います。

参照

Railsコードを読んでみた - Qiita

persisted? | Railsドキュメント

RailsのコードをVSCodeで読むための設定

Railsの仕様について気になる部分があったのでRails gemのソースコードを読んでみようと思いました。 gemのソースコードVSCodeで読むための設定について調べました。

結論

bundle open gem_name で開くデフォルトエディタをVSCodeに設定すると便利。 設定するには以下の2つを設定する。

bundle open コマンドとは

bundlerに用意されている指定したgemのディレクトリを開くコマンド。 bundle open gem_name でgem_nameが保存されているディレクトリをデフォルトエディタで開きます。 この時、デフォルトエディタは環境変数$EDITOR$BUNDLER_EDITORに指定されたエディタが選択されます。

  • $EDITOR: すべての環境でのデフォルトエディタ
  • $BUNDLER_EDITOR: bundle open コマンドで使用されるデフォルトエディタ、$EDITOR よりも優先度が高い

Bundler: bundle open

設定1: VSCode環境変数設定

  1. VSCodecmd + shift + P でコマンドパレットを開く。
  2. shell と入力してAShell Command: Install 'code' command in PATH を選択。
  3. Code will now prompt with 'osasscript' for Administrator privilleges to install the shell command. と管理者権限を求められるのでOK を選択。
  4. 管理者のパスワードを入力
  5. Shell command 'code' succesfully installed in PATH. と表示され環境変数が追加される。

なお、追加した環境変数を削除する場合はコマンドパレットでshell と入力後、Shell Command: Uninstall 'code' command in PATH を選択し管理者のパスワードを入力すればok。

設定2: bundle openのデフォルトエディタをVSCodeに設定

シェルにzshを使っている場合の設定です。 bundle open 実行時のデフォルトエディタを指定する環境変数$BUNDLER_EDITORcode コマンドを指定します。 ここで$EDITOR に別のエディタを指定しておけばgit commit 等で使用するエディタを別のエディタに指定することもできます。

  1. .zshrcexport BUNDLER_EDITOR='code' を追加。
  2. パスが追加されたかenv コマンドで確認。
# .zshrc

export BUNDLER_EDITOR='code'
$ env | grep EDITOR
EDITOR=vim
BUNDLER_EDITOR=code # ここが追加される

なお、間違って環境変数を追加してしまった場合はunset コマンドで環境変数を削除できます。

$ unset BUNDLER_EDITOR

シェル変数や環境変数を削除するコマンド - Qiita

動作確認

上記の2つの設定で指定したgemをbundle open コマンドで開くようになります。

  • Gemfileが存在するディレクトリか.bundle/ 配下のディレクトリで実行する必要があります。
  • コマンド実行時に初回時のみDo you trust the authors of the files in this folder?VSCodeで開くかどうか聞かれるのでYes, I trust the authors を選択すると指定したgemのディレクトリが開きます。

例) FBCでのi18nのプラクティスのfjord-books_app アプリで使用するRails gemを開く

$ cd fjord-books_app
$ bundle open rails

上記の手順でVSCodeでgemのディレクトリが開けるはずです。

追記: chrome拡張機能 Octotree がめっちゃ便利でした

ここまではエディタでソースコードを開く設定をしましたがソースコードを軽く読むだけならchrome拡張機能を使った方が断然早かったです。 こちらで紹介されているchrome拡張機能 Octotreeがめっちゃ便利です。 GitHubリポジトリをツリー状に表示してくれるというシンプルなものですが階層構造が把握しやすく僕のような初心者にも分かりやすかったです。

Octotree - GitHub code tree - Chrome ウェブストア

まとめ

ソースコードを読みたかっただけなのに設定に時間が掛かってしまった。 できるだけ多くのソースコードを読んで深い知識を学んでいきたい。

参照

Bundler: bundle open

gemのソースコードをVSCodeで開く - Eggshell

シェル変数や環境変数を削除するコマンド - Qiita

Railsコードを読んでみた - Qiita

i18nで多言語化する設定

前回の記事i18nの概要は掴んだつもりなので、実際に多言語化する設定を行います。 多言語化する方法はいくつかありますが、一番シンプルそうなparamsで言語を切り替える方法を行います。

結論

下記手順で多言語化の設定を行う。

  1. デフォルト言語設定、ロケールファイルの読込設定
  2. URLクエリパラメータでロケールの切替設定
  3. ロケールファイルの作成

学習用アプリのリポジトリ: karlley/fjord-books_app at 02-i18n

1. デフォルト言語設定、ロケールファイルの読込設定

  • デフォルトロケールの設定をconfig/application.rb に記述する。
  • config/locals 以下にディレクトリを追加したい場合はロケールファイルへのファイルパス(I18n.load_path)を追加する。

訳文読み込みパス (I18n.load_path) はファイルへのパスの配列であり、自動的に読み込まれます。このパスを設定することで、訳文のディレクトリ構造やファイル命名スキームをカスタマイズできます。

I18のバックエンドは、訳文が初めて参照されるときに遅延読み込みを行います。これにより、訳文を既に公開した後でもバックエンドを他のものに差し替えることができます。

設定のポイント

  • i18nのデフォルトロケール:en に設定されている。
  • config/locales ディレクトリ直下の.rbファイルと.ymlファイルは、自動的に訳文読み込みパス(I18n.load_paths)に追加される。
  • I18n.load_pathsに直接追加すると、外部gemが翻訳されない。

1-1. デフォルト言語設定

config/application.rb にデフォルト言語設定を追記。

# config/application.rb

require_relative 'boot'

require 'rails/all'

# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)

module BooksApp
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 6.1

    # デフォルト言語指定
    config.i18n.default_locale = :ja # 追記

    # Configuration for the application, engines, and railties goes here.
    #
    # These settings can be overridden in specific environments using the files
    # in config/environments, which are processed later.
    #
    # config.time_zone = "Central Time (US & Canada)"
    # config.eager_load_paths << Rails.root.join("extras")
  end
end

1-2. ロケールファイルの読込設定

下記のようなconfig/locales ディレクトリ内でロケールファイルを分割する場合のみに必要な設定です。 I18n.load_path に直接ファイルパスを指定します。

config
└── locales
       ├── model
       │     ├── ja.yml
       │     └── en.yml
       ├── controller 
       │     ├── ja.yml
       │     └── en.yml
       └── view 
              ├── ja.yml
              └── en.yml

[初学者]Railsのi18nによる日本語化対応 - Qiita

  • I18n.load_pathに直接パスを追加すると、外部gemが翻訳されないことに注意すること。
  • デフォルト言語設定より前にファイルパスの設定を記述する。
# config/application.rb

...

module BooksApp
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 6.1

    # 多言語化
    config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s]
    # ファイルパスを追加
    config.i18n.default_locale = :ja

  ...

  end
end

rails c で設定したファイルパスへ渡す値の中身を確認してみます。

  • Rails.root でアプリケーションのルートパスを取得。
  • Rails.root.join('config', 'locales', '**', '*.{rb,yml}') でルートパス以下のconfig/locals 配下の*.rb or *.yml ファイルへのパスを取得。
  • Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s]config/locales 配下の各ロケールファイルのファイルパスを文字列に変換し、配列として取得。この際、追加したロケールファイル毎のファイルパスが配列としてconfig.i18n.load_path に渡される。
$ rails c
> Rails.root
=> #<Pathname:/Users/karlley/Workspace/fjord-books_app>

> Rails.root.join('config', 'locales', '**', '*.{rb,yml}')
=> #<Pathname:/Users/karlley/Workspace/fjord-books_app/config/locales/**/*.{rb,yml}>

# config/locals/test/ja.yml を追加した場合のファイルパス
> Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}')]
=> ["/Users/karlley/Workspace/fjord-books_app/config/locales/en.yml",
    "/Users/karlley/Workspace/fjord-books_app/config/locales/ja.yml",
    "/Users/karlley/Workspace/fjord-books_app/config/locales/test/ja.yml"]

2. URLクエリパラメータでロケールの切替設定

前回の記事の中のparamsでのロケール切替を行います。

  • I18n.locale=I18n.with_localeを使わない場合はデフォルトのロケールが使われる。
  • I18n.with_locale を使うことでI18n.locale の設定漏れを防げる。
  • application_controller.rb に設定を追記することで全controllerでロケール設定が適応される。

app/controllers/application_controller.rbaround_actionロケール切替の処理を追加します。

# app/controllers/application_contorller.rb

# frozen_string_literal: true

class ApplicationController < ActionController::Base
  before_action :switch_locale

  def switch_locale(&action)
    locale = params[:locale] || I18n.default_locale
    I18n.with_locale(locale, &action)
  end
end

Railsアプリを多言語化に対応して国際的アプリにする 【設定編】 - Qiita

3. ロケールファイルの作成

翻訳の為のロケールファイルを作成します。ロケールファイルのファイル形式はyamlです。

yamlについて

インデントで階層を表現する人間にとって読みやすい構造化されたデータを表現するフォーマット。

  • コメントは#で記述可能
  • タブは使用不可
  • インデントは一般的に半角スペース2つ(階層毎に左揃えになっていればスペースの数は2つ以外でもokらしい)

プログラマーのための YAML 入門 (初級編)

3-1. ロケールファイルの作成

日本語、英語用のロケールファイルを作成します。 今回は下記のようにconfig/locales ディレクトリ直下にja.ymlen.yml の2つのロケールファイルを作成します。 en.yml はデフォルトで作成されているのでja.yml のみ新規作成します。

config
└ locales
   ├ ja.yml
   └ en.yml

3-2. 翻訳の反映を確認

作成したロケールファイルに下記の翻訳情報を追加し、翻訳されるか確認します。

# config/locales/en.yml

en:
  hello: "Hello"
# config/locales/ja.yml

ja:
  hello: "こんにちは"

今回はURLクエリパラメータでロケールを切り替えるので実際にパラメータを渡して翻訳されるのか確認します。

  1. 動作確認用にapp/views/books/index.html.erb に追記。
  2. rails s でサーバを起動。
  3. http://localhost:3000/books にアクセス時にデフォルト言語で翻訳されるか確認(今回の場合はこんにちは)。
  4. http://localhost:3000/books?locale=en にアクセス時に英語で翻訳されるか確認(Hello と表示される)。
# 動作確認用の追記内容
# app/views/books/index.html.erb

<%= t :hello %>

動作が確認できたらapp/views/books/index.html.erb の追記した内容は削除してください。

まとめ

設定の内容自体は全く難しいことはしていないのですが、設定に関する情報が多いので必要な情報を探すのが大変でした。 設定が間違っている可能性もあるので随時修正していきたいと思います。

参照

Rails 国際化(i18n)API - Railsガイド

[初学者]Railsのi18nによる日本語化対応 - Qiita

Railsアプリを多言語化に対応して国際的アプリにする 【設定編】 - Qiita

プログラマーのための YAML 入門 (初級編)