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

Posted

技术标签:

【中文标题】在 iOS 中以编程方式更改应用程序中的语言【英文标题】:Change Language in the app programmatically in 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"];

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

【问题讨论】:

***.com/questions/34130853/… 不要直接改,请看***.com/a/61462264/1153503 【参考方案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웃

以上是关于在 iOS 中以编程方式更改应用程序中的语言的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 中以编程方式将 sqlite 文件保存在本地文件夹或 nsbundle 中?

如何在 iOS 应用程序中以编程方式检测 SwiftUI 的使用情况

在运行中以编程方式更改 iOS7 状态栏颜色?

如何在iOS中以编程方式重新启动iPhone应用程序

如何在应用内购买功能中以编程方式更改产品价格?

如何在 Android 2016 中以编程方式更改应用程序图标