asp.net-mvc - 使 URL 特定于语言(通过路由)

标签 asp.net-mvc localization asp.net-mvc-routing globalization

很难找到这个具体问题的答案,所以我会在这里弹出它:

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

www.mysite.com/EN

www.mysite.com/DE

这是在 RouteConfig 中通过

完成的
url: "{language}/{controller}/{action}/{id}"

但是棘手的部分是:

www.mysite.com/EN/Categories

www.mysite.com/DE/Kategorien

即使 Controller 名称以多种语言显示,但指向同一个 Controller 。这可能吗?

最佳答案

嗯,这部分是可能的(仅语言部分)。不同语言的 Controller 名称绝对是一个有趣的点,但我认为很难实现这一点。想象一下阿拉伯语和希伯来语等比迪语会是什么样子。在不同的语言中使用 Controller 可能是一个好主意,但是您会给自己造成严重破坏,并且我相信您必须更改底层 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. 最后,确保您有相应的资源文件和后备资源文件。

我使用了 CultureInfoName 属性,因此德语将是 de-DE,英语将是 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 。在这种情况下,Kategorien 映射到 id 而不是 Controller 。您的 Controller 保留英语或德语(取决于您的命名方式),但用户看到的是不同的语言。在后台你的 View 可能是这样的:

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

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

只要知道,从长远来看,这可能会让人头疼,如果你尝试这样做,那么请确保你很好地记录下来。

关于asp.net-mvc - 使 URL 特定于语言(通过路由),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15006572/

相关文章:

c# - 在 Asp.net MVC 应用程序中将信息传递给客户端而不刷新页面

javascript - 如何在 MVC 中使用 ajax 使用新从服务器获取的数据重新初始化 dataTables

javascript - 类型错误 : undefined is not an boject (evaluating '_ref$i18n.currentLanguage' )

asp.net-mvc - 枚举 ASP.NET MVC RouteTable 路由 URL

c# - ASP.NET 中的并发线程和锁

c# - MVC 获取人名并将其放入文本框

iphone - NSLocalizedString "localizedStringForKey:value:table:"

language-agnostic - 检测 rtf 标记中的多字节和汉字

asp.net-mvc - MVC 路由不起作用

c# - 是否可以在同一路由中使用 2 种方法(GET 和 POST)?