12

嗨,我有一个关于SharedResources文件的问题。它在这里教程浏览:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization,我不知道如果我得到它正确。借助SharedResources进行ASP.NET核心本地化

我应该创建一个SharedResources.cs类,但在那里我应该把它和它应该是空的,或者我需要一些数据来填补呢?

同样的资源文件,我应该创建一个SharedResources.da.resx文件并将所有我的共享字符串?它应该去哪里?

而当我使用IHtmlLocalizer<SharedResources>时,我是否只写@using并将其指向SharedResources.cs所在的命名空间?

我尝试将SharedResources.csSharedResources.da.resx放在Resources文件夹中,并用它将网站语言更改为丹麦语,但它不起作用。使用专门的资源文件,如Index.da.resxIViewLocalizer工作正常,但IHtmlLocalizer<SharedResources>似乎没有工作。

当我查看链接到页面底部的示例项目时,我没有发现使用SharedResources的地方,如果有人用它的示例更新它,那将是非常好的。

以下是我试图做到这一点:

查看/主页/ Index.cshtml:

@using Funkipedia.Resources 
@using Microsoft.AspNetCore.Mvc.Localization 
@inject IHtmlLocalizer<Shared> SharedLocalizer 
... 
<p>@SharedLocalizer["Hei"]</p> 
... 

在ConfigureServices的顶部Startup.cs:

services.AddLocalization(options => options.ResourcesPath = "Resources"); 
services.AddMvc() 
    .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix) 
    .AddDataAnnotationsLocalization(); 

在顶部在Startup.cs中配置:

var supportedCultures = new List<CultureInfo> 
{ 
     new CultureInfo("nb-NO"), 
     new CultureInfo("sv-SE"), 
     new CultureInfo("da-DK") 
}; 

app.UseRequestLocalization(new RequestLocalizationOptions 
{ 
     DefaultRequestCulture = new RequestCulture("nb-NO"), 
     SupportedCultures = supportedCultures, 
     SupportedUICultures = supportedCultures 
}); 

资源文件夹包含名为Shared.csShared.da.resx的空类,其中包含共享字符串。我是否需要将其名称更改为SharedResources.csSharedResources.da.resx

回答

27

好的,经过一番挖掘,甚至更多的试验和错误,我找到了我的问题的答案,并得到了一切工作。这里是我发现的:

我应该创建一个SharedResources.cs类,但我应该把它放在哪里,它应该是空的还是我需要填充一些数据?

答:SharedResources.cs可以放置在项目的根文件夹或资源文件夹,但最重要的是名称空间应设置为项目的根。在我的情况下,namespace Funkipedia。它不需要包含任何数据,只需要类声明。

同样的资源文件,我应该创建一个SharedResources.da.resx文件并将所有我的共享字符串?它应该去哪里?

答:是的,你需要创建一个资源文件名为一样的cs文件,它需要被放在资源文件夹。

而当我使用IHtmlLocalizer<SharedResources>时,我是否只写@using并将其指向SharedResources.cs所在的命名空间?

回答:当谈到在视图中使用IHtmlLocalizer和/或IStringLocalizer你需要.cshtml文件的顶部写:

@using Microsoft.AspNetCore.Mvc.Localization 
@using Microsoft.Extensions.Localization 
@inject IViewLocalizer Localizer 
@inject IStringLocalizer<SharedResources> SharedLocalizer 
@inject IHtmlLocalizer<SharedResources> SharedHtmlLocalizer 

注意@using Microsoft.Extensions.Localization只需要如果你使用IStringLocalizer

我希望这可以帮助那些对ASP.NET Core应用程序的资源文件和本地化可能不熟悉的人。

+4

你是天才! – Max

+0

好,谢谢。我很高兴能够提供帮助。 –

+0

嗨,你有没有Github的例子? – sintetico82

4

我想添加适用于我的团队的设置。它基于与你自己相同的原则(当然),但我相信它允许在文件位置上有更多的灵活性,因为它不会强制你将资源相关的文件放入项目根目录。

我的理解是,IStringLocalizer<T>占位Type,它的全称将被转换成一个相对路径和用于查找实际的资源文件的概念。要进行此转换,它还使用LocalizationOptions.ResourcesPath中的信息(如果有)。

假设你有:

// in ProjectRoot\Startup.cs 

services.AddLocalization(opts => 
{ 
    opts.ResourcesPath = "Localized"; 
}); 

// in ProjectRoot\Area\Whatever\SomeClass.cs 

namespace Com.Company.Project.Area.Whatever 
{ 
    public class SomeClass 
    { 
    public SomeClass(IStringLocalizer<SomeClass> localizer) 
    { 
     // ... 
    } 
    } 
} 

所以这里发生了什么,一步一步,只给一个想法:

  1. SomeClass全称:Com.Company.Project.Area.Whatever.SomeClass
  2. 将其转换成的.resx文件路径:Com\Company\Project\Area\Whatever\SomeClass.resx
  3. 前缀与ResourcesPath内容:Localized\Com\Company\Project\Area\Whatever\SomeClass.resx

这是查找资源文件的实际路径。

所以,一切的一切,你可以把你的SharedResources.cs空类,无论你想,只要你复制它的全名作为项目的根目录下ResourcesPath文件夹下的路径。

在该实例中:

\ 
--Area 
    --Whatever 
    --SomeClass.cs 
--Localized 
    --Com 
    --Company 
     --Project 
     --Area 
      --Whatever 
      --SomeClass.resx 
      --SomeClass.fr.resx 
      --SomeClass.da.resx 

下盖,需要该目录树,因为出RESX文件的生成的类将其命名空间从目录树中,并且还因为串定位器将条使用ResourcesPath为占位符类型添加前缀时使用根名称空间。

+0

这真的很聪明,虽然没有,但非常感谢很多superjos –

+0

很高兴它可以帮助!我也摆弄着没有任何ResourcesPath,认为我可以将resx文件放置在占位符类旁边的同一目录中,但这并不起作用,我不久后就放弃了尝试。 – superjos