2009年3月28日土曜日
2009年3月27日金曜日
2009年3月26日木曜日
ローカライズ(その9)
今回マージ作業をやってみて、実際の運用では気を付ける点がいくつかあることがわかった。
(1) 前回ローカライズした時点のNibファイルをすべて取っておく
ibtool によるマージは旧バージョンと新バージョンの Nibの差分情報を使う。この為、前回ローカライズを行った時全言語の Nibファイルを取っておく必要がある。これを忘れるとマージができない。
(2) 英語Nibファイルに追加された文字列を用意する
英語Nibファイルに変更を入れた後、翻訳用に文字列(例:MainMenu.strings)を生成する。この中で追加があったものだけを抽出してから翻訳を行う。前回の検証ではこの差分抽出は手作業で行った。
ibtool のマージ(--localize-incrementalオプション)のルールは ADCのドキュメントに書かれている。これに目を通しておくと引数で渡すファイルの役割がよく理解できる。
Interface Builder User Guide > Localization
Performing Incremental Localization Updates
ルールは次の通り(英文内のFrenchは「日本語」と置きえた)。
1. 新英語NIBファイルをコピーして新日本語NIBファイルとする。
2. 新英語NIBファイルと、旧英語NIBファイルを比較する。
a) 新旧変更が無いものについては、旧日本語の文字列を、新NIBファイルへ適用する。
b) もし新英語NIBファイルに存在して、旧英語NIBファイルに存在しない場合は、何もしない。
(つまり、1.でコピーした時の英語の文字列が新日本語NIBに残る)
c) もし旧英語NIBファイルに存在して、新英語NIBファイルに存在しない場合は、何もしない。
(項目が削除された場合に起こる。この項目は新NIBには含まれないので問題ない)
3. 日本語文字列(*.strings)を新日本語NIBファイルへ適用する。
(ここで 2-b) の新規文字列を置換する)
図で書くとこんな感じ。





多少は手間がかかるが(特に追加文字列の抽出)、今後の運用・保守のメドが立ったのでこの方法を使っていくことにしよう。
- - - -
引越やら何やらで作業進まず。
3月中リリースはちょっと無理かもしれない。
(プログラムはほぼ出来ているのだが翻訳やホームページ作成が間に合わない。。)
2009年3月25日水曜日
ローカライズ(その8)
ibtool を使ってマージを試してみる。
※以下、拡張子が xib だが Nibファイルと統一して呼ぶ。またターミナルの操作はすべてXcodeプロジェクトのフォルダ内で行った。
1. まず修正を入れる前に最後のバージョンをコピーしておく。ここでは old フォルダへ English.lproj と Japanese.lproj をコピーする。
$ mkdir old
$ cp -pr English.lproj old
$ cp -pr Japanese.lproj old
$ ls old
English.lproj MainMenu.strings MainMenu.xib
$
2. コピーしたら Nibファイルに修正を加えてみる。ここでは Interface Builder で英語の Nibファイルにラベル "Hello !" を追加する。

3. 英語の Nibファイルから文字列を抽出する。
ibtool --generate-stringsfile Japanese.lproj/MainMenu.strings \
English.lproj/MainMenu.xib
ラベル "Hello !" が最後に追加されている。文字列を再生成したので前回翻訳した "Japan"は英語に戻っている。

4. このファイルを編集して "Hello !"の行だけ残すようにする。

5. 準備ができたのでマージしてみよう。ADCページの例を参考にして用意した下記のコマンドを実行する。
ibtool --previous-file old/English.lproj/MainMenu.xib \
--incremental-file old/Japanese.lproj/MainMenu.xib \
--strings-file Japanese.lproj/MainMenu.strings \
--write Japanese.lproj/MainMenu.xib \
--localize-incremental \
English.lproj/MainMenu.xib
6. 日本語の Nibファイルを Interface Builder で開いてみる。

おお、"Hello" が "こんにちは"に置き換わっている。ただラベルサイズが不足しているので途中で切れている。
7. 手動でサイズを拡張してやる。

8. 最後にXcodeでビルドして実行してみる。

出た。
2009年3月24日火曜日
ローカライズ(その7)
Interface Builder User Guide: Localization - Localizing Your Nib File’s Content にPerforming Incremental Localization UpdatesというローカライズされたNibのアップデート方法についての説明がある。
これによれば差分をマージしてNibをアップデートできるとのこと。
ibtool に --localize-incremental オプションを指定する。
- - - -
今日も時間切れ。明日は実際に試したい。
2009年3月23日月曜日
ローカライズ(その6)
HK さんよりInterfaceBuilderを使ったローカライズ方法について情報をもらったのでこれを試してみる(情報ありがとうございました)。
Interface Builder User Guide: Localization
検証用に簡単なプロジェクトを作成して試してみる。
まずは先日のおさらいから。
単純なウィンドウを一つ用意して、この英単語を日本語にローカライズする。
(1) Nib(xib)ファイルからローカライズ用文字列ファイルを生成する。
ibtool --generate-stringsfile English.lproj/MainMenu.strings \
English.lproj/MainMenu.xib
(2) English.lproj/MainMenu.strings をプロジェクトへ追加する
(3) ローカリゼーション(Japanese)を追加する
(4) Japanese.lproj/MainMenu.strings を修正(翻訳)する
(5) Nib(xib)ファイルを書き出す
ibtool --strings-file Japanese.lproj/MainMenu.strings \
--write Japanese.lproj/MainMenu.xib \
English.lproj/MainMenu.xib
(6) 日本語のNib(xib)ファイルをプロジェクトへ追加する
ここまでの結果プロジェクトの中身はこうなる。

(7) ビルド&実行。日本語が出た。

- - - -
今日は時間切れ。
明日は変更を入れてマージをやってみる。
2009年3月22日日曜日
β版バグ修正 - マルチスクリーン(ウィンドウ-2)
ウィンドウキャプチャ時のボタンの位置がおかしい。
これも座標系の不一致の問題。ボタン位置を指定している箇所に前回用意した #convertFromCGWindowPointToLocal: をかます。
- (void)adjustButtonBar
{
if ([_selected_window_list count]) {
Window* wn = [_selected_window_list objectAtIndex:0];
NSRect rect = [wn rect];
rect.origin = [self convertFromCGWindowPointToLocal:rect.origin];
[_button_bar setButtonBarWithFrame:rect];
[_button_bar2 setButtonBarWithFrame:rect];
[_button_bar startFlasher];
}
}
その他にもウィンドウキャプチャ時にウィンドウを選択しようとしてクリックしても反応が無い。これもマウスクリック時の座標系(ローカル座標系)と内部管理しているウィンドウの座標系(CGWindow座標系)の違いによる。前回作った #convertFromCGWindowPointToLocal: をヒット判定処理に加える。
// (1) search a window on mouse down (already selected)
for (Window* swn in _selected_window_list) {
rect = [swn rect];
rect.origin = [self convertFromCGWindowPointToLocal:rect.origin];
if (NSPointInRect(cp, rect)) {
hit_flag = YES;
selected_window = swn;
break;
}
}
これで直った。

- - - -
内部管理しているウィンドウの座標を使うたびにいちいち変換するのではなく、管理上の座標系自体を CGWindowをやめて ローカル座標系に直した方が良さそうだ(続く)。

