У меня есть сайт 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>