public HttpResponseMessage LocalizedContent([FromUri] int?portalId, [FromUri] string cultureCode)
        {
            try
            {
                var pid = portalId ?? this.PortalId;
                if (!this.UserInfo.IsSuperUser && pid != this.PortalId)
                {
                    return(this.Request.CreateErrorResponse(HttpStatusCode.Unauthorized, AuthFailureMessage));
                }

                var progress = new LocalizationProgress {
                    InProgress = true,
                };
                var portal         = PortalController.Instance.GetPortal(pid);
                var portalSettings = new PortalSettings(portal);
                LanguagesControllerTasks.LocalizeLanguagePages(
                    progress, pid, cultureCode, portalSettings.DefaultLanguage ?? Localization.SystemLocale);
                return(this.Request.CreateResponse(HttpStatusCode.OK, progress));
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                return(this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, ex.ToString()));
            }
        }
        private static void SaveProgressToFile(LocalizationProgress progress)
        {
            var path = Path.Combine(Globals.ApplicationMapPath, "App_Data", LocalizationProgressFile);
            var text = JsonConvert.SerializeObject(progress);

#if false
            // this could have file locking issues from multiple threads
            File.WriteAllText(path, text);
#else
            using (var file = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.ReadWrite, 256))
            {
                var bytes = Encoding.UTF8.GetBytes(text);
                file.Write(bytes, 0, bytes.Length);
                file.Flush();
            }
#endif
        }
        public static void LocalizeLanguagePages(LocalizationProgress progress, int portalId, string cultureCode, string defaultLocale)
        {
            Task.Factory.StartNew(() =>
            {
                try
                {
                    var pageList = GetTabsToLocalize(portalId, cultureCode, defaultLocale);
                    var locale   = LocaleController.Instance.GetLocale(cultureCode);

                    //add translator role
                    Localization.AddTranslatorRole(portalId, locale);

                    //populate pages
                    ProcessLanguage(pageList, locale, defaultLocale, 0, 1, progress);

                    //Map special pages
                    PortalController.Instance.MapLocalizedSpecialPages(portalId, locale.Code);

                    //clear portal cache
                    DataCache.ClearPortalCache(portalId, true);
                    progress.Reset();
                    SaveProgressToFile(progress);
                }
                catch (Exception ex)
                {
                    try
                    {
                        Logger.Error(ex);
                        progress.Reset().Error = ex.ToString();
                        SaveProgressToFile(progress);
                    }
                    catch (Exception)
                    {
                        //ignore
                    }
                }
            });
        }
        public static void LocalizeSitePages(LocalizationProgress progress, int portalId, bool translatePages, string defaultLanguage)
        {
            Task.Factory.StartNew(() =>
            {
                try
                {
                    var languageCount   = LocaleController.Instance.GetLocales(portalId).Count;
                    var languageCounter = 0;

                    var pageList = GetPages(portalId).Where(p => string.IsNullOrEmpty(p.CultureCode)).ToList();

                    if (translatePages)
                    {
                        // populate default language
                        ProcessLanguage(pageList, LocaleController.Instance.GetLocale(defaultLanguage),
                                        defaultLanguage, languageCounter, languageCount, progress);
                    }
                    PublishLanguage(defaultLanguage, portalId, true);

                    PortalController.UpdatePortalSetting(portalId, "ContentLocalizationEnabled", "True");

                    if (translatePages)
                    {
                        // populate other languages
                        pageList = GetPages(portalId).Where(p => p.CultureCode == defaultLanguage).ToList();

                        foreach (var locale in LocaleController.Instance.GetLocales(portalId).Values.Where(l => l.Code != defaultLanguage))
                        {
                            languageCounter++;

                            //add translator role
                            Localization.AddTranslatorRole(portalId, locale);

                            //populate pages
                            ProcessLanguage(pageList, locale, defaultLanguage, languageCounter, languageCount, progress);

                            //Map special pages
                            PortalController.Instance.MapLocalizedSpecialPages(portalId, locale.Code);
                        }
                    }

                    //clear portal cache
                    DataCache.ClearPortalCache(portalId, true);
                    progress.Reset();
                    SaveProgressToFile(progress);
                }
                catch (Exception ex)
                {
                    try
                    {
                        Logger.Error(ex);
                        progress.Reset().Error = ex.ToString();
                        SaveProgressToFile(progress);
                    }
                    catch (Exception)
                    {
                        //ignore
                    }
                }
            });
        }
        private static void ProcessLanguage(ICollection <TabInfo> pageList, Locale locale,
                                            string defaultLocale, int languageCount, int totalLanguages, LocalizationProgress progress)
        {
            progress.PrimaryTotal = totalLanguages;
            progress.PrimaryValue = languageCount;

            var total = pageList.Count;

            if (total == 0)
            {
                progress.SecondaryTotal   = 0;
                progress.SecondaryValue   = 0;
                progress.SecondaryPercent = 100;
            }

            for (var i = 0; i < total; i++)
            {
                var currentTab = pageList.ElementAt(i);
                var stepNo     = i + 1;

                progress.SecondaryTotal   = total;
                progress.SecondaryValue   = stepNo;
                progress.SecondaryPercent = Convert.ToInt32((float)stepNo / total * 100);
                progress.PrimaryPercent   =
                    Convert.ToInt32((languageCount + (float)stepNo / total) / totalLanguages * 100);

                progress.CurrentOperationText = string.Format(Localization.GetString(
                                                                  "ProcessingPage", LocalResourcesFile), locale.Code, stepNo, total, currentTab.TabName);

                progress.TimeEstimated = (total - stepNo) * 100;

                SaveProgressToFile(progress);

                if (locale.Code == defaultLocale || string.IsNullOrEmpty(locale.Code))
                {
                    TabController.Instance.LocalizeTab(currentTab, locale, true);
                }
                else
                {
                    if (currentTab.IsNeutralCulture)
                    {
                        TabController.Instance.LocalizeTab(currentTab, LocaleController.Instance.GetLocale(defaultLocale), true);
                    }
                    TabController.Instance.CreateLocalizedCopy(currentTab, locale, false);
                }
            }
        }