Asp*_*ter 6 asp.net localization asp.net-core asp.net-core-localization blazor-server-side
我\xe2\x80\x99m 尝试在我的 Blazor 应用程序中使用ASP.Net Core 的本地化功能。我想使用 IStringLocalizer,以便自动检测浏览器语言以适应用户\xe2\x80\x99s 语言。\n我的解决方案由多个项目组成,为了整洁起见,我想将资源文件收集在同一个项目中( app.core)适用于我的所有其他项目。\n您可以查看我的架构的示例:
\n\nsolution app\n|-- app.project1\n|-- app.project2\n|-- app.core\n| |-- Resources\n| |-- Localization\n| |-- project1\n| |-- project2\n| |-- web\n| |-- Pages\n| |-- Index.en.resx\n| |-- Index.fr.resx\n|-- app.web\n |-- Pages\n |-- Index.razor\nRun Code Online (Sandbox Code Playgroud)\n\n与 Web 项目相关的资源位于核心项目的资源 > 本地化 > web 文件夹中。
\n\n我之前已经看过几个现有的问题来定位自己,但我还没有找到解决我的问题的方法(或者也许我很糟糕,哈哈):
\n\n\n\n当我将我的资源放在同一个项目中时,它可以工作,所以它\xe2\x80\x99s只是我可以\xe2\x80\x99s弄清楚当它\xe2\x80\x99s在另一个项目中时如何做到这一点。
\n\n我尝试过的:在我的网络项目中,Configureservice我有.AddLocalization(),并且.Configure<RequestLocalizationOptions>(opt => ...)在Configure我有app.UseRequestLocalization()。在我的核心项目中,我创建了一个AssemblyInfo.cswith[assembly: ResourceLocation("Resources/Localization/web")]和[assembly: RootNamespace("app")]\n(以及其他名称,如app.web, 或app.core),但它似乎不起作用。
我不喜欢为每个 .resx 执行虚拟 .cs 的解决方案,我不喜欢有无用的类。
\n\n我希望我的问题是可以理解的,我的英语也是如此。先谢谢各位的解答,这是我第一次来这里寻求帮助!
\n我最近成功做到了这一点。大多数所需信息已从此处收集:https://learn.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
Run Code Online (Sandbox Code Playgroud)
我希望所有资源密钥都可以作为enum. MyTexts是一个正在使用资源文件进行本地化的枚举。
solution app
|-- BlazorApp
| |-- Localization
| |-- MyTextsLocalizer.cs
|-- MyLib
| |-- MyTexts.cs
| |-- Localization
| |-- MyTexts.resx
| |-- MyTexts.cz.resx
Run Code Online (Sandbox Code Playgroud)
该文件包含值的翻译enum。本例中只有一种翻译:键:HiThere,值:Hi There
该文件包含值的翻译enum。本例中只有一种翻译:键:HiThere,值:Ahoj
namespace MyLib
{
public enum MyTexts
{
HiThere
}
}
Run Code Online (Sandbox Code Playgroud)
我已将以下代码添加到该ConfigureServices方法中。
请注意,options.ResourcesPath = "Localization"很重要。该路径必须是资源文件在库中所在位置的路径。它不适用于不正确的路径。
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());
}
}
}
Run Code Online (Sandbox Code Playgroud)
定位器在剃刀组件中使用如下:
@page "/"
@using BlazerApp.Localization
@using MyLib
@inject MyTextsLocalizer loc
<h1>@loc.Localize(MyTexts.HiThere)</h1>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1747 次 |
| 最近记录: |