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