Localization Asp.Net核心本地化资源位于单独的程序集中
我正在尝试使用.NET Core的新本地化功能,但除了Microsoft在此提供的简单示例之外 我在一个单独的项目ProjectA.Controllers中有我的控制器,而在一个公共项目ProjectB.Localization中有一个共享资源类。我已经按照文档中的规定配置了启动类 我不清楚我的资源文件的名称以及确切的位置。我已经配置了存储在“Resources”目录中的选项。这是在Web项目中还是在我的ProjectB.Localization中我的SharedResource类在哪里?文档说,如果它是一个单独的程序集,那么应该使用完整的名称空间。所以我把它命名为“WorldCart.Facilities.Localization.SharedResource.es.resx”,并把它放在网站的资源文件夹中 当我运行web应用程序并在home controller中调试时,我没有得到翻译的字符串,而是得到了英文版本Localization Asp.Net核心本地化资源位于单独的程序集中,localization,asp.net-core,Localization,Asp.net Core,我正在尝试使用.NET Core的新本地化功能,但除了Microsoft在此提供的简单示例之外 我在一个单独的项目ProjectA.Controllers中有我的控制器,而在一个公共项目ProjectB.Localization中有一个共享资源类。我已经按照文档中的规定配置了启动类 我不清楚我的资源文件的名称以及确切的位置。我已经配置了存储在“Resources”目录中的选项。这是在Web项目中还是在我的ProjectB.Localization中我的SharedResource类在哪里?文档说
有什么想法吗?很晚才回答,但这可能会帮助某人。。。 我也遇到过类似的情况,我必须将资源文件放在单独的公共程序集中,而不是放在mail web/api项目(Core 2.1)中。原因是,我可能正在使用来自其他程序集(如Business或DAL layer)的本地化资源来抛出警告/错误/信息消息。这就是我所做的: 假设我的web项目名称空间是
MyApp.web
,我的资源位于单独的类库MyApp.resources
中。在资源库中,创建一个文件夹(可选),说“Messages”,然后创建一个类Messages.cs
。按照命名约定在同一文件夹内创建资源文件。例如,Messages.fr.resx
在主项目的ConfigureServices
方法中,添加不带任何资源路径的本地化*:
services.AddLocalization();
服务。配置(
选项=>
{
/*您的配置*/
var supportedCultures=新列表
{
新文化信息(“en”),
新文化信息(“fr”)
};
opts.DefaultRequestCulture=新的RequestCulture(“en”、“en”);
//格式化数字、日期等。
opts.SupportedCultures=SupportedCultures;
//我们已经本地化的UI字符串。
opts.supporteduccultures=支持的文化;
});
在Configure
方法中,添加app.UseRequestLocalization()代码>
在控制器中,注入IStringLocalizer-localizer
,其中Messages
是您在资源库中创建的类。所有本地化资源都将在本地化器
对象中可用,即本地化器[“您的密钥或默认文本”]
- 未在
services.AddLocalization()中添加任何ResourcePath
的原因代码>选项是由于资源文件(Messages.fr.resx
)和虚拟类(Messages.cs
)位于同一路径。框架将检查与类相关的资源文件,我们在IStringLocalizer
中指定了该类。如果Messages.cs
位于MyApp.Resources
lib的根文件夹中,并且资源文件位于文件夹“xyz”中,则配置应为services.AddLocalization(ops=>ops.ResourcesPath=“xyz”)代码>
更新-回复评论中的查询:
MVC视图
在MVC视图中,有文档记录的方法使用IViewLocalizer
,但不支持资源共享。因此,您可以在视图中插入IStringLocalizer
,以使用共享资源。例如:
@inject IStringLocalizer定位器
信息-@localizer[“MVC视图中的共享资源访问”]
数据注释
为了在数据批注中使用共享资源,可以在服务中使用factory方法:
services.AddMvc()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
.AddDataAnnotationsLocalization(选项=>{
options.DataAnnotationLocalizerProvider=(类型,工厂)=>
创建(消息的类型);
});
其中typeof(Messages)
中的Messages
是您的共享资源虚拟类。我正在加载。Es已添加到支持的区域性中。您发现了什么吗?我想实现我自己的资源查找器,以便能够将资源放在控制器或视图文件夹中,然后在找不到字符串时回切到全局资源。。。我什么也没发现,但我继续面对其他挑战,没有回头看。Microsoft文档应该得到改进,并可能更好地解决此问题。我所发现的只是使用resourcepath指向“”。因此,资源位于正确的目录中,无需使用完整的命名空间。但我希望找到一种实现resourceLocator或resourceFinder的方法。Fow现在的资源是这样工作的……您是否有任何资源(官方或非官方)用于此方法?我希望你能用一个更好的文档来记录它。@ibubi-我找不到任何相关的资源或文档。最终得到了类似的要求并自己解决了。另一个博客采用了不同的方法(),我有点不喜欢。我看到您在api项目中实现了这一点,因此viewmodels上的数据注释可能不在您的范围内,但是您知道这种方法包括通过数据注释的模型本地化吗?对于mvc视图,IViewLocalizer
如果打算继续使用传统方法而不是共享资源,则可以实现。如果需要示例,请告诉我,我可以为此更新答案。非常感谢@Developer!!我觉得.NETCore的文档很糟糕,它只触及了真实世界场景的表面。感谢像你这样的人真的做出了