创建项目后重命名语言

时间:2011-11-14 22:32:50

标签: 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。它没有认识到名称的变化。

非常感谢任何建议。

谢谢, Tarek

2 个答案:

答案 0 :(得分:6)

问题是您创建的商品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的LinkProvider部分中的<linkManager>,以便在Sitecore解析网址时格式化您的网址。

另一个非常快速的&amp;肮脏的例子:

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);
        }
    }

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

  1. 将fr-CA语言导出到.xml文件(使用“控制面板”)
  2. 在.xml文件中,使用和
  3. 替换所有和标记
  4. 将master数据库中的fr-CA语言重命名为fr
  5. 从.xml文件导入语言
  6. 运行清理数据库任务(从控制面板)
  7. 此外,您还可以创建一个sql脚本,该脚本将使用fr更改fr-CA语言,以用于UnversionedFields和VersionedFields表中的所有记录。

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

答案 1 :(得分:0)

我有类似的要求在保留内容的同时重命名语言。我决定使用Unicorn将内容从一种语言迁移到另一种语言:

1:创建一个谓词告诉Unicorn跟踪您的所有内容。就我而言:

            <include name="site content" database="master" path="/sitecore/content/mySite" />
  1. 重新整理内容,将其作为YML文件写入磁盘
  2. 使用可以执行查找的工具&amp;一次替换多个文件,如Notepad ++,替换&#34;语言的所有实例:fr-CA&#34;与&#34;语言:fr&#34;在你的yml文件中。
  3. 运行Unicorn Sync
  4. 您会发现所有内容现在都与&#34; fr&#34;语言而不是&#34; fr-CA&#34;。