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 相关文章推荐
一个程序下载的管理程序(三)
Oct 09 PHP
zend api扩展的php对象的autoload工具
Apr 18 PHP
ThinkPHP 防止表单重复提交的方法
Aug 08 PHP
php array_filter除去数组中的空字符元素
Jun 21 PHP
php实现图片转换成ASCII码的方法
Apr 03 PHP
深入理解PHP内核(一)
Nov 10 PHP
PHP版本升级到7.x后wordpress的一些修改及wordpress技巧
Dec 25 PHP
PHP微信支付开发实例
Jun 22 PHP
PHP简单获取随机数的常用方法小结
Jun 07 PHP
浅谈PHP中的面向对象OOP中的魔术方法
Jun 12 PHP
ThinkPHP5.0框架结合Swoole开发实现WebSocket在线聊天案例详解
Apr 02 PHP
Yii使用DbTarget实现日志功能的示例代码
Jul 21 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函数preg_match_all正则表达式的基本使用详细解析
2013/08/31 PHP
php检测url是否存在的方法
2015/04/14 PHP
yii实现使用CUploadedFile上传文件的方法
2015/12/28 PHP
php面向对象的用户登录身份验证
2017/06/08 PHP
Avengerls vs KG BO3 第二场2.18
2021/03/10 DOTA
msn上的tab功能Firefox对childNodes处理的一个BUG
2008/01/21 Javascript
浅谈jquery回调函数callback的使用
2015/01/30 Javascript
Javascript对象Clone实例分析
2015/06/09 Javascript
jQuery中cookie插件用法实例分析
2015/12/04 Javascript
jquery特效 点击展示与隐藏全文
2015/12/09 Javascript
三种Node.js写文件的方式
2016/03/08 Javascript
AngularJS基础 ng-mouseover 指令简单示例
2016/08/02 Javascript
Js 获取、判断浏览器版本信息的简单方法
2016/08/08 Javascript
Java  Spring 事务回滚详解
2016/10/17 Javascript
简单理解Vue条件渲染
2016/12/03 Javascript
JS实现鼠标移上去显示图片或微信二维码
2016/12/14 Javascript
js实现音频控制进度条功能
2017/04/01 Javascript
使用Math.max,Math.min获取数组中的最值实例
2017/04/25 Javascript
jQuery实现的上传图片本地预览效果简单示例
2018/03/29 jQuery
详解Vue CLI3 多页应用实践和源码设计
2018/08/30 Javascript
富文本编辑器vue2-editor实现全屏功能
2019/05/26 Javascript
使用vue cli4.x搭建vue项目的过程详解
2020/05/08 Javascript
js获取url页面id,也就是最后的数字文件名
2020/09/25 Javascript
[01:04:39]OG vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
[43:58]DOTA2-DPC中国联赛定级赛 LBZS vs SAG BO3第一场 1月8日
2021/03/11 DOTA
Python利用多进程将大量数据放入有限内存的教程
2015/04/01 Python
浅谈使用Python内置函数getattr实现分发模式
2018/01/22 Python
Python supervisor强大的进程管理工具的使用
2019/04/24 Python
python tkinter实现下载进度条及抖音视频去水印原理
2021/02/07 Python
澳大利亚个性化儿童礼品网站:Bright Star Kids
2019/06/14 全球购物
西雅图的买手店:Totokaelo
2019/10/19 全球购物
机械专业应届生求职信
2013/09/21 职场文书
高中语文课后反思
2014/04/27 职场文书
2014年护士长工作总结
2014/11/11 职场文书
JavaWeb 入门篇:创建Web项目,Idea配置tomcat
2021/07/16 Java/Android
cypress测试本地web应用
2022/06/01 Javascript