Ganttチャートの日本語対応

dotProjectの売りのひとつがきれいなガントチャートなんだけど、残念ながらインストールしたてだと日本語が化けてしまう。これはひとえにグラフ化ライブラリであるjpgraphがそのままでは日本語に対応できていないからである。dotProject 2.0.1についてくるjpgraphはいくら格闘しても日本語対応できなかったけど、jpgraphだけ新しいのを入れたらすんなりうまくいったこともあるので、なるべく新しいものを入れた方がいいかも。でも、最新のものを入れてもそのままではやはり日本語には対応していない。ちなみに、jpgraphはここで配布されている。それでは、早速jpgraphの日本語対応に取り掛かろう。

まずはjpgraphで日本語フォントを扱えるようにしよう。現時点の最新CVSでとってきたjpgraphは1.9.10.2だったけど、最近のものであれば設定ファイルjpg-config.incからフォントなどの設定を読み込むようになっているはず。jpg-config.incの日本語設定は、まず//DEFINE("MBTTF_DIR","/usr/share/fonts/ja/TrueType/");
とコメントアウトされている行を有効にして、日本語TrueTypeフォントが格納されている正しいpathに修正する。DEFINE("MBTTF_DIR","/usr/share/fonts/japanese/TrueType/");
あくまでもこれはFC5での話なので、他のディストリビューションではディレクトリが違うかも。

次に、日本語フォントを指定しよう。DEFINE('MINCHO_TTF_FONT','ipam.ttf');
DEFINE('PMINCHO_TTF_FONT','ipamp.ttf');
DEFINE('GOTHIC_TTF_FONT','ipag.ttf');
DEFINE('PGOTHIC_TTF_FONT','ipagp.ttf');
の行に対して、FC5に標準でついてくるサザナミフォントに変更する。DEFINE('MINCHO_TTF_FONT','sazanami-mincho.ttf');
DEFINE('PMINCHO_TTF_FONT','sazanami-mincho.ttf');
DEFINE('GOTHIC_TTF_FONT','sazanami-gothic.ttf');
DEFINE('PGOTHIC_TTF_FONT','sazanami-gothic.ttf');
これもFC5以外では違うかもしれないので要確認。

あとはdotProject側の修正で、modules/projects/のgantt.phpとgantt2.php、modules/tasks/のgantt.phpが対象となる。

modules/projects/gantt.phpでは、foreach($projects as $p) {

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"] ;
}
をすべてコメントアウトして、その直後に次の1行を追加する。 $name = mb_convert_encoding($p["project_name"],"UTF-8","auto");結果として、次の様になる。foreach($projects as $p) {

// 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 = mb_convert_encoding($p["project_name"],"UTF-8","auto");
jpgraphはUTF-8で日本語を渡すことになっているための対応で、これをしないと違う意味で文字化けする。ただ、この対応も中途半端で、コメントアウトしている部分に長いプロジェクト名を省略する処理が入っているので、ガントチャートの枠をはみ出すプロジェクト名がでてくることがある。これはもう少し落ち着いたら対処することにしよう。

次にプロジェクト名を日本語化しよう。 $bar = new GanttBar($row++, array($name, $startdate->format($df), $enddate->format($df), $actual_enddate->format($df)), $start, $actual_end, $cap, 0.6);
$bar->progress->Set($progress/100);

// $bar->title->SetFont(FF_FONT1,FS_NORMAL,10);
(↑コメントアウトして、↓下の行を追加する)
$bar->title->SetFont(FF_GOTHIC,FS_NORMAL,10);
$bar->SetFillColor("#".$p['project_color_identifier']);
$bar->SetPattern(BAND_SOLID,"#".$p['project_color_identifier']);

次にmodule/tasks/gantt.phpの修正。こちらも同様に、// 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->SetTableTitleBackground("#".$projects[$project_id]["project_color_identifier"]);
$graph->scale->tableTitle->SetFont(FF_GOTHIC);
(↑この行を追加する)
$graph->scale->tableTitle->Show(true);
これはチャートの表題部分の日本語化。続いてタスク名の日本語化。 $name = $a["task_name"];
(↓5行をコメントアウト)
// if ( $locale_char_set=='utf-8' && function_exists("utf8_decode") ) {
// $name = utf8_decode($name);
// }
// $name = strlen( $name ) > 34 ? substr( $name, 0, 33 ).'.' : $name ;
// $name = str_repeat(" ", $level).$name;
(↓この行を追加)
$name = mb_convert_encoding($name,"UTF-8","auto");
UTF-8化を行って、ほとんど一番最後のほうで $q->clear();
(↓この行を追加)
$bar->title->SetFont(FF_GOTHIC);
$graph->Add($bar);
とする。

これでガントチャートは日本語化されるはず。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です