gpt4 book ai didi

asp.net - ASP.net 中的多语言 URL 重写

转载 作者:行者123 更新时间:2023-12-02 17:12:24 25 4
gpt4 key购买 nike

使用示例 URL:

www.domain.com/contact-us

英语呈现。该网站还支持一组其他语言:

www.domain.com/es/contact-us
www.domain.com/jp/contact-us
www.domain.com/de/contact-us
www.domain.com/pt/contact-us

这是英语(默认语言)的重写规则

<rewrite url="^/contact-us(\?(.+))?$" to="~/Pages/Contact.aspx$1" processing="stop"/>

我将如何修改它/添加新规则来重写:

www.domain.com/jp/contact-us  

致:

~/Pages/Contact.aspx?language=jp

最好不必为每个内容页面的每种语言编写新规则!

让事情变得复杂的是,它需要匹配 IETF 语言标签。这些变化很大,看起来匹配它们的正则表达式将是一条困难的路线: https://en.wikipedia.org/wiki/IETF_language_tag

理想情况下,我需要从数据库中获取语言列表,并动态匹配语言标记字段。但我不知道如何做到这一点,因为我只编写过静态规则。

最佳答案

通过编写我自己的 URL 重写模块解决了这个问题。下面的示例代码适用于遇到类似问题的人。决定转储所有其他 URL 重写并通过此模块路由所有内容。

不要认为使用静态规则可以轻松实现这一点。

public class DynamicURLRewrite : IHttpModule
{
public void Init(HttpApplication context)
{
context.AuthorizeRequest += new EventHandler(context_AuthorizeRequest);
}

public void Dispose()
{
throw new NotImplementedException();
}

void context_AuthorizeRequest(object sender, EventArgs e)
{
var rw = new Rewriter();
rw.Process();
}
}

public class Rewriter
{
public void Process()
{
using (MiniProfiler.Current.Step("Rewriter process"))
{
var context = HttpContext.Current;

var rawURL = context.Request.RawUrl;
var querystring = String.Empty;
var urlParts = rawURL.Split('?');
var url = urlParts[0];
if (urlParts.Count() == 2) querystring = urlParts[1];
if (url.StartsWith("/")) url = url.Substring(1);

// Get language component
Translation.Language inLanguage = null;
{
foreach (var lang in Translation.Language.GetAllLanguages())
{
if (url.StartsWith(lang.LanguageTag, StringComparison.CurrentCultureIgnoreCase))
{
inLanguage = lang;
url = url.Substring(lang.LanguageTag.Length);
if (url.StartsWith("/")) url = url.Substring(1);
break;
}
}
if (inLanguage == null)
{
inLanguage =
Translation.Language.GetLanguage(
Settings.Translation.ProjectReferenceVersionRequiredLanguageTag);
}
}

// Querystring
{
if (!String.IsNullOrEmpty(querystring)) querystring += "&";
querystring += "lang=" + inLanguage.LanguageTag.ToLower();
querystring = "?" + querystring;
}

// Root pages
{
if (String.IsNullOrEmpty(url))
{
context.RewritePath("~/pages/default.aspx" + querystring);
return;
}
if (url.Equals("login"))
{
context.RewritePath("~/pages/login.aspx" + querystring);
return;
}

然后是一些更复杂的规则:

            // Handlers
if (url.StartsWith("handlers/"))
{
// Translation serving
if(url.StartsWith("handlers/translations/"))
{
var regex = new Regex("handlers/translations/([A-Za-z0-9-]+)/([A-Za-z0-9-]+).json", RegexOptions.IgnoreCase);
var match = regex.Match(url);
if (match.Success)
{
context.RewritePath("~/handlers/translation/getprojecttranslation.ashx" + querystring + "&project=" + match.Groups[1] + "&language=" + match.Groups[2]);
return;
}
}
}

关于asp.net - ASP.net 中的多语言 URL 重写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32015140/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com