すべての言語に文字列ファイルやローカライズされた 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: 私はNSObject
and not NSTextField
orのカテゴリを作成しました。これは、新しいカテゴリを作成する代わりにNSWindow
、すべてのローカリゼーション ロジックを 1 か所に保持し、else if
翻訳する可能性のあるすべての UI クラスに別のステートメントを追加するだけで済むためです。