在 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 中?