【Djangoで国際化】 ロケール名と 言語コードの使い方とリスト

Djangoで国際化】 ロケール名と 言語コードの使い方とリスト

こんばんはエンジニアの眠れない夜です。

Django で国際化をするときのロケール名とランゲージ名はどのように指定すればいいのか一覧になっているものがなかなか見つからなかったのでメモを残しておきます。

主にロケール名と言語コードのDjango内での使い方について理解が不足していたので、その点も補足しながら紹介していきます。

※ 間違っているところなどありましたらご指摘くださいm(_ _)m

ロケール名と言語コードについて

まず、はじめにドキュメントに書かれているロケール名と言語コードの定義についてです。

ロケール名
ll 形式の言語指定、または ll_CC 形式での言語および国指定です。例えば it、 de_AT、 es、 pt_BR が該当します。 言語部分は常に小文字で、国部分は大文字です。区切り文字はアンダースコアです。

言語コード
言語名を表します。ブラウザは Accept-Language HTTPヘッダの中でこの表示形式を使って表示可能な言語名を通知します。 例えば it、 de-at、 es、 pt-br が該当します。言語コードは、一般的に小文字で表されますが、HTTP の Accept-Language ヘッダーは大文字・小文字を区別しません。区切り文字はダッシュ (-) です。

引用元:https://docs.djangoproject.com/ja/3.0/topics/i18n/

ロケール名は国際化するための翻訳ファイルを作成するときに使用をします例えば中国語の簡体字(中国本土で使われている漢字)の場合このように指定します。

django-admin makemessages -l zh_Hans

実行するとzh_Hansというディレクトリが作成されその中に翻訳を書き込むためのdjango.poが作成されます。

上のコマンドを見て気づいた人もいるかも知れませんがロケール名の「国部分は大文字です」と書かれているにも関わらず中国語のzh_Hanszh_Hant だけは国部分のイニシャルだけを大文字で指定します。

その他の言語は国部分はすべて大文字で大丈夫です。一体何を基準に決めているのかと不思議に思うところですがそれは後ほど紹介します。

言語コードは setting.py で表示翻訳する言語を指定するときのURLのプレフィックス(接頭辞)などに利用します。

Python
from django.utils.translation import ugettext_lazy as _
LANGUAGES = [
    ('ja', _('Japanese')),
    ('zh-hans', _('Chinese')),
]

言語コードは単純ですが、全て小文字でアンダーバーではなく、ハイフンで区切ります。

ロケール名 zh_Hans

言語コード zh-hans

setting.pyのLANGUAGE を上書きする場合

setting.pyのLANGUAGE を上書きする時はdjango/conf/global_settings.pyのLANGUAGEで使われている言語コードを参考にするのが一番手っ取り早いです。

中国語の zh-hans zh-hant と同様に「言語-国」になっているパターンと

('es-ar', gettext_noop('Argentinian Spanish')),
('es-co', gettext_noop('Colombian Spanish')),
('es-mx', gettext_noop('Mexican Spanish')),
('es-ni', gettext_noop('Nicaraguan Spanish')),
('es-ve', gettext_noop('Venezuelan Spanish')),

「言語」のみパターンがあります。

('fr', gettext_noop('French')),
('it', gettext_noop('Italian')),
('pl', gettext_noop('Polish')),

フランス語、イタリア語、ポルトガル語は本国以外でも使われている言語なのでロケール名がついてもいい気がするのですがロケール名はいらないようです。

django-admin makemessages -l *** のコードはどう決める?

django-admin makemessages -l *** の***の部分はどんな文字でも実行できます。

しかし、ここはロケール名と一致していないと翻訳ファイルとひも付きません。

ロケール名の設定方法は先程確認したので大丈夫ですね。

  • 言語部分は常に小文字で、国部分は大文字
  • 中国語の場合のみ国部分はイニシャルだけ大文字
  • 区切り文字はアンダースコア( _ )

しかし、スペイン語はロケール名を指定できて、フランス語、イタリア語、ポルトガル語はロケール名を指定できません。

そんなことどこを見れば分かるのかと色々探し回った結果、django/conf/locale/ を見ればいいことに気づきました。

ここにあるフォルダー名がロケール名として使えるということです。

スペイン語はロケール名が必要ない場合は指定しなくても大丈夫そうです。

django-admin makemessages -l es

django-admin makemessages -l es

そして、中国語だけロケール名のイニシャルが大文字という謎もここで解けます。

zh-Hanz

試しに大文字小文字やアンダーバーを配布にしてみたりと存在しない引数を指定するとどうなるのか試してみました。

言語コード zh-hans 反映されない
ロケール名(すべて小文字) zh_hans 反映されない
ロケール名(イニシャルだけ大文字) zh_Hans 反映する
ロケール名(すべて大文字) zh_HANS 一部環境で反映する

ほぼほぼ当然の結果ですが、ローカル環境(Mac)だとzh_HANSでも翻訳が反映したのですが、本番環境の(Linux) では反映しませんでした。

どちらの OS も大文字と小文字を区別するはずなんですけどね?何か仕様が違うのでしょう。

まとめ

大切なことは次の2つです。

1.ロケール名と言語コードの定義を確認。

ロケール名

  • 言語部分は常に小文字で、国部分は大文字
  • 中国語の場合のみ国部分はイニシャルだけ大文字
  • 区切り文字はアンダースコア( _ )

言語コード

  • 一般的に小文字を使用
  • 区切り文字はダッシュ (-)

2.一覧を確認する。

ブログを書きながらプログラミングを進めていたらうまくいかない状態に何度も遭遇し、加筆修正しました(^_^;)

Django で国際化の設定をしている人の参考になれば幸いです。

1 Comment

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください