【问题标题】:Changing where a resource is pulled during runtime?在运行时更改资源的提取位置?
【发布时间】:2011-03-01 06:37:40
【问题描述】:

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

现在我正在对网站进行本地化,我很好奇进行细微措辞更改的最佳方法。

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

现在一个客户,无论出于何种原因,都希望它说“下一步”和“Après”,而其他客户希望保持不变。满足此类请求的最佳方式是什么? (这只是一个简单的例子)。

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

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

还有什么我可以尝试的吗?有什么方法可以改变它,以便应用程序在实际查看指定的资源文件之前始终在 ClientResources.resx 文件中查找被覆盖的值?

【问题讨论】:

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


    【解决方案1】:

    您也许可以使用以下模板:

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

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

    【讨论】:

      【解决方案2】:

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

      使用 ResXResourceWriter / ResXResourceReader 打开目标区域性的现有资源文件并遍历要更改的标签。这显然只有在对特定客户进行一些小的更改时才有意义。这也假设资源文件没有嵌入到程序集中。

      为 Windows Installer 创建自定义操作非常简单,只要您可以在安装完成后运行它们即可。

      另一种方法是将默认的 ComponentResourceManager 替换为您自己的版本,该版本可以选择性地更改标签的值。这也可能很快变得丑陋。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多