首页 > 解决方案 > 如何在 Asp.Net Core 的 Razor 类库中使用本地化

问题描述

我尝试在以下项目结构中使用 Asp.Net Core 创建 Razor 类库:

在此处输入图像描述

我在我的 Web 应用程序中使用了这些设置来进行Startup课堂本地化:

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
                    .AddViewLocalization(
                        LanguageViewLocationExpanderFormat.Suffix,
                        opts => { opts.ResourcesPath = "Resources"; })
                    .AddDataAnnotationsLocalization();

                services.Configure<RequestLocalizationOptions>(
                    opts =>
                    {
                        var supportedCultures = new[]
                        {
                            new CultureInfo("en-US"),
                            new CultureInfo("en")
                        };

                        opts.DefaultRequestCulture = new RequestCulture("en");
                        opts.SupportedCultures = supportedCultures;
                        opts.SupportedUICultures = supportedCultures;
                    });

....

var options = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
            app.UseRequestLocalization(options.Value);

Index.cshtml

@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer


<h1>@Localizer["Title"]</h1>

不幸的是,结果只是字符串“标题”。我无法从 Razor 类库加载这些 resx 文件。

如何像上面一样在 Razor 类库中使用本地化?

更新:这是非常相似的用例 - https://github.com/aspnet/Localization/issues/328 - 提供了一些示例。

标签: razorasp.net-coreasp.net-core-localization

解决方案


您似乎忘记使用正确配置本地化AddLocalization

使用文档中提供的详细信息

参考ASP.NET Core 中的全球化和本地化

配置本地化

ConfigureServices方法中配置本地化:

services.AddLocalization(options => options.ResourcesPath = "Resources"); //<<< This is required

services
    .AddMvc()
    .SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
    .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
    .AddDataAnnotationsLocalization();
    

AddLocalization将本地化服务添加到服务容器。上面的代码还将资源路径设置为“资源”。

AddViewLocalization添加对本地化视图文件的支持。

AddDataAnnotationsLocalization通过抽象添加对本地化DataAnnotations验证消息的支持。IStringLocalizer

本地化中间件

请求的当前文化在本地化中间件中设置。该Configure方法中启用了本地化中间件。必须在任何可能检查请求文化的中间件之前配置本地化中间件(例如,app.UseMvcWithDefaultRoute())。

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

app.UseRequestLocalization(new RequestLocalizationOptions{
    DefaultRequestCulture = new RequestCulture("en"),
    // Formatting numbers, dates, etc.
    SupportedCultures = supportedCultures,
    // UI strings that we have localized.
    SupportedUICultures = supportedCultures;
});

//...other middleware

app.UseMvcWithDefaultRoute();

示例图像中显示的资源文件的路径遵循路径命名约定,因为您正在使用ResourcesPath设置为"Resources"的选项。这应该允许视图在“资源”文件夹的相对路径中找到资源文件。

另一种方法是不使用该ResourcesPath选项,并将.resx文件放在与视图相同的文件夹中,当然要遵循命名约定。

根据提供的其他详细信息,表明 UI 项目将被打包为 nuget 包。

然后将资源文件打包到 nuget 包中,并在安装时将它们解包到目标项目的资源文件夹中。

资源需要位于站点根目录中才能对视图可用,因此您需要引用以下文件中的所有文件.nuspec

<?xml version="1.0"?>
<package>
    <metadata>...
    </metadata>
    <files>
        <!-- Add all resource files -->
        <file src="Resources\**\*.resx" target="content\Resources" />
    </files>
</package>

参考创建 NuGet 包


推荐阅读