本地化 ASP.NET 核心 MVC 应用程序

Localize an ASP.NET Core MVC app

我正在努力让我的应用程序正确本地化字符串。感觉我已经搜索了网络的每个角落,但没有找到我期望的有用的东西。

我使用 RouteDataRequestCultureProvider,我要解决的第一个问题是能够使用文化的 "short hand version",例如sv 而不是 sv-SE,并且 sv 在创建文化时被视为 sv-SE。这不会自动发生。

其次是让应用程序显示本地化字符串。这是我配置本地化的方式

public static IServiceCollection ConfigureLocalization(this IServiceCollection services)
{
    services.AddLocalization(options =>
    {
        options.ResourcesPath = "Resources";
    });
    services.Configure<RequestLocalizationOptions>(options =>
    {
        var supportedCultures = new[]
            {
            new System.Globalization.CultureInfo("sv-SE"),
            new System.Globalization.CultureInfo("en-US")                        
            };                
        options.DefaultRequestCulture = new RequestCulture(culture: "sv-SE", uiCulture: "sv-SE");
        options.SupportedCultures = supportedCultures;
        options.SupportedUICultures = supportedCultures;                
        options.RequestCultureProviders = new[]
        {
            new RouteDataRequestCultureProvider
            {
                Options = options
            }
        };
    });
    return services;
}

然后在 Configure 中我执行 app.UseRequestLocalizationOptions(); 注入先前配置的选项。

在文件夹 Resources 中,我创建了资源文件 Resource.resxResource.sv.resx

在我的视图文件中,我尝试了注入 IStringLocalizer(由于没有注册默认实现而失败)和 IStringLocalizer<My.Namespace.Resources.Resource>,但是 none 选项有效。我也尝试过老式的方式 @My.Namespace.Resources.Resource.StringToLocalize

难道没有共享资源文件?不想诉诸 Resource\Views\ViewA.resxResource\Controllers\AController.resx.

谢谢

所以我让它工作了。在我的 Resource 文件夹中,我的 Lang.resx 文件带有 public 访问修饰符

我找到了 this 并添加了属于 的 class Lang(命名为文件 LangDummy 不与资源文件冲突)项目的根命名空间

然后在我看来导入文件 @inject Microsoft.Extensions.Localization.IStringLocalizer<My.Namespace.Lang> StringLocalizer 并使用它 @StringLocalizer["PropertyInResxFile"]。理想情况下,我想使用生成的静态属性来实现类型安全和更轻松的重构,并且在任何地方使用 nameof 都会让人觉得臃肿。

这也适用于通过数据注释属性进行本地化但是我在这里使用ResourceType = typeof(My.Namespace.Resources.Lang),即resx文件的class