8

Interface Builder を使用して構築された XIB インターフェイス ファイルを含む XCode プロジェクトがあります。を使用ibtoolして文字列を抽出し、翻訳し、ibtool再度 を使用してローカライズされた XIB ファイルを構築することで、ローカライズされた XIB ファイルを構築しています。

ただし、これを行うと、完全に標準的なもの (ファイル、保存、開く、最小化など) を含む、アプリケーション メニューのすべての項目を翻訳する必要があります。それを回避する方法はありますか?

4

4 に答える 4

2

私はこの問題の解決策を開発しました。

https://www.corecode.io/index_opensource.html

"Translator" を探してください。MainMenu.strings ファイルは、標準のメニュー項目文字列の標準的な Apple 翻訳を使用して、多数の言語に翻訳されます。

Aapple の基本アプリに含まれている文字列や言語が不足している場合は、パッチを送ってください。

于 2014-01-20T16:45:47.393 に答える
1

したがって、明らかにこれを回避する方法はありません。

于 2010-11-27T20:04:34.217 に答える
0

しばらくの間、同様のソリューションを探していましたが、このリソースを見つけました

http://www.bdunagan.com/2009/03/15/ibtool-localization-made-easy/

記事の最後に次のように引用します。

ibtool は MainMenu.xib を調べて、ユーザーに表示されるすべての文字列を探し、関連付けられた ObjectID を持つその文字列を MainMenu.strings に挿入します。これは基本的に、ObjectID によってキー付けされた文字列の辞書です。さらに良いことに、ツールはそれらを ObjectID でソートするため、バージョン管理された .strings ファイルはうまく比較できます。どの文字列が追加、削除、または変更されたかを簡単に確認できます。これは信じられないほど便利なので、繰り返しましょう: .strings ファイルはよく比較されます! もちろん、これらの .strings ファイルは Unicode なので、grep できません。以下は、文字列の出力の例です。

先に進んで見てください。それが私を助けたのと同じくらいあなたを助けてくれることを本当に願っています!

于 2010-11-26T23:49:09.180 に答える
0

https://github.com/core-code/MiscApps/blob/master/Translator/Translator/MainMenuTranslations.plistによる翻訳者 はクールですが、ビルドで 30 個の MainMenu.string ファイルを処理したくない場合 (私は個人的には't) - MainMenuTranslations.plist をリソースに追加するだけで (圧縮されていない 230KB は小さい)、次のようにオンザフライで実行できます。

- (void) processMenu: (NSString*) app {
    NSDictionary* d = [self loadMenuTranslations: app];
    NSMenu* mm = NSApplication.sharedApplication.mainMenu;
    for (int i = 0; i < mm.numberOfItems; i++) {
        NSMenuItem* mi = [mm itemAtIndex: i];
        mi.title = [self translateMenu: mi.title withDictionary: d];
        NSMenu* sm = [[mm itemAtIndex: i] submenu];
        sm.title = [self translateMenu: sm.title withDictionary: d];
        for (int j = 0; j < sm.numberOfItems; j++) {
            NSMenuItem* mi = [sm itemAtIndex: j];
            mi.title = [self translateMenu: mi.title withDictionary: d];
        }
    }
}

- (NSString*) translateMenu: (NSString*) key withDictionary: (NSDictionary*) dictionary {
    for (NSString* lang in dictionary) {
        NSDictionary* translation = dictionary[lang];
        NSString* t = translation[key];
        if (t != null) {
            return t;
        }
    }
    return key;
}

- (NSDictionary*) loadMenuTranslations: (NSString*) app {
    NSArray* langs = [NSUserDefaults.standardUserDefaults objectForKey: @"AppleLanguages"];
    NSURL* url = [NSBundle.mainBundle URLForResource:@"MainMenuTranslations.plist" withExtension: null];
    NSMutableDictionary* r = NSMutableDictionary.new;
    NSDictionary* translations = [NSDictionary dictionaryWithContentsOfURL: url];
    for (NSString* lang in langs) {
        NSString* locale = [NSString stringWithFormat:@"%@.lproj", lang];
        NSDictionary* translation = translations[locale];
        NSMutableDictionary* d = [NSMutableDictionary.alloc initWithCapacity: translations.count * 3 / 2];
        for (NSString* k in translation) {
            NSString* v = translation[k];
            NSString* key = k;
            if ([k indexOf: @"APPLICATIONNAME"] >= 0) {
                key = [k stringByReplacingOccurrencesOfString: @"APPLICATIONNAME" withString: app];
            }
            if ([v indexOf: @"APPLICATIONNAME"] >= 0) {
                v = [v stringByReplacingOccurrencesOfString: @"APPLICATIONNAME" withString: app];
            }
            d[key] = v;
        }
        if (d.count > 0) {
            r[lang] = d;
        }
    }
    return r;
}

から呼び出すだけです

- (void) applicationDidFinishLaunching: (NSNotification*) n {
    // ...
    [self processMenu: @"<your app name>"];
}

UniversalTranslation.plist がどこかにあるといいのですが (translate.google.com をクリエイティブに使用することで自動的に収集される可能性があります)。

于 2014-09-28T02:49:55.973 に答える