2017-02-01 27 views
2

在下面的程序,以獲取資源字符串我使用_localizer [「關於標題」],其中「關於標題」是一個神奇的字符串。如何避免使用這樣的字符串?有沒有強類型的方法?如何獲得資源字符串在asp.net核心強類型的方法是什麼?

using Microsoft.AspNetCore.Mvc; 
using Microsoft.Extensions.Localization; 

namespace Localization.StarterWeb.Controllers 
{ 
    [Route("api/[controller]")] 
    public class AboutController : Controller 
    { 
     private readonly IStringLocalizer<AboutController> _localizer; 

     public AboutController(IStringLocalizer<AboutController> localizer) 
     { 
      _localizer = localizer; 
     } 

     [HttpGet] 
     public string Get() 
     { 
      return _localizer["About Title"]; 
     } 
    } 
} 
+0

resx資源支持本地化和值的訪問是強類型的感謝Codegen爲您創建類。您可以在Visual Studio中添加來自Add> New Item的資源文件。 – Oliver

回答

4

如果你想避免使用硬編碼字符串(鍵)來查找本土化轉換,你可以創建一個LocalizationKeys類,它包含查找鍵爲您服務。然後,您可以充分利用C#6nameof運營商。這將有助於緩解「魔術串」的擔憂。

public static class LocalizationKeys 
{ 
    public const string AboutTitle = nameof(AboutTitle); // Note: this is "AboutTitle" 

    // ... other keys here 
} 

然後,你可以消耗它在任何地方。其中一個好處是,由於這是類的成員,因此如果關鍵更改,則可以使用常見的重構工具安全地替換對其的所有引用,而不是嘗試對「魔術字符串」執行全局字符串替換。另一個好處是,你會得到訪問類時使用智能感知。我想可以考慮這個「強類型」。

你會消耗它是這樣:

[Route("api/[controller]")] 
public class AboutController : Controller 
{ 
    private readonly IStringLocalizer<AboutController> _localizer; 

    public AboutController(IStringLocalizer<AboutController> localizer) 
    { 
     _localizer = localizer; 
    } 

    [HttpGet] 
    public string Get() 
    { 
     return _localizer[LocalizationKeys.AboutTitle]; 
    } 
} 

如果你真的想要得到花哨C#6,你還可以利用一個靜態的使用。這將允許您引用您指定類型的成員。最後,對於簡單的「單行」返回,我們可以使它們成爲表達體。例如:

using Microsoft.AspNetCore.Mvc; 
using Microsoft.Extensions.Localization; 
using static Localization.StarterWeb.LocalizationKeys; // Note: static keyword 

namespace Localization.StarterWeb.Controllers 
{ 
    [Route("api/[controller]")] 
    public class AboutController : Controller 
    { 
     private readonly IStringLocalizer<AboutController> _localizer; 

     public AboutController(IStringLocalizer<AboutController> localizer) 
     { 
      _localizer = localizer; 
     } 

     [HttpGet] 
     public string Get() => _localizer[AboutTitle]; // Note: omission of qualifier 
    } 
} 
相關問題