2013年3月19日火曜日

OmegaT の進捗表示をカスタマイズする

OmegaT のステータスバー右側には、翻訳の進行状況を示す領域が設けられています。

こんな感じ。

ボックスが2つ並んでいますが、右端のボックスは原文と訳文の文字数を表示しているだけなので、今回は関係ないです。

左側のボックスが問題。

いろいろ数値が表示されてはいますが、どうも自分の知りたい形式じゃないんですね。

自分が気にしているのは、ぶっちゃけ進捗率(既訳率)と残りの未訳分節数だけなんです。ところが、これがどこにも表示されていない。

しかたがないので、毎回電卓を呼び出して割り算とかしてたんですが(暗算苦手なもので…)、だんだんそれが面倒くさくなってきたので、カスタマイズしました。

カスタマイズ後は、こんな感じ。

項目は「ファイルの進捗率(未訳分節数)/ プロジェクトの進捗率(未訳分節数)」です。

人によって見たい数字は違うと思うので、これじゃ足りねーよという意見もあろうかとは思いますが、自分の場合はこれで十分です。

以下、備忘です。

もともとは、本体バージョンアップの影響受けないようにプラグインにするつもりだったのですが、調べてみると進捗表示のロジックが GUI 部の Private メソッドになっていて、どうにもオーバーライドしようがありませんでした。まあ実行時に Java のバイトコードを書き換えるという方法もあるらしいのですが、進捗表示をちょっと変えたいだけなのに、そんな大げさな話にするのも、ねえ。

というわけで、仕方なくソースコードいじりました。

こんな感じ。

org.omegat.gui.editor.EditorController

private void showStat() {

        /* mod by YU-TANG
        String pMsg = " " + Integer.toString(translatedInFile) + "/" + Integer.toString(fi.entries.size())
                + " (" + Integer.toString(stat.numberofTranslatedSegments) + "/"
                + Integer.toString(stat.numberOfUniqueSegments) + ", "
                + Integer.toString(stat.numberOfSegmentsTotal) + ") ";
        */
        NumberFormat nfPer = NumberFormat.getPercentInstance();
        nfPer.setRoundingMode(RoundingMode.DOWN);
        nfPer.setMaximumFractionDigits(1);
        String pMsg = " ";
        if (translatedInFile == 0) {
            pMsg += "0% (" + Integer.toString(fi.entries.size()) + " left)";
        } else {
            pMsg += nfPer.format((double)translatedInFile / fi.entries.size());
            pMsg += " (" + Integer.toString(fi.entries.size() - translatedInFile) + " left)";
        }
        pMsg += " / ";
        if (stat.numberofTranslatedSegments == 0) {
            pMsg += "0% (" + Integer.toString(stat.numberOfUniqueSegments);
            pMsg += " left) ";
        } else {
            pMsg += nfPer.format((double)stat.numberofTranslatedSegments / stat.numberOfUniqueSegments);
            pMsg += " (" + Integer.toString(stat.numberOfUniqueSegments - stat.numberofTranslatedSegments);
            pMsg += " left) ";
        }

最初、int と int で除算して、進捗率が全部 0 になったという。

Java の int 同士の除算は整数値になるんですね。そんなことも分からないレベルですが、こんな真似が許されるのも OSS だからこそ。ありがたや。

問題はやっぱり、バージョンアップのたびにビルドし直すのかよ、という点ですが、さてどうしたもんでしょうか…。

3 件のコメント:

  1. すごくいい改善だと思います。私自身もあの数字は何なの、って毎回tooltipで確認して、いまいち使えないなということでたいてい無視してます。

    ぜひこれを本プロジェクトに貢献いただけたらと思いますが、現状の表示が好きな人もいるでしょうし、たとえばフィールドをクリックしていくつかのパターンを巡回するような形に変えるとかいうのはどうでしょうか?

    返信削除
    返信
    1. コメントありがとうございます。
      Cycle 形式ですね。賛成です。
      本体に取り込んでいただけたら、バージョンアップのたびにビルドしなおす必要が無くなるので、自分もありがたいです。
      後で手が空いたら、RFE 登録しますね。

      削除
  2. 紆余曲折ありましたが、OmegaT 3.1.1u2 で本体に実装されました。
    RFE はこちらです。
    実装を担当された cienislaw さん、アドバイスいただいたマドロンケイさん、ありがとうございました!

    返信削除