ASP.NET MVC 3 локализация - Url.Content - PullRequest
3 голосов
/ 18 мая 2011

У меня есть сайт ASP.NET MVC 3, использующий пользовательский маршрут для указания языка в URL, например:

routes.MapRoute("Default", "{culture}/{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", culture = "en", id = UrlParameter.Optional });

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

protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
    var culture = filterContext.RouteData.Values["culture"] ?? "en";
    var cultureInfo = CultureInfo.GetCultureInfo((string)culture);
    Thread.CurrentThread.CurrentCulture = cultureInfo;
    Thread.CurrentThread.CurrentUICulture = cultureInfo;
    base.OnActionExecuting(filterContext);
}

Везде, где мне нужна строка, специфичная для локали, я ссылаюсь на ресурс соответствующим образом:

<img src="@Url.Content(Resources.Paths.ChallengeLogo)" alt="@Resources.Strings.AltChallengeLogo" class="logo" />

Однако для изображений URL (src = "...") будет соответствовать соглашению "~ / Content / Culture / Images / Wh what.jpg", и я бы предпочел не поддерживать файл ресурсов вручную. для каждого местоположения изображения. Короче говоря, я бы предпочел:

<img src="@Url.Content("Images/ChallengeLogo.png")" alt="@Resources.Strings.AltChallengeLogo" class="logo" />

В этом сценарии метод Url.Content будет применять соглашение о пути и преобразовывать значение атрибута src, например:

/Content/en-US/Images/ChallengeLogo.png
/Content/en-GB/Images/ChallengeLogo.png
/Content/de/Images/ChallengeLogo.png
etc...

Мне не нужно специально использовать Url.Content. Я более чем готов создать метод расширения для этой цели, но я не уверен, что я использую лучший подход. Какой здесь стандартный подход?

Редактировать: в итоге я создал помощника. У помощника есть дополнительное преимущество: он проверяет, что путь к текущей культуре действительно существует, или, при необходимости, прибегает к родительской / стандартной культуре. Код ниже:

private static CultureInfo _defaultCulture = CultureInfo.GetCultureInfo("en");

public static string Localized(this UrlHelper url, string pathTemplate)
{
    var server = url.RequestContext.HttpContext.Server;
    var culture = Thread.CurrentThread.CurrentUICulture;
    var localizedPath = string.Format(pathTemplate, culture.Name);
    var physicalPath = server.MapPath(localizedPath);

    while (!File.Exists(physicalPath) && culture.Parent != null)
    {
        culture = culture.Parent;
        localizedPath = string.Format(pathTemplate, culture.Name);
        physicalPath = server.MapPath(localizedPath);
    }

    if (!File.Exists(physicalPath))
        localizedPath = string.Format(pathTemplate, _defaultCulture.Name);

    return url.Content(localizedPath);
}

На мой взгляд, я могу использовать этот помощник следующим образом:

<div class="toolbox">

    <a href="#" class="button register">
        <img src="@Url.Localized("~/Content/Localized/{0}/Images/Button_Register.png")" 
             alt="@Resources.Strings.AltRegisterButton" /></a>

    <a href="#" class="button login">
        <img src="@Url.Localized("~/Content/Localized/{0}/Images/Button_Login.png")" 
             alt="@Resources.Strings.AltLoginButton" /></a>

</div>

Ответы [ 2 ]

2 голосов
/ 18 мая 2011

Думаю, ваше предложение первое, что пришло мне в голову.Вы можете легко решить эту проблему, создав собственный помощник html, который создает локализованный URL.См. http://develoq.net/2011/how-to-create-custom-html-helpers-for-asp-net-mvc-3-and-razor-view-engine/ в качестве примера для создания пользовательского помощника HTML.

0 голосов
/ 31 октября 2011

Ну, на самом деле я этого не делал, но наткнулся на этот пост, когда искал кого-то, кто действительно это делал.

Я думал, что вы могли бы расширить StaticFileHandler, чтобы сначала искать какую-то «локализованную» версию статического файла, прежде чем обслуживать реальный файл.

Что-то похожее, при подаче http://yoursite.com/Content/images/logo.jpg

  1. Измените запрашиваемый URL и посмотрите, существует ли /Content/images/es-ES/logo.jpg?
  2. Если существует, тогда подайте файл
  3. Если не существует, то либо откатитесь к культуре по умолчанию, либо попробуйте найти нейтральную культуру, прежде чем использовать по умолчанию.

** это можетвсе должны быть связаны с тем фактом, что /Content/images/logo.jpg ДОЛЖЕН существовать, так как именно так StaticFileHandler будет запускаться в первую очередь.

Если я это сделаю, я напишувверх в блоге и поделитесь ссылкой здесь.

ОБНОВЛЕНИЕ: Реализовал ли он, как я уже упоминал, хотя в конечном итоге это был пользовательский HttpHandler вместо расширения StaticFileHandler: http://www.prosoftnearshore.com/2011/10/localizing-files-jpg-css-js-etc-in-asp-net/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...