lko*_*lko 5 asp.net asp.net-mvc localization satellite-assembly
我正在转换一个项目使用卫星装配.我创建了一个新的类库(名为"Resources").所有默认资源都位于根级别*.resx
.然后每个文化都有一个文件夹.
"en /"with *.en.resx
en-GB/with *.en-GB.resx
我将.resx文件更改Access Modifier
为"公共"并更改了这些设置.
BuildAction: EmbeddedResource
CopyToOutputDirectory: CopyAlways
Run Code Online (Sandbox Code Playgroud)
我确保.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");
Run Code Online (Sandbox Code Playgroud)
我尝试将al.exe
和Resgen.exe
命令添加到Resources类库中的post-build事件.
"C:\ Program Files\Microsoft SDKs\Windows\v7.1\Bin\Resgen.exe"en-GB/MyResourceFile.en-GB.resx"C:\ Program Files\Microsoft SDKs\Windows\v7.1\Bin\al.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
Run Code Online (Sandbox Code Playgroud)
.dlls
使用.NET Reflector 查看资源,这些是不同之处.
Satellite Resources: (Project: Resources)
Resources.en_GB.MyResources.en-GB.resources
App_GlobalResources: (Project MVCApp)
Namespace.MVCApp.App_GlobalResources.MyResources.en-GB.resources
Run Code Online (Sandbox Code Playgroud)
编辑:
在设置了CurrentCulture和UICulture之后global.asax.cs
,我测试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!!!
Run Code Online (Sandbox Code Playgroud)
我在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
}
Run Code Online (Sandbox Code Playgroud)
TLDR版本:
从Resources(.resx)从App_GlobalResources转换为附属程序集.
手头的问题.
我可以使用CurrentUICulture语言手动调用ResourceManager进行附属程序集,global.asax
并且它按预期工作,但是同样的测试从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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
在我的项目中,RESX 文件的指定方式与您的项目不同:
BuildAction: EmbeddedResource
CopyToOutputDirectory: DoNotCopy
Run Code Online (Sandbox Code Playgroud)
在我看来,我像这样访问字符串:
@Resources.Home.Index.FacebookButtonCaption
Run Code Online (Sandbox Code Playgroud)
我没有在构建后或构建前进行任何设置。
在我的项目中,语言始终位于网址上。如果最初没有选择合适的语言,用户可以切换语言。