ios - multi - swift string localization
NSLocalizedString con variable rĂ¡pida (6)
Estoy tratando de localizar mi aplicación usando NSLocalizedString. Cuando importo el archivo XLIFF, la mayoría funciona como un encanto, pero algo no funciona 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 hacerlo rápidamente? Muchas gracias.
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 la misma función y nombres de propiedad que String tiene. Normalmente uso un prefijo de 3 letras para todas mis funciones de marco.
Creé una
extension
para
String
ya que tenía muchas
strings
para
localized
.
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)
En la sesión 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)
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)"
Declarar las cadenas en archivos de cadenas para diferentes idiomas (ejemplo: árabe e inglés)
¡La esperanza te ayudará!
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? /"%@/"";
Puede usar los parámetros de formato
sprintf
dentro de
NSLocalizedString
, por lo que su ejemplo puede verse así:
let myString = String(format: NSLocalizedString(" - %d Notifica", comment: "sottotitolo prescrizione per le notifiche al singolare"), count)