首页 文章

如何在Asp.Net Core中的Razor类库中使用本地化

提问于
浏览
3

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

enter image description here

我在我的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>

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

如何在Razor类库中使用如上所述的本地化?

UPDATE :这是一个非常类似的用例 - https://github.com/aspnet/Localization/issues/328 - 提供了一些例子 .

1 回答

  • 2

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

    使用文档提供的详细信息

    参考Globalization and localization in 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 将本地化服务添加到服务容器 . 上面的代码还设置了"Resources"的资源路径 .

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

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

    本地化中间件请求中的当前文化是在本地化中间件中设置的 . 在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();
    

    如果您使用的是设置为"Resources"的 ResourcesPath 选项,则示例图像中显示的资源文件的路径遵循路径命名约定 . 这应该允许视图在"Resources"文件夹的相对路径中查找资源文件 .

    另一种方法是不使用 ResourcesPath 选项,并根据命名约定将.resx文件放在与视图相同的文件夹中 .

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

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

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

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

    参考Creating NuGet packages

相关问题