目前我正在开发一个需要支持多语言的项目,我已经编写了一个简单的函数来执行此操作,这里要问有没有更好的方法使用include langfile返回语言var?
这是我写翻译文件的地方。
class OhHelper
{
//.... Other function
public static function t($filename, $msg = '', $arr = array())
{
$lang = defined('lang_select') ? lang_select : lang;
$file = ROOT . DS . 'language' . DS . $lang . DS . $filename . '.php';
if(file_exists($file))
{
$lang = include $file;
if($msg == '')
{
//return the whole language array
return $lang;
}
if(array_key_exists($msg, $lang))
{
if(preg_match('/\{[\d+]\}/', $lang[$msg], $matched))
{
if(count($matched) > 0)
{
$langReplace = $lang[$msg];
foreach($matched as $key => $var)
{
$langReplace = preg_replace('/\{[\d+]\}/', $arr[$key], $langReplace);
}
return $langReplace;
}
}
else
{
//return the selected lang(there is no {\d} to replace
return $lang[$msg];
}
}
}
return 'lang file not found';
}
}
这是语言文件
return array(
'welcome good to see you again' => 'Welcome {1}, good to see you again',
'good bye see you again' => 'Bye {1}, see you',
);
这是我如何调用并成功替换内容
echo OhHelper::t('general', 'welcome good to see you again', array('username'));
目前此功能可行,但我正在寻找更好的性能, 我想用这个 OhHelper :: t()重复每一个文字,当有很多内容时我会很慢(我猜)
我正在以MVC模式做事,所以我认为是另一种方式
每个控制器构建 $ this-> lang = OhHelper(' controller','')
但是这样我就无法用动态内容替换{1}模式,只能做类似的事情
echo $this->lang['welcome']; echo ' '; echo 'username'; echo $this->lang['see you again'];
答案 0 :(得分:0)
我使用像你这样的标签,但不是数字,它不需要正则表达式。为每次调用运行正则表达式可能会降低您的应用程序速度。
而不是{1}
,您可以使用{username}
,当您致电时:
echo OhHelper::t('general', 'welcome good to see you again', array('username'));
您应该使用具有替换名称的该数组的键:
echo OhHelper::t('general', array('username' => 'welcome good to see you again'));
并在OhHelper class
中,您只需迭代数组参数并str_replace
全部。
稍后编辑:
作为一个注释,除非没有其他办法,否则永远不要使用正则表达式。尽量避免使用它们,因为如果你不优化它们,它们可能会非常慢。