Blazor WASM 显示资源密钥而不是本地化值
Blazor WASM displaying resource key instead of localized value
我正在尝试在我的 Blazor WebAssembly 应用程序中实现本地化,方法是遵循在互联网上找到的一个教程,例如:
Localization in Blazor
我已经设置了教程中描述的所有内容,但是我无法获得特定键的本地化值,我得到的键显示为我想要本地化的文本。
这是我的代码:
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 生成的 Class 称为 General。
这是我的资源设置:添加了一个 resx 作为嵌入式资源和代码生成工具 PublicResXFileCodeGenerator
我的塞尔维亚语本地化 resx 设置为 EmbeddedResource,没有代码生成工具。
IStringLocalizer<T>
不依赖于 .resx
文件生成的 class。在构建过程中,ResourceManager
将资源嵌入到主 dll 中并创建附属 dll。 IStringLocalizer<T>
的默认实现依赖于 ResourceManager
来读取程序集或附属程序集中的文件。所以关闭代码生成应该可以解决你的问题。
更新:
<T>
是指任何可能的 class。没有强制执行约束。但是,class 的命名空间和文件位置之间应该有一个 link。
假设您有文件 Pages/Users/AddUserPage.razor
@inject IStringLocalizer<AddUser> Localizer
如果您不手动指定命名空间,AddUserPage
class 将在命名空间 <ProjectRootNamespace>.Pages.Users
.
中结束
因此,您需要创建一个反映文件夹结构的 .resx 文件。您的根指定为 Localization
,因此您需要创建文件 Localization/Pages/Users/AddUserPage.resx
或它们的本地对应文件,例如 Localization/Pages/Users/AddUserPage.sr.resx
在某些情况下,对某些本地化进行分组是有意义的,例如按钮的标题(确定、关闭、是、否等)。为避免在每个 .resx 文件中都有这些键,您可以创建一个空 class。我喜欢把它命名为SharedRessources
。但是,名称并不重要,只要相应地命名 .resx 文件即可。
namespace <ProjectRootNamespace>
{
public class SharedRessources
{
}
}
因为 class 在项目的根命名空间中,.resx 文件应该放在 .resx 文件的根文件夹中。在你的例子中,Localization
。因此,名称应为 Localization/SharedRessources.resx
和 Localization/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"]
我正在尝试在我的 Blazor WebAssembly 应用程序中实现本地化,方法是遵循在互联网上找到的一个教程,例如: Localization in Blazor
我已经设置了教程中描述的所有内容,但是我无法获得特定键的本地化值,我得到的键显示为我想要本地化的文本。
这是我的代码: 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 生成的 Class 称为 General。
这是我的资源设置:添加了一个 resx 作为嵌入式资源和代码生成工具 PublicResXFileCodeGenerator
我的塞尔维亚语本地化 resx 设置为 EmbeddedResource,没有代码生成工具。
IStringLocalizer<T>
不依赖于 .resx
文件生成的 class。在构建过程中,ResourceManager
将资源嵌入到主 dll 中并创建附属 dll。 IStringLocalizer<T>
的默认实现依赖于 ResourceManager
来读取程序集或附属程序集中的文件。所以关闭代码生成应该可以解决你的问题。
更新:
<T>
是指任何可能的 class。没有强制执行约束。但是,class 的命名空间和文件位置之间应该有一个 link。
假设您有文件 Pages/Users/AddUserPage.razor
@inject IStringLocalizer<AddUser> Localizer
如果您不手动指定命名空间,AddUserPage
class 将在命名空间 <ProjectRootNamespace>.Pages.Users
.
因此,您需要创建一个反映文件夹结构的 .resx 文件。您的根指定为 Localization
,因此您需要创建文件 Localization/Pages/Users/AddUserPage.resx
或它们的本地对应文件,例如 Localization/Pages/Users/AddUserPage.sr.resx
在某些情况下,对某些本地化进行分组是有意义的,例如按钮的标题(确定、关闭、是、否等)。为避免在每个 .resx 文件中都有这些键,您可以创建一个空 class。我喜欢把它命名为SharedRessources
。但是,名称并不重要,只要相应地命名 .resx 文件即可。
namespace <ProjectRootNamespace>
{
public class SharedRessources
{
}
}
因为 class 在项目的根命名空间中,.resx 文件应该放在 .resx 文件的根文件夹中。在你的例子中,Localization
。因此,名称应为 Localization/SharedRessources.resx
和 Localization/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"]