Czy istnieje odpowiednik Swift NSLocalizedString(...)
? W Objective-C
zwykle używamy:
NSString *string = NSLocalizedString(@"key", @"comment");
Jak mogę to samo osiągnąć w Swift? Znalazłem funkcję:
func NSLocalizedString(
key: String,
tableName: String? = default,
bundle: NSBundle = default,
value: String = default,
#comment: String) -> String
Jest jednak bardzo długi i wcale nie jest wygodny.
ios
swift
localization
nslocalizedstring
RaffAl
źródło
źródło
NSLocalizedString("Cancel", comment: "Cancel button title")
skorzystać z domyślnych wartości. Myślę, że to wygodne.Odpowiedzi:
Używam następnego rozwiązania:
1) utwórz rozszerzenie:
2) w pliku Localizable.strings :
3) przykład zastosowania:
cieszyć się! ;)
--upd: -
w przypadku komentarzy można użyć tego rozwiązania:
1) Rozszerzenie:
2) w pliku .strings:
3) przy użyciu:
źródło
genstrings
narzędzia do generowania plików .strings.func localized(comment: String = "") -> String
aby stał się mniejszy i z opcjonalnymi komentarzami :)genstrings
z tym korzystać?genstrings
działa tylko na dosłowne ciągi przekazane do NSLocalizedString. Dzięki temu sprytnemu obejściu tracisz możliwość aktualizowania plików .strings za pomocą tegogenstrings
narzędzia, a przynajmniej dla mnie oznacza to, że nie będę w stanie korzystać z tego uproszczonego podejścia.NSLocalizedString
Istnieje również w światowej Swifta.tableName
,bundle
Ivalue
parametry są zaznaczonedefault
słowo kluczowe, które oznacza, że możemy pominąć te parametry podczas wywoływania funkcji. W takim przypadku zostaną użyte ich wartości domyślne.Prowadzi to do wniosku, że wywołanie metody można uprościć w celu:
Swift 5 - bez zmian, nadal tak działa.
źródło
Wrap in NSLocalizedString
opcja, która bardzo ułatwia, zaznaczając tekst, klikając prawym przyciskiem myszy i wybierając element menu.Odmiana istniejących odpowiedzi:
Swift 5.1:
Następnie możesz po prostu użyć go z komentarzem lub bez:
Pamiętaj, że
genstrings
to nie będzie działać z tym rozwiązaniem.źródło
W ten sposób można utworzyć inną implementację dla różnych typów (tj. Int lub niestandardowe klasy, takie jak CurrencyUnit, ...). Możliwe jest również skanowanie tej metody przy użyciu narzędzia genstrings. Po prostu dodaj flagę procedury do polecenia
rozbudowa:
stosowanie:
źródło
Wersja Swift 3:) ...
źródło
W rzeczywistości możesz użyć dwóch faz, aby przetłumaczyć swoje teksty w projektach Swift:
1) Pierwsza faza polega na użyciu starego sposobu utworzenia wszystkich tłumaczonych ciągów:
1.1) Następnie powinieneś użyć genstringów do wygenerowania Localizable.strings:
2) Następnie powinieneś użyć tej odpowiedzi .
2.1) Użyj opcji „Znajdź i zamień” XCode w oparciu o wyrażenie regularne. W podanym przykładzie (jeśli nie masz komentarzy) wyrażenie regularne będzie następujące:
i zamień na
lub (jeśli masz komentarze)
i zamień na
Możesz dowolnie grać z wyrażeniami regularnymi i różnymi kombinacjami rozszerzeń. Ogólnym sposobem jest podzielenie całego procesu na dwie fazy. Mam nadzieję, że to pomaga.
źródło
NSLocalizedString("Cancel", comment: "Cancel button title")
?NSLocalizedString
wygląda to mniej Szybciej, niż powinno.String.localized
z drugiej strony wygląda bardziej Swifty, ale nie można użyćgesntrings
narzędzia, które jest powszechnie używane do ułatwienia pracy z internacjonalizacją. Chodzi mi o to, że dość łatwo jest połączyć oba podejścia. Jest to głównie kwestia czytelności.genstrings
? Czy zamienić z powrotem wszystko.localized
byNSLocalizedString
?Utworzono metodę małego pomocnika dla przypadków, w których „komentarz” jest zawsze ignorowany. Mniej kodu jest łatwiejsze do odczytania:
Wystarczy umieścić go w dowolnym miejscu (poza klasą), a Xcode znajdzie tę globalną metodę.
źródło
Prawdopodobnie najlepszym sposobem jest ten tutaj .
i
możesz użyć tego w ten sposób
dla mnie to najlepsze, ponieważ
źródło
static var Hello: String = { return NSLocalizedString("Hello") }
Podczas opracowywania zestawu SDK. Potrzebujesz dodatkowej operacji.
1) Utwórz Localizable.strings jak zwykle w YourLocalizeDemoSDK.
2) utwórz te same Localizable.strings w YourLocalizeDemo.
3) znajdź ścieżkę pakietu YourLocalizeDemoSDK.
Swift4 :
Bundle(for: type(of: self))
pomaga znaleźć pakiet w YourLocalizeDemoSDK. Jeśli użyjeszBundle.main
zamiast tego, otrzymasz niewłaściwą wartość (w rzeczywistości będzie to ten sam ciąg z kluczem).Ale jeśli chcesz użyć rozszerzenia String wspomnianego przez dr OX . Musisz zrobić coś więcej. Rozszerzenie pochodzenia wygląda następująco.
Jak wiemy, opracowujemy pakiet SDK,
Bundle.main
otrzymamy pakiet pakietu YourLocalizeDemo. Nie tego chcemy. Potrzebujemy pakietu w YourLocalizeDemoSDK. Jest to sztuczka, aby szybko ją znaleźć.Uruchom poniższy kod w instancji NSObject w YourLocalizeDemoSDK. Otrzymasz adres URL YourLocalizeDemoSDK.
Wydrukuj oba dwa adresy URL, a przekonasz się, że możemy zbudować pakiet bundleURLofSDK na mainBundleURL. W takim przypadku będzie to:
A rozszerzenie String będzie:
Mam nadzieję, że to pomoże.
źródło
Stworzyłem własne narzędzie do generowania ciągów znaków do wyodrębniania ciągów za pomocą niestandardowej funkcji tłumaczenia
https://gist.github.com/Maxdw/e9e89af731ae6c6b8d85f5fa60ba848c
Parsuje wszystkie szybkie pliki i eksportuje ciągi i komentarze w kodzie do pliku .strings.
Prawdopodobnie nie jest to najłatwiejszy sposób, ale jest to możliwe.
źródło
Chociaż nie rozwiązuje to problemu skrócenia, ale pomogło mi to uporządkować komunikaty, stworzyłem strukturę komunikatów o błędach, takich jak poniżej
W ten sposób możesz uporządkować wiadomości i sprawić, by generowanie łańcuchów działało.
I to jest użyte polecenie genstrings
źródło
Przydatny do użycia w testach jednostkowych:
Jest to prosta wersja, którą można rozszerzyć na różne przypadki użycia (np. Za pomocą tableNames).
Użyj tego w ten sposób:
Lub tak z komentarzem:
źródło
Jest to ulepszenie w podejściu „.localized”. Zacznij od dodania rozszerzenia klasy, ponieważ pomoże to w ustawieniach programowych:
Przykład użycia ciągów ustawianych programowo:
Teraz pliki tłumaczenia scenariuszy Xcode powodują, że menedżer plików jest nieporządny i nie radzi sobie dobrze z aktualizacjami scenorysu. Lepszym rozwiązaniem jest utworzenie nowej podstawowej klasy etykiet i przypisanie jej do wszystkich etykiet serii ujęć:
Teraz każda etykieta, którą dodasz i podasz domyślną wartość domyślną w serii ujęć, zostanie automatycznie przetłumaczona, zakładając, że dostarczyłeś tłumaczenie.
Możesz zrobić to samo dla UIButton:
źródło
Kiedy tłumaczysz, powiedzmy z angielskiego, gdzie fraza jest taka sama, na inny język, w którym jest inny (z powodu płci, koniugacji czasowników lub deklinacji), najprostszą formą NSString w Swift, która działa we wszystkich przypadkach, są trzy argumenty jeden . Na przykład angielska fraza „previous was” została przetłumaczona inaczej na rosyjski w przypadku „weight” („предыдущ ий был”) i „waist” („предыдущ ая был а ”).
W takim przypadku potrzebujesz dwóch różnych tłumaczeń dla jednego źródła (pod względem narzędzia XLIFF zalecanego w WWDC 2018). Nie można tego osiągnąć za pomocą dwóch argumentów NSLocalizedString, gdzie „previous was” będzie taki sam zarówno dla „klucza”, jak i tłumaczenia na angielski (tj. Dla wartości). Jedynym sposobem jest użycie postaci trzech argumentów
gdzie klucze („previousWasFeminine” i „previousWasMasculine”) są różne.
Wiem, że ogólna rada polega na tłumaczeniu frazy jako całości, jednak czasem jest to zbyt czasochłonne i niewygodne.
źródło
Lokalizacja z domyślnym językiem:
źródło