Вопрос

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

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

Это было полезно?

Решение 2

Так что, по-видимому, никто не об этом.

Другие советы

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

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

Ищите «переводчик», он переведет файл Mainmenu.Strings на дюжину языки со стандартными трансляциями Apple для стандартных строк элемента меню.

Если вы обнаружите, что некоторые строки или языки отсутствуют, что AAPPLE включен в их базовые приложения, отправьте патч.

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

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

Это цитирует к концу статьи:

iBtool будет просматривать MainMenu.xib для каждой видимой пользователем строки и вставьте эту строку с помощью связанного объекта в Mainmenu.Strings, по сути, по существу, ключевой словарь строк. Даже лучше, инструмент сортирует их по ObjectID, поэтому файлы версий. Я могу легко увидеть, какие строки добавлены, удалены или просто изменились. Позвольте мне повторить это, потому что это так невероятно удобно: .Strings Files разграничивать хорошо! Конечно, эти файлы .Strings - это Unicode, поэтому они не Greepable. Ниже приведен пример вывода для строки:

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

Переводчик https://github.com/core-code/miscapps/blob/master/translator/translator/mainmenutranslations.plistэто круто, но если вы не хотите иметь дело с 30 основными файлами MainMenu.String в вашей сборке (я лично не) - вы можете просто добавить Mainmenutrutranslations.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>"];
}

Я желаю, что есть универсалттрансляция. Пожалуйста, где-то (что может быть, вероятно, собрано автоматически через творческое использование Translate.Google.com)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top