Phalcon使用多语言环境(切换中文/英文等)

Phalcon使用多语言环境(切换中文/英文等)

lang类文件

namespace Utils;
use Phalcon\Http\Request;
use Phalcon\Translate\Adapter\NativeArray;

class Lang{

    public static $langType = ['en','cn','hk'];
    static public $load_langs_package = array();//已载入语言包列表
    static public $langs = array();//已经载入的语言包本体
    /**
     * 获取当前语言
     * @return StrinigTool
     */
    public static function current()
    {
        //return 'cn';
        $language = get_value($_COOKIE['lang'],0);
        if($language){
            return $language;
        }elseif(!$language&&get_value($_GET['lang'],0)){
            $language = get_value($_GET['lang'],0);
        }else{
            $request = new Request();
            $language = strtolower($request->getBestLanguage());
            if($language == 'zh_cn' || $language == 'zh' || $language=='cn'){
                return 'cn';
            }elseif($language=='en'){
                return 'en';
            }else{
                return 'cn';
            }
        }
        return $language;
    }

    /**
     * 设置最合适的语言
     * @param $lang
     */
    public static function change($lang)
    {
        $_SESSION['lang'] = $lang ? $lang: 'cn';
    }

    /**
     * 获取多语言解析类
     * @return NativeArray
     */
    public static function getObj($load_lang = array())
    {
        //如果没有传值并且 已经装载过语言包则直接返回装载的语言包
        if(empty($load_lang) && !empty(self::$langs)){
            return self::return_native(self::$langs);
        }
        
        //如果传入字符串则转换为数组
        if(is_string($load_lang)){
            $load_lang = array($load_lang);
        }

        //查看语言包是否已经载入
        foreach ($load_lang AS $key => $lang){
            if(in_array($load_lang, self::$load_langs_package)){
                //如果已经载入则从新载入列表中删除
                unset($load_lang);
            }
        }
        //如果新载入列表为空,则新载入列表中的语言包已经全部载入过
        //直接返回已有语言包
        if(empty($load_lang)){
            return self::return_native(self::$langs);
        }

        //使用的语言
        $language = Lang::current();

        $language_messages = array();
        $messages = array();
        foreach ($load_lang AS $file){
            if(file_exists(APP_PATH."/languages/" . $language . "/" . $file . ".php")){
                require APP_PATH."/languages/" . $language . "/" . $file . ".php";//语言包地址
            }
            self::$load_langs_package[] = $file;
            
            //将新语言包放入已载入语言包列表中

            //整合语言包
            $language_messages = array_merge($language_messages, $messages);
        }
        self::$langs = array_merge(self::$langs,$language_messages);
        return self::return_native(self::$langs);
    }

    public static function return_native($array){
        return new NativeArray(
            array(
                "content" => $array
            )
        );;
    }

    public function getLangPackage(){
        return self::$load_langs_package;
    }
}

在控制器加载语言包

    /**
     * 加载语言包
     * 直接将语言包名当作参数传递
     * $param string lang1 语言包1,语言包2 逗号隔开
     * .......
     */
    public function lang_load()
    {
        $this->view->now_lang = Lang::current();
        $param = func_get_args();//获取传入参数数量
        if (!empty($param)) {
            $this->t = Lang::getObj($param);
            return $this->t;
        }
        return Null;
    }

语言装换函数

可在视图页面直接用

/**
 * 语言包函数
 */
function t($val)
{
    $lang = Lang::getObj();
    return $lang->_($val);
}

猜你喜欢

转载自blog.csdn.net/qq_41049126/article/details/89516154
今日推荐