创建项目后重命名语言

2 sitecore sitecore6

我正在使用安装了两种语言的sitecore 6.5,en(默认)和fr-CA.树中有些项目包含en和fr-CA中的内容.

问题是法国网址中有'fr-CA',我们希望它是'fr',例如:

http://website.com/fr/page.aspx而不是http://website.com/fr-CA/page.aspx

我尝试将语言从'fr-CA'重命名为'fr'并修复了网址,但内容仍指向旧语言'fr-CA',因此该项目显示三种语言:en,fr和fr-CA.它没有认识到名称的变化.

任何建议都非常感谢.

谢谢,塔雷克

Ste*_*ope 6

问题是你创建fr-CA的项目版本无法通过重命名语言来修复..你现在可以制作一个fr版本但是,就像你看到的那样,这意味着现在有3种可能的版本.

一个建议是将语言留在Sitecore中,并改变链接的提供和处理方式.

您可能需要考虑将自己的方法添加到httpRequestBeginSitecore 的管道中.这将遵循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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

你可能还必须覆盖LinkProvider<linkManager>web.config中的部分网址的格式,当他们被Sitecore的解决.

另一个非常快速和脏的例子:

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;
    }    
}
Run Code Online (Sandbox Code Playgroud)

另一种方式(因为它需要通过脚本执行稍微冗长)是将数据从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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

更新内容项的语言的另一种方法是:

  1. 将fr-CA语言导出到.xml文件(使用"控制面板")
  2. 在.xml文件中用和替换all和标签
  3. 将master数据库中的fr-CA语言重命名为fr
  4. 从.xml文件导入语言
  5. 运行清理数据库任务(从控制面板)

您还可以创建一个sql脚本,该脚本将使用fr更改fr-CA语言,以用于UnversionedFields和VersionedFields表中的所有记录.

如果您需要更多信息或示例,请告诉我们.:)