资源不会加载当前的文化

时间:2014-06-05 22:00:58

标签: c# asp.net-web-api

我正试图改变ASP.NET Web API 2上的文化 但我无法弄清楚要覆盖哪个功能

我尝试了ExecuteAsyncInitialize,但应用程序无论如何都会使用英语资源。

这就是我设置文化的方式

        protected void SetCulture(string cultureName)
        {
            // Validate culture name
            cultureName = CultureHelper.GetImplementedCulture(cultureName);

            // Modify current thread's cultures            
            Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(cultureName);
            Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
        }

        protected override void Initialize(HttpControllerContext controllerContext)
        {
             if (controllerContext.Request.Headers.AcceptLanguage != null &&
                controllerContext.Request.Headers.AcceptLanguage.Count > 0)
             {
                 string language = controllerContext.Request.Headers.AcceptLanguage.First().Value;

                 SetCulture(language);
             }
            base.Initialize(controllerContext);
        }

这里的资源总是用英文。我在Thread.CurrentThread.CurrentCulture上放了一块手表,它说fr

        private void SendConfirmationEmail(string userId)
        {
            ...
            UserManager.SendEmail(userId,
                Resources.Resources.ConfirmAccount,
                Resources.Resources.PleaseClickToConfirmAccount
                                                + callbackUrl);

        }

我们如何设定当前的文化?

修改

Global.asax

中设置文化后,我遇到了同样的问题
        protected void Application_BeginRequest(Object sender, EventArgs e)
        {
            HttpRequest currentRequest = HttpContext.Current.Request;
            if (currentRequest.Headers.AllKeys.Contains("Accept-Language"))
            {
                string culture = currentRequest.Headers["Accept-Language"].ToString();
                SetCulture(culture);
            }
        }

Thread.CurrentThread.CurrentCulture等于fr。我不明白为什么这些资源仍然是英文的!

编辑2

我在Web API项目的属性中创建了资源文件,现在它可以正常工作。

所以问题出在resources.dll。

我不明白为什么API无法使用resources.dll选择好的资源文件。也许resources.fr.resx不是用dll。

1 个答案:

答案 0 :(得分:4)

我发现了问题。

使用资源编译项目时,它会为每个具有.dll

的文化创建一个文件夹

所以我不得不复制这些文件夹。不仅resources.dll,因为这只是默认语言。这就是为什么无论文化是什么,我的资源都是英文的。

所以要使用resources.dll

  1. 您必须导入该引用
  2. 使用所有.dll
  3. 复制bin文件夹中的所有文化文件夹

    注意:您不必为每种文化添加参考,只需添加默认文化。