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

Posted

技术标签:

【中文标题】强制本地化图像或图像资产【英文标题】:Force localize image or image assets 【发布时间】:2014-08-19 08:40:48 【问题描述】:

在这个问题中,How to force NSLocalizedString to use a specific language

我可以通过这种方法强制本地化。

头文件

@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

之后,我需要对图像进行本地化,因此我很喜欢这样。 Localize Asset Catalogs

问题是当我以编程方式更改本地化时,它永远不会更改图像。

 [NSBundle setLanguage:@"en"];

只有我的字符串被改变了。我该怎么办?我已经尝试过像这样的资产中的普通图像和图像。但除非我真的在设置中更改我的手机语言,否则它不起作用。但我需要以编程方式更改/强制本地化,并且需要更改图像(不仅仅是文本)。我可以知道该怎么做吗?

【问题讨论】:

【参考方案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];

【讨论】:

我可以从服务中获取语言吗?如果是的话怎么做 @Mourice 没有收到您的问题。你想解决什么问题? 我的语言代码是在服务器端定义的。所以我想点击服务获取语言代码并设置它。我正在 main 内部进行 Web 服务调用,但设置语言代码不反映。仅在第二次运行后更改 @Mourice 我假设你的调用是在异步中完成的,所以在你对 web 服务的调用完成之前,主要点击 return。我建议重新考虑您的方法,如果您仍然遇到问题,请创建一个新问题并将其链接到此处,因为您的问题与原始问题无关。

以上是关于强制本地化图像或图像资产的主要内容,如果未能解决你的问题,请参考以下文章

UIWebView 中的本地 html,带有来自资产目录的图像

我正在尝试从本地标识符中获取资产并在 collectionview 中显示图像,但它会导致滚动抖动

如何强制“git pull”覆盖本地文件?

在不加载 PHAsset us 照片库的情况下获取所有图像本地标识符/文件路径

如何让 Flutter 的 webview 处理从本地 html 加载的本地资产?

如何在 IOS 项目中本地化图像文件