2015年02月23日

Xcodeでソースコードの行番号を表示する方法

Xcode 6.1.1での話です。

メニューの「Xcode > Preferences... 」で表示した環境設定パネルのTextEditタブ。
「line numbers」にチェックを入れる。

xcode_line_number.png

これでテキストエディタの左側に行番号を表示する。

xcode_line2.png
ラベル:Xcode
posted by 永遠製作所 at 22:04| 東京 ☔| Comment(0) | TrackBack(0) | iPhone/iPod touch | このブログの読者になる | 更新情報をチェックする

2015年02月22日

ローカライズが反映されない (2)

昨日のはXcodeの問題でしたが、意外とあるのが自分のミスでローカライズが反映されないこと。

開発の初期とにかく動くか確認しながら実装する時に、「仮」実装のつもりで文字列をソースコード中に埋め込んで置く。そして本格的に実装する時に、NSLocalizedString()で書き換えるのだが、それを忘れることがある。

はじめからNSLocalizedString()でローカライズする準備が出来ている文字列は、Localizable.stringsファイルに入っているので忘れずに各国語に翻訳できるが、それをしなかった文字列は忘れられる。実際に動作させて確認するときにも、テストケースが各文字列リソースが正しく表示されているかどうかという視点で作ると、そのテストケースに入らなかった文字列は確認できない。ちゃんと全画面、全機能を全言語に対して実行しなければならない。

同じような間違いだが、GUI上のUILabelの文字列をコードで設定するようにしていた。これはカスタムのUITextFieldCellでラベル部分の文字列は当然行によって違うのでコードで設定するしかない。

ところが、試しに実装してみようと思ってやっぱりNSLocalizedString()を使わずに、ソースコード中に直接表示する文字列を書いてしまった。だが、実装を進めるうちにそのセルは1回しか使わない。他の行ではまた別のカスタムセルを使うことになったのだ。

実装が終わって、国際化するときにカスタムセルは1箇所でしかつかっていないので最初に外部から文字列を設定するという設計を忘れてしまい。xibファイルを国際化してしまう。そして作られた.stringsファイルを翻訳。だが、全然表示が変わらない。昨日書いた方法でクリーンビルドしても変わらない。おかしいなあ、おかしいなあ。と思っていると、直接UILabelに文字列を設定しているコードを見つけるというわけだ。

途中で設計や実装方針が変わったせいもあるが、結局のところ仮実装だろうがなんだろうが、GUIやファイルなど外部に出力する可能性のある文字列をプログラムコード中に各場合には手を抜かず必ずNSLocalizedString()を経由する。後で忘れてしまう可能性があるし、全体を探す手間もあるし。これを徹底すれば今回のような翻訳し忘れは起こらない。

これにつきる。

Localizable.stringsにも転記する手間を考えたら、2カ所入力する手間がかかると思うかもしれないが、NSLocalizedString()はもしLocalizable.stringsファイルに対応する文字列がなければ第一引数そのものを返すので、場合によってはLocalizable.stringsファイルへは何も書く必要がない。

翻訳し忘れるかも?NSLocalizedString()関数が使われている箇所を抽出することはそれほど難しくないので、忘れた文字列があるかどうかはすぐに見つけ出せる。

Appleが提供している genstrings というコマンドを使うとソースコードから簡単に.stringsファイルを作成できる。

$ genstrings *.m


上記コマンドはカレントディレクトリにあるObjective-Cソースコード中のNSLocalizedString()から文字列を抽出して、カレントディレクトリにLocalized.stringsというファイルを作って書き出してくれる。

なお、私は時々

NSString *aString;
if ( flag ) {
aString = @"on";
} else {
aString = @"off";
}
return NSLocalizedString(aString, nil);


みたいなコードを書いてしまうことがあるのだが、こういうのは抽出できない。それにコメントもちゃんと書いておかないと抽出したファイルでの文字列の用途がわからないので翻訳を他の人に依頼する場合などに困ってしまう。だから上記例のnilもよくない。
posted by 永遠製作所 at 16:29| 東京 ☁| Comment(0) | TrackBack(0) | iPhone/iPod touch | このブログの読者になる | 更新情報をチェックする

2015年02月21日

ローカライズが反映されない


アプリケーションの初期開発時。UI実装は1言語でのみ行いある程度実装が終わってから、他言語対応をすると思います。

xibまたはstoryboardを国際化して、ローカライズstringsファイルの文字列を翻訳。そしてビルドして実行。ところが、なぜかローカライズ文字列が反映されないことがあります。

シミュレータなどのデバッグ用のビルドでは、コンパイルしたあとオブジェクトファイルを中間作業フォルダからアプリケーションバンドル内に複製するときにアプリケーションバンドル内にあるファイルに上書きする形で複製している。

このため、国際化したxibまたはstroyboardファイルと、国際化していない同じファイルが別々に存在してしまう。アプリケーション実行時にこの国際化していない古いGUIファイルを読み込んでしまうため、ローカライズしたものを使ってくれない。

この場合の対処方法は、いったんクリーンビルドすること。そして再度ビルド&実行。これでいけるはずなんだけど、シミュレータに複製するときにも上書きコピーするようなので、シミュレータ内のアプリも削除しておくことが必要。
ラベル:IOS デバッグ Xcode
posted by 永遠製作所 at 15:59| 東京 ☀| Comment(0) | TrackBack(0) | iPhone/iPod touch | このブログの読者になる | 更新情報をチェックする

2015年02月15日

[iOS] Unable to run app in Simulator

開発中に突然エラーに遭遇。


Unable to run app in Simulator

An error was encountered while running (Domain = FBSOpenApplicationErrorDomain, Code = 4)


error1.png

Xcodeでビルドに成功しているし、前日までは普通に実行できているのにシミュレータでの実行に失敗するようになってしまった。原因がわからないが、とりあえずクリーン(Product > Clean)してみたが、結果は同じ。

そこで今度はシミュレータのほうをリセット(iOS Simulator > Reset Content and Settings...)する。

error2.png

これでなんとか実行できるようになった。

シミュレータ内部のデータに不整合ができてしまって実行できなくなっていたよう。シミュレータのリセットをすると、それまでアプリで使ったデータが消えるなど影響があるが、シミュレータ内にあるのでデバッグ中のデータなのでいつ消えても大丈夫なようになっている。
ラベル:IOS デバッグ
posted by 永遠製作所 at 17:34| 東京 ☀| Comment(0) | TrackBack(0) | iPhone/iPod touch | このブログの読者になる | 更新情報をチェックする

2015年02月08日

バイナリ形式プロパティリストを読むために

Xcodeではソースコードの他に、nibファイルや設定ファイルもコンパイルされてバイナリ形式のファイルに変換されてしまう。

実行形式のアプリケーションの中身が適切なものになっているかどうか確認する必要があるとき実装時のテキスト形式のままであればテキストエディタで開いて中を見ればそれだけですむので楽なのだが、コンパイルされてしまっているのでちょっと工夫が必要。

ターミナルで実行できるコマンドがある。plutilだ。


$ plutil -convert xml1 Localizable.strings
$ plutil -convert binary1 Localizable.strings


上でバイナリ形式のファイルをXML形式に変換。下で元に戻している。

注意事項としてこのコマンドは上記の方法だと対象とするファイルを直接書き換える。だからファイルを変更したくないときにはファイルを別の場所に複製して行うか、下記のように出力ファイルを指定する。


$ plutil -convert xml1 Localizable.strings -o Localizable.xml


なお変換可能な形式は

  • XML形式…xml1

  • バイナリ形式…binary1

  • JSON形式…json


の三つ。

上記のように確認したかったのはstringsファイルなので本当はstringsファイル形式のほうがよかったのだけど、ないので仕方なくXMLバージョン1形式に変換した。

他のProperty Listでももちろん使用可能。
posted by 永遠製作所 at 20:20| 東京 🌁| Comment(0) | TrackBack(0) | iPhone/iPod touch | このブログの読者になる | 更新情報をチェックする
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。