Estoy intentando localizar mi aplicación usando NSLocalizedString. Cuando importo el archivo XLIFF, la mayoría funciona como un encanto, pero algo no y algunas cadenas no están localizadas. He notado que el problema es de NSLocalizedString que contiene algo variable dentro como:
NSLocalizedString(" - \(count) Notifica", comment: "sottotitolo prescrizione per le notifiche al singolare")
o
NSLocalizedString("Notifica per \(medicina!) della prescrizione \(prescription!)\nMemo: \(memoTextView.text)", comment: "Messaggio della Local Notification")
Quizás esta no sea la sintaxis correcta para este tipo de cosas. ¿Alguien me puede explicar cómo hacer eso en rápido? Muchas gracias.
ios
swift
localization
nslocalizedstring
xliff
Andorath
fuente
fuente
Respuestas:
Puede usar los
sprintf
parámetros de formato dentroNSLocalizedString
, por lo que su ejemplo puede verse así:let myString = String(format: NSLocalizedString(" - %d Notifica", comment: "sottotitolo prescrizione per le notifiche al singolare"), count)
fuente
" - %d Notifica"=" - %d Notifica";
%s
modificador que no funcionó = \%@
para sustituir una cadena.En la Sesión # 412 de WWDC2014 "Localización con Xcode 6", la forma correcta de hacerlo en Swift es la siguiente:
String.localizedStringWithFormat( NSLocalizedString(" - %d Notifica", comment: "sottotitolo prescrizione per le notifiche al singolare"), count)
fuente
He seguido el enfoque de crear una extensión para String ya que tengo muchas cadenas para localizar.
extension String { var localized: String { return NSLocalizedString(self, comment:"") } }
Para usarlo para la localización en código, haga lo siguiente:
self.descriptionView.text = "Description".localized
Para cadenas con variables dinámicas, siga:
self.entryTimeLabel.text = "\("Doors-open-at".localized) \(event.eventStartTime)"
Declare las cadenas en archivos de cadena para diferentes idiomas (ejemplo: árabe e inglés)
¡Hope te ayudará!
fuente
The doors open at %@ o'clock
. ¿Seguiría funcionando tu solución?Localizable.strings
. Sin embargo, creo que @Houman tiene una preocupación válida.Probé las soluciones anteriores, sin embargo, el siguiente código funcionó para mí
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? \"%@\"";
fuente
Aquí hay una extensión que uso en String, agrega una función localizeWithFormat con argumentos variables,
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") } }
Uso:
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)
Solo tenga cuidado de no usar los mismos nombres de función y propiedad que tiene String. Normalmente uso un prefijo de 3 letras para todas mis funciones de marco.
fuente
Creé un
extension
toString
ya que tenía muchosstrings
que serlocalized
.extension String { var localized: String { return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "") } }
Por ejemplo:
let myValue = 10 let anotherValue = "another value" let localizedStr = "This string is localized: \(myValue) \(anotherValue)".localized print(localizedStr)
fuente
Editor > Export for Localization...
que no las recogerá.