首页 > 解决方案 > 如何在 asp.net 中使用本地化?

问题描述

我试图弄清楚如何在 中使用本地化ASP.NET,我实际上遵循了 Microsoft 文档,但我现在很困惑。

这是我到目前为止所做的:

在该Configure方法中,我添加了以下代码(最重要的是):

var supportedCultures = new[]
{
   new CultureInfo("it-IT"),
   new CultureInfo("en-EN")
};

app.UseRequestLocalization(new RequestLocalizationOptions
{
   DefaultRequestCulture = new RequestCulture("it"),
   SupportedCultures = supportedCultures,
   SupportedUICultures = supportedCultures
});

所以基本上我声明了两种支持的语言,并将意大利语设置为默认值。

然后在里面ConfigureServices我指定了ResourcesPath

services.AddLocalization(options => options.ResourcesPath = "Resources");

这实际上是文件夹内容:

在此处输入图像描述

我将两个.resx文件的访问修改器都设置为public,然后在里面_ViewImports.cshtml添加了这个:

@使用 Microsoft.AspNetCore.Mvc.Localization

问题是,当我@Resources在 a 内输入时,View我得到:

由于安全级别,“资源”无法访问

标签: c#asp.net-coreasp.net-core-mvc

解决方案


如果你想在视图中访问控制器的本地化字符串,你可以这样做:

@inject IStringLocalizer<HomeController> localazier

在那之后@localazier["YourKey"]

我建议您在项目中创建一个空类作为示例SharedResources并为其创建特定的 resx 文件,然后在任何地方使用它@inject IStringLocalizer<SharedResources> localazier

另外一个可能的问题是您的默认文化。Asp.net 核心在这三个地方之一中寻找文化:

QueryStringRequestCultureProvider
CookieRequestCultureProvider
AcceptLanguageHeaderRequestCultureProvider

并且只有当其中任何一个文化为空时,它才会采用您的默认文化。因此,您应该尽可能关闭AcceptLanguageHeaderRequestCultureProvider,因为很多用户可能已经在他们的浏览器中定义了它,并且可能与 IT 不同。

这是仅从查询字符串或 cookie 中获取它的方法,因此我建议您以这种方式实现它。

services.Configure<RequestLocalizationOptions>(options =>
{
    options.RequestCultureProviders = new List<IRequestCultureProvider>()
    {
        new QueryStringRequestCultureProvider(),
        new CookieRequestCultureProvider()
    };
});

推荐阅读