Blazor WebAssembly:设置不同的 CurrentUICulture 和 CurrentCulture 时本地化字符串无法加载
Blazor WebAssembly: localized strings fail to load when setting a different CurrentUICulture and 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 预览版 8 的快速测试来看,本地化似乎只有在 currentculture 和 currentuiculture 匹配时才有效。
我想本地化 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 预览版 8 的快速测试来看,本地化似乎只有在 currentculture 和 currentuiculture 匹配时才有效。