public virtual async Task <Dictionary <string, ILocalizationDictionary> > GetLocalizationDictionaryAsync(
            string resourceName,
            CancellationToken cancellationToken = default)
        {
            // TODO: 引用缓存?
            var dictionaries = new Dictionary <string, ILocalizationDictionary>();
            var resource     = await ResourceRepository.FindByNameAsync(resourceName, cancellationToken);

            if (resource == null || !resource.Enable)
            {
                // 资源不存在或未启用返回空
                return(dictionaries);
            }

            var texts = await TextRepository.GetListAsync(resourceName, cancellationToken);

            foreach (var textGroup in texts.GroupBy(x => x.CultureName))
            {
                var cultureTextDictionaires = new Dictionary <string, LocalizedString>();
                foreach (var text in textGroup)
                {
                    // 本地化名称去重
                    if (!cultureTextDictionaires.ContainsKey(text.Key))
                    {
                        cultureTextDictionaires[text.Key] = new LocalizedString(text.Key, text.Value.NormalizeLineEndings());
                    }
                }

                // 本地化语言去重
                if (!dictionaries.ContainsKey(textGroup.Key))
                {
                    dictionaries[textGroup.Key] = new StaticLocalizationDictionary(textGroup.Key, cultureTextDictionaires);
                }
            }

            return(dictionaries);
        }