0

すべての言語に文字列ファイルやローカライズされた xib ファイルを作成して、プログラムをローカライズしてきました。ローカライズされたすべての xib ファイルを維持し、インターフェイスに新しい機能を追加するのは複雑であるため、このプロセスは非常に時間がかかります。

これを回避するために、私の最新のプロジェクトでは、インターフェイス上のすべての UI 要素に対して IBOutlets を作成し、文字列ファイル-(void)awakeFromNibを使用してすべての要素のタイトルと文字列値を変更しました。NSLocalizedString

複数のxibを作成したり、「それらを同期させておく」ために時間を無駄にしたりする必要なく、すべてのUIを一括変換するより効率的な方法は他にありますか?

これを解決するためのアイデアが 1 つあります。次のような NSObject のカテゴリを作成しました。

@implementation NSObject (Localizable)

-(void)awakeFromNib {

    if ([self isKindOfClass:[NSTextField class]]) {
        NSTextField *txtField = (NSTextField *)self;
        txtField.stringValue = NSLocalizedString(txtField.stringValue, nil);
    }

    else if ([self isKindOfClass:[NSWindow class]]) {
        NSWindow *windowC = (NSWindow *)self;
        windowC.title = NSLocalizedString(windowC.title, nil);
    }

}

@end

私のカテゴリでわかるようにNSTextField、翻訳プレースホルダーをNSTextFieldテキストとして保持することで、アプリケーションのすべてのオブジェクトの値を簡単に変更できます...

これは問題なく動作しますが、アプリケーション内のすべてのオブジェクトに対して実行されるため、パフォーマンスが心配です。

これをするのは悪いことですか?より良い代替手段はありますか?

PS: 私はNSObjectand not NSTextFieldorのカテゴリを作成しました。これは、新しいカテゴリを作成する代わりにNSWindow、すべてのローカリゼーション ロジックを 1 か所に保持し、else if翻訳する可能性のあるすべての UI クラスに別のステートメントを追加するだけで済むためです。

4

1 に答える 1

1

ibtoolxib ファイルの管理に使用します。これは、Xcode と共にインストールされるコマンドライン ツール パッケージの一部です。Xcode は文字列を編集するための GUI を提供しますがibtool、スクリプトから実行できます。

全体として、Apple には xib ファイルを維持するためのガイドラインとアドバイスがいくつかあります。ドキュメントはこちらにあります。読んでみると、ibtoolかなり使いやすいことがわかります。

あなたが取ったアプローチは印象的です (私は、ローカリゼーションを実行するためだけにすべてのUI 要素が IBOutlet に接続されている本当にひどいものを見てきました!)、それは依然として維持しなければならない追加のグルー コードになります。 (そして、私を信じてください、あなたのニーズが変化するにつれてそれを維持することになります)。

したがって、私の 2 つの通貨単位に関する限り、ローカライズされたニブに固執することをお勧めします。

于 2013-07-02T02:38:12.990 に答える