Localization Asp.Net核心本地化资源位于单独的程序集中

Localization Asp.Net核心本地化资源位于单独的程序集中,localization,asp.net-core,Localization,Asp.net Core,我正在尝试使用.NET Core的新本地化功能,但除了Microsoft在此提供的简单示例之外 我在一个单独的项目ProjectA.Controllers中有我的控制器,而在一个公共项目ProjectB.Localization中有一个共享资源类。我已经按照文档中的规定配置了启动类 我不清楚我的资源文件的名称以及确切的位置。我已经配置了存储在“Resources”目录中的选项。这是在Web项目中还是在我的ProjectB.Localization中我的SharedResource类在哪里?文档说

我正在尝试使用.NET Core的新本地化功能,但除了Microsoft在此提供的简单示例之外

我在一个单独的项目ProjectA.Controllers中有我的控制器,而在一个公共项目ProjectB.Localization中有一个共享资源类。我已经按照文档中的规定配置了启动类

我不清楚我的资源文件的名称以及确切的位置。我已经配置了存储在“Resources”目录中的选项。这是在Web项目中还是在我的ProjectB.Localization中我的SharedResource类在哪里?文档说,如果它是一个单独的程序集,那么应该使用完整的名称空间。所以我把它命名为“WorldCart.Facilities.Localization.SharedResource.es.resx”,并把它放在网站的资源文件夹中

当我运行web应用程序并在home controller中调试时,我没有得到翻译的字符串,而是得到了英文版本


有什么想法吗?

很晚才回答,但这可能会帮助某人。。。 我也遇到过类似的情况,我必须将资源文件放在单独的公共程序集中,而不是放在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的文档很糟糕,它只触及了真实世界场景的表面。感谢像你这样的人真的做出了