Establecer la location pnetworkingeterminada de la aplicación iOS

Estoy desarrollando una aplicación para personas de habla rusa. Muchos países cercanos a Rusia tienen el segundo idioma: ruso. Mi aplicación tiene dos localizaciones: ruso e inglés. Y necesito establecer la localización rusa como pnetworkingeterminada. El inglés debe ser solo para personas que usan el inglés como idioma del dispositivo.

Sé que Apple recomienda usar la localización en prioridad de los idiomas preferidos en la configuration, pero tengo una razón importante para no seguir esta recomendación.

¿Cómo puedo configurar la localización rusa como pnetworkingeterminada?

Creo que necesitas usar la key de Localization native development region en tu file info.plist .

introduzca la descripción de la imagen aquí

Probablemente necesite establecer ruso como valor de CFBundleDevelopmentRegion en Info.plist.

CFBundleDevelopmentRegion (String – iOS, OS X) especifica la región nativa para el package. Esta key contiene un valor de cadena que generalmente corresponde al idioma nativo de la persona que escribió el package. El idioma especificado por este valor se utiliza como el idioma pnetworkingeterminado si no se puede ubicar un recurso para la región o idioma preferido del usuario.

Actualizar

Si realmente quiere y necesita anular la prioridad de idioma del sistema operativo, puede usar la key pnetworkingeterminada de usuario de AppleLanguages (aunque, como sabe, no se recomienda):

 [[NSUserDefaults standardUserDefaults] setObject:@[@“ru”, @“en”] forKey:@“AppleLanguages”]; 

No encontré la solución adecuada. Solo una forma adecuada para mi problema es utilizar NSLocalizedStringFromTableInBundle lugar de NSLocalizedString . De esta manera no se permiten localizar imágenes o nibs, pero con cadenas funciona bien.

En primer lugar, debe definir el idioma actual del dispositivo:

 NSString *lang = (NSString *)[[NSLocale prefernetworkingLanguages] objectAtIndex:0]; 

A continuación, busque el package para este idioma:

 NSBundle *myLangBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:lang ofType:@"lproj"]]; 

Si se encuentra un package, NSLocalizedStringFromTableInBundle en NSLocalizedStringFromTableInBundle :

 _label.text = NSLocalizedStringFromTableInBundle(@"LabelText",nil,myLangBundle,nil); 

De lo contrario, encuentre y use el package pnetworkingeterminado.

Como eofster dijo que debería establecer la key de NSUserDefaults en NSUserDefaults a una variedad de idiomas con el order deseado, pero para trabajar en el primer almuerzo debería hacerlo muy temprano, incluso antes de applicationWillLunchWithOptions:

En cuanto a mí, esta solución funciona de maravilla y tiene ventaja en el uso de NSLocalizedStringFromTableInBundle porque también funciona con storyboards y nibs.

Aquí hay una solución paso a paso en el lenguaje Swift.

  1. Cree la subclass de UIApplication como se describe aquí: Subclass UIApplication with Swift

  2. Segundo método de anulación de init de su subclass UIApplication para sustituir la list de idiomas preferidos por su count.

     override init() { if let languages = NSUserDefaults.standardUserDefaults().objectForKey("AppleLanguages") as? [String], let language = languages.first where !language.hasPrefix("en") { NSUserDefaults.standardUserDefaults().setObject(["ru", "en"], forKey: "AppleLanguages") } super.init() } 
  3. Eso es todo. Si el primer idioma preferido no es el inglés, sustituirás la list por el ruso como primer idioma.

PS Si está haciendo no solo la localización, sino también la internationalization, no olvide verificar la configuration regional, que es utilizada por los selectores de dates, formateadores de date, formateadores de numbers, etc.

En mi caso, solo tengo localización rusa con cadenas codificadas en mi aplicación, pero uso bibliotecas con packages de localización. Las cadenas de las bibliotecas estaban en inglés por defecto. Porque NSBundle.mainBundle.prefernetworkingLanguages eran [ "en" ] .

Se convirtieron en ruso después de haber especificado el idioma de localización de la aplicación en Info.plist con la key CFBundleLocalizations :

captura de pantalla

CFBundleLocalizations (Array – iOS, OS X) identifica las localizaciones manejadas manualmente por su aplicación. Si su file ejecutable está desagregado o no utiliza el mecanismo de localización del package existente, puede include esta key para especificar las localizaciones que maneja su aplicación.

Cada input en la matriz de esta propiedad es una cadena que identifica el nombre del idioma o el designador de idioma ISO de la localización admitida. Consulte "Designaciones de idioma y configuration regional" en la Guía de internationalization y localización en Documentación de internationalization para get información sobre cómo especificar los designadores de idiomas.