通过如下方法获取资源:
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.