You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
3.0 KiB
86 lines
3.0 KiB
3 years ago
|
using Microsoft.Extensions.DependencyInjection;
|
||
|
using Microsoft.Extensions.Localization;
|
||
|
using Sanhe.Abp.Localization.Dynamic;
|
||
|
using System;
|
||
|
using System.Collections.Generic;
|
||
|
using System.Linq;
|
||
|
using System.Threading;
|
||
|
using System.Threading.Tasks;
|
||
|
using Volo.Abp.DependencyInjection;
|
||
|
using Volo.Abp.Localization;
|
||
|
|
||
|
namespace Sanhe.Abp.LocalizationManagement;
|
||
|
|
||
|
[Dependency(ServiceLifetime.Singleton, ReplaceServices = true)]
|
||
|
[ExposeServices(
|
||
|
typeof(ILocalizationStore),
|
||
|
typeof(LocalizationStore))]
|
||
|
public class LocalizationStore : ILocalizationStore
|
||
|
{
|
||
|
protected ILanguageRepository LanguageRepository { get; }
|
||
|
protected ITextRepository TextRepository { get; }
|
||
|
protected IResourceRepository ResourceRepository { get; }
|
||
|
|
||
|
public LocalizationStore(
|
||
|
ILanguageRepository languageRepository,
|
||
|
ITextRepository textRepository,
|
||
|
IResourceRepository resourceRepository)
|
||
|
{
|
||
|
TextRepository = textRepository;
|
||
|
LanguageRepository = languageRepository;
|
||
|
ResourceRepository = resourceRepository;
|
||
|
}
|
||
|
|
||
|
public async virtual Task<List<LanguageInfo>> GetLanguageListAsync(
|
||
|
CancellationToken cancellationToken = default)
|
||
|
{
|
||
|
var languages = await LanguageRepository.GetActivedListAsync(cancellationToken);
|
||
|
|
||
|
return languages
|
||
|
.Select(x => new LanguageInfo(x.CultureName, x.UiCultureName, x.DisplayName, x.FlagIcon))
|
||
|
.ToList();
|
||
|
}
|
||
|
|
||
|
public async virtual 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;
|
||
|
}
|
||
|
|
||
|
public async virtual Task<bool> ResourceExistsAsync(string resourceName, CancellationToken cancellationToken = default)
|
||
|
{
|
||
|
return await ResourceRepository.ExistsAsync(resourceName, cancellationToken);
|
||
|
}
|
||
|
}
|