Na iPhonie NSLocalizedString
zwraca ciąg znaków w języku iPhone'a. Czy można wymusić NSLocalizedString
użycie określonego języka, aby aplikacja działała w innym języku niż urządzenie?
263
Na iPhonie NSLocalizedString
zwraca ciąg znaków w języku iPhone'a. Czy można wymusić NSLocalizedString
użycie określonego języka, aby aplikacja działała w innym języku niż urządzenie?
Odpowiedzi:
NSLocalizedString()
(i jego warianty) uzyskaj dostęp do klawisza „AppleLanguages”,NSUserDefaults
aby określić ustawienia użytkownika dla preferowanych języków. Zwraca to tablicę kodów językowych, z których pierwszy jest ustawiony dla użytkownika przez telefon, a kolejne są używane jako rezerwowe, jeśli zasób nie jest dostępny w preferowanym języku. (na pulpicie użytkownik może określić wiele języków z niestandardową kolejnością w Preferencjach systemowych)Jeśli chcesz, możesz zastąpić globalne ustawienie własnej aplikacji, używając metody setObject: forKey: do ustawienia własnej listy języków. Będzie to miało pierwszeństwo przed ustawioną globalnie wartością i zostanie zwrócone do dowolnego kodu w aplikacji, który dokonuje lokalizacji. Kod do tego wyglądałby mniej więcej tak:
To sprawiłoby, że niemiecki byłby preferowanym językiem dla twojej aplikacji, a angielski i francuski jako awarie. Możesz to nazwać na początku uruchamiania aplikacji. Możesz przeczytać więcej o preferencjach językowych / regionalnych tutaj: Internacjonalizacja Tematy programowania: Pobieranie bieżącego języka i ustawień regionalnych
źródło
Miałem ostatnio ten sam problem i nie chciałem uruchamiać i łatać całego NSLocalizedString ani zmuszać aplikacji do ponownego uruchomienia, aby nowy język działał. Chciałem, żeby wszystko działało takie, jakie jest.
Moim rozwiązaniem była dynamiczna zmiana klasy pakietu głównego i załadowanie tam odpowiedniego pakietu:
Plik nagłówka
Realizacja
Zasadniczo po uruchomieniu aplikacji i przed załadowaniem pierwszego kontrolera wystarczy wywołać:
Gdy użytkownik zmieni preferowany język na ekranie ustawień, po prostu zadzwoń ponownie:
Aby przywrócić ustawienia domyślne systemu, wystarczy przekazać zero:
Cieszyć się...
Dla tych, którzy potrzebują wersji Swift:
źródło
Zwykle robię to w ten sposób, ale MUSISZ mieć wszystkie pliki lokalizacji w swoim projekcie.
źródło
Nie używaj w systemie iOS 9. Zwraca zero dla wszystkich ciągów przez niego przechodzących.
Znalazłem inne rozwiązanie, które pozwala zaktualizować ciągi językowe, bez ponownego uruchamiania aplikacji i zgodne z ciągami znaków:
Umieść to makro w Prefix.pch:
i gdziekolwiek potrzebujesz zlokalizowanego ciągu znaków:
Aby ustawić język, użyj:
Działa nawet z kolejnymi przeskokami językowymi, takimi jak:
źródło
Jak powiedziano wcześniej, po prostu wykonaj:
Ale aby uniknąć konieczności ponownego uruchamiania aplikacji, umieść wiersz w głównej metodzie
main.m
tuż przedUIApplicationMain
(...).źródło
NSAutoreleasePool * pool ..
jak wycieknie kilka automatycznie wydanych obiektów.[[NSBundle mainBundle] URLForResource:withExtension:]
wcześniej.Sztuczka polegająca na użyciu określonego języka przez wybranie go z aplikacji polega na wymuszeniu
NSLocalizedString
użycia określonego pakietu w zależności od wybranego języka,oto post, który napisałem dla tej zaawansowanej lokalizacji nauki w aplikacjach iOS
a oto kod jednej przykładowej zaawansowanej lokalizacji aplikacji w aplikacjach iOS
źródło
Co sądzisz o tym rozwiązaniu dla Swift 3?
Proste użycie:
źródło
Jak wspomina Brian Webster, język należy ustawić „na początku uruchamiania aplikacji”. Myślałem
applicationDidFinishLaunching:
oAppDelegate
powinno to być odpowiednie miejsce do zrobienia tego, ponieważ tam wykonuję całą inną inicjalizację.Ale, jak wspomina William Denniss, wydaje się, że działa to dopiero po ponownym uruchomieniu aplikacji, co jest w pewnym sensie bezużyteczne.
Wydaje się, że działa dobrze, jeśli wstawię kod do głównej funkcji, jednak:
Będę wdzięczny za wszelkie komentarze na ten temat.
źródło
[[NSUserDefaults standardUserDefaults] synchronize];
po rozmowie telefonicznejsetObject:forKey:
Najbardziej podoba mi się metoda Mauro Delrio. Dodałem również następujące elementy w moim Project_Prefix.pch
Jeśli więc kiedykolwiek chcesz użyć standardowej metody (która używa NSLocalizedString), możesz szybko podstawić składnię we wszystkich plikach.
źródło
NSLocalizedString()
odczytuje wartość kluczaAppleLanguages
ze standardowych wartości domyślnych użytkownika ([NSUserDefaults standardUserDefaults]
). Wykorzystuje tę wartość, aby wybrać odpowiednią lokalizację spośród wszystkich istniejących lokalizacji w czasie wykonywania. Gdy Apple tworzy słownik domyślny użytkownika podczas uruchamiania aplikacji, wyszukuje preferowany język (-y) w preferencjach systemowych i kopiuje z niego wartość. To wyjaśnia również na przykład, dlaczego zmiana ustawień języka w OS X nie ma wpływu na uruchamianie aplikacji, tylko na aplikacje uruchomione później. Po skopiowaniu wartość nie jest aktualizowana tylko dlatego, że zmieniają się ustawienia. Dlatego iOS ponownie uruchamia wszystkie aplikacje, jeśli zmienisz język.Jednak wszystkie wartości słownika domyślnego użytkownika mogą zostać zastąpione argumentami wiersza poleceń. Zobacz
NSUserDefaults
dokumentację naNSArgumentDomain
. Obejmuje to nawet te wartości, które są ładowane z pliku preferencji aplikacji (.plist). To naprawdę dobrze wiedzieć, jeśli chcesz zmienić wartość tylko raz podczas testowania .Jeśli więc chcesz zmienić język tylko na potrzeby testowania, prawdopodobnie nie chcesz zmieniać kodu (jeśli zapomnisz usunąć go później ...), zamiast tego powiedz Xcode, aby uruchomił aplikację z parametrami wiersza poleceń ( np. użyj hiszpańskiej lokalizacji):
W ogóle nie trzeba dotykać kodu. Po prostu utwórz różne schematy dla różnych języków i możesz szybko uruchomić aplikację raz na jeden język, a raz na inny, po prostu przełączając schemat.
źródło
Options
jak w przypadku nowszych wersji Xcode, które Apple oferuje także.Wymyśliłem rozwiązanie, które pozwala ci używać
NSLocalizedString
. Tworzę kategorięNSBundle
połączeńNSBundle+RunTimeLanguage
. Interfejs jest taki.Implementacja jest taka.
Następnie dodaj import
NSBundle+RunTimeLanguage.h
do używanych plikówNSLocalizedString
.Jak widać, przechowuję mój languageCode we właściwości
AppDelegate
. To może być przechowywane w dowolnym miejscu.Jedyne, co mi się nie podoba, to Ostrzeżenie, które na
NSLocalizedString
nowo zdefiniowało Marco. Być może ktoś może mi pomóc naprawić tę część.źródło
#undef NSLocalizedString
tuż przed,#define
aby wyłączyć ostrzeżenieWersja szybka:
źródło
W skrócie :
Znajdź swoją aplikację
Pierwszą rzeczą, którą musisz zrobić, to zlokalizować aplikację w co najmniej dwóch językach (angielski i francuski w tym przykładzie).
Przesłoń NSLocalizedString
W kodzie zamiast
NSLocalizedString(key, comment)
używać makraMYLocalizedString(key, comment)
zdefiniowanego w następujący sposób:#define MYLocalizedString(key, comment) [[MYLocalizationSystem sharedInstance] localizedStringForKey:(key) value:(comment)];
Ten
MYLocalizationSystem
singleton:Ustaw język użytkownika
Gdy użytkownik zmieni język aplikacji na francuski, zadzwoń
[[MYLocalizationSystem sharedInstance] setLanguage:@"fr"];
W tym przykładzie ta metoda ustawiła zlokalizowany pakiet na fr.lproj
Zwróć zlokalizowany ciąg
Po ustawieniu zlokalizowanego pakietu będziesz mógł uzyskać od niego odpowiedni zlokalizowany ciąg za pomocą tej metody:
Mam nadzieję, że to ci pomoże.
Więcej szczegółów znajdziesz w tym artykule z NSWinery.io
źródło
Rozszerzenia Swift 3:
Stosowanie:
źródło
W pliku .pch, aby zdefiniować:
źródło
Może powinieneś uzupełnić ten (w pliku .pch po #import):
źródło
Rozwiązanie Swift 3:
Podano przykłady kodów językowych, których można użyć. Mam nadzieję że to pomoże
źródło
Możesz zbudować pakiet częściowy z zestawem zlokalizowanych ciągów, z którymi chcesz to zrobić, a następnie użyć
NSLocalizedStringFromTableInBundle()
do ich załadowania. (Zakładam, że jest to treść oddzielna od zwykłej lokalizacji interfejsu użytkownika, którą możesz wykonywać w aplikacji).źródło
w moim przypadku mam dwa zlokalizowane pliki, ja i en
i chciałbym zmusić go do en, jeśli preferowanym językiem w systemie nie jest en ani ja
zamierzam edytować plik main.m
sprawdzę, czy pierwszym preferowanym jest en lub ja, jeśli nie, zmienię drugi preferowany język na en.
źródło
Możesz zrobić coś takiego:
źródło
Na podstawie odpowiedzi Tudorizera, aby zmienić język bez opuszczania lub ponownego uruchamiania aplikacji.
Zamiast makra użyj klasy, aby uzyskać dostęp do preferowanego języka, aby sprawdzić, czy występuje określony kod języka.
Poniżej znajduje się klasa używana do uzyskania bieżącego pakietu językowego, który działa na iOS 9:
Użyj powyższej klasy, aby odwołać się do pliku ciągu / obrazu / wideo / etc:
Zmień język in-line, jak poniżej lub zaktualizuj metodę „changeCurrentLanguage” w powyższej klasie, aby pobrać parametr ciągu odwołujący się do nowego języka.
źródło
W swift 4 rozwiązałem go bez konieczności ponownego uruchamiania lub używania bibliotek.
Po wypróbowaniu wielu opcji znalazłem tę funkcję, w której przekazujesz stringToLocalize (pliku Localizable.String, plik ciągów), który chcesz przetłumaczyć, oraz język, w którym chcesz go przetłumaczyć, a to, co zwraca, to wartość ten ciąg znaków, który masz w pliku ciągów:
Biorąc pod uwagę tę funkcję, stworzyłem tę funkcję w pliku Swift:
Aby uzyskać dostęp z całej aplikacji oraz w każdym ciągu pozostałych elementów ViewControllers, zamiast umieszczać:
Zastąpiłem go
Nie wiem, czy to najlepszy sposób, ale uznałem to za bardzo proste i działa dla mnie, mam nadzieję, że ci to pomoże!
źródło
Ta funkcja spróbuje uzyskać zlokalizowany ciąg dla bieżącego języka, a jeśli go nie znajdzie, otrzyma go w języku angielskim.
źródło
Chciałem dodać obsługę języka, który nie jest oficjalnie obsługiwany przez iOS (niewymieniony w sekcji Język w ustawieniach systemu). Postępując zgodnie z samouczkiem internacjonalizacji Apple i kilkoma wskazówkami Briana Webstera i geona, wymyśliłem ten fragment kodu (umieść go w main.m):
Działa to dobrze zarówno dla kodu Storyboard, jak i NSLocalizedString. Kod zakłada, że użytkownik będzie miał później opcję ręcznej zmiany języka w aplikacji.
Oczywiście nie zapomnij dodać poprawnych tłumaczeń Storyboard i Localizable.strings (aby to zrobić, zobacz link do strony Apple powyżej).
źródło
Oto przyzwoite rozwiązanie tego problemu i nie wymaga ponownego uruchomienia aplikacji.
https://github.com/cmaftuleac/BundleLocalization
Ta implementacja działa poprzez podkręcenie w NSBundle. Chodzi o to, że przesłonisz metodę localizedStringForKey w instancji obiektu NSBundle, a następnie wywołujesz tę metodę w innym pakiecie z innym językiem. Prosty i elegancki w pełni kompatybilny ze wszystkimi rodzajami zasobów.
źródło
NSString *path = [[NSBundle mainBundle] pathForResource:lang ofType:@"lproj" ];
cokolwiek byście nie zrobili, najlepszym sposobem jest pobranie krótkiej nazwy dla określonego języka, tj .: fr, en, nl, de, it itp. ... i przypisanie jej do wartości globalnej.
utwórz widok selektora, aby wyskoczył jak menu rozwijane (kombinacja przycisku, po kliknięciu którego pojawi się widok selektora z listą języków) i wybierz żądany język. niech krótka nazwa będzie przechowywana wewnętrznie. utwórz plik .h + .m o nazwie LocalisedString.
Ustaw wartość globalną short_name na równą wartości uzyskanej w LocalisedString.m Po wybraniu wymaganego języka przypisz ścieżkę NSBundlePath, aby utworzyć podkatalogi projektu dla potrzebnego języka. na przykład nl.proj, en.proj.
Po wybraniu konkretnego folderu proj wywołaj zlokalizowany ciąg znaków dla odpowiedniego języka i zmieniaj język dynamicznie.
żadnych zasad łamanych.
źródło
W przypadku Swift można zastąpić
main.swift
plik i ustawić tam ciąg UserDefaults przed uruchomieniem aplikacji. W ten sposób nie musisz ponownie uruchamiać aplikacji, aby zobaczyć pożądany efekt.sparowany wraz z usunięciem
@UIApplicationMain
w TwoimAppDelegate.swift
pliku.źródło