以编程方式在应用程序中更改语言
如何在Xcode 5中更改语言
我在ChangeLanguageViewController
上有3个button
这是:
- 英语
- 简体中文
- 马来西亚语
这是代码:
#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"]; }
我想看看用户按下button时语言的变化,它不会杀死应用程序,但会改变应用程序的语言
通常,当您支持iOS支持的官方语言时,没有理由在应用程序中提供语言切换,只需在项目中正确设置翻译,界面语言就会自动与系统切换。 但是,既然你想从应用程序,它有几个方法去做到这一点:
1)您可以使用以下代码强制您的应用程序使用特定的语言:
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"zh-Hans", @"en", @"fr", nil] forKey:@"AppleLanguages"]; [[NSUserDefaults standardUserDefaults] synchronize];
我build议在“返回UIApplicationMain”之前,把这个代码放在main.m文件中的“int main”函数中。 但是这种方法要求你杀死应用程序或者告诉用户重新启动应用程序才能生效。
您可以杀死应用程序,而无需用户使用exit(0)
强制退出应用程序,但要确保用户有机会使用UIAlertView
或类似方法中止操作,否则Apple可能会拒绝您的应用程序。
2)替代scheme是实现自己的本地化逻辑,在那里你只需要从你自己的语言文件翻译。 其中一种方法是从官方的lproj文件进行翻译。 这样,您可以在不重新启动的情况下即时更改语言,但是您必须手动加载代码中的所有标签文本。 当您更改翻译时,您必须在屏幕上重新填充文字。
如果不重新启动应用程序,则无法执行此操作。 所以你需要将所选的语言保存在NSUserDefaults
并在NSUserDefaults
放置下面的行后重新启动应用程序。
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects: your_lang, nil] forKey:@"AppleLanguages"]; [[NSUserDefaults standardUserDefaults] synchronize];
编辑: SWIFT 3。
根据您的要求使用这个帮手类。
class LanguageManager: NSObject { var availableLocales = [CustomLocale]() static let sharedInstance = 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.preferredLanguages//returns array of preferred 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.preferredLanguages 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 } }
我在github上做了一个演示项目。