Sitecore URL优化和语言

时间:2011-01-10 12:06:25

标签: c# web-config sitecore sitecore6

使用Sitecore 6.2中的多个语言网站我希望能够在带有连字符的网址中将Sitecore替换为“”(空格,传统上替换为%20)。

E.g。 www.MySite.com/Hello World> www.MySite.com/Hello-World

到目前为止没有问题,我们只需添加另一个条目到encodeNameReplacements

<replace mode="on" find=" " replaceWith="-" />

然后,为了防止我们的内容作者创建名称中带有连字符的项目(Sitecore会在阅读其URL时理解为有空格,导致404 Not Found),我们可以将连字符添加到禁止的字符列表中在项目名称中,使用

 <setting name="InvalidItemNameChars" value="\/:?&quot;&lt;&gt;|[]-"/>

这一切都很好 - 直到我尝试创建一个新的语言定义。 Sitecore中的语言可以使用简单的语言代码(例如en,da,de等)或语言和区域代码(ISO),例如en-GB,da-DK,de-DE等。对于我们的网站,我们需要我们打算支持区域语言变异的区域代码(例如瑞士法语和瑞士德语)。但当然我现在禁止项目名称中的连字符(和语言,因为Sitecore中的其他所有内容都被定义为项目)。事实上,Sitecore要求将语言名称正确地构造为文化标识符,因此我无法使用模板的ISO代码字段中指定的iSO代码为语言指定描述性名称(例如美国英语)。

有人能建议一个合适的解决方案吗?我应该从InvalidItemNameChars节点中删除连字符并编写一个自定义代码片段来捕获尝试创建带连字符的项目名称吗?如果是这样,我应该如何理解创作活动?

我不喜欢在没有必要的地方定制界面,特别是因为我担心这可能会给Sitecore版本更新带来问题,所以如果有其他解决方案,我很乐意听到它们。

提前致谢。

2 个答案:

答案 0 :(得分:4)

这使用规则引擎替换特殊字符,例如项目名称中的空格:

https://marketplace.sitecore.net/en/Modules/Item_Naming_rules.aspx

如果你没有替换,但只是翻译,在处理URL时,Sitecore的项目解析器会尝试使用破折号而不是空格来查找项目名称,并且找不到匹配的项目。如果您实际上没有替换字符,则需要覆盖项目解析器。

如果要保留用户可见空格的名称,但实际上用破折号命名项目,则可以在将空格重命名为短划线时将项目的显示名称设置为带空格的原始值,但是我建议反对。

答案 1 :(得分:3)

您可以编写一个类并将其放在web.config中的项目保存事件中。只需编写OnItemSaved方法,并检查名称中的连字符。我想你需要在重命名和复制时这样做。

<event name="item:saved">
  <handler type="Sitecore.Links.ItemEventHandler, Sitecore.Kernel" method="OnItemSaved" />
  <handler type="Sitecore.Tasks.ItemEventHandler, Sitecore.Kernel" method="OnItemSaved" />
  <handler type="Sitecore.Globalization.ItemEventHandler, Sitecore.Kernel" method="OnItemSaved" />
  <handler type="Sitecore.Rules.ItemEventHandler, Sitecore.Kernel" method="OnItemSaved" />
  <handler type="YourAssembly.ItemEventHandler, YourAssembly" method="OnItemSaved" />
</event>