【问题标题】:How do I get current application locale?如何获取当前的应用程序语言环境?
【发布时间】:2015-07-11 07:01:02
【问题描述】:

我需要获取当前的语言环境。不是用户区域设置,而是我的应用程序区域设置。

假设我的应用程序有两种本地化版本(在项目设置中):英语(默认)和法语。如果用户在 iPhone 上设置法语,那么我的应用程序将显示法语界面。如果用户在 iPhone 上设置德语,那么我的应用程序将显示英文界面(因为默认为英文)。

那么我如何获得当前正在显示的应用程序语言环境? 提前致谢。

【问题讨论】:

    标签: ios objective-c localization locale nslocale


    【解决方案1】:

    可能有比这更简单的方法(请参阅其他答案),但这是最强大的方法,只要通过 strings-file 本地化应用程序的一般原则不会过时,这个方法就可以了。

    通常,您不需要获取应用程序区域设置(但请继续阅读,这是可能的!)如果您想要本地化文本,请使用NSLocalizedString()。如果您需要本地化图像,您可以使用本地化资源,等等。但是,我可以想到有一些原因可以很好地获得您所说的“应用程序语言环境”:例如用于分析(您想知道您的应用程序使用哪种语言),或者提供一个如果您使用基于服务器的通信,则为用户提供一致的一种语言界面(例如,以用户在应用程序中看到的相同语言本地化服务器错误消息。)

    如果您想获得当前可见的应用程序的本地化,我想您对于每个受支持的语言环境都有一个 Localizable.strings 文件。因此,在英语字符串文件中,您可以添加该行

    "lang" = "en";
    

    并在法语字符串文件中添加该行

    "lang" = "fr";
    

    然后,您始终可以通过调用 NSLocalizedString("lang") (swift) 或 NSLocalizedString(@"lang") (objective-C) 来获取应用程序语言环境。当然,每当您向应用添加新的本地化时,您都必须在新的本地化字符串文件中设置“lang”条目。

    【讨论】:

      【解决方案2】:

      所选答案返回当前设备语言,但不是应用中使用的实际语言。如果您未在应用中提供首选语言的本地化:

      NSString *language = NSBundle.mainBundle.preferredLocalizations.firstObject;
      
      NSLocale *locale = NSLocale.currentLocale;
      NSString *countryCode = [locale objectForKey:NSLocaleCountryCode];
      
      NSLocale *usLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
      NSString *country = [usLocale displayNameForKey:NSLocaleCountryCode 
                                                value:countryCode];
      
      NSLog(@"country: %@", country);
      

      【讨论】:

      • 太棒了!有没有办法可以将其转换为NSLocale
      • 窃取别人的答案不是我们在 Stack Overflow 上做的事情,尤其是在没有信用的情况下。如果另一个问题的答案可以解决它,那么投票关闭作为重复。不要窃取答案。
      【解决方案3】:

      在 Swift 3 中使用:

      let language = Bundle.main.preferredLocalizations.first

      【讨论】:

        【解决方案4】:

        您可以通过这种方式从语言环境中获取国家/地区代码,

        NSLocale *currentLocale = [NSLocale currentLocale];  // get the current locale.
        NSString *countryCode = [currentLocale objectForKey:NSLocaleCountryCode];
        

        获取国家代码,例如es(西班牙)、fr(法国)等

        您可以将此代码映射为您的界面选择。

        希望对您有所帮助。

        【讨论】:

          【解决方案5】:

          您可以使用以下代码获取所选语言。

          NSString * language = [[NSLocale preferredLanguages] objectAtIndex:0];
          
          if ([language isEqualToString:@"fr"]){//French
              [do  your stuff]
          }
          else{//English
          
             [do  your stuff]
          }
          

          List_of_ISO_639-1_codes

          希望这会对你有所帮助。

          【讨论】:

          • 如前所述,这为您提供了 iPhone 系统语言。 [[NSBundle mainBundle] preferredLocalizations].firstObject 给出了应用程序语言与用户优先语言列表的“最佳匹配”。
          【解决方案6】:

          解决方案比建议的要简单:

          设备语言

          let deviceLanguage = NSLocale.preferredLanguages.first

          实际应用翻译

          let language = Bundle.main.preferredLocalizations.first

          例如,我将 iPhone 设置为英语-印度语,而我的应用没有英语-印度语翻译,而只有英语-英国语:

          Printing description of language:
          "en-GB"
          Printing description of deviceLanguage:
          "en-IN"
          

          【讨论】:

          • 出于某种原因,Locale.preferredLanguages[0] 只给了我en。我不知道国家/地区代码。
          猜你喜欢
          • 2018-08-09
          • 1970-01-01
          • 2017-04-11
          • 1970-01-01
          • 2014-10-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-20
          相关资源
          最近更新 更多