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

6

就像这个问题中所提到的,如何强制使用特定语言的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"];

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

1

我知道这是一个老问题,但仍然回答以供将来参考。


请确保在main.m中设置应用程序语言,这对于图像效果非常好。

注意:不要使用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
@Mourice没有理解你的问题。你想要解决什么问题? - Otávio
我的语言代码是在服务器端定义的。所以我想调用服务来获取语言代码并设置它。我正在主方法中进行Web服务调用,但是设置语言代码没有反映出来。只有在第二次运行后才会发生更改。 - Mourice
@Mourice 我假设你的调用是异步的,所以在你调用 Web 服务完成之前,主函数就已经执行了 return。我建议重新考虑你的方法,如果你仍然遇到问题,请创建一个新的问题并将其链接到这里,因为你的问题与原始问题无关。 - Otávio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接