我有一个应用程序,我正在翻译成一堆不同的语言。问题是,在澳大利亚,应用程序将具有一些不同于新西兰的价值,这两个都是英语国家。
我创建了一个en_AU和一个en_NZ语言文件,但它们都使用标准的英文文件。我删除了英语文件,但它仍然会发生......
关于如何让它发挥作用的任何想法?
谢谢,
- d
答案 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所记录,并在此处出现的另一个答案中引用)。显然,上面列出的一个基于代码的解决方案是必要的。