[CodeIgniter]CI_Languageをメッセージに外部から値を組み込めるように拡張してみた


CodeIgniter標準の言語クラスでは、メッセージに変数などを埋め込める機能が存在しません。もしかすると誰かが既に作ってる可能性は限りなく高いですが、対した実装でもないので勢いで作っちゃいました。

やってることは簡単で、可変長引数を取得し、メッセージ内に組み込まれた置換対象文字である{0}や{1}を置換しているだけです。

CI_Languageと下位互換性は保っているので、置き換えてもそのまま動かすことも可能です。

system/application/helpers/xc_language_helper.php

< ?php  if (!defined('BASEPATH')) exit('No direct script access allowed');
 
if ( ! function_exists('lang'))
{
	/**
	 * 言語ファイルから対象のメッセージを取得する。
	 * 
	 * @param $line メッセージキー
	 * @param $id
	 * @param $args 置換値(可変長引数)
	 */
	function lang($line, $id = '')
	{		
		$CI =& get_instance();
		$line = $CI->lang->line($line);
 
		// 可変長引数以外の変数の個数
		$define_arg_num = 2;
 
		// 置換引数指定の場合は、メッセージ内の置換対象文字列を置換する。
		$num = func_num_args();
		if ($num > $define_arg_num) {
			for ($i=0; $i< ($num-$define_arg_num); $i++) {
				$line = str_replace('{'.$i.'}', func_get_arg($define_arg_num+$i), $line);
			}
		}
 
		if ($id != '')
		{
			$line = '<label for="'.$id.'">'.$line."";
		}
 
		return $line;
	}
}
 
?>

system/application/libraries/XC_Language.php

< ?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
 
class XC_Language extends CI_Language {
	public function __construct() {
		parent::__construct();
	}
 
	/**
	 * 言語ファイルからメッセージを取得し、置換対象文字列が指定されている場合は、置換後の文字列を返す。
	 * 
	 * @param $line メッセージキー
	 * @param $args 置換値(可変長引数)
	 */
	function line($line = '') {
		$line = ($line == '' OR ! isset($this->language[$line])) ? FALSE : $this->language[$line];
 
		// 可変長引数以外の変数の個数
		$define_arg_num = 1;
 
		// 置換引数指定の場合は、メッセージ内の置換対象文字列を置換する。
		$num = func_num_args();
		if ($num > $define_arg_num) {
			for ($i=0; $i< ($num-$define_arg_num); $i++) {
				$line = str_replace('{'.$i.'}', func_get_arg($define_arg_num+$i), $line);
			}
		}
 
		return $line;
	}
}
?>

追記:2011.03.12 15:23
CodeIgniter 2.0からCI_LaunguageではなくCI_Langにクラス名が変更されています。

関連記事