问题是您创建了您的项目的fr-CA 版本,无法通过重命名语言来修复.. 您现在可以创建fr 版本,但是,就像您看到的那样,这意味着现在有 3 个可能的版本.
一个建议是单独保留 Sitecore 中的语言,而改为更改链接的提供和处理方式。
您可能需要考虑将自己的方法添加到 Sitecore 的 httpRequestBegin 管道中。这将遵循LanguageResolver 条目。然后您可以解析RawUrl 并设置Sitecore.Context.Langauge' to French if the first element in it matched/fr/`。
非常快速和肮脏的例子:
public class MyLanguageResolver : HttpRequestProcessor
{
public override void Process(HttpRequestArgs args)
{
string languageText = WebUtil.ExtractLanguageName(args.Context.Request.RawUrl);
if(languageText == "fr")
{
Sitecore.Context.Language = LanguageManager.GetLanguage("fr-CA");
}
}
}
您可能还必须覆盖 web.config 的 <linkManager> 部分中的 LinkProvider,以便在 Sitecore 解析 URL 时对其进行格式化。
另一个非常快速和肮脏的例子:
public class MyLinkProvider : LinkProvider
{
public override string GetItemUrl(Sitecore.Data.Items.Item item, UrlOptions options)
{
var url = base.GetItemUrl(item, options);
url = url.Replace("/fr-CA/", "/fr/");
return url;
}
}
另一种方法(稍微冗长,因为它需要通过脚本执行)是将数据从fr-CA 版本复制到fr 版本,然后删除每个项目的 fr-CA 版本.
包含您要执行的操作的粗略辅助方法
private void CopyLanguage(ID id, Language sourceLanguage, Language destinationLanguage)
{
var master = Database.GetDatabase("master");
var sourceLanguageItem = master.GetItem(id, sourceLanguage);
var destinationLanguageItem = master.GetItem(id, destinationLanguage);
using (new SecurityDisabler())
{
destinationLanguageItem.Editing.BeginEdit();
//for each field in source, create in destination if it does not exist
foreach (Field sf in sourceLanguageItem.Fields)
{
if (sf.Name.Contains("_")) continue;
destinationLanguageItem.Fields[sf.Name].Value = sf.Value;
}
destinationLanguageItem.Editing.AcceptChanges();
////Remove the source language version
ItemManager.RemoveVersions(sourceLanguageItem,sourceLanguage, SecurityCheck.Disable);
}
}
另一种更新内容项语言的方法是:
- 将 fr-CA 语言导出到
.xml 文件(使用控制面板)
- 在 .xml 文件中,用 and 替换所有 and 标记
- 将主数据库中的 fr-CA 语言重命名为 fr
- 从 .xml 文件导入语言
- 运行清理数据库任务(从控制面板)
您还可以创建一个 sql 脚本,该脚本将为 UnversionedFields 和 VersionedFields 表中的所有记录更改 fr-CA 语言。
如果您需要更多信息或示例,请告诉我。 :)