另一个项目中具有本地化资源的 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.web
或 app.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的主要内容,如果未能解决你的问题,请参考以下文章
具有个人帐户和托管 ASP.NET Core 的 Blazor WebAssembly 应用程序 - IIS - SQLLocalDB 15.0 找不到指定的资源语言 ID