Chciałbym pokazać bieżący język, którego używa interfejs użytkownika urządzenia. Jakiego kodu użyłbym?
Chcę to jako NSString
w pełni pisanym formacie. (Nie @ „en_US”)
EDYCJA: Dla tych, którzy przejeżdżają, jest tu mnóstwo przydatnych komentarzy, ponieważ odpowiedź ewoluowała wraz z nowymi wersjami iOS.
ios
objective-c
cocoa-touch
nslocale
Mosze
źródło
źródło
NSLocale
. Zobacz moją odpowiedź.[NSLocale preferredLanguages]
. kiedyś był oddzielony podkreśleniem (np.en_US
), ale teraz został zmieniony na myślnik:en-US
NSLocale
posiada metodycomponentsFromLocaleIdentifier:
ilocaleIdentifierFromComponents:
które są prawdopodobnie właściwy sposób obsłużyć format (potencjalnie zmienne).Odpowiedzi:
Dostarczone rozwiązania w rzeczywistości zwrócą bieżący region urządzenia - nie aktualnie wybrany język. Często są one takie same. Jeśli jednak jestem w Ameryce Północnej i ustawię język na japoński, moim regionem nadal będzie angielski (Stany Zjednoczone). Aby odzyskać aktualnie wybrany język, możesz:
Zwróci dwuliterowy kod dla aktualnie wybranego języka. „en” dla języka angielskiego, „es” dla języka hiszpańskiego, „de” dla języka niemieckiego itp. Więcej przykładów można znaleźć w tym wpisie w Wikipedii (w szczególności w kolumnie 639-1):
Lista kodów ISO 639-1
Wówczas wystarczy prosta konwersja dwuliterowych kodów na ciąg znaków, który chcesz wyświetlić. Więc jeśli jest to „en”, wyświetl „English”.
Mam nadzieję, że pomoże to komuś, kto chce odróżnić region od aktualnie wybranego języka.
EDYTOWAĆ
Warto zacytować informacje nagłówka z NSLocale.h:
Osoby zainteresowane językiem aplikacji przyglądają się odpowiedzi @ mindvision
źródło
NSLocale preferredLanguages
zmienionej. Jeśli wcześniej otrzymywałeś tylko „en”, w iOS 9 dostaniesz „en-US” lub „en-JP” itp. Odnośnik: happyteamlabs.com/blog/…Wybrana odpowiedź zwraca bieżący język urządzenia, ale nie rzeczywisty język używany w aplikacji. Jeśli nie podasz lokalizacji w aplikacji dla preferowanego języka użytkownika, zostanie użyta pierwsza dostępna lokalizacja, uporządkowana według preferowanej kolejności użytkownika.
Aby odkryć aktualny język wybrany w twoich lokalizacjach użyj
Przykład:
Szybki:
źródło
Rozwiązanie dla iOS 9:
language = "en-US"
languageDic będzie miał potrzebne komponenty
countryCode = "US"
languageCode = "en"
źródło
Zapewni to prawdopodobnie to, czego chcesz:
Wyświetli nazwę języka w samym języku. Na przykład:
źródło
Wszystkie zaakceptowane i pozostałe odpowiedzi nie biorą pod uwagę, że preferowanym językiem może być inny język niż język urządzenia .
Język urządzenia to język, w którym prezentowane są elementy systemu operacyjnego i aplikacje Apple.
Preferowany język jest językiem użytkownik chciałby mieć aplikacje zlokalizowane w. Jabłko zapewnia tylko ograniczoną liczbę tłumaczeń. Jeśli preferowanym językiem jest jeden język, na który Apple przetłumaczyło swoje aplikacje, będzie to również język urządzenia. Jeśli jednak użytkownik preferuje język, dla którego Apple nie zapewnia tłumaczeń, urządzenie i preferowane języki nie będą pasować . Język urządzenia nie będzie na pierwszym miejscu na liście preferowanych języków.
Poniższa funkcja przejdzie przez listę preferowanych języków i sprawdzi, czy jest dostępne tłumaczenie w środowisku Apple. Pierwszym językiem do tłumaczenia jest język urządzenia. Funkcja zwróci kod języka.
Działa to, jeśli lista preferowanych języków to:
Lista język korzystne mogą być edytowane w : Settings.app -> Ogólne -> Język i region -> Preferowany język Zamówienie
Możesz następnie użyć kodu języka urządzenia i przetłumaczyć go na nazwę języka. Poniższe wiersze wydrukują język urządzenia w języku urządzenia. Na przykład „Español”, jeśli urządzenie jest ustawione na hiszpański.
źródło
NSBundle(forClass: UIView.self)
, próbujesz podać najbardziej konkretny język dla danego widoku. Jednak korzystając z tego, natknąłem się na problem, w którym dla danej klasy język nie został zwrócony. Zmieniłem inicjalizację naNSBundle.mainBundle()
i zwróciłem oczekiwany kod języka.mainBundle()
wydaje się być jednym polecane przez Apple jako sugerowane w nagłówku dlaNSLocale
,// 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
.NSBundle.mainBundle()
zwraca pakiet aplikacji, aNSBundle(forClass: UIView.self)
systemowy pakiet UIKit. opisana metoda szuka katalogów w pakiecie. Twój pakiet aplikacji będzie zawierał tylko te języki, w których zamierzasz się zlokalizować. aby określić język urządzenia, musisz sprawdzić pakiet systemowy.NSLocale.preferredLanguages()
. I aktualizowany odpowiedź na poparcie iOS 9 .używam tego
zignoruj wyciek pamięci
i wynik jest
źródło
Tłumaczenie kodów językowych, takich jak en_US na angielski (Stany Zjednoczone), jest wbudowaną funkcją
NSLocale
iNSLocale
nie ma znaczenia, skąd masz kody językowe. Tak naprawdę nie ma powodu, aby wdrażać własne tłumaczenie, jak sugeruje zaakceptowana odpowiedź.Wydruki: angielski, niemiecki, szwedzki
źródło
Nawet istnieje lepszy sposób na uzyskanie aktualnego języka urządzenia. Spróbujmy poniżej kodu -
Sugerowana przez Abizern na tutaj
źródło
Możesz użyć
displayNameForKey:value:
metodyNSLocale
:Spowoduje to wydrukowanie:
Jeśli podasz taki sam identyfikator lokalizacji dla
initWithLocaleIdentifier:
a takżedisplayNameForKey:value:
metoda, to daje rodzimą nazwę języka. Odkryłem, że jeśli usuniesz kod kraju i użyjesz po prostu,fr
ien
że również pominie kraj w nazwie wyświetlanej (przynajmniej w Mac OS X, nie jestem pewien co do iOS).źródło
Szybki
Aby uzyskać bieżący język urządzenia
Aby uzyskać język aplikacji
Uwaga:
Pobiera język podany w CFBundleDevelopmentRegion info.plist
jeśli CFBundleAllowMixedLocalizations ma wartość true w info.plist, wówczas zwracana jest pierwsza pozycja CFBundleLocalizations w info.plist
źródło
Próbowałem znaleźć odpowiednie rozwiązanie dla siebie. Kiedy używam
Locale.preferredLanguages.first
został zwrócony preferowany język z ustawień aplikacji.Jeśli chcesz poznać język z ustawień urządzenia użytkownika, użyj poniższego ciągu:
Szybki 3
Aby rozpakować i użyć, spójrz na linię poniżej:
źródło
Aby uzyskać bieżący język urządzenia użytkownika, użyj następującego kodu, który dla mnie zadziałał.
źródło
iOS13, Swift 5+, WWDC2019 https://developer.apple.com/videos/play/wwdc2019/403/
Użytkownicy mogą wybrać preferowany język aplikacji niezależnie od języka systemu operacyjnego.
Możesz użyć tych:
źródło
W przypadku programistów MonoTouch C # użyj:
Uwaga: wiem, że było to pytanie na iOS, ale ponieważ jestem programistą MonoTouch, odpowiedź na tej stronie poprowadziła mnie we właściwym kierunku i pomyślałem, że podzielę się wynikami.
źródło
W
Swift
:źródło
Szybki 3
źródło
Prosta funkcja Swift 3:
źródło
Jeśli szukasz preferowanego kodu języka („en”, „de”, „es” ...) i zlokalizowanej nazwy preferowanego języka (dla bieżących ustawień regionalnych), oto proste rozszerzenie w Swift:
}
źródło
źródło
Jeśli chcesz uzyskać tylko język, oto moja sugerowana odpowiedź:
W moim przypadku chciałem tylko język regionalny, a nie region regionalny.
Dane wyjściowe: jeśli Twoim językiem lokalizacji jest język japoński, a regionem jest Japonia, to:
langplusreg = ja-JP
langonly = ja
źródło
Odpowiedź @amir w Swift:
źródło
Oczywiście rozwiązania oparte na przykład na
zwykle działają dobrze i zwracają bieżący język urządzenia.
Ale w niektórych przypadkach może być mylące:
Jeśli aplikacja, w której chcesz uzyskać tę wartość, już zmieniła język, na przykład za pomocą tego rodzaju kodu:
W tym przypadku [NSLocale preferowane języki] faktycznie zwraca preferowany zestaw języków (i używany) w tej konkretnej aplikacji, a nie bieżący język urządzenia!
I ... w tym przypadku jedynym sposobem na poprawne pobranie aktualnego języka urządzenia (a nie tego wcześniej ustawionego w aplikacji) jest najpierw wyczyszczenie klucza @ „appleLanguages” w NSUserDefault:
Następnie [NSLocale preferLanguages] zwraca teraz poprawną wartość.
Mam nadzieję, że to pomoże.
źródło
Zaktualizowana odpowiedź dla Swift 4
źródło
NSLocale.preferredLanguages
powinien zwrócić preferowane przez użytkownika, nie zwracając uwagi na to, co jest obsługiwane przez pakiet.W przypadku Swift 3.0 poniżej można użyć kodu, aby odpowiedzieć na twoje pytanie:
źródło
W Swift 4.2 i Xcode 10.1
źródło
Według dokumentacji Apple
źródło
Format dwóch liter. Apple stosuje normę ISO ISO-3166 .
źródło
W przypadku Swift 3:
NSLocale.preferredLanguages [0] as String
źródło
Począwszy od iOS 9, jeśli chcesz tylko kodu języka bez kodu kraju, będziesz potrzebować tego rodzaju funkcji pomocniczej - ponieważ język będzie zawierał kod kraju.
źródło
SWIFT-4
źródło
NSLocale.preferredLanguages
powinien zwrócić preferowane przez użytkownika, nie zwracając uwagi na to, co jest obsługiwane przez pakiet.