2010-11-17 42 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)