2009-08-07 12 views
14

Pracuję nad zlokalizowaną aplikacją i wszystko działa poprawnie. Problem polega na tym, że chcę zezwolić użytkownikowi na konkretny wybór lenguage dla konkretnej aplikacji w folderze ustawień aplikacji. Powinno to umożliwić użytkownikom, aby ich telefon był ustawiony na jeden język (np. Francuski), aby aplikacja działała w języku angielskim.Tworzenie zlokalizowanej aplikacji na telefon iPhone, ale pozwalając użytkownikowi na zmianę języka aplikacji

Obecnie używam NSLocalizedString, aby uzyskać zlokalizowany ciąg znaków, ale przeglądając wszystkie odmiany makra, nie mogę znaleźć takiego, który pozwoli mi określić język.

Wszelkie pomysły, jak to zrobić?

+0

Czy próbowałeś użyć 'initWithLocaleIdentifier:', aby samemu ustawić język? Na przykład, aby ustawić ustawienia narodowe w Holandii, możesz zainicjować ustawienia narodowe za pomocą: NSLocale * locale = [[NSLocale alloc] initWithLocaleIdentifier: @ "nl_BE"]; – Dimitris

+0

Wątpię, aby to działało, ponieważ utworzyłoby obiekt NSLocale dla określonych ustawień narodowych i nie wpłynie na "bieżące"/"aktywne" ustawienia narodowe. –

Odpowiedz

12

Jest lepszy sposób na zrobienie tego. Można wymusić język tak:

[[NSUserDefaults standardUserDefaults] setObject: [NSArray arrayWithObjects:@"en", nil] forKey:@"AppleLanguages"]; 

I cofnąć to ustawienie przez:

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

NB. zwykle będziesz musiał ponownie uruchomić aplikację, aby to wpłynęło.

Rozważmy jeśli trzeba zadzwonić [[NSUserDefaults standardUserDefaults] synchronize];

zgadzam nie ma potrzeby, aby umożliwić użytkownikowi określić język. Jednak jedynym wyjątkiem jest możliwość zastąpienia języka i ustawienia go na rodzimy język programisty. Jeśli użytkownik może mówić w języku programisty (na przykład po angielsku), może chcieć użyć aplikacji w tym języku, jeśli tłumaczenia są nieprawidłowe.

Odwołuję się do tej odpowiedzi: How to force NSLocalizedString to use a specific language (odpowiedź nie działa dla mnie, ale podążanie za pomysłami w komentarzach.) Cofnij rzeczy, które opracowałem.

+1

Wreszcie. Dzięki –

1

Prawidłowe "doświadczenie użytkownika" polega na tym, że użytkownik wybiera swój język za pomocą panelu preferencji systemu; nie Twoja aplikacja (lub panel ustawień aplikacji itp.). Nie można przesłonić tej aplikacji i nie chcemy, aby jakaś aplikacja zmieniała ustawienia systemowe.

+0

To trochę dziwne, że chce się uruchomić jedną aplikację w innym języku niż wszystkie pozostałe aplikacje. Zastanawiam się, jakie jest uzasadnienie? –

+3

Zgadzam się, że ogólnie masz rację, jednak w krajach wielojęzycznych lub dla użytkowników mówiących więcej niż jednym językiem, czasami zdarza się, że chciałbym użyć jednego języka dla konkretnej aplikacji, podczas gdy moja reszta telefonu jest ustawiona na język angielski. Dobrym przykładem może być strona taka jak przepełnienie stosu, która dla mnie z powodu zawartości zawsze będę chciała widzieć po angielsku, w przeciwieństwie do Facebooka, na którym będę trzymać się mojego ojczystego języka. –

+0

Ponadto zmiana języka w aplikacji jest przydatna w scenariuszach w trybie kiosku (które są najbardziej sensowne w przypadku aplikacji na iPada, nie iPhone'ów, ale nadal ...). –

15

Istnieją trzy kwestie tutaj:

  • Struny
  • innych zasobów (w tym stalówki)
  • komunikaty systemowe

ostatnim jest prawie na pewno nie naprawić, więc będziemy go zostawić być. Będą wyświetlane w języku urządzenia.

Dwie pozostałe są możliwe do rozwiązania, ale trzeba ręcznie wykonać więcej czynności. W przypadku ciągów, zamiast tworzyć pojedyncze Localizable.strings, a następnie je lokalizować, twórz całkowicie oddzielne tabele (English.strings, French.strings itd.). Następnie użyj NSLocalizedStringFromTable(), przekazując język jako tabelę.

W przypadku NIB istnieją dwa podejścia. Możesz umieścić każdy zestaw zlokalizowanych NIBs we własnym Pakiecie, a następnie przekazać ten Pakiet zamiast nil do -initWithNibName:bundle:. Alternatywnie, możesz ręcznie załadować NIBs po znalezieniu ich z [NSBundle -pathForResource:ofType:inDirectory:forLocalization:].

+0

Dzięki, to tylko odpowiedź tutaj, która jest właściwie odpowiedzią na to, o co prosiłem. Twoja sugestia wydaje się być wystarczająco rozsądna i wykorzystuje wbudowaną strukturę do lokalizacji. Dzięki –

+0

To jest fantastyczna odpowiedź. – Brandon

+1

Zauważam, że pytanie nie mówi nic o zrobieniu tego w czasie wykonywania. Zatwierdzona odpowiedź wyraźnie stwierdza, że ​​wymaga ona restartu aplikacji. Ta odpowiedź umożliwia zmianę ustawień regionalnych w czasie wykonywania. To jest dokładnie to, czego szukałem. Dziękuję Ci. – Brandon

Powiązane problemy