« 5/9(日) 東北五県合同上映会&座談会@仙台 | メイン | dotprojectで作業時間を計る »

2004年05月06日

dotprojectのガントチャートを日本語化

dotprojectを使ってスケジュール管理と行きたいのだが、プロジェクト管理ソフトを使う目的のひとつのガントチャートが文字化けして使え物にならない。日本語化のメモを記しておく。

True Typeフォントをサーバにアップする。
Mac/WIndows/LinuxのTrueType日本語フォントを用意する。LinuxではX Windowをインストールすると、/usr/X11R6/lib/X11/fonts/TrueType/にkochi-gothic.ttfなどのフリーのフォントがインストールされているケースもある。

もし、フォントが無い場合は手持ちのフォントをサーバの任意のディレクトリ( ex. dotproject/lib/jpgraph/fonts/ )にアップする。なお、この際、フォントの使用範囲が使用許諾書で定められている場合があるので、公開する場合などは注意。フリーの日本語フォントに関しては、ここで紹介されている「Fモトヤシーダ1」もオススメ。

jpgraph.phpを修正
dotprojectのガントチャートは、JpGraphというフリーのグラフ作成ライブラリを使用して生成されている。JpGraphはデフォルトでは、日本語などに対応していないので修正する必要がある。

dotproject/lib/jpgraph/src/jpgraph.php を以下の箇所を修正していく。

TrueTypeフォントの場所を指定する
// Directory for jpGraph TTF fonts. Must end with '/'
// Note: The fonts must follow the naming conventions as
// used by the supplied TTF fonts in JpGraph.
//サーバに予めあるファイルを使う場合
//DEFINE("TTF_DIR","/usr/X11R6/lib/X11/fonts/truetype/");
//ユーザがアップしたフォントを使う場合など
DEFINE("TTF_DIR","/home/httpd/html/dotproject/lib/jpgraph/fonts/");
//Definitions for internal font, old style
// (Only defined here to be able to generate an error mesage
// when used)
DEFINE("FONT0",99);             // Deprecated from 1.2
DEFINE("FONT1",98);             // Deprecated from 1.2
DEFINE("FONT1_BOLD",97);        // Deprecated from 1.2
DEFINE("FONT2",96);             // Deprecated from 1.2
DEFINE("FONT2_BOLD",95);        // Deprecated from 1.2

//以下を追加
// Japanese Font Setting
DEFINE("FF_JPN_START", 40);
DEFINE("FF_JPN_END", 50);
DEFINE("FF_GOTHIC", 40);
DEFINE("FF_MICHO", 50);
DEFINE("FF_JPN_DEFAULT", FF_GOTHIC);
DEFINE("TF_JPN_DEFAULT", "japanfont.ttc"); // ここで使用したいフォントを指定する
テキストの出力時にUTF-8に文字コードを変換するようにする。
    function StrokeText($x,$y,$txt,$dir=0,$paragraph_align="left",$debug=false) {

        $x = round($x);
        $y = round($y);

        // 以下を追加
        // For Japanese
        if (preg_match("/".mb_detect_encoding($txt)."/","ascii,SJIS,EUC-JP,JIS,UTF-8")){
                $txt = mb_convert_encoding($txt, "UTF-8", "auto");
                if ($this->font_family < FF_JPN_START || $this->font_family > FF_JPN_END) {
                        $this->font_family = FF_JPN_DEFAULT;
                }
                if (preg_match("/\./", TF_JPN_DEFAULT)) {
                        $this->font_file = TTF_DIR . TF_JPN_DEFAULT;
                } else {
                        $this->font_file = TTF_DIR . TF_JPN_DEFAULT . '.ttf';
                }
        }
        //ここまで

        // Do special language encoding
        if( LANGUAGE_CYRILLIC )
            $txt = LanguageConv::ToCyrillic($txt);
※2004.05.11 一部修正しました。

gantt.phpを修正する
ガントチャートを出力しているのは、dotproject/modules/tasks/gantt.phpというファイルに含まれてる関数である。このファイルを修正。

for($i = 0; $i < count(@$gantt_arr); $i ++ ) {

        $a = $gantt_arr[$i][0];
        $level = $gantt_arr[$i][1];

        if($hide_task_groups) $level = 0;

        //$name = strlen( utf8_decode($a["task_name"]) ) > 25 ? 
            substr( utf8_decode($a["task_name"]), 0, 22 ).'...' : 
            utf8_decode($a["task_name"]) ; //コメントアウト or 削除
        $name = $a["task_name"] ; //追加
        $start = substr($a["task_start_date"], 0, 10);
        $end = substr($a["task_end_date"], 0, 10);
        $progress = $a["task_percent_complete"];
        $flags = ($a["task_milestone"]?"m":"");
gantt.phpではUTF-8に変換せずに、jpgraph.phpで変換するようにする。

以上の作業で日本語が文字化けしないようになる。 つまり、文字化けを回避するには、1.日本語フォントを指定する、2.文字コード変換をmb_string関数を用いて正確にする、という2点を解決することでできる。実は、phpcollabの日本語テクニックを参考にさせていただいている。
なお、各メッセージの日本語化は、dotprojectのサイトで配布されている日本語化キットで行うことができる。

投稿者 araken : 2004年05月06日 14:24

トラックバック

このエントリーのトラックバックURL:
http://www.kalium.net/cgi-bin/mt/mt-tb.cgi/556

コメント

MySQLについてはまだ調べていないのですが、
PHPの設定は以下の通りです。

>またPHP.ini の[mbstring]のmbstring.internal_encodingの設定値
>は何にされているのでしょうか?

mbstring.detect_order auto
mbstring.encoding_translation Off
mbstring.func_overload 0
mbstring.http_input pass
mbstring.http_output pass
mbstring.internal_encoding pass
mbstring.language neutral
mbstring.script_encoding ASCII
mbstring.substitute_character no value

投稿者 アラカワケンスケ : 2004年06月27日 20:58

>jdgraphの日本語化うまくいったとのことですが、MySQLの
>defaultCharcterSetは何にされているのでしょうか?

character set sjis

>またPHP.ini の[mbstring]のmbstring.internal_encodingの設定値
>は何にされているのでしょうか?

mbstring.detect_order no value
mbstring.encoding_translation Off
mbstring.func_overload 0
mbstring.http_input auto
mbstring.http_output pass
mbstring.internal_encoding EUC-JP
mbstring.language Japanese
mbstring.substitute_character no value

です。
自宅環境でこの辺をいろいろといじくってみたのですが、結局うまくいきませんでした。
カレンダー表示、localeに合せてうまくいっている方の環境設定を教えていただけると助かります。

それから、dotprojectのフォーラムやトラブルチケットへの日本語アウトプットもかんばしくありません。具体的にいうと改行キャラクタの \r が表示されてしまいます。1byte文字だけのテキストであれば問題ないのですが...
やはりこの辺も、php.ini の設定と関連あるのだろうか?

投稿者 henimaru : 2004年06月25日 13:24

jdgraphの日本語化うまくいったとのことですが、MySQLのdefaultCharcterSetは何にされているのでしょうか?
またPHP.iniの[mbstring]のmbstring.internal_encodingの設定値は何にされているのでしょうか?

投稿者 endo : 2004年06月23日 11:30

jdgraphの日本語化、うまくできるようになりました。どうもありがとうございます。
当方、apache on windows2000 で dotprojectを動かしてやろうとしていますが、カレンダーの表示がうまくないです。カレンダー処理しているphpの出力文字コードがutf-8ではなくなっているような感じで文字化けしてしまいます。
このあたり、なにか情報お持ちではないですか?

投稿者 henimaru : 2004年06月14日 13:53

私の環境では

dotproject/lib/jpgraph/src/jpgraph.php の

$txt = mb_convert_encoding($txt, "UTF-8", "auto");

$txt = mb_convert_encoding($txt, "SJIS", "auto");

としないとだめでした。

Apache/2.0.47 PHP 4.3.4 dotProject 1.0.2 です。

投稿者 iwakura : 2004年06月03日 18:27

Apacheのlogsには以下のメッセージが何件も出力されていました。
File 'c:\mysql\share\charsets\ujis.conf' not found (Errcode: 2)
Character set '#12' is not a compiled character set and is not specified in the 'c:\mysql\share\charsets\Index' file

でもこのメッセージはこの修正に関係なく出力されているようです。

投稿者 endo : 2004年05月24日 10:09

>すみません。ログはどこに出力されているのでしょうか?
>環境はWindowsXPです。

Apacheのエラーログのことです。
インストールの仕方によって、場所は変わると思います。
恐らく、apache?logs?
とかいうフォルダ構成になっているのではないでしょうか?

投稿者 アラカワケンスケ : 2004年05月24日 00:02

> ログはどこに
imgタグから呼び出されてチャートを表示するPHPスクリプト(xが表示されるもの)がどのようなエラーを出しているのか、Ethereal(http://www.ethereal.com/)などで確認してはどうでしょうか。

投稿者 maya : 2004年05月21日 14:41

すみません。ログはどこに出力されているのでしょうか?
環境はWindowsXPです。

投稿者 endo : 2004年05月21日 11:27

ログなどにエラーメッセージは出ていないでしょうか?

投稿者 アラカワケンスケ : 2004年05月20日 19:43

参考にさせていただいています。上記のとおり設定しなおしましたがうまくいきません。
変更前のガントチャートは文字化けして表示されます。上記のように修正すると、全く表示されず×アイコンが片隅に表示されます。
フォントはNFモトヤアポロ1(NFa1kp.ttc)です。
MySQLのDefault CharctorSet はujisです。PHP.iniの[mbstring]は以下のとおりです。
mbstring.language = Japanese
mbstring.internal_encoding = EUC-JP
mbstring.http_input = auto
mbstring.http_output = pass
mbstring.encoding_translation = On
mbstring.detect_order = auto
mbstring.substitute_character = none;
mbstring.func_overload = 0
どこの設定を変えればいいでしょうか?
宜しくお願いします。

投稿者 endo : 2004年05月20日 17:42

↓コマッテルン様
ガントチャートが動かないのはPHPの設定でphp_gd2.dllが無効である可能性はないですか?

投稿者 鈴木 : 2004年05月12日 17:52

dotprojectの日本語化情報って意外と少なくて苦戦してますので、参考にさせていただいています。
windows+php4.3.6で奮戦中ですが、そもそもガントチャートが全く表示されなくて・・・。
本家のページでFAQ調べてやってみてはいるんですが・・・。

投稿者 コマッテルン : 2004年05月11日 21:53

ご指摘の通り、
if (preg_match("/\./", TF_JPN_DEFAULT)) {
です。
コピペの時に、化けてしまったようです。

投稿者 アラカワケンスケ : 2004年05月11日 15:50

ちょうどdotproject環境を構築中で参考にさせていただきました。ありがとうございます。

ところで

if (preg_match("/?./", TF_JPN_DEFAULT)) {

のところで動かなかったのですが

if (preg_match("/\./", TF_JPN_DEFAULT)) {

でしょうか?

投稿者 maya : 2004年05月11日 15:23