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实现多服务器session共享之NFS共享的方法
Mar 16 PHP
php 缩略图实现函数代码
Jun 23 PHP
PHP超级全局变量数组小结
Oct 04 PHP
php获取本地图片文件并生成xml文件输出具体思路
Apr 27 PHP
解析file_get_contents模仿浏览器头(user_agent)获取数据
Jun 27 PHP
ThinkPHP查询返回简单字段数组的方法
Aug 25 PHP
php使用MySQL保存session会话的方法
Jun 18 PHP
再推荐十款免费的php开发工具
Nov 09 PHP
Yii2 ActiveRecord多表关联及多表关联搜索的实现
Jun 30 PHP
详解在YII2框架中使用UEditor编辑器发布文章
Nov 02 PHP
php5.6.x到php7.0.x特性小结
Aug 17 PHP
Laravel开启跨域请求的方法
Oct 13 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生成制作验证码代码详解(推荐)
2016/06/12 PHP
php+redis实现消息队列功能示例
2019/09/19 PHP
laravel框架select2多选插件初始化默认选中项操作示例
2020/02/18 PHP
Cookie跨域问题解决方案代码示例
2020/11/24 PHP
javascript 日期时间函数(经典+完善+实用)
2009/05/27 Javascript
编写Js代码要注意的几条规则
2010/09/10 Javascript
ExtJS如何设置与获取radio控件的选取状态
2014/01/22 Javascript
快速掌握Node.js模块封装及使用
2016/03/21 Javascript
关于动态执行代码(js的Eval)实例详解
2016/08/15 Javascript
jquery.Jcrop结合JAVA后台实现图片裁剪上传实例
2016/11/05 Javascript
JavaScript仿聊天室聊天记录
2016/12/27 Javascript
5 种JavaScript编码规范
2018/01/30 Javascript
Angular中使用better-scroll插件的方法
2018/03/27 Javascript
angular 数据绑定之[]和{{}}的区别
2018/09/25 Javascript
一篇文章带你从零快速上手Rollup
2020/09/07 Javascript
Nuxt 嵌套路由nuxt-child组件用法(父子页面组件的传值)
2020/11/05 Javascript
Python写的PHPMyAdmin暴力破解工具代码
2014/08/06 Python
对于Python的Django框架部署的一些建议
2015/04/09 Python
Python的Flask框架与数据库连接的教程
2015/04/20 Python
Python实现自定义函数的5种常见形式分析
2018/06/16 Python
Django实现跨域请求过程详解
2019/07/25 Python
基于python及pytorch中乘法的使用详解
2019/12/27 Python
基于python求两个列表的并集.交集.差集
2020/02/10 Python
对python中各个response的使用说明
2020/03/28 Python
PyTorch 导数应用的使用教程
2020/08/31 Python
美国一家运动专业鞋类零售商:Warehouse Shoe Sale(WSS)
2018/03/28 全球购物
Nike俄罗斯官方网站:Nike RU
2021/03/05 全球购物
租房协议书范本
2014/04/09 职场文书
放飞梦想演讲稿600字
2014/08/26 职场文书
纪念九一八事变演讲稿:勿忘国耻
2014/09/14 职场文书
2015年护士医德医风自我评价
2015/03/03 职场文书
2015年车间安全管理工作总结
2015/05/13 职场文书
2015年扫黄打非工作总结
2015/05/13 职场文书
专项资金申请报告
2015/05/15 职场文书
付款证明格式范文
2015/06/19 职场文书
Redis特殊数据类型Geospatial地理空间
2022/06/01 Redis