Избегайте перевода стандартных элементов меню в проекте XCode - PullRequest
5 голосов
/ 17 ноября 2010

У меня есть проект XCode с файлами интерфейса XIB, созданными с помощью Interface Builder. Я собираю локализованные файлы XIB, используя ibtool для извлечения строк, переводя их, и снова используя ibtool для создания локализованных файлов XIB.

Однако, делая это, я должен перевести все элементы в меню приложения, включая те, которые являются полностью стандартными (Файл, Сохранить, Открыть, Свернуть и т. Д.). Есть ли способ избежать этого?

Ответы [ 4 ]

2 голосов
/ 20 января 2014

Я разработал решение этой проблемы.

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

ищите «Переводчик», он переведет ваш файл MainMenu.strings на дюжину языков со стандартным Appleпереводы для стандартных строк пунктов меню.

, если вы обнаружите, что отсутствуют какие-либо строки или языки, которые Aapple включил в свои базовые приложения, пожалуйста, пришлите патч поверх.

1 голос
/ 27 ноября 2010

Так что, видимо, никак не обойтись.

0 голосов
/ 28 сентября 2014

Translator by https://github.com/core-code/MiscApps/blob/master/Translator/Translator/MainMenuTranslations.plist это круто, но если вы не хотите иметь дело с 30 файлами MainMenu.string в вашей сборке (лично я нет), вы можете просто добавить MainMenuTranslations.plist к своим ресурсам (230 КБ)несжатый - крошечный) и делайте это на лету так:

- (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)

0 голосов
/ 27 ноября 2010

Я некоторое время искал подобное решение и нашел этот ресурс

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.Ниже приведен пример вывода для строки:

Продолжайте и посмотрите, я действительно надеюсь, что это поможет вам так же, как и мне!

...