【发布时间】:2014-08-25 22:35:52
【问题描述】:
我有一个应用程序,我正在将其翻译成多种不同的语言。问题在于,该应用在澳大利亚的值与在新西兰的值不同,这两个国家都是英语国家。
我创建了一个 en_AU 和一个 en_NZ 语言文件,但它们都使用标准英语文件。我删除了英文文件,但它继续发生......
关于如何让它发挥作用的任何想法?
谢谢,
--d
【问题讨论】:
标签: iphone localization localizable.strings
我有一个应用程序,我正在将其翻译成多种不同的语言。问题在于,该应用在澳大利亚的值与在新西兰的值不同,这两个国家都是英语国家。
我创建了一个 en_AU 和一个 en_NZ 语言文件,但它们都使用标准英语文件。我删除了英文文件,但它继续发生......
关于如何让它发挥作用的任何想法?
谢谢,
--d
【问题讨论】:
标签: iphone localization localizable.strings
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 文件。
这是一个有点可怕、笨拙的解决方案,但它对我有用。
【讨论】:
我想出了我认为是 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 documents this missing iOS feature here.
重要提示:在 iOS 中,捆绑包 接口不采用方言或 脚本信息时考虑 寻找本地化资源;只要 语言指示符代码是 经过考虑的。因此,如果您的项目 包括特定语言项目 同时具有语言和目录的目录 区域指示符,那些目录 被忽略。捆绑包接口在 Mac OS X 确实支持区域指示符 在特定语言项目中 目录。
【讨论】:
我在德语方面遇到了同样的问题,并认为我找到了“正确”的解决方案。错误是,最初我的基本语言只是“德语(de)”,当添加“德语/奥地利(de_AT)”本地化时,文件被忽略了。将基础语言更改为“德语/德国 (de_DE)”时,不会忽略奥地利语翻译。
【讨论】:
这里值得注意的是,XCode 非常具有误导性 - 您可以转到 Project(不是 Target)、Info、Localizations,按出现在语言列表下方的 + 按钮,然后向下滚动到该语言列表的底部出现在弹出窗口中,直到您到达“其他”(旁边带有右箭头),这将打开一个不错的大列表,其中包括语言的区域变体。但是,这些区域变体在 iPhone 上不起作用 - 您什么也得不到(如 Apple 所记录并在此处出现的另一个答案中引用)。显然,上面列出的基于代码的解决方案之一是必要的。
【讨论】: