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 相关文章推荐
php下用GD生成生成缩略图的两个选择和区别
Apr 17 PHP
10条PHP编程习惯助你找工作
Sep 29 PHP
php $_SERVER当前完整url的写法
Nov 12 PHP
基于PHP静态类的原罪详解
May 06 PHP
PHP set_error_handler()函数使用详解(示例)
Nov 12 PHP
Php中使用Select 查询语句的实例
Feb 19 PHP
ThinkPHP的截取字符串函数无法显示省略号的解决方法
Jun 25 PHP
php+ajax实现无刷新分页的方法
Nov 04 PHP
在html文件中也可以执行php语句的方法
Apr 09 PHP
php使用Jpgraph创建3D饼形图效果示例
Feb 15 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
Feb 07 PHP
PHP面向对象五大原则之单一职责原则(SRP)详解
Apr 04 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
风吟的小型JavaScirpt库 (FY.JS).
2010/03/09 Javascript
不同浏览器的怪癖小结
2010/07/11 Javascript
JavaScript Title、alt提示(Tips)实现源码解读
2010/12/12 Javascript
javascript 学习笔记(八)javascript对象
2011/04/12 Javascript
Js数组的操作push,pop,shift,unshift等方法详细介绍
2012/12/28 Javascript
JavaScript替换当前页面的方法
2015/04/03 Javascript
jQuery使用animate创建动画用法实例
2015/08/07 Javascript
js检测用户输入密码强度
2015/10/22 Javascript
uploadify多文件上传参数设置技巧
2015/11/16 Javascript
BootStrap智能表单实战系列(八)表单配置json详解
2016/06/13 Javascript
巧方法 JavaScript获取超链接的绝对URL地址
2016/06/14 Javascript
轻松掌握JavaScript单例模式
2016/08/25 Javascript
js原生实现FastClick事件的实例
2016/11/20 Javascript
详解JavaScript的闭包、IIFE、apply、函数与对象
2016/12/21 Javascript
Node.js静态服务器的实现方法
2018/02/28 Javascript
简单介绍react redux的中间件的使用
2018/04/06 Javascript
微信小程序缓存支持二次开发封装实现解析
2019/12/16 Javascript
vue组件中传值EventBus的使用及注意事项说明
2020/11/16 Javascript
微信小程序实现点击导航标签滚动定位到对应位置
2020/11/19 Javascript
[50:02]完美世界DOTA2联赛PWL S2 Magma vs FTD 第三场 11.29
2020/12/03 DOTA
在Python的Django框架中使用通用视图的方法
2015/07/21 Python
对python使用telnet实现弱密码登录的方法详解
2019/01/26 Python
.dcm格式文件软件读取及python处理详解
2020/01/16 Python
详解Python修复遥感影像条带的两种方式
2020/02/23 Python
浅谈keras中的batch_dot,dot方法和TensorFlow的matmul
2020/06/18 Python
详解用selenium来下载小姐姐图片并保存
2021/01/26 Python
美国在线家装零售商:Build.com
2016/09/02 全球购物
马德里运动鞋商店:Nigra Mercato
2020/02/16 全球购物
财务会计专业推荐信
2013/11/30 职场文书
战友聚会邀请函
2014/01/18 职场文书
小学教师师德反思
2014/02/03 职场文书
党的群众路线教育实践活动公开承诺书
2014/03/28 职场文书
请假条标准格式规范
2014/04/10 职场文书
运动会口号8字
2014/06/07 职场文书
2014群众路线学习笔记
2014/11/06 职场文书
2015年幼儿教师个人工作总结
2015/05/20 职场文书