tipo teclado tamaño puedo para letra escribir descargar cambiar aumentar aplicacion ios localization selection appsettings

teclado - selección de idioma manual en una aplicación iOS(iPhone y iPad)



teclado iphone 7 (6)

Aquí hay una guía lista para usar y paso a paso sobre cómo usar el enfoque de Novarg en Swift 3 :

Paso # 1: Implementar un selector de idioma

La mejor manera de hacerlo depende de usted y depende del proyecto. Pero usa

Bundle.main.localizations.filter({ $0 != "Base" }) // => ["en", "de", "tr"]

para obtener una lista de todos los códigos de idioma de los lugares compatibles mediante programación. También puedes usar

Locale.current.localizedString(forLanguageCode: "en") // replace "en" with your variable

para presentar el nombre del idioma en el idioma actual de la aplicación.

Como un ejemplo completo, puede presentar una hoja de acción de popover después de hacer clic en un botón como este:

@IBOutlet var changeLanguageButton: UIButton! @IBAction func didPressChangeLanguageButton() { let message = "Change language of this app including its content." let sheetCtrl = UIAlertController(title: "Choose language", message: message, preferredStyle: .actionSheet) for languageCode in Bundle.main.localizations.filter({ $0 != "Base" }) { let langName = Locale.current.localizedString(forLanguageCode: languageCode) let action = UIAlertAction(title: langName, style: .default) { _ in self.changeToLanguage(languageCode) // see step #2 } sheetCtrl.addAction(action) } let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil) sheetCtrl.addAction(cancelAction) sheetCtrl.popoverPresentationController?.sourceView = self.view sheetCtrl.popoverPresentationController?.sourceRect = self.changeLanguageButton.frame present(sheetCtrl, animated: true, completion: nil) }

Paso # 2: Explicar al usuario qué hacer + Cambiar el idioma con reiniciar

Puede haber notado que el código en el paso # 1 llama a un método llamado changeToLanguage(langCode:) . Eso es lo que debe hacer, también cuando el usuario elige un nuevo idioma para cambiar, sin importar cómo haya diseñado su selector. Aquí está su implementación , solo cópielo en su proyecto:

private func changeToLanguage(_ langCode: String) { if Bundle.main.preferredLocalizations.first != langCode { let message = "In order to change the language, the App must be closed and reopened by you." let confirmAlertCtrl = UIAlertController(title: "App restart required", message: message, preferredStyle: .alert) let confirmAction = UIAlertAction(title: "Close now", style: .destructive) { _ in UserDefaults.standard.set([langCode], forKey: "AppleLanguages") UserDefaults.standard.synchronize() exit(EXIT_SUCCESS) } confirmAlertCtrl.addAction(confirmAction) let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil) confirmAlertCtrl.addAction(cancelAction) present(confirmAlertCtrl, animated: true, completion: nil) } }

Esto preguntará e informará al usuario si quiere hacer el cambio y cómo hacerlo. También establece el idioma de las aplicaciones en el próximo inicio utilizando:

UserDefaults.standard.set([langCode], forKey: "AppleLanguages") UserDefaults.standard.synchronize() // required on real device

Paso # 3 (opcional): Localice las cuerdas

Es posible que desee localizar las cadenas como "Cerrar ahora" mediante el uso de la macro NSLocalizedString (o cualquier otro método mejorado).

Ejemplo de mundo real

Estoy usando esta implementación exacta en una aplicación dirigida para iOS 10, puedo confirmar que funciona para mí tanto en el simulador como en el dispositivo. La aplicación es en realidad de código abierto , por lo que puede encontrar el código anterior distribuido en diferentes clases here .

Mi pregunta:

¿Cómo puede mi aplicación de iPhone decirle a iOS que el usuario seleccionó un idioma en las preferencias de las aplicaciones, que es diferente del idioma establecido en la configuración general?

Otra formulación de la misma pregunta:

¿Cómo puedo decirle al sistema que NSLocalizedString (@"text", @"comment"); no debe acceder al idioma seleccionado en todo el sistema, sino al idioma seleccionado en la aplicación?

fondo, ejemplo:

Tomemos esta situación como ejemplo: un hijo de inmigrantes alemanes vive en el noreste de Francia, al lado de Luxemburgo y Alemania. Su lengua materna es el francés, por lo que estableció el idioma de las interfaces de usuario de su iPhone en francés (Configuración -> General -> Internacional -> Idioma -> Français). Pero debido a su origen cultural y porque la región donde vive es bilingüe, también habla alemán muy bien. Pero él no habla diez palabras de inglés. En un iPhone (y también en un iPad) no tiene posibilidad de seleccionar un segundo idioma, por lo que el teléfono solo sabe que habla francés. No tiene conocimiento de las habilidades de los usuarios en otros idiomas.

Ahora viene mi aplicación: lo desarrollé en inglés y alemán (el alemán es mi lengua materna y el inglés es el estándar en TI). Lo desarrollé de acuerdo con todas las reglas y mejores prácticas para iOS-Apps mulilingüe. El "Primer" idioma (idioma predeterminado) de mi aplicación es inglés.

Esto significa:

Si alguien ha elegido inglés o alemán en su Configuración, la interfaz de usuario de la aplicación utilizará automáticamente el idioma seleccionado. El usuario ni siquiera notará que hay otros idiomas disponibles.

Pero si seleccionó cualquier otro idioma (como chino, polaco o francés) en la configuración general, obtendrá el idioma predeterminado de la aplicación, que, en mi caso, es inglés. Pero para mi amigo franco-alemán, esta no es la mejor opción. Le gustaría usar la versión alemana existente, pero parece que no hay forma de que el usuario seleccione esta versión.

Agregar una traducción al francés resolvería el problema para nuestro amigo franco-alemán, pero no para las personas que hablan otros dos idiomas (como italiano y alemán), y no puedo respaldar mi aplicación con todos los idiomas que se hablan en este planeta. Establecer el idioma predeterminado en alemán tampoco es óptimo, porque esto plantearía el mismo problema para las personas que hablan francés (un idioma nativo) e inglés (como segundo idioma).

Por lo tanto, creo que mi aplicación debe tener la posibilidad de seleccionar manualmente un idioma que sea diferente del idioma preseleccionado. Agregar una selección de idioma al panel de configuración de aplicaciones no es el problema. Pero ¿cómo puedo decirle al sistema que NSLocalizedString (@"text", @"comment"); no debe acceder al idioma seleccionado en todo el sistema, sino al idioma seleccionado en la aplicación?


Es muy simple y fácil cambiar el idioma manualmente. En primer lugar, necesita localizar su aplicación, luego puede usar el código a continuación para cambiar el idioma manualmente en su aplicación.

UIAlertController *actionSheet = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"App restart required", @"App restart required") message:NSLocalizedString(@"In order to change the language, the App must be closed and reopened by you.", @"In order to change the language, the App must be closed and reopened by you.") preferredStyle:UIAlertControllerStyleActionSheet]; [actionSheet addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"Cancel", @"Cancel") style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) { [self dismissViewControllerAnimated:YES completion:^{ }]; }]]; [actionSheet addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"Restart", @"Restart") style:UIAlertActionStyleDestructive handler:^(UIAlertAction *action) { [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"ar", nil] forKey:@"AppleLanguages"]; [[NSUserDefaults standardUserDefaults]synchronize]; exit(EXIT_SUCCESS); }]]; [self presentViewController:actionSheet animated:YES completion:nil]; }


Mi respuesta puede ser una cuestión de preferencia ya que desdeñaría la selección manual del idioma en la aplicación: deberá anular todos los botones provistos por el sistema y asegurarse de no usarlos. También agrega otra capa de complejidad y puede llevar al usuario a la confusión.

Sin embargo, como esto tiene que ser una respuesta, creo que su caso de uso se resuelve sin hackear la selección de idioma.

En las preferencias de iOS, puede establecer idiomas adicionales:

Su ejemplo de hijo de inmigrantes podría haber establecido el francés como idioma principal y el alemán como un idioma adicional.

Luego, cuando su aplicación esté traducida al inglés y al alemán, el iPhone de ese joven podría elegir recursos alemanes.

¿Eso resolvería el problema?


Mientras tanto, encontré una solución para mi problema en mí mismo:

Creé una nueva clase "LocalizeHelper":

Encabezado LocalizeHelper.h

//LocalizeHelper.h #import <Foundation/Foundation.h> // some macros (optional, but makes life easy) // Use "LocalizedString(key)" the same way you would use "NSLocalizedString(key,comment)" #define LocalizedString(key) [[LocalizeHelper sharedLocalSystem] localizedStringForKey:(key)] // "language" can be (for american english): "en", "en-US", "english". Analogous for other languages. #define LocalizationSetLanguage(language) [[LocalizeHelper sharedLocalSystem] setLanguage:(language)] @interface LocalizeHelper : NSObject // a singleton: + (LocalizeHelper*) sharedLocalSystem; // this gets the string localized: - (NSString*) localizedStringForKey:(NSString*) key; //set a new language: - (void) setLanguage:(NSString*) lang; @end

iMplementation LocalizeHelper.m

// LocalizeHelper.m #import "LocalizeHelper.h" // Singleton static LocalizeHelper* SingleLocalSystem = nil; // my Bundle (not the main bundle!) static NSBundle* myBundle = nil; @implementation LocalizeHelper //------------------------------------------------------------- // allways return the same singleton //------------------------------------------------------------- + (LocalizeHelper*) sharedLocalSystem { // lazy instantiation if (SingleLocalSystem == nil) { SingleLocalSystem = [[LocalizeHelper alloc] init]; } return SingleLocalSystem; } //------------------------------------------------------------- // initiating //------------------------------------------------------------- - (id) init { self = [super init]; if (self) { // use systems main bundle as default bundle myBundle = [NSBundle mainBundle]; } return self; } //------------------------------------------------------------- // translate a string //------------------------------------------------------------- // you can use this macro: // LocalizedString(@"Text"); - (NSString*) localizedStringForKey:(NSString*) key { // this is almost exactly what is done when calling the macro NSLocalizedString(@"Text",@"comment") // the difference is: here we do not use the systems main bundle, but a bundle // we selected manually before (see "setLanguage") return [myBundle localizedStringForKey:key value:@"" table:nil]; } //------------------------------------------------------------- // set a new language //------------------------------------------------------------- // you can use this macro: // LocalizationSetLanguage(@"German") or LocalizationSetLanguage(@"de"); - (void) setLanguage:(NSString*) lang { // path to this languages bundle NSString *path = [[NSBundle mainBundle] pathForResource:lang ofType:@"lproj" ]; if (path == nil) { // there is no bundle for that language // use main bundle instead myBundle = [NSBundle mainBundle]; } else { // use this bundle as my bundle from now on: myBundle = [NSBundle bundleWithPath:path]; // to be absolutely shure (this is probably unnecessary): if (myBundle == nil) { myBundle = [NSBundle mainBundle]; } } } @end

Para cada idioma que desee admitir, necesita un archivo denominado Localizable.strings . Esto funciona exactamente como se describe en la documentación de Apples para localización. La única diferencia: ahora incluso puedes usar idiomas como hindi o esperanto, que no son compatibles con Apple.

Para darte un ejemplo, aquí están las primeras líneas de mis versiones en inglés y alemán de Localizable.strings:

Inglés

/* English - English */ /* for debugging */ "languageOfBundle" = "English - English"; /* Header-Title of the Table displaying all lists and projects */ "summary" = "Summary"; /* Section-Titles in table "summary" */ "help" = "Help"; "lists" = "Lists"; "projects" = "Projects"; "listTemplates" = "List Templates"; "projectTemplates" = "Project Templates";

alemán

/* German - Deutsch */ /* for debugging */ "languageOfBundle" = "German - Deutsch"; /* Header-Title of the Table displaying all lists and projects */ "summary" = "Überblick"; /* Section-Titles in table "summary" */ "help" = "Hilfe"; "lists" = "Listen"; "projects" = "Projekte"; "listTemplates" = "Vorlagen für Listen"; "projectTemplates" = "Vorlagen für Projekte";

Para usar la localización, debe tener algunas configuraciones-rutinas en su aplicación, y en la selección de idioma que llama la macro:

LocalizationSetLanguage(selectedLanguage);

Después de eso, debes asegurarte de que todo lo que se mostró en el idioma antiguo se vuelva a dibujar en el nuevo idioma en este momento (los textos ocultos se deben volver a dibujar tan pronto como se vuelvan a ver).

Para tener textos localizados disponibles para cada situación, NUNCA debe escribir textos fijos para los títulos de los objetos. SIEMPRE use la macro LocalizedString(keyword) .

no hacer:

cell.textLabel.text = @"nice title";

hacer:

cell.textLabel.text = LocalizedString(@"nice title");

y tener una entrada de "buen título" en cada versión de Localizable.strings!


Simplemente agregue lo siguiente a la pantalla con la opción de idioma:

NSString *tempValue = //user chosen language. Can be picker view/button/segmented control/whatever. Just get the text out of it NSString *currentLanguage = @""; if ([tempValue rangeOfString:NSLocalizedString(@"English", nil)].location != NSNotFound) { currentLanguage = @"en"; } else if ([tempValue rangeOfString:NSLocalizedString(@"German", nil)].location != NSNotFound) { currentLanguage = @"de"; } else if ([tempValue rangeOfString:NSLocalizedString(@"Russian", nil)].location != NSNotFound) { currentLanguage = @"ru"; } [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:currentLanguage, nil] forKey:@"AppleLanguages"]; [[NSUserDefaults standardUserDefaults]synchronize];

Luego pídales que reinicien la aplicación y la aplicación estará en otro idioma.

Espero eso ayude


Localize-Swift : localización amigable Swift e i18n con cambio de idioma en la aplicación