2012-05-31 7 views
7

Czy można uzyskać zlokalizowany łańcuch z określonego pliku zlokalizowanego.strings, a nie z wybranego pliku zlokalizowanego zlokalizowanego.strings, TYLKO JEDEN CZAS. Nie muszę zmieniać wszystkich zlokalizowanych tekstów, tylko niektóre z nich.Iphone sdk - pobierz zlokalizowany tekst z określonego pliku zlokalizowanego.strings

Co chcę zrobić, to mieć zlokalizowane łańcuchy zdefiniowane z preferencji językowych, ale także z lokalizacji. Aby użytkownik z Brazylii z angielskim językiem dostał aplikację w języku angielskim, ale niektóre teksty będą specyficzne dla regionu, więc chcę je po portugalsku.

Ale użytkownik z Argentyny, również z iPhone'em w języku angielskim, otrzyma aplikację w języku angielskim, ale niektóre teksty będą w języku hiszpańskim.

Coś

NSLocalizedStringFromTable("string.key","pt_BR",nil) 

Myślałem, że wysyłanie że do stołu parametr będzie działać, ale tak się nie stało, jak to wygląda na nazwę pliku, a nie na języku.

Odpowiedz

3

Być może chcesz użyć NSBundle's localizedStringForKey:value:table: zamiast NSLocalizedString(). Ta metoda daje możliwość określenia innej tabeli.

[[NSBundle mainBundle] localizedStringForKey:@"stringKey" 
    value:defaultString table:tableName]; 

BTW, nie zapomnij @ przed ciągów objective-c ;-).

+0

Tak mi chodziło, ale parametr Tabela to nazwa pliku .strings, więc muszę mieć dwa dodatkowe pliki pt.strings i es.strings, zamiast używać pożądanego pliku Localizable.strings fil mi. Nie jest to problem do wdrożenia, ale nie odpowiada na moje pytanie. – htafoya

1
+1

Tak, miałem na myśli, ale parametr Table jest nazwą pliku .strings, więc muszę mieć dwa dodatkowe pliki pt.strings i es.strings, zamiast używać pożądanego pliku Localizable.strings. – htafoya

+0

Twoje pytanie nie było wtedy tak jasne, ponieważ wydawało się, że pyta, jak uzyskać je z innego pliku. "Czy jest możliwe pobranie zlokalizowanego ciągu znaków z określonego pliku, a nie z predefiniowanego pliku zlokalizowanego.strings." – Dad

4

Można użyć innego wiązkę o wybór konkretnego języka:

NSString * path = [[NSBundle mainBundle] pathForResource:@"pt-PT" ofType:@"lproj"]; 
NSBundle * bundle = nil; 
if(path == nil){ 
    bundle = [NSBundle mainBundle]; 
}else{ 
    bundle = [NSBundle bundleWithPath:path]; 
} 
NSString * str = [bundle localizedStringForKey:@"a string" value:@"comment" table:nil]; 

Swift 3.0:

extension Bundle { 
    static let base: Bundle = { 
     if let path = Bundle.main.path(forResource: "Base", ofType: "lproj") { 
      if let baseBundle = Bundle(path: path) { 
       return baseBundle 
      } 
     } 
     return Bundle.main 
    }() 
} 

let localizedStr = Bundle.base.localizedString(forKey: key, value: nil, table: table) 
+1

To jest genialne - nie wiem, dlaczego nie ma więcej przebojów. Znacznie łatwiejsze niż wszystkie inne sugerowane metody. Używam go do pobrania wersji napisu w języku programowania, więc używam '[[NSBundle mainBundle] pathForResource: @" Base "ofType: @" lproj "];' – deltacrux

+0

To jest najlepsza odpowiedź, testowałem to i to działa! Dodano wersję Swift 3.0. – kelin