• Nop源码分析 九--LocalizationService获取资源继续研究


    通过如下方法获取资源:

    public virtual string GetResource(string resourceKey)
            {
                if (_workContext.WorkingLanguage != null)
                    return GetResource(resourceKey, _workContext.WorkingLanguage.Id);
                
                return "";
            }

    而_workContext.WorkingLanguage就是返回是Language实体对象, 传入资源KEY和语言ID ,最终调用如下:

    /// <summary>
            /// Gets a resource string based on the specified ResourceKey property.
            /// </summary>
            /// <param name="resourceKey">A string representing a ResourceKey.</param>
            /// <param name="languageId">Language identifier</param>
            /// <param name="logIfNotFound">A value indicating whether to log error if locale string resource is not found</param>
            /// <param name="defaultValue">Default value</param>
            /// <param name="returnEmptyIfNotFound">A value indicating whether an empty string will be returned if a resource is not found and default value is set to empty string</param>
            /// <returns>A string representing the requested resource string.</returns>
            public virtual string GetResource(string resourceKey, int languageId,
                bool logIfNotFound = true, string defaultValue = "", bool returnEmptyIfNotFound = false)
            {
                string result = string.Empty;
                if (resourceKey == null)
                    resourceKey = string.Empty;
                resourceKey = resourceKey.Trim().ToLowerInvariant();
                if (_localizationSettings.LoadAllLocaleRecordsOnStartup)
                {
                    //load all records (we know they are cached)
                    var resources = GetAllResourceValues(languageId);
                    if (resources.ContainsKey(resourceKey))
                    {
                        result = resources[resourceKey].Value;
                    }
                }
                else
                {
                    //gradual loading
                    string key = string.Format(LOCALSTRINGRESOURCES_BY_RESOURCENAME_KEY, languageId, resourceKey);
                    string lsr = _cacheManager.Get(key, () =>
                    {
                        var query = from l in _lsrRepository.Table
                                    where l.ResourceName == resourceKey
                                    && l.LanguageId == languageId
                                    select l.ResourceValue;
                        return query.FirstOrDefault();
                    });
    
                    if (lsr != null) 
                        result = lsr;
                }
                if (String.IsNullOrEmpty(result))
                {
                    if (logIfNotFound)
                        _logger.Warning(string.Format("Resource string ({0}) is not found. Language ID = {1}", resourceKey, languageId));
                    
                    if (!String.IsNullOrEmpty(defaultValue))
                    {
                        result = defaultValue;
                    }
                    else
                    {
                        if (!returnEmptyIfNotFound)
                            result = resourceKey;
                    }
                }
                return result;
            }

    _localizationSettings.LoadAllLocaleRecordsOnStartup 这一句 是ISetting的子类,所以配置都在Setting表里 返回是true.

    var resources = GetAllResourceValues(languageId); 根据语言ID,获得所有资源:

    /// <summary>
            /// Gets all locale string resources by language identifier
            /// </summary>
            /// <param name="languageId">Language identifier</param>
            /// <returns>Locale string resources</returns>
            public virtual Dictionary<string, KeyValuePair<int,string>> GetAllResourceValues(int languageId)
            {
                string key = string.Format(LOCALSTRINGRESOURCES_ALL_KEY, languageId);
                return _cacheManager.Get(key, () =>
                {
                    //we use no tracking here for performance optimization
                    //anyway records are loaded only for read-only operations
                    var query = from l in _lsrRepository.TableNoTracking
                                orderby l.ResourceName
                                where l.LanguageId == languageId
                                select l;
                    var locales = query.ToList();
                    //format: <name, <id, value>>
                    var dictionary = new Dictionary<string, KeyValuePair<int, string>>();
                    foreach (var locale in locales)
                    {
                        var resourceName = locale.ResourceName.ToLowerInvariant();
                        if (!dictionary.ContainsKey(resourceName))
                            dictionary.Add(resourceName, new KeyValuePair<int, string>(locale.Id, locale.ResourceValue));
                    }
                    return dictionary;
                });
            }

    我们看到private readonly IRepository<LocaleStringResource> _lsrRepository;

    原来所有的语言资源都存在LocaleStringResource表里。  查出后放到字典类型里返回,当然是要缓存的。最后取出值返回。OVER.

  • 相关阅读:
    Spinlock
    Leetcode: Summary Ranges
    Leetcode: Search a 2D Matrix
    Leetcode: Rotate Image
    Leetcode: Length of Last Word in python
    BBC-unit7 session1
    BBC-unit6 session5
    BBC-unit6 session4
    BBC英语-unit6 session3
    BBC英语-unit6 session2
  • 原文地址:https://www.cnblogs.com/runit/p/4200479.html
Copyright © 2020-2023  润新知