本文介绍了使用每种语言的唯一资源文件使用IStringLocalizer本地化blazor的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用 IStringLocalizer 和基于Cookie的用户界面选择来本地化Blazor应用程序(.NET 5.0).遵循文档,如果我为 Resources/Pages 文件夹中的每个页面创建一个 .resx 文件,这似乎可以正常工作.

I'm trying to localize my Blazor app (.NET 5.0) using IStringLocalizer and user UI selection based on cookies. Following the documentation, it seems to work if I create a .resx file for each page in my Resources/Pages folder.

我想按以下方式将所有键值对归为一个文件:

I'd like to group all key-value pairs within a single file as follows :

MyApp
|-- Resources
|       MyResources.resx        <--- set to public modifiers to generate class!!!
|       MyResources.es.resx
|       MyResources.fr.resx
...
|-- Resources
|       Index.razor

因此,在 Startup.cs 中,我注册了 Resources 文件夹:

So in Startup.cs I register the Resources folder:

services.AddControllers();
services.AddLocalization(options => options.ResourcesPath = "Resources");

我还在configure方法中添加了 MapControllers ,以及注册了支持的区域性.我还添加了控制器:

I also added MapControllers in the configure method, as well as registering supported cultures. I also added the controller:

[Route("[controller]/[action]")]
public class CultureController : Controller {
    public IActionResult SetCulture(string culture, string redirectUri) {
        if (culture != null) {
            HttpContext.Response.Cookies.Append(
                CookieRequestCultureProvider.DefaultCookieName,
                CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)));
        }

        return LocalRedirect(redirectUri);
    }
}

现在,在我的主要"index.razor"上页面我按如下方式注入 IStringLocalizer< MyResources> :

Now, on my main "index.razor" page I inject the IStringLocalizer<MyResources> as follows:

@page "/index"
@inject IStringLocalizer<Language> _localizer

<h2>@_localizer["hello_world"]</h2>
<h2>@DateTime.Now.ToShortDateString()</h2>
<h2>@DateTime.Now.ToLongDateString()</h2>

我确保所有 resx 文件实际上都包含"hello_world"文件,键,并添加一些语言选择器.

I make sure that all resx files actually contain the "hello_world" key with some values and added a language selector.

当我运行该应用程序时,更改语言的确会更改显示的日期,但是,找不到 hello_world 键,因此该应用程序显示了该键.探索 _localizer 变量时,我发现容器为空- .resx 的键/值对均未真正加载.

When I run the app, changing the language does change the displayed dates, however, the hello_world key is not found so the app displays the key instead. When exploring the _localizer variable, I see that the container is empty - none of the key-value pairs of the .resx are actually loaded.

是否可以使它正常工作?如果是这样,我在这里做什么错了?

Is it possible to get this to work? If so, what am I doing wrong here?

推荐答案

错误是由于在这里命名:

The mistake is because of naming here:

@inject IStringLocalizer<Language> _localizer

应该是

@inject IStringLocalizer<MyResources> _localizer

重要的是在项目的根目录添加一个空文件 MyResources.razor .

And important is to add an empty file MyResources.razor at the root of the project.

我犯的另一个错误是将 myApp.Resources 添加到 _Imports.razor

Another mistake I made is to add the myApp.Resources to _Imports.razor

...
@using myApp.Resources    <==== do NOT add this

这篇关于使用每种语言的唯一资源文件使用IStringLocalizer本地化blazor的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-25 17:04