当前位置: 首页 > article >正文

解决DotProject 甘特图中文乱码

DotProject的图形模块使用了jpgraph。 JpGraph是PHP专门进行绘制图表的类库。它使得作图变成了一件非常简单的事情,你只需从数据库中取出相关数据,定义标题,图表类型,然后的事情就 交给JpGraph,只需掌握为数不多的JpGraph内置函数(可以参照JpGraph附带例子学习),就可以画出非常炫目的图表!
JpGraph 要求PHP版本为4.04以上,并且支持GD库且GD库的版本应为2.0,而不是1.0。JpGraph有PHP4和PHP5两种版本(由于我的环境是 PHP5,所以下载了最新PHP5版本,在附件中修改过的DotProject包含这个版本,请使用PHP4更换相应的版本)。
Gantt图的乱码问题的在于jpgraph中没有对中文及其他语言文字处理好。
1)修改jpgraph配置文件
新建字体文件夹和修改lib/jpgraph/src/jpg-config.inc.php文件,在lib/jpgraph路径新建fonts文件夹,把所要的字库复制到该文件夹下。
在文件lib/jpgraph/src/jpg-config.inc.php中加入如下语句(或把相应的注释去掉后修改) 

DEFINE ( ' TTF_DIR ' , ' ./lib/jpgraph/fonts/ ' );  // 设置jpgraphTTF(字体)文件夹
DEFINE ( ' SIMSUN_TTF_FONT ' , ' simsun.ttc ' ); // 使用'simsun.ttc'(windows下的宋体)
DEFINE ( ' CHINESE_TTF_FONT ' , ' simsun.ttc ' );

 2)修改文件module/tasks/gantt.php和module/projects/gantt.php
新版在绘制Gantt 图时报错:You are trying to use the locale (%s) which your PHP installation does not support. Hint: Use ‘ ’ to indicate the default locale for this geographic region.
这是由于jpgraph没有加入选定的日期格式如'chs',可修改SetDateLocale处如下:

$jpLocale   =  dPgetConfig(  ' jpLocale '  );
if  ( $jpLocale ) {
 
$graph -> scale -> SetDateLocale(  $jpLocale  );
}
else  {
    
$graph -> scale -> SetDateLocale(  $AppUI -> user_lang[ 0 ] ); // 第一个估计会有或注释掉和设为 ‘ ’

}

Gantt图绘制分两部分,一部分是由DotProject生成的项目管理的标题等,一部分是用户业务产生的内容区部分如项目和任务名称。对于第一部分绘制字体编码保持和DotProject一致。
在语言包文件夹下locales.php文件中加入如下定义(本例是简体中文)
$LOCALE_FONT=30;
30是在jpgraph中定义的语言字体标识(如中文为DEFINE("FF_SIMSUN",30);),详见jpgraph.php文件。 这样在绘制标题部分取FF_SIMSUN索引的字体。
在文件module/tasks/gantt.php和module/projects/gantt.php中定义当前标题要使用的字体,加入如下语句:

if  ( ! empty ( $LOCALE_FONT )){
    
define ( " CRURRENT_FONT " , $LOCALE_FONT );
}
else  {
    
define ( " CRURRENT_FONT " , FF_ARIAL);
}

这样在设定字体的地方设定CRURRENT_FONT就可以了。把
//$graph->scale->actinfo->SetFont(FF_ARIAL);改为
$graph->scale->actinfo->SetFont(CRURRENT_FONT, FS_NORMAL, 10);//标题信息
找到
if (is_file( TTF_DIR."arialbd.ttf" ))
 $graph->scale->tableTitle->SetFont(FF_ARIAL,FS_BOLD,12); 改为
$graph->scale->tableTitle->SetFont(CRURRENT_FONT, FS_NORMAL, 11);//标题头
在最后
$vline = new GanttVLine($today, $AppUI->_('Today', UI_OUTPUT_RAW));语句后插入如下语句:
$vline->title->SetFont(CRURRENT_FONT, FS_NORMAL, 10);//显示today(今天)
这样绘制标题部分就修改完毕。
第 二部分内容区则要根据要绘制的文字编码动态设定字体。因此在module/tasks/gantt.php和module/projects /gantt.php文件中加入判断字符在什么语言区返回相应的字体(根据utf-8)本例只实现中文区,可以有不对地方,望大家指正。

// utf-8 region segment 一-鿿
function  GetutfTTF( $str

  
if  ( preg_match ( " /^([ " . chr ( 228 ) . " - " . chr ( 233 ) . " ]{1}[ " . chr ( 128 ) . " - " . chr ( 191 ) . " ]{1}[ " . chr ( 128 ) . " - " . chr ( 191 ) . " ]{1}){1}/ " , $word ==   true   ||   preg_match ( " /([ " . chr ( 228 ) . " - " . chr ( 233 ) . " ]{1}[ " . chr ( 128 ) . " - " . chr ( 191 ) . " ]{1}[ " . chr ( 128 ) . " - " . chr ( 191 ) . " ]{1}){1}$/ " , $word ==   true   ||   preg_match ( " /([ " . chr ( 228 ) . " - " . chr ( 233 ) . " ]{1}[ " . chr ( 128 ) . " - " . chr ( 191 ) . " ]{1}[ " . chr ( 128 ) . " - " . chr ( 191 ) . " ]{1}){2,}/ " , $str ==   true )
  {
     
return  (FF_CHINESE);  // 返回中文字体标识FF_CHINESE
  }
     
return  (FF_ARIAL);  // 返回默认字体标识FF_ARIAL
}

然后在画gantt图相应的项目和任务要显示的名称判断是否在中文,设置对应的字体,如:
$bar->title->SetFont(GetutfTTF($name), FS_NORMAL, 10);
$bar2->title->SetFont(GetutfTTF($t["task_name"]), FS_NORMAL, 10);

所有$bar绘制都属于内容区,都把相应部分用如上方法设定字体。绘制Gantt图部分就修改完毕,看看效果:
英文:
 


中文: 


http://www.lryc.cn/news/2419130.html

相关文章:

  • VB.NET 教程_01_基础语法
  • 进程通信之飞鸽传书2007绿色版
  • jpa: persistence.xml 配置文件案例
  • 产品运行所需的信息检索失败.请重新安装Xshell.
  • 软件架构的性能测试与优化:确保高性能的关键步骤
  • 机器人学重点知识点总结
  • 深度学习框架-Backbone汇总
  • 转: sdp文件详细总结
  • fill_parent和wrap_content值的含义
  • DragonFly BSD 4.2发布
  • DIV+CSS布局(进阶篇)
  • 手撸设计模式之-委派模式
  • AI大模型基础入门(非常详细)零基础入门到精通,收藏这一篇就够了
  • c# ToolStrip控件图片和文字显示
  • 湘西新建110KV变电工程初步设计
  • 嵌入式Linux学习记录之Uboot
  • 低通和带通信号的简单理解及 Matlab 实现
  • 无线网络的加密方式:WEP、WPA和WPA2
  • 交换机的基本设置
  • 早期星际十大人物(学生时代,星际时代)
  • JavaScript window 、Document 、Location、History、Navigator,页面刷新方式汇总
  • java打包zip并下载_Java批量下载文件并zip打包
  • 常量和常量表达式
  • 替代联阳IT6564方案|CapstoneCS5262替代IT6564设计DP转HDMI+VGA扩展坞方案|Capstone CS5262设计参考
  • 网站打开速度慢的原因,排查方法及优化方法(大全)
  • 浪潮集团数据中台建设方案(WORD)
  • 简单易懂DFS(一) dfs + 回溯
  • 使用ensp模拟器中的路由器配置vrrp详解
  • 海思3518E开发笔记1.2——海思SDK脚本学习
  • Hibernate笔记