18

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

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

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

谢谢,

--d

4

5 回答 5

39

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 文件。

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

于 2010-07-22T18:03:41.433 回答
16

我想出了我认为是 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:是我编写的扩展方法。弄清楚它的作用或工作原理并不是火箭科学。)

This creates localizations for every language in the list combined with the user's region. E.g., if the original list was es en en-GB and the user's region is AU, we'll get es-AU es en-AU en en-GB. Note that es-AU doesn't exist, but it makes no difference. Since the app finds no associated localizations or resources, it just ignores it.

于 2013-01-16T11:27:03.740 回答
4

Apple 在此处记录了这个缺失的 iOS 功能。

重要提示:在 iOS 中,捆绑接口在查找本地化资源时不会考虑方言或脚本信息;仅考虑语言指示符代码。因此,如果您的项目包含具有语言和区域指示符的特定于语言的项目目录,则这些目录将被忽略。Mac OS X 中的包接口确实支持特定语言项目目录中的区域指示符。

于 2011-05-12T07:48:21.133 回答
0

I had the same problems with German and think I found the "right" solution. The mistake was, that originally my base language was only "German (de)", when adding "German/Austria (de_AT)" localizations, the files were ignored. When changing the base language to "German/Germany (de_DE)" the austrian translations were not ignored.

于 2013-03-26T13:39:29.937 回答
0

Worth noting here that XCode is very misleading - you can go to Project (not Target), Info, Localizations, press the + button that appears under the list of languages, then scroll down to the bottom of the list of languages that appear in the popup until you get to "Other" (with right arrow next to it), this will open a nice big list which includes regional variants for languages. However, these regional variants do not work on the iPhone - you don't get anything (as documented by Apple and referenced in another answer that appears here). Evidently one of the code-based solutions listed above is necessary.

于 2014-08-25T10:09:22.143 回答