我有一个以 10 种不同语言国际化的 ASP.NET3.5 (C#) ASPX 页面。
该页面的结构非常复杂,包含数十个由状态机模式驱动的嵌套 View 。
编辑:我在每个 asp 控件中使用 meta:resourcekey
语法,它允许对隐式资源表达式使用声明性语法。
有人要求我根据一些查询字符串参数为页面“打上烙印”。品牌化不仅意味着加载不同的 CSS 文件,还意味着具有不同的文本简介(在所有语言中)。
有没有一种简单的方法可以“交换”resx 文件,而无需为我在这个页面上的数百个文字和图像中的每一个手动获取资源?
换句话说,假设我有以下 RESX 文件:
brand1_myPage.aspx.en-US.resx
brand1_myPage.aspx.de-DE.resx
brand1_myPage.aspx.fr-FR.resx
brand2_myPage.aspx.en-US.resx
brand2_myPage.aspx.de-DE.resx
brand2_myPage.aspx.fr-FR.resx
myPage.aspx 将查找名为 myPage.xx-XX.resx 的 resx 文件。
有没有办法根据某些值加载 brand1xxx.resx 文件或 brand2xxx.resx?
提前致谢。
最佳答案
您可以使用 custom cultures达到这个效果。
首先在系统中创建并注册自定义文化,例如:
CultureAndRegionInfoBuilder builder = new CultureAndRegionInfoBuilder("en-US-brand1", CultureAndRegionModifiers.None);
CultureInfo parentCI = new CultureInfo("en-US");
RegionInfo parentRI = new RegionInfo("en-US");
builder.LoadDataFromCultureInfo(parentCI);
builder.LoadDataFromRegionInfo(parentRI);
builder.Parent = parentCI;
// set other properties of the custom culture (CultureEnglishName, CultureNativeName, possibly other ones)
// ...
builder.Register();
请注意,您可能希望构建一个简单的工具来自动执行此操作,因为这些文化需要安装在将编译或执行您的应用程序的每个系统上。需要管理权限才能注册培养物。
安装文化后,像往常一样创建 resx 文件,但使用自定义文化名称(myPage.aspx.en-US-brand1.resx 等)。
现在剩下要做的就是根据一些参数设置 System.Threading.Thread.CurrentThread.CurrentUICulture(越快越好,BeginRequest 是个好地方;或者 Page_PreInit,如果你只希望某些页面这样做):
CultureInfo ci = new CultureInfo(Request.QueryString["paramname"]);
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = ci;
(设置 CurrentCulture 并不是真正必要的,因为资源是根据 CurrentUICulture 工作的,但是同时设置两者允许您为每个品牌进一步自定义页面,例如,为每个自定义文化/品牌使用不同的日期/时间格式设置)
一些注意事项:
- 此解决方案为您提供了极大的灵 active ,因为正常的文化回退是有效的——如果没有找到 en-US-brandX 的条目,运行时将回退到 en-US 等等;如果品牌大部分相似,这可以大大减少重复的 resx 条目,因为您可以仅将一些条目放在父 (en-US) resx 文件中,
- 您可以创建更多级别的继承文化,例如 en-US-brandX-variantY,
- 所有访问资源的方法都按预期工作,
- 更改工作线程的区域性意味着如果您将区域性设置为 de-DE-brandX 并且您在操作系统中安装了 de-DE 本地化,您将收到本地化的异常消息,
- 出于上述原因,您可能希望在 Application_Error 中将当前 (UI) 区域性重置为 CultureInfo.InvariantCulture,或者更好的是,一旦捕获到您知道会导致 Application_Error 的异常;这将阻止标准黄页死亡和至少部分异常堆栈的本地化,
- 您可能会考虑构建一个服务工具来注册/注销/更新文化,尤其是当您预计会频繁更改时,
- 如果您使用基于客户端的文化检测,此解决方案可能会出现问题。
关于c# - 如何根据某些参数加载不同的 RESX 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3635390/