Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Blazor-在运行时更改UI CultureInfo_C#_Localization_Blazor_Blazor Server Side - Fatal编程技术网

C# Blazor-在运行时更改UI CultureInfo

C# Blazor-在运行时更改UI CultureInfo,c#,localization,blazor,blazor-server-side,C#,Localization,Blazor,Blazor Server Side,我需要根据每个区域性的资源文件在运行时更改区域性 期望 用户单击从当前语言切换到其他语言的按钮。页面中的文本将根据每个区域性的资源文件进行刷新 实际的 用户单击从当前语言切换到其他语言的按钮。页面中的文本将根据每个区域性的资源文件进行刷新。只要用户对任何组件执行任何操作(我有几个单选按钮、按钮和复选框),文本就会返回到第一次编写的内容。好像文化信息一点都没有改变 尝试 创建了注入组件的AppState类 public class AppState { public Culture

我需要根据每个区域性的资源文件在运行时更改区域性

期望

用户单击从当前语言切换到其他语言的按钮。页面中的文本将根据每个区域性的资源文件进行刷新

实际的

用户单击从当前语言切换到其他语言的按钮。页面中的文本将根据每个区域性的资源文件进行刷新。只要用户对任何组件执行任何操作(我有几个单选按钮、按钮和复选框),文本就会返回到第一次编写的内容。好像文化信息一点都没有改变

尝试

创建了注入组件的AppState类

    public class AppState
{
    public CultureInfo currentCulture { get; private set; } = CultureInfo.CurrentCulture;
    public event Action OnChange;
    public void ChangeCulture(CultureInfo newCulture)
    {
        currentCulture = newCulture;
        System.Threading.Thread.CurrentThread.CurrentCulture.ClearCachedData();
        System.Threading.Thread.CurrentThread.CurrentUICulture.ClearCachedData();
        System.Threading.Thread.CurrentThread.CurrentCulture = newCulture;
        System.Threading.Thread.CurrentThread.CurrentUICulture = newCulture;
        NotifyStateChanged();
    }

    public CultureInfo getCurrentCulture()
    {
        if (currentCulture == null)
        {
            ChangeCulture(CultureInfo.CurrentCulture);
        }
        return currentCulture;

    }

    private void NotifyStateChanged() => OnChange?.Invoke();
}
在startup.cs和AppState instante中为项目添加了本地化

        services.AddScoped<AppState>();
        services.AddMvc().AddMvcLocalization();
        services.AddLocalization();
        var supportedCultures = new List<CultureInfo> { new CultureInfo("en-US"), new CultureInfo("es-ES") };
        services.Configure<RequestLocalizationOptions>(options =>
        {
            options.DefaultRequestCulture = new RequestCulture("es-ES");
            options.SupportedUICultures = supportedCultures;
            options.SupportedCultures = supportedCultures;
        });
因此,现在当单击触发cambiarialigora()的按钮时,项目运行良好。但是一旦在组件内部完成任何操作(比如我检查了tablareconcimientos组件内部的某些内容,或者我单击了一个单选按钮),文本就会恢复为原始字符串

每个需要本地化文本的组件都注入了AppState并实现了以下功能:

@inject AppState state
@inject IStringLocalizer<TablaModos> _localizer

@implements IDisposable


@*Component stuff*@

@functions{
    protected override void OnInitialized()
    {
        state.OnChange += OnCultureChange;
    }

    public void Dispose()
    {
        state.OnChange -= OnCultureChange;
    }

    private void OnCultureChange()
    {
        CultureInfo.CurrentCulture = state.currentCulture;
        CultureInfo.CurrentUICulture = state.currentCulture;

        StateHasChanged();
    }

}
@injectappstate状态
@注入IStringLocalizer\u localizer
@实现IDisposable
@*组件材料*@
@功能{
受保护的覆盖无效OnInitialized()
{
state.OnChange+=OnCultureChange;
}
公共空间处置()
{
state.OnChange-=OnCultureChange;
}
私有void OnCultureChange()
{
CultureInfo.CurrentCulture=state.CurrentCulture;
CultureInfo.CurrentUICulture=state.currentCulture;
StateHasChanged();
}
}
将当前发生的事情想象成exmaple:

您需要使用Cookies来存储选定的区域性。请参阅Microsoft文档。

从文件中:

Blazor服务器 Blazor服务器应用程序使用本地化中间件进行本地化。中间件为从应用程序请求资源的用户选择适当的区域性

可以使用以下方法之一设置区域性:

饼干 提供UI以选择区域性 有关更多信息和示例,请参阅ASP.NET Core中的全球化和本地化

饼干 本地化区域性cookie可以持久化用户的区域性。本地化中间件在后续请求中读取cookie以设置用户的区域性

使用cookie可确保WebSocket连接能够正确传播区域性。如果本地化方案基于URL路径或查询字符串,则该方案可能无法使用WebSocket,因此无法保持区域性。因此,建议使用本地化区域性cookie

如果区域性持久化在本地化cookie中,则可以使用任何技术来分配该区域性。如果应用程序已经为服务器端ASP.NET Core建立了本地化方案,请继续使用应用程序的现有本地化基础结构,并在应用程序方案中设置本地化区域性cookie

以下示例显示如何在本地化中间件可以读取的cookie中设置当前区域性。在Pages/_Host.cshtml文件中的打开标记内创建Razor表达式:

CSHTML

抄袭

提供UI以选择区域性 为了提供允许用户选择区域性的UI,建议使用基于重定向的方法。这个过程类似于用户试图访问安全资源时在web应用程序中发生的情况。用户被重定向到登录页面,然后重定向回原始资源

应用程序通过重定向到控制器来保持用户选择的区域性。控制器将用户选择的区域性设置为cookie,并将用户重定向回原始URI

在服务器上建立HTTP端点,以在cookie中设置用户选定的区域性,并执行重定向回原始URI:

C#

抄袭


虽然此链接可能会提供答案,但请尝试在答案中添加一些说明,以使其在将来更具价值。将来可能会断开或删除链接。
    protected override void OnInitialized()
    {
        _lematizador = new LematizadorService();

        state.OnChange += OnCultureChange;
    }

    public void Dispose()
    {
        state.OnChange -= OnCultureChange;
    }
    private void CambiarIdioma()
    {
        if (state.getCurrentCulture().Equals(new CultureInfo("es-ES")))
        {
            state.ChangeCulture(new CultureInfo("en-US"));
        }
        else
        {
            state.ChangeCulture(new CultureInfo("es-ES"));
        }
    }

    private void OnCultureChange()
    {
        CultureInfo.CurrentCulture = state.currentCulture;
        CultureInfo.CurrentUICulture = state.currentCulture;

        StateHasChanged();
    }
@inject AppState state
@inject IStringLocalizer<TablaModos> _localizer

@implements IDisposable


@*Component stuff*@

@functions{
    protected override void OnInitialized()
    {
        state.OnChange += OnCultureChange;
    }

    public void Dispose()
    {
        state.OnChange -= OnCultureChange;
    }

    private void OnCultureChange()
    {
        CultureInfo.CurrentCulture = state.currentCulture;
        CultureInfo.CurrentUICulture = state.currentCulture;

        StateHasChanged();
    }

}
@using System.Globalization
@using Microsoft.AspNetCore.Localization

...

<body>
    @{
        this.HttpContext.Response.Cookies.Append(
            CookieRequestCultureProvider.DefaultCookieName,
            CookieRequestCultureProvider.MakeCookieValue(
                new RequestCulture(
                    CultureInfo.CurrentCulture,
                    CultureInfo.CurrentUICulture)));
    }

    ...
</body>
@{
    this.Context.Response.Cookies.Append(
        CookieRequestCultureProvider.DefaultCookieName,
        CookieRequestCultureProvider.MakeCookieValue(
            new RequestCulture(
                CultureInfo.CurrentCulture,
                CultureInfo.CurrentUICulture)));
}
[Route("[controller]/[action]")]
public class CultureController : Controller
{
    public IActionResult SetCulture(string culture, string redirectUri)
    {
        if (culture != null)
        {
            HttpContext.Response.Cookies.Append(
                CookieRequestCultureProvider.DefaultCookieName,
                CookieRequestCultureProvider.MakeCookieValue(
                    new RequestCulture(culture)));
        }

        return LocalRedirect(redirectUri);
    }
}