【问题标题】:Blazor WASM displaying resource key instead of localized valueBlazor WASM 显示资源键而不是本地化值
【发布时间】:2021-09-30 08:49:03
【问题描述】:

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

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

这是我的代码: 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 生成的我的类称为 General。 这是我的资源设置:添加了 resx 作为嵌入式资源和代码生成工具 PublicResXFileCodeGenerator

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

【问题讨论】:

    标签: c# blazor-webassembly


    【解决方案1】:

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

    更新:

    &lt;T&gt; 指的是任何可能的类。没有强制执行。但是,类的命名空间和文件位置之间应该有一个链接。

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

    @inject IStringLocalizer<AddUser> Localizer
    

    如果您不手动指定命名空间,AddUserPage 类将最终在命名空间 &lt;ProjectRootNamespace&gt;.Pages.Users 中。

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

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

    
    namespace <ProjectRootNamespace>
    {
        public class SharedRessources
        {
        }
    }
    
    

    由于该类位于项目的根命名空间中,因此 .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"] 
    
    

    【讨论】:

    • 那么 T 是为了什么?我试图把我的页面的类名放在 T 上,我确实像你建议的那样 - 没有代码生成,但仍然无法正常工作。我还阅读了一些不应该有默认资源文件的文章 - 试过了 - 没有运气......
    • 看来我没有遵循资源文件的命名规则:docs.microsoft.com/en-us/aspnet/core/fundamentals/… 所以如果我有一个名为 Playlists 的页面,资源文件应该命名为“Pages.Playlists.xx.resx 我不是确定这是否应该是一个答案,我很好奇是否有办法将本地化字符串分组到比页面更大的东西中。
    • 我之前的评论在同一篇文章中有答案。应使用虚拟类对共享资源进行分组。
    • 感谢您的意见@vpetrovic。我更新了答案,提供了有关 T、命名约定以及如何处理多个页面之间本地化共享的更多信息
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-22
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    • 2012-06-10
    • 1970-01-01
    • 2022-10-26
    相关资源
    最近更新 更多