我尝试使用Asp.Net Core在以下项目结构中创建Razor类库:
我在我的网络应用程序中使用了这些设置,以便在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>
不幸的是,结果只是字符串&#34;标题&#34;。我无法从Razor类库中加载这些resx文件。
如何在上面的Razor类库中使用本地化?
更新:这是一个非常类似的用例 - https://github.com/aspnet/Localization/issues/328 - 提供了一些示例。
答案 0 :(得分:2)
您似乎忘记使用AddLocalization
使用文档中提供的详细信息
参考Globalization and localization in ASP.NET Core
配置本地化
本地化是在
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();
示例图像中显示的资源文件的路径遵循给定的路径命名约定
您正在使用设置为“Resources”的ResourcesPath
选项。这应该允许视图在“Resources”文件夹的相对路径中找到资源文件。
另一种方法是不使用ResourcesPath
选项,并将 .resx 文件放在与视图相同的文件夹中,当然遵循命名约定。
根据提供的其他详细信息,表明UI项目将打包为nuget包。
然后将资源文件打包到nuget包中,并在安装时将它们解压缩到目标项目的resources文件夹中。
资源需要位于网站根目录中才能供视图使用,因此您需要引用.nuspec
中的所有文件:
<?xml version="1.0"?>
<package>
<metadata>...
</metadata>
<files>
<!-- Add all resource files -->
<file src="Resources\**\*.resx" target="content\Resources" />
</files>
</package>
答案 1 :(得分:0)
我还没有尝试接受的答案,根据评论,似乎 OP 没有让它发挥作用。我实现了一个类似于 MVC/Razor Pages 使用的视图/页面定位器模式的模式,即可以在 RCL 或单独的程序集中提供资源并使用 ViewLocalizer
,它只会从最高优先级资源。你可以阅读我的实现,看看它是否适合你。