+1-888-365-2779
Try Now
More in this section

Forums / Developing with Sitefinity / How to create a new language page for an existing item?

How to create a new language page for an existing item?

13 posts, 0 answered
  1. Ray
    Ray avatar
    16 posts
    Registered:
    31 Aug 2011
    30 Dec 2011
    Link to this post
    Hello,

    I need to know how to create a new language split page for an existing Page Node.  I have tried so many varations, that I have actually corrupted some of my existing page nodes.  Can somebody post some example code showing how to accomplish this?  In 3.x there was a method called CopyNewLanguage or CreateNewLanguage in a Teleric CMS library that doesn't seem to exist in 4.x.  This is my last attempt (which caused badness to my database):

    var mgr = App.WorkWith().Page(pageNode.Id);
                            PageInfo info = pageInfo;
                            mgr.Do(
                                p=>
                                    {
                                        if (p.Page != null)
                                        {
                                            var pageData = new PageData {Id = Guid.NewGuid()};
                                            mgr.PageManager.CopyPageData(p.Page, pageData, CultureInfo.GetCultureInfo("en"), updatedLanguage, true);
                                            pageData.ApplicationName = p.Page.ApplicationName;
                                            pageData.LocalizationStrategy = LocalizationStrategy.Split;
                                            pageData.UiCulture = updatedLanguage.Name;
                                            pageData.Culture = updatedLanguage.Name;
                                            pageData.HtmlTitle = info.Title;
                                            p.Page.LocalizationStrategy = LocalizationStrategy.Split;
                                            if (p.Page.PageLanguageLink == null)
                                            {
                                                p.Page.PageLanguageLink = new PageLanguageLink();
                                                //p.Page.PageLanguageLink.LinkId = Guid.NewGuid();
                                                p.Page.PageLanguageLink.LanguageLinks.Add(p.Page);
                                            }
                                            p.Page.PageLanguageLink.LanguageLinks.Add(pageData);

                                        }
                                    }
                                ).SaveChanges();

    Regards,

    Ray Simpson

  2. Ray
    Ray avatar
    16 posts
    Registered:
    31 Aug 2011
    02 Jan 2012
    Link to this post
    Any help on this issue?
  3. Boyan Barnev
    Boyan Barnev avatar
    1429 posts
    Registered:
    08 Dec 2016
    03 Jan 2012
    Link to this post
    Hello Ray,

    Please find below a sample method that will check whether such node already exists and if not will create it with the desired localization strategy (Split) and in the culture you have passed as argument:
    public static bool CreateLocalizedPage(Guid pageId, string pageName, Guid parentPageId, bool isHomePage, bool showInNavigation, string culture = "en")
            {
                //The CurrentUICulture must be set to the desired culture for the page while translating it.
                //At the end of the method the CurrentUICulture is restored to its original value.
                var cultureInfo = new CultureInfo(culture);
                var currentCulture = Thread.CurrentThread.CurrentUICulture;
                Thread.CurrentThread.CurrentUICulture = cultureInfo;
     
                var pageDataId = Guid.NewGuid();
                PageManager manager = PageManager.GetManager();
                PageData pageData = null;
                PageNode pageNode = null;
                var result = false;
     
                var initialPageNode = manager.GetPageNodes().Where(n => n.Id == pageId).SingleOrDefault();
     
                if (initialPageNode != null && LanguageExistsForPage(initialPageNode.Page, cultureInfo))
                {
                    return result;
                }
     
                result = true;
     
                if (initialPageNode == null)
                {
                    var parentId = parentPageId;
     
                    if (parentId == Guid.Empty)
                    {
                        parentId = SiteInitializer.FrontendRootNodeId;
                    }
     
                    //Create Page
                    PageNode parent = manager.GetPageNode(parentId);
                    pageNode = manager.CreatePage(parent, pageId, NodeType.Standard);
     
                    pageData = manager.CreatePageData(pageDataId);
                    pageData.Culture = Thread.CurrentThread.CurrentCulture.ToString();
                    pageData.UiCulture = Thread.CurrentThread.CurrentUICulture.ToString();
     
                    pageNode.Page = pageData;
                    pageNode.Name = pageName;
                    pageNode.ShowInNavigation = true;
                    pageNode.DateCreated = DateTime.UtcNow;
                    pageNode.LastModified = DateTime.UtcNow;
     
                }
                else
                {
                    //TranslatePage
                    manager.InitializePageLocalizationStrategy(initialPageNode, LocalizationStrategy.Split, false);
                    pageNode = GetPageNodeForLanguage(initialPageNode.Page, cultureInfo);
     
                    pageData = pageNode.Page;
                    pageData.TranslationInitialized = true;
                    pageData.IsAutoCreated = false;
                }
     
                pageNode.UrlName[cultureInfo] = Regex.Replace(pageName.ToLower(), UrlNameCharsToReplace, UrlNameReplaceString);
                pageNode.Description[cultureInfo] = pageName;
                pageNode.Title[cultureInfo] = pageName;
                pageNode.ShowInNavigation = showInNavigation;
     
                pageData.HtmlTitle[cultureInfo] = pageName;
                pageData.Title[cultureInfo] = pageName;
                pageData.Description[cultureInfo] = pageName;
     
                manager.SaveChanges();
     
                if (isHomePage)
                    App.WorkWith().Page(pageId).SetAsHomePage().SaveChanges();
     
                Thread.CurrentThread.CurrentUICulture = currentCulture;
     
                return result;
            }
    If you need some further assistance in the process, please do not hesitate to let us know. We'll be glad to help further.

    Regards,
    Boyan Barnev
    the Telerik team
    Do you want to have your say in the Sitefinity development roadmap? Do you want to know when a feature you requested is added or when a bug fixed? Explore the Telerik Public Issue Tracking system and vote to affect the priority of the items
  4. Ray
    Ray avatar
    16 posts
    Registered:
    31 Aug 2011
    03 Jan 2012
    Link to this post
    Thank you for responding Boyan.  The code sample you pasted has several methods and varibles that do not exist (that I can find).  They are:
    GetPageNodeForLanguage
    LanguageExistsForPage (which I changed to  initialPageNode.Page.PageLanguageLink.GetPageForLanguage(cultureInfo))
    And The vars:
    UrlNameCharsToReplace
    UrlNameReplaceString

    I am going to try and implement what you sent, but I have a question about a section of code you have:
     manager.InitializePageLocalizationStrategy(initialPageNode, LocalizationStrategy.Split, false);

     

                    pageNode = GetPageNodeForLanguage(initialPageNode.Page, cultureInfo);
    This appears to be getting the pagedata in the language that I am trying to create, before I create it?  If so, I don't understand how I will get that data before its created since I need to create the new page data, unless the method GetPageNodeForLanguage returns the blank page data.. ?


    Regards,

    Ray Simpson
  5. Ray
    Ray avatar
    16 posts
    Registered:
    31 Aug 2011
    04 Jan 2012
    Link to this post
    Boyan,

    This is what I have come up with, and it works.  Any improvements would be nice, I also post this for anybody that will search for it the way I did :)
    UPDATE: Forgot this line of code, it goes on the very bottom (sets the current thread back)
    Thread.CurrentThread.CurrentUICulture = currentCulture; 
    01.var currentCulture = Thread.CurrentThread.CurrentUICulture;
    02.                        Thread.CurrentThread.CurrentUICulture = updatedLanguage;
    03.                        manager.InitializePageLocalizationStrategy(pageNode, LocalizationStrategy.Split, false);
    04.                        pageNode =
    05.                            pageNode.Page.PageLanguageLink.LanguageLinks.FirstOrDefault(
    06.                                pd => pd.UiCulture == updatedLanguage.Name).NavigationNode;
    07.  
    08.                        var newPageData = pageNode.Page;
    09.                        newPageData.TranslationInitialized = true;
    10.                        newPageData.IsAutoCreated = false;
    11.  
    12.                        pageNode.UrlName[updatedLanguage] = updatedLanguage.TwoLetterISOLanguageName + "_" +
    13.                                                            pageInfo.PageName;
    14.                        pageNode.Description[updatedLanguage] = pageInfo.Description;
    15.                        pageNode.Title[updatedLanguage] = pageInfo.Title;
    16.                        pageNode.ShowInNavigation = true;
    17.  
    18.                        newPageData.HtmlTitle[updatedLanguage] = pageInfo.Title;
    19.                        newPageData.Title[updatedLanguage] = pageInfo.Title;
    20.                        newPageData.Description[updatedLanguage] = pageInfo.Description;
    21.  
    22.                        manager.SaveChanges();
  6. Boyan Barnev
    Boyan Barnev avatar
    1429 posts
    Registered:
    08 Dec 2016
    05 Jan 2012
    Link to this post
    Hi Ray Simpson,

    Thank you very much for sharing with us your solution on the issue, we really appreciate you sharing this with the rest of the community. Your Telerik points have been updated accordingly, once again thank you for your active involvement!


    Regards,
    Boyan Barnev
    the Telerik team
    Do you want to have your say in the Sitefinity development roadmap? Do you want to know when a feature you requested is added or when a bug fixed? Explore the Telerik Public Issue Tracking system and vote to affect the priority of the items
  7. Ray
    Ray avatar
    16 posts
    Registered:
    31 Aug 2011
    22 Mar 2012
    Link to this post
    So I have run into another problem with the translation item that I didn't account for until I tried to add a new language to the system and then tried to generate the new language pages.

    So my question for you is, if the page already exists, and has the InitializePageLocalizationStrategy already called, how do we add a new language data?  Your example only shows for a null page and one that needs to be split as it where.  I believe it I am close with with this.. but I corrupted all of my page data (again) with experiments and am trying to weed it out of the database by hand:
     var newPageData = manager.CreatePageData(Guid.NewGuid());
                                        var currentCulture = Thread.CurrentThread.CurrentUICulture;
                                        Thread.CurrentThread.CurrentUICulture = updatedLanguage;
                                       
                                        newPageData.TranslationInitialized = true;
                                        newPageData.IsAutoCreated = false;
                                        newPageData.Culture = Thread.CurrentThread.CurrentUICulture.ToString();
                                        newPageData.UiCulture = Thread.CurrentThread.CurrentUICulture.ToString();

                                        pageNode.UrlName[updatedLanguage] = pageInfo.PageName + "_" + updatedLanguage;
                                        pageNode.Description[updatedLanguage] = pageInfo.Description;
                                        pageNode.Title[updatedLanguage] = pageInfo.Title;
                                        pageNode.ShowInNavigation = true;

                                        newPageData.HtmlTitle[updatedLanguage] = pageInfo.HtmlTitle;
                                        newPageData.Title[updatedLanguage] = pageInfo.Title;
                                        newPageData.Description[updatedLanguage] = pageInfo.Description;
                                        newPageData.Keywords[updatedLanguage] = pageInfo.Keywords;

                                        //pageNode.Page.PageLanguageLink.LanguageLinks.Add(newPageData);
                                        pageNode.Page = newPageData;

                                        //newPageData.NavigationNode.
                                        Log.Debug("Saving new langauge page basic information.");
                                        manager.SaveChanges();

    Am I missing anything?
  8. Ray
    Ray avatar
    16 posts
    Registered:
    31 Aug 2011
    22 Mar 2012
    Link to this post
    So I have run into another problem with the translation item that I didn't account for until I tried to add a new language to the system and then tried to generate the new language pages.

    So my question for you is, if the page already exists, and has the InitializePageLocalizationStrategy already called, how do we add a new language data?  Your example only shows for a null page and one that needs to be split as it where.  I believe it I am close with with this.. but I corrupted all of my page data (again) with experiments and am trying to weed it out of the database by hand:
     var newPageData = manager.CreatePageData(Guid.NewGuid());
                                        var currentCulture = Thread.CurrentThread.CurrentUICulture;
                                        Thread.CurrentThread.CurrentUICulture = updatedLanguage;
                                       
                                        newPageData.TranslationInitialized = true;
                                        newPageData.IsAutoCreated = false;
                                        newPageData.Culture = Thread.CurrentThread.CurrentUICulture.ToString();
                                        newPageData.UiCulture = Thread.CurrentThread.CurrentUICulture.ToString();

                                        pageNode.UrlName[updatedLanguage] = pageInfo.PageName + "_" + updatedLanguage;
                                        pageNode.Description[updatedLanguage] = pageInfo.Description;
                                        pageNode.Title[updatedLanguage] = pageInfo.Title;
                                        pageNode.ShowInNavigation = true;

                                        newPageData.HtmlTitle[updatedLanguage] = pageInfo.HtmlTitle;
                                        newPageData.Title[updatedLanguage] = pageInfo.Title;
                                        newPageData.Description[updatedLanguage] = pageInfo.Description;
                                        newPageData.Keywords[updatedLanguage] = pageInfo.Keywords;

                                        //pageNode.Page.PageLanguageLink.LanguageLinks.Add(newPageData);
                                        pageNode.Page = newPageData;

                                        //newPageData.NavigationNode.
                                        Log.Debug("Saving new langauge page basic information.");
                                        manager.SaveChanges();

    Am I missing anything?
  9. Ray
    Ray avatar
    16 posts
    Registered:
    31 Aug 2011
    28 Mar 2012
    Link to this post
    Been a few days, any responses forth coming on this?

    Regards,
    Ray Simpson
  10. Ray
    Ray avatar
    16 posts
    Registered:
    31 Aug 2011
    28 Mar 2012
    Link to this post
    Is there a non internal call to a method like this one:
    internal PageNode CreatePageNodeLanguageVersion(PageNode sourceNode, CultureInfo sourceLanguage, CultureInfo targetLanguage, bool copyDataFromSource)

    Or should I just simply duplicate this method so I can create the new data node in the new language?
  11. Ray
    Ray avatar
    16 posts
    Registered:
    31 Aug 2011
    31 Mar 2012
    Link to this post
    Is it a holiday week?
  12. Boyan Barnev
    Boyan Barnev avatar
    1429 posts
    Registered:
    08 Dec 2016
    02 Apr 2012
    Link to this post
    Hello Ray,

    I apologize for the delayed response.Please note that for our Sitefinity SDK samples,  we have several projects which are being built dynamically entirely through code (that is all the pages, controls, users, and content is generated upon project initialization in the application's Global.asax codebehind. Most of the code used is contained in the SampleUtilities project in the SDK, this is where the initial code samples we were discussing are coming from. The Education Starter Kit, for example is one of these projects, which I'd strongly recommend you to take a look at if you want to get a better idea of what's happening when constructing the page through code.

    Kind regards,
    Boyan Barnev
    the Telerik team
    Do you want to have your say in the Sitefinity development roadmap? Do you want to know when a feature you requested is added or when a bug fixed? Explore the Telerik Public Issue Tracking system and vote to affect the priority of the items
  13. Anca
    Anca avatar
    4 posts
    Registered:
    21 Apr 2010
    01 Mar 2014 in reply to Boyan Barnev
    Link to this post

    Hi,

     Is there any update on this? How to create translation for a node when InitializePageLocalizationStrategy already called?

     

    Thanks.

13 posts, 0 answered