簡體   English   中英

在iOS中以編程方式更改應用程序中的語言

[英]Change Language in the app programmatically in iOS

如何更改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"];
}

我想看到當用戶按下按鈕時語言發生變化,它不會殺死應用程序,但會改變應用程序內部的語言

通常當您支持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)替代方案是實現您自己的本地化邏輯,您只需從您自己的語言文件中獲取翻譯。 一種方法從官方lproj文件中獲取翻譯的這個例子 這樣,您可以在不重新啟動的情況下動態更改語言,但必須手動加載代碼中的所有標簽文本。 更改翻譯時,必須在屏幕上重新填充文本。

如果不重新啟動應用程序,則無法執行此操作。 所以,你需要保存所選語言NSUserDefaults ,並把下面的線在你之后重新啟動應用程序main.h

[[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上做了一個演示項目。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM