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

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

关于如何让它发挥作用有什么想法吗?

谢谢你,

--d

有帮助吗?

解决方案

iPhone本地(或者是本地化?)不接受用户集(即英国,AU,NZ)的区域的任何通知。默认情况下只有一个“英文”语言翻译。但是,您可以用事物来强迫它来使用不同的翻译设置 - 我刚刚完成此操作,可以选择“英语”(美国)和“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目录中使用本地化。

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

其他提示

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

Apple文档此缺少iOS功能。

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

我对德语有同样的问题,并认为我发现了“正确的”解决方案。错误是,最初我的基本语言只是“德国(de)”,添加“德语/奥地利(de_AT)”本地化时,文件被忽略了。将基本语言更改为“德国/德国(DE_DE)”时,奥地利翻译并未被忽略。

值得注意的是,Xcode非常误导 - 您可以转到项目(不是目标),信息,本地化,按+按钮以列表中出现的+按钮,然后向下滚动到语言列表的底部出现在弹出窗口中,直到您到达“其他”(用它旁边的右箭头),这将打开一个很好的大列表,其中包括语言的区域变体。但是,这些区域变体不适用于iPhone - 您没有任何内容(如苹果记录并在此处出现的另一个答案中引用)。显然,上面列出的基于代码的解决方案是必要的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top