另一个项目中具有本地化资源的 Blazor Server-Size

Posted

技术标签:

【中文标题】另一个项目中具有本地化资源的 Blazor Server-Size【英文标题】:Blazor Server-Size with Localized Resource in another project 【发布时间】:2020-08-08 02:45:45 【问题描述】:

我正在尝试在我的 Blazor 应用中使用 localization feature of ASP.Net Core。我想使用 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()。在我的核心项目中,我使用[assembly: ResourceLocation("Resources/Localization/web")][assembly: RootNamespace("app")] 创建了一个AssemblyInfo.cs (以及其他名称,例如 app.webapp.core),但它似乎不起作用。

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

我希望我的问题是可以理解的,我的英语也是。先谢谢大家的解答,第一次来这里求助!

【问题讨论】:

你让它工作了吗?我也有同样的问题 【参考方案1】:

我最近设法做到了这一点。大部分需要的信息都是从这里收集的: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

我的库

我想让所有资源密钥都以enum 的形式提供。 MyTexts 是一个使用资源文件本地化的枚举。

MyTexts.cs

namespace MyLib

    public enum MyTexts
    
        HiThere
    

本地化/MyTexts.resx

此文件包含enum 值的翻译。本例中只有一种翻译: 键:你好,值:你好

本地化/MyTexts.cz.resx

此文件包含enum 值的翻译。本例中只有一种翻译: 键:HiThere,值:Ahoj

Blazor 应用程序

本地化/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());
        
    

Startup.cs

我已将以下代码添加到 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

定位器用于剃须刀组件,如下所示:

@page "/"

@using BlazerApp.Localization
@using MyLib

@inject MyTextsLocalizer loc

<h1>@loc.Localize(MyTexts.HiThere)</h1>

【讨论】:

以上是关于另一个项目中具有本地化资源的 Blazor Server-Size的主要内容,如果未能解决你的问题,请参考以下文章

首次部署具有多个项目的 Blazor 解决方案

blazor 项目上的非 blazor 文件夹

如何从 Blazor 中的另一个组件重新渲染一个组件?

具有个人帐户和托管 ASP.NET Core 的 Blazor WebAssembly 应用程序 - IIS - SQLLocalDB 15.0 找不到指定的资源语言 ID

Blazor 在 IIS 中部署项目

如何使用同一 Blazor 组件的多个实例