2014-02-27 73 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

相关问题