Blazor WASM 显示资源密钥而不是本地化值

Blazor WASM displaying resource key instead of localized value

我正在尝试在我的 Blazor WebAssembly 应用程序中实现本地化,方法是遵循在互联网上找到的一个教程,例如: Localization in Blazor

我已经设置了教程中描述的所有内容,但是我无法获得特定键的本地化值,我得到的键显示为我想要本地化的文本。

这是我的代码: Program.cs - 硬编码文化,以确保我选择了正确的文化:

builder.Services.AddLocalization(opts => { opts.ResourcesPath = "Localization"; });
var culture = new CultureInfo("sr");
CultureInfo.DefaultThreadCurrentCulture = culture;
CultureInfo.DefaultThreadCurrentUICulture = culture;

在我的 .razor 文件中,我注入了一个 IStringLocalizer:

@inject IStringLocalizer<General> localizer

我使用这样的定位器:

我从 .resx 生成的 Class 称为 General。 这是我的资源设置:添加了一个 resx 作为嵌入式资源和代码生成工具 PublicResXFileCodeGenerator

我的塞尔维亚语本地化 resx 设置为 EmbeddedResource,没有代码生成工具。

IStringLocalizer<T> 不依赖于 .resx 文件生成的 class。在构建过程中,ResourceManager 将资源嵌入到主 dll 中并创建附属 dll。 IStringLocalizer<T> 的默认实现依赖于 ResourceManager 来读取程序集或附属程序集中的文件。所以关闭代码生成应该可以解决你的问题。

更新:

<T> 是指任何可能的 class。没有强制执行约束。但是,class 的命名空间和文件位置之间应该有一个 link。

假设您有文件 Pages/Users/AddUserPage.razor

@inject IStringLocalizer<AddUser> Localizer

如果您不手动指定命名空间,AddUserPage class 将在命名空间 <ProjectRootNamespace>.Pages.Users.

中结束

因此,您需要创建一个反映文件夹结构的 .resx 文件。您的根指定为 Localization,因此您需要创建文件 Localization/Pages/Users/AddUserPage.resx 或它们的本地对应文件,例如 Localization/Pages/Users/AddUserPage.sr.resx

在某些情况下,对某些本地化进行分组是有意义的,例如按钮的标题(确定、关闭、是、否等)。为避免在每个 .resx 文件中都有这些键,您可以创建一个空 class。我喜欢把它命名为SharedRessources。但是,名称并不重要,只要相应地命名 .resx 文件即可。


namespace <ProjectRootNamespace>
{
    public class SharedRessources
    {
    }
}

因为 class 在项目的根命名空间中,.resx 文件应该放在 .resx 文件的根文件夹中。在你的例子中,Localization。因此,名称应为 Localization/SharedRessources.resxLocalization/SharedRessources.sr.resx

现在,你也可以注射了。

@inject IStringLocalizer<AddUser> Localizer
@inject IStringLocalizer<SharedRessources> SharedLocalizer

<p> Hi from @Localizer["KeyLocalToAddUser"] </p>
<p> Do you want to delete the user? <span> @SharedLocalizer["No"] or SharedLocalizer["Yes"]