¿Hay un equivalente rápido de NSLocalizedString(...)
? En Objective-C
, usualmente usamos:
NSString *string = NSLocalizedString(@"key", @"comment");
¿Cómo puedo lograr lo mismo en Swift? Encontré una función:
func NSLocalizedString(
key: String,
tableName: String? = default,
bundle: NSBundle = default,
value: String = default,
#comment: String) -> String
Sin embargo, es muy largo y no es conveniente en absoluto.
ios
swift
localization
nslocalizedstring
RaffAl
fuente
fuente
NSLocalizedString("Cancel", comment: "Cancel button title")
aprovechando los valores predeterminados. Es conveniente, creo.Respuestas:
Yo uso la siguiente solución:
1) crear extensión:
2) en el archivo Localizable.strings :
3) ejemplo de uso:
¡disfrutar! ;)
--upd: -
para el caso con comentarios puede usar esta solución:
1) Extensión:
2) en el archivo .strings:
3) usando:
fuente
genstrings
utilidad para generar sus archivos .strings.func localized(comment: String = "") -> String
que sea más pequeño y con comentarios opcionales :)genstrings
esto?genstrings
solo funciona en cadenas literales pasadas a NSLocalizedString. Con esta solución inteligente, pierde la capacidad de actualizar sus archivos .strings usando lagenstrings
herramienta, y al menos para mí eso significa que no podré usar este enfoque simplificado.El
NSLocalizedString
existe también en el mundo de Swift.El
tableName
,bundle
yvalue
los parámetros están marcados con unadefault
palabra clave que significa que podemos omitir estos parámetros al llamar a la función. En este caso, se utilizarán sus valores predeterminados.Esto lleva a la conclusión de que la llamada al método se puede simplificar para:
Swift 5 : sin cambios, todavía funciona así.
fuente
Wrap in NSLocalizedString
opción que facilita las cosas simplemente resaltando texto, haciendo clic derecho y seleccionando el elemento del menú.Una variación de las respuestas existentes:
Swift 5.1:
Luego puede usarlo simplemente con o sin comentarios:
Tenga en cuenta que
genstrings
no funcionará con esta solución.fuente
Al usar de esta manera, es posible crear una implementación diferente para diferentes tipos (es decir, clases Int o personalizadas como CurrencyUnit, ...). También es posible escanear para invocar este método utilizando la utilidad genstrings. Simplemente agregue la bandera de rutina al comando
extensión:
uso:
fuente
Versión Swift 3:) ...
fuente
En realidad, puede usar dos fases para traducir sus textos en proyectos Swift:
1) La primera fase es usar la antigua forma de crear todas sus cadenas traducibles:
1.1) Entonces deberías usar genstrings para generar Localizable.strings:
2) Después, debes usar esta respuesta .
2.1) Use su opción XCode "Buscar y reemplazar" basada en la expresión regular. En cuanto al ejemplo dado (si no tiene comentarios) la expresión regular será:
y reemplazarlo con
o (si tienes comentarios)
y reemplazarlo con
Puedes jugar con expresiones regulares y diferentes combinaciones de extensiones como desees. La forma general es dividir todo el proceso en dos fases. Espero que ayude.
fuente
NSLocalizedString("Cancel", comment: "Cancel button title")
?NSLocalizedString
parece menos rápido de lo que debería parecer.String.localized
Por otro lado, parece más Swifty, pero no puede usar lagesntrings
utilidad que se usa comúnmente para facilitar su trabajo con la internacionalización. Mi punto es que es bastante fácil mezclar ambos enfoques. Entonces, principalmente es una cuestión de legibilidad.genstrings
? ¿Reemplazas todo.localized
porNSLocalizedString
?Creó un pequeño método auxiliar para casos, donde el "comentario" siempre se ignora. Menos código es más fácil de leer:
Simplemente colóquelo en cualquier lugar (fuera de una clase) y Xcode encontrará este método global.
fuente
Probablemente la mejor manera es esta aquí .
y
entonces puedes usarlo así
para mí esto es lo mejor porque
fuente
static var Hello: String = { return NSLocalizedString("Hello") }
Cuando estás desarrollando un SDK. Necesitas una operación extra.
1) cree Localizable.strings como de costumbre en YourLocalizeDemoSDK.
2) cree las mismas cadenas Localizable.string en YourLocalizeDemo.
3) encuentre su ruta de paquete de YourLocalizeDemoSDK.
Swift4 :
Bundle(for: type(of: self))
le ayuda a encontrar el paquete en YourLocalizeDemoSDK. Si usaBundle.main
en su lugar, obtendrá un valor incorrecto (de hecho, será la misma cadena con la clave).Pero si desea utilizar la extensión de cadena mencionada por el Dr. OX . Necesitas hacer un poco más. La extensión de origen se ve así.
Como sabemos, estamos desarrollando un SDK,
Bundle.main
obtendremos el paquete del paquete de YourLocalizeDemo. Eso no es lo que queremos. Necesitamos el paquete en YourLocalizeDemoSDK. Este es un truco para encontrarlo rápidamente.Ejecute el código a continuación en una instancia de NSObject en YourLocalizeDemoSDK. Y obtendrá la URL de YourLocalizeDemoSDK.
Imprima las dos URL, verá que podemos construir la base bundleURLofSDK en mainBundleURL. En este caso, será:
Y la extensión de la cadena será:
Espero eso ayude.
fuente
He creado mi propia herramienta Genstrings para extraer cadenas usando una función de traducción personalizada
https://gist.github.com/Maxdw/e9e89af731ae6c6b8d85f5fa60ba848c
Analizará todos sus archivos rápidos y exportará las cadenas y comentarios en su código a un archivo .strings.
Probablemente no sea la forma más fácil de hacerlo, pero es posible.
fuente
Aunque esto no responde al problema del acortamiento, pero me ayudó a organizar los mensajes, creé una estructura para los mensajes de error como a continuación
De esta manera, puede organizar los mensajes y hacer que funcionen las cadenas gens.
Y este es el comando genstrings utilizado
fuente
Útil para el uso en pruebas unitarias:
Esta es una versión simple que se puede extender a diferentes casos de uso (por ejemplo, con el uso de tableNames).
Úselo así:
O como este con un comentario:
fuente
Esta es una mejora en el enfoque ".localized". Comience agregando la extensión de clase, ya que esto ayudará con las cadenas que estaba configurando programáticamente:
Ejemplo de uso para cadenas que establezca mediante programación:
Ahora los archivos de traducción del guión gráfico de Xcode hacen que el administrador de archivos sea desordenado y tampoco manejan bien las actualizaciones del guión gráfico. Un mejor enfoque es crear una nueva clase de etiqueta básica y asignarla a todas las etiquetas de su guión gráfico:
Ahora, cada etiqueta que agregue y proporcione el valor predeterminado predeterminado en el guión gráfico se traducirá automáticamente, suponiendo que haya proporcionado una traducción.
Podrías hacer lo mismo para UIButton:
fuente
Cuando traduzca, diga del inglés, donde una frase es la misma, a otro idioma donde sea diferente (debido al género, las conjugaciones verbales o la declinación), la forma más simple de NSString en Swift que funciona en todos los casos son los tres argumentos. . Por ejemplo, la frase en inglés "anterior era", se traduce de manera diferente al ruso para el caso de "peso" ("предыдущ ий был") y para "cintura" ("предыдущ ая был а ").
En este caso, necesita dos traducciones diferentes para una Fuente (en términos de la herramienta XLIFF recomendada en WWDC 2018). No puede lograrlo con dos argumentos NSLocalizedString, donde "anterior era" será el mismo tanto para la "clave" como para la traducción al inglés (es decir, para el valor). La única forma es usar la forma de tres argumentos
donde las claves ("previousWasFeminine" y "previousWasMasculine") son diferentes.
Sé que el consejo general es traducir la frase como un todo, sin embargo, a veces es demasiado lento e inconveniente.
fuente
Localización con idioma predeterminado:
fuente