2010-11-17 48 views
5

我有一个XCode项目,使用Interface Builder构建XIB界面文件。我通过使用ibtool来提取字符串,翻译它们并使用ibtool来构建本地化的XIB文件来构建本地化的XIB文件。避免在XCode项目中翻译标准菜单项

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

回答

1

所以,显然没有办法解决这个问题。

0

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

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。下面是一个字符串输出的例子:

继续前进,看看我真的希望它能帮助你,尽可能帮助我!

+0

恐怕你误解了我的问题:我已经使用ibtool来维护翻译。但是,这并不能解决不想翻译应用程序的所有标准菜单项(复制,粘贴等)的问题。 – 2010-11-27 08:28:07

+0

啊,我希望我能帮到更多。 – austinbv 2010-11-27 14:31:11

2

我已经开发了一个解决这个问题的方法。

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

找“翻译”,这将会把你的文件MainMenu.strings与标准苹果的翻译标准菜单项串十几种语言。

如果您发现某些字符串或语言缺少Aapple已包含在其基本应用程序中,请发送补丁。

+0

请注意,现在支持Mac OS X所支持的所有32种语言。它的主要“数据库”在这里,补丁欢迎:https://github.com/core-code/MiscApps/blob/master/Translator/Translator/MainMenuTranslations.plist – user1259710 2014-01-20 19:04:30

+0

非常方便,谢谢user1259710!让我们希望Xcode 6使非英语开发人员的默认设置更容易... – wdyp 2014-07-24 00:02:30

+0

多种语言(不是全部)缺少“窗口”。 – Leo 2014-09-28 02:42:59

0

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

称它为我希望有一个UniversalTranslation.plist地方(可以自动可能通过创造性地运用收集translate.google.com)