ASP.NETMVC、Razor和本地化如何实现?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (45)

我知道这件事已经多次出现在这些页面上,但我还没有找到我需要找到的“好解决方案”。让我们开始解释。

.net和mvc中的本地化有两种方式,甚至可以混合在一起:

  • 资源文件(本地或全局)
  • 本地化的视图与视图引擎根据文化调用适当的视图

我会解释我尝试过的解决方案以及我所有人遇到的所有问题。

资源文件中的文本,视图中的所有标记

这个解决方案可以让我把每个文本放在资源中,并且每个标签都放在视图中,甚至是内联标签,比如[strong]或者[span]。

优点:

  • 清洁分离,没有任何本地化结构。
  • 轻松编码:从资源返回的所有内容都可以使用html编码。

缺点:

  • 如果我有一个强壮的段落,一些链接等,我必须将它分成许多资源键。这被认为使得视图太难读,并且花费太多时间来创建它。
  • 出于与上述相同的原因,如果在两种不同的语言中[强]文本在不同的地方(如“Il cane di Marco”和“Marcos's dog ”),我无法实现它,因为我的所有标签都在视图。

资源文件中的文本和内嵌标记,通过参数

此方法将拥有资源包含string.Format的一些占位符,并且这些占位符将使用内嵌标签进行后编码。

优点:

  • 清晰的分隔,只有文本中的占位符,所以如果我要用[em]替换[strong],我会在视图中进行处理,并将其作为参数传递并在每种语言中都进行更改

缺点:

  • 编码有点困难,我必须预先编码资源的值,然后使用string.Format,最后将其作为MvcHtmlString返回,以告诉视图引擎在显示时不重新编码它。
  • 出于与上述相同的原因,例如,包括ActionLink作为参数会很麻烦。比方说,我从资源中获取动作链接的文本。我的方法已经编码它。但是,然后,ActionLink方法会重新编码它。我需要一个独特的方法来获取资源而不编码它们,或者需要一个新的帮助器方法来获取MvcHtmlString而不是字符串作为文本参数,但两者都是不切实际的。
  • 仍然需要花费大量时间来构建视图,必须创建所有资源键并填充它们。

本地化的意见

优点:

  • 所有视图都是纯html。没有资源可读。

缺点:

  • 无处不在的HTML。我甚至不需要解释这是完全邪恶的。
  • 必须手动编码所有麻烦的字符,如严重元音,引号等。

结论

上述技术的组合继承了优点和缺点,但它仍然不好。我很难找到适当的生产解决方案,而上述所有内容都被认为是“不切实际”和“耗时”的。

更糟糕的是,我发现没有一种工具可以将aspx或cshtml(甚至html)视图/页面中的“文本”重构为资源。所有在那里的工具都可以将代码文件(.cs或.vb)中的System.String实例重构为资源(例如resharper,以及其他一些我现在不记得的东西)。

所以我被困住了,无法自己找到任何合适的东西,也找不到网络上的任何东西。有没有人可能以前遇到过这个问题,并找到解决方案?

提问于
用户回答回答于

我个人喜欢在资源文件中存储内联标签的想法。不过,我做的有点不同。我存储了非常普通的标签<span class='emphasis'>dog</span>,然后使用CSS来适当地设置标签的样式。现在,我不是简单地将标签作为参数“传入”,而是简单地span.emphasis在我的CSS中设置规则。更改转移到所有语言。

更性感的选择:

另一个我认为很有趣的选择是使用像MarkdownSharp这样的“可读标记”语言。这样你就不会在资源文件中存储任何HTML,只有减价文本。因此,在你的资源中,你会有**dog**,然后在视图中通过降价来分流(我为此创建了一个帮助器,(Usage:)Html.Markdown(string text)。现在你不存储标签,你正在存储一个通用的可读标记语言。 markdownsharp source是一个.CS文件,它很容易修改,所以你可以随时改变它呈现结束HTML的方式,这样可以在不存储HTML的情况下完全控制所有的资源,也不需要复制视图或HTML块。

这也可以让你控制编码。可以轻松确保资源文件的内容不包含有效的HTML。Markdown语法(如使用堆栈溢出所了解的)不包含HTML标记,因此可以进行编码而不会造成伤害。然后,只需使用助手将Markdown语法转换为有效的HTML。

降价中有一个问题需要我自己解决。markdown检测到的任何内容都将被呈现为“代码”块将被HTML编码。这是一个问题,如果你已经HTML编码的所有内容传递给降价作为代码块将主要再编码果然任何东西&gt;&amp;gt;完全搞砸了代码块中的文本。为了解决这个问题,我修改了markdown.cs文件以包含一个布尔选项,用于停止在代码块中对文本进行编码降级。请参阅此问题获取添加到MarkdownSharp项目问题的固定.cs文件。

Html帮手样本

public static class HtmlHelpers
{
    public static MvcHtmlString Markdown(this HtmlHelper helper, string text)
    {
        var markdown = new MarkdownSharp.Markdown
        {
            AutoHyperlink = true,
            EncodeCodeBlocks = false, // This option is my custom option to stop the code block encoding problem.
            LinkEmails = true,
            EncodeProblemUrlCharacters = true
        };
        string html = markdown.Transform(markdownText);
        return MvcHtmlString.Create(html);
    }
}
用户回答回答于

没有什么能阻止你在资源文件中存储HTML,然后调用@Html.Raw(MyResources.Resource)

扫码关注云+社区