Blazor WebAssembly:设置不同的CurrentUICulture和CurrentCulture

问题描述

我想在Blazor WebAssembly应用程序中本地化字符串,但是我想将日期和数字符号固定为en-US。问题是,当我将DefaultThreadCurrentUICulture(应控制本地化的字符串)设置为DefaultThreadCurrentCulture(应控制日期和数字)以外的其他内容时,不再找到来自resx文件的本地化字符串。如果我将两者都设置为相同的值(例如,两个en-US或两个nl-BE),那么一切都会按预期进行。

有人知道我该如何解决吗?这是错误还是我错过了什么?以下是我的测试代码的一部分,其中包含有关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>

解决方法

我非常确定这是.net5.0-preview8中已解决的错误-希望本周可以发布!

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

编辑: 对于解决您的问题,我似乎错了-事实并非如此。 从使用aspnetcore 5 Preview 8进行的快速测试来看,似乎唯一可行的方法是当前文化和当前文化都匹配。