4 回答

TA貢獻1804條經驗 獲得超2個贊
請勿在iOS 9上使用。這將對通過它傳遞的所有字符串返回零。
我找到了另一個解決方案,允許您更新語言字符串,w/o重新啟動應用程序,并與genstring兼容:
將這個宏放在前綴中.pch:
#define currentLanguageBundle [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:[[NSLocale preferredLanguages] objectAtIndex:0] ofType:@"lproj"]]
在任何需要本地化字符串的地方:
NSLocalizedStringFromTableInBundle(@"GalleryTitleKey", nil, currentLanguageBundle, @"")
設置語言使用:
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObject:@"de"] forKey:@"AppleLanguages"];
即使在連續(xù)的語言跳躍中也能工作,例如:
NSLog(@"test %@", NSLocalizedStringFromTableInBundle(@"NewKey", nil, currentLanguageBundle, @""));
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObject:@"fr"] forKey:@"AppleLanguages"];
NSLog(@"test %@", NSLocalizedStringFromTableInBundle(@"NewKey", nil, currentLanguageBundle, @""));
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObject:@"it"] forKey:@"AppleLanguages"];
NSLog(@"test %@", NSLocalizedStringFromTableInBundle(@"NewKey", nil, currentLanguageBundle, @""));
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObject:@"de"] forKey:@"AppleLanguages"];
NSLog(@"test %@", NSLocalizedStringFromTableInBundle(@"NewKey", nil, currentLanguageBundle, @""));

TA貢獻1790條經驗 獲得超9個贊
NSLocalizedString()
NSUserDefaults
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"de", @"en", @"fr", nil] forKey:@"AppleLanguages"]; [[NSUserDefaults standardUserDefaults] synchronize]; //to make the change immediate

TA貢獻1811條經驗 獲得超4個贊
頭文件
@interface NSBundle (Language)+(void)setLanguage:(NSString*)language;@end
實施
#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);}@end
[NSBundle setLanguage:@"en"];
[NSBundle setLanguage:@"fr"];
[NSBundle setLanguage:nil];
var bundleKey: UInt8 = 0class AnyLanguageBundle: Bundle { override func localizedString(forKey key: String, value: String?, table tableName: String?) -> String { guard let path = objc_getAssociatedObject(self, &bundleKey) as? String, let bundle = Bundle(path: path) else { return super.localizedString(forKey: key, value: value, table: tableName) } return bundle.localizedString(forKey: key, value: value, table: tableName) }}extension Bundle { class func setLanguage(_ language: String) { defer { object_setClass(Bundle.main, AnyLanguageBundle.self) } objc_setAssociatedObject(Bundle.main, &bundleKey, Bundle.main.path(forResource: language, ofType: "lproj"), .OBJC_ASSOCIATION_RETAIN_NONATOMIC) }}

TA貢獻1864條經驗 獲得超6個贊
@implementation Languagestatic NSBundle *bundle = nil;+(void)initialize { NSUserDefaults* defs = [NSUserDefaults standardUserDefaults]; NSArray* languages = [defs objectForKey:@"AppleLanguages"]; NSString *current = [[languages objectAtIndex:0] retain]; [self setLanguage:current];}/* example calls: [Language setLanguage:@"it"]; [Language setLanguage:@"de"]; */+(void)setLanguage:(NSString *)l{ NSLog(@"preferredLang: %@", l); NSString *path = [[ NSBundle mainBundle ] pathForResource:l ofType:@"lproj" ]; bundle = [[NSBundle bundleWithPath:path] retain];}+(NSString *)get:(NSString *)key alter:(NSString *)alternate { return [bundle localizedStringForKey:key value:alternate table:nil];}@end
- 4 回答
- 0 關注
- 1201 瀏覽
添加回答
舉報