Apacheの多言語化
壁紙サービス(アプリ)を国際化して、海外のサイトで配布しています。意外にも、国内よりも海外のほうで使ってくださる人が多く、サイト自体のアクセスも海外からが増えてきました。そのため、最近は少しずつ英訳を進めています。しかし、ページが増えてくると、色々と課題が出てきて手作業が増えてきましたので、システマチックな方法で対応することにしました。
ページの英訳
ページを英訳するには、以下の作業を行います。
- 内部テキストを英語に翻訳します。
- ページに記載されたハイパーリンクで、既に翻訳済みページがある場合は、そちらを差すようにします。埋め込みのイメージファイルに関しても同様にします。
- 当該ページにアクセスする際の(別ページ等にある)リンクを、英語言語リーダ向けには英語のページに変更します。
この内、テキストの翻訳は手で行うしかありませんが、2)や3)は手作業でやるのが手間になってきたのと同時にバグったりしてきました。このため、2)に関してはPHPで関数を書いて対応していたのですが、3)の対応を行うに際し、Web Server (Apache)の機能を調べてみました。
国際化の方法
apacheの国際化の方法は2種類あります。いずれの方法も、閲覧者から指定された"Accept-Languages"を参照して、適切な言語のファイルを自動的に返す仕組です。
| 方式 | 設定 | やり方 | 課題 |
MultiViews | httpd.confに"Options MultiViews"を設定する。(通常デフォルト) | foo.htmlに対して、foo.html.en, foo.html.jaを配置する。foo.htmlは置かない。 foo.htmlにアクセスすることにより、言語に合わせたfoo.html.xxが返される。 | 直感的で簡単。 処理が遅いらしい。 foo.htmlを置けないのは気持ちが悪い(置くと直接アクセスでこちらが開かれてしまう) |
Type-Map | httpd.confに "AddHandler type-map var"を設定する。(通常デフォルト) DirectoryIndex index.var index.php index.html 等と書く。 | foo.varを作成してfoo.en.html, foo.ja.htmlなどを配置する。foo.htmlは置かない。 foo.varにアクセスすることで、ファイル内に設定された適切な言語に合わせたファイルが返される。 | こちらの方法のほうが新しい。 処理が速いとのこと。 別ファイルを置かなくてはならないのはちょっと嫌。(もしくは、foo.htmlをvarファイルにすることも可能) |
特に理由がなければ、Type-Mapの方法を使うのが良さそうです。
実際の設定
foo.htmlに対して、foo.varのファイルを作成して、URLをfoo.varでアクセスさせることになります。ファイルは以下のようなものです。
URI: foo.en.php
Content-type: text/html
Content-language: en
URI: foo.ja.php
Content-type: text/html;charset=utf-8
Content-language: ja
そして、国際化したページ全てのページに対して xxx.var を作成し、リンクを全て xxx.var を差すように変更します。
なお、例えばindexファイルであれば、DirectoryIndex に index.varを追加しないとならなりません。(これは、httpd.confの設定を変更します。なお、phpのバージョンに依っては、php.confの設定も変更/削除しないとならないかもしれません)
これでOKなのですが、実際に想定されている使い方とは少し違うようです。apacheのmanualディレクトリでType-Mapが使われているのですが、ここではindex.htmlをvarファイルにしています。動作させるためには、SetHandlerが必要になります。
<Directory "/var/www/manual">
<Files *.html>
SetHandler type-map
</Files>
</Directory>
このようにすると、外部からのURLを変更する必要がありませんので、透過的に設定することができて便利です。要するに、htmlファイルと思ってアクセスすると実体はtype-mapファイルで、その設定に従って適切なファイルが実際には返されることになります。
但し、この設定をしてしまうと、単なるhtmlファイルとして扱うこと(中身がtype-mapでないtext/htmlであればそのまま返すなどということ)はできなくなります。これはサブディレクトリにも伝播してしまいますので、取り扱いには注意が必要です。
Type-Map (var)の作成前回、ウェブページの国際化に関して書きました。結論としては、type-mapを使って、.varファイルを作成すれば良いということでした。このtype-mapファイル作成を手作業でやるのは面倒ですので、生成スクリプトmktypemap.pl.zipを作りました。使い方は以下の通りです。カレントディレクトリのhtmlファイルとjpgファイルに対してlvarファイルを作成します。mktypemap.pl *.htmlカレントディレクトリのファイル全部を対象とし、既にvarフ
Tracked: 3月 16, 02:54