WHAT'S NEW?
Loading...
ラベル 多言語 の投稿を表示しています。 すべての投稿を表示
ラベル 多言語 の投稿を表示しています。 すべての投稿を表示
日本人は日本人の為だけに日本語のみを用意するのが好きであるし、それ自体が文化でもある。
俺はこういった日本の文化を、最高にくだらない低レベルなクソ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
に変わる。

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

昨日CakePHP1.3の挙動を調べていたんだけど、何がやりたいかというと、実は英語、中国語、韓国語、日本語のSNSを作る事になっているので、完全に国際化をさせないといけない。

今まではCakePHP1.2を長い間使っていたけど、バーチャルフィールドに惹かれてCakePHP1.3を使うことにした。

CakePHP1.3ではapp/libsというディレクトリが増えていて、知人が言うには「何でもいれると良いよ!(MASA-Pさん)」とのことなので、何でもいいからいれてみることにした。

何を入れるかというと、まずはマスタ系の文字列を格納しておきたい。
というのも、1年ほど前、データベースでi18n対応したとき、あまりの面倒くささと手際の悪さで、__()関数使ったほうがメンテナンシビリティ高いアルよ!と独断している状態を続けている。

というわけなんだけど、さすがにすべてのリテラル文字列を配列に入れて宣言するのは、いくらなんでもメモリ使いすぎなので、カテゴリ別に関数にしておくことにした。