加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

Satellite Assembly,ASP.NET语言不变

发布时间:2020-12-16 03:15:24 所属栏目:asp.Net 来源:网络整理
导读:我正在转换一个项目使用卫星装配. 我创建了一个新的类库(名为“Resources”).所有默认资源都位于根级别* .resx. 然后每个文化都有一个文件夹. “恩/” 与* .en.resx EN-GB / 与* .en-GB.resx 我将.resx文件访问修饰符更改为“公共”并更改了这些设置. BuildA
我正在转换一个项目使用卫星装配.
我创建了一个新的类库(名为“Resources”).所有默认资源都位于根级别* .resx.
然后每个文化都有一个文件夹.

“恩/”
与* .en.resx

EN-GB /
与* .en-GB.resx

我将.resx文件访问修饰符更改为“公共”并更改了这些设置.

BuildAction: EmbeddedResource
CopyToOutputDirectory: CopyAlways

我确保.resx设计器* .Designer.cs使用“Resources”命名空间.

我将类库添加到ASP.NET MVC应用程序和global.asax.cs中,我根据需要设置了文化.

System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-GB");
System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-GB");

我尝试将al.exe和Resgen.exe命令添加到Resources类库中的post-build事件.

“C:Program FilesMicrosoft SDKsWindowsv7.1BinResgen.exe”
en-GB/MyResourceFile.en-GB.resx “C:Program FilesMicrosoft
SDKsWindowsv7.1Binal.exe” /t:lib
/embed:en-GB/MyResourceFile.en-GB.resources /culture:en-gb
/out:Resources.resources.dll

查看MVC apps bin /文件夹,每种语言都有3个文件夹:

MyResources.en-GB.Designer.cs,MyResources.en-GB.resx,
Resources.resources.dll

根级别只有Resources.dll和Resources.resources.dll,但默认语言可以正常工作.第二个* .resources.dll是由于构建后事件.

当我更改CurrentUICulture时,它不会更改UI语言.在将资源从App_GlobalResources /移动到外部程序集之前,它工作正常(Razor示例).

@Resources.MyResources.StringIdentifier

使用.NET Reflector查看Resource .dll,这些是不同之处.

Satellite Resources: (Project: Resources)
Resources.en_GB.MyResources.en-GB.resources 
App_GlobalResources: (Project MVCApp)
Namespace.MVCApp.App_GlobalResources.MyResources.en-GB.resources

编辑:

在global.asax.cs中设置CurrentCulture和UICulture之后,我测试了手动检索实际工作的ResourceManager并检索了预期语言的字符串.

System.Resources.ResourceManager gStrings =
                new System.Resources.ResourceManager("Resources.MyResources",System.Reflection.Assembly.Load("Resources")); // Resources=Project Name
            string test = gStrings.GetString("TestString"); // WORKS IN GLOBAL.ASAX.CS!!!

我在MVC控制器中尝试了相同的测试,但它不起作用.因此,可以检索ResourceManager的唯一位置是Global.asax.cs.

奇怪的是,在剃刀的UI级别进行相同的测试只会返回默认的文化文本! cultureInfo是正确的,但ResourceManager仅返回ASP.NET MVC Razor UI中的默认语言. (这严格用于测试)

@{  
        System.Globalization.CultureInfo ci = System.Threading.Thread.CurrentThread.CurrentUICulture;
        System.Resources.ResourceManager gStrings =
            new System.Resources.ResourceManager("Resources.MyResource",System.Reflection.Assembly.Load("Resources"));
        string s = gStrings.GetString("Test");    // DOESN'T WORK IN UI
    }

TLDR版本:

从Resources(.resx)从App_GlobalResources转换为附属程序集.

手头的问题.

我可以使用global.asax中的CurrentUICulture语言手动调用ResourceManager进行附属程序集,并且它按预期工作,但是同样的测试从UI端失败并在MVC控制器中失败.

默认语言工作正常,为什么UI切换语言不正常?

解决方法

如果最近建立了一个项目,其中内部化正常或多或少地像你描述的那样正常工作.

https://github.com/Jacco/Perpetuality

我在我用作基础的控制器中的OnAuthorize中切换每个HTTP请求的语言:

using Perpetuality.Data;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Security.Principal;
using System.Threading;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;


namespace Perpetuality.Controllers
{
    public partial class BaseController : Controller
    {
        private CultureInfo GetCultureInfo(AuthorizationContext filterContext)
        {
            switch ((string)filterContext.RouteData.Values["language"])
            {
                case "nl":
                    return CultureInfo.CreateSpecificCulture("nl-NL");
                case "en":
                    return CultureInfo.CreateSpecificCulture("en-US");
                case "pt":
                    return CultureInfo.CreateSpecificCulture("pt-PT");
                case "de":
                    return CultureInfo.CreateSpecificCulture("de-DE");
                case "es":
                    return CultureInfo.CreateSpecificCulture("es-ES");
                case "fr":
                    return CultureInfo.CreateSpecificCulture("fr-FR");
                case "it":
                    return CultureInfo.CreateSpecificCulture("it-IT");
                case "jp":
                    return CultureInfo.CreateSpecificCulture("ja-JP");
                default:
                    return CultureInfo.CreateSpecificCulture("en-US");
            }
        }

        protected override void OnAuthorization(AuthorizationContext filterContext)
        {
            Thread.CurrentThread.CurrentCulture = GetCultureInfo(filterContext);
            Thread.CurrentThread.CurrentUICulture = GetCultureInfo(filterContext);

            base.OnAuthorization(filterContext);
        }
    }
}

在我的项目中,RESX文件的指定方式与您的不同:

BuildAction: EmbeddedResource
CopyToOutputDirectory: DoNotCopy

在我的竞争中,我访问这样的字符串:

@Resources.Home.Index.FacebookButtonCaption

我没有设置任何帖子或预建.

在我的项目中,语言总是在网址上.如果最初没有选择合适的语言,那么用户可以切换语言.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读