1

对不起标题,想不出一个简单的好方法来描述它。关于这个问题...

我使用 Web 表单在 ASP.NET 中编写了一个站点,并使用资源文件来处理多种语言的静态文本,并且我们的数据库设置为多种语言,因此所有内容都已本地化。在 web.config 中切换文化和 uiCulture 就像在法语和英语之间切换网站一样简单。

但是,法语站点必须使用翻译成法语的文件夹和页面名称进行部署。例如,http://www.product.com/accessories/category.aspx?id=111需要为http://www.produit.com/accesoires/categories.aspx?id=111

除了制作所有 ASPX 页面的副本(而不是背后的代码),将它们的名称更改为法语等价物并让它们的代码隐藏指向原始 aspx.cs ......什么是首选/正确/好方法做这个?

请注意:页面/代码中引用的 URL 本身是动态构建的,因此它们也将被本地化。

谢谢!

4

2 回答 2

0

您是否尝试过查看 asp.net 中的路由?http://www.hanselman.com/blog/OneASPNETSneakPeekElegantWebFormsAndSnowballsInHell.aspx

于 2013-02-09T00:14:01.630 回答
0

我不能使用路由,因为服务器正在运行 .NET 2.0,并且直到 3.5 SP1 才将路由引入框架。所以我不得不求助于 URL 重写。

在 web.config 我添加:

<system.web>
    <httpModules>
      <add name="UrlRewriter" type="Utilities.UrlRewriter, MyProject"/>
      ...

<system.webServer>
    <modules>
      <add name="UrlRewriter" type="Utilities.UrlRewriter, MyProject"/>

然后我创建了继承 IHttpModule 的 UrlRewriter,并在 Init 方法中为 HttpApplication.BeginRequest 添加了一个处理程序。

在 BeginRequest 中,我检查 URL 并将本地化的文件夹名称和页面名称替换为对应的英文。例如/mysite.com/a-propos-de-nous/被转换为/mysite.com/about-us/但用户仍然在他们的浏览器中看到法语 URL。

需要进行一些检查来转换 URL,但它工作得很好,而且检查/替换并不可怕。

我有几个怪癖要弄清楚,如果 URL 以/mysite.com/a-propos-de-nous的形式出现(请注意末尾缺少的“/”),则重写有效,但浏览器地址栏中的 URL更改为不需要的/mysite.com/about-us

如果有人在本地化 URL 方面有任何其他想法、评论或经验,请添加到线程中。


[编辑 - 2013 年 2 月 28 日] - RE:在浏览器中输入的 URL 中缺少尾部斜杠

添加它以使其更加完整,以防有人偶然发现它。

这里的问题是 IIS 添加了一个礼貌的斜杠,这会创建一个重定向。为了处理这种情况,我在这里所做的是检查 URL 并确定它是否在 URL 的末尾包含页面/文件。我在我的 Url 重写代码中使用以下内容:

        void UrlRewriter_BeginRequest(object sender, EventArgs e)
        {
           HttpApplication app = (HttpApplication)sender;

           ... // other rewrite code here

           string lastSegment = app.Request.Url.Segments[app.Request.Url.Segments.Length - 1];
           string extension = System.IO.Path.GetExtension(lastSegment);

           // no extension, must be a directory/folder
           if (string.IsNullOrEmpty(extension))
           {
               if (!sendTo.EndsWith("/"))
                   sendTo = sendTo + "/";
           }

           app.Context.RewritePath(sendTo);
        }
于 2013-02-27T17:44:48.207 回答