Интернационализация с ASP.Net MVC3 (Выбор пользователем предпочтительного языка один раз для всех Просмотр) - PullRequest
1 голос
/ 19 января 2012

Я хочу, чтобы пользователь выбрал предпочитаемый язык один раз для всего приложения. предложите мне самые простые возможные шаги.
Таким образом, пользователь выбирает предпочитаемый язык только один раз сразу после входа в систему, а затем весь вид приложения отображается с выбранной культурой.
Я нашел что-то связанное здесь


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

Ответы [ 3 ]

1 голос
/ 19 января 2012

Как правило, .NET будет использовать CultureSetting, который лучше всего подходит для пользователя, а затем определяет соответствующий файл ресурсов, который будет использоваться для глобализации.

Как только вы "сохранили" соответствующую культуру пользователей, они будут находиться в базе данных, сеансеили cookie.

Я перехожу на другой язык:

var language = "fr"; // Pull from your "saved" location (database, session, cookie, etc.)

// This changes UI only
Thread.CurrentThread.CurrentUICulture = new CultureInfo(language);

// This changes how number, date formatting is handled
Thread.CurrentThread.CurrentCulture = new CultureInfo(language);

Надеюсь, это поможет!

0 голосов
/ 19 января 2012

Один из способов сделать это с помощью куки.

Предполагая, что у вас есть раскрывающийся список или какой-либо ввод, где пользователь может выбрать язык, предоставьте эту запись ввода в метод действия. В этом методе действия запишите идентификатор языка в файл cookie:

public class LanguageController
{
    [ActionName("change-to")]
    public virtual RedirectResult Change(LanguageChanger model)
    {
        var langCookie = new HttpCookie(CookieNames.Language);
        langCookie.Value = model.SelectedIsoCode;
        langCookie.Expires = DateTime.UtcNow.AddDays(28);
        HttpContext.Response.Cookies.Add(langCookie);
        return Redirect(model.ReturnUrl);
    }
}

Затем вы можете использовать HttpModule, чтобы установить культуру для каждого запроса. Таким образом, вы знаете, что культура устанавливается во всем конвейере обработки запросов, а не только когда выполняются действия вашего контроллера:

public class CookieLocalizationModule : IHttpModule
{
    public void Dispose() { }

    public void Init(HttpApplication context)
    {
        context.BeginRequest += new EventHandler(context_BeginRequest);
    }

    void context_BeginRequest(object sender, EventArgs e)
    {
        // read the cookie (if any) and set the culture
        if (HttpContext.Current.Request.Cookies[CookieNames.Language] != null)
        {
            var cookie = HttpContext.Current.Request
                .Cookies[CookieNames.Language];
            var lang = cookie.Value;
            var culture = new System.Globalization.CultureInfo(lang);
            Thread.CurrentThread.CurrentCulture = culture;
            Thread.CurrentThread.CurrentUICulture = culture;
        }
    }

}

Чтобы зарегистрировать модуль в IIS & IIS Express, см. Этот web.config (обратите внимание, что конфигурация Cassini будет немного другой)

<system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <modules runAllManagedModulesForAllRequests="true">
        <add name="CookieLocalizationModule" 
            type="MyProject.CookieLocalizationModule, MyProject" />
    </modules>
    <handlers>
        ...
0 голосов
/ 19 января 2012

Я предлагаю вам расширить сущность User с параметром Culture, чтобы сохранить ее в БД.Затем можно добавить информацию о культуре пользователя в Session, например (но можно использовать и любой другой метод)

, затем вам нужно добавить новый атрибут с кодом

public class LocalizationAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        try
        {
            string culture = UserSession.Culture;//Other mechanism of getting userinfo could be used there
            if (!string.IsNullOrEmpty(culture))
            {
                CultureInfo cultureInfo = new CultureInfo(culture); 
                Thread.CurrentThread.CurrentCulture = cultureInfo;
                Thread.CurrentThread.CurrentUICulture = cultureInfo;
            }
        }
        catch (Exception e)
        {
            Logger logger = new Logger();
            logger.LogException(e);
        }
    }
}

И добавьте этот атрибут ко всем вашим контроллерам, которые должны быть локализованы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...