thinkphp实现多语言功能(语言包)


Posted in PHP onMarch 04, 2014

1.在Home(你取的项目名)的config.php中添加如下配置

<?php
return array(
    //'配置项'=>'配置值'
        'LANG_SWITCH_ON'     =>     true,    //开启语言包功能        
        'LANG_AUTO_DETECT'     =>     true, // 自动侦测语言
        'DEFAULT_LANG'         =>     'zh-cn', // 默认语言        
        'LANG_LIST'            =>    'en-us,zh-cn,zh-tw', //必须写可允许的语言列表
        'VAR_LANGUAGE'     => 'l', // 默认语言切换变量
);
?>

2.Home的conf文件夹里添加一个php文件(tag.php),添加如下代码:

return array(
    // 添加下面一行定义即可
    'app_begin' => array('CheckLang')
);

3.把Extend/Behavior/CheckLangBehavior.class.php 文件复制到Home/lib/Behavior/中(完整版的thinkphp包才有,没有的话请自行创建)

CheckLangBehavior.class.php代码:

<?php
defined('THINK_PATH') or exit();
/**
 * 语言检测 并自动加载语言包
 * @category   Extend
 * @package  Extend
 * @subpackage  Behavior
 */
class CheckLangBehavior extends Behavior {
    // 行为参数定义(默认值) 可在项目配置中覆盖
    protected $options   =  array(
            'LANG_SWITCH_ON'        => false,   // 默认关闭语言包功能
            'LANG_AUTO_DETECT'      => true,   // 自动侦测语言 开启多语言功能后有效
            'LANG_LIST'             => 'zh-cn', // 允许切换的语言列表 用逗号分隔
            'VAR_LANGUAGE'          => 'l',        // 默认语言切换变量
        );
    // 行为扩展的执行入口必须是run
    public function run(&$params){
        // 开启静态缓存
        $this->checkLanguage();
    }
    /**
     * 语言检查
     * 检查浏览器支持语言,并自动加载语言包
     * @access private
     * @return void
     */
    private function checkLanguage() {
        // 不开启语言包功能,仅仅加载框架语言文件直接返回
        if (!C('LANG_SWITCH_ON')){
            return;
        }
        $langSet = C('DEFAULT_LANG');
        // 启用了语言包功能
        // 根据是否启用自动侦测设置获取语言选择
        if (C('LANG_AUTO_DETECT')){
            if(isset($_GET[C('VAR_LANGUAGE')])){
                $langSet = $_GET[C('VAR_LANGUAGE')];// 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(C('LANG_LIST'),$langSet)) { // 非法语言参数
                $langSet = C('DEFAULT_LANG');
            }
        }
        // 定义当前语言
        define('LANG_SET',strtolower($langSet));
        $group = '';
        $path    =   (defined('GROUP_NAME') && C('APP_GROUP_MODE')==1) ? BASE_LIB_PATH.'Lang/'.LANG_SET.'/' : LANG_PATH.LANG_SET.'/';
        // 读取项目公共语言包
        if(is_file(LANG_PATH.LANG_SET.'/common.php'))
            L(include LANG_PATH.LANG_SET.'/common.php');     
        // 读取分组公共语言包
        if(defined('GROUP_NAME')){
            if(C('APP_GROUP_MODE')==1){ // 独立分组
                $file = $path.'common.php';
            }else{ // 普通分组
                $file = $path.GROUP_NAME.'.php';
                $group = GROUP_NAME.C('TMPL_FILE_DEPR');
            }
            if(is_file($file))
                L(include $file);
        }
        // 读取当前模块语言包
        if (is_file($path.$group.strtolower(MODULE_NAME).'.php'))
            L(include $path.$group.strtolower(MODULE_NAME).'.php');
    }
}

4.在Home里的lang文件夹下创建3个语言文件夹。分别是zh-cn  en-us  zh-tw,

在这三个文件夹里各创建一个common.php文件,如图:

在common.php 里对应写上

<?php
return array(
        'welcome'=>'Welcome to use thinkphp',
);
?>

<?php
return array(
    'welcome'=>'欢迎使用ThinkPHP',
);
?>

<?php
return array(
    'welcome'=>'?g迎使用ThinkPHP',
);
?>

5.在tpl/Index/文件夹下创建视图 index.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <title>ThinkPHP示例:多语言</title>
 </head>
 <body>
 <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>
 </body>
</html>

大功告成!

后台语言要进行语言切换的话, 在每句话之前加L,如:

public function index(){
print  L('add_user_error');//add_user_error只是语言变量,具体的语言要到语言包里写
$this->display();
}

这一点我觉得cakephp做的就比较好,不需要给每句话都给予一个变量。

PHP 相关文章推荐
PHP5中使用DOM控制XML实现代码
May 07 PHP
一篇有意思的技术文章php介绍篇
Oct 26 PHP
php ajax 静态分页过程形式
Sep 02 PHP
PHP类中的魔术方法(Magic Method)简明总结
Jul 08 PHP
php switch语句多个值匹配同一代码块应用示例
Jul 29 PHP
Php连接及读取和写入mysql数据库的常用代码
Aug 11 PHP
举例详解PHP脚本的测试方法
Aug 05 PHP
WordPress中用于检索模版的相关PHP函数使用解析
Dec 15 PHP
php+MySQL实现登录时验证登录名和密码是否正确
May 10 PHP
php微信支付接口开发程序
Aug 02 PHP
PHP身份证校验码计算方法
Aug 10 PHP
php反射学习之不用new方法实例化类操作示例
Jun 14 PHP
thinkphp实现图片上传功能分享
Mar 04 #PHP
php判断是否为json格式的方法
Mar 04 #PHP
php不写闭合标签的好处
Mar 04 #PHP
php循环创建目录示例分享(php创建多级目录)
Mar 04 #PHP
PHP中is_file不能替代file_exists的理由
Mar 04 #PHP
php获取目标函数执行时间示例
Mar 04 #PHP
PHP代码优化的53个细节
Mar 03 #PHP
You might like
PHP 分页类(模仿google)-面试题目解答
2009/09/13 PHP
PHP中文件缓存转内存缓存的方法
2011/12/06 PHP
PHP HTML JavaScript MySQL代码如何互相传值的方法分享
2012/09/30 PHP
Laravel搭建后台登录系统步骤详解
2016/07/26 PHP
redis查看连接数及php模拟并发创建redis连接的方法
2016/12/15 PHP
php 判断IP为有效IP地址的方法
2018/01/28 PHP
PHP连接MySQL数据库的三种方式实例分析【mysql、mysqli、pdo】
2019/11/04 PHP
在线编辑器的实现原理(兼容IE和FireFox)
2007/03/09 Javascript
js截取固定长度的中英文字符的简单实例
2013/11/22 Javascript
js类式继承的具体实现方法
2013/12/31 Javascript
使用AmplifyJS组件配合JavaScript进行编程的指南
2015/07/28 Javascript
Angularjs中的事件广播 —全面解析$broadcast,$emit,$on
2016/05/17 Javascript
基于JavaScript实现弹幕特效
2020/08/27 Javascript
Angular实现图片裁剪工具ngImgCrop实践
2017/08/17 Javascript
javascript基础进阶_深入剖析执行环境及作用域链
2017/09/05 Javascript
vue解决跨域路由冲突问题思路解析
2017/11/03 Javascript
使用 vue.js 构建大型单页应用
2018/02/10 Javascript
Vue微信项目按需授权登录策略实践思路详解
2018/05/07 Javascript
jQuery 点击获取验证码按钮及倒计时功能
2018/09/20 jQuery
js实现for循环跳过undefined值示例
2019/07/02 Javascript
javascript刷新父页面方法汇总详解
2019/10/10 Javascript
vue+ts下对axios的封装实现
2020/02/18 Javascript
Python使用matplotlib绘制动画的方法
2015/05/20 Python
pandas 实现字典转换成DataFrame的方法
2018/07/04 Python
python判断完全平方数的方法
2018/11/13 Python
python3 实现口罩抽签的功能
2020/03/11 Python
Python实现Keras搭建神经网络训练分类模型教程
2020/06/12 Python
全球最大化妆品零售网站:SkinStore
2020/10/24 全球购物
个人简历中的自我评价范例
2013/10/29 职场文书
医务工作者先进事迹材料
2014/01/26 职场文书
宿舍标语大全
2014/06/19 职场文书
学校关爱留守儿童活动方案
2014/08/27 职场文书
2014县政府领导班子三严三实对照检查材料思想汇报
2014/09/26 职场文书
党员读书活动心得体会
2016/01/14 职场文书
Mac环境Nginx配置和访问本地静态资源的实现
2021/03/31 Servers
Python实现byte转integer
2021/06/03 Python