2014-02-27 81 views
8

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

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

+1

http://stackoverflow.com/questions/34130853/how-to-force-an-app-to-change-language-in-ios-objective-c/34131794#34131794 – user3182143

回答

17

通常當你支持蘋果iOS中支持官方語言,沒有理由提供應用程序內切換語言,只要正確設置你的項目和界面語言的翻譯將與系統自動切換。但由於從應用中想要的話,有幾種方法去這個問題:

1)你可能迫使一個特定的語言只是你用下面的代碼的應用程序:

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

我建議把這個代碼在「返回UIApplicationMain」之前的「int main」函數中的main.m文件中。但是這種方法要求你殺死應用程序或告訴用戶重新啓動應用程序才能生效。

你可以殺死應用程序,而無需用戶強制退出使用exit(0)的應用程序,但要確保用戶有機會與UIAlertView或類似的中止行動,或蘋果可能會拒絕你的應用程序。

2)替代方案是實現您自己的本地化邏輯,您只需從自己的語言文件中獲取翻譯。一種方式is this example需要從官方lproj文件進行翻譯。通過這種方式,您可以在不重新啓動的情況下即時更改語言,但您必須手動加載代碼中的所有標籤文本。當您更改翻譯時,您必須重新填寫屏幕上的文字。

+0

我可以使用它到一個按鈕? – user3278013

+0

如果在主函數外部調用,更改NSUserDefaults中的AppleLanguages不會產生任何影響,必須在那裏設置它。您可以使用按鈕保存自己的變量,告訴用戶重新啓動應用程序,並在主要讀取您的變量並將其設置爲AppleLanguages。 – frin

+0

「您可以在不讓用戶使用exit(0)強制退出應用程序的情況下終止應用程序,但要確保用戶有機會使用UIAlertView或類似方法中止操作,否則Apple可能會拒絕您的應用程序。」 我該怎麼辦? – user3278013

7

語言你不能在不重新啓動應用程序的情況下執 因此,您需要將所選語言保存在NSUserDefaults中,並在main.h中輸入以下行後重新啓動應用程序。

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

編輯: 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做了一個演示項目。

+1

嗨,如何本地化來自服務器的動態文本,在我的應用程序中每一個文本都必須以簡體中文顯示,但是如何顯示中文裏的英文文本。幫我。 –

+0

在本地更改服務器文本是不可能的。您需要做的是在服務器中指定兩種語言,並在每個請求的標頭中請求所需的語言。服務器應處理標題並根據請求返回語言 –

+0

劑量這對於Webview也適用嗎? – Abhi

相關問題