Избегайте перевода стандартных элементов меню в проекте XCode
У меня есть проект XCode с интерфейсными файлами XIB, созданными с использованием Interface Builder. Я строю локализованные файлы XIB с помощью ibtool
извлекать строки, переводить их и использовать ibtool
снова, чтобы построить локализованные файлы XIB.
Однако, делая это, я должен перевести все элементы в меню приложения, включая те, которые являются полностью стандартными (Файл, Сохранить, Открыть, Свернуть и т. Д.). Есть ли способ избежать этого?
4 ответа
Я разработал решение этой проблемы.
https://www.corecode.io/index_opensource.html
поищите "Переводчик", он переведет ваш файл MainMenu.strings на дюжину языков со стандартными переводами Apple для стандартных строк пунктов меню.
если вам не хватает строк или языков, которые Aapple включил в свои базовые приложения, отправьте патч.
Переводчик по https://github.com/core-code/MiscApps/blob/master/Translator/Translator/MainMenuTranslations.plist это круто, но если вы не хотите иметь дело с 30 файлами MainMenu.string в вашей сборке (лично я 't) - вы можете просто добавить 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)
Некоторое время я искал подобное решение и нашел этот ресурс
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. Ниже приведен пример вывода для строки:
Идите и посмотрите, я действительно надеюсь, что это поможет вам так же, как и мне!