apportable - изображения ресурсов недоступны, если они были локализованы

При портировании приложения iOS на Android с помощью apportable ресурсы в приложении недоступны (они не загружаются во время выполнения), если они локализованы (разные версии для разных языков):

  1. Добавьте локализованное изображение в ваш проект (разные версии изображения для разных языков) через Xcode - apportable загрузит их в пакет.apk в качестве ресурсов в папках, зависящих от языка. Например:

    assets/en.lproj/image.png        (generic english version)
    assets/zh-Hans.lproj/image.png   (simplified chinese version)
    assets/zh-Hant.lproj/image.png   (traditional chinese version)
    
  2. Попытка загрузить изображение:

 UIImage *image = [UIImage imageNamed:imageName];   // This works under iOS but not under apportable

это возвращает ноль, если изображение было локализовано, как описано выше.

1 ответ

Решение

Ниже приведен временный обходной путь, который работает:

Utils.h:

#if defined(ANDROID) && defined(WORKAROUND_APPORTABLE_LOCALIZED_IMAGES)
#define LOCALIZEDIMAGE LocalizedUIImage
@interface LocalizedUIImage : UIImage
+(UIImage *)imageNamed:(NSString *)imageName;
@end
#else
#define LOCALIZEDIMAGE UIImage
#endif

Utils.m:

#if defined(ANDROID) && defined(WORKAROUND_APPORTABLE_LOCALIZED_IMAGES)
#import <Foundation/Foundation.h>
@implementation LocalizedUIImage
+(UIImage *)imageNamed:(NSString *)imageName {
    UIImage *image = nil;
    if ([imageName rangeOfString:@"/"].location == NSNotFound) {
        NSLocale *locale = [NSLocale currentLocale];
        NSString *localeId = [locale localeIdentifier];
        NSString *localizedImageName = [[localeId stringByAppendingString:@".lproj/"] stringByAppendingString:imageName];
        image = [UIImage imageNamed:localizedImageName];
        if (image == nil) { // Retry for a generic language version (ie:   en  rather than   en_US  )
            NSUInteger hyphenatedLocale = [localeId rangeOfString:@"_"].location;
            if (hyphenatedLocale != NSNotFound) {
                NSString *localizedImageName = [[[localeId substringToIndex:hyphenatedLocale] stringByAppendingString:@".lproj/"] stringByAppendingString:imageName];
                image = [UIImage imageNamed:localizedImageName];
            }
        }
    }
    if (image == nil)
        image = [UIImage imageNamed:imageName];
    return image;
}
@end
#endif

Использовать по:

UIImage *image = [LOCALIZEDIMAGE imageNamed:imageName];
Другие вопросы по тегам