Для текущей культуры не существует манифестов с использованием IStringLocalizer - PullRequest
0 голосов
/ 18 июня 2020

Я разрабатываю серверное приложение, используя. NET core 3.1. Я переместил CommonResource из моего старого проекта (. NET core 2.1), где все работает нормально. Я хочу получить значение ключа в указанной культуре. Реализация CommonResource:

public class CommonResource : ICommonResource
{
    private readonly IStringLocalizer<SharedResource> _localizer;

    public CommonResource(
        IStringLocalizer<SharedResource> localizer)
    {
        _localizer = localizer;
    }

    #region ICommonResource Members

    #region General

    public string AppName(
        string language)
        => GetString(language, nameof(AppName));

    #endregion

    #endregion

    /// <summary>
    ///     Dispose of class and parent classes
    /// </summary>
    public void Dispose()
        => GC.SuppressFinalize(this);

    private string GetString(
        string language,
        string name)
    {
        var currentCulture = CultureInfo.CurrentCulture;

        CultureInfo.CurrentCulture = new CultureInfo(language);
        var value = _localizer[name];
        CultureInfo.CurrentCulture = currentCulture;

        // TEST - check all string
        //var result = _localizer.GetAllStrings();

        return value;
    }
}

LocalizationExtensions с AddDefaultLocalization метод:

public static class LocalizationExtensions
{
    private const bool AcceptLanguageHeaderRequestCultureProvider = false;
    private static readonly CultureInfo CultureInfoEnUs = new CultureInfo("en-US");
    private static readonly CultureInfo CultureInfoPlPl = new CultureInfo("pl-PL");
    private static readonly CultureInfo DefaultRequestCulture = CultureInfoEnUs;

    private static readonly CultureInfo[] SupportedCultures =
    {
        CultureInfoEnUs,
        CultureInfoPlPl
    };

    public static void AddDefaultLocalization(
        this IServiceCollection serviceCollection)
    {
        serviceCollection.AddLocalization();
        serviceCollection.Configure<RequestLocalizationOptions>(
            options =>
            {
                options.DefaultRequestCulture = new RequestCulture(DefaultRequestCulture, DefaultRequestCulture);
                options.SupportedCultures = SupportedCultures;

                if (!AcceptLanguageHeaderRequestCultureProvider)
                {
                    //https://stackoverflow.com/questions/44480759/asp-net-core-default-language-is-always-english
                    options.RequestCultureProviders = new List<IRequestCultureProvider>
                    {
                        new QueryStringRequestCultureProvider(),
                        new CookieRequestCultureProvider()
                    };
                }
            });
    }
}

Мои SharedResources находятся в пути к ресурсам (действие сборки: встроенный ресурс и модификатор доступа: Без генерации кода ). enter image description here

К сожалению, вызов _localizer.GetAllStrings (); генерирует исключение « Для текущей культуры не существует манифестов ".

Я пробовал много решений, например, переместил SharedResources в путь root или установил дополнительный пакет nuget, но ничего не помогло.

Вы знаете, почему в новой версии. net core существует эта проблема? Спасибо за помощь!

...