2012-09-10 8 views
19

Powiedzmy, że moja aplikacja działa tylko po angielsku. Ale nie chcę wydać nowej wersji za każdym razem, gdy dodaję nowy język. Moją propozycją jest zdalne załadowanie tego pliku localizable.strings do mojej aplikacji.Czy mogę załadować plik localizable.strings do aplikacji iOS przez sieć komórkową?

Moja aplikacja ma możliwość ładowania plików z witryn FTP.

Czy myślisz, że można załadować języki w ten sposób? A może aplikacja musi skompilować plik językowy podczas kompilacji?

+0

To samo pytanie, co http://stackoverflow.com/questions/12358379/is-it-possible-to-access-the-app-bundles-en-lproj? –

+0

Pytanie wydaje się być allready odpowiedział [tutaj] (http://stackoverflow.com/a/6075533/1651167) – Shelm

+1

Jest simular, ale ludzie odpowiadają na różne pytania w zależności od tego, jak są one zadawane. Ta oczywiście ma lepszą odpowiedź poniżej. – mskw

Odpowiedz

32

Wszystkie zlokalizowane zasoby ciągów (plus wiele innych rodzajów zasobów) są pobierane z pakietu. Zwykle aplikacja używa "głównego pakietu", który jest tworzony przez XCode razem z Twoją aplikacją. Możesz jednak utworzyć osobno każdy inny pakiet, pod warunkiem, że utworzysz go z właściwą strukturą, możesz go pobrać w swojej aplikacji i ostatecznie wyodrębnić zlokalizowany łańcuch za pomocą funkcji NSLocalizedStringFromTableInBundle().

Więc powiedzmy, że można wyodrębnić za kluczowy „klucz” do tłumaczy, to normalne składnia byłoby:

NSString *translated = NSLocalizedStringFromTable(@"key",nil,nil); 

ale nie jest wariantem tej opcji, która pozwala określić wiązkę:

NSString *translated = NSLocalizedStringFromTableInBundle(@"key",nil,myBundle,nil); 

w standardowym przypadku wymiany myBundle z [NSBundle mainBundle] ale jeśli chcesz użyć innego wiązkę można określić to w ten sposób:

NSString *myBundlePath = "the path to the downloaded bundle"; 
NSBundle *myBundle = [NSBundle bundleWithPath:myBundlePath]; 
NSString *translated = NSLocalizedStringFromTableInBundle(@"key",nil,myBundle,nil); 

Pełna struktura pakietu można zobaczyć w „Bundle instrukcji programowania” w docs Apple, ale w twoim przypadku można po prostu stworzyć w ten sposób:

  • w Mac utworzyć katalog, i nazwij go "MyBundle"
  • wewnątrz tego katalogu przenieś swoje zlokalizowane łańcuchy (jeśli masz wiele języków w pakiecie, plik localizable.strings będzie wewnątrz katalogów lproj: en.lproj, it.lproj, fr .lproj, ...)
  • następnie zmień nazwę katalogu na "MyBundle.bundle"

Po ostatniej operacji zauważysz, że teraz ten obiekt jest postrzegany jako samodzielny obiekt, ale w rzeczywistości jest katalogiem.

Teraz możesz zdecydować się na podejście z wieloma pakietami lub zastosować technikę z pojedynczym pakietem: w tym ostatnim przypadku możesz spakować wszystkie języki, a następnie użyć unikalnego zaktualizowanego pakietu do tłumaczenia językowego, korzystając z automatycznych reguł lokalizacji systemu ; w drugim przypadku możesz utworzyć pakiet dla każdego języka, a następnie - w oparciu o aktualnie wybrany język - załadować odpowiedni pakiet i wybrać go dla swoich tłumaczeń.

+3

Bardzo przydatne! Niestety, jeśli chcesz dodać lokalizacje metadanych z App Store (które prawdopodobnie chcesz, jeśli dodasz nową lokalizację), musisz mimo to przesłać aktualizację aplikacji ... –

+0

do czego będą używane metadane App Store? – mskw

+1

Tak, lokalizacja metadanych oznacza ponowne przesłanie aplikacji.W takim przypadku możesz scalić nowe języki w pakiecie. Ale prostota metody pobierania pakietów jest taka, że ​​możesz zapewnić lokalizację (i poprawki błędów tłumaczenia) przed każdą aktualizacją aplikacji. Z pewnością podczas następnej aktualizacji aplikacji (poprawki błędów, nowe funkcje) scalisz nowe języki w głównym pakiecie, a także zaktualizujesz metadane. – viggio24

Powiązane problemy