【问题标题】:Blazor WebAssembly: localized strings fail to load when setting a different CurrentUICulture and CurrentCultureBlazor WebAssembly:设置不同的 CurrentUICulture 和 CurrentCulture 时无法加载本地化字符串
【发布时间】:2020-08-21 22:47:10
【问题描述】:

我想本地化 Blazor WebAssembly 应用程序中的字符串,但我想将日期和数字表示法固定为 en-US。问题是,当我将 DefaultThreadCurrentUICulture(它应该控制本地化字符串)设置为 DefaultThreadCurrentCulture(它应该控制日期和数字)以外的其他东西时,不再找到来自 resx 文件的本地化字符串。如果我将两者都设置为相同的值(例如,既是 en-US 又是 nl-BE),一切都会按预期工作。

有谁知道我该如何解决这个问题?这是一个错误还是我错过了什么?下面是我与 cmets 的测试代码的一部分,关于 CurrentUICulture 和 CurrentCulture 的哪些组合有效或无效。 我把这段代码放在 Main 方法的开头。

private const string English = "en-US";
private const string Dutch = "nl-BE";
[...]
switch (combination)
{
    case Combination.English:
        // Works fine
        CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo(English);
        CultureInfo.DefaultThreadCurrentCulture = new CultureInfo(English);
        break;
    case Combination.Dutch:
        // Works fine
        CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo(Dutch);
        CultureInfo.DefaultThreadCurrentCulture = new CultureInfo(Dutch);
        break;
    case Combination.DutchEnglish:
        // Only the date and the float work (CurrentCulture)
        // Resourcestrings are not found
        CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo(Dutch);
        CultureInfo.DefaultThreadCurrentCulture = new CultureInfo(English);
        CultureInfo.CurrentUICulture = new CultureInfo(Dutch);
        CultureInfo.CurrentCulture = new CultureInfo(English);
        break;
    case Combination.EnglishDutch:
        // Only the date and the float work (CurrentCulture)
        // Resourcestrings are not found
        CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo(English);
        CultureInfo.DefaultThreadCurrentCulture = new CultureInfo(Dutch);
        break;
}

为了完整起见,Index.razor 页面的本地化内容:

@page "/"
@using System.Globalization
@inject Microsoft.Extensions.Localization.IStringLocalizer<Index> localizedStrings


<table style="border-spacing: 0.5em; border: 1px solid black;">
    <thead style="text-align:left;">
        <tr>
            <th>Description</th>
            <th>Localization source</th>
            <th>Localization value (Current/DefaultThread)</th>
            <th>Value</th>
            <th>Expectation</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>Localized string</td>
            <td>CurrentUICulture</td>
            <td>@CultureInfo.CurrentUICulture / @CultureInfo.DefaultThreadCurrentUICulture</td>
            <td>@localizedStrings["HelloWorld"]</td>
            <td>nl-BE: Dag wereld!, en-US: Hello world!</td>
        </tr>
        <tr>
            <td>Localized float</td>
            <td>CurrentCulture</td>
            <td>@CultureInfo.CurrentCulture / @CultureInfo.DefaultThreadCurrentCulture</td>
            <td>@(0.5)</td>
            <td>nl-BE should be with comma, en-US with point</td>
        </tr>
        <tr>
            <td>Localized long date</td>
            <td>CurrentCulture</td>
            <td>@CultureInfo.CurrentCulture / @CultureInfo.DefaultThreadCurrentCulture</td>
            <td>@DateTime.Now.ToLongDateString()</td>
            <td>nl-BE: zaterdag 22 augustus 2020, en-US: Saturday, August 22, 2020</td>
        </tr>
    </tbody>
</table>

如果我在 Index.razor 上打印文化,所有值总是按预期设置。因此,这些值并非不会传播到剃须刀页面:

<h3>Current cultures</h3>
<p>CurrentCulture: @CultureInfo.CurrentCulture</p>
<p>CurrentUICulture: @CultureInfo.CurrentUICulture</p>
<p>DefaultThreadCurrentCulture: @CultureInfo.DefaultThreadCurrentCulture</p>
<p>DefaultThreadCurrentUICulture: @CultureInfo.DefaultThreadCurrentUICulture</p>

【问题讨论】:

  • 尝试将CultureInfo 设置为每个控制器方法而不是Main()
  • @donggas90 您好,我说的是您在 Visual Studio 中启动时获得的默认(非托管)Blazor WebAssembly 应用程序。据我所知,没有控制器。你能具体说明一下你的意思吗?您的意思是在 Pages/Index.razor 中设置吗?
  • CultureInfo 来自基本运行的系统(服务器),然后是请求的标头。我不能确定 WebAssembly 将客户端的区域作为 CultureInfo,但在调用相关函数之前尝试放置。
  • @donggas90 我在 Index.razor 中添加了protected override void OnInitialized() { base.OnInitialized(); CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo("en-US"); CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("nl-BE"); },但似乎没有被采纳。我还编辑了问题,以澄清文化确实按预期传播到 Index.razor。

标签: c# asp.net-core localization blazor webassembly


【解决方案1】:

我很确定这是 .net5.0-preview8 中正在解决的错误 - 希望这周应该会发布!

https://github.com/dotnet/aspnetcore/issues/24174

编辑: 看来我在解决您的问题方面是错误的-事实并非如此。 从使用 aspnetcore 5 preview 8 的快速测试来看,似乎只有 currentculture 和 currentuiculture 匹配时本地化才有效。

【讨论】:

  • 我不完全理解您链接的错误(从未与 ICU 合作过),但我会相信您的话并将我的问题标记为已回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-19
  • 1970-01-01
  • 2020-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多