MythTV Translation

MythTV Top

MythTVの翻訳の方法を簡単に説明します。多分他のqtアプリケーションも似たようなものだと思います。 上から簡単な順番です。

注意:文字コードは全てutf-8を使用してください。
ソースの取得
まずソースを取得しましょう
linguistを使った翻訳ファイルの翻訳
一番お手軽な翻訳作業です。翻訳の準備が出来ていてあとは英語に対する日本語を入力するだけです。
メニューの翻訳
メニューが英語で表示されるときに修正します。
ソースの修正
翻訳ファイルにない部分や画面に????と表示されるときはソースを修正するしかありません。 その基本的なやり方です。
パッチの作り方
翻訳をしたらパッチを作ってみんなに公開しましょう。

MythTVのソースの取得

MythTVのソースを取得します。cvsを使うのでインストールしてください。そして適当なディレクトリで下記のコマンド実行します。 うまくいけばmythtvと言うディレクトリが出来てソース一式が取得できます。

$ cvs -d :pserver:mythtv@cvs.mythtv.org:/var/lib/mythcvs login
Logging in to :pserver:mythtv@cvs.mythtv.org:/var/lib/mythcvs
CVS password: mythtv
$ cvs -z3 -d :pserver:mythtv@cvs.mythtv.org:/var/lib/mythcvs checkout mythtv

取得したソースと最新のソースの変更を反映させるには下記のようにします。

$ cd mythtv
$ cvs update -Pd

翻訳するにはucs-muleなどのutf-8をサポートするエディタなら出来ますがlinguistを使うのが良いでしょう。


linguistを使って翻訳する

qtの翻訳ファイルを編集するにはlinguistを使うのが簡単です。インストールしましょう

$ sudo apt-get install linguist

linguistを起動するとこんな画面になります。

mythtv/i18n/mythfrontend_ja.tsを開きます。メニューの File - Openでダイアログが出るのでmythtv/i18n/mythfrontend_ja.tsを選択してください。

“Next Unfinished(Ctrl+L)”で次の未翻訳の部分が表示されます。

右の方の真中に未翻訳の部分が表示されます。“Source text”に元の文章“Translation”に翻訳した言葉を入力します。 翻訳し終わったら“Done and Next(Ctrl+Enter)”をするとこの部分を翻訳済みにして次の未翻訳移動します。

編集し終わったら“Save(Ctrl+S)”で保存します。

翻訳したファイルをインストールする

翻訳が終わったらlinguistから File - Releaseを選択するとメッセージファイルの保存先を訪ねてくるのでtsファイルと同じ場所に保存します。 mythfrontend_ja.qmファイルが新しくなります。
コマンドラインよりqmファイルをつくりにはlreleaseを実行します。

$ cd mythtv/i18n
$ lrelease mythfrontend_ja.ts

このファイルを現在インストールされているファイルと置き換えると翻訳が反映されます。

$ sudo cp mythfrontend_ja.qm /usr/local/share/mythtv

表示が化けるとき

翻訳した個所が英語は出ないが????がた時は翻訳はうまく言っているのですが内部でunicodeの取扱がうまくいってないため表示が化けてしまいます。 修正は難しくないのですがメインでMythTVを開発している人たちはunicodeを使わないので確認できない思うので仕方ないと思う。 でも修正のパッチは取り込んでくれるので感謝してます。

興味がある人はソースを見てください。


メニューの翻訳

メニューで使用されるファイルがmythtv/programs/mythfrontend/のディレクトリにある xmlファイルにも若干翻訳するところがあります。 文字コードはutf-8ですので注意してください。

例えばmythtv/programs/mythfrontend/mainmenu.xmlの中身を見ると下記のように なっています。

<text>Watch TV</text>がオリジナルの英語のメッセージでそれに対する各国語の メッセージがlang=??で指定されて以下に続いています。日本語のメッセージを入れるときは lang="JA"として追加して

<textlang="JA">TV放送</text>

というようにしてください。


<type>TV_WATCH_TV</type>
	<text>Watch TV</text>
	<text lang="IT">Guarda la TV</text>
	<text lang="ES">Ver la TV</text>
	<text lang="CA">Veure la TV</text>
	<text lang="NL">Kijk TV</text>
	<text lang="FR">Regarder la TV</text>
	<text lang="DE">Fernsehen</text>
	<text lang="DK">Se TV</text>
	<text lang="PT">Ver TelevisA~£o</text>
	<text lang="SV">Se pa* TV</text>
	<text lang="JA">TV放送</text>
	<text lang="FI">Katso TV:ta"</text>
	<text lang="ZH_TW">觀看電視</text>
	<action>TV_WATCH_LIVE</action>


ソースの修正

対応する翻訳がtsファイルになかったり、表示が????となる場合はおそらくソースを修正しなければなりません。

基本的なことを紹介します。大体これでいけると思いますがあとは感と経験です。 せっかくソースが手に入るので触ってみましょう。分からなくなったら元に戻せばいいだけです。^^)

注意点
  • データベースにはUTF-8で持っています。内部はUCS-2です。
  • なるべくそのコードがなぜそうなっているのかを十分に理解してから修正してください。思わぬところに副作用が出たりしますので。
  • あとデバッグ(確認)は十分にしてください。(めんどくさいけどね)

参考サイト

Qtの国際化の方法はKDE-2 アプリの国際化の方法でも解説されているので参考にしてください。

QObject::tr

tsファイルに目的のメッセージがないときはQString::trが抜けているときがあります。 tsファイルはQObject::trを元に作成するのです。そのときはQObject::trをつけましょう

QObject::trをつけるときはそのクラスでQ_OBJECTを宣言していればtrだけでいいですがもしない場合はQObject::trと記述してください

この変更をしたあとi18nディレクトリでlupdateを実行するとtsファイルが更新されますlinguistで翻訳して Releaseするかlreleaseを実行してqmファイルをインストールすれば翻訳された文字が表示されます。


QString msg = "hello";
QString msg2;

msg2.sprintf("hello %s", name);

// これを次のように直す

QString msg = tr("hello");
QString msg2;

msg2 = tr("hello %1").arg(name);

QString::ascii QString::latin1

KDE-2 アプリの国際化の方法 にもあるとおりasciiやlatin1とあるところを見つけます。 それをutf8やlocal8Bitにまたはasciiやlatin1と取り除くかをします。 ただ日付など絶対latin1しかこないところは変更しなくてもいいです。というか変更しないでおきましょうデバッグの手間が増えます。

utf8を使うときはほとんどデータベースのクエリーに使用する時です。

local8Bitを使うときはVERBOSEの中で使用するデバッグメッセージのようにコンソールやログに向けてのメッセージはlocal8Bitを使ってローカルのエンコードにします。Qtが自動的にEUCやUTF-8に変換します。

asciiやlatin1を取るときはその後段でutf8やlocal8Bitを使用するときは取り除きます。

QString::fromUtf8

データベースのクエリーの値を受け取るときにUTF-8からUCS-2に変換するためにQString::fromUtf8を使います。

QSqlQuery query = db->exec("select title from recorded");
QString value = query.value(0).toString();

// 大体こうなっているので下のように直す

QString value = QString::fromUtf8(query.value(0).toString());

QString::sprintf

今までやってきてQString::sprintfは使わないほうがいいです。うまくいかないことがあります。 日本語でうまくいってもドイツ語のウムラウトがうまく処理できないことがありました。 QString::sprintfを使わなくても10こまでのパラメータならQString::argで代用できます。 10を超えるクエリーを扱うときはQSqlQuery::prepare QSqlQuery::bindValueを使います。

QString querystr;

querystr.sprintf("delete from recorded where title='%s'", title.ascii());

QSqlQuery q;
q.exec(querystr);

// これを下記のようにする
QString querystr;

querystr = QString("delete from recorded where title='%1'").arg(title.utf8());

QSqlQuery q;
q.exec(querystr);


// このやり方だと値が10を超えると対応できないのでそのときはprepare bindValueを使う
QSqlQuery q;
q.prepare("delete from recorded where title=:TITLE");
q.bindValue(":TITLE", title.utf8());
q.exec();


パッチを作る

翻訳が終わったらみんなが使えるようにパッチを作ってmythtv-devのmlに サブジェクトを"[patch][i18n] japanese translation"などとして送れば何か返事をくれると思います。 結構あとで返事がくることも有るのであせらずに待っててください。 あと私に送ってもらってもmlに送ります。

翻訳したパッチを作成するには下記のようにします。

$ cd mythtv
$ cvs diff -u > mythtv.patch

その他詳しいcvsの使い方は他のサイトを辺を参考にしてください。