Как программно изменить класс культуры (вызов реализованного коммутатора)

Я внедрил культуру в свою систему. Изменение с выбранным полем со списком работает нормально.

[Выбранный английский

[Выбранный немецкий

Теперь я хочу в зависимости от языка пользователя изменить язык.

Я читал другие описания, но я не могу заставить его работать.

======================= Моя модель класса коммутатора ====================

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Threading.Tasks;

    namespace WorkCollaboration.Models
    {
        public class SwitchCultureModel
        {
            public CultureInfo CurrentUICulture { get; set; }
            public List<CultureInfo> SupportedCultures { get; set; }
        }
    }

У меня есть общая служба входа в систему, где я проверяю языки привилегий пользователя.... В системе я создал страницу, на которой я хочу изменить сеанс языка пользователя и так далее.

Вот так выглядит моя страница

[Экран изменения языка пользователя

========= Это моя бритвенная страница ==========

@page
@using Microsoft.AspNetCore.Localization
@using Microsoft.AspNetCore.Mvc.Localization
@model WorkCollaboration.Pages.LogonService.LanguageModel

@{
    ViewData["Title"] = "UserLanguage";
}

@inject IViewLocalizer Localizer

<h1>@Localizer["Edit"]</h1>

<h4>@Localizer["LogonService"]</h4>
<p>
    <a asp-page="/LogonService/IndexLanguage">@Localizer["Back to Index"]</a>
</p>
<hr />
<div class="row">
    <div class="col-md-4">
        <form method="post">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <input type="hidden" asp-for="LogonService.WorkColUserMail" />
            <input type="hidden" asp-for="LogonService.WorkColUserId" class="form-control" />
            <input type="hidden" asp-for="LogonService.WorkColUserPassword" class="form-control" />
            <input type="hidden" asp-for="LogonService.WorkColUserPasswordConfirm" class="form-control" />
            <input type="hidden" asp-for="LogonService.WorkColUserName" class="form-control" />
            <input type="hidden" asp-for="LogonService.WorkColUserVerificationMode" class="form-control" />
            <input type="hidden" asp-for="LogonService.WorkColEnteredPassword" class="form-control" />
            <input type="hidden" asp-for="LogonService.WorkColLoggedIn" class="form-control" />
            <div class="form-group">
                @Html.LabelFor(model => model.LogonService.WorkColUserLanguage, htmlAttributes: new { @class = "form-group" })
                <div class="form-group">
                    @Html.DropDownListFor(model => model.LogonService.WorkColUserLanguage, new List<SelectListItem>
                    {
                        new SelectListItem {Text = "DE", Value = "DE", Selected = true },
                        new SelectListItem {Text = "EN", Value = "EN" },
                    }, new { @class = "form-control" })
                    @Html.ValidationMessageFor(model => model.LogonService.WorkColUserLanguage, "", new { @class = "text-danger" })
                </div>
            </div>

            <div class="form-group">
                <input type="submit" value="Save" class="btn btn-primary" />
            </div>
        </form>
    </div>
</div>

<div>
    <a asp-page="/LogonService/IndexLanguage">@Localizer["Back to List"]</a>
</div>

@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

В С# я вызываю следующие потоки

        if (LogonService.WorkColUserLanguage == "DE")
        {
            Thread.CurrentThread.CurrentCulture =
                CultureInfo.CreateSpecificCulture("de");
            Thread.CurrentThread.CurrentUICulture = new
                CultureInfo("de");
        }
        if (LogonService.WorkColUserLanguage == "EN")
        {
            Thread.CurrentThread.CurrentCulture =
                CultureInfo.CreateSpecificCulture("en");
            Thread.CurrentThread.CurrentUICulture = new
                CultureInfo("en");
        }

Однако язык страницы остается на том же языке

========== Здесь мой код С# ======================

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.EntityFrameworkCore;
using Microsoft.VisualBasic;
using WorkCollaboration.Data;
using WorkCollaboration.Models;
using System.Collections;
using System.Web;

namespace WorkCollaboration.Pages.LogonService
{
    public class LanguageModel : PageModel
    {
        private readonly WorkCollaboration.Data.WorkCollaborationContext _context;

        public LanguageModel(WorkCollaboration.Data.WorkCollaborationContext context)
        {
            _context = context;
        }

        [BindProperty]
        public Models.LogonService LogonService { get; set; }

        public async Task<IActionResult> OnGetAsync(string id)
        {
            if (id == null)
            {
                return NotFound();
            }

            LogonService = await _context.LogonService.FirstOrDefaultAsync(m => m.WorkColUserMail == id);

            if (LogonService == null)
            {
                return NotFound();
            }
            return Page();
        }

        // To protect from overposting attacks, enable the specific properties you want to bind to, for
        // more details, see https://aka.ms/RazorPagesCRUD.
        public async Task<IActionResult> OnPostAsync()
        {

            string id = LogonService.WorkColUserMail;
            byte[] ep = LogonService.WorkColEnteredPassword;
            string ln = LogonService.WorkColUserLanguage;
            string SessionKeyName = "_Name";
            string SessionKeyId = "_Id";
            string SessionKeyDate = "_Date";
            string SessionKeyLang = "_Lang";

            if (id == null)
            {
                return NotFound();
            }
            //====================================
            // Load WorColUser Data with Mail Key
            //====================================

            LogonService = await _context.LogonService.FirstOrDefaultAsync(m => m.WorkColUserMail == id);

            //====================================
            // Overwrite Data with GUI Data
            //====================================
            LogonService.WorkColEnteredPassword = ep;
            LogonService.WorkColUserLanguage = ln;
            LogonService.WorkColLoggedIn = true;

            //====================================
            // Create SessionID
            //====================================

            DateTime now = DateTime.Now;
            string valueSystemKeyDates = now.ToString("yyyymmddhh:mm:ss");

            HttpContext.Session.SetString(SessionKeyDate, valueSystemKeyDates);
            HttpContext.Session.SetString(SessionKeyId, Convert.ToString(LogonService.WorkColUserId));
            HttpContext.Session.SetString(SessionKeyName, LogonService.WorkColUserMail);
            HttpContext.Session.SetString(SessionKeyLang, LogonService.WorkColUserLanguage);

            var SessionIdDate = HttpContext.Session.GetString(SessionKeyDate);
            var SessionIdId = HttpContext.Session.GetString(SessionKeyId);
            var SessionIdName = HttpContext.Session.GetString(SessionKeyName);
            var SessionIdLang = HttpContext.Session.GetString(SessionKeyLang);

            LogonService.WorkColUserSessionId = Strings.RTrim(SessionIdDate) + " " + Strings.RTrim(SessionIdName) + " " + Strings.RTrim(SessionIdId) + " " + Strings.RTrim(SessionIdLang);

            //=========================================
            // Change Culture on specific user language
            //=========================================


            if (LogonService.WorkColUserLanguage == "DE")
            {
                Thread.CurrentThread.CurrentCulture =
                    CultureInfo.CreateSpecificCulture("de");
                Thread.CurrentThread.CurrentUICulture = new
                    CultureInfo("de");
            }
            if (LogonService.WorkColUserLanguage == "EN")
            {
                Thread.CurrentThread.CurrentCulture =
                    CultureInfo.CreateSpecificCulture("en");
                Thread.CurrentThread.CurrentUICulture = new
                    CultureInfo("en");
            }

            if (!ModelState.IsValid)
            {
                return Page();
            }

            _context.Attach(LogonService).State = EntityState.Modified;

            try
            {
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!LogonServiceExists(LogonService.WorkColUserMail))
                {
                    return NotFound();
                }
                else
                {
                    throw;
                }
            }

            return RedirectToPage("/LogonService/IndexLanguage");
        }

        private bool LogonServiceExists(string id)
        {
            return _context.LogonService.Any(e => e.WorkColUserMail == id);
        }
    }
}

Спасибо за помощь

================================================== ============================ Обновление: 25.01.2021: Я дополнительно исследовал, почему значения, определенные моей культурой, не работают. И я нашел причину почему. В моем SwithCulturViewComponent.cs культура при каждой загрузке страницы или выходе обновляется до той, которая определена в языках в комбинации (см. Рис. 1 или 2)

Теперь я попытался повлиять на класс переключателя, установив информацию о культуре из пользовательского языка из сеанса.

=================== SwitchCultureViewComponet ===============

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Localization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using WorkCollaboration.Models;

namespace WorkCollaboration.ViewComponents
{
    public class SwitchCultureViewComponent : ViewComponent
    {
        private readonly IOptions<RequestLocalizationOptions> localizationOptions;

        public SwitchCultureViewComponent(IOptions<RequestLocalizationOptions> localizationOptions)
        {
            this.localizationOptions = localizationOptions;
        }

        public IViewComponentResult Invoke()
        {

            //=============================================
            // Get Session Language
            //=============================================
            string SessionKeyName = "_Name";
            string SessionKeyId = "_Id";
            string SessionKeyDate = "_Date";
            string SessionKeyLang = "_Lang";

            var SessionIdDate = HttpContext.Session.GetString(SessionKeyDate);
            var SessionIdId = HttpContext.Session.GetString(SessionKeyId);
            var SessionIdName = HttpContext.Session.GetString(SessionKeyName);
            var SessionIdLang = HttpContext.Session.GetString(SessionKeyLang);

            if (SessionIdId == null)
            {
                SessionIdId = "0";
            }
            if (SessionIdId == "")
            {
                SessionIdId = "0";
            }

            if (SessionIdLang == null)
            {
                SessionIdLang = "DE";
            }
            if (SessionIdLang == "")
            {
                SessionIdLang = "DE";
            }

            //=========================================
            // Change Culture on specific user language
            //=========================================


            if (SessionIdLang == "DE")
            {
                CultureInfo myCIintl = new CultureInfo("de-CH", false);

                CultureInfo current = CultureInfo.CurrentCulture;
                Console.WriteLine("The current culture is {0}", current.Name);
                CultureInfo newCulture;
                newCulture = new CultureInfo("de-CH");

                CultureInfo.CurrentCulture = newCulture;
                Console.WriteLine("The current culture is now {0}",
                    CultureInfo.CurrentCulture.Name);

                CultureInfo.CurrentUICulture = new CultureInfo("de-CH", false);
                //                CultureInfo.CurrentUICulture = CultureInfo.CreateSpecificCulture("de-CH");
                Console.WriteLine("CurrentUICulture is now {0}.", CultureInfo.CurrentUICulture.Name);

            }

            if (SessionIdLang == "DE")
            {
                CultureInfo myCIintl = new CultureInfo("en-US", false);

                CultureInfo current = CultureInfo.CurrentCulture;
                Console.WriteLine("The current culture is {0}", current.Name);
                CultureInfo newCulture;
                newCulture = new CultureInfo("en-US");

                CultureInfo.CurrentCulture = newCulture;
                Console.WriteLine("The current culture is now {0}",
                    CultureInfo.CurrentCulture.Name);

                CultureInfo.CurrentUICulture = new CultureInfo("en-US", false);
                //                CultureInfo.CurrentUICulture = CultureInfo.CreateSpecificCulture("de-CH");
                Console.WriteLine("CurrentUICulture is now {0}.", CultureInfo.CurrentUICulture.Name);

            }

            // How can I influence this code below. I only want this to be executed when I change the UI language code in the dropdown
            // Otherwise it should use the custure Info from the above user languages 


            var cultureFeature = HttpContext.Features.Get<IRequestCultureFeature>();

            var model = new SwitchCultureModel
            {
                SupportedCultures = localizationOptions.Value.SupportedUICultures.ToList(),
                CurrentUICulture = cultureFeature.RequestCulture.UICulture
            };
            return View(model);
        }
    }
}

Как я могу повлиять на этот код ниже? Я хочу, чтобы это выполнялось только при изменении кода языка пользовательского интерфейса в раскрывающемся списке. В противном случае он должен использовать информацию о культуре из указанных выше пользовательских языков.

Всякий раз, когда я пытаюсь использовать CurrentUICuture в var...

============ Раздел в SwitchViewComponent.cs ==============

    var model = new SwitchCultureModel
            {
            SupportedCultures = 
localizationOptions.Value.SupportedUICultures.ToList(),
               CurrentUICulture = cultureFeature.RequestCulture.UICulture
            };
            return View(model);

Я получаю ошибки. Спасибо за Вашу поддержку


person Christof Oberholzer    schedule 15.01.2021    source источник
comment
Может ли кто-нибудь помочь в том, как вызвать класс переключения из кода С#. спасибо   -  person Christof Oberholzer    schedule 22.01.2021
comment
Я обновил дальнейший ввод. Спасибо за ваш совет. Дополнительную информацию можно найти на линии Обновление 25.1.2021   -  person Christof Oberholzer    schedule 25.01.2021
comment
Этот пост работает, многие другие не stackoverflow.com/questions/47398474/ :-(   -  person Christof Oberholzer    schedule 15.02.2021
comment
Отвечает ли это на ваш вопрос? Локализация ядра Asp.net всегда возвращает английскую культуру   -  person Wai Ha Lee    schedule 08.03.2021