Access to resources by the following method:
public virtual string GetResource(string resourceKey) { if (_workContext.WorkingLanguage != null) return GetResource(resourceKey, _workContext.WorkingLanguage.Id); return ""; }
And that is returned is _workContext.WorkingLanguage Language entity objects, KEY incoming resources and language ID, the final call is as follows:
/// <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 this one is ISetting subclass, the configuration returns in Setting table is true.
var Resources = GetAllResourceValues (languageId); according to the language ID, access to all resources:
/// <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; }); }
We see private readonly IRepository <LocaleStringResource> _lsrRepository;
All original language resources exist LocaleStringResource table. After the return into the dictionary type found in, of course, it is to be cached. Remove the last value is returned. OVER.