目次
Linuxの環境変数LANGやHTMLのlang属性、PHPのsetlocaleなど、様々な所でロケールを指定できますが、以下の様にバリエーションがあり、混乱したので仕様を整理してみました。
- ja
- jp
- ja-jp (ハイフン区切り)
- ja_jp (アンスコ区切り)
(どれが正解なんだ・・・?)
ロケールとは?
ロケールとは、(物語の)舞台、現場、場所などの意味を持つ英単語で、ITの分野ではシステムやソフトウェアにおける言語や国・地域の設定のことをこのように呼ぶ。
http://e-words.jp/w/%E3%83%AD%E3%82%B1%E3%83%BC%E3%83%AB.html
ロケール表現の構成要素
よく登場するのは以下2つの仕様です。
これらを組み合わせてロケールを表現します。
調べた所、以下2つがよく使われるロケール表現のようです。
①ANSI Cのロケール表現
ANSI C(C言語の標準)のロケールを表す文字列です。
以下の書式でロケールを表現します。
language_territory.codeset@modifier
- language
- 言語(ISO 639に準拠)
- territory
- 地域(ISO 3166に準拠)
- codeset
- 文字コード
- modifier
- 修飾子
構成要素として前述の言語コード、国コードが使われています。
例えば日本語&日本&UTF-8だとja_JP.utf8
となる。
詳しくはこちらを参照
②IETF言語タグ(IETF language tag)
BCP47(RFC 5646とRFC 4647)で定義されているロケールを表す文字列です。
過去のバージョンとしてRFC1766とRFC 3066があります。
書式は以下の通り。
(正確にはもう少し長いのですが、将来の予約領域など、現在はほとんど使われていない様なので省略しました)
language-script-region
- language
- 言語(ISO639に準拠)
ja
、en
など
- script
- 文字体系(ISO 15924に準拠)
- region
- 地域(ISO 3166-1 alpha-2、UN M.49に準拠)
jp
、US
など
例えば日本語&日本だとja-jp
となります。
ANSI Cのロケール表現はアンスコ区切りでしたが、こちらはハイフン区切りになります。
また、文字コードもありません。
詳しくはWiki参照
ロケール表現の使い分け
ロケールを指定する箇所はいくつかあるので、それぞれどちらの仕様に準拠するのか調べました。
- Linuxの環境変数LANG
- ANSI C
- HTMLのLang属性
- IETF言語タグ
- PHPのsetLocale関数
- システム依存(つまりLinuxの場合はANSI C準拠?)
- Laravelのロケール
- config/app.phpの
lacale
の事。 - 恐らくどちらでもなくLaravel独自のロケール表現
- Laravel-Langではアンスコ区切りになっているが、ANSI Cに従っている訳でもない。
- config/app.phpの
おわりに
自信持ってLANGを設定していこうな
Webエンジニアをやっています
UX/UIデザインからプログラミング、DB設計、SEO、インフラ構築など幅広く対応してます
PHP/PHPUnit/Laravel/Vue/Nuxt/Docker/Terraform
ご連絡はTwitterのDMまで。