gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 20:54:17 24 4
gpt4 key购买 nike

我正在尝试使用 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/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com