2020年10月26日月曜日

Ruby で i18n をやってみる (with Sinatra)

概要

Ruby の i18n ジェムを使ってみました
単体で使用する方法と Sinatra で使用する方法を紹介します

環境

  • macOS 10.15.7
  • Ruby 2.7.1p83
    • i18n 1.8.5

インストール

  • bundle init
  • vim Gemfile
gem "sinatra"
gem "i18n"
  • bundle install

単体で使用する

まずは単体で使用する方法を紹介します
各言語ごとにプロパティファイルを作成します

  • mkdir config/locales
  • vim config/locales/jp.yml
jp:
  name: "ほーくすのうろぐ"
  age: 20
  • vim config/locales/en.yml
en:
  name: "hawksnowlog"
  age: 10

あとは i18n を使って YAML ファイルの値を参照するだけです
default_locale で言語の出し分けをします

  • vim app.rb
require 'i18n'

I18n.load_path << Dir[File.expand_path("config/locales") + "/*.yml"]
I18n.default_locale = :jp
# I18n.default_locale = :en

puts I18n.t(:name)
puts I18n.t(:age)
  • bundle exec ruby app.rb

単体ではこんな感じで動作させます

Sinatra で使ってみる

configure や before を使っています
helpers を使ってもいいかなと思います
ブラウザは Accept-Language ヘッダを見てロケールを設定するのでそのようにしています
ヘッダは String なので Symbol に変換してから使いましょう

  • vim app.rb
require 'i18n'
require 'sinatra/base'

class MyApp < Sinatra::Base
  configure do
    I18n.load_path << Dir[File.expand_path("config/locales") + "/*.yml"]
    I18n.config.available_locales = [:en, :jp]
  end

  before do
    unless request.env["HTTP_ACCEPT_LANGUAGE"].nil?
      lang = request.env["HTTP_ACCEPT_LANGUAGE"].to_sym
      I18n.locale = I18n.config.available_locales.include?(lang) ? lang : :en
    end
  end

  get '/' do
    "name => #{I18n.t(:name)}, age => #{I18n.t(:age)}"
  end
end
  • vim config.ru
require './app'
run MyApp
  • bundle exec rackup config.ru

動作確認してみます
Accept-Language ヘッダをいろいろと変更して確認してみると良いと思います

  • curl localhost:9292

=> name => hawksnowlog, age => 10

  • curl -H "Accept-Language: jp" localhost:9292

=> name => ほーくすのうろぐ, age => 20

  • curl -H "Accept-Language: fr" localhost:9292

=> name => hawksnowlog, age => 10

最後に

Ruby の i18n ジェムを使って国際化する簡単なサンプルを紹介してみました
Rails と組み合わせて使う例はたくさんあるのですが Sinatra は少なかったので Sinatra とも組み合わせてみました

YAML ファイルで簡単に切り分けできるのと他の言語に対応する場合は YAML ファイルを新規作成するだけなので便利です

参考サイト

0 件のコメント:

コメントを投稿