如何在 MAUI 应用程序中在运行时切换语言?

问题描述 投票:0回答:1

我有以下“难题” - 我已经花了一整天多的时间来解决它。

在 MauiProgram.cs 中我有这个函数:

public static void SetAppLanguage(string appLanguagesCurrent)
{
    CultureInfo culture = new("en-US");
    if (appLanguagesCurrent == "English")
    {
        Commons.Language = "en";
    }
    else if (appLanguagesCurrent == "Română")
    {
        Commons.Language = "ro";
        culture = new("ro-RO");
    }

    Thread.CurrentThread.CurrentCulture = culture;
    Thread.CurrentThread.CurrentUICulture = culture;
    CultureInfo.CurrentCulture = culture;
    CultureInfo.DefaultThreadCurrentCulture = culture;
    CultureInfo.DefaultThreadCurrentUICulture = culture;
}

呼叫者

public static MauiApp CreateMauiApp()

应用程序默认以英语启动。一切正常。

然后,我们在某些“设置”页面中切换语言,该页面写入一些“settings.json”文件(用户的首选项)。

在该文件中,我们将语言设置为其他语言,例如罗马尼亚语 (ro-RO)。

如果我们重新启动应用程序,代码会从该 json 文件中读取,一切都很好 - 语言设置正确,我们从服务器提取数据等。一切都很好。

然后,我在登录页面上创建了一个“会话的语言切换” - 如果用户不想更改首选项,但希望仅在本次会话中以某种语言使用该应用程序。

我们再说一遍,默认语言是英语。 假设用户单击登录页面上的罗马尼亚国旗。 在该事件中,我执行以下代码:

private async Task SwitchLanguage(string language)
{
    //By default the language is set in the Settings page. However, we can switch it here for this session.
    CultureInfo switchToCulture;
    if (language == "EN")
    {
        Commons.Language = "en";
        Globals.AppSettings.Language = "English";
        switchToCulture = new("en-US");
    }
    else
    {
        Commons.Language = "ro";
        Globals.AppSettings.Language = "Română";
        switchToCulture = new("ro-RO");
    }

    MauiProgram.SetAppLanguage(Globals.AppSettings.Language);
    GlobalLocalizationResourceManager.SetCulture(switchToCulture);
}

不用担心线

GlobalLocalizationResourceManager.SetCulture(switchToCulture)

(它的目的是翻译应用程序中的字符串)。

然而,奇怪的是,虽然在这个函数中,通过调用 MauiProgram.SetAppLanguage("Română"),我们设置了 CultureInfo.DefaultThreadCurrentCulture 和 CultureInfo.DefaultThreadCurrentUICulture 的值,并且它们在 Watches 窗口中显示为更改,当我导航到应用程序的其他页面,这些值(DefaultThreadCurrentCulture 和 DefaultThreadCurrentUICulture,以及 Thread.CurrentThread.CurrentCulture 和 Thread.CurrentThread.CurrentUICulture)在 Watches 窗口中再次显示为英语,即使我们之前已更改它们(在SwitchLanguage()),因此进一步的数据解析失败。

所以,长话短说:

  • 如果我在 EN 中启动应用程序,它就可以工作。
  • 如果我在 RO 中启动它,它就会起作用。
  • 如果我在不重新启动应用程序的情况下切换语言,则会失败
    加工中。

注意:执行该行

(Application.Current as App).MainPage = new AppShell() 

没有帮助!

我认为这与线程有关......但也许我错了。 有谁知道我做错了什么? 非常感谢。

亚历克斯

localization maui
1个回答
0
投票

如何在 MAUI 应用程序运行时切换语言?如果我在不重新启动应用程序的情况下切换语言,则会失败 加工中。

关于本地化,MAUI GitHub 上有一个已知问题。您可以看到这个:.Net MAUI Localization #5595。您还可以报告您的情况并跟踪此问题。

© www.soinside.com 2019 - 2024. All rights reserved.