茫茫網海中的冷日
         
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已!
 恭喜您是本站第 1729111 位訪客!  登入  | 註冊
主選單

Google 自訂搜尋

Goole 廣告

隨機相片
LSxMF_00066.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

PHP特區 : [轉貼]dotProject 的甘特圖中文修改

發表者 討論內容
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]dotProject 的甘特圖中文修改
  1. 測試 GD 的中文支援性

    1. 確定 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 沒問題了~


  2. jpgraph

    1. 更新 dotproject/lib/jpgraph
      到官方網站更新至新版:
      http://www.aditus.nu/jpgraph/
    2. 修改 jpg-config.inc.php 設定,加入中文字型
      1. 加入 DEFINE("TTF_DIR"," /usr/share/fonts/corefonts/");
      2. DEFINE('CHINESE_TTF_FONT','bkai00mp.ttf');
        改為 DEFINE('CHINESE_TTF_FONT',' fireflysung.ttf');
    3. 修改 jpgraph.php

      1. 取消內建的 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;
        }
      2. 修改字型對應

        找到

        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。

      3. 加入區域偵測

        應該是用來設定日期的格式的,原則上應該是要給正確的值給他,但是寫在這比較方便。
        找到 function Set($aLocale),在下方加入

        $query = "SELECT 'config_value' FROM 'config' WHERE 'config_name = host_locale'";
        $aLocale = mysql_query ($query);

    4. 測試設定:
      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 的設定沒問題。

  3. dotProject

    1. 修改 dotproject/modules/projects/gantt.php

      1. 取消內建的 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"] ;

      2. 修改字型設定

        1. 找到 //$graph->scale->actinfo->SetFont(FF_ARIAL);

          改為 $graph->scale->actinfo->SetFont(FF_CHINESE);
        2. 找到
          // 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);

        3. 找到

          $bar->title->SetCOlor('red');
          $graph->Add($bar);

          加入一行,變成

          $bar->title->SetCOlor('red');
          $bar->title->SetFont(FF_CHINESE,FS_BOLD,8);
          $graph->Add($bar);

        4. 找到 $bar->title->SetFont(FF_FONT1,FS_NORMAL,10);
          改為 $bar->title->SetFont(FF_CHINESE,FS_NORMAL,10);
        5. 找到
          $bar->caption = new TextProperty($caption);
          在之後加入 $bar->caption->SetFont(FF_CHINESE,FS_NORMAL,10);
        6. 找到 $graph->Add($bar2);
          共兩處,在前面加上 $bar2->title->SetFont(FF_CHINESE,FS_NORMAL,10);
        7. 找到 $graph->Add($bar3);
          在前面加上 $bar3->title->SetFont(FF_CHINESE,FS_NORMAL,10);
        8. 找到 $graph->Add($vline);
          在前面加上 $vline->title->SetFont(FF_CHINESE,FS_BOLD,8);

    2. 修改 dotproject/modules/tasks/gantt.php
      1. 取消內建的UTF-8轉碼

        由於本來就是使用UTF-8,所以要把內部的自動轉換關閉。

        找到


        if( $local_char_set==』 utf-8' && function_exists('utf8_decode') ) {
        $name = utf8_decode($name);
        }

        把這三行刪除。

      2. 修改字型設定:

        1. 找到
          if (is_file( TTF_DIR.'arialbd.ttf' )){
          $graph->scale->actinfo->SetFont(FF_ARIAL);
          }

          修改為 $graph->scale->actinfo->SetFont(FF_CHINESE);

        2. 找到
          // 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);

        3. 找到 $graph->Add($bar);
          共兩處,在前面加上
          $bar->title->SetFont(FF_CHINESE,FS_NORMAL,10);
        4. 找到
          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 的甘特圖中文修改
冷日
(冷日)
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>&nbsp;</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圖的亂碼問題
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
冷日
(冷日)
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 子目錄中,然後做一下 系統配置就搞定了。漢化的也很好。只是有一個缺點, 日曆 功能的星期幾的漢字顯示有 問題頁面上面顯示為
亂碼
    經過我的 研究發現,造成此問題有下面這兩個原因:
  1. 星期幾名稱縮寫的截取函數有問題。代碼中使用 英文單詞取前3個字符的截取方式,例如:Monday-> Mon。可是當截取漢字的時候就生成了一個半漢字。
  2. 可能是個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>&nbsp;</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的汉化问题 - 好工具站长分享平台
冷日
(冷日)
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 修改 | 免费小工具
冷日
(冷日)
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行]
   $graph->Add($vline);

  在前面加上一行
   $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行]
   $graph->Add($vline);

  在前面加上一行
   $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!
前一個主題 | 下一個主題 | 頁首 | | |



Powered by XOOPS 2.0 © 2001-2008 The XOOPS Project|