thinkPHP3.2.3 语言包中英文切换细节

浏览:17285 发布日期:2016/06/29 分类:求助交流 关键字: thinkPHP 语言包 中英文
从百度和本论坛讨论上找了一下午资料,其实也就是那么几个重复信息,加上有些版本不同,使用方式也不一样,所以在语言包的中英文切换上一直没解决问题。我的版本是thinkPHP3.2.3
主要参考链接:
http://www.thinkphp.cn/topic/26190.html
http://www.poluoluo.com/jzxy/201403/265003.html

先说说我目前的情况:
1.Application/home/conf/下新建了一个tags.php,内容如下<?php
    //中英文切换需要的文件,似乎只要第一行app_begin就可以了
    return array(
        // 添加下面一行定义即可
        'app_begin'        => array('Behavior\CheckLangBehavior'),   //注意这里,官方的文档解释感觉有误(大家自行分辨),TP3.2.3用Behavior\CheckLang会出错,提示:Class 'Behavior\CheckLang' not found
        'LANG_SWITCH_ON'   => true,      // 开启语言包功能
        'LANG_AUTO_DETECT' => true,    // 自动侦测语言 开启多语言功能后有效
        'LANG_LIST'        => 'zh-cn,en-us',         // 允许切换的语言列表 用逗号分隔
        'VAR_LANGUAGE'     => 'l',          // 默认语言切换变量,注意到上面发的链接了么,l=zh-cn,就是在这里定义l这个变量
    );

?>
2.Application/home/conf/config.php中添加如下    //中英文切换语言包配置项
    'LANG_SWITCH_ON'     =>     true,    //开启语言包功能        
    'LANG_AUTO_DETECT'     =>     true, // 自动侦测语言
    'DEFAULT_LANG'         =>     'zh-cn', // 默认语言        
    'LANG_LIST'            =>    'zh-cn,en-us', //必须写可允许的语言列表
    'VAR_LANGUAGE'     => 'l', // 默认语言切换变量
3.把thinkphp中的Library中的Behavior\Checklangbehavior文件拷贝到:application/common/behavior中(没有文件夹的时候新建了一个):并且namespase改写成:
namespace Common\Behavior;
use Think\Behavior;
use Think\Hook;
整体如下<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2012 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
namespace Common\Behavior;
use Think\Behavior;
use Think\Hook;
/**
 * 语言检测 并自动加载语言包
 */
class CheckLangBehavior {

    // 行为扩展的执行入口必须是run
    public function run(&$params){
        // 检测语言
        $this->checkLanguage();
    }

    /**
     * 语言检查
     * 检查浏览器支持语言,并自动加载语言包
     * @access private
     * @return void
     */
    private function checkLanguage() {
        // 不开启语言包功能,仅仅加载框架语言文件直接返回
        if (!C('LANG_SWITCH_ON',null,false)){
            return;
        }
        $langSet = C('DEFAULT_LANG');
        $varLang =  C('VAR_LANGUAGE',null,'l');
        $langList = C('LANG_LIST',null,'zh-cn');
        // 启用了语言包功能
        // 根据是否启用自动侦测设置获取语言选择
        if (C('LANG_AUTO_DETECT',null,true)){
            if(isset($_GET[$varLang])){
                $langSet = $_GET[$varLang];// url中设置了语言变量
                cookie('think_language',$langSet,3600);
            }elseif(cookie('think_language')){// 获取上次用户的选择
                $langSet = cookie('think_language');
            }elseif(isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])){// 自动侦测浏览器语言
                preg_match('/^([a-z\d\-]+)/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $matches);
                $langSet = $matches[1];
                cookie('think_language',$langSet,3600);
            }
            if(false === stripos($langList,$langSet)) { // 非法语言参数
                $langSet = C('DEFAULT_LANG');
            }
        }
        // 定义当前语言
        define('LANG_SET',strtolower($langSet));

        // 读取框架语言包
        $file   =   THINK_PATH.'Lang/'.LANG_SET.'.php';
        if(LANG_SET != C('DEFAULT_LANG') && is_file($file))
            L(include $file);

        // 读取应用公共语言包
        $file   =  LANG_PATH.LANG_SET.'.php';
        if(is_file($file))
            L(include $file);
        
        // 读取模块语言包
        $file   =   MODULE_PATH.'Lang/'.LANG_SET.'.php';
        if(is_file($file))
            L(include $file);

        // 读取当前控制器语言包
        $file   =   MODULE_PATH.'Lang/'.LANG_SET.'/'.strtolower(CONTROLLER_NAME).'.php';
        if (is_file($file))
            L(include $file);
    }
}
4.application/home中,建立lang文件夹,在下面建立:zh_cn.php文件<?php
return array(
        'welcome'=>'欢迎使用ThinkPHP',
        'test'=>'你正在测试',
        'message'=>'消息',
);
?>
5.在index.html中插入其中如下代码 <div class="main">
<div>切换语言:<a href="?l=zh-cn">简体中文</a> | <a href="?l=zh-tw">繁体中文</a> | <a href="?l=en-us">英文</a></div>
 <div class="result">{$Think.lang.welcome}</div>
 <div class="result">{$Think.lang.message}</div>
 <div class="result">{:L("message")}</div>
</div>
但是发现运行情况如下:


就是说没起作用吗?哪里有问题?怎么改?
另外我还试了其他各种方法,也不行!包括下面这种方式:

在home\lang下建立了en-us和zh-cn文件夹,里面分别建立了common.php文件,文件中是数组配置信息,还有文件添加在了其他路径的,我都试了下,也是不行。


唯一成功过的一次!!!就是我直接把如下代码添加到thinkPHP/lang/zh-cn.php中了:'_SELECT_NOT_EXIST_'     => '记录不存在!',
    '_EXPRESS_ERROR_'        => '表达式错误',
    '_TOKEN_ERROR_'          => '表单令牌错误',
    '_RECORD_HAS_UPDATE_'    => '记录已经更新',
    '_NOT_ALLOW_PHP_'        => '模板禁用PHP代码',
    '_PARAM_ERROR_'          => '参数错误或者未定义',
    '_ERROR_QUERY_EXPRESS_'  => '错误的查询条件',

    'welcome'=>'欢迎使用ThinkPHP',
    'test'=>'你正在测试',
    'message'=>'消息',
en-us同理:'_EXPRESS_ERROR_'        => 'Expression errors',
    '_TOKEN_ERROR_'          => "Form's token errors",
    '_RECORD_HAS_UPDATE_'    => 'Record has been updated',
    '_NOT_ALLOW_PHP_'        => 'PHP codes are not allowed in the template',
    '_PARAM_ERROR_'          => 'Parameter error or undefined',
    '_ERROR_QUERY_EXPRESS_'  => 'Query express error',   

    'welcome'=>'Welcome to use thinkphp',
    'test'=>'you are testing',
    'message'=>'you get a message',
这样的方式可以成功:


但是这样放在thinkPHP中和底层通知消息在一起不好吧?我好想知道的问题怎么解决,已经整了一天了,谢谢大家!
最佳答案
评论( 相关
后面还有条评论,点击查看>>