【rails6】パラメータでアプリケーションの言語を切り替える

こんにちは！
今日は「パラメータでアプリケーションの言語を切り替える」という機能について紹介しようと思います。

「**日本語・英語・中国語等の言語切替をボタン一つで切り替えたい！！**」
そんな課題を解決します。

もし、もっと簡単な方法をご存知でしたら是非ご教示頂けますと幸いです。

## 完成図
![deb292f434050b8dcf951bf11b1df937](https://user-images.githubusercontent.com/80019801/121843096-9ce58d00-cd1c-11eb-9b44-0b86de448f69.gif)

こんな感じで、リンクをクリックすると「日本語 ⇄ 韓国語」の切り替えができるようになります。

## 環境
- Ruby on Rails 6.0
- 他はご自由に


##　実装していきましょう

### gemを導入する
おなじみのgemを導入します

```Gemfile
gem 'rails-i18n'
```

記載後に「 bundle install 」を実施してください

### アプリケーションの設定
config/application.rbを編集していきます

```config/application.rb
module アプリケーション名
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 6.0

    # ↓ 以下を記述してください　↓
    config.i18n.default_locale = :ja 
    config.i18n.available_locales = %i(ja ko)
    # ↑ 以上 ↑

    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration can go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded after loading
    # the framework and any gems in your application.
  end
end
```

これで
「アプリケーションのデフォルト言語は日本語」
「日本語と韓国語の使用を許可」
と設定しました。


## コントローラーでlocaleの設定をする
application_controller.rb内を編集していきます

```application_controller.rb
class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  before_action :set_locale

  private

  def set_locale
    I18n.locale = params[:locale] || I18n.default_locale
  end

  def default_url_options(options = {})
    { locale: I18n.locale }.merge options
  end
  
end
```

before_actionで必ずメソッドを実行させるようにしています。

これで、「デフォルトの言語 or パラメータの値」のどちらかを使用するとしました。

## ルーティングにlocaleを追加
config/routes.rbを編集していきます

```config/routes.rb
Rails.application.routes.draw do
  scope "(:locale)" do # ←ここが変更点です
    # この中に必要なルーティングを記述しましょう（全て対応させるなら、全て入れちゃいます）
    devise_for :users, controllers: {
      registrations: "users/registrations",
      sessions: "users/sessions"
    }
    root "articles#index"
    # 以下略
  end
end
```
では、「 % rails routes 」を実行してみてください

```
root GET           /(:locale)(.:format)                      articles#index
new_article GET    (/:locale)/articles/new(.:format)         articles#new
```

こんな感じで、URLにlocaleが追加されました！


## viewファイルに切替のリンクを設置します

``` .html.erb
<% if I18n.locale.to_s == "ko" %>
  <%= link_to('日本語', locale: 'ja') %>
<% else %>
  <%= link_to('한국어', locale: 'ko') %>
<% end %>
```

これでボタンクリックをするとlocaleを変更できるようになりました。

## localeファイルを編集していく
これで言語の切り替えはできましたが、肝心な翻訳が全くできていないので、編集していきます。

まずは「 devise 」です
config/localesの中に、「 devise.ja.yml 」を作成してください。

https://github.com/tigrish/devise-i18n/tree/master/rails/locales

ここから欲しい言語のページに遷移し、中のデータをコピーします
余計なインデントや半角スペースが発生しないように先ほどの「 devise.ja.yml 」に打ち込みます。

※日本語は「ja」, 英語は「en」, 韓国語は「ko」のymlファイルに記述をしてくださいね


次が、ベースとなる言葉の翻訳とカラムの翻訳です
「ja.yml, en.yml, ko.yml」など必要に応じてファイルを生成してください

https://github.com/svenfuchs/rails-i18n/tree/master/rails/locale
お次はここから欲しい言語のデータをコピーし、該当のymlファイルに貼り付けます

次に

```locales/ko.yml
ko:
  activerecord:
    attributes:
      user:
        nickname: 별명
        age: 나이
        gender_id: 성별
        country_id: 출신
        intro: 자기소개
      article:
        title: 제목
        trick: 요령
        text: 본문
        tag_list: 해시태그
        plaza_id: 카테고리
      message:
        message: 메시지
```

このようにご自身で作ったカラムに該当する単語を設定していきます。
これで、事前に設定できる翻訳は以上です。

## 細かい翻訳はviewでやっていきます

後はviewファイルから条件分岐をして表示する言語を切り替えていきます。


```html.erb
<% if I18n.locale.to_s == "ja"%>
  # 日本語の場合
<% else %>
  # 韓国語の場合
<% end %>
```

ここは力仕事になりがちですが、メンテしやすく書いていきましょう（共通処理を増やすなど）。
それに条件分岐を多用するのも良くありませんからね。

ここをがんばりますと、晴れて動画のように切り替えができるようになります。
これで完了です。割と簡単にできるので、是非多言語なアプリケーションを作ってみてくださいね。
それではまた！！



## 参考文献
https://ja.wikipedia.org/wiki/ISO_639-1%E3%82%B3%E3%83%BC%E3%83%89%E4%B8%80%E8%A6%A7

https://mebee.info/2021/02/03/post-28662/