ios - language - nslocale country code




在iOS中獲取最新的設備語言? (19)

我想顯示設備用戶界面正在使用的當前語言。 我會使用哪些代碼?

我想把它作為一個完全拼出格式的NSString 。 (不是@“en_US”)

編輯:對於那些開車來說,這裡有很多有用的評論,因為答案已經隨著新的iOS版本發展。


迅速

獲取設備的當前語言

NSLocale.preferredLanguages()[0] as String

獲取應用程序語言

NSBundle.mainBundle().preferredLocalizations[0] as NSString

注意:

它獲取您在Info.plist的CFBundleDevelopmentRegion中給出的語言

如果CFBundleAllowMixedLocalizations在info.plist中為true,則返回info.plist中的第一個CFBundleLocalizations


SWIFT-4

 // To get device default selected language. It will print like short name of zone. For english, en or spain, es.



let language = Bundle.main.preferredLocalizations.first! as NSString
    print("device language",language)

iOS 9解決方案:

NSString *language = [[NSLocale preferredLanguages] objectAtIndex:0];

language =“en-US”

NSDictionary *languageDic = [NSLocale componentsFromLocaleIdentifier:language];

languageDic將擁有所需的組件

NSString *countryCode = [languageDic objectForKey:@"kCFLocaleCountryCodeKey"];

countryCode =“美國”

NSString *languageCode = [languageDic objectForKey:@"kCFLocaleLanguageCodeKey"];

languageCode =“en”


斯威夫特3

let locale = Locale.current
let code = (locale as NSLocale).object(forKey: NSLocale.Key.countryCode) as! String?
print(code!)

兩個字母格式。 Apple使用ISO標準ISO-3166

NSString *localeCountryCode = [[NSLocale autoupdatingCurrentLocale] objectForKey:NSLocaleCountryCode];

即使有更好的方式來獲得當前的設備語言。 讓我們嘗試下面的代碼 -

NSLog(@"Current Language - %@", [[NSLocale preferredLanguages] firstObject]);

由Abizern在here推薦


如果你只想得到語言,我的建議答案是:

NSString *langplusreg = [[NSLocale preferredLanguages] objectAtIndex:0];
NSString * langonly = [[langplusreg componentsSeparatedByString:@"-"] 
objectAtIndex:0];

在我的情況下,我只想要區域設置語言而不是區域設置區域。

輸出:如果您的語言環境語言是日語,並且語言環境區域是日本,則:

langplusreg = ja-JP

langonly = ja


如果您正在尋找首選語言代碼(“en”,“de”,“es”...)以及本地化的首選語言名稱(用於當前語言環境),以下是Swift中的一個簡單擴展名:

extension Locale {
static var preferredLanguageIdentifier: String {
    let id = Locale.preferredLanguages.first!
    let comps = Locale.components(fromIdentifier: id)
    return comps.values.first!
}

static var preferredLanguageLocalizedString: String {
    let id = Locale.preferredLanguages.first!
    return Locale.current.localizedString(forLanguageCode: id)!
}

}


對於MonoTouch C#開發人員使用:

NSLocale.PreferredLanguages.FirstOrDefault() ?? "en"

注意:我知道這是一個iOS問題,但由於我是MonoTouch開發人員,本頁上的答案使我朝著正確的方向前進,我想我會分享結果。


對於Swift 3.0以下的代碼可以用來回答你的問題:

 let language = Bundle.main.preferredLocalizations.first! as NSString

從iOS 9開始,如果您只想使用不帶國家/地區代碼的語言代碼,則需要此類幫助功能 - 因為該語言將包含國家/地區代碼。

// gets the language code without country code in uppercase format, i.e. EN or DE
NSString* GetLanguageCode()
{
    static dispatch_once_t onceToken;
    static NSString* lang;
    dispatch_once(&onceToken, ^
    {
        lang = [[[NSLocale preferredLanguages] objectAtIndex:0] uppercaseString];
        NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:@"^[A-Za-z]+" options:0 error:nil];
        NSTextCheckingResult* match = [regex firstMatchInString:lang options:0 range:NSMakeRange(0, lang.length)];
        if (match.range.location != NSNotFound)
        {
            lang = [lang substringToIndex:match.range.length];
        }
    });
    return lang;
}

您可以使用NSLocaledisplayNameForKey:value:方法:

// get a French locale instance
NSLocale *frLocale = [[[NSLocale alloc] initWithLocaleIdentifier:@"fr_FR"] autorelease];

// use it to get translated display names of fr_FR and en_US
NSLog(@"%@", [frLocale displayNameForKey:NSLocaleIdentifier value:@"fr_FR"]);
NSLog(@"%@", [frLocale displayNameForKey:NSLocaleIdentifier value:@"en_US"]);

這將打印出來:

français (France)
anglais (États-Unis)

如果為initWithLocaleIdentifier:指定相同的區域設置標識符,並且還指定了displayNameForKey:value:方法,那麼它將為您提供該語言的本機名稱。 我發現,如果您刪除國家/地區代碼並僅使用fren ,它也會從顯示名稱中省略國家(至少在Mac OS X上,不確定iOS)。


我試圖為自己找到正確的解決方案。 當我使用Locale.preferredLanguages.first從您的應用程序設置中返回首選語言。

如果你想從用戶設備設置中了解語言,你應該使用下面的字符串:

斯威夫特3

let currentDeviceLanguage = Locale.current.languageCode
// Will return the optional String

打開包裝並使用以下行:

if let currentDeviceLanguage = Locale.current.languageCode {
    print("currentLanguage", currentDeviceLanguage)

    // For example
    if currentDeviceLanguage == "he" {
        UIView.appearance().semanticContentAttribute = .forceRightToLeft
    } else {
        UIView.appearance().semanticContentAttribute = .forceLeftToRight
    }
}

所提供的解決方案實際上會返回設備的當前區域 - 而不是當前選擇的語言。 這些往往是一樣的。 但是,如果我在北美,並且我的語言是日語,我的地區仍然是英語(美國)。 為了檢索當前選擇的語言,你可以這樣做:

NSString * language = [[NSLocale preferredLanguages] firstObject];

這將返回當前所選語言的雙字母代碼。 “en”表示英語,“es”表示西班牙語,“de”表示德國人等。更多示例請參閱維基百科條目(特別是639-1欄):

ISO 639-1代碼列表

然後,將兩個字母代碼轉換為您想要顯示的字符串很簡單。 所以如果它是“en”,則顯示“英語”。

希望這可以幫助那些希望區分地區和當前所選語言的人。

編輯

值得引用來自NSLocale.h的頭文件信息:

+ (NSArray *)preferredLanguages NS_AVAILABLE(10_5, 2_0); // note that this list does not indicate what language the app is actually running in; the [NSBundle mainBundle] object determines that at launch and knows that information

對app語言感興趣的人可以看看@ mindvision的答案


接受的和其他答案都沒有考慮到首選語言可以是除設備語言之外的另一種語言

設備語言是提供操作系統元素和Apple應用程序的語言。

首選語言是用戶希望將應用程序本地化的語言。Apple僅提供有限的一組翻譯。 如果首選語言是蘋果翻譯他們的應用程序的一種語言,它也將是設備語言。 但是,如果用戶喜歡Apple不提供翻譯的語言,則設備和首選語言將不匹配 。 設備語言不會位於首選語言列表中的第一位。

以下函數將通過首選語言列表並檢查Apple框架中是否存在翻譯。 第一種翻譯語言是設備語言。 該函數將返回其語言代碼。

func deviceLanguage() -> String? {
    let systemBundle: NSBundle = NSBundle(forClass: UIView.self)
    let englishLocale: NSLocale = NSLocale(localeIdentifier: "en")

    let preferredLanguages: [String] = NSLocale.preferredLanguages()

    for language: String in preferredLanguages {
        let languageComponents: [String : String] = NSLocale.componentsFromLocaleIdentifier(language)

        guard let languageCode: String = languageComponents[NSLocaleLanguageCode] else {
            continue
        }

        // ex: es_MX.lproj, zh_CN.lproj
        if let countryCode: String = languageComponents[NSLocaleCountryCode] {
            if systemBundle.pathForResource("\(languageCode)_\(countryCode)", ofType: "lproj") != nil {
                // returns language and country code because it appears that the actual language is coded within the country code aswell
                // for example: zh_CN probably mandarin, zh_HK probably cantonese
                return language
            }
        }

        // ex: English.lproj, German.lproj
        if let languageName: String = englishLocale.displayNameForKey(NSLocaleIdentifier, value: languageCode) {
            if systemBundle.pathForResource(languageName, ofType: "lproj") != nil {
                return languageCode
            }
        }

        // ex: pt.lproj, hu.lproj
        if systemBundle.pathForResource(languageCode, ofType: "lproj") != nil {
            return languageCode
        }
    }

    return nil
}

如果首選語言列表是:

  1. 南非荷蘭語(iOS沒有翻譯成南非荷蘭語)
  2. 西班牙語(設備語言)

首選語言列表可以 Settings.app - > General - > Language&Region - > Preferred Language Order中編輯

您可以使用設備語言代碼並將其翻譯為語言名稱。 以下幾行將以設備語言打印設備語言。 例如,如果設備設置為西班牙語,則為“Español”。

if let deviceLanguageCode: String = deviceLanguage() {
    let printOutputLanguageCode: String = deviceLanguageCode
    let printOutputLocale: NSLocale = NSLocale(localeIdentifier: printOutputLanguageCode)

    if let deviceLanguageName: String = printOutputLocale.displayNameForKey(NSLocaleIdentifier, value: deviceLanguageCode) {
        // keep in mind that for some localizations this will print a language and a country
        // see deviceLanguage() implementation above
        print(deviceLanguageName)
    }
} 

根據Apple documentation

NSUserDefaults* defs = [NSUserDefaults standardUserDefaults];
NSArray* languages = [defs objectForKey:@"AppleLanguages"];
NSString* preferredLang = [languages objectAtIndex:0];

簡單的Swift 3功能:

  @discardableResult
  func getLanguageISO() -> String {
    let locale = Locale.current
    guard let languageCode = locale.languageCode,
          let regionCode = locale.regionCode else {
        return "de_DE"
    }
    return languageCode + "_" + regionCode
  }

這可能會給你你想要的:

NSLocale *locale = [NSLocale currentLocale];

NSString *language = [locale displayNameForKey:NSLocaleIdentifier 
                                         value:[locale localeIdentifier]];

它將以語言本身顯示語言的名稱。 例如:

Français (France)
English (United States)

-(NSString *)returnPreferredLanguage { //as written text

NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
NSArray *preferredLanguages = [defaults objectForKey:@"AppleLanguages"];
NSString *preferredLanguageCode = [preferredLanguages objectAtIndex:0]; //preferred device language code
NSLocale *enLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en"]; //language name will be in English (or whatever)
NSString *languageName = [enLocale displayNameForKey:NSLocaleIdentifier value:preferredLanguageCode]; //name of language, eg. "French"
return languageName;

}




nslocale