multi - Lenguaje de reserva iOS(con archivo localizable.strings incompleto)
string localized swift (3)
Inspirado por this y https://stackoverflow.com/a/8784451/1403046 , mi versión en código Swift:
public func LS(_ key: String) -> String {
let value = NSLocalizedString(key, comment: "")
if value != key || NSLocale.preferredLanguages.first == "en" {
return value
}
// Fall back to en
guard
let path = Bundle.main.path(forResource: "en", ofType: "lproj"),
let bundle = Bundle(path: path)
else { return value }
return NSLocalizedString(key, bundle: bundle, comment: "")
}
Muchos desarrolladores esperan que una traducción incompleta caiga en el lenguaje de desarrollo ... pero esa no es la forma en que Apple elige comportarse . Tengo un pseudocode para ayudar a comprender mejor cómo Apple elige el repliegue.
Tengo un proyecto de iOS que se localiza en 16 idiomas. Solo algunas palabras no están localizadas (Principalmente aquellas que entran en una actualización y la oficina de localización no entregó a tiempo). Para mis llaves no uso el texto en inglés, ya que esto también puede cambiar si un traductor lo desea. Así que ahora, si no tengo una traducción para un idioma, si recurro a la clave que usé. Pero como esta clave no es "legible para los humanos" o, al menos, no es "fácil de leer para los humanos", este es un problema.
Hice algunas investigaciones pero no pude encontrar una solución a mi problema exacto . Tengo fe .:
Localizable.strings in en.lproj
@"Key1" = @"Value 1"
@"Key2" = @"Value 2"
Localizable.strings in de.lproj
@"Key1" = @"Wert 1"
// Note that @"Key2" is missing here in my de.lproj
I would expect that if I make NSLocalizedString(@"Key2", ...)
and am running on a german phone, it falls back to the english
translation for this key as it exists...
Así que por ahora solo copié la traducción al inglés en los archivos Localizable.strings que faltan. ¡Pero esto es un gran truco! ¡Pero también usar las palabras en inglés como claves parece ser un truco para mí!
¿Hay alguna forma de decirle a mi aplicación que debería usar fe english como alternativa si no hay un valor para una clave determinada? Intenté agregar una localización base, pero esto no ayuda ...
Muchas gracias
Puede usar una localización Base
y todas las cadenas no localizadas se tomarán de esto.
Que yo sepa, no hay una forma "oficial" de hacerlo, pero he implementado funciones como esta antes:
NSString * L(NSString * translation_key) {
NSString * s = NSLocalizedString(translation_key, nil);
if (![[[NSLocale preferredLanguages] objectAtIndex:0] isEqualToString:@"en"] && [s isEqualToString:translation_key]) {
NSString * path = [[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"];
NSBundle * languageBundle = [NSBundle bundleWithPath:path];
s = [languageBundle localizedStringForKey:translation_key value:@"" table:nil];
}
return s;
}
prestado de: https://.com/a/8784451/1403046
Básicamente, en lugar de NSLocalizedString (), que devolverá la cadena de entrada, esta versión se cambiará al inglés si es necesario.