Czy można zaktualizować ciągi zlokalizowanej scenorysu?

226

Zlokalizowałem część mojej aplikacji, tworząc dla niej storyboard base.lproj i 3 ciągi znaków. To było miesiąc temu, a potem dodałem nowy kontroler widoku do aplikacji, ale przyciski i etykiety tego kontrolera nie pojawiają się w plikach łańcuchowych

Czy to możliwe, aby zaktualizować ten 3 ciąg znaków dołączony do scenorysu, czy muszę programowo dodać nowe tłumaczenia ciągów przy użyciu NSLocalizableString i Localizable.strings?

GeLB
źródło

Odpowiedzi:

264

Istnieją dwie opcje:

opcja 1

Xcode może „ponownie załadować” plik, konwertując go na typ pliku [Konstruktor interfejsów Cocoa Touch Storyboard] lub typ pliku [Ciągi lokalizowalne] .

  1. Wybierz podstawowy plik scenorysu z Nawigatora projektu
  2. Znajdź sekcję Lokalizacja w Inspektorze plików
  3. Jeśli plik ma obecnie [Lokalizowalne ciągi], zmień go na [Konstruktor interfejsów Cocoa Touch Storyboard] lub odwrotnie.
  4. Xcode powinien przekonwertować storyboard do bieżącej wersji, zachowując starania związane z lokalizacją. Tutaj możesz zmienić plik z powrotem na oryginalny typ pliku, jeśli chcesz.

Opcja 2

Użyj ibtool, aby wyodrębnić ciągi w swojej serii ujęć.

  1. Otwórz aplikację Terminal

  2. Znajdź katalog Base.lproj

  3. Użyj tej linii, aby wyodrębnić ciągi:

    ibtool MainStoryboard.storyboard --generate-strings-file file_name.strings

  4. Po wyodrębnieniu ciągów przez ibtool do file_name.strings, możesz skopiować i wkleić go do oryginalnego pliku .strings

Odwiedź, aby uzyskać więcej informacji: https://conyac.cc/business/columns/localization_guide_ios

Tha Leang
źródło
1
Wypróbowałem opcję 1, ale zmiana typu pliku z [Lokalizowalne ciągi] na [Konstruktor interfejsów Cocoa Touch Storyboard] zawsze powoduje awarię Xcode 5.0.1. Przyczyną może być to, że - ponieważ nie byłem świadomy powyższych możliwości - wcześniej edytowałem pliki lokalizacji scenorysu.
Reinhard Männer
16
Opcja 1 działa. Ale musisz zmienić z „Lokalizowalnego ..” na „Interfejs ...”, a następnie ponownie!
João Nunes,
3
Opcja 1 nie działa dla mnie przy użyciu XCode 6.0.1. Podczas próby konwersji mojego pliku .strings do .interfacebuilder XCode pyta, czy pliki powinny zostać przekonwertowane. Pliki są tworzone w systemie plików, jednak pliki ciągów nadal pozostają i zawierają stare wartości.
Bouncing Bit
53
Dla mnie Opcja 1 zastąpiła wszystkie już przetłumaczone ciągi na angielskie. Musiałem ponownie dodać tłumaczenie.
Mihail Velikov
5
Opcja 1 wydaje się bardzo niestabilna w Xcode 7. Czasami działa, a czasem nie. Czasami losowo zastępuje niektóre z moich już przetłumaczonych ciągów ponownie wersjami angielskimi.
Adam Johns
76

Sprawdź BartyCrouch , doskonale rozwiązuje Twój problem. Jest to również oprogramowanie typu open source , aktywnie utrzymywane i można je łatwo zainstalować i zintegrować z projektem.


Zainstaluj BartyCrouch przez Homebrew :

brew install bartycrouch

Możesz też zainstalować go za pomocą mennicy :

mint install Flinesoft/BartyCrouch

Stopniowo aktualizuj swoje pliki Storyboard / XIBs Strings:

$ bartycrouch update

To zrobi dokładnie to, czego szukałeś.


W celu utrzymania swoich obrazkowa / XIBs Struny pliki aktualizowane w miarę upływu czasu Gorąco polecam dodanie skryptu budowlanej (instrukcje jak dodać skrypt kompilacji tutaj ):

if which bartycrouch > /dev/null; then
    bartycrouch update -x
    bartycrouch lint -x
else
    echo "warning: BartyCrouch not installed, download it from https://github.com/Flinesoft/BartyCrouch"
fi

Oprócz stopniowej aktualizacji plików ciągów scenorysów / XIB-ów zapewni to również, że Twoje Localizable.stringspliki będą aktualizowane o nowo dodane klucze w kodzie przy użyciu NSLocalizedStringi pokażą ostrzeżenia o zduplikowanych kluczach lub pustych wartościach.

Koniecznie sprawdź BartyCrouch na GitHub lub w tym szczegółowym artykule, aby uzyskać dodatkowe informacje.

Jeehut
źródło
1
Łał! To narzędzie jest po prostu niesamowite. To wymaga więcej pozytywnych opinii!
ph1lb4
1
cudowne narzędzie - koniec ręcznego kopiowania / wklejania nowych tekstów etykiet w plikach * .strings (... i zapominanie o tłumaczeniu nowej etykiety jak wcześniej) ... Wielkie dzięki!
iKK
czy istnieje podobna kapsuła dla projektów OBJC?
rickrvo
2
Oto odpowiedź, której szukamy. To powinna być zaakceptowana odpowiedź.
Juanjo
3
Nie rozumiem, dlaczego po 6 latach od momentu zadania tego pytania wciąż jest wymagane to niejednoznaczne rozwiązanie, aby działało w Xcode. Apple powinien było nad tym popracować.
huggie
57

Możesz ręcznie dodać klucz do pliku lokalizacji. Możesz znaleźć kluczowy obiekt, wybierając go w edytorze scenariuszy. Rzućmy okiem na Object-IDinspektora tożsamości. To wygląda jak"nwc-b2-19c"

W aktualizacji lokalizacji lub dodaj tłumaczenie. Na przykład :

"nwc-b2-19c.title" = "Translated title";
Sébastien REMY
źródło
8
myślę, że jest to mniej ryzykowne podejście
Nicolas Manzini
Ale niektóre identyfikatory obiektów nie są wyświetlane w pliku .string. Ponieważ nie są połączone. Co wtedy mogę zrobić?
Mihir Oza
czy istnieje sposób, aby wybrać go za pomocą nazwy, a nie tylko automatycznie generowanego identyfikatora?
cocoseis
W przypadku UILabel: „YeB-ap-Wkw.text” = „Tekst moich etykiet”;
ioopl
30

Ten nie jest dla wszystkich, ale nie wymaga żadnych dodatkowych narzędzi w terminalu i jest łatwy do drobnych ręcznych zmian. (Nie bierz tego pod uwagę, jeśli chcesz zautomatyzować proces).

Krok 0: Konfiguracja języka scenorysu

  • Baza (z tekstami w języku angielskim)
  • Angielski (zlokalizowany plik ciągów nie istnieje, ponieważ plik podstawowy jest w języku angielskim)
  • inne języki (lokalizowalne pliki ciągów)

konfiguracja podstawowa

Ten krok jest wykonywany tylko raz.

Teraz, gdy dodam coś do scenorysu, wykonuję następujące czynności

Krok 1: dodaj plik ciągów lokalizowalnych w języku angielskim

Dodaj angielski

zaznacz angielski element zamówienia.

Spowoduje to utworzenie całkowicie nowego, zlokalizowanego w języku angielskim pliku ciągów ze wszystkimi wierszami

Krok 2: skopiuj nowe elementy zamówienia do innych plików językowych

i przetłumacz je

Krok 3: usuń zaznaczenie z języka angielskiego, usuń odpowiedni zlokalizowany plik ciągów

plik był potrzebny tylko do uzyskania nowych elementów zamówienia

Jest to łatwy i szybki proces, wszystko odbywa się w edytorze scenariuszy

Edytować:

Ten proces działa bardzo dobrze w przypadku małych scenariuszy. Na przykład mam projekt oparty na kartach i mam scenorys dla każdej karty.

Wyszukaj „odniesienie do scenorysu”, aby znaleźć samouczki.

Dobry przykład: odniesienie do scenorysu w Xcode, gdzie powinniśmy go użyć?

Tak więc każda mała storyboard ma tylko kilka ciągów do zlokalizowania.

Gerd Castan
źródło
świetny! Czy znalazłeś też pomysł, jak usunąć usunięte elementy?
Tobe,
@Tobe Jeśli podzielisz scenorys, jak sugeruję powyżej, naprawdę łatwo jest zauważyć ciągi, które nie są już używane.
Gerd Castan
15

Wreszcie moim rozwiązaniem było (podstawowe, ale skuteczne) skopiowanie poprzednich tłumaczeń i wklejenie ich w nowym pliku utworzonym przez odznaczenie i zaznaczenie pola Język lokalizacji.

Byłoby to przydatne w niektórych przypadkach, takich jak mój, gdy trzeba zmienić tylko jeden lub dwa teksty.

jpl850
źródło
Czy to zachowałoby identyfikatory i takie przez cały czas? Zrobiłem jeden test i wydawało się, że działa, ale może to być katastrofa, jeśli identyfikator się zmieni.
ullstrm 17.04.16
Myślę, że tak, robiłem to wiele razy bez żadnego problemu.
jpl850 18.04.16
1
Identyfikatory są przypisywane po upuszczeniu elementów interfejsu użytkownika. Są niezależne od lokalizacji, ponieważ są przypisywane przez storyboard. Więc nie będzie żadnego wpływu na identyfikatory.
iBug
Dzięki iBug za wyjaśnienie =)
jpl850
14

Myślę, że najlepszym sposobem jest użycie wbudowanych lokalizacji eksportu / importu:

  1. W Project Navigator wybierz folder projektu
  2. Wybierz Edytor> Eksportuj do lokalizacji,
  3. Wszystkie tłumaczenia pozostawione na swoich miejscach i XCode automatycznie dodają pominięte ciągi. Dodatkowo przed importem możesz edytować .xliff w edytorze XLIFF (na przykład online - http://xliff.brightec.co.uk ), a następnie nie musisz tego robić w XCode.
  4. następnie Edytor> Importuj lokalizacje i wybierz zapisany plik .xliff.

PS Jeśli nie chcesz edytować w edytorze XLIFF i pominąłeś krok 3, XCode nie mógł zapisać nowych ciągów. W takim przypadku otwórz .xliff w edytorze XLIFF, zapisz ponownie bez zmian i zaimportuj nowy plik.

Igor
źródło
1
+1 Łatwy i odpowiedni sposób pracy z lokalizacją. Ponadto preferowanym sposobem jest Apple
Jurasic
1
Za pomocą Xcode 7.3.1 w już zlokalizowanym przykładowym projekcie zmieniłem etykietę (z „tekstu” na „tekst podstawowy”) i dodałem nową etykietę. Wyeksportowałem do lokalizacji, dotknąłem pliku .xliff (bez zmian) i zaimportowałem go ponownie. W pliku Main.strings wiersz komentarza do zmienionej etykiety został zaktualizowany /* Class = "UILabel"; text = "a basic text"; ObjectID = "HFW-aN-MTb"; */, ale nowa etykieta NIE jest tworzona w pliku Main.strings. Następnie edytowałem plik .xliff, aby dodać tłumaczenie nowej etykiety. Zaimportowałem go ponownie. Nowa etykieta jest teraz wstawiona do pliku Main.strings.
duthen
+1, ale wykryłem błąd. Podczas dodawania nowych elementów nie są one w eksportowanym pliku (jak mówi duthen). Ale kiedy dokonuję eksportu zaraz po (bez zmian w serii ujęć) wszystkie dodane elementy są, co zaskakujące, włączone. Więc wykonaj eksport dwa razy. Drugi zawiera wszystkie nowe elementy. Dzięki Apple!
Viktor Kucera
6

Po kliknięciu w storyboardzie, na przykład Main.storyboard ... Po prawej stronie możesz zobaczyć menu lokalizacji (patrz załączony obraz). Jeśli odznaczysz i ponownie zaznaczysz język, plik zostanie wygenerowany ponownie. Zwykle więc kopiuję zawartość, generuję plik ponownie, a następnie wklejam treść, którą skopiowałem i już zostałem przetłumaczony.

W ten sposób aktualizuję słownik.

wprowadź opis zdjęcia tutaj

J. Fdez
źródło
Z Xcode 10, jeśli używasz git, podkreśla różnice!
Ricardo Ruiz Romero
Tak, jest możliwe ... teraz mój plik jest większy niż w tej dacie i po wygenerowaniu ponownie scalam go z wersją repozytorium.
J. Fdez
5

Mam ogromną scenorys z wieloma ciągami. Dwa języki bazowe angielski i inny arabski. Zadanie polegało na dodaniu niektórych pól i etykiet do scenorysu oraz dodaniu ich lokalizacji bez żadnych skryptów i NSLocalizableStrings.

Dla mnie pomogłem następnie:

Po pierwsze : upewnij się, że masz git, aby zapobiec nieoczekiwanym zmianom.

  1. Przejdź do ekranu docelowego w xcode i naciśnij Editor-> Export For Localization.... Zapisz gdzieś plik ar.xliff .
  2. Pobierz XLIFF Edtior .
  3. Otwórz plik ar.xliff i wprowadź zmiany.
  4. Zaimportuj ten plik do xcode. Gotowe! Zaktualizowałeś plik ciągów scenorysu.
Nik Kov
źródło
Aby to zadziałało, najpierw wybierz projekt lub cel w edytorze projektu Xcode.
Chuck Boris,
4

Istnieje aplikacja narzędzia wiersza polecenia firmy Apple o nazwie AppleGlot, która obsługuje przyrostową lokalizację. Jeszcze tego nie próbowałem, ale wygląda dokładnie tak, jak narzędzie, którego szukałeś (jakiś czas temu).

tilo
źródło
appleglotNarzędzie pracuje z końcowych wiązek aplikacyjnych. Jest to zupełnie inne podejście do aplikacji tłumaczeniowych.
Flovdis,
1
Coś nie tak z „innym podejściem” lub co powoduje głosowanie negatywne?
tilo
Musisz teraz przeszukać AppleGlot w tym linku.
NSDeveloper
4

Oto skrypt do wyciągania ciągów z scenorysów i Xibów i łączenia ich z istniejącymi tłumaczeniami.

Aby uruchomić skrypt automatycznie podczas budowania projektu, umieść go w katalogu głównym projektu i dodaj fazę Uruchom skrypt z następującym wierszem do docelowych faz budowy w ustawieniach projektu.

./mergegenstrings.py PathToSourceDir

Lub możesz uruchomić skrypt na terminalu ręcznie, kiedy chcesz.

Skrypt działa, ibtoolgdy Tha Leang odpowiedziała. Działa również w genstringscelu wyodrębnienia i scalenia ciągów oznaczonych NSLocalizedStringw kodzie źródłowym. Skrypt jest oparty na skrypcie w tym poście , który łączy ciągi po uruchomieniu genstrings.

Yoichi Tagaya
źródło
czy możesz podać więcej informacji o tym, jak z tego korzystać?
user023,
1
Dodałem komentarz do istoty. Mam nadzieję, że to pomoże. gist.github.com/yoichitgy/29bdd71c3556c2055cc0
Yoichi
Dziękuję, działa idealnie dla mnie. Jeśli ktoś ma problemy z uprawnieniami, może to być pomocne: stackoverflow.com/questions/9850936/…
iCode
Ten skrypt działa dobrze w przypadku plików Main.strings serii ujęć, ale wydaje się, że zastępuje moje tłumaczenia Localizable.strings w Xcode 7.
Adam Johns
3

Najłatwiejszym i bardzo mniej ryzykownym podejściem jest po prostu skopiowanie identyfikatora obiektu z scenorysu i dodanie nowego klucza do klucza w zlokalizowanym pliku, jak na poniższym przykładzie:

1: Skopiuj identyfikator obiektu jak poniżej z scenorysu dla komponentu:

wprowadź opis zdjęcia tutaj

2: Dodaj nowy klucz w zlokalizowanym pliku, jak poniżej:

"DjF-dn-0ay.text" = "Borrar datos y restablecer";

Uwaga: Jest to bardzo mniej ryzykowne podejście, jeśli chcesz zaktualizować tylko kilka składników, w przeciwnym razie możesz odtworzyć zlokalizowany plik dla scenorysu.

Alok
źródło
Dziękuję za odpowiedź!!!!!. Mam pytanie, które należy zadać: W moich projektach nie stworzyłem ujścia dla niektórych etykiet, przycisków ... Jeśli użyję ID obiektu dla tych przycisków i etykiet, czy to wystarczy?
Harikarthick K,
3

Xlifftool jest dostępny jako aplikacja na komputery Mac i działa dobrze. Pokazuje wszystkie możliwe do przetłumaczenia ciągi i obiekty z info.plist, ciągi lokalizowalne i scenorys.

Pobierz tutaj dla systemu Mac: https://itunes.apple.com/lv/app/xlifftool/id1074282695?mt=12

Krok 1: w Xcode wybierz folder projektu w nawigatorze projektu. Następnie wybierz Edytor / Eksport do lokalizacji ...

Twoje ciągi do tłumaczenia zostaną zawarte w pliku xliff w języku wybranym do lokalizacji w Xcode.

Krok 2: Otwórz ten plik za pomocą Xlifftoola i przetłumacz lub zaktualizuj swoje tłumaczenia, które zostały wykonane wcześniej.

Krok 3: Następnie prześlij z powrotem do projektu za pomocą edytora / importu lokalizacji ...

TM Lynch
źródło
Inną alternatywą dla systemu macOS jest Loca Studio . Podobnie jak Xlifftool, aplikacja może otworzyć wynik działania edytora akcji Xcode -> Eksportuj do lokalizacji. Ma kilka bardziej zaawansowanych funkcji filtrowania i wyszukiwania, a także automatyczne kontrole kontroli jakości. (pełne ujawnienie: jestem głównym programistą).
guru_meditator
0

To jest mój prosty sposób na aktualizację nowego tekstu z storyboardu lub xib na ciąg lokalizacji

1- użyj tego skryptu http://tredje.se/dev/trouble/?x=entry:entry150917-204052

2- wybierz ciąg lokalizacji , który chcesz zaktualizować, i przełącz ciąg języka z „Ciąg lokalizacji” na „scenariusz konstruktora interfejsów”

3- przełącz go z powrotem :)

Gotowe.

wprowadź opis zdjęcia tutaj

Fadi Abuzant
źródło
Zmienia plik na Storyboard Builder Storyboard, ale potem ponownie po 1 lub 2 sekundach przywraca go do ciągów lokalizowalnych i bez dodatku ciągów lokalizowalnych dla nowego tekstu widoku
Mujahid Latif
@MujahidLatif Obecnie używam tego kapsuły, jest to dla mnie bardzo przydatne i może aktualizować lokalizacje scenariuszy i lokalizację.String as will github.com/Flinesoft/BartyCrouch
Fadi Abuzant
0

Opcja 1
Xcode może „przeładować” plik, konwertując go na [Interface Builder Cocoa Touch Storyboard]typ pliku lub [Localizable Strings]typ pliku.

Wybierz podstawowy plik scenorysu z Nawigatora projektu Znajdź sekcję Lokalizacja w Inspektorze plików . Jeśli Twój plik jest obecnie [Localizable Strings], zmień go na [Interface Builder Cocoa Touch Storyboard]lub odwrotnie.
Xcode powinien przekonwertować storyboard do bieżącej wersji, zachowując starania związane z lokalizacją. Tutaj możesz zmienić plik z powrotem na oryginalny typ pliku, jeśli chcesz.

Opcja 2
Użyj, ibtoolaby wyodrębnić ciągi z planszy.

Otwórz aplikację Terminal
Znajdź swój Base.lprojkatalog
Użyj tego wiersza, aby wyodrębnić ciągi:

ibtool MainStoryboard.storyboard --generate-strings-file file_name.strings

Po wyodrębnieniu ciągów przez ibtool file_name.stringsmożesz skopiować i wkleić go do oryginalnego .stringspliku.

Amplework Software Pvt. Sp. z o.o.
źródło