Cambiar idioma en la aplicación mediante progtwigción

Cómo cambiar el idioma en Xcode 5

Tengo 3 botones en ChangeLanguageViewController

Esto son:

  • Inglés
  • Chino simplificado
  • Bahasa Malasia

Aquí está el código:

 #import <UIKit/UIKit.h> @interface ChangeLanguageViewController :UIViewController -(IBAction)changeEnglish:(id)sender; -(IBAction)changeChinesesimplified:(id)sender; -(IBAction)changeBahasaMalaysia:(id)sender; -(IBAction)changeEnglish:(id)sender{ [[NSUSerDefaults standardUSerDefaults] setObject:[NSArray arrayWithObjects:@"en", @"zh-Hans", @"ms", nil] forKey:@"AppleLanguage"]; } -(IBAction)changeChinesesimplified:(id)sender{ [[NSUSerDefaults standardUSerDefaults] setObject:[NSArray arrayWithObjects:@"zh-Hans", @"ms", @"en", nil] forKey:@"AppleLanguage"]; } -(IBAction)changeBahasaMalaysia:(id)sender{ [[NSUSerDefaults standardUSerDefaults] setObject:[NSArray arrayWithObjects:@"ms",@"en",@"zh-Hans", nil] forKey:@"AppleLanguage"]; } 

Quiero ver el cambio de idioma cuando el usuario presiona un button y no matará la aplicación, pero cambia el idioma de la aplicación dentro

Por lo general, cuando soporta los idiomas oficiales que Apple admite en iOS, no hay ninguna razón para proporcionar cambio de idioma dentro de la aplicación, simplemente configure correctamente las traducciones en su proyecto y el idioma de la interfaz cambiará automáticamente con el sistema. Pero ya que la quieres de la aplicación, hay pocas forms de hacerlo:

1) Puede forzar un idioma específico solo para su aplicación con el siguiente código:

 [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"zh-Hans", @"en", @"fr", nil] forKey:@"AppleLanguages"]; [[NSUserDefaults standardUserDefaults] synchronize]; 

Sugeriría poner este código dentro del file main.m en la function "int main" justo antes del "return UIApplicationMain". Pero este método requiere que mates la aplicación o le dices al usuario que reinicie la aplicación para que surta efecto.

Puede matar la aplicación sin tener que obligar a salir de la aplicación con exit(0) , pero asegúrese de que el usuario tenga la posibilidad de cancelar la acción con UIAlertView o similar, o que Apple rechace su aplicación.

2) Alternative está implementando su propia lógica de localización, donde solo toma traducciones de su propio file de idioma. Una forma es este ejemplo, que toma traducciones de files oficiales de lproj. De esta manera puede cambiar el idioma sobre la marcha sin reiniciar, pero debe cargar manualmente todos los texts de la label del código. Cuando cambie la traducción, tendrá que volver a llenar el text en la pantalla.

No puedes hacer esto sin reiniciar la aplicación. Por lo tanto, debe save el idioma seleccionado en NSUserDefaults y reiniciar la aplicación después de colocar debajo de las líneas en su main.h

 [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects: your_lang, nil] forKey:@"AppleLanguages"]; [[NSUserDefaults standardUserDefaults] synchronize]; 

EDITAR: SWIFT 3.

Use esta class de ayuda para sus necesidades.

  class LanguageManager: NSObject { var availableLocales = [CustomLocale]() static let shanetworkingInstance = LanguageManager() var lprojBasePath = String() override fileprivate init() { super.init() let english = CustomLocale(languageCode: GlobalConstants.englishCode, countryCode: "gb", name: "United Kingdom") let finnish = CustomLocale(languageCode: GlobalConstants.finnishLangCode, countryCode: "fi", name: "Finland") self.availableLocales = [english,finnish] self.lprojBasePath = getSelectedLocale() } fileprivate func getSelectedLocale()->String{ let lang = Locale.prefernetworkingLanguages//returns array of prefernetworking languages let languageComponents: [String : String] = Locale.components(fromIdentifier: lang[0]) if let languageCode: String = languageComponents["kCFLocaleLanguageCodeKey"]{ for customlocale in availableLocales { if(customlocale.languageCode == languageCode){ return customlocale.languageCode! } } } return "en" } func getCurrentBundle()->Bundle{ if let bundle = Bundle.main.path(forResource: lprojBasePath, ofType: "lproj"){ return Bundle(path: bundle)! }else{ fatalError("lproj files not found on project directory. /n Hint:Localize your strings file") } } func setLocale(_ langCode:String){ UserDefaults.standard.set([langCode], forKey: "AppleLanguages")//replaces Locale.prefernetworkingLanguages UserDefaults.standard.synchronize() self.lprojBasePath = getSelectedLocale() } } class CustomLocale: NSObject { var name:String? var languageCode:String? var countryCode:String? init(languageCode: String,countryCode:String,name: String) { self.name = name self.languageCode = languageCode self.countryCode = countryCode } } 

He hecho un proyecto de demostración en github .