2011-05-18 53 views
3

我使用自定义路线在URL中指定的语言,像这样有一个ASP.NET MVC 3网站:ASP.NET MVC 3定位 - Url.Content

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/Whatever.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

我觉得你的建议是,来到我的脑海里过的第一个。 你可以通过创建自己的构建本地化url的html助手来轻松解决这个问题。请参阅http://develoq.net/2011/how-to-create-custom-html-helpers-for-asp-net-mvc-3-and-razor-view-engine/作为创建自定义html助手的示例。

+0

我落得这样做帮手如你所说的,但我会举行因为我想看看是否有其他人有任何有趣的选择。 – Chris 2011-05-18 19:56:14

+0

如果您所有的本地化图片总是处于相同的文件夹结构中,您可以省略url的第一部分,如@ Url.Localized(“Images/Button_Register.png”),并将其添加到助手类中。 – nickvane 2011-05-18 20:05:42

+0

我确实做到了这一点,谢谢! – Chris 2011-05-18 20:29:55

0

嗯,我还没有真正做到这一点,但当我找到一个真正做过的人时,我遇到了这个帖子。

我在想,您可以扩展StaticFileHandler,在提供实际文件之前,先查找静态文件的某些“本地化”版本。

喜欢的东西,发球时http://yoursite.com/Content/images/logo.jpg

  1. 裂伤请求的URL,看看是否存在/Content/images/es-ES/logo.jpg?
  2. 如果存在,则提供文件
  3. 如果不存在,则可以回滚到默认文化或尝试在提供默认文件之前找到中性文化。

**这可能都会被绑定到/Content/images/logo.jpg必须存在的事实,因为这是StaticFileHandler首先被触发的方式。

如果我最终这样做,我会写一篇博客文章,并在这里分享链接。

UPDATE:没有实现它,因为我所提到的,尽管它结束了一个自定义的HttpHandler代替StaticFileHandler的延伸:http://www.prosoftnearshore.com/2011/10/localizing-files-jpg-css-js-etc-in-asp-net/

+0

有趣的方法。这样做,您不再需要确定备用文化 - 原始位置是默认设置 - 而且您不用我不喜欢这种观点文化意识,我喜欢它! – Chris 2011-11-01 19:15:28

+0

该链接已被打破,我似乎无法通过搜索找到任何机会您的文章仍然在线? – NightOwl888 2013-11-14 18:10:03

+0

@ NightOwl888刚更新了帖子网址。对不起,延迟。 – 2013-11-23 02:18:41