2012-01-08 14 views
6

W moim interfejsie mam przedstawiający wyświetlaną nazwę locale z tym:NSLocale języka załadowanych aplikacji

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

Ale to daje nazwę wyświetlaną pomocą ustawień narodowych systemu, który nie zawsze jest taka sama jako ustawienia regionalne aplikacji. Na przykład, jeśli ustawię mój system w języku francuskim, a moja aplikacja nie ma francuskiej lokalizacji, to wyświetli francuską nazwę wyświetlaną w interfejsie angielskim. Zamiast tego chciałbym mieć angielską nazwę wyświetlaną w angielskim interfejsie, więc nie mieszam języków.

+0

Czy [to potencjalnie powiązane pytanie] (http://stackoverflow.com/questions/1522210/always-returns-en-us-us-users-current-language) w ogóle ci pomaga? –

+0

cóż, mógłbym uzyskać najbardziej preferowany język dla mojej aplikacji z "[NSLocale preferredLanguages]", aby określić, który z nich jest używany, ale to nie jest idealne rozwiązanie, myślę, że ... – Jef

Odpowiedz

3

Nie jestem pewien, czy to, co chcesz ... Ale jest to świetny sposób, aby zobaczyć, co język/lokalizację aplikacja jest uruchomiona w:

[[NSBundle mainBundle] preferredLocalizations] 

Jeśli aplikacja obsługuje zarówno po angielsku i francusku Języki, zwróci tablicę obu w preferowanej kolejności. Podczas testowania wydaje się, że ten o wartości 0 jest załadowanym i uruchomionym xib.

3

Powinieneś utworzyć plik plist, który zlokalizujesz w swoim magazynie plist prawidłowym identyfikatorze ustawień dla odpowiedniej lokalizacji, podczas używania fragmentu kodu, musisz załadować ustawienia narodowe z tego zlokalizowanego pliku plist i użyć go, aby uzyskać wyświetlana nazwa.

W ten sposób ustawienia regionalne będą zawsze odpowiadać językowi interfejsu na ekranie. Musiałem to zrobić dla niektórych terminach chciałem formacie, a nie opierać się na systemie jako format kalendarza można ustawić w innym języku do systemu ...

nadzieję, że pomoże ...

enter image description here

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

i używać go tak:

NSDictionary * calendar = [self getLocalizedCalendarStrings]; 
NSString * localeIdentifier = [calendar objectForKey:@"locale_identifier"]; 
[[NSLocale currentLocale] displayNameForKey: NSLocaleIdentifier value: localeIdentifier] 

Aby uniknąć ryzyka tych ustawień regionalnych ciągów wpisu jest misspelt itp, albo jeśli chcesz lepszy rozwiązanie zorientowane na kod, możesz oczywiście użyć właściwości o nazwie "default_language" jako BOOL w pliku plist i ustawić ją na YES tylko dla języka angielskiego, w swoim kodzie wystarczy sprawdzić tę wartość, a jeśli NIE, to uzyskać ustawienia regionalne urządzenia, to TAK, to wiesz, że aplikacja jest albo po angielsku, ponieważ jest to ustawienie urządzenia, albo po angielsku, ponieważ nie obsługuje bieżących ustawień regionalnych urządzenia i dlatego domyślnie spadła na angielski ... "default_language" to TAK, sztywno koduj ustawienia regionalne do en_US lub en_UK, jeśli jesteś patriotą brit ...

Coś podobnego do tego przykładu może rozwiązać Twój problem, kategoria dla NSLocale, ale oczywiście musisz mieć zlokalizowany plik plist dla każdego obsługiwanego języka ...

@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 
+0

Jest to możliwość, jednak w moich oczach dość brzydka . To lepsze niż umieszczanie wszystkich języków w Localizable.strings, ale nie tak dobre, jak rozwiązanie tylko kodu. Jeśli nie zostaną podane inne odpowiedzi, zaakceptuję to. – Jef

+0

Zrozumieć, czym jest prawdziwe wyzwanie, jest to, że musisz znać lokalne ustawienia aplikacji, a nie urządzenia, ponieważ jeśli przyjdziesz do aplikacji z urządzeniem ustawionym na francuski, ale twoja aplikacja obsługuje tylko angielski i hiszpański , ustawienie regionalne, by tak rzec, domyślnie byłoby angielskie, ale urządzenie jest francuskie. Dlatego uważam, że gdyby taka opcja nie była dostępna w API Cocoa, nie mielibyście innej opcji niż przejść przez zlokalizowane pliki. – Daniel

+0

Można oczywiście użyć właściwości o nazwie "default_language" jako BOOL w pliku plist i ustawić ją na YES tylko dla języka angielskiego, w kodzie wystarczy sprawdzić tę wartość, a jeśli jest NIE, to uzyskać ustawienia regionalne urządzenia, czy powinno być TAK , wtedy wiesz, że aplikacja jest albo po angielsku, ponieważ jest to ustawienie urządzenia, albo po angielsku, ponieważ nie obsługuje bieżących ustawień regionalnych urządzenia i dlatego domyślnie powróciła do angielskiego ... tak powinno "default_language" być TAK, zakodować lokalnie do en_US lub en_UK jeśli jesteś patriotą brit ... mam nadzieję, że kąt myślenia pomaga – Daniel

Powiązane problemy