在运行时更改资源的位置?

时间:2010-06-08 16:45:56

标签: c# asp.net .net-3.5 localization resource-files

我有一个可以访问多个客户的网站。有时客户会坚持做一些小改动。由于我无法控制的原因,无论请求多么微小,我都必须遵守。通常这不是问题,我只是创建一个客户端特定版本的用户控件或页面,并在构建时覆盖默认版本或进行配置设置来处理它。

既然我正在对网站进行本地化,那么我很想知道做出轻微措辞修改的最佳方法。

假设我有一个名为Resources.resx的资源文件,其中包含300个资源。它有一个名为Continue的资源。英文值为“Continue”,法文值为“Continuez”。

现在有一个客户,无论出于何种原因,都希望它说“Next”和“Après”,而其他客户希望保持相同。容纳这样的请求的最佳方式是什么? (这只是一个简单的例子)。

我能想到的唯一两种方法是

  • 创建另一个特定于客户端的Resources.resx,并在构建期间替换.dll。由于我将完全替换dll,因此新资源文件必须包含所有300个字符串。显而易见的问题是,我现在有2个资源文件,每个文件都有300个字符串需要维护。
  • 创建自定义用户控件/页面并将其更改为使用自定义资源文件。例如SignIn.ascx将在构建期间被替换,它将从ClientName.resx而不是Resources.resx中提取资源。

还有其他我可以试试的东西吗?有没有办法改变它,以便应用程序在实际查看指定的资源文件之前总是在ClientResources.resx文件中查找被覆盖的值?

2 个答案:

答案 0 :(得分:1)

您可以使用以下模板:

#if ClientName1 
Continue="Next";
#elif ClientName2
    Continue="Apres";
#else 
Continue="Continue" 
#endif

这允许您指定同一文件中的所有可能值(以及同一区域中的相同变量),并且您可以在构建期间从命令行轻松定义符号“ClientName1”。

答案 1 :(得分:0)

我不想这么说,但最简单的方法可能是在安装时使用自定义操作修改应用程序资源文件。

使用ResXResourceWriter / ResXResourceReader,打开目标文化的现有资源文件,并遍历要更改的标记。如果特定客户有一些小的变化,这显然才有意义。这也假设资源文件未嵌入到程序集中。

只要您在安装完成后运行它们,就可以轻松地为Windows Installer创建自定义操作。

另一种方法是使用您自己的版本替换默认的ComponentResourceManager,该版本有选择地更改标记的值。这也会变得很难看。

我能想到的最后一个黑客是将所有默认转换放在基本资源文件中。自定义资源文件只需要更改它感兴趣的标记。任何留空的标记都将获得原始值。我不确定这是多么现实,因为默认文化很可能是英语......

编辑:这可能是一种不那么强硬(仍然是黑客!)的解决方案。您可以在同一文化中创建另一个资源文件,例如Belgian French。比利时法语资源文件实质上将继承法国资源文件。这将允许您仅更改少量文本资源。然后,在您的应用程序中,将当前文化更改为“fr-BE”而不是“fr”。客户可能永远不会知道。