我正在尝试使用两个字母的文化代码(en)而不是完整的文化代码(en-US)在 Kentico 中创建一个更友好的页面 URL。我修改了页面 URL 模式,如下图所示。有没有更好的方法,我应该创建一个自定义宏表达式吗?
我想要实现的另一件事是在 URL 中没有默认文化。也许我也可以使用自定义宏表达式。
我正在尝试使用两个字母的文化代码(en)而不是完整的文化代码(en-US)在 Kentico 中创建一个更友好的页面 URL。我修改了页面 URL 模式,如下图所示。有没有更好的方法,我应该创建一个自定义宏表达式吗?
我想要实现的另一件事是在 URL 中没有默认文化。也许我也可以使用自定义宏表达式。
我已经用自定义宏表达式解决了这个问题。这在 URL 模式中与 DocumentCulture 结合使用。宏表达式采用文化别名(如果默认文化为空,则为两个字母代码),并使用“/”返回。
页面的 url 模式:
{%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 中更新文化代码,但我不确定它是否不会有任何副作用
如果您使用动态路由模块,您可以挂钩到 GetCulture 和 GetPage 全局事件来做您正在寻找的事情。
对于 GetCulture,您将检查 URL 是否有 2 个字母的文化代码,如果有,则将其用作文化。
如果需要,您还可以调整 GetPage,尽管生成的 URL slug 应该可以正常工作,除非您想要在 GetPage 上回退。之后,如果没有找到页面,您可以尝试从 URL 中删除任何文化并查找那个页面。
为了便于使用,我建议对 UrlPattern 的其余部分使用 NodeAliasPath。