多语言lang文件将一些模式替换为动态内容

时间:2014-07-18 13:40:46

标签: php multilingual

目前我正在开发一个需要支持多语言的项目,我已经编写了一个简单的函数来执行此操作,这里要问有没有更好的方法使用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'];

1 个答案:

答案 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全部。

稍后编辑:

作为一个注释,除非没有其他办法,否则永远不要使用正则表达式。尽量避免使用它们,因为如果你不优化它们,它们可能会非常慢。