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 needed
header('Cache-Control: max-age=1');
// If you're serving to IE over SSL, then the following may be needed
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
// Date in the past
header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
// always modified
header('Cache-Control: cache, must-revalidate');
// HTTP/1.1
header('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格式如下
 
 
参考:

ThinkPhp 使用PhpExcel导出导入多语言文件的更多相关文章

  1. PHPExcel导出导入

    便于记忆 这里写一个PHPexcel导出的demo 我们构造一个数据   $letter = array('A','B','D','E'); //sheet索引   $date = array( ar ...

  2. PHPExcel导出导入excel、csv等格式数据

    <?php if(!defined('BASEPATH')) exit('No direct script access allowed'); //物资发料单明细 class Read_writ ...

  3. thinkphp使用PHPExcel导出

    thinkphp3. 将PHPExcel下载包放在项目\ThinkPHP\Library\Vendor\PHPExcel thinkphp5 将PHPExcel下载包放在项目\vendor\PHPEx ...

  4. 用PHPExcel导出导入Excel

    thinkPHP5.0框架 查询数据库调用Excel方法 public function exportlist(){ $orderModel = new OrderModel(); if($start ...

  5. Thinkphp解决phpExcel导出数据量大导致内存溢出

    工作需要导出几万的数据量.操作比较频繁.之前数据在七八千是数据导出很慢.phpExcel是方便但是性能一般.现在改为使用csv导出数据:可以缓解内存压力,一次导出两三万是没问题的.当然服务器内存给力, ...

  6. CodeIgniterCodeigniter+PHPExcel导出数据到Excel文件

    解压压缩包里的Classes文件夹中的内容到application\libraries\目录下,目录结构如下:--application\libraries\PHPExcel.php--applica ...

  7. phpexcel导出数据库成excel文件

    <?php error_reporting(E_ALL); date_default_timezone_set('Europe/London'); /** PHPExcel */ require ...

  8. ThinkPHP使用PHPExcel实现Excel数据导入导出完整实例

    这篇文章主要介绍了ThinkPHP使用PHPExcel实现Excel数据导入导出,非常实用的功能,需要的朋友可以参考下 本文所述实例是使用在Thinkphp的开发框架上,要是使用在其他框架也是同样的方 ...

  9. ThinkPHP 整合 PHPExcel ,数据导出功能实现,解决Invalid cell coordinate

    PHPExcel想必大家都不陌生,是用来操作Office Excel 文档的一个PHP类库,它基于微软的OpenXML标准和PHP语言.可以使用它来读取.写入不同格式的电子表格 本次只做数据导出功能的 ...

随机推荐

  1. My Sql控制台命令

    1.连接Mysql 格式: mysql -h主机地址 -u用户名 -p用户密码 1.连接到本机上的MYSQL.首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root ...

  2. 目标检测-yolo2

    转载自:http://blog.csdn.net/qq_34784753/article/details/78825493 对于现在的最好的检测系统来说,yolo_v1 的问题主要出现在两方面,也就是 ...

  3. hdu5256 二分求LIS+思维

    解题的思路很巧,为了让每个数之间都留出对应的上升空间,使a[i]=a[i]-i,然后再求LIS 另外二分求LIS是比较快的 #include<bits/stdc++.h> #define ...

  4. JQuery中jsCharts图表插件(十)

    一:1.jsCharts图表插件 注意:从官方下来的例子都没指定页面编码,在这种情况下,浏览器就会使用默认设置中文编码:GB2312,GBK等:导致无法执行. 请在html代码中的<head&g ...

  5. 【C++ Primer 第7章】定义抽象数据类型

    参考资料 1. C++Primer #7 类 Sales_data类 Sales_data.h #include<iostream> #include<string> clas ...

  6. (第2篇)一篇文章教你轻松安装hadoop

    摘要: 这篇文章将会手把手教你安装hadoop,只要你细心按照文章中的步骤操作,hadoop肯定能正确安装,绝对不会让你崩溃 博主福利 给大家赠送一套hadoop视频课程 授课老师是百度 hadoop ...

  7. la 4394

    题解: 区间dp 令f[i][j]表示搞好i-j的最小值 首先如果不用涂色 那么可以从f[i][k] f[k+1][j]转移 如果要涂色,那么就从f[i][k][a](表示i-k全为a)+f[k+1] ...

  8. 不同git仓库版本控制

    场景: 我们有一个开源项目托管在github上面,现在打算在gitlab上进行私有托管开发,当适合发布一个版本的时候提交到github. Git合并特定commits 到另一个分支 实现如下: 1.获 ...

  9. 021 RDD的依赖关系,以及造成的stage的划分

    一:RDD的依赖关系 1.在代码中观察 val data = Array(1, 2, 3, 4, 5) val distData = sc.parallelize(data) val resultRD ...

  10. Python 手动新建 Scrapy项目

    # 创建项目 scrapy startproject 工程名 # 创建爬虫 scrapy genspider example example.com