8

我正在尝试为用户添加一个选项,以便从应用程序内部在阿拉伯语和英语之间切换(无需重新设置整个 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、字符串等......在新加载的(本地化)故事板中以正确选择的语言出现,但有一个例外:新加载的故事板不获取(加载)其本地化图像,它获取旧故事板(旧包)的图像,即如果应用程序当前在英文包上运行并且用户点击将语言切换为阿拉伯语的按钮,则应用程序将出现正确的阿拉伯语控件和字符串,但带有英文图像,切换回英文一切都会好的(英文字符串,标签和图像......)

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

在此处输入图像描述

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

在此处输入图像描述

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

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

PS不要添加评论为什么我使用这种场景来切换语言,因为这是客户要求。

4

3 回答 3

2

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

你有2种可能..

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

2)你只能有一个故事板......并且只更改标签,图像等......(根据Localizable.strings),链接这个...... https://stackoverflow.com/a/12149553/1702413,您必须为图像使用不同的文件名(用于“热换”)

不知道是不是bug……或者是什么……

UPD

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

如果您正在更改情节提要(像您一样),您将拥有相同的 languageBundle 路径,直到您重新启动应用程序。所以..你必须在你的故事板中做改变..

对于第二个..您可以从特定语言包(lproj文件夹)更改/召回网点..

对于 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]];
}
于 2013-02-07T01:46:32.747 回答
1

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

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

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

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

于 2013-02-14T19:41:30.947 回答
-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];
于 2013-04-03T20:33:26.807 回答