【问题标题】:NSLocale of loaded language in application应用程序中加载语言的 NSLocale
【发布时间】:2012-02-05 12:47:50
【问题描述】:

在我的界面中,我正在显示一个语言环境的显示名称:

[[NSLocale currentLocale] displayNameForKey: NSLocaleIdentifier value: identifier]

但这会使用系统的区域设置给出显示名称,该系统的区域设置并不总是与应用程序的区域设置相同。例如,如果我将系统设置为法语并且我的应用程序没有法语本地化,它将在英语界面中提供法语显示名称。相反,我希望在英文界面中有一个英文显示名称,这样我就不会混合使用多种语言。

【问题讨论】:

  • this potentially related question 对你有帮助吗?
  • 好吧,我可以得到我的应用程序支持的最喜欢的语言 [NSLocale preferredLanguages] 来确定使用哪种语言,但我认为这不是理想的解决方案...

标签: objective-c nslocale


【解决方案1】:

我不确定这是否是您想要的...但这是查看您的应用运行的语言/本地化的好方法:

[[NSBundle mainBundle] preferredLocalizations]

如果您的应用同时支持英语和法语,它将按首选顺序返回一个包含这两种语言的数组。在测试中,0 处的那个似乎是已加载并正在运行的 xib。

【讨论】:

    【解决方案2】:

    您应该创建一个本地化的 plist 文件,在您的 plist 中存储相应本地化的正确语言环境标识符,当您使用您的 sn-p 代码时,您应该从该本地化 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,则获取设备区域设置,如果它是 YES,那么您知道该应用程序是英文的,因为那是设备设置,或者是英文的,因为它不支持设备的当前语言环境,因此默认情况下已回退到英语......所以“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
    

    【讨论】:

    • 这是一种可能性,但在我看来是一种非常丑陋的可能性。这比将所有语言都放在 Localizable.strings 中要好,但不如纯代码解决方案好。如果没有其他答案,我会接受这个。
    • 明白了,真正的挑战在于,您需要了解应用程序的语言环境,而不是设备,因为如果您使用设置为法语的设备进入应用程序,但是您的应用程序仅支持英语和西班牙语,可以说应用程序区域设置默认为英语,但设备是法语。因此,我相信如果 Cocoa API 中没有这样的选项,您将别无选择,只能为此浏览本地化文件。
    • 您当然可以在 plist 中使用名为“default_language”的属性作为 BOOL,并将其设置为 YES,仅用于英语,在您的代码中检查此值,如果为 NO,则获取设备区域设置,如果它是“是”,那么您知道该应用程序是英文的,因为这是设备设置,或者是英文的,因为它不支持设备的当前区域设置,因此默认情况下又回到了英文。 ..所以“default_language”应该是YES,将语言环境硬编码为en_US,或者如果你是爱国的英国人,则将语言环境硬编码为en_UK ......希望这种思考角度有所帮助
    猜你喜欢
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多