razor - 如何在 Asp.Net Core 的 Razor 类库中使用本地化
问题描述
我尝试在以下项目结构中使用 Asp.Net Core 创建 Razor 类库:
我在我的 Web 应用程序中使用了这些设置来进行Startup
课堂本地化:
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
.AddViewLocalization(
LanguageViewLocationExpanderFormat.Suffix,
opts => { opts.ResourcesPath = "Resources"; })
.AddDataAnnotationsLocalization();
services.Configure<RequestLocalizationOptions>(
opts =>
{
var supportedCultures = new[]
{
new CultureInfo("en-US"),
new CultureInfo("en")
};
opts.DefaultRequestCulture = new RequestCulture("en");
opts.SupportedCultures = supportedCultures;
opts.SupportedUICultures = supportedCultures;
});
....
var options = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
app.UseRequestLocalization(options.Value);
在Index.cshtml
:
@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer
<h1>@Localizer["Title"]</h1>
不幸的是,结果只是字符串“标题”。我无法从 Razor 类库加载这些 resx 文件。
如何像上面一样在 Razor 类库中使用本地化?
更新:这是非常相似的用例 - https://github.com/aspnet/Localization/issues/328 - 提供了一些示例。
解决方案
您似乎忘记使用正确配置本地化AddLocalization
使用文档中提供的详细信息
配置本地化
在
ConfigureServices
方法中配置本地化:
services.AddLocalization(options => options.ResourcesPath = "Resources"); //<<< This is required
services
.AddMvc()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
.AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
.AddDataAnnotationsLocalization();
AddLocalization
将本地化服务添加到服务容器。上面的代码还将资源路径设置为“资源”。
AddViewLocalization
添加对本地化视图文件的支持。
AddDataAnnotationsLocalization
通过抽象添加对本地化DataAnnotations
验证消息的支持。IStringLocalizer
本地化中间件
请求的当前文化在本地化中间件中设置。该
Configure
方法中启用了本地化中间件。必须在任何可能检查请求文化的中间件之前配置本地化中间件(例如,app.UseMvcWithDefaultRoute()
)。
var supportedCultures = new[] {
new CultureInfo("en-US"),
new CultureInfo("en")
};
app.UseRequestLocalization(new RequestLocalizationOptions{
DefaultRequestCulture = new RequestCulture("en"),
// Formatting numbers, dates, etc.
SupportedCultures = supportedCultures,
// UI strings that we have localized.
SupportedUICultures = supportedCultures;
});
//...other middleware
app.UseMvcWithDefaultRoute();
示例图像中显示的资源文件的路径遵循路径命名约定,因为您正在使用ResourcesPath
设置为"Resources"的选项。这应该允许视图在“资源”文件夹的相对路径中找到资源文件。
另一种方法是不使用该ResourcesPath
选项,并将.resx文件放在与视图相同的文件夹中,当然要遵循命名约定。
根据提供的其他详细信息,表明 UI 项目将被打包为 nuget 包。
然后将资源文件打包到 nuget 包中,并在安装时将它们解包到目标项目的资源文件夹中。
资源需要位于站点根目录中才能对视图可用,因此您需要引用以下文件中的所有文件.nuspec
:
<?xml version="1.0"?>
<package>
<metadata>...
</metadata>
<files>
<!-- Add all resource files -->
<file src="Resources\**\*.resx" target="content\Resources" />
</files>
</package>
推荐阅读
- julia - 在 Julia 中绘制 DBSCAN 的结果
- excel - 根据下拉列表计算成本
- servicestack - “令牌已过期”不会触发 401 错误代码
- python - 为什么在 SymPy 中未知函数的导数是 1
- python - 打印出 CSV 中特定列中的重复值
- c++ - 如何在 Xcode 中使用 OpenCV 3.4.14 识别 .mp4 视频文件的编解码器?
- css - css 被主题 scss 覆盖
- python - Python REST 服务器与正在进行的子进程交互
- javascript - 返回 if 语句的变量 javascript
- javascript - 如何重命名 PWA 应用程序图标/调试多浏览器的快捷方式