在我的界面中,我显示了一个语言环境的显示名称:
[[NSLocale currentLocale] displayNameForKey: NSLocaleIdentifier value: identifier]
但是这会使用系统的区域设置来显示显示名称,该区域设置并不总是与应用程序的区域设置相同。例如,如果我用法语设置我的系统并且我的应用程序没有法语本地化,它将在英语界面中提供法语显示名称。相反,我希望在英文界面中使用英文显示名称,这样我就不会混合使用这些语言。
答案 0 :(得分:3)
您应该创建一个plist文件,在plist商店中本地化相应本地化的正确语言环境标识符,当您使用代码片段时,您应该从该本地化plist文件加载语言环境并使用它来获取显示名称。
这样您的语言环境将始终对应于屏幕界面语言。我需要在我想格式化的某些日期执行此操作,而不是依赖于系统,因为日历格式可以用另一种语言设置到系统...
希望有所帮助...
- (NSDictionary*)getLocalizedCalendarStrings{
NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"calendar" ofType:@"plist"]; // will return the path of the plist in the right language-specific .lproj directory)
NSDictionary* calendar = [NSDictionary dictionaryWithContentsOfFile:plistPath];
return calendar;
}
并像这样使用它:
NSDictionary * calendar = [self getLocalizedCalendarStrings];
NSString * localeIdentifier = [calendar objectForKey:@"locale_identifier"];
[[NSLocale currentLocale] displayNameForKey: NSLocaleIdentifier value: localeIdentifier]
为了避免输入这些区域设置字符串的风险是拼写错误等,或者如果您想要更好的面向代码的解决方案,您当然可以在plist中使用名为“default_language”的属性作为BOOL并将其设置为YES只有英文,在你的代码中只检查这个值,如果它是NO,那么获取设备区域设置,如果是,那么你知道应用程序是英文的,因为这是设备设置,或英文,因为它不支持设备的当前语言环境,因此默认情况下已恢复为英语...所以“default_language”应为YES,将语言环境硬编码为en_US,如果您是爱国英语则将en_UK编码...
这个示例中的某些内容可能会解决您的问题,NSLocale的类别,但当然这会让您需要为您支持的每种语言都有一个本地化的plist ...
@implementation NSLocale (AppLocale)
+(NSString*)applicationCurrentLocale{
NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"currentLocale" ofType:@"plist"];
NSDictionary* currentLocaleData = [NSDictionary dictionaryWithContentsOfFile:plistPath];
if([[currentLocaleData objectForKey:@"english_default"] boolValue] == YES){
return @"en_US";
}else{
NSString * deviceLocaleIdentifier = [[NSLocale currentLocale] localeIdentifier];
return [[NSLocale currentLocale] displayNameForKey:NSLocaleIdentifier value:deviceLocaleIdentifier];
}
}
@end
答案 1 :(得分:3)
我不确定这是否是您想要的...但这是查看您的应用运行的语言/本地化的好方法:
[[NSBundle mainBundle] preferredLocalizations]
如果您的应用支持英语和法语,它将按首选顺序返回两者的数组。在测试时,0处的那个似乎是加载并运行的xib。