una ingles idioma español como chino cambiar app aplicacion iphone ios localization runtime

iphone - ingles - Cambio de idioma sobre la marcha, en la ejecución de iOS, mediante programación



como cambiar el idioma del app store de chino a español (5)

De acuerdo con Apple guidelines no es una buena idea cambiar el idioma en la aplicación mediante programación, pero en caso de que no tenga la capacidad de cambiar el comportamiento solicitado, puede hacer algo como lo siguiente:

  1. Prepare algún servicio para administrar su idioma incluso después de reiniciar la aplicación

    enum LanguageName: String { case undefined case en case es } let DynamicLanguageServiceDidDetectLanguageSwitchNotificationKey = "DynamicLanguageServiceDidDetectLanguageSwitchNotificationKey" func dynamicLocalizableString(_ key: String) -> String { return LanguageService.service.dynamicLocalizedString(key) } class LanguageService { private struct Defaults { static let keyAppleLanguage = "AppleLanguages" static let keyCurrentLanguage = "KeyCurrentLanguage" } static let service:LanguageService = LanguageService() var languageCode: String { get { return language.rawValue } } var currentLanguage:LanguageName { get { var currentLanguage = UserDefaults.standard.object(forKey: Defaults.keyCurrentLanguage) if let currentLanguage = currentLanguage as? String { UserDefaults.standard.set([currentLanguage], forKey: Defaults.keyAppleLanguage) UserDefaults.standard.synchronize() } else { if let languages = UserDefaults.standard.object(forKey: Defaults.keyAppleLanguage) as? [String] { currentLanguage = languages.first } } if let currentLanguage = currentLanguage as? String, let lang = LanguageName(rawValue: currentLanguage) { return lang } return LanguageName.undefined } } func switchToLanguage(_ lang:LanguageName) { language = lang NotificationCenter.default.post(name: NSNotification.Name(rawValue: DynamicLanguageServiceDidDetectLanguageSwitchNotificationKey), object: nil) } private var localeBundle:Bundle? fileprivate var language: LanguageName = LanguageName.en { didSet { let currentLanguage = language.rawValue UserDefaults.standard.set([currentLanguage], forKey:Defaults.keyAppleLanguage) UserDefaults.standard.setValue(currentLanguage, forKey:Defaults.keyCurrentLanguage) UserDefaults.standard.synchronize() setLocaleWithLanguage(currentLanguage) } } // MARK: - LifeCycle private init() { prepareDefaultLocaleBundle() } //MARK: - Private fileprivate func dynamicLocalizedString(_ key: String) -> String { var localizedString = key if let bundle = localeBundle { localizedString = NSLocalizedString(key, bundle: bundle, comment: "") } else { localizedString = NSLocalizedString(key, comment: "") } return localizedString } private func prepareDefaultLocaleBundle() { var currentLanguage = UserDefaults.standard.object(forKey: Defaults.keyCurrentLanguage) if let currentLanguage = currentLanguage as? String { UserDefaults.standard.set([currentLanguage], forKey: Defaults.keyAppleLanguage) UserDefaults.standard.synchronize() } else { if let languages = UserDefaults.standard.object(forKey: Defaults.keyAppleLanguage) as? [String] { currentLanguage = languages.first } } if let currentLanguage = currentLanguage as? String { updateCurrentLanguageWithName(currentLanguage) } } private func updateCurrentLanguageWithName(_ languageName: String) { if let lang = LanguageName(rawValue: languageName) { language = lang } } private func setLocaleWithLanguage(_ selectedLanguage: String) { if let pathSelected = Bundle.main.path(forResource: selectedLanguage, ofType: "lproj"), let bundleSelected = Bundle(path: pathSelected) { localeBundle = bundleSelected } else if let pathDefault = Bundle.main.path(forResource: LanguageName.en.rawValue, ofType: "lproj"), let bundleDefault = Bundle(path: pathDefault) { localeBundle = bundleDefault } } }

  2. Agregue algunas reglas para asegurarse de que los componentes de la IU se actualizarán siempre:

    protocol Localizable { func localizeUI() }

  3. Implementarlos

    class LocalizableViewController: UIViewController { // MARK: - LifeCycle override func viewDidLoad() { super.viewDidLoad() NotificationCenter.default.addObserver(self, selector: #selector(self.localizeUI), name: NSNotification.Name(rawValue:DynamicLanguageServiceDidDetectLanguageSwitchNotificationKey), object: nil) } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) localizeUI() } deinit { NotificationCenter.default.removeObserver(self) } } extension LocalizableViewController: Localizable { // MARK: - Localizable func localizeUI() { fatalError("Must Override to provide inApp localization functionality") } }

  4. Herede cualquier controlador u desea conformar la funcionalidad de cambio de aplicación dinámica e implementar la función localizeUI()

    final class WelcomeTableViewController: LoadableTableViewController

  5. Cambiar el idioma según sea necesario:

    LanguageService.service.switchToLanguage(.en)

  6. Toda la cadena localizable debe establecerse como:

    label.text = dynamicLocalizableString(<KEY_IN_STRINGS>)

Nota: no olvide agregar Localizable.strings con los mismos códigos que en LanguageName

He estado apilando y google durante horas. Y estoy un poco desesperado ahora. Me gustaría cambiar el idioma de mi aplicación dentro de la aplicación no solo con el idioma predeterminado.

Por lo que he intentado me he quedado como todos con el paso de reinicio. Lo que significa que las manzanas te obligan a reiniciar la aplicación manualmente. Lo que significa que debes salir de la aplicación y luego volver a iniciarla.

Bueno, después de buscar en Google, intentaba configurar una alarma y luego forzaba a la aplicación a salir con

exit(0);

Mi mal, parece que a Apple no le gusta esto y evita que el desarrollador lo use ... Supongo que no estoy apuntando en la dirección correcta.

Finalmente, a pesar de todo el problema, podría reunirme y me gustaría discutir sobre eso.

¿Alguna pista?

EDITAR, informaciones de APPLE

En general, no debe cambiar el idioma del sistema iOS (mediante el uso de la clave pref de AppleLanguages) desde su aplicación. Esto va en contra del modelo de usuario básico de iOS para cambiar de idioma en la aplicación de Configuración, y también utiliza una clave de preferencia que no está documentada, lo que significa que en algún momento en el futuro, el nombre de la clave podría cambiar, lo que interrumpiría su aplicación.

Si desea cambiar los idiomas en su aplicación, puede hacerlo cargando manualmente los archivos de recursos en su paquete. Puede usar NSBundle: pathForResource: ofType: inDirectory: forLocalization: para este propósito, pero tenga en cuenta que su aplicación será responsable de toda la carga de datos localizados.

Con respecto a la pregunta de salida (0), Apple DTS no puede comentar sobre el proceso de aprobación de la aplicación. Debe comunicarse con [email protected] para obtener una respuesta a esta pregunta.

Bueno, tengo que elegir hasta ahora.



En general, el idioma que ve el usuario está determinado por la configuración regional, que es una configuración de todo el sistema. Solo el usuario puede cambiarlo, y cuando lo hace, SpringBoard y todas las aplicaciones en ejecución en el dispositivo deben reiniciarse. No hay forma de evitar esto porque todas las aplicaciones y marcos del sistema asumen que la configuración regional no cambia una vez que comienzan a ejecutarse. Cambiar las aplicaciones y los marcos para que no requieran un relanzamiento sería muy difícil para Apple.

Supongo que desea variar el idioma de la interfaz de su aplicación de forma completamente independiente de la configuración regional del sistema, o desea utilizar la configuración regional del sistema de forma predeterminada, pero permitir que el usuario la anule solo para su aplicación.

Puede obtener la configuración regional actual y examinar sus diversos valores utilizando +[NSLocale currentLocale] . Para mostrar la interfaz de usuario de su aplicación en un idioma que sea independiente de la configuración regional del sistema, deberá evitar el uso de NSLocalizedString() completo, y utilizar algún tipo de estado personalizado para determinar qué cadenas mostrar al usuario y cómo modificar la interfaz para que se ajuste al lenguaje de tu aplicación. Dependerá de usted mantener el estado del idioma de su aplicación y modificar su interfaz de usuario de manera apropiada.



Sí, tuve el mismo problema, luego lo manejé con mi propia configuración de idioma en mi prefFile, donde establecí una variable para la configuración de idioma:

// write a new value in file and set the var - (void)changeLangInPrefFile:(NSString *)newLanguage { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *path = [documentsDirectory stringByAppendingPathComponent:@"myPreference.plist"]; NSMutableDictionary *data = [[NSMutableDictionary alloc] initWithContentsOfFile: path]; //here add elements to data file and write data to file [data setObject:newLanguage forKey:@"language"]; [data writeToFile:path atomically:YES]; [data release]; // NSString *chosenLang; <- declared in .h file if (chosenLang != nil){ [chosenLang release]; chosenLang = nil; } chosenLang = [[NSString alloc] initWithString:(@"%@",newLanguage)]; } // read the language from file and set the var: - (void)readFromFileInBundleDocuments { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *path = [documentsDirectory stringByAppendingPathComponent:@"myPreference.plist"]; NSMutableDictionary *savedStock = [[NSMutableDictionary alloc] initWithContentsOfFile:path]; NSString *chosenLangTemp = [savedStock objectForKey:@"language"]; NSLog (@"read in file: %@", chosenLangTemp); if (chosenLang != nil){ [chosenLang release]; chosenLang = nil; } chosenLang = [[NSString alloc] initWithString:(@"%@",chosenLangTemp)]; [savedStock release]; }

luego cargo todo el contenido de diferentes archivos dependiendo del idioma, por ejemplo, puedo cargar "an_image_eng.png" o "an_image_ita.png", o tener 2 archivos .xib diferentes y para cargar el texto, uso diferentes archivos de diccionarios, una para cada idioma, con todas las palabras / expresiones traducidas, solo cargue la elegida y leo la expresión correcta para cada texto que se va a cargar (el código para cargarla es similar al método que escribí en este ejemplo, puede simplemente ordénelo para que lea la palabra correcta para cada expresión: solo mire el valor de objectForKey en el archivo de diccionario correcto, donde objectForKey es la palabra que se traduce y su valor es la palabra traducida) ...