【问题标题】:ABP: Rebuilding Localization Sources from Custom ProviderABP:从自定义提供程序重建本地化源
【发布时间】:2020-01-23 15:08:21
【问题描述】:

我正在使用 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)上刷新。
  • 我确实刷新了客户端。旧的翻译似乎被缓存在服务器端,而不仅仅是客户端
  • 更正:我使用 ABP 4.9.0 (CORE 2.2)
  • 什么是language.LanguageCode?你是对的,源和提供者被缓存了,但DictionaryBasedLocalizationSource.GetAllStrings似乎使用最新的DictionariesDictionaryBasedLocalizationSource.cs#L141
  • language.Language 是使用来自某些外部服务的数据的更长代码的摘录。

标签: asp.net-core localization aspnetboilerplate abp


【解决方案1】:

与此同时,我不得不另辟蹊径。

我现在使用由MultiTenantLocalizationDictionaryProvider 包裹的XmlEmbeddedFileLocalizationDictionaryProvider。 这样,我使用带有 xml-sources 的 db-localizations 作为后备

然后我在一些应用服务中手动从我的 API 加载资源。然后使用LanguageTextManager.UpdateStringAsync() 在数据库中更新这些本地化。

【讨论】:

    猜你喜欢
    • 2011-06-19
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 2020-08-07
    • 1970-01-01
    相关资源
    最近更新 更多