强制本地化图像或图像资产
正如在这个问题中, 如何强制NSLocalizedString使用特定的语言
我可以通过这种方法强制本地化。
头文件
@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"];
只有我的string被改变。 我该怎么办? 我已经尝试了正常的图像和资产像这样的图像。 但它不工作,除非我真的改变我的手机语言设置。 但我需要改变/强制本地化编程和图像需要改变(不仅文本)。 我可以知道该怎么办?
我知道这是一个老问题,但仍然为未来的参考答案。
确保你在main.m中设置你的应用程序语言,它就像一个魅力的图像。
OBS:不使用xcassets。
喜欢这个:
int main(int argc, char * argv[]) { @autoreleasepool { NSString *language = <Get Your Language from somewhere> // I user NSUserDefaults for that if (language == nil) { // Gets the device current language language = [[[[NSBundle mainBundle] preferredLocalizations] objectAtIndex:0] substringToIndex:2]; } [NSBundle setLanguage:language]; return UIApplicationMain(argc, argv, nil, NSStringFromClass([YourAppDelegate class])); } }
另外我在BundleEx实现上有这个方法。 这是本地化的图像不需要,但我需要.html模板,我有,例如。
- (NSString *)pathForResource:(NSString *)name ofType:(NSString *)ext { NSBundle *bundle = objc_getAssociatedObject(self, &_bundle); NSString *pathName = [bundle pathForResource:name ofType:ext]; return pathName ?: [super pathForResource:name ofType:ext]; }