PHPでアクセス元の言語とかローケールコードの調べ方
これには HTTP_ACCEPT_LANGUAGE を参照するのが一番簡単
ただ少し調べ方がめんどうくさかったので、
PHPで言語・ロケールコードの取得方法を改めてまとめてみました。
特に多言語対応のWebサービスを作るときは必須です。
このページの目次
まず HTTP_ACCEPT_LANGUAGE の中身について
初めに HTTP_ACCEPT_LANGUAGE がどういう内容を持つかについて
これは $_SERVER で取得できるサーバー変数の一種で、アクセス元の言語・ロケールコード・優先度とかを調べるためのものです。
以下 HTTP_ACCEPT_LANGUAGE の説明
'HTTP_ACCEPT_LANGUAGE'
Contents of the Accept-Language: header from the current request, if there is one. Example: 'en'.引用元 : https://www.php.net/manual/en/reserved.variables.server.php
どうやらヘッダーの Accept-Lamnguage の内容が返される模様
気になったので、自分の環境だとどうなってるか調べてみました。
▼ こういうコードを書けば確認できる
1 2 |
/// ブラウザの言語一覧を表示する echo $_SERVER['HTTP_ACCEPT_LANGUAGE']; |
▼ 自分の環境だとこういう結果だった
1 |
ja,en-US;q=0.9,en;q=0.8 |
見てわかるように、コンマ(
, )で各ロケールが分けられてます。
例えば
ja とか
en-US とか
en とか、、、
あと言語の後についてる
q=0.9 とかは優先度を表すためのもの(1が最優先)
優先度が 1 の場合は
q=1.0 の部分は省略される模様
上の例だと ja > en-US > en みたいな優先度になってるみたいです。
このように HTTP_ACCEPT_LANGUAGE から言語とかロケールが調べることが可能
言語とロケールを取得する方法&コード例
ただし HTTP_ACCEPT_LANGUAGE は少し不便なとこがあります。
それがロケールコードが全て文字列で返ってくること
1つ1つの言語とかロケールを調べるには少し工夫が必要です。
ということで、その取得方法についていくつかコード例を紹介します。
1.ブラウザの最優先言語を調べる
まずはブラウザで優先的に調べる言語を調べる方法について
それには次みたいなコードを書けばOKです。
1 2 3 |
$lang_no1 = ($http_langs = $_SERVER['HTTP_ACCEPT_LANGUAGE']) ? explode( ',', $http_langs )[0] : 'en'; echo '最優先言語 : '.$lang_no1; |
▼ このコードの実行結果(自分の環境)
1 |
最優先言語 : ja |
さっき書いたみたいに、最優先言語の場合 q=1.0 はつきません。
なので explode( ',', $http_langs ) で分割し、0番目を単純に参照するだけでいいです。
2.ブラウザで使用可能な言語一覧を取得する
次はブラウザにインストールされてる言語一覧の調べ方について
これは少しだけ工夫が必要になります。具体的なコード例は次の通り
▼ 言語一覧をすべて表示するコード例
1 2 3 4 5 6 |
$http_langs = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']); $langs = []; foreach ( $http_langs as $lang ) { $langs[] = preg_replace( '/\;.*/', '', $lang ); } var_export( $langs ); |
▼ このコードの表示結果(自分の環境)
1 2 3 4 5 |
array ( 0 => 'ja', 1 => 'en-US', 2 => 'en', ) |
ちゃんと優先度順でロケール配列が取得できました。
何に使えるか分からないけど、何かに役立ちそうです。
補足1.PHP で作ったサービスを多言語するには
ここまでが言語・ロケールコードを取得する方法
この言語・ロケールの取得は次みたいな場面で役立ちます。
- 言語ごとに表示内容を変えたいとき
- 特定地域でページを表示したくないとき
- PHP+gettextで多言語化したいとき
特によく使う場面は gettext で多言語化したいときですね。
ちなみに PHP + gettext によるWebサービスの多言語化のやり方 は次で解説した通り
▼ PHP + gettetx による多言語化完全マニュアル
もしグローバルなWebアプリとか作りたい人は、上記事を要チェック
少し注意しないといけないとこもあるけど、それほど難しくもありません。
補足2.JavaScriptでの言語の取得方法
ちなみに JavaScript でも言語一覧は取得可能です。
▼ JavaScriptで使用可能言語を調べる方法
最優先言語は
navigator.language から、
ブラウザで使用可能な言語は
navigator.languages から取得可能
こっちは専用オブジェクトがあるので、取得するのは簡単です。
ここまでのまとめ
重要なポイントだけ箇条書き
- HTTP_ACCEPT_LANGUAGEで調べられる
サーバー変数の一種で ja,en-US;q=0.9,en;q=0.8 みたいな内容が入っている。左から順に優先度が高く、 q=0.9 のように優先度が割り振られる( 1 が最優先&省略)
- 使用可能な言語一覧の取得方法
すべて文字列で返されるので、 q=0.5 とか , とかを除いて配列化すればOK
以上、PHPで言語とかロケールを調べる方法でした。(^^)/~~~バイバイ