【Django】サイト英訳への道 〜動的な投稿部分を多言語化〜

あ〜〜サイトの英語化しようかな、
でもどこから手をつけたらいいんだ?

静的な部分と動的な部分、どうやって切り分けて実装したらいいんだ?

とモダモダしていたのですが、思い切って実装に着手してみました。


動的な部分を英語化する

調べていたところ、こんなサイトを見つけました。

モデル定義を変更せず動的コンテンツのi18n対応ができるライブラリdjango-modeltranslationの紹介

django-modeltranslationというライブラリを使うことで、モデルの定義を変更せず、多言語の投稿ができるようになる、ということで、使ってみることに。



django-modeltranslationの導入

ここからは、django-modeltranslationの公式ドキュメントを合わせて参照しながら読み進めてみてください。


$ pip install django-modeltranslation
で導入。


settings.pyの中に、以下のように書き足します。

settings.pyのINSTALLED_APPSの中に、modeltranslationを追加します。

この時、必ず'django.contrib.admin'より上の行に書いておくこと!

これをしないと、modeltranslation.translator.NotRegistered: The model "" is not registered for translationというエラーが発生します。


次に、translation.pyという空っぽのファイルをアプリケーションフォルダの中に作ります。

そこに、翻訳を追加したいモデルを書いていきます。

例えばこんな感じ。
今回は、Work(作品)というモデルの中の、タイトル・コンテンツ・使用ツールの部分を英訳したかったので、こんな感じに書いています。

ここまでできたら、
$ python manage.py makemigrations
$ python manage.py migrate
で反映されます。

migrateの処理を忘れると、
no such column: core_work.title_ja
みたいなエラーが発生します。


Adminページで操作できるようにする

公式ドキュメントはこちらのページ

admin.pyの中の該当モデルの読み込み部分をこのように書き換えましょう。

すでにデータベースに内容を投稿しているモデルを変換する

公式ドキュメントはこちらのページ

このままでは、例えばタイトルというフィールドについて、
・title(元からあったもの)
・title_ja
・title_en
の3つができてしまっています。

そのため、adminページで投稿を開けなくなっていたり、ページに表示されなくなっていたりします。

そこで、
$ python manage.py update_translation_fields

を叩くと、settings.pyのMODELTRANSLATION_DEFAULT_LANGUAGEとして設定した言語をデフォルトとして統合してくれます。

これで、
・title_ja
・title_en
の2種類に統合され、元々入れていた日本語データが、jaのデータとして統合されました。



まとめ

django-modeltranslationを使うと、かなり楽に多言語化できることがわかりました。

サイトを作り切った後から導入するのも比較的容易なので、ぜひ使ってみてくださいね。

ここまでできましたが、ページに言語の切り替えボタンが欲しいですよね。

ということで次回は、その処理について書いていこうと思います。