本地化故事板时,从正确的包中加载图像

我试图添加一个选项,让用户在应用程序内部切换阿拉伯语和英语语言(不必重新设置整个iPhone的语言),我设法通过在AppDelegate中使用此方法正确地做到这一点.m文件:

-(void)switchTolanguage:(NSString *)lang{ [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObject:lang] forKey:@"AppleLanguages"]; NSBundle *bnd = [NSBundle bundleWithPath:[[NSBundle mainBundle]pathForResource:lang ofType:@"lproj" ]]; UIStoryboard *storyBoard; storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:bnd]; UIViewController *initViewController = [storyBoard instantiateInitialViewController]; self.window.rootViewController = initViewController; } 

我在应用程序的一个视图控制器上放置了两个UIButtons来testing这个方法,它运行得很好:新加载(本地化)的故事板中的所有UILabels ,string等都以正确的语言显示,但有一个例外 :新加载的故事板不会取(加载)它的本地化图像,它将旧故事板(旧包)的图像,即如果应用程序当前运行在英文包上,并且用户点击将语言切换到阿拉伯语的button,该应用程序将出现与正确的阿拉伯语控制和string,但与英文图像,切换回英文一切都会好(英文string,标签和图像…)

这里是我的故事板是如何本地化的:

在这里输入图像说明

这里是每个图像如何本地化:

在这里输入图像说明

如何在用户切换应用程序语言时加载正确的包图像?

更新:
这里是一个示例项目的链接 ,我的意思是,运行示例,你会注意到当你从应用程序内部改变语言,你会注意到图像是不可更改的…你也会注意到,本地化的故事板不会在其devise编辑器中加载正确的图像…

PS不会添加评论为什么我使用这种情况来切换语言,因为这是一个客户的要求。

我有同样的问题:( ..和什么对我来说(这种情况下切换语言)..

你有两种可能

1)如果您想更改故事板(热更改),则必须修改每个故事板中的所有Outlet。 在你的故事板中select所需的图像( 具有不同的名称 ),标签等。对于我来说,与本地化的图像(同名) – 只有在重新启动应用程序后才起作用。对于相同的img_name,我试着… “调用”特定的图像..从特定的lproj文件夹(languageBundle)..但它没有工作从AppDelegate更改故事板..

2)你可以只有一个故事板…只改变标签,图像等…(根据Localizable.strings),东西linke这个… https://stackoverflow.com/a/12149553/1702413也,您必须具有不同的图像文件名称(“热更改”)

我不知道是否一个错误…或者是什么…

UPD

你有一个小项目https://dl.dropbox.com/u/19438780/test5%20copy2.zip与两个..

如果你正在改变故事板(就像你),你将有相同的语言path,直到你重新启动应用程序。 所以..你必须改变你的故事板的权利..

对于第二..你可以更改/召回outlet ..从特定的语言包(lproj文件夹)..

对于1)..我发现了一个“诀窍”覆盖语言包,直到重新启动:

 -(id) initWithCoder:(NSCoder *)aDecoder{ self = [super initWithCoder:aDecoder]; if (self) { NSArray* languages = [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"]; Lang2 = [languages objectAtIndex:0]; //NSString } return self; } 

并初始化出口:

 - (void) viewWillAppear:(BOOL)animated { [super viewWillAppear:YES]; NSString *path; if([Lang2 isEqualToString: @"ro"]) { path = [[NSBundle mainBundle] pathForResource:@"ro" ofType:@"lproj"]; NSLog(@"enc ro"); } else{ path = [[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"]; NSLog(@"enc en"); } NSBundle* languageBundle = [NSBundle bundleWithPath:path]; //find and return the desired string self.label.text=[languageBundle localizedStringForKey:@"kLabelText" value:@"" table:nil]; self.img.image = [UIImage imageNamed:[languageBundle localizedStringForKey:@"myImage" value:@"" table:nil]]; } 

您必须重新加载包含多语言文本的所有视图,这些视图不能像视图在控制器中引用对象一样完成,那么结果是未知的,很可能会崩溃。

一个正确和有效的方法将是为每种语言提供一个字典,您可以根据所选语言进行切换。 以这种方式绘制所有的静态文本,当语言改变时,可以很容易地绘制出来。 在语言改变时,通知控制器重画视图。 对于图像,你可以做类似的绘制或参考他们,你可以改变。

你可以为图像做的事情之一是有一个自定义图像视图类,也观察语言变化的通知,并自动加载适当的图像。 你可以做标签。

如果您需要示例,我可以为您编写代码。

 NSBundle *bundle = [LocalizationSystem sharedBundle]; //this get your current bundle NSString *imgPath = [bundle pathForResource:@"btn-Image" ofType:@"png" inDirectory:nil]; [self.btnTest setImage:[UIImage imageWithContentsOfFile:imgPath] forState:UIControlStateNormal];