强制本地化图像或图像资产

正如在这个问题中, 如何强制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]; }