代码之家  ›  专栏  ›  技术社区  ›  F'x

避免在XCode项目中转换标准菜单项

  •  5
  • F'x  · 技术社区  · 14 年前

    我有一个XCode项目,使用interface Builder构建XIB接口文件。我正在使用 ibtool 提取字符串,翻译它们,并使用 ibtool公司 再次生成本地化的XIB文件。

    但是,这样做意味着我必须转换应用程序菜单中的所有项,包括那些完全标准的项(文件、保存、打开、最小化等)。有办法避免吗?

    4 回复  |  直到 14 年前
        1
  •  2
  •   user1259710    7 年前

    我已经找到了解决这个问题的办法。

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

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

    如果你发现一些字符串或语言丢失,苹果已经包括在他们的基础应用程序,请发送一个补丁。

        2
  •  1
  •   F'x    14 年前

    所以,显然没办法。

        3
  •  0
  •   austinbv    14 年前

    我已经寻找类似的解决方案有一段时间了,我找到了这个资源

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

    文章结尾引用了:

    iBooT将通过MainMenu.xib查看每个用户可见的字符串,并将相关联的Objd的字符串插入到MeMeNUU字符串中,基本上是由ObjectID键入的字符串字典。更好的是,该工具按ObjectID对它们进行排序,因此版本化的.strings文件很难区分。我可以很容易地看到添加、删除或刚刚更改的字符串。让我重复一遍,因为它非常方便:。字符串文件差异好!当然,这些.strings文件是unicode的,所以它们是不可存储的。以下是字符串输出的示例:

    去看看吧,我真的希望它能像帮助我一样帮助你!

        4
  •  0
  •   Leo    10 年前

    翻译人员 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>"];
    }
    

    我希望在某个地方有一个universaltransation.plist(可能可以通过创造性地使用translate.google.com自动收集)