11

很难找到这个特定问题的答案,所以在这里弹出它:

我们希望建立完全特定于语言的网址,这意味着

www.mysite.com/EN

www.mysite.com/DE

这是在 RouteConfig 中完成的

url: "{language}/{controller}/{action}/{id}"

但接下来是棘手的部分:

www.mysite.com/EN/Categories

www.mysite.com/DE/Kategorien

即使控制器名称以多种语言出现,但指向同一个控制器。这甚至可能吗?

4

1 回答 1

17

好吧,这是部分可能的(仅限语言部分)。不同语言的控制器名称绝对是一个有趣的点,但我认为很难做到这一点。想想像阿拉伯语和希伯来语这样的比迪语会是什么样子。在不同的语言中使用控制器可能是一个好主意,但你会给自己造成严重破坏,我相信你必须改变底层的 MVC 结构才能实现这一点。

语言更改部分很容易,可以像下面这样完成。

你可能想看的是全球化。基本上语言部分对应于当前线程 UI 文化。您需要的是以下内容:

  1. 定义一条路线,如下所示:

    var lang = System.Threading.Thread.CurrentThread.CurrentUICulture.Name;
    
    routes.MapRoute(
        name: "Default",
        url: "{language}/{controller}/{action}/{id}",
        defaults: new { language = lang, controller = "Home", 
                        action = "Index", id = UrlParameter.Optional }
     );
    
  2. Application_AcquireRequestState像这样注册并定义它:

    protected void Application_AcquireRequestState()
    {
        var routes = RouteTable.Routes;
    
        var httpContext = Request.RequestContext.HttpContext;
        if (httpContext == null) return;
    
        var routeData = routes.GetRouteData(httpContext);
    
        var language = routeData.Values["language"] as string;
        var cultureInfo = new CultureInfo(language);
    
        System.Threading.Thread.CurrentThread.CurrentCulture = cultureInfo;
        System.Threading.Thread.CurrentThread.CurrentUICulture = cultureInfo;
    }
    

    尽管CurrentUICulture您需要切换语言从资源文件加载信息,但您也应该将 ; 更改CurrentCulture为相同的CultureInfo

  3. 最后,确保您有相应的资源文件和备用资源文件。

我使用Name了属性,CultureInfo所以您的德语将是 de-DE、English en-US 等。这应该可以解决问题。

如果您需要更多信息,我可以上传一个示例 MVC 项目供您检查。

更新:做你想做的一种粗略的方法是将路线段的顺序反转为如下所示:

routes.MapRoute(
    name: "NewDefault",
    url: "{language}/{id}/{action}/{controller}",
    defaults: new { language = lang, controller = "Home", action = "Index", id = "Category"}
);

这样您就可以发出以下请求http://www.your_url.com/de/Kategorien。在这种情况下,类别映射到id而不是控制器。您的控制器使用英语或德语(取决于您如何命名),但用户会看到不同的语言。在后台,您的视图可能是这样的:

public ActionResult Index(string id, string categoryName)
{
    // Fetch data based on category name (categoryName)
    return View();
}

您可以将其他信息作为参数传递,但您需要调整您的路线,使其看起来像:{language}/{category}/{subcategory}/{action}/{controller}

只要知道从长远来看这可能会成为颈部疼痛,如果您尝试这样做,请确保将其记录好。

于 2013-02-21T16:36:22.470 回答