継続的ブログ

主にweb系の技術について書いています

モデルの多言語化について(Rails)

モデルの多言語化については、RailsガイドでGemが紹介されているのでそれらのGemについて軽くまとめてみました。

railsguides.jp

traco

github.com

  • locale毎にカラムを用意するシンプルな方式(例:title_svtitle_en
  • localeが増える毎にマイグレーション(カラム追加)が必要になるので複数言語対応する可能性があるなら厳しいが、英語しか対応しないなど固定で決まっているならこれでも良いかも
  • 使用されてなくても全てのレコードに全てのlocale分のカラムが存在する(NULLで)のでスペースの使用効率は悪い

globalize

github.com

  • 一番メジャー
  • 多言語化したいカラムが存在するテーブル毎に _translations という別テーブルを作成する方式
  • locale毎にレコードができる(localeカラムを持っている)
id post_id locale title name
1 1 ja タイトル 名前
2 1 en title name
  • 必要なlocaleの分だけレコードが作られるのでスペースの使用効率が良い
  • 毎回joinする必要あるのでクエリが少し複雑になる

mobility

github.com

  • globalize のコアコミッターでRubyKaigiでも発表されていたshioyamaさんがもっといいソリューションをと作ったもの
  • 基本何でもできる
    • カラム方式
      • tracoのような
    • 別テーブル方式
      • globalizeのような
    • 共有別テーブル方式(default)
      • これがmobility独自の方式で売りっぽい
      • globalizeはそれぞれテーブルを持っていたが、これは一つのテーブルに全てのモデルのデータが入る(ポリモーフィック関連)
    • シリアライズ方式
    • Hstore/Jsonb方式(PostgreSQLオンリー)
  • mobilityを作った背景などが書かれているブログ(多言語化に対する解決法がまとまっていてかなり参考になる

dejimata.com