2009-07-23 64 views
0

ASP.NET MVC应用程序,接近完成,然后决定它需要一个语言切换器。它只是两种语言:英语和日语。他们应该能够在两者之间切换,但是如果没有选择它,它应该选择浏览器的默认语言。构建一个语言切换器 - 仅限2种语言 - ASP.NET MVC

我想知道在这种情况下最好的解决方案是什么。

首先想到,路线!所以我改变路线在每条路线的末尾都有一个/{l},并且默认l = ""。然后,在我的BaseController中(每个控制器都基于它),我检查路由中的l变量。每个操作都会根据语言返回一个视图。

我想仅仅是能够破解的URL的末尾/ JA-JP,它会显示出在日本的看法。它似乎不正确的路线。然后,我真的认为我的观点很糟糕,并且手工编码了这些链接......我无法让助手首先输出正确的链接......并陷入了手动编码它们的坏习惯。所以,我不得不重新编码每一个链接 - 最终破解语言变量。

第二个想法 ...好的,使用jQuery将语言变量附加到所有锚点的href。这似乎过于笨拙,难以在某些情况下的HREF被隐藏,直到需要,等等

所以......在这一点上我已经决定只是不惜一切代价。什么是在两种语言之间切换的最优雅的方式 - 不使用资源文件?我只想根据语言在2个视图中进行选择。

我是否会重写每一个必须使用Html帮助程序的链接,然后让路由工作?那么在BaseController中,如果语言没有任何价值,只需将语言设置为英语?

任何意见非常感谢,谢谢。

+0

看到了这一点?:http://oddiandeveloper.blogspot.com/2008/11/localization-with-aspnet-英文内容mvc.html – grenade 2009-07-23 08:31:10

回答

2

我认为最简单的和用户友好的方法之一是使用域(子域实际上),以确定它说什么语言。它不需要在Html帮助程序(那些HTML.ActionLink)中几乎改变任何东西,因为它只对域有效。而且,用户看起来很整洁,看到该域名时,他们确切知道它应该是什么语言,并且不会使URL过长。你所需要做的就是在语言切换器上做一些工作。

不管用什么办法,我强烈反对使用第二个想法,因为你不能否认(甚至0.1%)的人没有JavaScript来的工作访问您的日本网站,对不对?

+0

正确...甚至不是一个真正的想法,只是一个想法。我也喜欢子域名......嗯。如果我做子域名,我想要像en.domain.com || jp.domain.com。我如何从域名中获取语言变量? – Chaddeus 2009-07-23 07:40:49

+1

这里是一篇关于MVC中子域路由的文章:http://blogs.securancy.com/post/ASPNET-MVC-Subdomain-Routing.aspx 基本上,子域转换为文化,你可以简单地把这些规则放在web.config文件。因此,例如,您可以将en.domain.com映射到en-us等等。 – xandy 2009-07-23 15:38:22

+0

哦,还有一件事要补充。我只记得维基百科使用语言的子域...虽然它不是简单的语言之间的翻译。 – xandy 2009-07-23 15:40:46

1

我们使我们的网站,它不只是一个需要不同需要改变,但对于我们的国际客户的意见,自己的语言时发现。 I.E.我们的香港办事处需要不同数量的空间和数据来查看数据,然后我们的英国办事处。只是稍微改变了视图布局的语言,并给我带来了一些麻烦。

What we ended up doing was this

随着编码可以覆盖路由到您的意见,并根据你喜欢的任何情况发送英语一组的看法和日本的另一个非常小的量。无需更改URL或做它的客户端,甚至改变你的行动。

编辑:重新阅读后,我认为这将是非常适合您的网站,因为您使用两套视图,每种语言。

2

不要把语言放在路线的尽头。把它放在开头。 这使得使用可能具有可选参数的不同路由很容易。

语言设置应该只改变tranlation。

如果你的日本用户有特定的规则(价格,交货选项等),那么你应该实现语言和国家的具体情况。一个国家是你在“多租户应用程序”下找到的东西,它不会被浏览器语言检测到。

日本用户可以浏览英文网站,并看到一个JAPANES翻译

routes.MapRoute(
     // Route name 
     "LocalizedRoute", 
     // URL with parameters        
     ("{language}/{controller}/{action}"), 
     // Parameter defaults 
    new 
    { 

      action = "Index", 
      language = "de" 

     }, 
        //Parameter constraints 
     new { language = @"en-us|ja-jp" }