الحصول على الجهاز الحالي اللغة في دائرة الرقابة الداخلية?

StackOverflow https://stackoverflow.com/questions/3910244

سؤال

أود أن تظهر لغة الجهاز واجهة المستخدم باستخدام.ماذا المدونة أن أستخدمها ؟

أريد هذا NSString في الكامل المنصوص عليها الشكل.(لا @"en_US")

تحرير:تلك القيادة على طريق, هناك طن من تعليقات مفيدة هنا ، الجواب تطورت مع دائرة الرقابة الداخلية الجديدة النشرات.

هل كانت مفيدة؟

المحلول

ستعود الحلول المقدمة بالفعل إلى المنطقة الحالية للجهاز - وليس اللغة المحددة حاليًا. هذه غالبا ما تكون واحدة وشبه. ومع ذلك ، إذا كنت في أمريكا الشمالية ووضعت لغتي على اليابانية ، فستظل منطقتي اللغة الإنجليزية (الولايات المتحدة). من أجل استرداد اللغة المحددة حاليًا ، يمكنك القيام بذلك:

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

سيؤدي هذا إلى إرجاع رمز حرفين للغة المحددة حاليًا. "EN" للغة الإنجليزية ، "ES" للإسبانية ، "DE" للألمانية ، وما إلى ذلك لمزيد من الأمثلة ، يرجى الاطلاع على إدخال Wikipedia (على وجه الخصوص ، عمود 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

الأشخاص المهتمين بلغة التطبيق يلقون نظرة على @إجابة Mindvision

نصائح أخرى

تقوم الإجابة المحددة بإرجاع لغة الجهاز الحالية ، ولكن ليس اللغة الفعلية المستخدمة في التطبيق. إذا لم تقدم توطين في تطبيقك للغة المفضلة للمستخدم ، يتم استخدام التوطين الأول المتاح ، الذي تم طلبه بواسطة الطلب المفضل للمستخدم.

لاكتشاف اللغة الحالية المحددة ضمن استخدامات التوترات الخاصة بك استخدام

[[NSBundle mainBundle] preferredLocalizations];

مثال:

NSString *language = [[[NSBundle mainBundle] preferredLocalizations] objectAtIndex:0];

سويفت:

let language = NSBundle.mainBundle().preferredLocalizations.first as NSString

الحل لنظامي iOS 9:

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

اللغة = "en-us"

NSDictionary *languageDic = [NSLocale componentsFromLocaleIdentifier:language];

سيكون لدى Languageic المكونات المطلوبة

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

CountryCode = "US"

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

LanguageCode = "EN"

ربما يعطيك هذا ما تريد:

NSLocale *locale = [NSLocale currentLocale];

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

سيظهر اسم اللغة ، باللغة نفسها. فمثلا:

Français (France)
English (United States)

warning المقبولة وغيرها يجيب على كل لا تأخذ في الاعتبار أن يفضل يمكن أن تكون اللغة لغة أخرى من لغة الجهاز.

على لغة الجهاز هو اللغة في نظام التشغيل الذي والعناصر تطبيقات أبل قدمت.

على اللغة المفضلة هي لغة المستخدم ترغب في الحصول على التطبيقات المترجمة في.أبل لا تقدم سوى مجموعة محدودة من الترجمات.إذا كان يفضل اللغة هي لغة واحدة أبل ترجمة تطبيقاتهم ، كما سيتم لغة الجهاز. ومع ذلك إذا كان المستخدم يفضل اللغة التي أبل لا توفر والترجمات الجهاز المفضل اللغات لا تطابق.لغة الجهاز لن يكون على المركز الأول في المفضلة في قائمة اللغات.

الدالة التالية سوف تذهب من خلال اللغات المفضلة قائمة التحقق إذا كان هناك ترجمة في أبل الأطر.اللغة الأولى إلى ترجمة لغة الجهاز.وظيفة سيعود لها رمز اللغة.

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. الأفريكانية (دائرة الرقابة الداخلية لا تترجم إلى اللغة الأفريكانية)
  2. الإسبانية (لغة الجهاز)

على اللغة المفضلة قائمة يمكن تحريرها في:الإعدادات.التطبيق -> عام -> اللغة و المنطقة -> اللغة المفضلة النظام


يمكنك من استخدام الجهاز رمز اللغة وترجمتها إلى اللغة اسم.السطور التالية طباعة الجهاز اللغة في لغة الجهاز.على سبيل المثال "الأسبانية" إذا تم تعيين الجهاز إلى اللغة الإسبانية.

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)
    }
} 

انا استعمل هذا

    NSArray *arr = [NSLocale preferredLanguages];
for (NSString *lan in arr) {
    NSLog(@"%@: %@ %@",lan, [NSLocale canonicalLanguageIdentifierFromString:lan], [[[NSLocale alloc] initWithLocaleIdentifier:lan] displayNameForKey:NSLocaleIdentifier value:lan]);
}

تجاهل تسرب الذاكرة ..

والنتيجة هي

2013-03-02 20:01:57.457 xx[12334:907] zh-Hans: zh-Hans 中文(简体中文)
2013-03-02 20:01:57.460 xx[12334:907] en: en English
2013-03-02 20:01:57.462 xx[12334:907] ja: ja 日本語
2013-03-02 20:01:57.465 xx[12334:907] fr: fr français
2013-03-02 20:01:57.468 xx[12334:907] de: de Deutsch
2013-03-02 20:01:57.472 xx[12334:907] nl: nl Nederlands
2013-03-02 20:01:57.477 xx[12334:907] it: it italiano
2013-03-02 20:01:57.481 xx[12334:907] es: es español

ترجمة رموز اللغة مثل en_us داخل انجليزية الولايات المتحدة) هي ميزة في NSLocale و NSLocale لا يهتم من أين تحصل على رموز اللغة. لذلك لا يوجد سبب لتنفيذ ترجمتك الخاصة كما تشير الإجابة المقبولة.

// Example code - try changing the language codes and see what happens
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en"];
NSString *l1 = [locale displayNameForKey:NSLocaleIdentifier value:@"en"];
NSString *l2 = [locale displayNameForKey:NSLocaleIdentifier value:@"de"];
NSString *l3 = [locale displayNameForKey:NSLocaleIdentifier value:@"sv"];
NSLog(@"%@, %@, %@", l1, l2, l3);

مطبوعات: الإنجليزية والألمانية والسويدية

حتى أن هناك طريقة أفضل للحصول على لغة الجهاز الحالية. لنجربه بموجب الرمز أدناه -

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

مقترح من قبل أبيزرن على هنا

يمكنك استخدام ال displayNameForKey:value: طريقة NSLocale:

// 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: الطريقة ، ثم سوف تعطيك الاسم الأصلي للغة. لقد اكتشفت أنه إذا قمت بإزالة رمز البلد واستخدمت فقط fr و en, ، سيغفل البلد أيضًا من اسم العرض (على 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 * myString = [[NSLocale preferredlanguage]objectAtIndex:0];

سريع

للحصول على لغة الجهاز الحالية

NSLocale.preferredLanguages()[0] as String

للحصول على لغة التطبيق

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

ملحوظة:

إنه يجلب اللغة التي قدمتها cfbundledevelopmentregion من info.plist

إذا cfbundleallowmixedlocalizations صحيح في info.plist ثم العنصر الأول من cfbundlelocalizations في info.plist يتم إرجاع

ل monotouch c# استخدام المطورين:

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

ملاحظة: أعلم أن هذا كان سؤالًا iOS ، لكن بما أنني مطور ردود ، فقد قادني الإجابة في هذه الصفحة في الاتجاه الصحيح وأعتقد أنني سأشارك النتائج.

في Swift:

let languageCode = NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode) as? String

سريع 3

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

وظيفة 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
  }

إذا كنت تبحث عن رمز اللغة المفضل ("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)!
}

}

-(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;

}

إذا كنت تريد الحصول على لغة فقط هنا هي إجابتي المقترحة:

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

في حالتي ، أردت فقط لغة الطليعة وليس المنطقة المحلية.

الإخراج: إذا كانت لغتك المحلية يابانية والمنطقة المحلية هي اليابان ثم:

langplusreg = ja-jp

langonly = ja

إجابة محدثة لـ Swift 4

let language = Bundle.main.preferredLocalizations.first

بالنسبة لـ Swift 3.0 أدناه ، يمكن استخدام الرمز للإجابة على سؤالك:

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

في Swift 4.2 و Xcode 10.1

let language = NSLocale.preferredLanguages[0]
print(language)//en

وفقا ل Apple توثيق

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

تنسيق رسالتين. تستخدم Apple ISO Standard ISO-3166.

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

@amir استجابة في سويفت:

// Get language prefered by user
    let langageRegion = NSLocale.preferredLanguages().first!
    let languageDic = NSLocale.componentsFromLocaleIdentifier(langageRegion)
    let language = languageDic[NSLocaleLanguageCode]

Swift 3:

NSLocale.preferredLanguages[0] as String

اعتبارًا من 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;
}

من الواضح أن الحلول التي تعتمد ، على سبيل المثال ، على

[[NSLocale preferredLanguages] objectAtIndex:0]

عادة ما تعمل بشكل جيد وإرجاع لغة الجهاز الحالية.

ولكن قد يكون مضللاً في بعض الحالات:

إذا كان التطبيق الذي تريد الحصول على هذه القيمة قد غير اللغة بالفعل ، على سبيل المثال مع هذا النوع من التعليمات البرمجية:

NSString *lg = @"en"; // or anything like @"en", @"fr", etc.
[[NSUserDefaults standardUserDefaults] 
    setObject:[NSArray arrayWithObjects:lg, nil]  
    forKey:@"AppleLanguages"]

في هذه الحالة ، [NSLocale PreferredLanguages في الواقع ، يعيد مجموعة اللغة المفضلة (واستخدامها) في هذا التطبيق بالذات ، وليس لغة الجهاز الحالية!

و ... في هذه الحالة ، تتمثل الطريقة الوحيدة للحصول على لغة الجهاز الحالية الفعلية (وليس تلك التي تم تعيينها مسبقًا في التطبيق).

[[NSUserDefaults standardUserDefaults]removeObjectForKey:@"AppleLanguages"];

بعد ذلك ، [NSLOCALE PRIESTLANGAGES] يعيد الآن القيمة الصحيحة.

نأمل أن تكون هذه المساعدة.

سويفت 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)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top