有没有办法获得“通用” resx文件?

时间:2018-12-20 14:39:47

标签: c# .net razor .net-core

我有一堆用户界面元素,它们会重复使用翻译后的字词,例如日语,法语,德语等带有“单击此处”或“查看更多”的按钮。

是否可能有resx文件,我可以在其中存储这些术语并在任何地方重复使用,而不仅是在它所针对的页面(和文化)上?

1 个答案:

答案 0 :(得分:1)

此答案说明了如何使用.net核心方式(使用本地化程序和依赖项注入)来使用共享资源。

对此详细说明:Globalization and localization in ASP.NET Core

基本上,您可以在项目中的任何地方创建一个空类,并使用一个名称来对资源进行分组:

public class SharedResource
{
}

您也可以有多个类来拥有不同的组,例如

public class CommonButtonTexts
{
}

public class CommonErrorMessages
{
}

如果随后要使用文本,请为给定的类引用Localizer。 C#代码中的示例,例如Controller或一些帮助器类中的示例:

public class HomeController : Controller
{
    private readonly IStringLocalizer<SharedResource> _sharedLocalizer;
    private readonly IStringLocalizer<CommonButtonTexts> _commonButtonTextsLocalizer;
    private readonly IStringLocalizer<CommonErrorMessages> _commonErrorMessagesLocalizer;

    // Localizers are created via Dependency Injection
    public HomeController(IStringLocalizer<SharedResource> sharedLocalizer, IStringLocalizer<CommonButtonTexts> commonButtonTextsLocalizer,
        IStringLocalizer<CommonErrorMessages> commonErrorMessagesLocalizer)
    {
        _sharedLocalizer = sharedLocalizer;
        _commonButtonTextsLocalizer = commonButtonTextsLocalizer;
        _commonErrorMessagesLocalizer = commonErrorMessagesLocalizer;
    }

    public IActionResult Index()
    {
        string someString = _sharedLocalizer["ProductName"];
        string yesButtonCaption = _commonButtonTextsLocalizer["Yes"];
        string overworkedError = _commonErrorMessagesLocalizer["The programmer was overworked and didn't finish this code."];

        // Do something with the strings

        return View();
    }
}

在Razor视图中使用它的示例:

@using Microsoft.Extensions.Localization;

@inject IStringLocalizer<SharedResource> SharedLocalizer
@inject IStringLocalizer<CommonButtonTexts> CommonButtonTextsLocalizer
@inject IStringLocalizer<CommonErrorMessages> CommonErrorMessagesLocalizer

<p>@SharedLocalizer["ProductName"]</p>
<p>@CommonButtonTextsLocalizer["Yes"]</p>
<p>@CommonErrorMessagesLocalizer["The programmer was overworked and didn't finish this code."]</p>

然后将根据我们使用的空类在资源文件中查找翻译。例如,在以上示例中,英语翻译将取自SharedResource.en.resxCommonButtonTexts.en.resxCommonErrorMessages.en.resx。 (将* .resx文件与其他特定于视图的资源文件放在同一目录中。)