|
發表者 |
討論內容 |
冷日 (冷日) |
發表時間:2011/11/29 7:47 |
- Webmaster

- 註冊日: 2008/2/19
- 來自:
- 發表數: 15771
|
- [轉貼]dotProject 的甘特圖中文修改
- 測試 GD 的中文支援性
- 確定 PHP、GD中文運作正常
Header( "Content-type: image/gif" ); $im = imagecreate( 400, 150 ); $black = ImageColorAllocate( $im, 0, 0, 0 ); $white = ImageColorAllocate( $im, 255, 255, 255 ); $fnt = "/usr/share/fonts/corefonts/fireflysung.ttf"; $str = iconv("BIG5","UTF-8","中文"); ImageTTFText($im, 30, 0, 50,50, $white, $fnt, $str); ImageGif($im); ImageDestroy($im); ?> 如果這裡沒問題,代表 PHP、GD 沒問題了~
- jpgraph
- 更新 dotproject/lib/jpgraph
到官方網站更新至新版: http://www.aditus.nu/jpgraph/
- 修改 jpg-config.inc.php 設定,加入中文字型
- 加入 DEFINE("TTF_DIR"," /usr/share/fonts/corefonts/");
- 將 DEFINE('CHINESE_TTF_FONT','bkai00mp.ttf');
改為 DEFINE('CHINESE_TTF_FONT',' fireflysung.ttf');
- 修改 jpgraph.php
- 取消內建的 UTF-8 轉碼
由於本來就是使用UTF-8,所以要把內部的自動轉換關閉。 搜尋「iconv」,找到 elseif( $aFF === FF_CHINESE ) { if( !function_exists('iconv') ) { JpGraphError::RaiseL(25006); //('Usage of FF_CHINESE (FF_BIG5) font family requires that your PHP setup has the iconv() function. By de$ } return iconv('BIG5','UTF-8',$aTxt); ) 修改為
elseif( $aFF === FF_CHINESE ) { return $aTxt; } - 修改字型對應
找到 FF_CHINESE => array(FS_NORMAL=>CHINESE_TTF_FONT, FS_BOLD=>'', FS_ITALIC=>'', FS_BOLDITALIC=>''), 修改成 FF_CHINESE => array(FS_NORMAL=>CHINESE_TTF_FONT, FS_BOLD=>CHINESE_TTF_FONT, FS_ITALIC=>CHINESE_TTF_FONT, FS_BOLDITALIC=>CHINESE_TTF_FONT ), 如果要設定粗體、斜體為不同字型,要另外設定別的字型檔給 FS_BOLD、FS_ITALIC。 - 加入區域偵測
應該是用來設定日期的格式的,原則上應該是要給正確的值給他,但是寫在這比較方便。 找到 function Set($aLocale),在下方加入 $query = "SELECT 'config_value' FROM 'config' WHERE 'config_name = host_locale'"; $aLocale = mysql_query ($query);
- 測試設定:
include ("../jpgraph.php"); include ("../jpgraph_gantt.php"); $bar1 = new GanttBar(0, iconv("BIG5","UTF8","中文 1"),"2001-12-21","2002-01-20"); $bar1->SetCSIMTarget('#','Go back 1'); $bar1->title->SetCSIMTarget('#','Go back 1 (title)'); $bar1->title->SetFont( FF_CHINESE, FS_NORMAL, 8 ); $bar2 = new GanttBar(1,"Activity 2","2002-01-03","2002-01-25"); $bar2->SetCSIMTarget('#','Go back 2'); $bar2->title->SetCSIMTarget('#','Go back 2 (title)'); $graph = new GanttGraph(500); $graph->title->Set("Example with image map"); $graph->ShowHeaders(GANTT_HYEAR | GANTT_HMONTH | GANTT_HDAY | GANTT_HWEEK); $graph->scale->week->SetStyle(WEEKSTYLE_FIRSTDAY); $graph->scale->week->SetFont(FF_FONT1); $graph->Add(array($bar1,$bar2)); // And stroke $graph->StrokeCSIM('ganttcsimex01.php'); ?>
如果這裡沒問題,應該代表 jpgraph 的設定沒問題。
- dotProject
- 修改 dotproject/modules/projects/gantt.php
- 取消內建的 UTF-8 轉碼
由於本來就是使用UTF-8,所以要把內部的自動轉換關閉。 找到 if ( $locale_char_set=='utf-8' && function_exists("utf8_decode") ) { $name = strlen( utf8_decode($p["project_name"]) ) > 25 ? substr( utf8_decode($p["project_name"]), 0, 22 ).'...' : utf8_decode($p["project_name"]) ; } else { //while using charset different than UTF-8 we need not to use utf8_deocde $name = strlen( $p["project_name"] ) > 25 ? substr( $p["project_name"], 0, 22 ).'...' : $p["project_name"] ; } 改成 $name = strlen( $p["project_name"] ) > 25 ? substr( $p["project_name"], 0, 22 ).'...' : $p["project_name"] ; - 修改字型設定
- 找到 //$graph->scale->actinfo->SetFont(FF_ARIAL);
改為 $graph->scale->actinfo->SetFont(FF_CHINESE);
- 找到
// Use TTF font if it exists // try commenting out the following two lines if gantt charts do not display if (is_file( TTF_DIR."arialbd.ttf" )) $graph->scale->tableTitle->SetFont(FF_ARIAL,FS_BOLD,12); 修改為 $graph->scale->tableTitle->SetFont(FF_CHINESE,FS_BOLD,12); - 找到
$bar->title->SetCOlor('red'); $graph->Add($bar); 加入一行,變成 $bar->title->SetCOlor('red'); $bar->title->SetFont(FF_CHINESE,FS_BOLD,8); $graph->Add($bar); - 找到 $bar->title->SetFont(FF_FONT1,FS_NORMAL,10);
改為 $bar->title->SetFont(FF_CHINESE,FS_NORMAL,10);
- 找到
$bar->caption = new TextProperty($caption); 在之後加入 $bar->caption->SetFont(FF_CHINESE,FS_NORMAL,10);
- 找到 $graph->Add($bar2);
共兩處,在前面加上 $bar2->title->SetFont(FF_CHINESE,FS_NORMAL,10);
- 找到 $graph->Add($bar3);
在前面加上 $bar3->title->SetFont(FF_CHINESE,FS_NORMAL,10);
- 找到 $graph->Add($vline);
在前面加上 $vline->title->SetFont(FF_CHINESE,FS_BOLD,8);
- 修改 dotproject/modules/tasks/gantt.php
- 取消內建的UTF-8轉碼
由於本來就是使用UTF-8,所以要把內部的自動轉換關閉。 找到
if( $local_char_set==』 utf-8' && function_exists('utf8_decode') ) { $name = utf8_decode($name); } 把這三行刪除。 - 修改字型設定:
- 找到
if (is_file( TTF_DIR.'arialbd.ttf' )){ $graph->scale->actinfo->SetFont(FF_ARIAL); } 修改為 $graph->scale->actinfo->SetFont(FF_CHINESE);
- 找到
// Use TTF font if it exists // try commenting out the following two lines if gantt charts do not display if (is_file( TTF_DIR.'arialbd.ttf' )) $graph->scale->tableTitle->SetFont(FF_ARIAL,FS_BOLD,12); 修改為 $graph->scale->tableTitle->SetFont(FF_CHINESE,FS_BOLD,12);
- 找到 $graph->Add($bar);
共兩處,在前面加上 $bar->title->SetFont(FF_CHINESE,FS_NORMAL,10);
- 找到
if (is_file( TTF_DIR.'arialbd.ttf' )) { $vline->title->SetFont(FF_ARIAL,FS_BOLD,10); } 修改為 $vline->title->SetFont(FF_CHINESE,FS_BOLD,8);
雖然我是用在mantis,不過問題總算是解決了~~~原來是utf-8的問題。 原文出處:kaowoei的自爽地: dotProject 的甘特圖中文修改
|
|
冷日 (冷日) |
發表時間:2011/11/29 7:54 |
- Webmaster

- 註冊日: 2008/2/19
- 來自:
- 發表數: 15771
|
- [轉貼]DotProject中文亂碼解決總結
DotProject中文亂碼解決總結 Andrew(zhuyi) DotProject是一個基於AMP(apache+mysql+php)的開源項目管理工具,DotProject可以支持多語言並採用模塊化設計以便於擴展。 最近需要一個項目管理軟件,於是就下載DotProject進行了試用,感覺不錯,但有中文有亂碼問題,如:日曆和gantt圖。現就對解決DotProject亂碼進行一下總結,由於本人以前沒接觸過PHP,初次修改有錯的地方請大家指正。 機器環境:WindowsXP SP2簡體中文,apache2.0.59, mysql-5.0.16-win32, php-5.2.0,其他版本沒有測過,不能保證在其他版本下正確運行,由其在PHP4下。 1. 加入語言包 DotProject有比較不錯的多語言包,項目叫dot modules,在sourceforge上有。DotProject的語言包目錄./locales,運行可根據配置動態加載語言包進行對照轉換相應的語言。下載中文語言包解壓後並複製到語言目錄locales下,修改語言包文件夾下locales.php文件: $locale_char_set = 'GB2312';為$locale_char_set = 'utf-8'; 同時把英文語言包的同名文件也進行修改。使用'utf-8'的好處就是瀏覽器用unicode(utf-8)解碼,頁面可顯示多種語言文字。防照英文語言包創建lang.php文件,加入如下內容:
 <? 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翻譯管理進行更改),初步漢化完成。 2. 修正在中文下日曆的亂碼問題 本地化語言後日曆的星期顯示為亂碼,這是由於DotProject採用讀取操作系統本地語言區域日期格式引起的,在windowsXP中文版默認是“星期幾,xxxx-x-x”,且可能為GB2312編碼(本地區域語言可以更改)。DotProject讀取操作系統的日期用utf8_encode轉換後再顯示,這樣只要操作系統的本地區域日期語言格式和運行DotProject選取的語言不一至時就會出現亂碼,顯然不是聰明的做法。 1)語言包文件夾下locales.php文件中加入日期格式對照表變量如下:  $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  以上幾個函數有的是修改的,有的是新加的,由於較多,不再一一詳細說明。思路是明顯的,就是通過對日期列表的的映射獲得相應語言名稱。有興趣的朋友可能進行補充和更正。 3)修改日期顯示的亂碼處,在modules/calendar/calendar.class.php文件把function _drawDays()函數中
 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 以上是把顯示日期名稱時的utf8_encode轉碼去掉,因為讀到的日期名稱本來就是utf-8編碼,類似的地方可能還有,如果找到都要去掉。 3. 修正在中文下Gantt圖的亂碼問題 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 ' , ' mingliu.ttc ' ); // 使用'mingliu.ttc'(windows下的細明體)  DEFINE ( ' CHINESE_TTF_FONT ' , ' mingliu.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圖部分就修改完畢,看看效果: 英文:  中文:

4. 其他補充說明 以上所有的編碼都設定為utf-8,因此建議把數據庫的服務器端和客戶端字符集都改為utf-8。Mysql修改配置文件my.cnf或my.ini即可。 如phpmyadmin瀏覽DotProject的mysql數據庫,設定為”中文-Chinese Simplified(utf-8)”,如果發現在亂碼,請在includes/db_adodb.php文件中function db_connect()函數加上 $db->Query("Set Names 'utf8'"); 這樣字符編碼就和phpmyadmin保持一致,用phpmyadmin瀏覽數據就沒有亂碼了。 後話: 本文雖然是解決亂碼問題,其中包含軟件國際化思想。在軟件支持多語言文字時,可以分為兩部分,一部分軟件本身通過配置有多種語言版本,一部分就是支持不同語言文字的處理。就像瀏覽器,雖然各種語言版本,但可以正常瀏覽不同語言的網頁。這主要是由於採用了統一編碼utf8-unicode(大多採用此種編碼)。可以預見,不久亂碼問題由於都採用統一編碼將不復存在。軟件的多語言只是軟件國際化第一步,中國軟件業國際化任重道遠。 在附件中是由DotProject2.1rc版修改過的壓縮文件,並加入了最新的JpGraph for PHP5版本。有興趣的朋友可以下載大家共同研究。(由於不能上傳附件,需要的朋友可以留下email地址) 下載地載: http://download.csdn.net/source/192263
原文出處: DotProject中文乱码解决总结 - (Andrew)的专栏 - 博客频道 - CSDN.NET
|
|
|
冷日 (冷日) |
發表時間:2011/11/29 7:58 |
- Webmaster

- 註冊日: 2008/2/19
- 來自:
- 發表數: 15771
|
- [轉貼]開源的項目管理系統dotProject的漢化問題
為了加強 軟件 項目的管理,我 公司使用了 開源 項目管理軟件dotProject。dotProject是一個基於 LAMP的開源項目管理軟件。使用 PHP+MySql 開發實現。dotProject官方 網站在這裡: http://www.dotproject.net/ 目前 發佈的最 新版本為2.0.4。官方網站上面 提供的 中文包也不錯,我使用的是Ch inese_Simplied_(GBK)_2.01_ Compatible語言包,編碼方式是GB2312。 下載安裝,安裝語言包非常簡單,解壓縮之後是一個名為「cn」的目錄,整個複製到dotProject的locales 子目錄中,然後做一下 系統配置就搞定了。漢化的也很好。只是有一個缺點, 日曆 功能的星期幾的漢字顯示有 問題! 頁面上面顯示為 亂碼。 經過我的 研究發現,造成此問題有下面這兩個原因: - 星期幾名稱縮寫的截取函數有問題。代碼中使用 英文單詞取前3個字符的截取方式,例如:Monday-> Mon。可是當截取漢字的時候就生成了一個半漢字。
- 可能是個Bug,例如原 文件「dotProject\modules\calendar\calendar.class.php」 中生成 標題字符串的程序代碼為:
$s .= \n\t\t<th width=\ 14 % \ > . htmlentities ( utf8_encode ( $day ) , ENT_COMPAT , $locale_char_set ) . </th> ; 很明顯,這裡調用了 一次utf8的編碼函數,所以不論何種 本地化編碼方式,這裡都生成了utf8的編碼字符。 至於改進方式,我採用了比較偷懶的方式,直接設置了星期幾名稱的數組,然後去掉第2個問題中的utf8編碼函數調用,問題 解決。下面是我 修改後的函數代碼: 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 ); if ( $locale_char_set == ' GB2312 ' ) { $wk = array ( ' 日 ' , ' 一 ' , ' 二 ' , ' 三 ' , ' 四 ' , ' 五 ' , ' 六 ' ); } $s = $this -> showWeek ? \n\t\t<th> </th> : ; foreach ( $wk as $day ) { // ; $s .= \n\t\t<th align=\ center\ width=\ 14 % \ > . htmlentities ( $day , ENT_COMPAT , $locale_char_set ) . </th> ; } return \n<tr>$s\n</tr> ; } 原文出處:开源的项目管理系统dotProject的汉化问题 - 好工具站长分享平台
|
|
冷日 (冷日) |
發表時間:2011/11/29 8:00 |
- Webmaster

- 註冊日: 2008/2/19
- 來自:
- 發表數: 15771
|
- [轉貼]dotProject 繁體中文 utf-8 修改
- dotProject 繁體中文 utf-8 修改
只測試於:dotProject 2.1.2
1.可以正常的從 phpMyAdmin(無亂碼) 或 mysql 中來修改中文的方法 mysql 5.0 以上修改 my.cnf ,新增下列紅字部份,dotproject 建資料表才會建 utf8_general_ci
[client]
default-character-set=utf8
[mysqld]
default-character-set=utf8
1. 先用 phpMyAdmin 建立一個 database 連線校對(collation)使用 utf8_general_ci 或 utf8_unicode_ci 2. 修改 dotproject\lib\adodb\drivers\adodb-mysql.inc.php
function _connect 於 if ($this->_connectionID === false) return false; 後加入
mysql_query("SET NAMES 'utf8'", $this->_connectionID);
function _pconnect 於 if ($this->_connectionID === false) return false; 後加入
mysql_query("SET NAMES 'utf8'", $this->_connectionID);
另外方法是:
在 includes/db_adodb.php 內
找到 $ADODB_FETCH_MODE=ADODB_FETCH_BOTH;
並於下方加入
$db->Execute("SET NAMES UTF8");
原文出處:dotProject 繁體中文 utf-8 修改 | 免费小工具
|
|
冷日 (冷日) |
發表時間:2012/4/8 8:45 |
- Webmaster

- 註冊日: 2008/2/19
- 來自:
- 發表數: 15771
|
- [轉貼]如何將 dotProject 的Gantt 圖中文亂碼修正
- 如何將 dotProject 的Gantt 圖中文亂碼修正
如何 這裡是使用 dotProject 2.1.2 的版本來實作本補強手札, 其它版本請依需求自行修正!! ============================================================== | 本文章符合共享原則, 您可以隨意轉載, 但請註明出處以鼓勵作者的用心. | ==============================================================
1. 修正 JPGraph 設定 a. 修改Chinese預設字型檔 請打開文件 \lib\jpgraph\src\jpg-config.inc 找到設定項 [第73行]
DEFINE('CHINESE_TTF_FONT','bkai00mp.ttf');
替換紅色字
DEFINE('CHINESE_TTF_FONT','ARIALUNI.TTF');
註:ARIALUNI.TTF檔案可從本手札下載或由您自行尋找, 此為繁體中文Unicore字型檔, 大小為 23.275MB.
b. 增加中文字型對應(如Bold, Italic等) 請打開文件 \lib\jpgraph\src\jpgraph.php 找到程式碼 [第3106行]
FF_CHINESE => array(FS_NORMAL=>CHINESE_TTF_FONT, FS_BOLD=>'', FS_ITALIC=>'', FS_BOLDITALIC=>'' ),
替換整行宣告為
FF_CHINESE => array(FS_NORMAL=>CHINESE_TTF_FONT, FS_BOLD=>CHINESE_TTF_FONT, FS_ITALIC=>CHINESE_TTF_FONT, FS_BOLDITALIC=>CHINESE_TTF_FONT ),
2. 修改專案部份 Gantt 產生程式碼 a. 修改專案 Gantt 程式碼 請打開文件 \modules\projects\gantt.php 找到程式碼 [第131行]
//$graph->scale->actinfo->SetFont(FF_CUSTOM);
替換成
$graph->scale->actinfo->SetFont(FF_CHINESE);
找到程式碼 [第146行]
if (is_file(TTF_DIR . 'FreeSansBold.ttf')) {
$graph->scale->tableTitle->SetFont(FF_CUSTOM,FS_BOLD,12);
}
替換紅字為
$graph->scale->tableTitle->SetFont(FF_CHINESE,FS_BOLD,12);
找到程式碼 [第204行]
$bar->title->SetColor('red');
$graph->Add($bar);
在上面加上一行
$bar->title->SetFont(FF_CHINESE,FS_BOLD,8);
$bar->title->SetColor('red');
$graph->Add($bar);
找到程式碼 [第266行]
if (is_file(TTF_DIR."FreeSans.ttf")) {
$bar->title->SetFont(FF_CHINESE, FS_NORMAL, 9);
}
替換為
$bar->title->SetFont(FF_CHINESE, FS_NORMAL, 9);
找到程式碼 [第271行]
$bar->caption->Align('left','center');
在後面加上一行
$bar->caption->Align('left','center');
$bar->caption->SetFont(FF_CHINESE,FS_NORMAL,10);
找到程式碼 [第321行]、[第327行] (共兩處可一併被找到)
$bar2->title->SetFont(FF_CUSTOM, FS_NORMAL, 9);
兩處均將紅字替換為
$bar2->title->SetFont(FF_CHINESE, FS_NORMAL, 9);
找到程式碼 [第348行]
$bar3->title->SetFont(FF_CUSTOM, FS_NORMAL, 9);
替換紅字為
$bar3->title->SetFont(FF_CHINESE, FS_NORMAL, 9);
找到程式碼 [第367行] 在前面加上一行
$vline->title->SetFont(FF_CHINESE,FS_BOLD,8);
$graph->Add($vline);
找到程式碼串 [第211行起]
if ($locale_char_set=='utf-8' & function_exists('utf8_decode')) {
$name = ((strlen(utf8_decode($p['project_name'])) > 25)
? (substr(utf8_decode($p['project_name']), 0, 22) . '...')
: utf8_decode($p['project_name']));
} else {
//while using charset different than UTF-8 we need not to use utf8_deocde
$name = ((strlen($p['project_name']) > 25) ? (substr($p['project_name'], 0, 22).'...')
: $p['project_name']) ;
}
整串(紅字)替換為
$name = strlen($p["project_name"]) > 25 ? mb_substr($p["project_name"], 0, 22).'...' : $p["project_name"];
b. 修改專案 Gantt2 程式碼 (其實步驟跟前一項差不多, 但還是一樣一樣來) 請打開文件 \modules\projects\gantt2.php 找到程式碼 [第80行]
//$graph2->scale->actinfo->SetFont(FF_CUSTOM);
替換為
$graph2->scale->actinfo->SetFont(FF_CHINESE);
找到程式碼 [第93行起]
if (is_file(TTF_DIR . 'FreeSansBold.ttf')) {
$graph2->scale->tableTitle->SetFont(FF_CUSTOM, FS_BOLD, 12);
}
全部替換為
$graph2->scale->tableTitle->SetFont(FF_CHINESE, FS_BOLD, 12);
找到程式碼 [第151行]
$bar->title->SetCOlor('red');
$graph2->Add($bar);
在前面加上
$bar->title->SetFont(FF_CHINESE,FS_BOLD,8);
$bar->title->SetCOlor('red');
$graph2->Add($bar);
找到程式碼 [第166行起]
if (is_file(TTF_DIR . 'FreeSansBold.ttf')) {
$barTmp->title ->SetFont(FF_CUSTOM, FF_BOLD);
}
全部替換為
$barTmp->title ->SetFont(FF_CHINESE, FF_BOLD);
找到程式碼 [第224行]
if (is_file(TTF_DIR . 'FreeSans.ttf')) {
$bar->title->SetFont(FF_CUSTOM, FS_NORMAL, 10);
}
全部替換為
$bar->title->SetFont(FF_CHINESE, FS_NORMAL, 10);
找到程式碼 [第230行]
$bar->caption->Align('left','center');
在後面加上一行
$bar->caption->Align('left','center');
$bar->caption->SetFont(FF_CHINESE,FS_NORMAL,10);
找到程式碼 [第246行] 在前面加上一行
$vline->title->SetFont(FF_CHINESE,FS_BOLD,8);
$graph->Add($vline);
3. 修改任務 Gantt 程式碼 打開文件 \modules\tasks\gantt.php 修改編碼設定(原來已經為UTF-8編碼,不需再轉碼) [第361行]
if ($locale_char_set=='utf-8' & function_exists('utf8_decode')) {
$name = utf8_decode($name);
}
將以上程式碼全部刪除(紅字)
搜尋全文字串"FF_CUSTOM"全部替換成"FF_CHINESE"即可.
============================================================ 好了,這樣是不是全部都變中文了呢!! 這是一個很簡易的全部一次修改作法,如果您是程式專家,當然也可以根據原來的設定去變換不同的字型來使用,以增加專案系統的花樣,加油嘍!!
原文出處:如何將 dotProject 的Gantt 圖中文亂碼修正 - 交流討論 - dotProject - dotProject 專案管理 - 520 逐夢者之家 ::: Forever Version - Powered by Discuz!
|
|
|