资源无法加载当前文化。

4
我将尝试更改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.fr.resx 并没有和 dll 文件放在一起。


你正在使用 Web Hosting Web API 吗? - Fals
我不确定你所说的Web Hosting Web API是什么意思。你能解释一下吗? - Marc
2
在Global.asax中的protected void Application_BeginRequest(Object sender, EventArgs e)中设置文化,并查看是否有所更改。 - Fals
如果您不是在Web应用程序上托管它,或者想要一些乐趣,那么您应该创建一个委托句柄来设置文化。委托句柄将在管道中早于控制器执行。 - Fals
我已经在我的ASP.NET MVC项目中创建了一个资源库,并将其引用到API中。然后,我可以像在我的问题示例中那样调用资源,例如Resources.Resources.ConfirmAccount。还有其他需要做的事情吗? - Marc
显示剩余6条评论
1个回答

6
我找到了问题所在。
当你使用资源编译一个项目时,它会为每种语言创建一个文件夹,并生成一个后缀为`.dll`的文件。
因此我必须复制这些文件夹,而不仅仅是`resources.dll`,因为这只是默认语言。这就是为什么无论是什么语言环境,我的资源都是英文的原因。
要使用`resources.dll`,你需要
  1. 导入该引用
  2. 将所有语言文件夹与所有的`.dll`一起复制到bin文件夹中
注意:你只需要为默认语言添加引用,不需要为每个语言环境都添加引用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接