如何在Asp.Net内核的Razor类库中使用本地化
我已尝试在以下项目结构中使用Asp.Net Core创建Razor类库: 在我的web应用程序中,我在如何在Asp.Net内核的Razor类库中使用本地化,razor,asp.net-core,asp.net-core-localization,Razor,Asp.net Core,Asp.net Core Localization,我已尝试在以下项目结构中使用Asp.Net Core创建Razor类库: 在我的web应用程序中,我在Startup类中使用了这些本地化设置: services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1) .AddViewLocalization( LanguageViewLocationExpanderFor
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);
不幸的是,结果只是字符串“Title”。我无法从Razor类库加载这些resx文件
如何在Razor类库中使用上述本地化
更新:这是一个非常相似的用例--它提供了一些示例。您似乎忘记了使用
添加本地化
正确配置本地化
使用文档中提供的详细信息
参考文献
配置本地化
本地化是在ConfigureServices
方法中配置的:
示例图像中显示的资源文件的路径遵循给定的路径命名约定
您正在使用设置为“资源”的ResourcesPath
选项。这应该允许视图在“Resources”文件夹的相对路径中找到资源文件
另一种方法是不使用ResourcesPath
选项,并按照命名约定将.resx文件放置在与视图相同的文件夹中
根据提供的其他详细信息,表明UI项目将打包为nuget包
然后将资源文件打包到nuget包中,并在安装时将其解压缩到目标项目的resources文件夹中
这些资源必须位于站点根目录中,才能供视图使用,因此您需要引用中的所有文件。nuspec
:
...
参考资料我还没有尝试过公认的答案,根据评论,OP似乎没有成功。我实现了一个类似于MVC/Razor Pages使用的视图/页面定位器模式的模式,即资源可以在RCL或单独的程序集中提供,并使用
ViewLocalizer
,它只会从最高优先级的资源中找到匹配的资源字符串。您可以阅读我的实现,看看它是否适合您
我尝试了您的代码片段,但毫无疑问,它不起作用。我有两个项目-第一个项目是web应用程序,第二个是RazorUI,其中是带有“资源”的文件夹。我已将razor UI引用到我使用您的设置的web应用程序项目。资源与web项目引用的razor ui程序集是否存在问题?@Jenan resources(.resx)需要位于根项目库中才能访问。所以这就意味着他们需要在web项目中。@Jenan我以为你在使用RazorPages项目,而不仅仅是引用另一个项目中的razor页面。这将导致引用资源文件时出现问题。我的想法是使用UI创建一个单独的DLL-它提供了新的razor类库,但问题是共享资源文件。如何解决?与UI razor类库共享resx文件?只是为了测试,请尝试将资源放在根项目中,并将视图保留在单独的库中,然后查看它是否有效。
@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer
<h1>@Localizer["Title"]</h1>
services.AddLocalization(options => options.ResourcesPath = "Resources"); //<<< This is required
services
.AddMvc()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
.AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
.AddDataAnnotationsLocalization();
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();