我使用下面的代码。
此代码保存了Locale名称,但是如何使用新语言刷新整个应用程序
这里langcode变量是动态的,根据用户选择。
NSString *langCode = @"fr";
NSArray *languages = nil;
languages = [NSArray arrayWithObject:langCode];
[[NSUserDefaults standardUserDefaults] setObject:languages forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize];
在运行时更改语言还有哪些? (从我的应用设置屏幕)
答案 0 :(得分:1)
在语言上进行分类后,它将解决问题。
.h文件
@interface NSBundle (Language)
+ (void)setLanguage:(NSString *)language;
@end
.m文件
#import <objc/runtime.h>
static const char _bundle=0;
@interface BundleEx : NSBundle
@end
@implementation BundleEx
- (NSString *)localizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName
{
NSBundle *bundle = objc_getAssociatedObject(self, &_bundle);
return bundle ? [bundle localizedStringForKey:key value:value table:tableName] : [super localizedStringForKey:key value:value table:tableName];
}
@end
@implementation NSBundle (Language)
+ (void)setLanguage:(NSString *)language
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^
{
object_setClass([NSBundle mainBundle],[BundleEx class]);
});
objc_setAssociatedObject([NSBundle mainBundle], &_bundle, language ? [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:language ofType:@"lproj"]] : nil, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
[[NSNotificationCenter defaultCenter] postNotificationName:@"changeLanguage" object:self];
}
从我的设置视图控制器上面调用类别类的方法,也为整个应用程序发布消息通知。
[NSBundle setLanguage:langCode];
答案 1 :(得分:0)
在代码中添加LocalizationSystem
文件后,您就可以在运行时更改语言。
下载链接 http://dl.dropbox.com/u/2917666/LocalizationSystem/LocalizationSystem.h http://dl.dropbox.com/u/2917666/LocalizationSystem/LocalizationSystem.m
了解更多信息http://aggressive-mediocrity.blogspot.com/2010/03/custom-localization-system-for-your.html
答案 2 :(得分:0)
将此变量存储在ApplicationDelegate文件中。定义其属性并在登录时随时通过appDelegate实例使用。选择更改后,根据需要更改应用程序包,同时修改文本和所有内容。 根据您的要求,将语言选择代码设置为循环或按钮选择。
NSPath* path = [[NSBundle mainBundle] pathForResource:@"es" ofType:@"lproj"];
APP_DELEGATE.strLanguageSelectedFromLoginView = @"SPANISH";
或
NSPath* path = [[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"];
APP_DELEGATE.strLanguageSelectedFromLoginView = @"ENGLISH";
和
languageBundle = [NSBundle bundleWithPath:path];
最后加载laguageBundle。 NSBundle * languageBundle将在app delegate中定义。