【问题标题】:Rename language after item is created创建项目后重命名语言
【发布时间】:2018-04-25 15:47:52
【问题描述】:

我使用的是安装了两种语言的 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”并修复了 url 但内容仍指向旧语言“fr-CA”,因此该项目显示三种语言:en、fr 和 fr -CA。它不承认名称更改。

非常感谢任何建议。

谢谢, 塔雷克

【问题讨论】:

    标签: sitecore sitecore6


    【解决方案1】:

    问题是您创建了您的项目的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);
            }
        }
    

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

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

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

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

    【讨论】:

    • 非常感谢!我真的很感激细节。我最终离开了“fr-CA”并按照您上面的建议创建了自己的语言解析器和链接管理器。处理不同的语言和语言参数有点棘手,但可以正常工作。
    【解决方案2】:

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

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

                <include name="site content" database="master" path="/sitecore/content/mySite" />
    
    1. 重新序列化内容,将其作为 YML 文件写入磁盘
    2. 使用可以一次在多个文件中执行查找和替换的工具(例如 Notepad++),将 yml 文件中的所有“语言:fr-CA”实例替换为“语言:fr”。
    3. 运行独角兽同步

    您会发现您的所有内容现在都与“fr”语言而不是“fr-CA”相关联。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多