我有一个XCode项目,使用界面生成器内置的XIB接口文件。我用ibtool中提取字符串,其翻译,并再次使用ibtool打造本地化的XIB文件建立本地化的XIB文件。

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

有帮助吗?

解决方案 2

因此,解决此显然没有办法。

其他提示

我已经开发了解决这个问题。

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

查找“转换器”,将您的MainMenu.strings文件转换成符合标准的苹果翻译的标准菜单项串十几种语言。

如果你发现一些字符串或语言缺少Aapple已包含在它们的基础应用程序,请在发送补丁。

我一直在寻找一会类似的解决方案,我发现这个资源

http://www.bdunagan.com/2009 / 03/15 / ibtool定位制成易/

有引用朝向物品的端部:

  

ibtool将寻找通过MainMenu.xib为每个用户可见的字符串,并插入该字符串与相关联的ObjectID成MainMenu.strings,本质上是一种通过的ObjectID键控串词典。更妙的是,该工具通过对象ID对其进行排序,所以版本.strings文件是很好的diff'able。我可以很容易地看到字符串被添加的东西,删除,或者只是改变了。让我重复这一点,因为它是如此令人难以置信的方便:.strings文件diff的好!当然,这些.strings文件是unicode的,所以它们不是grep'able。下面是用于输出一个字符串的示例:

来吧,看看我真的希望它可以帮助你就像它帮助我!

翻译由 https://github.com/核心代码/ MiscApps /斑点/主/翻译/转换/ 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的自动收集)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top