我正在将 .NET Framework 4.8 中的 ASP.NET Web 窗体迁移到 .NET 5 中的 Razor Pages 应用程序
在我的 ASP.NET Web Forms 网站中,我已将翻译部分移至数据库而不是 .resx 文件。
我继承了以下类:
ResourceProviderFactory
,IResourceProvider
和ExpressionBuilder
,
<expressionBuilders>
<remove expressionPrefix="Resources" />
<!-- For Translator -->
<add expressionPrefix="Resources" type="WebCore.Resource.SqlExpressionBuilder" />
</expressionBuilders>
<globalization uiCulture="auto" culture="auto" resourceProviderFactoryType="WebCore.Resource.SqlProviderFactory" />
这让我可以保留 ASP.NET 语法:
<meta name="description" content="<%= GetLocalResourceObject("MetaDescription") %>" />
使用 Razor Pages,您必须使用“
@inject IViewLocalizer Localizer
@Localizer["MyDescription"]
并配置服务:
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages().AddViewLocalization();
}
如何更改本地化服务的默认行为?我应该继承哪个类,如何注入这个新类以便使用这个新的数据库提供程序加载资源?
我实施了解决方案,具体方法如下。
创建实现 IStringLocalizer 和 IStringLocalizerFactory 的类
在网站的启动中
添加:
services.AddRazorPages().AddViewLocalization();
services.AddSingleton<IStringLocalizerFactory, SqlStringLocalizerFactory>();
进入razor页面使用
@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer
<h1>@Localizer["Title"]</h1>
如果您想获取 C# 代码中的值,您可以注入 IStringLocalizer 但如果您的资源位于 html 中,则必须使用 IHtmlLocalizer