WHAT'S NEW?
Loading...

CakePHPで多言語対応をする 【1/3】

日本人は日本人の為だけに日本語のみを用意するのが好きであるし、それ自体が文化でもある。
俺はこういった日本の文化を、最高にくだらない低レベルなクソFuckでSuckな文化(略してガラパゴス)だと思っているんだけど、それに気づいたときには時すでに遅し。

なにしろ俺自身、どっぷりそんな日本の完全プロプライエタリ文化に染まりきっていた。
要するに俺もそこらの役所のおえらいさんとかと同じ、クソFuckでSuckなヘタレということである。こりゃたまらんぜ。

というわけで、俺自身が俺に向けて、そんな“実は俺が一番SUCKだった”説から脱却せよと言ってみたい気持ちをそのままストレートに表現するために、そして、仕事で多言語が要求されているのもあわせて、CakePHPで多言語対応をしてみようと思う。

その前にまずは、ブラウザで言語はどのような扱いになっているのかを知っておく必要がある。

まずこんなスクリプトを用意し、ブラウザで実行してみる。
print_r($_SERVER['HTTP_ACCEPT_LANGUAGE']);
俺の環境では以下のような結果になった。

Google Chrome 7.0
ja,en-US;q=0.8,en;q=0.6

FireFox 3.6
ja,en-us;q=0.7,en;q=0.3

IE8
ja

Opera 10
ja-JP,ja;q=0.9,en;q=0.8

さて、なんじゃこりゃ、というのが正直な結果だが、よく見ると国名らしき単語と数値が表示されているのがわかる。

実はこれ、カンマで改行し、セミコロンで区切ると分かりやすい。
Chromeを例にとると、このようになる。

ja
en-USq=0.8
enq=0.6

さらに分かりやすく、テーブルヘッダを入れてみるとこうなる。

言語名品質値
ja
en-USq=0.8
enq=0.6

そしてさらに表示された順序も加えると、

順序言語名品質値
1ja
2en-USq=0.8
3enq=0.6

となる。

これが何を意味するのかというと、実はただ単純にブラウザに対して表示させる言語の優先度を順位を元にして設定しているというだけのこと。

jaの場合は品質値がないが、これは自動的に1という数値が割り当てられているようだ。

品質値の浮動小数点は、実はこれも優先順位をあわらしている。

試しにChromeの設定を変更し、
  1. 日本語
  2. 英語(アメリカ合衆国)
  3. 英語
の英語部分を入れ替えてみて
  1. 日本語
  2. 英語
  3. 英語(アメリカ合衆国)
にした場合、先程のスクリプトの実行結果は
ja,en-US;q=0.8,en;q=0.6
から
ja,en;q=0.8,en-US;q=0.6
に変わる。

大体ご理解いただけただろうか。



そしてこのHTTP_ACCEPT_LANGUAGEという環境変数を利用し、CakePHPで言語の自動認識をしてしまおう、そして適切な言語で表示させよう、というのが目的だ。

ちなみに、CakePHPの国際化で、言語だけを日本語から英語、英語から中国語などにする方法は他のブログでもたくさん紹介されていると思うので、poファイルの生成方法などは細かくは説明しない予定だ。

今回の俺が何をしたいのかというと、日本では18:30だけど、シアトルではまだ01:30(-17時間)、フィリピンではまだ11:30(-1時間)なので、現地で閲覧した場合、ちゃんとその地域にあった時刻を表示させなければいけないというところだ。

Skypeなどのほぼリアルタイムな通話が可能なメッセンジャがあれば、日本、アメリカ、フィリピン、ベトナム、カナダ、スペインなどで、同時に「今何時!」とやれば、確実に時差を目で確認することができるだろう。

さすがに時差の確認だけで各地に飛びまわることは時間的にも経済的にも物理的にも不可能なので、冒頭で説明したHTTP_ACCEPT_LANGUAGEを使って擬似的に海外にいることにするという方法を取る。

その最、地域化として日付表示なども変更しなければならない。
日本では誕生日などは年月日で表示するが、アメリカでは月日年という順序になり、フォーマットもかなり違う。

日本アメリカ
1972年10月21日October 21, 1972

これほどまで違う。

一応海外でも年月日の順で通用することはするが、区切り目が1種類しかない場合がほとんどだ。日本のように、年、月、日がサフィックスで付くことはない。

マルチバイト表記シングルバイト表記
1972年10月21日1972-10-21
1972.10.21
などなど

ここらへんの表記をどのようにクリアするのか、という話は、別にCakePHPだからというわけではないが、phpにはフォーマット関数が存在するので、それを使うことにする。
それを前提に、必ずリテラル表記はgettext形式の変形である、__()関数を使う。

まずは以下の流れで作業を進めていこうと思おう。

  1. 言語切替ボタンの実装
  2. 翻訳ファイル作成
  3. 現地時間の確認

さて、どうなることやら。