首页 文章

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

提问于
浏览
9

如何更改Xcode 5中的语言

ChangeLanguageViewController 上有3个按钮

这是:

  • 英文

  • 简体中文

  • 马来西亚语

这是代码:

#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 回答

  • 19

    通常当您支持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可能拒绝您的应用程序 .

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

  • 7

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

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

    EDIT: 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做了一个演示项目 .

相关问题