在应用程序中更改语言 - 如何重新启动?

Mar*_*l W 0 iphone xamarin.ios

我想让用户可以更改我的应用程序中的语言.

这里描述了执行此操作的方法,在单触引代码中将首选语言设置为荷兰语,将备用语言设置为英语:

  NSUserDefaults.StandardUserDefaults.SetValueForKey
                (NSArray.FromStrings("nl", "en"), new NSString("AppleLanguages"));
Run Code Online (Sandbox Code Playgroud)

您必须重新启动应用程序才能生效.但是在iPhone 4上,关闭它时应用程序不会重新启动,它只是隐藏了.是否有办法强制应用程序在关闭后重新启动?

Mar*_*l W 6

谢谢迪米特里斯.因此,在运行时更改语言并不那么简单.

我发现了一个适用于我的解决方案:

当用户更改语言时,我使用Mauro Delrio在"如何强制NSLocalizedString使用特定语言"中描述的解决方案.在monotouch:

    string newLanguage = "nl";
    myBundle = NSBundle.FromPath(NSBundle.MainBundle.PathForResource(newLanguage, "lproj"));
Run Code Online (Sandbox Code Playgroud)

现在,所有字符串都将使用myBundle.LocalizedString(...)以所选语言加载.当然,已经打印在视图上的所有内容尚未翻译.但我找到了一种简单的方法来重置所有视图.在我的应用程序中,我使用MainTabController,如下所示:

public class MainTabBarController : UITabBarController
{
    public override void ViewDidLoad()
    {
        Reset();
        SelectedIndex = 2;
    }

    public void Reset()
    {
        ViewControllers = new UIViewController[]
        {
            new ViewControllerTab1(),
            new ViewControllerTab2(),
            new ViewControllerTab3(),
            new ViewControllerTab4(),
            new ViewControllerTab5()
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我要做的就是调用Reset,如:

((AppDelegate)UIApplication.SharedApplication.Delegate).MainTabBarController.Reset();
Run Code Online (Sandbox Code Playgroud)

所有当前视图都以正确的语言进行处理和重新创建.看起来像一个技巧,但它是完全合法和文档,请参阅MainTabBarController viewControllers属性的Apple文档.它甚至激活与活动的选项卡索引相同的选项卡索引,因此对于用户而言,似乎只有语言被更改.

当然,所有视图中的任何未保存数据都会丢失,因此如果这是一个问题,您必须找到一种方法来在重置之前保存它.