public string Execute(GetTranslation.Query query)
        {
            if (!ConfigurationContext.Current.EnableLocalization())
            {
                return(query.Key);
            }

            var key                  = query.Key;
            var language             = query.Language;
            var cacheKey             = CacheKeyHelper.BuildKey(key);
            var localizationResource = ConfigurationContext.Current.CacheManager.Get(cacheKey) as LocalizationResource;

            if (localizationResource != null)
            {
                return(GetTranslationFromAvailableList(localizationResource.Translations, language, query.UseFallback)?.Value);
            }

            LocalizationResourceTranslation localization = null;
            LocalizationResource            resource;

            try
            {
                resource = new GetResource.Query(key).Execute();
            }
            catch (KeyNotFoundException)
            {
                // this can be a case when Episerver initialization infrastructure calls localization provider way too early
                // and there is no registration for the GetResourceHandler - so we can fallback to default implementation
                // TODO: maybe we should just have default mapping (even if init has not been called)
                // (before any of the setup code in the provider is executed). this happens if you have DisplayChannels in codebase

                resource = new GetResourceHandler().Execute(new GetResource.Query(query.Key));
            }

            if (resource == null)
            {
                resource = LocalizationResource.CreateNonExisting(key);
            }
            else
            {
                localization = GetTranslationFromAvailableList(resource.Translations, language, query.UseFallback);
            }

            ConfigurationContext.Current.CacheManager.Insert(cacheKey, resource);
            return(localization?.Value);
        }
        public IEnumerable <LocalizationResource> Execute(GetAllResources.Query query)
        {
            if (query.ForceReadFromDb)
            {
                return(_inner.Execute(query));
            }

            // get keys for known resources
            var keys = ConfigurationContext.Current.BaseCacheManager.KnownResourceKeys.Keys;

            // if keys = 0, execute inner query to actually get resources from the db
            // this is usually called during initialization when cache is not yet filled up
            if (keys.Count == 0)
            {
                return(_inner.Execute(query));
            }

            var result = new List <LocalizationResource>();

            foreach (var key in keys)
            {
                var cacheKey = CacheKeyHelper.BuildKey(key);
                if (ConfigurationContext.Current.CacheManager.Get(cacheKey) is LocalizationResource localizationResource)
                {
                    result.Add(localizationResource);
                }
                else
                {
                    // failed to get from cache, should call database
                    var resourceFromDb = new GetResource.Query(key).Execute();
                    if (resourceFromDb != null)
                    {
                        ConfigurationContext.Current.CacheManager.Insert(cacheKey, resourceFromDb);
                        result.Add(resourceFromDb);
                    }
                }
            }

            return(result);
        }
示例#3
0
        /// <summary>
        /// Gets the resource from database.
        /// </summary>
        /// <param name="key">The key.</param>
        /// <returns></returns>
        protected virtual LocalizationResource GetResourceFromDb(string key)
        {
            var q = new GetResource.Query(key);

            return(q.Execute());
        }