1

所以基本上我想实现一个具有以下场景的多语言网站:

  • 使用 ASP.NET MVC 3
  • 大多数语言都使用资源文件,因此它们使用相同的视图,但是也有许多特定于国家/地区的视图(即特定于语言文化)并且并非对所有人都可用。
  • 示例网址:http://localhost/en-us/{area}/{controller}/{action}/{id}

MVC 文件夹结构如下:

- Areas
    - Channel1
        - Controllers
        - Content
        - Views
            - en-us
                - View1.cshtml
                - View2.cshtml
            - zh-cn
                - View1.cshtml
                - View2.cshtml
                <b>- Special.cshtml</b>

    - Channel2
       ....(similar folder structure)
- ....

我认为必须有一种方法可以将“en-us”定义为像 {lang} 这样的参数并在区域外的默认控制器中做出决定 - 但是我是 asp.net MVC 新手,我该怎么做?

4

3 回答 3

0

这是一篇很棒的文章,其中包含有关如何在 ASP.NET MVC 3 上实现全球化的实用建议

http://www.hanselman.com/blog/GlobalizationInternationalizationAndLocalizationInASPNETMVC3JavaScriptAndJQueryPart1.aspx

于 2012-05-02T16:21:45.847 回答
0

没有很好的方法可以做到这一点,但这是可能的。首先,您需要稍微重新排列您的视图——它们仍然必须有一个控制器。假设您拥有 (View1.cshtmlView2.cshtml) 的文件存在于您的家庭控制器中。把它们放在这里:

- Views
  - Home
    - en-us
      - View1.cshtml
      - View2.cshtml
    - zh-cn
      - View1.cshtml
      - View2.cshtml

然后,为以下视图创建自定义路由Global.asax.cs

routes.MapRoute(
    "MultiLingual",
    "{lang}/{controller}/{action}/{id}",
    new {  controller = "Home", action = "Index", lang="en-us", id = UrlParameter.Optional }
);

最后,在您的主控制器(或您想要放置视图的任何控制器)中,使用lang参数来确定要使用的视图:

public ActionResult View1( string lang, int? id ) {
    return View( lang + "/View1" );
}

public ActionResult View2( string lang, int? id ) {
    return View( lang + "/View2" );
}

我试过这个并且它有效,但感觉非常笨重,而且不是很干燥(至少在动作中)。有人有更好的方法吗?

于 2012-05-02T16:24:08.480 回答
0

您始终可以编写自己的视图引擎来根据进来的内容查看文件夹。ThemedViewengine 的代码可以做到这一点

于 2012-05-02T16:38:32.573 回答