我已经为我的 asp.net core 项目 (.NET 8) 实现了基于路由的本地化。基本上满足这些要求:
CultureInfo.CurrentCulture
设置为 ru-RU
CultureInfo.CurrentCulture
设置为 en-US
但是当我生成主页链接时:
<a asp-page="/Index" asp-route-lang="@CultureInfo.CurrentCulture.TwoLetterISOLanguageName">Home</a>
我得到
https://localhost/ru
代表默认文化 (ru-RU),https://localhost/en
代表英语 (en-US)。
问题:
在生成默认区域性的 URL 时,如何去掉
部分(而不是拥有/ru
,我只需要获得https://localhost/ru
)。我可以在每个https://localhost
中使用一个条件,但这不是一个好方法。asp-route-lang="..."
认为可以通过自定义标签助手删除路由中的默认区域性(路由路径)。
如下所示,您可以将
asp-route-lang
属性的值与应用程序的默认区域性进行比较。如果两个值相同,则覆盖 href
属性。
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Razor.TagHelpers;
using Microsoft.Extensions.Options;
using System;
[HtmlTargetElement("a")]
public class AnchorWithLangTagHelper : TagHelper
{
[HtmlAttributeName("asp-route-lang")]
public string Lang { get; set; }
private readonly RequestLocalizationOptions _options;
public AnchorWithLangTagHelper(IOptions<RequestLocalizationOptions> options)
{
_options = options.Value;
}
public override void Process(TagHelperContext context, TagHelperOutput output)
{
// Remove the Lang from route if provided Lang is default culture
if (!String.IsNullOrEmpty(Lang)
&& _options.DefaultRequestCulture.UICulture.TwoLetterISOLanguageName.Equals(Lang, StringComparison.OrdinalIgnoreCase))
{
var generatedHref = output.Attributes["href"].Value.ToString();
generatedHref = generatedHref.Replace($"/{Lang}/", "/");
output.Attributes.SetAttribute("href", generatedHref);
}
}
}
中的 @addTagHelper
添加自定义标签助手,使其在所有视图中可用。
@addTagHelper <Namespace of AnchorWithLangTagHelper>.AnchorWithLangTagHelper, <Project Namespace>
演示