8

我有一个 ASP.NET Web API 应用程序,它应该对用户的 Accept-Language 标头做出适当的反应。

目前,字符串存储在 resx 中,并通过 Visual Studio 生成的类以编译安全的方式访问。我想做的是保留当前的方法并为每个翻译版本的 resx 创建附属程序集。然后分析用户的 Accept-Language 标头以查看用户接受哪些语言并从附属程序集中加载所请求语言的资源。

我想我可以通过ResourceManager在 的帮助下创建一组特定于语言的对象来自己实现所有这些行为,ResourceSet但是由于 Visual Studio 会自动更新 resx 的类,因此无法保持编译时安全文件。

动态选择本地化语言资源的最佳方法是什么?

4

2 回答 2

11

通过阅读您的问题,我没有看到 ASP.NET 没有自动提供的任何内容。您可以将 ASP.NET(无论是 WebForms 还是 MVC)配置为使用accept-language请求标头并设置适当的 UICulture(这将影响 ResourceManager 加载哪个附属程序集)和 Culture(这将影响依赖于区域设置的格式和解析,例如日期和数字)适当。

要将您的应用程序配置为使用accept-language列表为每个请求设置 UICulture 和 Culture(根据此 MSDN 页面),请像这样配置您的 web.config:

<globalization uiCulture="auto" culture="auto" />

每页还有一个等效的配置设置。

然后,根据资源回退过程,如果您的应用程序包含匹配文化的附属程序集(或者,如果失败,则为其父中性文化),资源管理器将使用它。如果不是,那么将使用您的默认资源(如果那是您的基本语言,则为英语)。

于 2012-06-18T08:46:56.387 回答
4

您可以编写一个HttpModule检测语言标头并设置当前线程文化的代码。

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

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

    void context_BeginRequest(object sender, EventArgs e)
    {
        var application = sender as HttpApplication;
        var context = application.Context;
        var lang = context.Request.Headers["Accept-Language"];

        // eat the cookie (if any) and set the culture
        if (!string.IsNullOrEmpty(lang))
        {
            var culture = new System.Globalization.CultureInfo(lang); // you may need to interpret the value of "lang" to match what is expected by CultureInfo

            Thread.CurrentThread.CurrentCulture = culture;
            Thread.CurrentThread.CurrentUICulture = culture;
        }
    }
}

ResourceManager等人将从线程文化中找出要使用的正确本地化版本。

于 2012-06-18T07:18:46.583 回答