Локализация 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 имеет для нас как можно более умный механизм:)
Ответы
Ответ 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);
}
}
-
Используйте расширение в своем представлении:
<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
.