2010-11-01 13 views
34

Pracuję nad aplikacją dla klienta w Europie. Jestem Anglikiem w USA. Nasza aplikacja obsługuje wiele języków, ale nie angielski. Mam wszystkie ciągi w naszej aplikacji w przetłumaczonych plikach Localized.strings, poprawnie skonfigurowanych dla różnych języków i wszystkie działają poprawnie, gdy urządzenie jest ustawione na prawidłowy język (językiem urządzenia jest niemiecki = aplikacja jest poprawnie zlokalizowana dla języka niemieckiego) .Domyślny język inny niż angielski dla aplikacji na iOS?

Jest problem, gdy urządzenie nie jest ustawione na jednym z języków mamy wsparcie, na przykład, na moim telefonie, który jest ustawiony na angielski. W takich przypadkach chcemy, aby telefon wracał do niemieckiego, ale tak się nie dzieje. Widzimy, że telefon używa języka, który wydaje się najwyższy na liście języków w sekcji International Settings.app. Dla mojego telefonu najwyższy nieangielski język na liście jest francuski, więc kiedy uruchomię aplikację, jest ona zlokalizowana na język francuski. Jeśli zmienię swój telefon na niemiecki, a następnie z powrotem na angielski (który zmienia kolejność na liście języków), aplikacja lokalizuje się na język niemiecki.

Jak zapewnić domyślną aplikację dla języka niemieckiego dla języków nieobsługiwanych? Użyłem this tutorial do ustawienia ustawień regionalnych dla projektu. Obejmuje to usunięcie domyślnego ustawienia narodowego "języka angielskiego", które jest tworzone podczas pierwszej lokalizacji pliku. W pliku projektu, dodałem:

developmentRegion = de; 

Również w Info.plist mam

<key>CFBundleDevelopmentRegion</key> 
<string>de</string> 

bez powodzenia.

Wszelkie pomysły będą mile widziane!

Odpowiedz

42

Domyślanie się określonego języka nie jest tym, do czego powinieneś dążyć. Załóżmy, że japoński użytkownik mieszkający we Francji i płynnie mówiąc po francusku ma swój telefon ustawiony na japoński. Twoja aplikacja byłaby domyślnie niemieckim, mimo że ma tłumaczenie na francuski; Domyślam się, że nie tego chcesz i na pewno nie jest to, czego chce użytkownik.

Z tego powodu proponuję do przestrzegania priorytetów język ustawiony przez użytkownika.

Ponieważ nie chcesz obsługiwać języka angielskiego, ale aplikacja została opracowana w języku angielskim, najprostszą rzeczą, którą możesz zrobić, to po prostu pozbyć się en.lproj zaraz po kompilacji. To pozostawi aplikację tylko z języków, które zamierzają wspierać, a iPhone wybrał język najlepiej nadaje się dla użytkownika, jak określono w domyślnych iPhone.


Jest to dość proste rozwiązanie usuwanie konkretną lokalizację:

Let Xcode zbudować aplikację ze wszystkich obecnych lokalizacjach i tuż przed podpisywania kodu w rzutach usunąć folder en.lproj i wszystko zlokalizowaną pliki tego języka zniknęły. Można łatwo to zrobić poprzez dodanie skryptu Run zbudować fazy do celu, zawierający tę jedną linię kodu (jest to Bash Script):

rm -r "${TARGET_BUILD_DIR}/${PRODUCT_NAME}.app/en.lproj" 

Podpisywanie kodu zawsze rozpoczyna się po wszystkim budować fazy zostały zakończone, więc po prostu umieść tę fazę budowy na końcu twoich bieżących faz.

Uwaga, że zwiększa to czas budowania, ponieważ Xcode odtwarza wszystkie pliki angielskiego, więc może chcesz wyłączyć ten krok podczas badań.

Mam nadzieję, że to rozwiązanie dla Ciebie.


chodzi „aplikacja może spaść z powrotem do niemieckiego w przypadku, że odpowiednia lokalizacja nie istnieje”:

Pytanie jest co jest odpowiednia lokalizacja? Jeśli trzeci wybór użytkownika to francuski (po 2 nieobsługiwanych językach), to rozwiązanie spowoduje powrót aplikacji do języka francuskiego, który jest odpowiednią lokalizacją pod numerem . Bardziej odpowiednie niż ustawienie piątego wyboru użytkownika, niemiecki, ręcznie.

Co się dzieje, gdy aplikacja jest uruchamiana jest prosta: system operacyjny opuści listę języków użytkowników, zgodnie z ustawieniami Preferencje, dopóki nie znajdzie zgodnej lokalizacji i używa tego języka. Powodem, dla którego wiele aplikacji domyślnie jest angielskich, a nie niemieckich, jest to, że angielski pojawia się na większości list języków użytkownika nad niemieckim. Nie ma naturalnej preferencji językowej dla systemu. Jeśli usuniesz tłumaczenie na język angielski, dostępne są tylko te języki, które chcesz obsłużyć, i tych języków, które znajdują się wyżej na liście użytkowników.

+0

Pascal ma właściwą odpowiedź: aplikacja powróci do następnej najbardziej rozsądnej lokalizacji; jest to zgodne z projektem i jest sposobem działania wszystkich aplikacji na iOS i Mac OS X. Twoja aplikacja nie jest wyjątkowa. –

+2

Nadal zastanawiam się nad tą odpowiedzią. Chociaż jest to oczywiście dobrze przemyślana odpowiedź, na koniec wymaga tego, że aplikacja musi wrócić do języka niemieckiego w przypadku, gdy nie istnieje odpowiednia lokalizacja; nie można tego negocjować z klientem. Co ciekawe, w tytule mojego pytania nawiązuję do tego, że jeśli folder English.lproj jest przechowywany w projekcie, to jest używany jako element rezerwowy, gdy nie ma dostępnej innej lokalizacji.Jeśli nie mogę wymyślić niczego innego, po prostu zatrzymam ten folder i skopiuję tam zasoby "de". –

+2

Nie, angielski nie jest także domyślnym systemem. To proste, system operacyjny ma listę lokalizacji, zgodnie z preferencjami. Podczas uruchamiania aplikacji szuka odpowiednich folderów * .lproj i używa pierwszej, która pasuje do języka z listy. Dlatego używa angielskiego, kiedy nic innego nie jest w pobliżu. ;) Ale znam inną sztuczkę, sformułuję nową odpowiedź ... – Pascal

13

Nie podoba mi się opublikowanie tej odpowiedzi, ponieważ działa ona przeciwko Wytycznych interfejsu ludzkiego Apple. Lokalizacje są czymś, co powinien ustawić użytkownik, a nie czymś, co powinno zarządzać, więc menedżerowie wymagający określonego języka domyślnego nie rozumieją niczego i powinni zmienić firmę.

W ten sposób można wymusić na systemie iOS używanie pewnych języków w określonej kolejności. Używam tego głównie do debugowania lokalizacji bez potrzeby ustawiania języka urządzenia na coś innego, czy można go użyć do rozwiązania nieistniejącego problemu w tym pytaniu, którego nie mogę powiedzieć.

Istnieje klucz AppleLanguages w domyślnych ustawieniach użytkownika, który określa kolejność języków, które mają być używane, zwykle ustawione w kolejności, jaką użytkownik ustawia w preferencjach systemu iOS. Jeśli zmienisz to zamówienie, aplikacja spróbuje najpierw znaleźć lokalizacje w tej kolejności. Co można zrobić, to przeczytać aktualne preferencje językowe i decydują się domyślnie niemieckim następująco:

NSArray *langOrder = [NSArray arrayWithObjects:@"de", nil]; 
[[NSUserDefaults standardUserDefaults] setObject:langOrder forKey:@"AppleLanguages"]; 

Należy pamiętać, że trzeba to zrobić w main.m przed UIApplicationMain, w przeciwnym razie trzeba ponownie uruchomić aplikację dla tej zmiany do podjęcia efekt.

Nie mogę stwierdzić wystarczająco dużo, że nikt nie powinien robić tego w prawdziwej aplikacji, chyba że przejdziesz przez całą drogę i zaimplementujesz ustawienie preferencji, które pozwala użytkownikowi ręcznie zmienić język. Jeśli po prostu ustawiłeś na domyślny język, użytkownik nie ma możliwości zmiany swojego wyboru na.

+3

Mamy przykład z prawdziwego świata, który nie łamie żadnego HIG lub jakiegokolwiek innego. Ponadto dziękuję Pascalowi za udzielenie odpowiedzi (choć po ekssezie). Nienawidzę, gdy ludzie odpowiadają sugestią/radą/wskazówkami, które nie są związane z pytaniem technicznym: albo odpowiadasz, albo nie ... w każdym razie: opracowujemy aplikację na rynek międzynarodowy (tak, to jest w angielski), ale musimy dostarczyć dostosowaną wersję dla włoskiego klienta. Baza kodów jest taka sama i chcemy ** wymusić ** (zgodnie z życzeniem klienta) dostosowaną wersję w języku włoskim. Niezależnie od ustawień użytkownika (np. Na moim iPadzie) – zontar

+1

Jest to użyteczne, ale jeśli mam ekran startowy z internacjonalizacją, to nie stosuje poprawnego obrazu, nawet jeśli umieściłem kod na main.m, czy wiesz jak ja można to naprawić? Dzięki – JERC

+0

HIG to zbiór wytycznych (nie reguł) z jakiegoś powodu. W moim przypadku aplikacja jest aplikacją typu Point-of-Sale Enterprise i musi prowadzić działalność w walucie lokalizacji sklepu. Ceny pobierane z bazy danych serwera to IN, USD, Yen lub cokolwiek innego. Jeśli użytkownik ustawi locale na coś innego, dzieje się coś złego. Niestety moja aplikacja nie może pobrać ustawień lokalnego sklepu (a.k.a. server), dopóki nie minie nam dużo czasu. Czy mam inną opcję niż porównywanie ustawień narodowych urządzenia do tego, czego wymaga sklep i wyświetlanie alertu? –

-1

Spróbuj tego w swoim didFinishLaunchingWithOptions() funkcja

[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"de_DE", nil] forKey:@"AppleLanguages"]; 
[[NSUserDefaults standardUserDefaults] synchronize]; 
int retVal = UIApplicationMain(argc, argv, nil, nil); 
Powiązane problemy