如何在运行时使用iphone SDK中的两个按钮更改应用程序语言?
我正在ios平台上建立一个项目,希望在此应用程序中使用两种语言 而且还想要。用户可以在运行时更改语言,假设我们可以使用两个语言按钮按钮1(英语)和按钮2(德语),用户可以随时使用这些按钮更改应用程序语言。有什么帮助或教程吗如何在运行时使用iphone SDK中的两个按钮更改应用程序语言?,iphone,ios,objective-c,ios4,Iphone,Ios,Objective C,Ios4,我正在ios平台上建立一个项目,希望在此应用程序中使用两种语言 而且还想要。用户可以在运行时更改语言,假设我们可以使用两个语言按钮按钮1(英语)和按钮2(德语),用户可以随时使用这些按钮更改应用程序语言。有什么帮助或教程吗 提前感谢您必须为此使用本地化。只需将键和值存储在side localizable.string中,并根据需要加载相应的.string文件。 有关此信息,您可以参考以下教程: 假设您已为英语和德语创建本地化,您的应用程序将使用“设置”中选择的语言(这是首选选项) 如果要直接从应
提前感谢您必须为此使用本地化。只需将键和值存储在side localizable.string中,并根据需要加载相应的.string文件。 有关此信息,您可以参考以下教程:
假设您已为英语和德语创建本地化,您的应用程序将使用“设置”中选择的语言(这是首选选项) 如果要直接从应用程序设置语言:
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"en", nil] forKey:@"AppleLanguages"];
将应用程序的语言设置为英语(对于德语,我假设键为“de”)。你亦应:
[[NSUserDefaults standardUserDefaults] synchronize];
这将在应用程序重新启动之前生效。非常好,应用程序内的语言以及设备语言更改时都会更改。我在很多应用程序中都使用了这个
对于本地化,我们通常使用
NSLocalizedString(@"hello",@"Hello World");
在自定义实现中,它们有类似的内容
AMLocalizedString(@"hello",@"Hello World");
这里是演示教程
移除
[self dealloc];
从
所以它不会崩溃!!!享受吧 使用该方法创建一个类“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]
工作起来很有魅力,您可以在运行时重新定义当前语言
请记住,您的视图应该由您自己刷新。它不会自动为您执行此操作。我提出了一个解决方案,允许您使用
NSLocalizedString
。我创建了一个类别NSBundle
callNSBundle+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
而不仅仅是将importNSBundle+RunTimeLanguage.h
添加到使用NSLocalizedString
的文件中
如您所见,我将语言代码存储在AppDelegate
的属性中。这可以存放在你想要的任何地方
我唯一不喜欢的是一个警告,
NSLocalizedString
marco重新定义了它。也许有人能帮我修理这个部件。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)
}
}
}
如何使用它。现在假设应用程序有两种语言(英语和西班牙语)
英语-en
西班牙语-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
有关语言代码的更多信息,请参见下面的链接或
:这是一种有效的方法。但您必须重新启动不友好的应用程序。正确。但苹果不重启应用程序就无法更改语言。我想你可以通过编程自己重新实现本地化,但这不是很吸引人。是的,实际上我也遇到了同样的问题,但要求是在应用程序中,用户应该能够更改语言,当时我没有任何方法,所以我遵循了以下教程。似乎在iOS 7.1模拟器中工作。无需重新启动直到重新启动,操作系统8才工作。但这是为了测试,所以重新启动是可以的,事实上,我添加了一个退出(1)来强制在更改语言后崩溃应用程序,hacky,但是有效。这对storyboard有效吗,意味着如果我们想更改storyboard(或xib)上uielement的文本我们可以将文本更改为新的集合语言吗?您可以在之前添加一个
#undef NSLocalizedString
,以消除重新定义警告此方法的缺点是genstrings
命令不再起作用
//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