与此问题一样,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"];
只更改了我的字符串。我该怎么办?我已尝试过像这样的资产中的普通图像和图像。但除非我真的在设置中更改手机语言,否则它无法正常工作。但我需要以编程方式更改/强制本地化,并且需要更改图像(不仅仅是文本)。我可以知道该怎么办吗?
答案 0 :(得分: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];
}