Как настроить резервный файл ресурсов для представлений

Используя IViewLocalizer, я хотел бы реализовать локализацию представления с файлом ресурсов по умолчанию или резервным для слов и фраз, которые появляются на нескольких страницах, например, изменить, добавить, удалить... Я не хочу добавлять эти повторяющиеся фразы в файл ресурсов из всех представлений, где они появляются, поэтому резервный файл ресурсов действительно пригодится, но я просто не могу найти никаких решений о том, как это сделать.

В настоящее время я использую @inject IViewLocalizer Localizer в своих представлениях и получаю локализованные фразы с @Localizer["ResourceName"] из файлов ресурсов:

Resources/Views/{ControllerName}/{ViewName}.{langCode}.resx

Это прекрасно работает для каждого отдельного представления и частичного представления. Теперь я хотел бы иметь файл ресурсов в папке Resources/Views или Resources, который действует как резервный файл ресурсов.

Так, например, если я скажу @Localizer["Edit"] в одном из моих представлений, а ресурс «Редактировать» не найден в Resources/Views/{ControllerName}/{ViewName}.{langCode}.resx или Resources/Views/{ControllerName}/{ViewName}.resx, он вернется к этому файлу по умолчанию, чтобы я мог использовать его во всех моих представлениях, которым нужен ресурс " Редактировать".

Я уже пробовал с Resources/Resource.{langCode}.resx, но, похоже, это не дает никакого эффекта.


person Biserka Zinreich    schedule 11.08.2016    source источник
comment
Это хороший вопрос. Попробуйте опубликовать этот вопрос в репозитории aspnet/MVC на GitHub.   -  person Kiran Challa    schedule 12.08.2016
comment
поведение по умолчанию в предыдущих платформах/стеках .NET заключалось в том, чтобы иметь файл ресурсов без культуры в нем, то есть Resource.resx. Также обратите внимание, что при отсутствии подходящей локали будет возвращена строка, помещенная в @Localizer["string"], которая также используется в официальных примерах iirc: Означает: вместо строк сообщений предлагают напрямую использовать строку по умолчанию в качестве ключей, т.е. @Localizer["This is an default locale string"] и переопределить это через локаль. Пример: github.com/aspnet/Localization/blob/ разработка/образцы/   -  person Tseng    schedule 12.08.2016
comment
Я знаю об использовании строки по умолчанию в качестве ключа, но это совсем не помогает мне локализовать повторяющиеся фразы! Это именно то, чего я не хочу делать. Я не хочу переопределять фразу в локали для определенного представления, потому что она повторяется в большинстве моих представлений. Мне нужен файл ресурсов по умолчанию для всех представлений, в которых используются повторяющиеся фразы, поэтому меня интересует упомянутый вами Resource.resx. Я хотел бы использовать resource.resx по умолчанию для каждого языка.   -  person Biserka Zinreich    schedule 12.08.2016
comment
Спасибо за предложение Киран Чалла. Я так и сделал.   -  person Biserka Zinreich    schedule 12.08.2016


Ответы (1)


У меня была похожая проблема, когда я начал с локализации. Если на вашем сайте много повторяющихся фраз и слов, лучше поместить их в файл SharedResource.

Вы делаете это, создавая файл SharedResource.[LANG_CODE].resx в папке Resources. Затем вам нужно создать фиктивный класс, который вы назовете SharedResource, и поместить его в корень пространства имен вашего проекта. Итак, если ваш проект называется LocalizationTest, тогда класс будет выглядеть примерно так:

namespace LocalizationTest
{
    public class SharedResource
    {
    }
}

Тогда все, что вам нужно сделать, чтобы получить доступ к общему ресурсу в вашей модели или представлении, — это создать IStringLocalizer<SharedResources> и использовать его. Как это:

public class HomeController : Controller
{
    private readonly IStringLocalizer<HomeController> _localizer;
    private readonly IStringLocalizer<SharedResource> _sharedLocalizer;

    public HomeController(IStringLocalizer<HomeController> localizer,
                   IStringLocalizer<SharedResource> sharedLocalizer)
    {
        _localizer = localizer;
        _sharedLocalizer = sharedLocalizer;
    }

    public IActionResult Index()
    {
        ViewData["message"] = _sharedLocalizer["Hello!"];
        return View();
    }
}

Или в представлении: @inject IViewLocalizer Localizer @inject IStringLocalizer SharedLocalizer

@{
    ViewData["Title"] = SharedLocalizer["Hello!"];
}

<h1>@Localizer["Welcome message"]</h1>

Я пропустил операторы импорта и использования для краткости.

Дополнительную информацию о SharedResource и общей локализации можно найти здесь: Документация Microsoft или в ответе на вопрос, который я разместил здесь Мои вопросы и ответы.

person Daniel Aaron Salwerowicz    schedule 24.03.2017