サーバーサイドエンジニアのはやしです。🌲🌲
Railsアプリケーションの国際化対応、したことありますか?
翻訳ファイルの管理、めんどくさくないですか?
最近携わったプロジェクトで、Google Spreadsheets APIを利用して翻訳ファイルを自動生成できるようにしたので、その流れとソースコードを以下にまとめました🙏
Railsアプリケーションの国際化について
本記事では翻訳ファイル自動生成の流れについて書いていますので、
概要・手順等は Rails国際化 (I18n) API | Rails ガイド を参考にしてください🙏
YAMLの定義と出力
以下のような翻訳ファイルがあった場合に👇
config/locales/(ja|en).yml
ja: common: view: login: "ログイン" regist: "新規登録"
en: common: view: login: "Login" regist: "New Registration"
こうするとview内でymlで定義した文言を出力できるようになります👇
I18n.t("common.view.login") => "ログイン" # localeがjaの場合 => "Login" # localeがenの場合
省略記法
ディレクトリ構造とymlのキーを合わせると省略記法が使用できます。
以下のようなymlが定義されていると👇
config/locales/views/users/new/ja.yml
ja: users: new: pagetitle: "新規登録" pagetext: "新規登録のテキストです"
view内では以下のような省略記法が使用できます。👇
app/views/users/new.html.erb
<%# 省略記法を使わない場合 %> <%= I18n.t("users.new.pagetitle") %> => "新規登録" <%# 省略記法を使った場合 %> <%= I18n.t(".pagetitle") %> => "新規登録"
機能のゴール
このgemを使って
gimite/google-drive-ruby: A Ruby library to read/write files/spreadsheets in Google Drive/Docs.
こんなスプレッドシートから
こんなコマンドを叩いて
$ bundle exec rails locale_generator:run
こんなYAMLファイルを自動生成して
ja: users: new: pagetitle: "新規登録" pagetext: "新規登録のtextです"
en: users: new: pagetitle: "Sign Up" pagetext: "Sign up text"
こんな風にViewで呼び出したい
app/views/users/new.html.erb
<%= I18n.t(".pagetitle") %> => "新規登録" # localeがjaの場合 => "Sign Up" # localeがenの場合
ソースコード
全てのソースコードをここに書くと長くなってしまうので、gistを参考にしてください🙏
気になる点等、コメントお待ちしています🙏🙏
hayashiseiya/google_sheet.rb - Github Gist
所感
いまいちなこと
- APIの有効化や認証情報を取得しないとコマンドを実行できないので、環境を整備するのに初期コストがかかってしまいました。。😢 (とはいえwikiに手順書いておけば問題なさそうでした)
- スプレッドシートではなく翻訳ファイルの方を直接更新すると、直接更新した分は次回コマンド実行時に削除されてしまうので、運用ルールを守れないとかえってコストがかかりそうかなと・・・
よかったこと
- 翻訳者の方がスプレッドシートを更新、エンジニアがコマンド一発で一括更新、という仕組みができて、管理する手間が減ったような気がしてます👌
- 日々の運用業務を技術で解決するのは、エンジニア感あって楽しかったです👌