在本地化故事板时从正确的捆绑中加载图像

时间:2013-02-06 13:44:29

标签: iphone ios objective-c xcode storyboard

我正在尝试为用户添加一个选项,以便在阿拉伯语和阿拉伯语之间切换应用程序内部的英语语言(无需重新设置整个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来测试方法,并且它运行良好:所有UILabels,字符串等...在新加载的(本地化)故事板中使用正确的选定语言显示,但一个例外:新加载的故事板不会(加载)其本地化图像,它会拍摄旧故事板(旧包)的图像,即当前的应用程序在英语包上运行,用户点击将语言切换为阿拉伯语的按钮,应用程序将显示正确的阿拉伯语控件和字符串,但有英文图像,切换回英语一切都会好(英文字符串,标签和图像。 ..)

这是我的故事板本地化的方式:

enter image description here

以及每个图像的本地化方式:

enter image description here

当用户切换应用语言时,如何加载正确的捆绑图像?

更新
Here's a link我的意思是一个示例项目,运行示例,您会注意到当您从应用程序内部更改语言时,您会注意到图像不可更改... 您还会注意到本地化的故事板没有在其设计编辑器中加载正确的图像......

P.S。不会为我使用此类方案切换语言的原因添加注释,因为这是客户要求。

3 个答案:

答案 0 :(得分:2)

我有同样的问题:( ..和什么对我有用(对于这种场景切换语言)..

你有两种可能性..

1)如果要更改故事板(热更改),则必须修改每个故事板中的所有Outlet。在故事板中选择所需的图像(具有不同的名称),标签等。对我来说,使用本地化图像(同名) - 仅在重新启动应用程序后才能工作。 对于相同的img_name,我'尝试...从特定的lproj文件夹(languageBundle)“调用”特定的图像..但它在AppDelegate改变故事板时无法工作..

2)你只能拥有一个故事板......并且只能更改标签,图像等......(根据Localizable.strings),这可以解决这个问题...... https://stackoverflow.com/a/12149553/1702413 此外,您必须具有不同的图像文件名(用于“热更改”)

我不知道是不是......或者是什么......

<强> UPD

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

如果要更改故事板(与您一样),则在重新启动应用程序之前,您将拥有languageBundle的相同路径。所以..你必须在你的故事板中做正确的改变..

对于第二个..你可以从特定的languageBundle(lproj文件夹)更改/召回插座..

For 1)..我发现了一个“技巧”来覆盖languageBundle直到重启:

-(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]];
}

答案 1 :(得分:1)

您必须重新加载包含多语言文本的所有视图,这些视图无法完成,就好像视图在控制器中引用了对象,结果是未知的,并且很可能会崩溃。

正确而有效的方法是为每种语言提供一个字典,您可以根据所选语言进行切换。以这种方式绘制所有静态文本,您可以在语言更改时轻松将其绘制回来。在语言更改后,通知控制器重绘视图。对于你可以做类似的图像绘制它们或参考它们你可以改变。

您可以为图像做的一件事就是拥有一个自定义图像视图类,它还可以观察语言更改通知并自动加载适当的图像。您可以为标签做同样的事情。

如果你需要一个例子,我可以为你编写代码。

答案 2 :(得分:-1)

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];