我尝试在asp.net core中使用razor页面和PageModels(没有控制器)更改语言,但问题是我的本地化仅适用于页面/索引页面。当我试图在另一个页面上切换语言时,它是由他们的OnPost方法处理的,并得到NullPointer。
<div class="dropdown-menu" aria-labelledby="navbarDropdown">
@foreach (var culture in cultureItems)
{
<form id="selectLanguage" asp-page="/" asp-route-returnUrl="@Context.Request.Path"
method="post" class="form-horizontal" role="form">
<input class="dropdown-item waves-effect waves-light" type="submit" name="culture" value="@culture.Value" />
</form>
}
</div>
我的处理器方法:
public void OnPost(string culture, string returnUrl)
{
Response.Cookies.Append(
CookieRequestCultureProvider.DefaultCookieName,
CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)),
new CookieOptions { Expires = DateTimeOffset.UtcNow.AddYears(1) }
);
return LocalRedirect(returnUrl ?? "/");
}
首先,我强烈建议我们看一下这个
如果所有这些信息让我们不知所措,……那么我想简要地说一下会有帮助的。
全球化和本地化通常旨在为应用程序提供多种语言服务,为了实现这一目标,它使用
- 一个检测请求语言的方法
Http通信被设计为无状态的,因此,没有内置的方法来跟踪诸如语言之类的东西。它必须是附加到Http请求的某种信息,通常在Accept-Language
标头中。如果我们想使用cookie,我们可以使用它。
- 处理该语言的机制
在我们知道请求语言之后,使用一些东西让应用知道,整个请求的当前文化应该是满足语言的东西。在这种情况下,一个中间件负责确保CurrentCulture
和CurrentUICulture
被设置为我们想要的。
- 应用程序用来翻译内容的一些资源
通常,使用一些扩展名为resx
的资源文件,将其视为字典,我们在其中定义apple
,以我们的站点将支持的许多其他语言。然后机制会处理剩下的。
我敢说,这是几乎所有框架都遵循的一般思路。如何实现在上述文件中有明确的表述。给点时间,事情就会好起来的。