如何在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
要么