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

Posted by Community Admin on 04-Aug-2018 21:02

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

All Replies

Posted by Community Admin on 30-Dec-2011 00:00

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

Posted by Community Admin on 02-Jan-2012 00:00

Any help on this issue?

Posted by Community Admin on 03-Jan-2012 00:00

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

Posted by Community Admin on 03-Jan-2012 00:00

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

Posted by Community Admin on 04-Jan-2012 00:00

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

Posted by Community Admin on 05-Jan-2012 00:00

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

Posted by Community Admin on 22-Mar-2012 00:00

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?

Posted by Community Admin on 22-Mar-2012 00:00

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?

Posted by Community Admin on 28-Mar-2012 00:00

Been a few days, any responses forth coming on this?

Regards,
Ray Simpson

Posted by Community Admin on 28-Mar-2012 00:00

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?

Posted by Community Admin on 31-Mar-2012 00:00

Is it a holiday week?

Posted by Community Admin on 02-Apr-2012 00:00

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

Posted by Community Admin on 01-Mar-2014 00:00

Hi,

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

 

Thanks.

This thread is closed