Am'd place să arate limbajul curent pe care aparatul UI este folosind. Ce cod mi-ar folosi?
Vreau acest lucru ca pe o NSString
în deplin precizate format. (Nu @"en_US")
EDIT: Pentru cei de conducere pe de, există o tona de comentarii utile aici, ca și răspunsul a evoluat cu noul iOS versiuni.
Soluțiile oferite vor reveni de fapt regiunea curentă a dispozitivului - nu-ului privat în limba selectată. Acestea sunt de multe ori unul și același lucru. Cu toate acestea, dacă eu sunt în America de Nord și mi-am setat limba Japoneză, regiunea mea va fi în continuare limba engleză (Statele Unite). În scopul de a prelua în prezent limba selectată, puteți face:
NSString * language = [[NSLocale preferredLanguages] firstObject];
Acest lucru va returna un cod de două litere pentru limba selectată în prezent. "ro" pentru limba engleza, "es" pentru limba spaniolă, "de" pentru germani, etc. Pentru mai multe exemple, vă rugăm să consultați Wikipedia (în special, 639-1 coloana):
Apoi se's o chestiune simplă de conversie a doua scrisoare coduri la șirul pe care doriți să afișați. Deci, dacă-l's "ro", de afișare "engleză".
Sper că acest lucru ajută cineva care's care caută să se diferențieze între regiune și în prezent limba selectată.
EDIT
Merită să citez informații de antet de 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
Persoanele interesate în limba app ia o privire la @mindvision's a răspunde
Răspunsul selectat se întoarce dispozitivul curent limba, dar nu real limba utilizată în aplicația. Dacă tu nu't oferi o localizare în aplicația pentru utilizator's, limba preferată, prima localizare disponibile, comandat de către utilizator's de preferat ordine, este folosit.
Pentru a descoperi limbajul curent selectat în localizări utilizare
[[NSBundle mainBundle] preferredLocalizations];
Exemplu:
NSString *language = [[[NSBundle mainBundle] preferredLocalizations] objectAtIndex:0];
Swift:
let language = NSBundle.mainBundle().preferredLocalizations.first as NSString
Soluție pentru iOS 9:
NSString *language = [[NSLocale preferredLanguages] objectAtIndex:0];
limba = "ro-NE"
NSDictionary *languageDic = [NSLocale componentsFromLocaleIdentifier:language];
languageDic va avea nevoie de componente
NSString *countryCode = [languageDic objectForKey:@"kCFLocaleCountryCodeKey"];
prefixțară = "NOI"
NSString *languageCode = [languageDic objectForKey:@"kCFLocaleLanguageCodeKey"];
languageCode = "ro"
Acest lucru va oferi, probabil, ceea ce vrei:
NSLocale *locale = [NSLocale currentLocale];
NSString *language = [locale displayNameForKey:NSLocaleIdentifier
value:[locale localeIdentifier]];
Se va afișa denumirea limbii, în limba în sine. De exemplu:
Français (France)
English (United States)
acceptat, și alte răspunsuri don't să ia în considerare faptul că limba poate fi o altă limbă decât limba setată pe dispozitiv.
La dispozitiv de limba este limba în care sistemul de operare elemente și aplicații Apple sunt prezentate.
Delimba este limba pe care utilizatorul ar dori să aibă aplicații localizate în. Apple oferă doar un set limitat de traduceri. Dacă limba este o limbă Apple tradus aplicațiile lor pentru a, de asemenea, va fi limba aparatului. Cu toate acestea dacă utilizatorul preferă un limbaj pentru care Apple nu't oferi traduceri dispozitiv și limbi preferate câștigat't match**. Dispozitivul limba nu va fi pe prima poziție în limbi preferate listă.
Următoarele funcții vor trece prin limbi preferate listă și verificați dacă există o traducere în Apple cadre. Prima limbă a avea o traducere este limba aparatului. Funcția va reveni codul de limbă.
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
}
Aceasta funcționează dacă limba preferată lista este:
Delimba preferată lista poate fi editat**: Setări.app -> General> Limba & Regiunea -> Limba Preferată Pentru
Puteți utiliza aparatul codul de limbă și traduce în limba numele. Următoarele linii vor imprima dispozitiv de limbă în limbă dispozitiv. De exemplu, "Español" dacă dispozitivul este setat pentru a spaniolă.
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)
}
}
eu folosesc acest
NSArray *arr = [NSLocale preferredLanguages];
for (NSString *lan in arr) {
NSLog(@"%@: %@ %@",lan, [NSLocale canonicalLanguageIdentifierFromString:lan], [[[NSLocale alloc] initWithLocaleIdentifier:lan] displayNameForKey:NSLocaleIdentifier value:lan]);
}
ignora scurgere de memorie..
și rezultatul este
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
Traducerea în limba coduri, cum ar fi ro în engleză (Statele Unite) este o construit în funcție de NSLocale " și " NSLocale` nu-i pasă de unde iau codurile de limbă de. Deci, există într-adevăr nici un motiv să pună în aplicare propria ta traducere ca a acceptat răspunsul sugerează.
// 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);
Printuri: Engleză, Germană, Suedeză
Chiar nu's o modalitate mai bună de a obține curent de limbă dispozitiv. Las's încercați să-l de cod de mai jos -
NSLog(@"Current Language - %@", [[NSLocale preferredLanguages] firstObject]);
Puteți utiliza displayNameForKey:valoare: metoda de [
NSLocale`](http://developer.apple.com/library/ios/#documentation/cocoa/reference/foundation/Classes/NSLocale_Class/Reference/Reference.html):
// 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"]);
Acest lucru se va imprima:
français (France)
anglais (États-Unis)
Dacă specificați același locale de identificare pentru initWithLocaleIdentifier:
și, de asemenea, `displayNameForKey:valoare: metoda, atunci se va da numele nativ al limbii. Am'am descoperit că, dacă eliminați codul de țară și de a folosi doar " fr " și "en", care se va omite, de asemenea, țara de la display name (pe Mac OS X, cel puțin, nu sunt sigur despre iOS).
Am încercat pentru a afla solutia potrivita pentru mine. Când m-am folosi Locale.preferredLanguages.primul a fost returnat limba preferată din aplicația setări.
Dacă doriți ajunge să cunoască limba de utilizator setări de dispozitiv, ar trebui să utilizați șirul de mai jos:
Swift 3
let currentDeviceLanguage = Locale.current.languageCode
// Will return the optional String
Pentru a desface și de a folosi uită-te la linia de mai jos:
if let currentDeviceLanguage = Locale.current.languageCode {
print("currentLanguage", currentDeviceLanguage)
// For example
if currentDeviceLanguage == "he" {
UIView.appearance().semanticContentAttribute = .forceRightToLeft
} else {
UIView.appearance().semanticContentAttribute = .forceLeftToRight
}
}
Pentru a obține curent limba de dispozitiv
NSLocale.preferredLanguages()[0] as String
Pentru a obține aplicarea limbă
NSBundle.mainBundle().preferredLocalizations[0] as NSString
Notă:
Acesta preia limbajul care le-au dat în CFBundleDevelopmentRegion de info.plist
dacă CFBundleAllowMixedLocalizations este adevărat în informații.plist apoi primul element de CFBundleLocalizations în informații.plist este returnat
Simplu Swift 3 funcția:
@discardableResult
func getLanguageISO() -> String {
let locale = Locale.current
guard let languageCode = locale.languageCode,
let regionCode = locale.regionCode else {
return "de_DE"
}
return languageCode + "_" + regionCode
}
Pentru MonoTouch C# dezvoltatorii folosesc:
NSLocale.PreferredLanguages.FirstOrDefault() ?? "en"
Notă: știu că acest lucru a fost un iOS întrebare, dar cum eu sunt un MonoTouch producător, răspunsul pe aceasta pagina m-a condus în direcția cea bună și am crezut că am'd împărtăși rezultatele.
Daca're în căutarea pentru limba preferată cod ("ro", "de", "es" ...), și localizate, limba preferată numele (pentru locale actuale), aici's o extensie simplă, în 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)!
}
}
Dacă doriți să obțineți doar aici este limba mea sugerat răspuns:
NSString *langplusreg = [[NSLocale preferredLanguages] objectAtIndex:0];
NSString * langonly = [[langplusreg componentsSeparatedByString:@"-"]
objectAtIndex:0];
În cazul meu, am vrut doar Locale limbă nu locale regiune.
Ieșire: Dacă zona dvs. este limba Japoneză și locale regiune este Japonia, atunci:
langplusreg = ja-JP
langonly = ja
-(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;
}
Evident, soluții bazându-se, de exemplu, pe
[[NSLocale preferredLanguages] objectAtIndex:0]
de obicei, funcționează bine și de a reveni dispozitivul curent limba.
Dar ar putea fi înșelătoare, în unele cazuri :
În cazul în care aplicația în care doriți pentru a obține această valoare a fost deja schimbat limba, de exemplu cu acest tip de cod :
NSString *lg = @"en"; // or anything like @"en", @"fr", etc.
[[NSUserDefaults standardUserDefaults]
setObject:[NSArray arrayWithObjects:lg, nil]
forKey:@"AppleLanguages"]
În acest caz, [NSLocale preferredLanguages] de fapt, se întoarce setați limba preferată (și utilizat) în această aplicație special, nu dispozitivul curent limba !
Și... în acest caz, singura modalitate de a obține în mod corespunzător curentului actual de limbă dispozitiv (și nu cel stabilit anterior în aplicația), este în primul rând clar cheia @"appleLanguages" în NSUserDefaults, astfel :
[[NSUserDefaults standardUserDefaults]removeObjectForKey:@"AppleLanguages"];
Apoi, [NSLocale preferredLanguages] acum se întoarce valoarea corectă.
Sper că acest ajutor.