Próbuję zlokalizować moją aplikację przy użyciu NSLocalizedString. Kiedy importuję plik XLIFF, większość działa jak urok, ale coś nie działa, a niektóre ciągi nie są zlokalizowane. Zauważyłem, że problem pochodzi z NSLocalizedString zawierającego coś zmiennego wewnątrz, na przykład:
NSLocalizedString(" - \(count) Notifica", comment: "sottotitolo prescrizione per le notifiche al singolare")
lub
NSLocalizedString("Notifica per \(medicina!) della prescrizione \(prescription!)\nMemo: \(memoTextView.text)", comment: "Messaggio della Local Notification")
Może to nie jest poprawna składnia dla tego rodzaju rzeczy. Ktoś może mi wyjaśnić, jak to zrobić szybko? Dziękuję Ci bardzo.
ios
swift
localization
nslocalizedstring
xliff
Andorath
źródło
źródło
Odpowiedzi:
Możesz użyć
sprintf
parametrów formatu w obrębieNSLocalizedString
, więc Twój przykład może wyglądać następująco:let myString = String(format: NSLocalizedString(" - %d Notifica", comment: "sottotitolo prescrizione per le notifiche al singolare"), count)
źródło
" - %d Notifica"=" - %d Notifica";
%s
modyfikatora, który nie działał = \%@
do zastępowania łańcucha.W sesji nr 412 WWDC2014 „Lokalizowanie za pomocą Xcode 6” właściwą drogą do tego w języku Swift jest:
String.localizedStringWithFormat( NSLocalizedString(" - %d Notifica", comment: "sottotitolo prescrizione per le notifiche al singolare"), count)
źródło
Postępowałem zgodnie z podejściem tworzenia rozszerzenia do String, ponieważ mam wiele ciągów do zlokalizowania.
extension String { var localized: String { return NSLocalizedString(self, comment:"") } }
Aby użyć go do lokalizacji w kodzie, wykonaj:
self.descriptionView.text = "Description".localized
W przypadku ciągów ze zmiennymi dynamicznymi wykonaj:
self.entryTimeLabel.text = "\("Doors-open-at".localized) \(event.eventStartTime)"
Zadeklaruj ciągi w plikach String dla różnych języków (przykład: arabski i angielski)
Mam nadzieję, że pomoże!
źródło
The doors open at %@ o'clock
. Czy Twoje rozwiązanie nadal działałoby?Localizable.strings
. Jednak myślę, że @Houman ma uzasadnione obawy.Wypróbowałem powyższe rozwiązania, ale poniższy kod działał dla mnie
SWIFT 4
extension String { /// Fetches a localized String /// /// - Returns: return value(String) for key public func localized() -> String { let path = Bundle.main.path(forResource: "en", ofType: "lproj") let bundle = Bundle(path: path!) return (bundle?.localizedString(forKey: self, value: nil, table: nil))! } /// Fetches a localised String Arguments /// /// - Parameter arguments: parameters to be added in a string /// - Returns: localized string public func localized(with arguments: [CVarArg]) -> String { return String(format: self.localized(), locale: nil, arguments: arguments) } } // variable in a class let tcAndPPMessage = "By_signing_up_or_logging_in,_you_agree_to_our" .localized(with: [tAndc, pp, signin]) // Localization File String "By_signing_up_or_logging_in,_you_agree_to_our" = "By signing up or logging in, you agree to our \"%@\" and \"%@\" \nAlready have an Account? \"%@\"";
źródło
Oto rozszerzenie, którego używam w String, dodaje funkcję localizeWithFormat ze zmiennymi argumentami,
extension String:{ func localizeWithFormat(arguments: CVarArg...) -> String{ return String(format: self.localized, arguments: arguments) } var localized: String{ return Bundle.main.localizedString(forKey: self, value: nil, table: "StandardLocalizations") } }
Stosowanie:
let siriCalendarText = "AnyCalendar" let localizedText = "LTo use Siri with my app, please set %@ as the default list on your device reminders settings".localizeWithFormat(arguments: siriCalendarTitle)
Uważaj tylko, aby nie używać tych samych nazw funkcji i właściwości, które ma String. Zwykle używam 3-literowego przedrostka dla wszystkich moich funkcji frameworka.
źródło
Założyłem
extension
sięString
, ponieważ miałem wielestrings
do byćlocalized
.extension String { var localized: String { return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "") } }
Na przykład:
let myValue = 10 let anotherValue = "another value" let localizedStr = "This string is localized: \(myValue) \(anotherValue)".localized print(localizedStr)
źródło
Editor > Export for Localization...
ich nie odbierze.