更改片段内整个应用程序的语言?

时间:2017-11-18 05:14:07

标签: c# localization xamarin.android

假设这是调用堆栈:

  

Fragment2(当前位置)

     

片段1

     

HostingActivity

用户刚刚导航到fragment2(这是设置屏幕)。他选择了第二种语言,然后导航回Fragment1。我希望应用程序在进入fragment1后立即显示第二语言的内容。

我已经读过,最好的方法是让所有片段都来自一个基本片段,它在OnResume()方法中配置语言环境。

public class BaseFragment : Fragment
{
    public override void OnResume()
    {
        string langCode = prefs.GetString("settings_language", "en_US");

        Resources res = Application.Context.Resources;
        // Change locale settings in the app.
        DisplayMetrics dm = res.DisplayMetrics;
        Configuration conf = res.Configuration;
        conf.SetLocale(new Locale(langCode.ToLower()));

        res.UpdateConfiguration(conf, dm);
        OnConfigurationChanged(conf);

        base.OnResume();
    }
}

我试过这个,但没有运气。我没有看到任何改变。 我愿意听取任何建议。

PS。为了确保我没有搞砸Android在values文件夹中所需的任何命名约定,我尝试使用我想要的语言重新启动模拟器(使用adb shell)并且它按预期工作。

1 个答案:

答案 0 :(得分:0)

您可以创建一个基类,像这样设置CurrentCulture并继承它:

internal class MyBaseActivity : Activity
{
    protected override void OnResume ()
    {
        base.OnResume ();

        // Get the language from wherever.
        var userSelectedCulture = new CultureInfo ("fr-FR");

        Thread.CurrentThread.CurrentCulture = userSelectedCulture;
    }
}

以下是如何继承和使用它:

public class MainActivity : MyBaseActivity
{
    protected override void OnResume()
    {
        base.OnResume();  // Do not forget to call base.OnResume()
        // Rest of Your Code...
    }
}