うちのサーバはブログや掲示板などの動的部分を除いて、ApacheのContent Negotiationを利用することで表示する言語を振り分けている。
あまり詳しくない人のために一応説明しておくと、通常ホームページなどを閲覧するためにはHTTPプロトコルというのが使われていて、要するに「ブラウザはこういう情報を送って、サーバはこういう情報を返しなさい」というのがだいたい決められている。このときにブラウザが送る情報は、「どのページを見たいか」、「自分のブラウザの種類は何か」、「どこのリンクをたどってきたか」、のようなもので、サーバがそれに返す情報は「リクエストをどのように受理したか」、「送られるファイルの種類は何か」「送られるファイルのサイズはいくつか」のようなものである。
ところでこのときブラウザの送信する内容の中に「どの言語がいいか」みたいなものがあって、うちのサーバではその要求に従って、日本語がよければ日本語、英語がよければ英語を、それぞれ表示するように設定してある。これをContent Negotiationという。
Content Negotiationの設定方法はApacheに付属のマニュアルがこれを使った非常に良いチュートリアルになっているので、そこを参考にすれば簡単に設定可能であると思う。
とは言え表示して欲しいと言われている言語を表示すると言っても、ブラウザによっては何も言ってこなかったり、日本語と英語以外のものを指定してくることもあるわけだから、その時のデフォルトとして日本語を表示するようにしてある(ドメインもjpだし)。本当はこの表示して欲しい言語と言うのも優先順位を付けていくつも指定できるので、このままでもそれぞれ自分の読むことができる言語に落ち込むだろう、と予想していたのだが、ふとアクセスログを見ているとどうやらそうではないらしい。
ブラウザリクエストがen(英語)以外のものに対しては、de(ドイツ語)にもfr(フランス語)にも容赦なく日本語を返しているようだ。英語サイトからリンクをたどってきたら、突如目の前に現れる意味不明な超絶マルチバイト。これではコンピュータは平気かもしれないが、人間がクラッシュしてしまう可能性がある。
日本人はたいていja(日本語)を送ってくるはずだから、デフォルトを英語にすれば丸く収まることは収まるんだけど、やっぱりデフォルトは日本語だろう、マルチバイト万歳、という部分もある。まぁ、URLを/en/で始めれば強制的に英語になるので、英語サイトのリンク先にはこっちを指定するという手もあるが、それだと何のためにContent Negotiationしてるんだかわからんし。あとは、言語スイッチを画面の上のわかりやすいところに持っていくというんでもいいだろうが、デザイン的に上部は狭いしなぁ・・・。
よくよく多言語対応っていうのも、難しい問題ではある。