Подтвердить что ты не робот

Локализация MVC4. Доступ к resx из представления

По моему мнению, я хотел бы получить доступ к строкам ресурсов из определенного локального ресурса в этом файле. Так же, как вы знаете это из веб-форм:

(string)GetLocalResource("Title");

Безболезненный и гладкий. Структура обрабатывает файл .resx для получения из расширения кода информации о культуре (.en-EN.resx).

Возможно ли это в MVC4 с представлением Razore? И как?

Iv'e заметил, что я могу установить свойство Custom Tool в файле .resx на PublicResXFileCodeGenerator. Таким образом, я могу получить к нему доступ из представления. Пример: Я создал 2 файла ресурсов для index.cshtml на датском и английском языках. Так же, как и в веб-формах. Вот что я хотел бы написать (Custom Tool Name свойство, установленное в 'ViewResource'):

@ViewResource.Title

Bam. Если нынешняя культура датская, титул будет "Forside", а если английский, это будет "Главная". Но вместо этого единственными параметрами, которые мне заданы, является выбор конкретного файла. И оттуда выберите нужную строку:

@ViewResource.Index_cshtml_en-EN_resx.Title

Это не динамический. Поэтому я подумал, что могу сделать класс расширения, который каким-то образом заменит en-EN/da-DK. Но это действительно похоже на относительно много работы для чего-то настолько "простого" и уже хорошо и легко интегрируется в веб-формы. Должен быть другой путь. Разумеется, команда mvc имеет для нас как можно более умный механизм:)

4b9b3361

Ответ 1

Я использовал специальную папку .NET App_LocalResources.

Ниже приведены шаги

Добавьте файлы .resx в эту папку (например: Resource.resx, Resource.es-ES.resx)

Щелкните правой кнопкой мыши по каждому файлу .resx и выберите properties и убедитесь, что выбрано следующее:

Build Action: Embedded Resource 
Custom Tool: PublicResXFileCodeGenerator
Custom Tool Namespace: Resources

Затем в вашем представлении вы можете использовать пространство имен Resources для доступа к тексту в вашем файле .resx

<h2>@Resources.Resource.Global_Title<h2>

@Resources, потому что это имя, которое вы указали в Custom Tool Namespace и .Resource, потому что это имя файла .resx

Также убедитесь, что для ресурсов установлено значение Public

Для доступа к ресурсам из любой модели просто добавьте одну строку

using Resources;  //<<-- This line

namespace Concordia_CRM.Models
{
    public class SolicitudDemo
    {
        [Required]
        [Display(Name = "SD_NombreEmpresa", ResourceType = typeof(Resource))]
        public string NombreEmpresa { get; set; }

...
}

Более подробную информацию можно найти на этой странице .

Ответ 2

Если вы создаете папку с именем f.ex. "Ресурсы" и добавьте 2 файла Index.resx и Index.da-DK.resx, вы должны иметь возможность обращаться к ним, как это, в вашем режиме бритвы.

@Resources.Index.Title

Затем в зависимости от текущей культуры потоков он выберет текст из правильного файла

Ответ 3

В "Дизайнере ресурсов" в Visual Studio сверху у нас есть Combo Box с меткой: модификатор доступа, обычно он настроен на: internal, чтобы заставить его работать, установить его в: Public.

Ответ 4

Мне никогда не приходилось работать. Я закончил использование .net-папок "App_LocalResources".

Ответ 5

terjetyl поставил меня на правильный путь, но мне нужно было сделать "кодирование" (ах орехи), чтобы заставить его работать. Моя настройка - Visual Studio 2013, MVC 5, Razor.

  • Щелкните правой кнопкой мыши на вашем представлении, содержащем папку, выберите "Добавить" > "Добавить папку ASP.NET" > "App_LocalResources"

  • Добавьте сюда два файла ресурсов: Index.cshtml.resx и Index.cshtml. fr-FR.resx(при условии, что ваше представление называется "Index", и вы хотите французские переводы), Проверьте свойства файла и убедитесь, что они установлены в Build Action=Content и Custom Tool=(blank)

  • Дважды щелкните файлы resx и введите ключ/значения

  • Создайте метод расширения HtmlHelper.


public static class HtmlExtensions
{
    public static MvcHtmlString Translate(this HtmlHelper htmlHelper, string key)
    {
        var viewPath = ((System.Web.Mvc.RazorView)htmlHelper.ViewContext.View).ViewPath;
        var culture = System.Threading.Thread.CurrentThread.CurrentCulture;

        var httpContext = htmlHelper.ViewContext.HttpContext;
        var val = (string)httpContext.GetLocalResourceObject(viewPath, key, culture);

        return MvcHtmlString.Create(val);
    }
}

  1. Используйте расширение в своем представлении:

    <p>@Html.Translate("MyKey")</p>

Чтобы объяснить, помощник получает виртуальный путь вашего представления и передает его в HttpContext.GetLocalResourceObject(), который решает, какой файл ресурсов использовать (и деградирует изящно).

Последнее, убедитесь, что это находится в вашем web.config:

<system.web>
    <globalization culture="auto" uiCulture="auto" enableClientBasedCulture="true" />
    ...

Я попытался сохранить это как можно проще. Однако имейте в виду, что, используя этот пример, французские культуры, отличные от fr-FR (например, fr-CA), по умолчанию будут использовать базовый resx. Если вы хотите, чтобы он был умнее этого, требуется больше кода - я могу включить его по запросу.

Ответ 6

Я использовал его с помощью @MyApp.Resources.Resources.Title.