国際化とも呼ばれる多言語サポートは、最新の Web アプリケーションの重要な機能です。ほとんどのフルスタック PHP フレームワークには多言語サポートが付属しており、各言語の既存のソース コードを複製することなく、さまざまな言語でアプリケーションのインターフェイスを動的に表示できます。今日は、CodeIgniter を使用して複数の言語を有効にする方法と、コア機能をカスタマイズするためのいくつかのトリックについて説明します。
多言語サポートの構成
まず、言語サポートの使用を開始する前に、必要なファイルを構成する必要があります。application/config ディレクトリにある CodeIgniter 設定ファイルには、アプリケーションのデフォルト言語を定義する language というオプションが含まれています。
<?php
$config['language'] = 'english';
また、さまざまな言語でメッセージを含む実際のファイルを作成する必要があります。これらのファイルは、言語ごとに個別のディレクトリを持つ application/language ディレクトリ内に配置する必要があります。たとえば、英語のファイルは application/language/english ディレクトリに配置し、フランス語のファイルは application/language/french に配置する必要があります。
サンプル アプリケーションのエラー メッセージを含む言語ファイルをいくつか作成してみましょう。ファイル english/message_lang.php を作成します (すべての言語ファイルに接尾辞 _lang.php を付けることが重要です)。次のコードには、言語ファイルのコンテンツのサンプル エントリが含まれています。
<?php
$lang["msg_first_name"] = "First Name";
$lang["msg_last_name"] = "Last Name";
$lang["msg_dob"] = "Date of Birth";
$lang["msg_address"] = "Address";
もちろん、1 つの言語ディレクトリ内に複数の言語ファイルを含めることができます。コンテキストと目的に基づいてメッセージを異なるファイルにグループ化し、メッセージ キーの前にファイル固有のキーワードを付けて一貫性を保つことをお勧めします。
もう 1 つの方法は、コントローラごとに個別のメッセージ ファイルを作成することです。この手法の利点は、言語ファイル全体ではなく、必要なメッセージのみが読み込まれるため、一定レベルのパフォーマンス オーバーヘッドが発生する可能性があることです。
言語ファイルのロード
言語ファイルを作成しても、コントローラー内にロードするまでは効果がありません。次のコードは、コントローラー内にファイルをロードする方法を示しています。
<?php
class TestLanguage extends CI_Controller
{
public function __construct() {
parent::__construct();
$this->lang->load("message","english");
}
function index() {
$data["language_msg"] = $this->lang->line("msg_hello_english");
$this->load->view('language_view', $data);
}
}
通常、コントローラーとビュー内で言語ファイルを使用します (モデル内で言語ファイルを使用するのはあまり良いことではありません)。ここでは、コントローラーのコンストラクターを使用して言語ファイルをロードし、クラス全体で使用できるようにしてから、クラスの index() メソッドで参照します。
lang->load() メソッドの最初のパラメータは、言語のファイル名から _lang サフィックスを除いたものになります。オプションの 2 番目のパラメータは、言語ディレクトリです。ここで指定されていない場合は、構成内のデフォルトの言語を指します。
lang->line() メソッドを使用して言語ファイルのエントリを直接参照し、その戻り値をビュー テンプレートに渡されたデータに割り当てることができます。ビュー内で、上記の言語メッセージを $language_msg として使用できます。
ビューから直接言語ファイルをロードする必要がある場合もあります。たとえば、フォーム ラベルに言語アイテムを使用することは、ビュー内のメッセージを直接読み込んでアクセスする正当な理由と見なされる場合があります。ビュー内のこれらのファイルには、コントローラー内と同じアクセス方法を使用できます。
<?php
$this->lang->line("msg_hello_english");
これは完全に機能しますが、ビュー テンプレート コードが実際のクラスではない場合、$this を使用すると混乱する可能性があります。また、次のコードを言語ヘルパーのサポートと共に使用して、ビュー内に言語エントリをロードすることもできます。これにより、よりクリーンなコードが得られます。
<?php
lang("msg_view_english");
基本的に、CodeIgniter 言語ファイルの操作を開始するために知っておく必要があるのはこれだけです。しかし、これは非常に単純ですが、プロジェクトに何百ものクラスが含まれている場合は特に、各コントローラーに必要な言語ファイルをロードするのは不必要で重複する作業です。幸いなことに、CodeIgniter フックを使用して、コントローラーごとに言語ファイルを自動的にロードするための迅速かつ効果的なソリューションを構築できます。
フックへの言語読み込みの責任の割り当て
CodeIgniter は、実行プロセスの一部としていくつかの組み込みフックを呼び出します。フックの完全なリストについては、ユーザー ガイドを参照してください。コントローラーがインスタンス化された直後、他のメソッド呼び出しの前に呼び出される post_controller_constructor フックを使用します。
メイン構成ファイルで enable_hooks パラメータを設定して、アプリケーションでフックを有効にします。
<?php
$config['enable_hooks'] = TRUE;
次に、config ディレクトリ内の hooks.php ファイルを開き、次のコードに示すようにカスタム フックを作成します。
<?php
$hook['post_controller_constructor'] = array(
'class' => 'LanguageLoader',
'function' => 'initialize',
'filename' => 'LanguageLoader.php',
'filepath' => 'hooks'
);
これはフックを定義し、それを実行するために必要な情報を提供します。実際の実装は、application/hooks ディレクトリ内のカスタム クラスに作成されます。
<?php
class LanguageLoader
{
function initialize() {
$ci =& get_instance();
$ci->load->helper('language');
$ci->lang->load('message','english');
}
}
ここでは、$this->lang を使用して言語ライブラリにアクセスできないため、get_instance() 関数を使用して CI オブジェクト インスタンスを取得する必要があります。その後、前に行ったように言語をロードします。これで、コントローラー内に手動でロードする必要なく、アプリケーションのすべてのコントローラーで言語ファイルを使用できるようになります。
異なる言語間の切り替え
複数言語のサポートが確立されると、各言語のリンクがユーザーに提供されます。通常は、ユーザーがクリックして言語を切り替えることができるアプリケーションのメニューの 1 つに表示されます。セッションまたは Cookie の値を使用して、アクティブな言語を追跡できます。
前に生成したフック クラスを使用して言語切り替えを管理する方法を見てみましょう。まず、言語を切り替えるクラスを作成する必要があります。以下に示すように、これには別のコントローラーを使用します。
<?php
class LangSwitch extends CI_Controller
{
public function __construct() {
parent::__construct();
$this->load->helper('url');
}
function switchLanguage($language = "") {
$language = ($language != "") ? $language : "english";
$this->session->set_userdata('site_lang', $language);
redirect(base_url());
}
}
次に、使用可能な各言語を切り替えるリンクを定義する必要があります。
<a href='<?php echo $base_url; ?>langswitch/switchLanguage/english'>English</a>
<a href='<?php echo $base_url; ?>langswitch/switchLanguage/french'>French</a>
ユーザーが特定の言語を選択すると、LangSwitch クラスの switchLanguage() メソッドが選択された言語をセッションに割り当て、ユーザーをホームページにリダイレクトします。
現在、アクティブな言語はセッションで変更されますが、アクティブな言語の特定の言語ファイルをロードするまでは影響を受けません。また、フック クラスを変更して、セッションから動的に言語をロードする必要があります。
<?php
class LanguageLoader
{
function initialize() {
$ci =& get_instance();
$ci->load->helper('language');
$site_lang = $ci->session->userdata('site_lang');
if ($site_lang) {
$ci->lang->load('message',$ci->session->userdata('site_lang'));
} else {
$ci->lang->load('message','english');
}
}
}
LanguageLoader クラス内では、アクティブな言語を取得して必要な言語ファイルをロードするか、セッション キーが存在しない場合はデフォルトの言語をロードします。このクラス内に単一言語の複数の言語ファイルをロードできます。参照: http://www.sitepoint.com/multi-language-support-in-codeigniter/