使用ASP.Net MVC3进行国际化(用户为所有视图选择一次首选语言)

时间:2012-01-19 08:03:38

标签: asp.net asp.net-mvc asp.net-mvc-3 internationalization

我希望用户为整个应用选择一次首选语言。建议我最简单的步骤。
这样用户只需在登录后选择一次首选语言,然后用选定的文化呈现所有应用程序的视图。
我找到了相关的here


因为我是国际化的新手,所以我得不到它。
我创建了一个示例应用程序,它与浏览器特定的文化一起工作正常,但我希望用户选择首选语言。

3 个答案:

答案 0 :(得分:1)

通常,.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);

希望有所帮助!

答案 1 :(得分:0)

我建议您使用Culture参数扩展User实体以将其存储在DB中。 然后可以在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);
        }
    }
}

并将此属性添加到应该本地化的所有控制器

答案 2 :(得分:0)

一种方法是使用cookie。

假设您有一个下拉列表或用户可以选择语言的某种输入,请将该输入发布到操作方法。在该操作方法中,将语言ID写入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>
        ...