在ThinkPHP 里已经实现了多语言功能,只要在指定的目录下创建对应的语言文件并填充内容,即可实现多语言功能

而多语言的翻译却是一个很麻烦的事情,因为客户特定的行业问题导致我们翻译可能是不准确的

于是就写了一个导入导出多语言功能,让客户根据规则自行翻译多语言内容(撇清责任)

ThinkPHP 具体的语言包文件命名和位置如下:

语言包 语言文件位置
应用语言包 应用公共目录/Lang/语言文件.php
模块语言包 模块目录/Lang/语言文件.php
控制器语言包 模块目录/Lang/语言目录/控制器名(小写).php
<?php
/*** @Author:      HTL* @Email:       Huangyuan413026@163.com* @DateTime:    2016-07-13 17:06:00* @Description: 多语言导出与导入*/
namespace Admin\Controller;
use Common\Controller\AdminbaseController;
class LangController extends AdminbaseController
{/*** 首页* @Author   HTL* @Email    huangyuan413026@163.com* @DateTime 2016-07-13T17:11:40+0800* @return   [type]                   [description]*/function index(){switch (I("get.type")) {case 'export_lang':$this->_export_lang();break;case 'import_lang':$this->_import_lang();break;default:$this->display();break;}}/*** 从Excel中导入多语言并生成PHP代码* @Author   HTL* @Email    huangyuan413026@163.com* @DateTime 2016-07-12T17:08:42+0800* @return   [type]                   [description]*/function _import_lang(){//是否上传文件if (count($_FILES['file']) <= 0) {$this->error("not select file");exit;}//多语言路径,注意路径大小写,Linux是区分大小写的$lang_path = SPAPP . "Admin/Lang/";$apps = sp_scan_dir($lang_path . "/*", GLOB_ONLYDIR);//多语言数[提供几种语言]$app_count = count($apps);if ($app_count <= 0) {$this->error(L("_SELECT_NOT_EXIST_"));exit;}//将上传的多语言文件上传到此,需要有写入权限$new_file = './data/upload/' . iconv('UTF-8', 'GB2312', $_FILES['file']['name']);//上传到指定路径move_uploaded_file($_FILES['file']['tmp_name'], $new_file);vendor("PHPExcel.PHPExcel");//导入PHPExcel类$objPHPExcel;try {$objReader = \PHPExcel_IOFactory::createReader('Excel2007');$objPHPExcel = $objReader->load($new_file);} catch (Exception $e) {$this->error($e->getMessage());die;}//遍历工作表foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) {$excels = array();$highestRow = $worksheet->getHighestRow();foreach ($worksheet->getRowIterator() as $row_index => $row) {//得到所有列$cellIterator = $row->getCellIterator();//单元格索引$index = 0;//遍历列foreach ($cellIterator as $cell_index => $cell) {//多语言的名称[en-us、zh-cn 、more.......]//根据多语言生成不同的数组[每个语言为一个数组]if ($row_index == 1) {break;//导出的文档语言是否本地的语言一致// $lang_name = $cell->getCalculatedValue();// foreach ($apps as $key => $value) {//  $excels[$value] = array();// }
                    }//创建多语言数据[0=多语言的字段]//某个语言的字段,用于设置N个多语言的值if ($index == 0) {$lang_name = $cell->getCalculatedValue();} else {$cell_val = $cell->getCalculatedValue();//设置某个语言的字段值if (strlen($cell_val) > 0) {$excels[$apps[$index - 1]][$lang_name] = $cell_val;}}$index++;}}//输出php代码到文件//$name:语言名称//$excl:语言内容foreach ($excels as $name => $excel) {$excel = var_export($excel, true);//var_export 生成的数组有一个空值,需要去掉,否则将出现错误$excel = preg_replace("/\\,\\s\\)/i", ")", $excel);//输出php语言格式$excel = "<?php return " . $excel . "?>";if ($worksheet->getTitle() == "ALL_Language.php") {file_put_contents($lang_path . '/' . $name . ".php", $excel);} else {file_put_contents($lang_path . '/' . $name . '/' . $worksheet->getTitle(), $excel);}}}unset($excels);unset($objPHPExcel);$this->success(L("_OPERATION_SUCCESS_"));}/*** 替代scan_dir的方法* @param string $pattern 检索模式 搜索模式 *.txt,*.doc; (同glog方法)* @param int $flags*/function sp_scan_dir($pattern, $flags = null){$files = array_map('basename', glob($pattern, $flags));return $files;}/*** 导出自定义多语言到excel* @Author   HTL* @Email    huangyuan413026@163.com* @DateTime 2016-07-12T16:23:36+0800* @return   [type]                   [description]*/function _export_lang(){//多语言文件所在路径,注意大小写$lang_path = SPAPP . "Admin/Lang/";$apps = sp_scan_dir($lang_path . "/*", GLOB_ONLYDIR);//多语言数[提供几种语言]$app_count = count($apps);if ($app_count <= 0) {$this->error(L("_SELECT_NOT_EXIST_"));exit;}vendor("PHPExcel.PHPExcel");//导入PHPExcel类$objPHPExcel = new \PHPExcel();$app = $lang_path . $apps[0];if (!is_dir($app)) {$this->error(L("_SELECT_NOT_EXIST_"));exit;}$objPHPExcel->removeSheetByIndex(0);//路径下的语言文件[/lang/en-us.php & /Lang/zh-cn.php & more]$merge_files = array();foreach ($apps as $key => $value) {$lang_file = $lang_path . $value . '.php';if (is_file($lang_file)) {//数组的key为多语言名称$merge_files[$value] = (include $lang_file);}//end if
        }//end foreach// print_r($merge_files);exit;// ALL_Language.php 为全局语言文件$this->_set_sheet_value(0, $objPHPExcel, $merge_files, 'ALL_Language.php');//多语言目录下的语言文件[/Lang/zh-cn/*.php]$files = sp_scan_dir($app . "/*.php");foreach ($files as $index => $key) {//合并多语言到一个数组$merge_files = array();//导入多语言并添加到数组中foreach ($apps as $_app) {$lang_file = $lang_path . $_app . '/' . $key;// echo($_app).'<BR>';// array_push($merge_files, $_app);if (is_file($lang_file)) {//数组的key为多语言名称$merge_files[$_app] = (include $lang_file);// array_push($merge_files, include ($lang_file));
                }//end if
            }//end foreach$this->_set_sheet_value($index + 1, $objPHPExcel, $merge_files, $key);}//end forach$objPHPExcel->setActiveSheetIndex(0);// $objPHPExcel->removeSheetByIndex(0);header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');header('Content-Disposition: attachment;filename="' . date('ymdHis') . '-Languages.xlsx"');header('Cache-Control: max-age=0');// If you're serving to IE 9, then the following may be neededheader('Cache-Control: max-age=1');// If you're serving to IE over SSL, then the following may be neededheader('Expires: Mon, 26 Jul 1997 05:00:00 GMT');// Date in the pastheader('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');// always modifiedheader('Cache-Control: cache, must-revalidate');// HTTP/1.1header('Pragma: public');// HTTP/1.0$objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');$objWriter->save('php://output');}/*** 设置sheet和单元格值* @Author   HTL* @Email    huangyuan413026@163.com* @DateTime 2016-07-12T17:06:05+0800* @param    [type]                   $sheet_index [sheet的索引]* @param    [type]                   $objPHPExcel [phpexcel对象]* @param    [type]                   $merge_files [多语言数据]* @param    [type]                   $title       [sheet title]*/function _set_sheet_value($sheet_index = 0, $objPHPExcel, $merge_files, $title){if (!$objPHPExcel || !$objPHPExcel || count($objPHPExcel) <= 0) {return;}//创建sheet并设置title,每一个多语言文件都是一个sheet$excel = $objPHPExcel->createSheet($sheet_index)->setTitle($title);// $excel->setCellValue('A1',"Name")->setCellValue('B1',"")->setCellValue("C1","");//多语言定义的字段数量$field_count = array_keys($merge_files);//计算第一个多语言的key数量[数组的key是多语言名称: array=('zh-cn'=>array("name"=>"name","age"=>"age"),"en-us"=>array())]$field_count = array_keys($merge_files[$field_count[0]]);//行索引[excel从1开始]$row_index = 1;//设置多语言foreach ($merge_files as $_key => $_value) {//每个shet的第一行第一列为Name[字段的名称]if ($row_index == 1) {$excel->setCellValue("A{$row_index}", "Name");}//第一行的其他列为多语言名称[zh-cn、en-us、.....]$excel->setCellValue(\PHPExcel_Cell::stringFromColumnIndex($row_index) . '1', $_key);//每个多语言都是单独一列foreach ($field_count as $key => $values) {//第一列为多语言字段名[从1开始,第1行为Name或多语言名称,因此这里从2开始]$excel->setCellValue('A' . ($key + 2), $field_count[$key]);//列索引$column_index = \PHPExcel_Cell::stringFromColumnIndex($row_index);$excel->setCellValue($column_index . '' . ($key + 2), $_value[$values]);}//end foreach$row_index++;}//end foreach
    }
}

导出的多语言文件,每一个文件就是一个sheet,不同的多语言会合同到同一个sheet里
因为根目录下有两个多语言文件zh-cn.php,en-us.php在非子目录下,所以将这两个文件放在一个单独的sheet(ALL_Language)里单独处理
因为code里的多语言路径是固定的,所以只会处理:f:\WWW\application\Admin\Lang\*.php文件
导入的php格式如下
参考:
PHP动态参数
PHP 函数参数:call_user_func_array
PHPExcel - creating multiple sheets by iteration
Thinkphp开发手册:多语言支持
From WizNote

ThinkPhp 使用PhpExcel导出导入多语言文件相关推荐

  1. 如何使用 MySQL 的 IDE 导出导入数据表文件(以 Navicat for MySQL 导出导入 Excel 文件为例)

    系列文章目录 关于更多 MySQL 数据库以及数据库 IDE 的问题大家可以移步本人专栏--MySQL 数据库. 文章目录 系列文章目录 前言 一.使用 Navicat 导出数据表 1.1.使用&qu ...

  2. php 利用 PHPExcel 导出 导入 Excel 方法介绍(功能介绍)

    第一步 phpexcel官网上http://phpexcel.codeplex.com 下载最新的phpexcel类,下载解压缩后有一个classes文件夹,里面包含了PHPExcel.php和PHP ...

  3. php连接excel表格数据类型,TP5 中使用PHPExcel 导出导入数据到excel表格

    将下载好的PHPExcel文件夹放置在框架中的Vendor目录下,注意目录的结构,按照我的代码来基本上直接引用就能使用,如下图: 导出数据代码如下 //导出数据表 开始 public function ...

  4. mysql 数据库导出导入到本地文件

    借鉴:https://www.cnblogs.com/Jasper-changing/p/13924977.html 一.导出备份 1.mysqldump命令 mysqldump 是 MySQL 自带 ...

  5. PHPExcel导出导入问题”continue” targeting switch is equivalent to “break”.Did you mean to use “continue 2”?

    在 php 7.3 的 switch 中使用 continue 会出现警告 1 2 3 最好的方式是把 \PHPExcel\Shared\OLE.php 文件中的 continue; 改为 conti ...

  6. php导出数据库为excel文件,phpexcel导出数据库成excel文件

    error_reporting(E_ALL); date_default_timezone_set('Europe/London'); /** PHPExcel */ require_once '.. ...

  7. php导入excel源码,利用PHPExcel类库,实现PHP导出导入Excel表格Excel文件!

    [温馨提示]源码包解压密码:www.youhutong.com 利用PHPExcel类库,实现PHP导出导入Excel文件!(案例教程源码) 需要注意的地方就是: 1.导出文件时,如果你的字段过多,可 ...

  8. thinkphp phpexcel导出

    近期做一个项目涉及到商品信息的批量导出与导入,遂记录了下来,框架是tp框架3.2.3(tp5.0性质是一样的,无非是加载方法与所放目录不一样罢了),运用的是phpexcel,闲话不多说,上代码 1.首 ...

  9. 使用PHP导入Excel和导出数据为Excel文件

    有时需要将Excel表格的数据导入到mysql数据库中,我们使用PHP的一个开源项目PHP-ExcelReader可以轻松实现Excel的导入.另外将mysql数据导出为Excel与本站上篇文章中导出 ...

最新文章

  1. 转: IO设计模式:Reactor和Proactor对比
  2. (十六)java springcloud版b2b2c社交电商spring cloud分布式微服务-使用spring cloud Bus刷新配置...
  3. linux zsh命令行vim命令补齐,Linux使用zsh提高效率的5条建议
  4. Struts工作原理
  5. 教学思路SQL之预备课程学习 建库、建表、建约束、关系、部分T-sql语句
  6. [iOS]利用通知实现监听系统键盘
  7. linux rpm和deb的区别,rpm与deb的区别
  8. python chrome headless_[技巧] chrome headless 爬虫抓取websoket 数据
  9. JavaScript ECMA
  10. java word模版填充_[转载]java向word模板中填充数据(总结)
  11. export function函数传参_04 js高阶函数(惰性函数、柯里化函数、compose函数)和单例设计模式...
  12. 在使用SVN,下载文件到本地时,一定要把全目录下载下来!
  13. 素数筛法详解-列出1-n中的素数
  14. DNS解析出错导致网站在部分地区无法打开
  15. VS2019打包exe文件
  16. Linux:Lilo 设定档 /etc/lilo.conf
  17. 使用ethers.js执行读函数与写函数
  18. POSIX标准总体分析 执行调度 消息传递 调度参数 进程调度函数 关闭消息队列 得到消息队列参数 设置调度参数 时钟和定时器  时钟和定时器函数 消息传递函数 打开消息队列 设置消息队列参数
  19. Linux文件导入gitee仓库中
  20. C#实现在企业微信内发送消息给指定人员帮助类

热门文章

  1. 瓜子二手车保障消费新举措 首家12315维权服务站于呼市成立
  2. python做个图片分割界面_python图形化界面设计(wxpython)二分割窗口
  3. Python中强大的f-string用法介绍
  4. sublime 搭建html,教你快速使用sublime Text3编写HTML
  5. 赠书福利丨你意想不到的个人隐私数据泄露
  6. 遇见大数据可视化:基础研究
  7. 企业级VUE前端项目执行流程总结
  8. Vikings V2用户手册
  9. PSoC Creater 安装教程
  10. python作业习题