/// <summary>
        /// normalized SCRIPT tag to reference localized resources for a specific
        /// ResourceSet.
        /// </summary>
        /// <param name="varName"></param>
        /// <param name="resourceSet"></param>
        /// <param name="localeId"></param>
        /// <param name="resourceMode></param>
        /// <example>
        /// @LocalizationResourceController.GetJavaScriptResourcesScriptTag("myResources","MyServerResources")
        /// @LocalizationResourceController.GetJavaScriptResourcesScriptTag("myResources","MyServerResources",resourceMode: ResourceAccessMode.AutoConfiguration)
        /// @LocalizationResourceController.GetJavaScriptResourcesScriptTag("myResources","MyServerResources","de-DE,ResourceAccessMode.AutoConfiguration)
        /// </example>
        /// <returns></returns>

        public static HtmlString GetJavaScriptResourcesScriptTag(string varName, string resourceSet,
                                                                 string localeId = null,
                                                                 ResourceAccessMode resourceMode = ResourceAccessMode.AutoConfiguration)
        {
            var url = GetJavaScriptResourcesUrl(varName, resourceSet, localeId, resourceMode);

            return(new HtmlString($"<script src=\"{url}\"></script>"));
        }
 /// <summary>
 /// Helper function called from strongly typed resources to retrieve
 /// non-string based resource values.
 ///
 /// This method returns a resource value based on the active
 /// Generated ResourceAccessMode.
 /// </summary>
 /// <param name="resourceSet"></param>
 /// <param name="resourceId"></param>
 /// <param name="manager"></param>
 /// <param name="resourceMode"></param>
 /// <returns></returns>
 public static object GetResourceObject(string resourceSet, string resourceId,
                                        ResourceManager manager,
                                        ResourceAccessMode resourceMode)
 {
     if (resourceMode == ResourceAccessMode.Resx)
     {
         return(manager.GetObject(resourceId));
     }
     return(DbRes.TObject(resourceId, resourceSet));
 }
        /// <summary>
        /// Helper function called from strongly typed resources to retrieve 
        /// string based resource values.
        /// 
        /// This method returns a resource string based on the active 
        /// Generated ResourceAccessMode.
        /// </summary>
        /// <param name="resourceSet"></param>
        /// <param name="resourceId"></param>
        /// <param name="manager"></param>
        /// <param name="resourceMode"></param>
        /// <returns></returns>
        public static string GetResourceString(string resourceSet, string resourceId,
                             ResourceManager manager,
                             ResourceAccessMode resourceMode)
        {
            if (resourceMode == ResourceAccessMode.AspNetResourceProvider)
                return GetAspNetResourceProviderValue(resourceSet, resourceId) as string;
            if (resourceMode == ResourceAccessMode.Resx)
                return manager.GetString(resourceId);

            return DbRes.T(resourceSet, "LocalizationForm");
        }
        /// <summary>
        /// Helper function called from strongly typed resources to retrieve
        /// string based resource values.
        ///
        /// This method returns a resource string based on the active
        /// Generated ResourceAccessMode.
        /// </summary>
        /// <param name="resourceSet"></param>
        /// <param name="resourceId"></param>
        /// <param name="manager"></param>
        /// <param name="resourceMode"></param>
        /// <returns></returns>
        public static string GetResourceString(string resourceSet, string resourceId,
                                               ResourceManager manager,
                                               ResourceAccessMode resourceMode)
        {
            if (resourceMode == ResourceAccessMode.Resx)
            {
                return(manager.GetString(resourceId));
            }

            return(DbRes.T(resourceId, resourceSet));
        }
 /// <summary>
 /// Helper function called from strongly typed resources to retrieve
 /// non-string based resource values.
 ///
 /// This method returns a resource value based on the active
 /// Generated ResourceAccessMode.
 /// </summary>
 /// <param name="resourceSet"></param>
 /// <param name="resourceId"></param>
 /// <param name="manager"></param>
 /// <param name="resourceMode"></param>
 /// <returns></returns>
 public static object GetResourceObject(string resourceSet, string resourceId,
                                        ResourceManager manager,
                                        ResourceAccessMode resourceMode)
 {
     if (resourceMode == ResourceAccessMode.AspNetResourceProvider)
     {
         return(GetAspNetResourceProviderValue(resourceSet, resourceId));
     }
     if (resourceMode == ResourceAccessMode.Resx)
     {
         return(manager.GetObject(resourceId));
     }
     return(DbRes.TObject(resourceSet, "LocalizationForm"));
 }
        /// <summary>
        /// Helper function called from strongly typed resources to retrieve
        /// string based resource values.
        ///
        /// This method returns a resource string based on the active
        /// Generated ResourceAccessMode.
        /// </summary>
        /// <param name="resourceSet"></param>
        /// <param name="resourceId"></param>
        /// <param name="manager"></param>
        /// <param name="resourceMode"></param>
        /// <returns></returns>
        public static string GetResourceString(string resourceSet, string resourceId,
                                               ResourceManager manager,
                                               ResourceAccessMode resourceMode)
        {
            if (resourceMode == ResourceAccessMode.AspNetResourceProvider)
            {
                return(GetAspNetResourceProviderValue(resourceSet, resourceId) as string);
            }
            if (resourceMode == ResourceAccessMode.Resx)
            {
                return(manager.GetString(resourceId));
            }

            return(DbRes.T(resourceId, resourceSet));
        }
        /// <summary>
        /// Helper function called from strongly typed resources to retrieve
        /// non-string based resource values.
        ///
        /// This method returns a resource value based on the active
        /// Generated ResourceAccessMode.
        /// </summary>
        /// <param name="resourceSet"></param>
        /// <param name="resourceId"></param>
        /// <param name="manager"></param>
        /// <param name="resourceMode"></param>
        /// <returns></returns>
        public static object GetResourceObject(string resourceSet, string resourceId,
                                               ResourceManager manager,
                                               ResourceAccessMode resourceMode)
        {
#if NETFULL
            if (resourceMode == ResourceAccessMode.AspNetResourceProvider)
            {
                return(GetAspNetResourceProviderValue(resourceSet, resourceId));
            }
#endif

            if (resourceMode == ResourceAccessMode.Resx)
            {
                return(manager.GetObject(resourceId));
            }
            return(DbRes.TObject(resourceId, resourceSet));
        }
        /// <summary>
        /// Returns a URL to the JavaScriptResourceHandler.axd handler that retrieves
        /// normalized resources for a given resource set and localeId and creates
        /// a JavaScript object with the name specified.
        ///
        /// This function returns only the URL - you're responsible for embedding
        /// the URL into the page as a script tag to actually load the resources.
        /// </summary>
        /// <param name="varName"></param>
        /// <param name="resourceSet"></param>
        /// <param name="localeId"></param>
        /// <param name="resourceMode></param>
        /// <returns></returns>
        public static string GetJavaScriptResourcesUrl(string varName, string resourceSet,
                                                       string localeId = null,
                                                       ResourceAccessMode resourceMode = ResourceAccessMode.AutoConfiguration)
        {
            if (resourceMode == ResourceAccessMode.AutoConfiguration)
            {
                resourceMode = DbResourceConfiguration.Current.ResourceAccessMode;
            }


            StringBuilder sb      = new StringBuilder(512);
            string        resType = resourceMode == ResourceAccessMode.DbResourceManager ? "resdb" : "resx";

            sb.Append("/api/JavaScriptLocalizationResources");
            sb.Append($"?ResourceSet={resourceSet}&LocaleId={localeId}&VarName={varName}&ResourceMode={resType}");


            return(sb.ToString());
        }
        /// <summary>
        /// Helper function called from strongly typed resources to retrieve
        /// string based resource values.
        ///
        /// This method returns a resource string based on the active
        /// Generated ResourceAccessMode.
        /// </summary>
        /// <param name="resourceSet"></param>
        /// <param name="resourceId"></param>
        /// <param name="manager"></param>
        /// <param name="resourceMode"></param>
        /// <returns></returns>
        public static string GetResourceString(string resourceSet, string resourceId,
                                               ResourceManager manager,
                                               ResourceAccessMode resourceMode)
        {
#if NETFULL
            if (resourceMode == ResourceAccessMode.AspNetResourceProvider)
            {
                return(GetAspNetResourceProviderValue(resourceSet, resourceId) as string);
            }
#endif
            try
            {
                if (resourceMode == ResourceAccessMode.Resx)
                {
                    return(manager.GetString(resourceId));
                }
            }
            catch (Exception ex)
            {
                return(resourceId);
            }

            return(DbRes.T(resourceId, resourceSet));
        }
        public ActionResult ProcessRequest()
        {
            var Request = HttpContext.Request;

            string resourceSet = Request.Query["ResourceSet"];


            string localeId = Request.Query["LocaleId"];

            if (string.IsNullOrEmpty(localeId))
            {
                localeId = "auto";
            }
            string resourceMode = Request.Query["ResourceMode"];

            if (string.IsNullOrEmpty(resourceMode))
            {
                resourceMode = "Resx"; // Resx/ResDb/Auto
            }
            string varname = Request.Query["VarName"];

            if (string.IsNullOrEmpty(varname))
            {
                varname = "resources";
            }

            // varname is embedded into script so validate to avoid script injection
            // it's gotta be a valid C# and valid JavaScript name
            Match match = Regex.Match(varname, @"^[\w|\d|_|$|@|\.]*$");

            if (match.Length < 1 || match.Groups[0].Value != varname)
            {
                SendErrorResponse("Invalid variable name passed.");
            }

            if (string.IsNullOrEmpty(resourceSet))
            {
                SendErrorResponse("Invalid ResourceSet specified.");
            }

            // pick current UI Culture
            if (localeId == "auto")
            {
                try
                {
                    // Use ASP.NET Core RequestLocalization Mapping
                    var cultureProvider = HttpContext.Features.Get <IRequestCultureFeature>();
                    if (cultureProvider != null)
                    {
                        localeId = cultureProvider.RequestCulture.UICulture.IetfLanguageTag;
                    }
                    else
                    {
                        localeId = Thread.CurrentThread.CurrentUICulture.IetfLanguageTag;
                    }
                }
                catch
                {
                    localeId = Thread.CurrentThread.CurrentUICulture.IetfLanguageTag;
                }
            }

            Dictionary <string, object> resDict = null;

            resourceMode = string.IsNullOrEmpty(resourceMode) ? "auto" : resourceMode.ToLower();

            ResourceAccessMode mode = ResourceAccessMode.Resx;

            if (resourceMode == "resdb")
            {
                mode = ResourceAccessMode.DbResourceManager;
            }
            else if (resourceMode == "auto")
            {
                mode = DbResourceConfiguration.Current.ResourceAccessMode;
            }


            if (mode == ResourceAccessMode.DbResourceManager)
            {
                var resManager = DbResourceDataManager.CreateDbResourceDataManager(
                    Config.DbResourceDataManagerType);
                resDict = resManager.GetResourceSetNormalizedForLocaleId(localeId, resourceSet);
                if (resDict == null || resDict.Count == 0)
                {
                    mode = ResourceAccessMode.Resx; // try Resx resources from disk instead
                }
            }
            if (mode != ResourceAccessMode.DbResourceManager) // Resx Resources loaded from disk
            {
                string          basePath  = Request.MapPath(DbResourceConfiguration.Current.ResxBaseFolder, basePath: Host.ContentRootPath);
                DbResXConverter converter = new DbResXConverter(basePath);

                resDict = converter.GetCompiledResourcesNormalizedForLocale(resourceSet,
                                                                            DbResourceConfiguration.Current.ResourceBaseNamespace,
                                                                            localeId);

                if (resDict == null)
                {
                    // check for .resx disk resources
                    string resxPath = converter.FormatResourceSetPath(resourceSet);
                    resDict = converter.GetResXResourcesNormalizedForLocale(resxPath, localeId);
                }
                else
                {
                    resDict = resDict.OrderBy(kv => kv.Key).ToDictionary(k => k.Key, v => v.Value);
                }
            }

            // return all resource strings
            resDict = resDict.Where(res => res.Value is string)
                      .ToDictionary(dict => dict.Key, dict => dict.Value);

            string javaScript = SerializeResourceDictionary(resDict, varname);



#if NETFULL // client cache
            if (!HttpContext.Current.IsDebuggingEnabled)
            {
                Response.ExpiresAbsolute = DateTime.UtcNow.AddDays(1);
                Response.AppendHeader("Accept-Ranges", "bytes");
                Response.AppendHeader("Vary", "Accept-Encoding");
                Response.Cache.SetETag("\"" + javaScript.GetHashCode().ToString("x") + "\"");
                Response.Cache.SetLastModified(DateTime.UtcNow);

                // OutputCache settings
                HttpCachePolicy cache = Response.Cache;

                cache.VaryByParams["ResourceSet"]     = true;
                cache.VaryByParams["LocaleId"]        = true;
                cache.VaryByParams["ResoureType"]     = true;
                cache.VaryByParams["IncludeControls"] = true;
                cache.VaryByParams["VarName"]         = true;
                cache.VaryByParams["ResourceMode"]    = true;
                //cache.SetOmitVaryStar(true);

                DateTime now = DateTime.Now;
                cache.SetCacheability(HttpCacheability.Public);
                cache.SetExpires(now + TimeSpan.FromDays(1));
                cache.SetValidUntilExpires(true);
                cache.SetLastModified(now);
            }
#endif

            return(SendTextOutput(javaScript, "text/javascript; charset=utf-8"));
        }
 /// <summary>
 /// Helper function called from strongly typed resources to retrieve 
 /// non-string based resource values.
 /// 
 /// This method returns a resource value based on the active 
 /// Generated ResourceAccessMode.
 /// </summary>
 /// <param name="resourceSet"></param>
 /// <param name="resourceId"></param>
 /// <param name="manager"></param>
 /// <param name="resourceMode"></param>
 /// <returns></returns>
 public static object GetResourceObject(string resourceSet, string resourceId,
     ResourceManager manager,
     ResourceAccessMode resourceMode)
 {
     if (resourceMode == ResourceAccessMode.AspNetResourceProvider)
         return GetAspNetResourceProviderValue(resourceSet, resourceId);
     if (resourceMode == ResourceAccessMode.Resx)
         return manager.GetObject(resourceId);
     return DbRes.TObject(resourceId, resourceSet);
 }