Shoeisha Technology Media

CodeZine(コードジン)

記事種別から探す

Zend Framework入門(15):
多言語対応サイトの作成- Zend_Translate(後編)-

Zend Frameworkによる実践的なPHPアプリケーション開発 15

  • LINEで送る
  • このエントリーをはてなブックマークに追加

 本連載では、PHP上で動作するアプリケーションフレームワークZend Frameworkについて紹介します。前回に引き続き、サイトをユーザーの環境に合わせて多言語で表示させるパッケージ「Zend_Translate」について、自動的に翻訳ソースを検出する方法と、自前のアダプタクラスを実装する方法を解説します。

目次

はじめに

 本連載では、PHP上で動作するアプリケーションフレームワーク「Zend Framework」を紹介しています。

 今回は、前回に引き続きサイトをユーザーの環境に合わせて多言語で表示させるパッケージ「Zend_Translate」について解説します。前回はZend_Translateの基本的動作を解説し、ブラウザの環境によって、異なる言語でサイトを表示させるまでを解説しました。

 今回は、自動的に翻訳ソースを検出する方法と、自前のアダプタクラス(自作アダプタ)を実装する方法について解説します。自作アダプタは、Zend_Translate_Adapterのサブクラスとなります。今回の例ではSQLiteと連携して、データベースを翻訳ソースとして使用します。

対象読者

 PHPの基本構文は一通り理解しているが、フレームワークを利用したことはないという方を対象としています。

必要な環境

 Zend FrameworkはPHP 5.1.4以降とWebサーバがインストールされている環境で利用可能です。

 以下に、今回アプリケーション作成/動作確認に用いた環境を示します(インストールにあたっては最新安定版の使用を推奨します)。各項目の詳細なインストール手順は、「サーバサイド技術の学び舎 - WINGS」より「サーバサイド環境構築設定手順」を参照ください。

  • Mac OS X 10.4.11
  • PHP 5.2.6
  • Apache 2.2.10
  • Zend Framework 1.7.0
  • SQLite 3.1.3

 Windows、LinuxやFreeBSDなどUNIX系OSをお使いの方もコマンドはほぼ一緒ですので、パスなどは適宜読み替えてください。

翻訳ソースの自動検出

 Zend_Translate 1.5以上では、翻訳ソースを自動検出することができます。

 前回のサンプルでは、言語とそれに対応する翻訳ソースを明示的に記載していました。

[リスト1]前回の例
//Zend_Translateオブジェクト生成(翻訳アダプタの生成)
$translate = new Zend_Translate('array', $ja, 'ja');
$translate->addTranslation($en, 'en');
$translate->addTranslation($fr, 'fr');

 少ない言語に対応する場合はこれで十分かもしれませんが、対応する言語が多い場合は記述が面倒ですし、新しい言語に対応する場合にはソースコードの改修が必要となってしまいます。そのようなケースではソースの自動検出が有効です。

ディレクトリ名による自動検出

 Zend_Translateオブジェクト生成時に、第2引数に翻訳ソースの含まれているディレクトリを指定、第4引数にオプション「scan」に「Zend_Translate::LOCALE_DIRECTORY」を指定します。これにより、ディレクトリ名から言語ごとの翻訳ソースを自動的に検出します。

[リスト2]index.php
<?php

require_once 'Zend/Loader.php';
Zend_Loader::registerAutoload();

//ディレクトリ名から自動検出
$translate = new Zend_Translate('csv',
                    '../languages/directory',
                    null,
                    array('scan'=>Zend_Translate::LOCALE_DIRECTORY));

// 翻訳された値の取得と表示
$translate->setLocale('auto');

// 表示処理
print ("<html><head>");
print ("<title>".$translate->_('welcome')."</title>");
print ("</head>");
print ("<body>");
printf ($translate->_('time'), date('H:i:s'));
print ("</body></html>");

?>

 ちなみに、上記例では次のようなフォルダ構成であることを前提としています。

[リスト3]ディレクトリ構成
/htdocs/index.php
/languages
    └/directory
        ├/en/lang.csv
        ├/fr/lang.csv
        └/ja/lang.csv

 ディレクトリ名に言語名を明記することで、そのサブフォルダまで翻訳ソースファイルを検索します。ファイル名は任意です。検索時に翻訳ソースファイル以外のファイルは無視することになりますが、そのファイルが翻訳ソースとして正しいデータの形式でない場合も無視されることになるため注意が必要です。

 また、翻訳ソース自体に言語情報を持っているようなアダプタを使用する場合(tmxなど)では、この検出方法は有効になりません。

ファイル名による自動検出

 第4引数にオプション「scan」に「Zend_Translate::LOCALE_FILENAME」を指定します。これにより、ファイル名から言語ごとの翻訳ソースを自動的に検出します。

[リスト4]index.phpの一部
// ファイル名から自動検出
$translate = new Zend_Translate('csv',
                    '../languages/filename',
                    null,
                    array('scan'=>Zend_Translate::LOCALE_FILENAME));

 ちなみに、上記例では次のようなフォルダ構成であることを前提としています。

[リスト5]ディレクトリ構成
/htdocs/index.php
/languages
    └/filename
        ├en.csv
        ├fr.csv
        └ja.csv

 ファイル名の付け方としては、上記のようにファイル名を言語名そのものにする付け方の他にも、拡張子として「.en」「.ja」とつける、ファイル名の一部として「lang_en.csv」「lang_ja.csv」とつけるなどといった方法があります。

 ファイル名の一部に言語名を含める場合は「_(アンダースコア)」、「.(ドット)」、「-(ハイフン)」で区切る必要があります。また、区切り文字には優先順位があり、「_」>「-」>「.」の順です。もし1つのファイル名の中に複数の言語情報を含めたような場合(そんなややこしいことはしないと思いますが)、優先順位の高い区切り文字で指定されている中で先に登場したものが、その翻訳ソースの言語として検出されます。

翻訳ソースの格納箇所

  翻訳ソースに限らず、アプリケーション内部でのみ利用するようなデータファイルについて、エンドユーザーが直接にアクセスできるような場所に配置するべきではありません。データファイルには時としてエンドユーザーに見せるべきではない(秘匿すべき)情報が含まれる可能性があるためです(翻訳ソースが漏えいしても問題になることはそれほど多くないかもしれませんが、不要な情報は原則として見せないというのが正しいスタンスでしょう)。

  基本的に、翻訳ソースは直接アクセスできるドキュメントルート配下にはおかないようにしましょう。実務で使用する場合はご注意ください。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XMLD...

  • WINGSプロジェクト 森山 絵美 (モリヤマ エミ)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2017年5月時点での登録メンバは52名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂き...

バックナンバー

連載:Zend Framework入門

もっと読む

All contents copyright © 2005-2017 Shoeisha Co., Ltd. All rights reserved. ver.1.5