【问题标题】:iPhone App Localization - English problems?iPhone App Localization - 英文问题?
【发布时间】:2014-08-25 22:35:52
【问题描述】:

我有一个应用程序,我正在将其翻译成多种不同的语言。问题在于,该应用在澳大利亚的值与在新西兰的值不同,这两个国家都是英语国家。

我创建了一个 en_AU 和一个 en_NZ 语言文件,但它们都使用标准英语文件。我删除了英文文件,但它继续发生......

关于如何让它发挥作用的任何想法?

谢谢,

--d

【问题讨论】:

    标签: iphone localization localizable.strings


    【解决方案1】:

    iPhone 本地化(或者是本地化?)不会注意到用户设置的区域(即英国、澳大利亚、新西兰)。默认情况下,只有一种“英语”语言翻译可用。但是,您可以修改一些东西来强制它使用不同的翻译设置 - 我刚刚这样做是为了在“English”(美国)和“en_GB”(英国英语)之间进行选择。

    在您的 main.m 文件中,将其更改为如下所示(为 NZ 或 AU 进行您自己的测试)

    int main(int argc, char *argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    
    // Set up the locale jiggery pokery
    NSString *language = [[NSLocale preferredLanguages] objectAtIndex:0];
    NSString *locale = [[NSLocale currentLocale] objectForKey: NSLocaleCountryCode];
    if ([language isEqualToString:@"en"] && [locale isEqualToString:@"GB"]) {
        [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"en_GB", @"en", nil] forKey:@"AppleLanguages"];
    }
    
    int retVal = UIApplicationMain(argc, argv, nil, nil);
    [pool release];
    return retVal;
    

    }

    这会将用户语言(例如“en”)弹出到语言 NSString,并将用户区域设置(例如,NZ、GB、AU)弹出到区域设置 NSString。如果他们(在我的情况下)匹配 en 和 GB,那么我将用户的默认语言首选项设置为“en_GB”,然后是“en”。

    然后,在您的应用程序委托 application:didFinishLaunchingWithOptions 方法中,您要删除刚刚使用代码设置的 NSUserDefaults 设置

        [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"AppleLanguages"];
    

    此时删除是安全的,因为所有捆绑包初始化都已完成。您的应用现在应该使用 en_GB.lproj 目录中的 Localization.strings 文件。

    这是一个有点可怕、笨拙的解决方案,但它对我有用。

    【讨论】:

      【解决方案2】:

      我想出了我认为是 rickerbh 接受的答案的稍微改进的版本。首先要意识到的是,用户默认值被组织到域中,@"AppleLanguages" 键不是来自应用程序的域,而是来自域层次结构更高的某个域。这意味着从用户默认值中删除它是完全安全的:

      NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
      [defaults removeObjectForKey:@"AppleLanguages"];
      

      调用此代码后,您会注意到调用[defaults objectForKey:@"AppleLanguages"] 仍会返回一个值。因此,与其稍后删除@"AppleLanguages"(这可能会根据您的应用程序的复杂性而产生问题),不如执行相反的操作:立即删除@"AppleLanguages"。本质上,这会将其重置为默认值,并捕获系统对其所做的任何更改,例如,如果用户更改了她的首选语言。

      这是我的工作:

      NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
      [defaults removeObjectForKey:@"AppleLanguages"];
      
      NSMutableArray *appleLanguages = [[defaults objectForKey:@"AppleLanguages"] mutableCopy];
      NSString *region = [[NSLocale currentLocale] objectForKey:NSLocaleCountryCode];
      NSArray *languages = [appleLanguages filteredArrayUsingPredicateFormat:@"not (self contains '-')"];
      for (NSString *language in languages) {
          NSString *languageAndRegion = [NSString stringWithFormat:@"%@-%@", language, region];
          [appleLanguages removeObject:languageAndRegion];
      }
      for (NSString *language in languages) {
          NSString *languageAndRegion = [NSString stringWithFormat:@"%@-%@", language, region];
          NSInteger index = [appleLanguages indexOfObject:language];
          [appleLanguages insertObject:languageAndRegion atIndex:index];
      }
      [defaults setObject:appleLanguages forKey:@"AppleLanguages"];
      

      (请注意,filteredArrayUsingPredicateFormat: 是我编写的扩展方法。弄清楚它的作用或工作原理并不是火箭科学。)

      这会为列表中的每种语言以及用户所在的地区创建本地化。例如,如果原始列表是 es en en-GB 并且用户的区域是 AU,我们将得到 es-AU es en-AU en en-GB。请注意,es-AU 不存在,但没有区别。由于该应用没有找到相关的本地化或资源,它只是忽略它。

      【讨论】:

      • 使用 ios 8.1 这就是解决方案。
      • 这看起来很可靠。要补充一点,@selector(filteredArrayUsingPredicateFormat:) 是 NSArray 上的一个类别方法,您可以在这里找到:github.com/huguesbr/library-ios/blob/master/Categories/…
      • 另外,你把它放在你的代码中的什么位置:在应用程序委托或你的“主”函数中?
      • 我把它放在主目录中。当然,这不是 Swift 项目的一个选项,所以我不确定如何在那里处理它。我从未在应用程序委托中尝试过。它可能在那里工作得很好。不确定。
      • 似乎这也适用于 iOS 9,但我们必须这样做是一个笑话。
      【解决方案3】:

      Apple documents this missing iOS feature here.

      重要提示:在 iOS 中,捆绑包 接口不采用方言或 脚本信息时考虑 寻找本地化资源;只要 语言指示符代码是 经过考虑的。因此,如果您的项目 包括特定语言项目 同时具有语言和目录的目录 区域指示符,那些目录 被忽略。捆绑包接口在 Mac OS X 确实支持区域指示符 在特定语言项目中 目录。

      【讨论】:

        【解决方案4】:

        我在德语方面遇到了同样的问题,并认为我找到了“正确”的解决方案。错误是,最初我的基本语言只是“德语(de)”,当添加“德语/奥地利(de_AT)”本地化时,文件被忽略了。将基础语言更改为“德语/德国 (de_DE)”时,不会忽略奥地利语翻译。

        【讨论】:

          【解决方案5】:

          这里值得注意的是,XCode 非常具有误导性 - 您可以转到 Project(不是 Target)、Info、Localizations,按出现在语言列表下方的 + 按钮,然后向下滚动到该语言列表的底部出现在弹出窗口中,直到您到达“其他”(旁边带有右箭头),这将打开一个不错的大列表,其中包括语言的区域变体。但是,这些区域变体在 iPhone 上不起作用 - 您什么也得不到(如 Apple 所记录并在此处出现的另一个答案中引用)。显然,上面列出的基于代码的解决方案之一是必要的。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-03-07
            相关资源
            最近更新 更多