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 根据IP地址控制访问的代码
Apr 22 PHP
IIS7.X配置PHP运行环境小结
Jun 09 PHP
PHP实现采集中国天气网未来7天天气
Oct 15 PHP
Laravel 5框架学习之向视图传送数据
Apr 08 PHP
php使用GD创建保持宽高比缩略图的方法
Apr 17 PHP
在PHP程序中使用Rust扩展的方法
Jul 03 PHP
PHP模拟post提交数据方法汇总
Feb 16 PHP
php注册和登录界面的实现案例(推荐)
Oct 24 PHP
php微信开发之谷歌测距
Jun 14 PHP
PHP与Perl之间知识点区别整理
Mar 19 PHP
PHP利用递归函数实现无限级分类的方法
Mar 22 PHP
Laravel5框架自定义错误页面配置操作示例
Apr 17 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静态类的原罪详解
2013/05/06 PHP
利用PHP绘图函数实现简单验证码功能的方法
2016/10/18 PHP
yii框架无限极分类的实现方法
2017/04/08 PHP
动手学习无线电
2021/03/10 无线电
jquery 插件学习(二)
2012/08/06 Javascript
Javascript玩转继承(二)
2014/05/08 Javascript
jquery实现当滑动到一定位置时固定效果
2014/06/17 Javascript
javascript操作select元素实例分析
2015/03/27 Javascript
jquery带下拉菜单和焦点图代码分享
2015/08/24 Javascript
JavaScript实现横向滑出的多级菜单效果
2015/10/09 Javascript
Bootstrap3制作自己的导航栏
2016/05/12 Javascript
javascript另类方法实现htmlencode()与htmldecode()函数实例分析
2016/11/17 Javascript
Vue.js 递归组件实现树形菜单(实例分享)
2016/12/21 Javascript
JSON中key动态设置及JSON.parse和JSON.stringify()的区别
2016/12/29 Javascript
深入理解Vue transition源码分析
2017/07/30 Javascript
JS动画定时器知识总结
2018/03/23 Javascript
NodeJs搭建本地服务器之使用手机访问的实例讲解
2018/05/12 NodeJs
JS实现音乐导航特效
2020/01/06 Javascript
Python简单日志处理类分享
2015/02/14 Python
Python自动化部署工具Fabric的简单上手指南
2016/04/19 Python
python实现扫描日志关键字的示例
2018/04/28 Python
Python中Numpy包的安装与使用方法简明教程
2018/07/03 Python
python+numpy实现的基本矩阵操作示例
2019/07/19 Python
python绕过图片滑动验证码实现爬取PTA所有题目功能 附源码
2021/01/06 Python
html5移动端价格输入键盘的实现
2019/09/16 HTML / CSS
Theory美国官网:后现代都市风时装品牌
2018/05/09 全球购物
如果NULL和0作为空指针常数是等价的,那我到底该用哪一个
2014/09/16 面试题
学生的自我鉴定范文
2013/10/24 职场文书
旅游管理专业生自荐信范文
2014/01/02 职场文书
大学生村官任职感言
2014/01/09 职场文书
会计专业大学生职业生涯规划书
2014/02/11 职场文书
保险公司增员口号
2015/12/25 职场文书
干货:我将这样书写我的演讲稿!
2019/05/09 职场文书
MySQL REVOKE实现删除用户权限
2021/06/18 MySQL
探讨Java中的深浅拷贝问题
2021/06/26 Java/Android
Python torch.flatten()函数案例详解
2021/08/30 Python