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

use*_*013 12 xcode localization ios

如何更改Xcode 5中的语言

我有3个按钮 ChangeLanguageViewController

这是:

  • 英语
  • 简体中文
  • 马来语

这是代码:

#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"];
}
Run Code Online (Sandbox Code Playgroud)

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

fri*_*rin 22

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

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

[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"zh-Hans", @"en", @"fr", nil] forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize];
Run Code Online (Sandbox Code Playgroud)

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

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

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


nul*_*ull 7

如果不重新启动应用程序,则无法执行此操作.所以,你需要保存所选择的语言NSUserDefaults,并把下面的线在你之后重新启动应用程序main.h.

[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects: your_lang, nil] forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize];
Run Code Online (Sandbox Code Playgroud)


LC *_*C 웃 5

编辑: 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

    }

}
Run Code Online (Sandbox Code Playgroud)

我在github中做了一个演示项目。