日本国内専用アプリだとどうしようもないことがわかっているし、せっかく世界中で販売できる環境なんだからやっぱりそうしたい。
でも、ローカライズするのって難しい、、、というかその言語を知らないから無理です。
機械的に翻訳した表現が無茶なのはわかっているけど、仕方なく使ってて、結局海の向こうのユーザーから「あんたのドイツ語はむちゃくちゃだから直すか、英語で表示せえや、ゴラァ!」って英文メールを頂いたりしております。
特にGoogle翻訳なんかで難しそうなのが文章よりも、見出しのような短い表現。
アプリで言えばボタンやタイトルのような部分。
無駄に長くなってもダメですしね。
でも、よく考えたらもともとフレームワークでボタンに使っている表現はiPhoneの言語設定変えたら表示されるやん、これ使えばいいんじゃね?
ということで、やってみました。
ほら、ナビゲーションバーの左右にボタンを設定できるじゃないですか。
こういうやつ :

この"Done"って文字を取得したいわけです。
このボタンを表示するにはコードはこんな感じ :
UIBarButtonItem *doneButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(hoge)];
self.navigationItem.rightBarButtonItem = doneButtonItem;
ところが、コードにあるようにこのボタンってUIButtonクラスのオブジェクトではありません。
リファレンスのUIBarButtonSystemItemのところを見ると、これで表示できるのはこのようなDoneやCancelボタンだけでなく、画像なんかもありますからねえ。

ということで、簡単には文字列を取得させてくれません。
仕方ないので、ナビゲーションバーの構造(下にどんなビューがあるか)を調べてみました :
NSLog(@"self.navigationController.view");
for (UIView *subview1 in self.navigationController.view.subviews) {
NSLog(@"- %@",[[subview1 class] description]);
for (UIView *subview2 in subview1.subviews) {
NSLog(@"-- %@",[[subview2 class] description]);
for (UIView *subview3 in subview2.subviews) {
NSLog(@"--- %@",[[subview3 class] description]);
for (UIView *subview4 in subview3.subviews) {
NSLog(@"---- %@",[[subview4 class] description]);
}
}
}
}
結果はコレ :

見たことないクラスが出てきますが、名前から予想するに、subview4は不要そう。
UIButtonLabelクラスってのがそれっぽそうかも?
ってことで、このUIButtonLabelの親クラスを調べてみます :
NSLog(@"self.navigationController.view");
for (UIView *subview1 in self.navigationController.view.subviews) {
NSLog(@"- %@",[[subview1 class] description]);
for (UIView *subview2 in subview1.subviews) {
NSLog(@"-- %@",[[subview2 class] description]);
for (UIView *subview3 in subview2.subviews) {
NSLog(@"--- %@",[[subview3 class] description]);
if ([[[subview3 class] description] isEqualToString:@"UIButtonLabel"]) {
NSLog(@"superclass of UIButtonLabel is %@",[[subview3.superclass class] description]);
}
}
}
}
下の結果にあるように、この親はUILabelクラスです! :

ということで、オブジェクトをUILabelにキャストして、"text"プロパティからめでたく文字列を取得することができました。
ローカライズ用の"Localizable.strings"ファイルにコピペで完了!
参考にいくつか紹介すると、、、
英語 :
"button_done" = "Done";
"button_cancel" = "Cancel";
"button_edit" = "Edit";
"button_save" = "Save";
"button_send" = "Send";
日本語 :
"button_done" = "完了";
"button_cancel" = "キャンセル";
"button_edit" = "編集";
"button_save" = "保存";
"button_send" = "送信";
中国語 :
"button_done" = "完成";
"button_cancel" = "取消";
"button_edit" = "编辑";
"button_save" = "存储";
"button_send" = "发送";
タイ語 :
"button_done" = "เสร็จ";
"button_cancel" = "ยกเลิก";
"button_edit" = "แก้ไข";
"button_save" = "บันทึก";
"button_send" = "ส่ง";
"Done"、"Cancel"、"Edit"、"Save"はUIBarButtonSystemItemより上記の方法で取得しました。
最後にある"Send"はメール送信時に使うMFMailComposeViewControllerクラスに表示されるボタンから同様の方法で取得しました :

とりあえず、ボタンの表現に関してはこれでクレームは来ないかな?!