避免在XCode项目中翻译标准菜单项

时间:2010-11-17 15:31:05

标签: xcode localization interface-builder ibtool

我有一个XCode项目,使用Interface Builder构建了XIB接口文件。我正在构建本地化的XIB文件,方法是使用ibtool提取字符串,翻译它们,然后再次使用ibtool来构建本地化的XIB文件。

但是,这样做意味着我必须翻译应用程序菜单中的所有项目,包括完全标准的项目(文件,保存,打开,最小化等)。有没有办法避免这种情况?

4 个答案:

答案 0 :(得分:2)

我已经为这个问题找到了解决方案。

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

寻找“翻译器”,它会将您的MainMenu.strings文件翻译成十几种语言,标准的Apple翻译为标准菜单项字符串。

如果您发现Aapple已在其基本应用中包含某些字符串或语言,请发送补丁。

答案 1 :(得分:1)

所以,显然没办法解决这个问题。

答案 2 :(得分: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'able。下面是字符串输出的示例:

继续看一看,我真的希望它能帮助你,就像它帮助我一样!

答案 3 :(得分:0)

翻译https://github.com/core-code/MiscApps/blob/master/Translator/Translator/MainMenuTranslations.plist 很酷,但如果你不想在你的构建中处理30个MainMenu.string文件(我个人没有) - 你可以只将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自动收集)