Я использую ABP v4.9.0 (.NET CORE 2.2) с клиентом angular
Я создал несколько специализированных провайдеров локализации. Эти поставщики получают словари переводов из внешнего API. Я добавляю источники локализации при запуске с этими поставщиками.
var customProvider = new CustomLocalizationProvider(...);
var localizationSource = new DictionaryBasedLocalizationSource("SOURCENAME", customProvider );
config.Localization.Sources.Add(localizationSource );
При запуске вызывается поставщик InitializeDictionaries () и создаются словари локализации. Пока все хорошо, работает как задумано.
Теперь я хочу вручную перезагрузить эти переводы по запросу, но у меня это не работает.
Вот что я пробовал.
Здесь я запускаю повторную синхронизацию языковых ресурсов:
foreach (var localizationSource in _localizationConfiguration.Sources)
{
try
{
localizationSource.Initialize(_localizationConfiguration, _iocResolver);
}
catch (Exception e)
{
Logger.Warn($"Could not get Localization Data for source '{localizationSource.Name}'", e);
}
}
В кастомном провайдере я сначала очищаю словари
public class CustomLocalizationProvider : LocalizationDictionaryProviderBase
{
protected int IterationNo = 0;
protected override void InitializeDictionaries()
{
Dictionaries.Clear();
IterationNo += 1;
var deDict = new LocalizationDictionary(new CultureInfo("de-DE"));
deDict["HelloWorld"] = $"Hallo Welt Nummer {IterationNo}";
Dictionaries.Add("de-DE", deDict);
var enDict = new LocalizationDictionary(new CultureInfo("en"));
enDict["HelloWorld"] = $"Hello World number {IterationNo}";
Dictionaries.Add("en", enDict);
}
}
Провайдер снова выполняется, как и ожидалось.
Но когда я в конечном итоге использую клиентскую локализацию (angular), я все равно получаю оригинальные переводы.
Что мне не хватает?
Спасибо за помощь.
language.LanguageCode
? Вы правы, что источник и поставщик кэшируются, ноDictionaryBasedLocalizationSource.GetAllStrings
, похоже, использует последнюю версиюDictionaries
: DictionaryBasedLocalizationSource.cs # L141 - person aaron   schedule 27.01.2020DictionaryBasedLocalizationSource.GetAllStrings
также возвращает исходные, кэшированные исходники. - person Puur   schedule 30.01.2020localizationSource.Initialize
, как вы показываете в вопросе: acjplateh / aspnet5cailer7 - person aaron   schedule 31.01.2020Configuration.Localization.Sources
; затем удалите его и повторно добавьте новый экземпляр (чтобы убедиться, что он правильно инициализируется; или, по крайней мере, в моем случае это то, что мне нужно). В вашем репо код находится вaspnet-core/src/AbpCompanyName.AbpProjectName.Core/Localization/AbpProjectNameLocalizationConfigurer.cs#L12-L19
. (...) - person Avenger   schedule 10.02.2020aspnet-core/src/AbpCompanyName.AbpProjectName.Core/AbpProjectNameCoreModule.cs#L27
(модуляPreInitialize()
). Я подозреваю, что если вы каким-то образом повторно добавите этот источник локализации, он должен обновиться для оставшихся запросов. Но я просто не могу попасть в этоConfiguration.Localization.Sources
извне модуля. : / - person Avenger   schedule 10.02.2020DefaultDictionary = enDict;
. Может быть, вы запрашиваете словарь по умолчанию, но не заменили его должным образом? - person Avenger   schedule 10.02.2020