Лучший способ получить культуру браузера в веб-сборке / клиентском приложении Blazor

Я знаю, как получить текущую информацию о культуре для серверного приложения Blazor, используя HTTPContext с IRequestCultureFeature. Есть ли лучший способ получить текущую культуру браузера в веб-сборке Blazor (wasm) / клиентском приложении?


person Son04    schedule 12.12.2019    source источник


Ответы (2)


В настоящее время Blazor размера клиента не имеет возможности получить данные о культуре, потому что mono на веб-сборке не реализует его (пока - отслеживается на github).

Насколько мне известно, лучший вариант - найти его с помощью javascript, а затем отправить в Blazor с помощью JsInterop.

Что-то вроде этого, чтобы вы начали, на странице индекса в теге скрипта:

window.getCulture = function () {
    return (navigator.languages && navigator.languages.length) ? navigator.languages[0] : 
    navigator.userLanguage || navigator.language || navigator.browserLanguage || 'en';
}

Затем в Blazor:

@page "/"
@inject IJSRuntime JSRuntime

@code{
    protected override async Task OnInitializedAsync()
    {
        var browserLocale = await JSRuntime.InvokeAsync<string>("getCulture");
        Console.WriteLine(browserLocale);
    }
}

Затем проверьте окно консоли, и вы увидите напечатанную культуру.

Изменить: на самом деле кто-то сделал для этого пакет с открытым исходным кодом, который может быть проще в использовании: https://github.com/Blazored/Localisation
https://www.nuget.org/packages/Blazored.Localisation/

person Kyle    schedule 12.12.2019

Вы можете запросить язык браузера с помощью JSInterop:

window.browserJsFunctions = {
    getLanguage: () => {
        return navigator.language || navigator.userLanguage;
    },
    getBrowserTimeZoneOffset: () => {
        return new Date().getTimezoneOffset();
    },
    getBrowserTimeZoneIdentifier: () => {
        return Intl.DateTimeFormat().resolvedOptions().timeZone;
    },
};
@inject IJSRuntime _jsRuntime
@code {
        string _cultureName;

        protected override async Task OnAfterRenderAsync(bool firstRender)
        {
            if (firstRender)
            {
                _cultureName = await _jsRuntime.InvokeAsync<string>("browserJsFunctions.getLanguage");
            }
        }
}
person agua from mars    schedule 12.12.2019