如何根据某些参数加载不同的RESX文件

时间:2010-09-03 11:47:21

标签: c# .net asp.net internationalization resx

我有一个ASP.NET3.5(C#)ASPX页面,该页面以10种不同语言进行国际化。

页面结构非常复杂,有几十个由状态机模式驱动的嵌套视图。

编辑:我在每个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

提前致谢。

2 个答案:

答案 0 :(得分:11)

您可以使用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):< / p>

CultureInfo ci = new CultureInfo(Request.QueryString["paramname"]);
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = ci;

(设置CurrentCulture并不是必需的,因为资源在CurrentUICulture方面有效,但设置两者都允许您进一步自定义每个品牌的页面,例如为每个自定义文化/品牌使用不同的日期/时间格式设置)

一些注意事项:

  • 此解决方案为您提供了极大的灵活性,因为正常的文化回退有效 - 如果找不到en-US-brandX的条目,运行时将回退到en-US等等;如果品牌大多相似,这可以大大减少重复的resx条目,因为你只能在父(en-US)resx文件中放入一些条目,
  • 您可以创建更多级别的遗传文化,例如en-US-brandX-variantY,
  • 所有访问资源的方法都按预期工作,
  • 更改工作线程的文化意味着如果您将文化设置为de-DE-brandX并且您在操作系统中安装了de-DE本地化,则会获得本地化的异常消息,
  • 由于上述原因,您可能希望将当前(UI)文化重置为Application_Error中的CultureInfo.InvariantCulture,或者甚至更好地捕获您知道将导致Application_Error的异常;这将阻止标准黄页死亡和至少部分异常堆栈的本地化,
  • 您可以考虑构建一个服务工具,注册/取消注册/更新文化,特别是如果您预计会经常更改,
  • 如果您使用基于客户端的文化检测,此解决方案可能会出现问题。

答案 1 :(得分:0)

如果您在代码中引用资源,请执行以下操作:Resources.brand1_myPage.WelcomeMessage,这可能很困难。

但您也可以通过编程方式检索资源:GetGlobalResourceObject ("brand1_myPage", "WelcomeMessage")。在这里,您可以使用资源文件名进行操作。