【问题标题】:Avoid translating standard menus items in XCode project避免在 XCode 项目中翻译标准菜单项
【发布时间】:2011-05-11 11:57:29
【问题描述】:

我有一个 XCode 项目,其中 XIB 接口文件是使用 Interface Builder 构建的。我正在构建本地化的 XIB 文件,方法是使用 ibtool 提取字符串、翻译它们,然后再次使用 ibtool 构建本地化的 XIB 文件。

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

【问题讨论】:

    标签: xcode localization interface-builder ibtool


    【解决方案1】:

    我一直在寻找类似的解决方案,我找到了这个资源

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

    去看看吧,我真的希望它对你的帮助和对我的帮助一样多!

    【讨论】:

    • 恐怕你误解了我的问题:我已经使用 ibtool 来维护翻译。但是,这并不能解决不想翻译应用程序的所有标准菜单项(复制、粘贴等)的问题。
    • 啊,我希望我能提供更多帮助。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我已经为这个问题制定了解决方案。

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

      寻找“翻译器”,它会将您的 MainMenu.strings 文件翻译成十几种语言,并为标准菜单项字符串提供标准 Apple 翻译。

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

      【讨论】:

      • 请注意,现在支持 Mac OS X 的所有 32 种语言。它的主要“数据库”在这里,欢迎使用补丁:github.com/core-code/MiscApps/blob/master/Translator/Translator/…
      • 非常方便,感谢 user1259710!让我们希望 Xcode 6 在默认情况下为非英语开发人员提供这一切更容易……
      • 缺少多种语言的“窗口”(不是全部)。
      • @user1259710 不幸的是没有翻译任何字符串。目前有任何已知问题吗?
      • @julian-f-weinert 没有已知问题,请在 github 页面上使用您的失败字符串文件打开票证,或通过 feedback@corecode.io 直接发送给我们
      【解决方案4】:

      译者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 自动收集)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-22
        • 2013-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多