2012-07-20 10 views
6

Chcę mieć opcję w mojej aplikacji, aby zmienić język aplikacji (tylko język aplikacji nie cały system), czy mógłbyś podać mi jakieś wskazówki?zmiana ustawienia języka aplikacji w iOS nie całe urządzenie

Dzięki z góry,

wiem o lokalizacji!

+0

Zgaduję, że ten wpis jest dobrym punktem wyjścia: http: // stackoverflow.com/questions/1669645/how-to-force-nslocalizedstring-to-use-a-specific-language –

+0

Myślę, że nie możesz zmienić języka tylko swojej aplikacji bez urządzenia. –

+0

@VineeshTP Możesz zmienić ustawienia językowe urządzenia i symulatora podczas pracy. Spójrz na moją odpowiedź. – Abizern

Odpowiedz

2

Możesz to zrobić, używając niestandardowych flag kompilacji skonfigurowanych z Xcode. W ten sposób można uruchomić aplikację w lokalizacji, a nie zmieniać wszystkich ustawień urządzenia.

napisałem na blogu o tym w http://abizern.org/2012/03/18/simple-localisation-testing/

I jest przykładem projektu na Github, które można użyć, aby zobaczyć go w akcji: https://github.com/Abizern/SimpleLocalisationTesting

+0

Mam to samo pytanie, ale jak mogę to znaleźć -AppleLanguages ​​soryy Jestem nowy na iOS –

+0

To tylko jedna z flag, które możesz przekazać w czasie wykonywania. – Abizern

+1

Dzięki za dokumenty. Ale z tej dokumentacji nie jest w pełni jasne, jak skonfigurować go dla nowicjuszy – User16119012

1

Utworzyłem niestandardową lokalizację stworzoną przez .plist wypełnioną tablicą słowników. W ten sposób:

kYes 
    en = @"Yes" 
    ru = @"Да" 
kNo 
    en = @"No" 
    ru = @"Нет" 

W moim projekcie stworzyłem klasę singleton do czytania tych ciągów. W opcjach użytkownik wybiera potrzebny język (przy pierwszym uruchomieniu aplikacja wybiera język z bieżącego stanu systemu lub ustawia domyślny). Wybrany język musi być zapisany w pliku lub w ustawieniach do użycia przy następnym uruchomieniu. W singleton mam +getStringWithKey:. Tak więc przechodzę tam @ "kYes" i otrzymuję ciąg do bieżącej lokalizacji tylko dla aplikacji. Poza tym będziesz musiał dodać standardowe pliki lokalizacyjne do projektu, nawet puste, ponieważ jeśli tego nie zrobisz, wszystkie obsługiwane języki nie będą wyświetlane w iTunes.

1

I faktycznie myśli o innym pomysł, w jaki sposób zmienić język w aplikacjach, chociaż zmusza Cię do 1. ręcznego ustawiania wszystkich łańcuchów. 2. Podaj metodę (powiadomienie), która aktualizuje wszystkie elementy interfejsu, gdy zmieni się ustawienie języka. Pomysł opiera się na tej samej metodzie, co iOS, aby znaleźć zlokalizowaną wersję ciągu. Dlatego warunkiem wstępnym jest dostarczenie pakietu (np. AppNameStrings.bundle) o strukturze folderów language_id.lproj, gdzie language_id jest oznacznikiem języków, które chcesz udostępnić. Możesz stworzyć taki pakiet, tworząc pakiet ustawień, otwórz go w Finderze i usuń plik root.plist. Następnie potrzebujesz funkcji, której możesz użyć do odczytu ze swojego pakietu. Oto 2 metody, których używam do czytania zlokalizowanych ciągów. umieścić następujące metody w pliku GlobalDefinitions.h

#ifdef __OBJC__ 
NSBundle *yourNameBundle(void); 
NSString *YourNameLocalized(NSString *stringToken, NSString *language); 
#endif 

i ten kod w pliku GlobalDefinitions.m

NSBundle *yourNameBundle(void) { 
static NSBundle* bundle = nil; 
    if (!bundle) { 
    NSString* path = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"YouNameBundle.bundle"]; 
    bundle = [NSBundle bundleWithPath:path]; 
    } 
    return bundle; 
} 
NSString *YourNameLocalized(NSString *stringToken, NSString *language) { 
    if (yourNameBundle()) { 
    return [yourBundle localizedStringForKey:stringToken value:@"" table:@"Root" language:language]; 
    } else { 
    return stringToken; 
    } 
} 

Musisz utworzyć kategorię na NSBundle dla

[yourBundle localizedStringForKey:stringToken value:@"" table:@"Root" language:language] 

ponieważ standardowa metoda pomija parametr języka. W swojej metodzie otwierasz odpowiedni plik language.lproj/Root.strings i skanujesz go w poszukiwaniu ciągu znaków. Jeśli nie możesz go znaleźć, zwróć sam token w przeciwnym razie ciąg tekstowy. Ilekroć potrzebujesz zlokalizowanej wersji jakiegoś tekstu, napisz np. label.text = YourNameLocalized (@ "Token", [self provideLanguageIdentifier]; i gotowe. Nie zrobiłem tego do tej pory, ale powinno działać.

Powiązane problemy