我使用自定义路线在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>
我落得这样做帮手如你所说的,但我会举行因为我想看看是否有其他人有任何有趣的选择。 – Chris 2011-05-18 19:56:14
如果您所有的本地化图片总是处于相同的文件夹结构中,您可以省略url的第一部分,如@ Url.Localized(“Images/Button_Register.png”),并将其添加到助手类中。 – nickvane 2011-05-18 20:05:42
我确实做到了这一点,谢谢! – Chris 2011-05-18 20:29:55