如何在iPhone SDK中使用两个button来改变运行时的应用程序语言?

我正在build立一个项目在ios平台,并希望在这个应用程序中使用两种语言,也希望。 用户可以在运行时更改语言,假设我们可以使用两个语言button1作为英语,button2作为德语,用户可以随时使用这些button更改应用程序语言。 任何帮助或教程

提前致谢

假设您已经创build了英文和德文的本地化,您的应用程序将使用在“设置”中select的语言(这是首选选项)。

如果您想直接从您的应用程序中设置语言:

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

会将您的应用程序的语言设置为英语(对于德语,我假定键是“德”)。 你还应该:

 [[NSUserDefaults standardUserDefaults] synchronize]; 

这将不会生效,直到您的应用程序重新启动。

用这种方法有一个“LanguageUtils”类:

 - (NSString *) localizedString:(NSString *)key { if (self.currentLanguage == nil) { self.currentLanguage = @"en"; } NSString* path = [[NSBundle mainBundle] pathForResource:[self.currentLanguage lowercaseString] ofType:@"lproj"]; NSBundle* languageBundle = [NSBundle bundleWithPath:path]; return [languageBundle localizedStringForKey:key value:@"" table:nil]; } 

和属性NSString currentLanguage。

然后在你的.pch中做:

 #undef NSLocalizedString #define NSLocalizedString(key, _comment) [[Language sharedInstance] localizedString:key] 

像魅力一样工作,你可以在运行时重新定义当前的语言。

请记住,你的观点应该由自己刷新。 它不会自动为你做。

我想出了一个解决scheme,允许您使用NSLocalizedString 。 我创build了一个类NSBundle调用NSBundle+RunTimeLanguage 。 界面是这样的。

 // NSBundle+RunTimeLanguage.h #import <Foundation/Foundation.h> @interface NSBundle (RunTimeLanguage) #define NSLocalizedString(key, comment) [[NSBundle mainBundle] runTimeLocalizedStringForKey:(key) value:@"" table:nil] - (NSString *)runTimeLocalizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName; @end 

实现是这样的。

 // NSBundle+RunTimeLanguage.m #import "NSBundle+RunTimeLanguage.h" #import "AppDelegate.h" @implementation NSBundle (RunTimeLanguage) - (NSString *)runTimeLocalizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName { AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate; NSString *path= [[NSBundle mainBundle] pathForResource:[appDelegate languageCode] ofType:@"lproj"]; NSBundle *languageBundle = [NSBundle bundleWithPath:path]; NSString *localizedString=[languageBundle localizedStringForKey:key value:key table:nil]; return localizedString; } @end 

只要将导入NSBundle+RunTimeLanguage.h添加到使用NSLocalizedString的文件。

正如你所看到的,我将我的languageCode存储在AppDelegate的属性中。 这可以存储在任何你想要的地方。

我唯一不喜欢的是一个警告, NSLocalizedString marco重新定义。 也许有人可以帮我解决这个问题。

这是非常好的,语言在应用程序中更改,也可以在设备语言更改时更改。 我在很多应用程序中使用这个。

我们通常使用本地化

  NSLocalizedString(@"hello",@"Hello World"); 

在自定义实现中,它们有类似的东西

  AMLocalizedString(@"hello",@"Hello World"); 

这里是演示教程

https://github.com/object2dot0/Advance-Localization-in-ios-apps

只要删除

  [self dealloc]; 

  -(IBAction) languageSelection:(id)sender 

所以它不会崩溃! 请享用!

你必须为此使用本地化。 只需将key和value存储在localizable.string中,并根据需要加载相应的.string文件即可。 你可以参考下面的教程: http : //www.raywenderlich.com/2876/how-to-localize-an-iphone-app-tutorial

SWIFT 2.0版本我们可以在运行时做到这一点,而无需在Swift 2.0中重新启动应用程序,如下所示

在一个类中做一个函数,可以说LanguageManager是类的名字

 class LanguageManager { static let sharedInstance = LanguageManager() //Make a function for Localization. Language Code is the one which we will be deciding on button click. func LocalizedLanguage(key:String,languageCode:String)->String{ //Make sure you have Localizable bundles for specific languages. var path = NSBundle.mainBundle().pathForResource(languageCode, ofType: "lproj") //Check if the path is nil, make it as "" (empty path) path = (path != nil ? path:"") let languageBundle:NSBundle! if(NSFileManager.defaultManager().fileExistsAtPath(path!)){ languageBundle = NSBundle(path: path!) return languageBundle!.localizedStringForKey(key, value: "", table: nil) }else{ // If path not found, make English as default path = NSBundle.mainBundle().pathForResource("en", ofType: "lproj") languageBundle = NSBundle(path: path!) return languageBundle!.localizedStringForKey(key, value: "", table: nil) } } } 

如何使用这个。
现在假设你有两种语言的应用程序(英文和西class牙文)
英文 – en
西class牙文 – es
在这里输入图像说明

假设你必须为某个标签放置一些东西

 //LOGIN_LABEL_KEY is the one that you will define in Localizable.strings for Login label text logInLabel.text = LanguageManager.sharedInstance.LocalizedLanguage("LOGIN_LABEL_KEY", languageCode: "es") //This will use the Spanish version of the text. //"es" is the language code which I have hardcoded here. We can use a variable or some stored value in UserDefaults which will change on Button Click and will be passed in loginLabel 

有关语言代码的更多信息,请参阅下面的链接
https://developer.apple.com/library/ios/documentation/MacOSX/Conceptual/BPInternational/LanguageandLocaleIDs/LanguageandLocaleIDs.html

要么

http://www.ibabbleon.com/iOS-Language-Codes-ISO-639.html