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
に変わる。

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

Fedora13 on VMwareでカーネルクラッシュの巻

突然やってきた。
VMwareでFedora13を起動したところ、画面上に見慣れないアイコンが。


クラッシュレポートだったかな。
中には、kernelがクラッシュしたでおますよ!うほ!と書かれていた。

そもそもVMなんで、別にクラッシュしたからといって、本気で「ジーザス!」とは言わないですむし、そもそもそれもVM使う目的でもあるわけだから、「貴様ごときに男らしさは求めてねぇズラ!」と思いながら、レポートを見てみた。

どうもあやしい。なんだこれは。

Guest filesystem driver                                           [FAILED]
Mounting HGFS shares:                                             [FAILED]
Guest memory manager:                                             [FAILED]
Guest vmxnet fast network device:                                 [FAILED]
VM communication interface:                                       [FAILED]
VM communication interface socket family:                         [FAILED]
Blocking file system:                                             [FAILED]
Starting abrt daemon: abrtd: Failed to start: timeout waiting for child
                                                                  [FAILED]
FAILEDだらけじゃねぇかオラ!

そしてそもそもだが、HGFSってなんぞや?という素朴すぎる疑問が残った。
こんなものがカーネル先生をクラッシュさせたのか?ニダ?

いろいろ調べてみると、どうやらVMware-toolsを入れなおしたほうがよさそうなことがわかったので、VMメニューからvmware-toolsの再インストールを選択し、やり直してみた。

俺はVMware-toolsを入れた後は必ず再起動させているんだけど、とりあえずこれで落ち着いたようだ。カーネル先生は健在だ。

しかし、インストール中にこんな表示があった。
Creating a new initrd boot image for the kernel.
   Checking acpi hot plug                                  [  OK  ]
Starting VMware Tools services in the virtual machine:
   Switching to guest configuration:                       [  OK  ]
   Guest filesystem driver:                                [  OK  ]
   Mounting HGFS shares:                                   [失敗]
   Guest memory manager:                                   [  OK  ]
   VM communication interface:                             [  OK  ]
   VM communication interface socket family:               [  OK  ]
   Blocking file system:                                   [  OK  ]
   File system sync driver:                                [  OK  ]
   Guest operating system daemon:                          [  OK  ]
   Virtual Printing daemon:                                [  OK  ]

すげぇ気持ち悪いよなーこういうの。

結局カーネル先生は大丈夫くさいけど、また再発しないとも言い切れない。
もう少しよく調べてみようと思ったんだけど、すぐに解決した。

VMのファイル共有をONにすればよいらしい。

なるぺちょ。

ではさいなら。

CakePHP用フォームの整列jQueryプラグイン

どうしてもCakePHP内のビューやコントローラ内で、php自体によってHTMLタグを生成したいという人以外は、可能な限り以下の方法をとると、寝覚めが良いはずだ。
  • HTMLタグには極力アトリビュートを付けない
  • 付けるのは少しのIDといくつかのclass程度
  • 当然TABLEタグでレイアウトなんぞは組まない
 どういう事かというと、吐出されたHTMLタグまでをphpで制御しようというのはおかしいと思っているから、そういう完全に見た目という意味でのビューは、jQueryなどのクライアントサイドスクリプトでやっちまえばいいだろう。

こういう考えで開発していくと、CakePHPのFormヘルパーが吐き出す、そっけなく簡素で女々しいHTMLタグも、むしろそれでいてくれてありがとうと思えるほど便利になる。

さて、俺が何を言いたいのか、わかっていただけてるかな。


「CakePHPのFormヘルパーで出力されたラジオボタンを整列したい」という問に対してphpでHTMLタグを出力させ、cssなどで整形するという解決

これ、完全に、デザイナの領域なのに、開発側で対応しようというのがそもそもの間違いであり、こういった作業は往々にして大した結果に至らない。要するに解決にならない場合が多いのではないだろうか。

とにかく、無理矢理が良くない、ということを言いたい。

CakePHPはほぼphpで書かれたMVCだけど、Vから先のことはこう考えるとよいだろう。

JavaScriptで、HTML(DOM)とCSSをコントロールする

だ。俺が言いたいことがわかっていただけたかな。

CakePHPのMVCよろしく、jQueryをコントローラとし、DOMで拾う内容をモデルとし、それらを吐き出すためにcss、場合によってはHTMLで整形してビューとする、というような流れを考えたほうが良い。

このほうが何しろソースは綺麗になるわ、サーバの負荷分散にもなるわ、デザイナのスキルアップにもなるわ、開発者の手間も省けるわ、で、いいことずくめだ。どうしてやらない?と俺は聞きたい。

ちなみにこの方法が実現できない様な糞ブラウザ(IE)を上司から要求されたら、そいつにこう言ってあげるとよいだろう。

「おや?部長、口からクソがはみ出てますよ?」

と。


というわけで、前置きが長くなったけど、CakePHPで素直に出力したcheckboxを、DOM操作で整列させるjQueryプラグインを作ったので披露してみたい。

CakePHP側では以下のようなビューを使用することとする。
echo $form->input('hobbies', array(
      'type' => 'select',
      'multiple' => 'checkbox',
      'options' => $masters['hobby'],
      'div' => true,
      'label' => false,
    ))
$masters['hobby']には、find('list')などして生成したマスタデータが入っている。

そしてこのビューを素直に表示させたときのサンプルがこうだ。
 まぁこんな感じだよな。当然縦に長くなる。

正直いって、生粋の開発者として長年生きてる人にとっては、この時点でこれ以上いじるのはやめたほうが良い。ろくなことがない。デザイナがやりにくくなるだけだ。2列にしてと言われても、開発者はやっちゃだめだ。