Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Asp.net Mvc、Razor和本地化_C#_Asp.net Mvc_Resources_Localization - Fatal编程技术网

C# Asp.net Mvc、Razor和本地化

C# Asp.net Mvc、Razor和本地化,c#,asp.net-mvc,resources,localization,C#,Asp.net Mvc,Resources,Localization,我知道这件事已经在这些页面上出现过很多次了,但我仍然没有找到我需要找到的“好的解决方案”。让我们开始解释吧 在.net和mvc中,本地化有两种方式,甚至可以混合使用: 资源文件(本地或全局) 使用viewengine调用基于区域性的适当视图的本地化视图 我会解释我尝试过的解决方案,以及我遇到的每一个问题 资源文件中的文本,视图中的所有标记 这个解决方案会让我把每个文本放在参考资料中,把每个标签放在视图中,甚至内联标签,比如[strong]或[span] 优点: 分离干净,无任何本地化结构

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

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

  • 资源文件(本地或全局)
  • 使用viewengine调用基于区域性的适当视图的本地化视图
我会解释我尝试过的解决方案,以及我遇到的每一个问题

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

这个解决方案会让我把每个文本放在参考资料中,把每个标签放在视图中,甚至内联标签,比如[strong]或[span]

优点:

  • 分离干净,无任何本地化结构
  • 轻松编码:从资源返回的所有内容都进行html编码
缺点:

  • 如果我有一个段落有一些强项,一些链接等等,我必须把它分成许多资源键。这被认为是使视图太不可读,并且需要太多的时间来创建它
  • 出于与上述相同的原因,如果在两种不同的语言中,[strong]文本位于不同的位置(如“Ilcanedi Marco”和“Marcosdog”),我无法实现它,因为我的所有标记都在视图中
资源文件中的文本和内联标记,通过参数

此方法将使资源包含string.Format的一些占位符,这些占位符将在编码后用内联标记填充

优点:

  • 清晰的分隔,文本中只有占位符,因此,如果我要用[em]替换[strong],我会在视图中执行此操作,并将其作为参数传递,它会在每种语言中更改
缺点:

  • 编码有点困难,我必须对资源中的值进行预编码,然后使用string.Format,最后将其作为MvcHtmlString返回,以告知视图引擎在显示时不要对其重新编码
  • 出于与上述相同的原因,例如,包括ActionLink作为参数将很麻烦。假设我从一个资源中获取actionlink的文本。我的方法已经对它进行了编码。但是,ActionLink方法将再次对其进行重新编码。我需要一个独特的方法来获取资源而不进行编码,或者需要一个新的助手方法来获取MvcHtmlString而不是字符串作为文本参数,但这两种方法都不实用
  • 构建视图仍然需要花费大量时间,必须创建所有资源键,然后填充它们
本地化视图

优点:

  • 所有视图都是纯html。没有可阅读的资源
缺点:

  • 到处都是重复的html。我甚至不需要解释这是多么邪恶
  • 必须手动编码所有麻烦的字符,如严肃的元音、引号等
结论

上述技术的混合继承了优点和缺点,但仍然不好。我面临的挑战是找到一个适当的、富有成效的解决方案,而上述所有问题都被认为是“不现实的”和“耗时的”

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


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

没有什么可以阻止您将HTML存储在资源文件中,然后调用
@HTML.Raw(MyResources.resource)
我个人喜欢在资源文件中存储内联标记的想法。但是我做的有点不同。我存储非常简单的标签,比如
dog
,然后使用CSS适当地设置标签的样式。现在,我不再将标记作为参数“传入”,而是在CSS中适当地设置
span.emphasis
规则的样式。所有语言都会发生变化


更性感的选项:

我想到并非常喜欢的另一个选择是使用StackOverflow自己的“可读标记”语言。这样,您就不会在资源文件中存储任何HTML,只存储标记文本。因此,在您的资源中,您将拥有
**dog**
,然后通过视图中的标记将其分流(我为此创建了一个帮助程序,(用法:
Html.markdown(字符串文本)
)。现在,您不是在存储标记,而是在存储一种通用的人类可读标记语言。markdownsharp源文件是一个.CS文件,易于修改。因此,您可以随时更改它呈现结尾HTML的方式。这样,您就可以完全控制所有资源,而无需存储HTML,也无需复制视图或HTML块

编辑

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

编辑#2

markdown中有一个bug我必须自己修复。markdown检测到的任何东西都将作为“代码”呈现块将是HTML编码的。如果您已经对传递给markdown的所有内容进行了HTML编码,则这是一个问题,因为代码块中的任何内容都将基本上重新编码,从而将
转换为
&;gt;
,并完全扭曲代码块中的文本。为了解决此问题,我修改了markdown.cs文件以包含boolean选项,用于停止标记对代码块内的文本进行编码。用于修复
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);
    }
}