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

在iOS中以编程方式更改应用程序中的语言,ios,xcode,localization,Ios,Xcode,Localization,如何更改Xcode 5中的语言 我在ChangeLanguageViewController 这是: 英式 简体中文 马来西亚语 以下是代码: #import <UIKit/UIKit.h> @interface ChangeLanguageViewController :UIViewController -(IBAction)changeEnglish:(id)sender; -(IBAction)changeChinesesimplified:(id)sender; -(IB

如何更改Xcode 5中的语言

我在
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"];
}
#导入
@接口更改语言ViewController:UIViewController
-(iAction)changeEnglish:(id)发送者;
-(iAction)changeChinesesimplified:(id)发送方;
-(iAction)changeBahasaMalaysia:(id)发送方;
-(iAction)changeEnglish:(id)发件人{
[[NSUSerDefaults standardUSerDefaults]setObject:[NSArray阵列,其对象为:@“en”、“zh Hans”、“ms”、“nil]forKey:@“AppleLanguage”];
}
-(iAction)changeChinesesimplified:(id)发件人{
[[NSUSerDefaults standardUSerDefaults]setObject:[NSArray阵列,其对象为:@“zh Hans”、“ms”、“en”、“nil]forKey:@“AppleLanguage”];
}
-(iAction)changeBahasaMalaysia:(id)发送方{
[[NSUSerDefaults standardUSerDefaults]setObject:[NSArray阵列,其对象为:@“ms”@“en”@“zh Hans”,nil]forKey:@“AppleLanguage”];
}

我想在用户按下按钮时看到语言的变化,它不会关闭应用程序,但它会在内部更改应用程序的语言。如果不重新启动应用程序,则无法执行此操作。 因此,您需要将所选语言保存在
NSUserDefaults
中,并在
main.h
的下面几行中重新启动应用程序

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

通常,当您支持苹果在iOS中支持的官方语言时,没有理由在应用程序中提供语言切换,只需在项目中正确设置翻译,界面语言将自动随系统切换。但是,既然你想从应用程序中获得它,有几种方法可以做到这一点:

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

[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"zh-Hans", @"en", @"fr", nil] forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize];
我建议将此代码放在main.m文件中“int main”函数中“return UIApplicationMain”之前的main.m文件中。但此方法要求您关闭应用程序或告诉用户重新启动应用程序,以使其生效


您可以使用
exit(0)
关闭应用程序,而无需用户强制退出应用程序,但请确保用户有机会使用
UIAlertView
或类似工具中止操作,否则苹果可能会拒绝您的应用程序


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

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

    }

}

我已经做了一个演示项目

我可以将其用于按钮吗?如果在主函数外调用,则在NSUserDefaults中更改AppleLanguages将不会产生任何效果,必须在那里进行设置。您可以使用按钮保存自己的变量,告诉用户重新启动应用程序,然后在main中读取您的变量并将其设置为AppleLanguages。“您可以在不让用户使用exit(0)强制退出应用程序的情况下终止应用程序,但请确保用户有机会使用UIAlertView或类似工具中止操作,否则苹果可能会拒绝您的应用程序。”我该怎么做呢?不要直接更改它,请看《你好,如何本地化来自服务器的动态文本》,在我的应用程序中,每个文本都必须用简体中文显示,但如何用中文显示来自英语的文本。帮助我。在本地更改服务器文本是不可能的。您需要做的是在服务器中指定两种语言,并在每个请求的标题中指定所需的请求语言。服务器应处理标题并从requestDemo项目开始返回语言@LC非常有用웃