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中操作MySQL数据库的一些要注意的问题
Oct 09 PHP
PHP 解决utf-8和gb2312编码转换问题
Mar 18 PHP
php中取得URL的根域名的代码
Mar 23 PHP
CI框架源码阅读,系统常量文件constants.php的配置
Feb 28 PHP
php switch语句多个值匹配同一代码块的实现
Mar 03 PHP
PHP函数分享之curl方式取得数据、模拟登陆、POST数据
Jun 04 PHP
PHP错误Cannot use object of type stdClass as array in错误的解决办法
Jun 12 PHP
php flush无效,IIS7下php实时输出的方法
Aug 25 PHP
php获取服务器操作系统相关信息的方法
Oct 08 PHP
thinkPHP内置字符串截取函数用法详解
Nov 15 PHP
PHP简单计算两个时间差的方法示例
Jun 20 PHP
PHP实现的回溯算法示例
Aug 15 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操作MongoDB的技术总结
2013/06/02 PHP
ThinkPHP的截取字符串函数无法显示省略号的解决方法
2014/06/25 PHP
PHP连接MSSQL时nvarchar字段长度被截断为255的解决方法
2014/12/25 PHP
php短址转换实现方法
2015/02/25 PHP
PHP生成zip压缩包的常用方法示例
2019/08/22 PHP
php5与php7的区别点总结
2019/10/11 PHP
JQuery 确定css方框模型(盒模型Box Model)
2010/01/22 Javascript
Jquery中&quot;$(document).ready(function(){ })&quot;函数的使用详解
2013/12/30 Javascript
JS中使用sort结合localeCompare实现中文排序实例
2014/07/23 Javascript
Express的路由详解
2015/12/10 Javascript
JS获取年月日时分秒的方法分析
2016/11/28 Javascript
vuejs2.0实现分页组件使用$emit进行事件监听数据传递的方法
2017/02/22 Javascript
vue中使用input[type=&quot;file&quot;]实现文件上传功能
2018/09/10 Javascript
使用 electron 实现类似新版 QQ 的登录界面效果(阴影、背景动画、窗体3D翻转)
2018/10/23 Javascript
详解ES6中的 Set Map 数据结构学习总结
2018/11/06 Javascript
JS隐藏号码中间4位代码实例
2019/04/09 Javascript
Vue列表循环从指定下标开始的多种解决方案
2020/04/08 Javascript
JS图片预加载三种实现方法解析
2020/05/08 Javascript
JS实现鼠标按下拖拽效果
2020/07/23 Javascript
[57:22]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第五场
2018/04/10 DOTA
Python sys.path详细介绍
2013/10/17 Python
python实现排序算法
2014/02/14 Python
Python编写百度贴吧的简单爬虫
2015/04/02 Python
实例讲解CSS3中Transform的perspective属性的用法
2016/04/22 HTML / CSS
HTML5注册表单的自动聚焦与占位文本示例代码
2013/07/19 HTML / CSS
英国标志性奢侈品牌:Burberry
2016/07/28 全球购物
Vince官网:全球著名设计师品牌,休闲而优雅的服饰
2017/01/15 全球购物
智能电子应届生求职信
2013/11/10 职场文书
寄语十八大感言
2014/02/07 职场文书
药剂专业求职信
2014/06/20 职场文书
甜品店创业计划书
2014/09/21 职场文书
2014年超市工作总结
2014/11/19 职场文书
教师理论学习心得体会
2016/01/21 职场文书
企业管理不到位检讨书
2019/06/27 职场文书
总结Java对象被序列化的两种方法
2021/06/30 Java/Android
Unicode中的CJK(中日韩统一表意文字)字符小结
2021/12/06 HTML / CSS