iPhone App本地化 - 英文问题?

时间:2010-07-22 11:55:27

标签: iphone localization localizable.strings

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

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

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

谢谢,

- d

5 个答案:

答案 0 :(得分:39)

iPhone本地化(或本地化?)不会注意到用户设置的区域(即英国,澳大利亚,新西兰)。默认情况下,只有一种“英语”语言翻译可用。但是,您可以通过黑客攻击来强制它使用不同的翻译设置 - 我刚刚选择“英语”(美国)和“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”。

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

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

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

这是一个可怕的,hacky解决方案,但它适用于我。

答案 1 :(得分:15)

我想出了我认为是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不存在,但没有区别。由于应用程序找不到关联的本地化或资源,因此只会忽略它。

答案 2 :(得分:4)

Apple documents this missing iOS feature here.

  

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

相关问题