我正在尝试使用两个字母的区域性代码(en)而不是完整的区域性代码(en-US)在Kentico中创建一个更友好的页面URL。我修改了页面URL模式,如下图所示。有没有更好的方法,我应该创建一个自定义宏表达式吗?
我想实现的另一件事是在URL中没有默认区域性。也许我也可以为其使用自定义宏表达式。
我已经通过自定义宏表达式解决了该问题。 URL模式与DocumentCulture结合使用。宏表达式使用区域性别名(在默认区域性为空的情况下为假)以及两个字母代码,并以“ /”返回。
页面的网址格式:
{%Util.GetUrlCultureCode(DocumentCulture)%}{%NodeAliasPath%}
我为解决此问题而编写的宏表达式如下。
public class CustomCultureMacroExpression : MacroMethodContainer
{
[MacroMethod(typeof(List<string>),"Returns the url culture code of current document",1)]
[MacroMethodParam(0,"Culture",typeof(string),"Current culture.")]
public static object GetUrlCultureCode(EvaluationContext context,params object[] parameters)
{
// Branches according to the number of the method's parameters
switch (parameters.Length)
{
case 1:
return GetCultureAliasOfCulture(parameters[0].ToString());
case 2:
// Weird bug causing macro expression in url pattern to have two parameters where the first parameter is null.
return GetCultureAliasOfCulture(parameters[1].ToString());
default:
// No other overloads are supported
return string.Empty;
}
}
private static string GetCultureAliasOfCulture(string cultureCode)
{
var culture = CultureInfoProvider.GetCultureInfo(cultureCode);
var culturealias = culture?.CultureAlias ?? string.Empty;
return string.IsNullOrEmpty(culturealias) ? string.Empty : $"/{culturealias}";
}
}
,
您可以尝试在Localization-> Cultures中更新文化代码,但是我不确定它是否没有副作用
,如果使用Dynamic Routing module,则可以加入GetCulture和GetPage全局事件以执行所需的操作。
对于GetCulture,您将检查URL是否具有2个字母的区域性代码,如果确实如此,则将其用作区域性。
您也可以根据需要调整GetPage,尽管生成的URL标记应该可以正常工作,除非您希望在GetPage上回退该URL。如果没有找到页面,则可以尝试从URL中删除任何区域性并以此查找页面。
为便于使用,我建议对UrlPattern的其余部分使用NodeAliasPath。