Andrew(zhuyi) DotProject是一个基于AMP(apache+mysql+php)的开源项目管理工具,DotProject可以支持多语言并采用模块化设计以便于扩展。 <?php
$dir = basename(dirname(__FILE__)); $LANGUAGES[‘zh-cn‘] = array ( $dir, ‘Chinese (Simplified)‘, ‘简体中文‘, ‘chs‘); ?>
<?php
$dir = basename(dirname(__FILE__)); $LANGUAGES[‘zh-tw‘] = array ( $dir, ‘Chinese (Traditional)‘, ‘繁體中文‘, ‘cht‘); ?> 同时把目录下的所有对照文件转换为utf-8编码存储(可用ultraEdit等文本编辑器转换或登录后用DotProject翻译管理进行更改),初步汉化完成。 $locale_weeks = array(‘星期日‘, ‘星期一‘, ‘星期二‘, ‘星期三‘, ‘星期四‘, ‘星期五‘, ‘星期六‘);
$locale_short_week = array(‘日‘, ‘一‘, ‘二‘, ‘三‘, ‘四‘, ‘五‘, ‘六‘); $locale_months = array(null, ‘一月‘, ‘二月‘, ‘三月‘, ‘四月‘, ‘五月‘, ‘六月‘, ‘七月‘, ‘八月‘, ‘九月‘, ‘十月‘, ‘十一月‘, ‘十二月‘); $locale_short_months = array(null, ‘1月‘, ‘2月‘, ‘3月‘, ‘4月‘, ‘5月‘, ‘6月‘, ‘7月‘, ‘8月‘, ‘9月‘, ‘10月‘, ‘11月‘, ‘12月‘); 2)DotProject的日期处理基类在lib\PEAR\Date下Calc.php文件中,修改或增加其中的相关几个函数。 //***************************************************************
//得到月全名称列表 function getMonthNames() { global $locale_months; if(!empty($locale_months)){ $months = $locale_months; }else{ for($i=1;$i<13;$i++){ $months[$i] = strftime(‘%B‘, mktime(0, 0, 0, $i, 1, 2001)); } } return($months); } //**************************************************************** //得到月短名称列表 function getMonthShortNames($length=3) { global $locale_short_months; if(!empty($locale_short_months)){ $months = $locale_short_months; }else{ for($i=1;$i<13;$i++){ $months[$i] = strftime(‘%B‘, mktime(0, 0, 0, $i, 1, 2001)); $months[$i] = substr($months[$i], 0, $length); } } return($months); } //***************************************************************** //得到星期全名称列表 function getWeekDays() { global $locale_weeks; if(!empty($locale_weeks)){ $weekdays = $locale_weeks; }else{ for($i=0;$i<7;$i++){ $weekdays[$i] = strftime(‘%A‘, mktime(0, 0, 0, 1, $i, 2001)); } } return($weekdays); } //**************************************************************** //得到星期短名称列表 function getShortWeekDays($length=3) { global $locale_short_week; if(!empty($locale_short_week)){ $weekdays = $locale_short_week; }else{ for($i=0;$i<7;$i++){ $weekdays[$i] = strftime(‘%A‘, mktime(0, 0, 0, 1, $i, 2001)); $weekdays[$i] = substr($weekdays[$i],0,$length); } } return($weekdays); } //**************************************************************** //得到月全名称 function getMonthFromFullName($month) { $month = strtolower($month); $months = Date_Calc::getMonthNames(); while(list($id, $name) = each($months)){ if(ereg($month, strtolower($name))){ return($id); } } return(0); } //**************************************************************** //得到月短名称 function getMonthAbbrname($month,$length=3) { $month = strtolower($month); $months = Date_Calc::getMonthShortNames(); while(list($id, $name) = each($months)){ if(ereg($month, strtolower($name))){ return($id); } } return(0); } // end func getMonthAbbrname //**************************************************************** //得到星期短名称 function getWeekdayFullname($day="",$month="",$year="") { if(empty($year)) $year = Date_Calc::dateNow("%Y"); if(empty($month)) $month = Date_Calc::dateNow("%m"); if(empty($day)) $day = Date_Calc::dateNow("%d"); $weekday_names = Date_Calc::getWeekDays(); $weekday = Date_Calc::dayOfWeek($day,$month,$year); return $weekday_names[$weekday]; } // end func getWeekdayFullname //**************************************************************** //得到星期短名称 function getWeekdayAbbrname($day="",$month="",$year="",$length=3) { if(empty($year)) $year = Date_Calc::dateNow("%Y"); if(empty($month)) $month = Date_Calc::dateNow("%m"); if(empty($day)) $day = Date_Calc::dateNow("%d"); $weekday_names = Date_Calc::getShortWeekDays(); $weekday = Date_Calc::dayOfWeek($day,$month,$year); return $weekday_names[$weekday]; } // end func getWeekdayAbbrname 以上几个函数有的是修改的,有的是新加的,由于较多,不再一一详细说明。思路是明显的,就是通过对日期列表的的映射获得相应语言名称。有兴趣的朋友可能进行补充和更正。 foreach( $wk as $day ) {
$s .= " <th width="14%">" . htmlentities(utf8_encode($day), ENT_COMPAT, $locale_char_set) . "</th>"; } utf8_encode函数去掉修改为 foreach( $wk as $day ) {
$s .= " <th width="14%">" . htmlentities($day, ENT_COMPAT, $locale_char_set) . "</th>"; } 完整的函数如下: //***************************************************************
function _drawDays() { global $locale_char_set; $bow = Date_Calc::beginOfWeek( null,null,null,null,LOCALE_FIRST_DAY ); $y = substr( $bow, 0, 4 ); $m = substr( $bow, 4, 2 ); $d = substr( $bow, 6, 2 ); $wk = Date_Calc::getCalendarWeek( $d, $m, $y, "%a", LOCALE_FIRST_DAY ); $s = $this->showWeek " <th> </th>" : ""; foreach( $wk as $day ) { $s .= " <th width="14%">" . htmlentities($day, ENT_COMPAT, $locale_char_set) . "</th>"; } return " <tr>$s </tr>"; } //**************************************************************** 修改文件module/tasks/ae_dates.php function cal_work_day_conv($val) {
GLOBAL $locale_char_set; $wk = Date_Calc::getCalendarWeek( null, null, null, "%a", LOCALE_FIRST_DAY ); $day_name = $wk[($val - LOCALE_FIRST_DAY)%7]; //把utf8_encode调用处注释,不进行编码转换 /* if ($locale_char_set == "utf-8" && function_exists("utf8_encode")) { $day_name = utf8_encode($day_name); } */ return htmlentities($day_name, ENT_COMPAT, $locale_char_set); } 以上是把显示日期名称时的utf8_encode转码去掉,因为读到的日期名称本来就是utf-8编码,类似的地方可能还有,如果找到都要去掉。 3. 修正在中文下Gantt图的乱码问题 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 $jpLocale = dPgetConfig( ‘jpLocale‘ );
if ($jpLocale) { $graph->scale->SetDateLocale( $jpLocale ); } else { $graph->scale->SetDateLocale( $AppUI->user_lang[0] );//第一个估计会有或注释掉和设为 ‘ ’ } Gantt图绘制分两部分,一部分是由DotProject生成的项目管理的标题等,一部分是用户业务产生的内容区部分如项目和任务名称。对于第一部分绘制字体编码保持和DotProject一致。 if (!empty($LOCALE_FONT)){
define("CRURRENT_FONT",$LOCALE_FONT); } else { define("CRURRENT_FONT",FF_ARIAL); } 这样在设定字体的地方设定CRURRENT_FONT就可以了。把 //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图相应的项目和任务要显示的名称判断是否在中文,设置对应的字体,如:
4. 其他补充说明 后话: |
|