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