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にクラス名が変更されています。