在iOS中以编程方式更改应用程序中的语言

时间:2014-02-27 07:07:50

标签: ios xcode localization

如何更改Xcode 5中的语言

我在ChangeLanguageViewController

上有3个按钮

这是:

  • 简体中文
  • Bahasa Malaysia

这是代码:

#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"];
}

我想看到当用户按下按钮时语言发生变化,它不会杀死应用程序,但会更改应用程序内的语言

3 个答案:

答案 0 :(得分:22)

通常当您支持Apple在iOS中支持的官方语言时,没有理由在应用程序中提供语言切换,只需在项目中正确设置翻译,界面语言将自动切换到系统。但是既然你想从应用程序中获取它,那么几乎没有办法解决这个问题:

1)您可以使用以下代码强制使用特定语言:

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

我建议在“返回UIApplicationMain”之前将此代码放在main.m文件的“int main”函数中。但是此方法要求您终止应用程序或告诉用户重新启动应用程序才能使其生效。

您可以在不让用户强制使用exit(0)退出应用的情况下终止应用,但请确保用户有机会使用UIAlertView或类似内容中止操作,否则Apple可能拒绝您的应用。< / p>

2)替代方案是实现您自己的本地化逻辑,您只需从您自己的语言文件中获取翻译。一种方法is this example从官方lproj文件中获取翻译。这样,您可以在不重新启动的情况下动态更改语言,但必须手动加载代码中的所有标签文本。更改翻译时,您必须在屏幕上重新填充文本。

答案 1 :(得分:7)

如果不重新启动应用,则无法执行此操作。 因此,您需要在NSUserDefaults中保存所选语言,然后在main.h下面添加以下内容后重新启动应用。

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

答案 2 :(得分:4)

编辑: 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制作了一个演示项目。