頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


ナビゲーションバーのボタンの文字列を得る

日本国内専用アプリだとどうしようもないことがわかっているし、せっかく世界中で販売できる環境なんだからやっぱりそうしたい。
でも、ローカライズするのって難しい、、、というかその言語を知らないから無理です。
機械的に翻訳した表現が無茶なのはわかっているけど、仕方なく使ってて、結局海の向こうのユーザーから「あんたのドイツ語はむちゃくちゃだから直すか、英語で表示せえや、ゴラァ!」って英文メールを頂いたりしております。

特にGoogle翻訳なんかで難しそうなのが文章よりも、見出しのような短い表現。
アプリで言えばボタンやタイトルのような部分。
無駄に長くなってもダメですしね。

でも、よく考えたらもともとフレームワークでボタンに使っている表現はiPhoneの言語設定変えたら表示されるやん、これ使えばいいんじゃね?
ということで、やってみました。
ほら、ナビゲーションバーの左右にボタンを設定できるじゃないですか。
こういうやつ :

ナビゲーションバーのボタン

この"Done"って文字を取得したいわけです。
このボタンを表示するにはコードはこんな感じ :

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

UIBarButtonSystemItem

ということで、簡単には文字列を取得させてくれません。
仕方ないので、ナビゲーションバーの構造(下にどんなビューがあるか)を調べてみました :
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クラスです! :

UIButtonLabelの親クラス

ということで、オブジェクトを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クラスに表示されるボタンから同様の方法で取得しました :

送信ボタン

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

<< アプリにレビューが1つ付いてた!  TopPage  AppStoreのレビューページへのリンク >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/507-d3bd49d3




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad