我正在尝试使用 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 中的核心项目中。
我之前已经看过几个现有的问题来定位自己,但我还没有找到解决我的问题的方法(或者我可能很糟糕,哈哈):
当我把我的资源放在同一个项目中时,它可以工作,所以当它在另一个项目中时,我无法弄清楚如何去做。
我尝试过的:在我的网络项目中
Configureservice
我有 .AddLocalization()
和 .Configure<RequestLocalizationOptions>(opt => ...)
并在 Configure
我有 app.UseRequestLocalization()
.在我的核心项目中,我创建了一个 AssemblyInfo.cs
与 [assembly: ResourceLocation("Resources/Localization/web")]
和 [assembly: RootNamespace("app")]
(以及其他名称,如 app.web
或 app.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/