hitomedia Tech Blog

株式会社ヒトメディアのテクノロジーに関するブログです

Google Spreadsheets APIを使用して、Railsの翻訳ファイルを自動生成できるように

サーバーサイドエンジニアのはやしです。🌲🌲

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.

こんなスプレッドシートから

f:id:seyayase:20180530145722p:plain

こんなコマンドを叩いて

$ 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に手順書いておけば問題なさそうでした)
  • スプレッドシートではなく翻訳ファイルの方を直接更新すると、直接更新した分は次回コマンド実行時に削除されてしまうので、運用ルールを守れないとかえってコストがかかりそうかなと・・・

よかったこと

  • 翻訳者の方がスプレッドシートを更新、エンジニアがコマンド一発で一括更新、という仕組みができて、管理する手間が減ったような気がしてます👌
  • 日々の運用業務を技術で解決するのは、エンジニア感あって楽しかったです👌