Заставить локализовать изображения или изображения

Как и в этом вопросе, Как заставить 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"];

Изменена только моя строка. Как мне это сделать? Я пробовал как с обычным образом, так и с изображением в таких активах. Но это не сработает, если я не изменил свой язык телефона в настройке. Но мне нужно изменить/заставить локализацию программно, а изображение нужно изменить (а не только текст). Могу я знать, как это сделать?

enter image description here

Ответ 1

Я знаю, что это старый вопрос, но все еще отвечающий за будущие ссылки.


Убедитесь, что вы установили язык приложения в 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];
}