【问题标题】:Change Language in the app programmatically in iOS在 iOS 中以编程方式更改应用程序中的语言
【发布时间】:2014-02-27 07:07:50
【问题描述】:

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

我想看到用户按下按钮时的语言变化,它不会杀死应用程序,但会改变应用程序内部的语言

【问题讨论】:

标签: ios xcode localization


【解决方案1】:

通常当您在iOS中支持Apple支持的官方语言时,没有理由在应用程序内提供语言切换,只需在您的项目中正确设置翻译,界面语言会自动随系统切换。但既然你想从应用程序中获得它,那么有几种方法可以解决这个问题:

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

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

我建议将此代码放在 main.m 文件中的“int main”函数中,就在“返回 UIApplicationMain”之前。但是这种方法需要你杀死应用或者告诉用户重启应用才能生效。

您可以在不让用户使用 exit(0) 强制退出应用的情况下终止应用,但请确保用户有机会使用 UIAlertView 或类似名称中止该操作,否则 Apple 可能会拒绝您的应用。

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

【讨论】:

  • 我可以用它做一个按钮吗?
  • 在 NSUserDefaults 中更改 AppleLanguages 如果在主函数之外调用将不会生效,它必须在那里设置。您可以使用按钮保存自己的变量,告诉用户重新启动应用程序,并在 main 中读取您的变量并将其设置为 AppleLanguages。
  • "您可以在不让用户使用 exit(0) 强制退出应用程序的情况下终止应用程序,但请确保用户有机会使用 UIAlertView 或类似方法中止操作,否则 Apple 可能会拒绝您的应用程序。 "我怎么能这样?
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    编辑: 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 做了一个演示项目。

    【讨论】:

    • 嗨,如何本地化来自服务器的动态文本,在我的应用程序中,我必须以简体中文显示每个文本,但是如何以中文显示英文文本。帮帮我。
    • 无法在本地更改服务器文本。您需要在服务器中指定两种语言,并在每个请求的标头中指定您想要的请求语言。服务器应处理标头并在请求时返回语言
    • 演示项目非常有用@LC웃
    猜你喜欢
    • 1970-01-01
    • 2019-05-09
    • 2012-03-01
    • 2020-09-25
    • 2012-09-16
    • 2023-03-24
    • 1970-01-01
    • 2018-08-09
    相关资源
    最近更新 更多