2012-08-02 11 views
9

Obecnie mam semi-automated way, aby zlokalizować moje widoki. Jednak dzisiaj znalazłem interesującą sekcję w IB, która wydaje się sugerować, że mogę zlokalizować moje widoki z poziomu Interface Builder.Lokalizacja widoku w serii ujęć za pomocą "Atrybutów definiowanych przez użytkownika"

W IB można zdefiniować atrybuty środowiska wykonawczego dla wybranego obiektu w Inspektorze tożsamości. Tak więc dla mojego UILabel mogę ustawić ścieżkę telefoniczną text na łańcuchu Hello World.

Jednak, gdy wybieram Type = Localized String, a następnie nazwę klucza w moim Localized.strings, nie otrzymam przetłumaczonego ciągu, a raczej tylko wartość (stąd klucz), który wprowadziłem do IB.

Nie rozumiem, jak ten mechanizm powinien działać. Chciałbym kochać, aby móc przetłumaczyć moje poglądy w ten sposób, wszelkie pomysły?

+1

Jestem dokładnie w tym samym punkcie. Czy znalazłeś coś na ten temat? –

Odpowiedz

4

"Zdefiniowane przez użytkownika atrybuty środowiska wykonawczego" są słabo udokumentowane. Z książki, którą czytam, pamiętam, że UDRA została po raz pierwszy zaimplementowana do programowania w systemie MacOSX, więc typ "Zlokalizowany ciąg" może być funkcją, która nie jest w pełni obsługiwana na razie w systemie iOS.

Zabawne jest to, że tłumaczy ciągi w podglądzie storyboardów (xCode 4.5.1), ale później w skompilowanej aplikacji na iOS, po prostu wstrzykuje kluczowy ciąg.

Jednym z rozwiązań, o którym teraz myślę, jest stworzenie lekkiej klasy pomocniczej, czyli sprawdzanie ciągów tekstowych/tytułowych widoków w viewDidLoad dla słowa kluczowego takiego jak "klucz", np. "XYControllerTitleKey", a następnie wykonaj NSLocalizedString-Method na tym.

+1

Niweczono, ponieważ odpowiedź nie jest dokładna (przynajmniej w obecnej wersji Xcode): Typ "Zlokalizowany ciąg" oznacza, że ​​atrybut środowiska wykonawczego będzie uczestniczył w procesie lokalizacji, w przeciwieństwie do zwykłego typu "Ciąg". Możesz to sprawdzić, jeśli wygenerujesz plik ciągów z storyboardu: jeśli użyjesz "String", wartość nie zostanie uwzględniona w wygenerowanym pliku tekstowym; jeśli użyjesz "Zlokalizowanego ciągu", to będzie. –

+0

Jak wspomniano w mojej drugiej uwadze: Narzędzia do lokalizacji obsługują UDRA, jednak środowisko wykonawcze iOS tego nie robi. Wartość UDRA nie jest pobierana z pliku .strings. –

1

Dla mnie, używając iOS 6, jeśli generujesz ciągi z bazowego scenorysu zlokalizowanego (przez wygenerowanie ich przez XCode lub używając ibtool --generate-strings-file otrzymasz automatycznie wygenerowane łańcuchy, które wyglądają tak (na przykład: MainStoryBoard.strings) :

/* Class = "IBUITextField"; b4a-O4-bNZ.ibExternalUserDefinedRuntimeAttributesLocalizableStrings[0] = "Event Name"; ObjectID = "b4a-O4-bNZ"; */ 
"b4a-O4-bNZ.ibExternalUserDefinedRuntimeAttributesLocalizableStrings[0]" = "Event Name"; 

Niestety, byłoby miło mieć je rozpoznać po Path Key, ale przynajmniej masz miejsce, gdzie powinny być zlokalizowane zdefiniowanymi przez użytkownika ciągi

6

Celem „zlokalizowany. Typ "String" pozwala ci zdefiniować wartość atrybutu środowiska wykonawczego, która będzie uczestniczyć w lo proces kalibracji (przy użyciu lokalizacji bazowej). Jest to przydatne, jeśli na przykład zdefiniujesz formant niestandardowy, umieścisz go w serii ujęć i chcesz przypisać dostępny do lokalizacji ciąg do jednej z jego właściwości. Jednak działa to tylko w systemie Mac OS, a nie w systemie iOS.

Możesz łatwo potwierdzić, wykonując następujący eksperyment: umieść UILabel/NSTextField w swoim scenorysie i ustaw właściwość "text"/"stringValue" przy użyciu zdefiniowanego przez użytkownika atrybutu środowiska wykonawczego. Jeśli użyjesz "String" jako typu atrybutu i wygenerujesz odpowiedni plik ciągów, nie zobaczysz go nigdzie w pliku. W przeciwieństwie do tego, jeśli zmienisz typ do „Zlokalizowane string” i generować ciągi złożyć znajdziesz wpis tak:

/* Class = "IBUILabel"; wij-Kq-q92.ibExternalUserDefinedRuntimeAttributesLocalizableStrings[0] = "Localized value"; ObjectID = "wij-Kq-q92"; */ 
"wij-Kq-q92.ibExternalUserDefinedRuntimeAttributesLocalizableStrings[0]" = "Localized value"; 

Następnie można zlokalizować tę wartość w odpowiednim pliku ciągów językowych. Ponownie działa to w systemie Mac OS, ale nie w systemie iOS.

+0

czy to nadal działa tylko w systemie Mac OS, a nie w systemie iOS w 2016 roku? – helloB

+0

Nie wiem, ostatnio tego nie próbowałem. W każdym razie możesz to łatwo sprawdzić, korzystając z procesu opisanego w odpowiedzi. Daj nam znać, jeśli to zrobisz :) –

+0

Już miałem sprawdzić ponownie, powiedzmy, że atrybuty środowiska wykonawczego są tu lepszą opcją i pracują z prostym przesłonięciem setValue forKeyPath, więc jest to opcja, z którą mam zamiar. ta odpowiedź dotarła do mnie najbardziej: http://stackoverflow.com/questions/21870950/localized-string-with-interface-builder-user-defined-runtime-attributes – helloB