2010-11-17 30 views
5

Tôi có một dự án XCode, với các tệp giao diện XIB được xây dựng bằng cách sử dụng Trình tạo giao diện. Tôi đang tạo các tệp XIB được bản địa hóa bằng cách sử dụng ibtool để trích xuất các chuỗi, dịch chúng và sử dụng lại ibtool để tạo các tệp XIB được bản địa hóa.Tránh dịch các mục menu chuẩn trong dự án XCode

Tuy nhiên, làm điều này có nghĩa là tôi phải dịch tất cả các mục trong menu ứng dụng, bao gồm cả các mục hoàn toàn chuẩn (Tệp, Lưu, Mở, Thu nhỏ, v.v.). Có cách nào để tránh điều đó không?

Trả lời

1

Vì vậy, dường như không có cách nào khác.

0

Tôi đã được tìm kiếm một giải pháp tương tự trong một thời gian và tôi thấy khu vực này

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

Nó trích về phía cuối bài viết:

ibtool sẽ xem xét thông qua MainMenu. xib cho mọi chuỗi hiển thị của người dùng và chèn chuỗi đó với một ObjectID được liên kết vào trong MainMenu.strings, về cơ bản là một từ điển các chuỗi được khóa bởi ObjectID. Thậm chí tốt hơn, công cụ sắp xếp chúng theo ObjectID, vì vậy các tệp .strings được phiên bản rất khác biệt. Tôi có thể dễ dàng thấy những chuỗi nào được thêm vào, xóa hoặc chỉ thay đổi. Hãy để tôi lặp lại điều này bởi vì nó vô cùng tiện dụng: các tệp .strings cũng khác! Tất nhiên, các tệp .strings này là unicode, vì vậy chúng không thể grep. Dưới đây là ví dụ về đầu ra cho một chuỗi:

Hãy tiếp tục và xem tôi thực sự hy vọng nó giúp bạn nhiều như nó đã giúp tôi!

+0

Tôi sợ bạn hiểu nhầm vấn đề của mình: Tôi đã sử dụng ibtool để duy trì bản dịch. Tuy nhiên, điều này không giải quyết được vấn đề không muốn dịch tất cả các mục menu chuẩn của ứng dụng (Sao chép, Dán, v.v.). –

+0

Ah, tôi ước tôi có thể giúp đỡ nhiều hơn. – austinbv

2

Tôi đã phát triển một giải pháp cho vấn đề này.

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

nhìn cho "Translator", nó sẽ dịch MainMenu.strings của bạn tập tin vào một chục ngôn ngữ với các bản dịch của Apple tiêu chuẩn cho các chuỗi mục trình đơn tiêu chuẩn.

nếu bạn thấy một số chuỗi hoặc ngôn ngữ bị thiếu mà Aapple đã bao gồm trong ứng dụng cơ sở của họ, vui lòng gửi bản vá.

+0

lưu ý rằng tất cả 32 ngôn ngữ mà Mac OS X đi kèm đều được hỗ trợ. "cơ sở dữ liệu" chính của nó ở đây, các bản vá chào mừng: https://github.com/core-code/MiscApps/blob/master/Translator/Translator/MainMenuTranslations.plist – user1259710

+0

Rất tiện dụng, cảm ơn user1259710!Hãy hy vọng Xcode 6 làm cho tất cả điều này dễ dàng hơn theo mặc định cho các nhà phát triển không phải tiếng Anh… – wdyp

+0

"Cửa sổ" bị thiếu cho nhiều ngôn ngữ (không phải tất cả). – Leo

0

Dịch bởi https://github.com/core-code/MiscApps/blob/master/Translator/Translator/MainMenuTranslations.plist thật tuyệt nhưng nếu bạn không muốn xử lý 30 tệp MainMenu.string trong bản dựng của mình (cá nhân tôi không) - bạn chỉ có thể thêm MainMenuTranslations.plist vào tài nguyên của mình (230KB không nén là nhỏ) và làm điều đó một cách nhanh chóng như thế này:

- (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; 
} 

chỉ cần gọi nó từ

- (void) applicationDidFinishLaunching: (NSNotification*) n { 
    // ... 
    [self processMenu: @"<your app name>"]; 
} 

tôi muốn có một UniversalTranslation.plist ở đâu đó (có thể có thể thu thập tự động qua sử dụng sáng tạo của translate.google.com)

Các vấn đề liên quan