asp.net - 另一个项目中具有本地化资源的 Blazor 服务器大小

标签 asp.net asp.net-core localization blazor-server-side asp.net-core-localization

我正在尝试使用 localization feature of ASP.Net Core在我的 Blazor 应用程序中。我想使用 IStringLocalizer 以便我自动检测浏览器语言以适应用户的语言。
我的解决方案由多个项目组成,为了干净起见,我想将所有其他项目的资源文件收集在同一个项目 (app.core) 中。
你可以看到我的架构的一个例子:

solution app
|-- app.project1
|-- app.project2
|-- app.core
|   |-- Resources
|       |-- Localization
|           |-- project1
|           |-- project2
|           |-- web
|               |-- Pages
|                   |-- Index.en.resx
|                   |-- Index.fr.resx
|-- app.web
    |-- Pages
        |-- Index.razor

与 web 项目相关的资源位于文件夹 Resources > Localization > web 中的核心项目中。

我之前已经看过几个现有的问题来定位自己,但我还没有找到解决我的问题的方法(或者我可能很糟糕,哈哈):
  • Asp.Net Core Localized Resource in Separate Assembly
  • .NET Core - Globalization and Localization - Class library
  • Localization in external class libraries in ASP.NET Core
  • Support localization resources in a separate assembly

  • 当我把我的资源放在同一个项目中时,它可以工作,所以当它在另一个项目中时,我无法弄清楚如何去做。

    我尝试过的:在我的网络项目中 Configureservice我有 .AddLocalization().Configure<RequestLocalizationOptions>(opt => ...)并在 Configure我有 app.UseRequestLocalization() .在我的核心项目中,我创建了一个 AssemblyInfo.cs[assembly: ResourceLocation("Resources/Localization/web")][assembly: RootNamespace("app")](以及其他名称,如 app.webapp.core )但它似乎不起作用。

    我不喜欢为每个 .resx 做虚拟 .cs 的解决方案,我不喜欢有无用的类。

    我希望我的问题是可以理解的,我的英语也是。在此先感谢您的回答,这是我第一次来这里寻求帮助!

    最佳答案

    我最近设法做到了这一点。大部分需要的信息都是从这里收集的:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization?view=aspnetcore-3.1
    这是我的解决方案结构:

    solution app
    |-- BlazorApp
    |   |-- Localization
    |       |-- MyTextsLocalizer.cs
    |-- MyLib
    |   |-- MyTexts.cs
    |   |-- Localization
    |       |-- MyTexts.resx
    |       |-- MyTexts.cz.resx
    
    我的图书馆
    我希望所有资源 key 都可以作为 enum 使用。 . MyTexts是通过资源文件本地化的枚举。
    MyTexts.cs
    namespace MyLib
    {
        public enum MyTexts
        {
            HiThere
        }
    }
    
    本地化/MyTexts.resx
    此文件包含 enum 的翻译值。在这个例子中只有一个翻译:
    键:你好,值:你好
    本地化/MyTexts.cz.resx
    此文件包含 enum 的翻译值。在这个例子中只有一个翻译:
    键:HiThere,值:Ahoj
    应用程序
    本地化/MyTextsLocalizer.cs
    using Microsoft.Extensions.Localization;
    using MyLib;
    using MyLib.Localization;
    using System.Reflection;
    
    namespace BlazerApp.Localization
    {
        public class MyTextsLocalizer
        {
            private readonly IStringLocalizer _localizer;
    
            public MyTextsLocalizer(IStringLocalizerFactory factory)
            {
                var type = typeof(MyTextsLoc);
                var assemblyName = new AssemblyName(type.GetTypeInfo().Assembly.FullName);
                _localizer = factory.Create(nameof(MyTextsLoc), assemblyName.Name);
            }
    
            public string Localize(MyTexts myTexts)
            {
                return _localizer.GetString(myTexts.ToString());
            }
        }
    }
    
    启动文件
    我已将以下代码添加到 ConfigureServices方法。
    请注意 options.ResourcesPath = "Localization"很重要。路径必须是资源文件在库中所在位置的路径。它不适用于不正确的路径。
    services.AddLocalization(options =>
    {
        options.ResourcesPath = "Localization";
    });
    var supportedCultures = new List<CultureInfo>
    {
        new CultureInfo("en"),
        new CultureInfo("cz")
    };
    services.Configure<RequestLocalizationOptions>(options =>
    {
        options.DefaultRequestCulture = new Microsoft.AspNetCore.Localization.RequestCulture("en");
        options.SupportedCultures = supportedCultures;
        options.SupportedUICultures = supportedCultures;
    });
    
    services.AddSingleton<MyTextsLocalizer>();
    
    Index.razor
    定位器用于 Razor 组件,如下所示:
    @page "/"
    
    @using BlazerApp.Localization
    @using MyLib
    
    @inject MyTextsLocalizer loc
    
    <h1>@loc.Localize(MyTexts.HiThere)</h1>
    
    

    关于asp.net - 另一个项目中具有本地化资源的 Blazor 服务器大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61409870/

    相关文章:

    c# - 在动态 Asp :net Table 上添加必需的验证器

    javascript - 通过 ASPX 响应写入 JSON 时的 IE 错误

    visual-studio-2015 - 如何在 Visual Studio 测试中使用 ASP.NET Core 环境变量

    git - .PO (gettext) 文件的 3 向 Git merge 驱动程序在哪里?

    delphi - 本地化应用程序 : difference between gnugettext and dxgettext

    php - Laravel 不区分大小写的本地化

    asp.net - 使用 asp.net 对拇指驱动器进行用户身份验证

    asp.net-core - "The library ' hostpolicy.dll ' required"如果从部署文件夹运行,但emitEntryPoint为true

    asp.net-core - 升级到 .net core 3.1 preview4 后代码分析器生成错误

    c# - 在 Google Visualization API (JavaScript) 中动态添加行