【问题标题】:Using HTML inside resource files在资源文件中使用 HTML
【发布时间】:2010-12-02 05:47:04
【问题描述】:

我正在开发一个标准的小型ASP.NET MVC 网站,它将使用ASP.NET 资源文件制作多语言。

我的问题是关于资源文件。看看你是否有一段应该在段落中显示的文本,在你的资源文件文本中添加<p>标签是否合适?

如果不是,最好的处理方法是什么?

【问题讨论】:

    标签: asp.net html asp.net-mvc resources


    【解决方案1】:

    您可以在视图中使用@Html.Raw 方法,例如@Html.Raw(STRING FROM RESX FILE HERE)

    【讨论】:

    • 这是最好的解决方案。谢谢马雷克。
    • 如果资源项包含类似这样的内容:<script>alert(1)</script> 这将被执行...用户会看到警告消息框。当然,编辑资源的用户非常小心,但我永远不能相信任何输入。
    【解决方案2】:

    当我遇到同样的问题时,我决定不将段落直接放在资源中。用简单的新行分隔文本块(如果我没记错的话,Shift+Enter)。然后创建一个辅助方法将块包装成段落。

    using System;
    using System.Text;
    using System.Web;
    
    namespace MyHtmlExtensions
    {
      public static class ResourceHelpers
      {
        public static IHtmlString WrapTextBlockIntoParagraphs(this string s)
        {
          if (s == null) return new HtmlString(string.Empty);
    
          var blocks = s.Split(new string[] { "\r\n", "\n" },
                                StringSplitOptions.RemoveEmptyEntries);
    
          StringBuilder htmlParagraphs = new StringBuilder();
          foreach (string block in blocks)
          {
            htmlParagraphs.Append("<p>" + block + "</p>");
          }
    
          return new HtmlString(htmlParagraphs.ToString());
        }
      }
    }
    

    然后在您的视图中导入您的扩展方法命名空间:

    <%@ Import Namespace="MyHtmlExtensions" %>
    

    并应用它:

    <%= Resources.Texts.HelloWorld.WrapTextBlockIntoParagraphs () %>
    

    我认为这比将标记标签放入原则上不属于它们的文本资源中更清洁。

    【讨论】:

    • 我喜欢这个解决方案。但是,我想知道这对性能有什么影响?
    • 我怀疑它会成为瓶颈。无论如何,我投票赞成清晰性和可维护性,而不是容易出错的微优化。
    • 这不仅仅是关于段落,如何将文本中的单个单词加粗。你会为资源文件写一个特殊的标记格式吗?
    • @Peter,这超出了您的问题范围。您的问题专门针对段落!
    • @Marek Grzenkowicz 解决方案要好得多。
    【解决方案3】:

    您可以将 resx 值字段的数据包装在 CDATA 块中,&lt;![CDATA[ ]]&gt;

    例如

    <![CDATA[My text in <b>bold</b>]]>
    

    根据您想要使用它的方式,您可能必须在您的应用程序中去掉&lt;![CDATA[]]&gt;

    这种方法允许您在 resx 文件中包含任何 html 标记。我这样做是为了存储格式化的文本消息,以从 asp.net mvc 应用程序中的各种视图显示在 jquery-ui 对话框中。

    【讨论】:

      【解决方案4】:

      是和不是。资源是存储本地化文本的好地方,基本上这将允许您将整个资源发送给将为您完成所有翻译的翻译机构。所以,这是一个加号。 但是,它也增加了出现错误的机会,因为您可能忘记了对 HTML 进行编码或解码。 .resx 文件是一个 xml 文件,因此它需要以编码方式存储在资源中。 (幸运的是,它会自动对其进行编码。)当您再次检索它时,它将再次自动解码。但是,如果将文本传递给其他函数,则存在再次编码的风险,导致 bold 而不是 bold... 所以你需要一些额外的测试。这是您可以管理的。

      但最大的问题可能出在翻译人员身上。如果他们只是翻译 .resx 文件,他们会看到编码字符串。如果他们使用一些东西使资源更具可读性,这可以解决。只要他们不会自己翻译标签。他们可能会混淆将要进行翻译的人。

      【讨论】:

        【解决方案5】:

        你不妨在设计器中打开你的资源文件,然后简单地输入你想要的html和文本..

        例如:Resource Text &lt;b&gt;Data&lt;/b&gt;

        但是@Tony Bennett 的解决方案效果很好..

        类似的东西也有效;这里的特殊字符用于打开/关闭的三角括号:

        are you targeting to &lt;b&gt;sustain&lt;/b&gt; the Mark they achieved
        

        【讨论】:

          【解决方案6】:

          我会说应该避免这种情况,但有时它实际上是不可避免的。理想情况下,最好将您的资源存储在允许您在应用程序的适当区域中为所有语言添加通用演示标记的粒度级别。

          有时语言之间的语法差异使这变得困难。有时您想要存储大量基于文本的资源(足够大以至于它们必须包含诸如 p 标签之类的东西)。这在一定程度上取决于您在做什么。

          【讨论】:

            【解决方案7】:

            使用 URLEncoder 将 HTML 字符串存储在资源中;然后解码字符串并使用 webview 而不是转换所有的 HTML 标签。

            URLDecoder 解码假定在 x-www-form-urlencoded MIME 内容类型。 '+' 将转换为 空格、'%' 和后面的两个十六进制数字字符转换为 等效字节值。所有其他字符都通过 未修改。

            例如“A+B+C %24%25”->“A B C $%”。

            【讨论】:

              【解决方案8】:

              我们愿意。

              您可以使用文本到 HTML 转换器,但由于文本包含的信息比 HTML 少得多。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2015-07-17
                • 1970-01-01
                • 2012-10-18
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多