繁体   English   中英

Asp.net Mvc,Razor和Localization

[英]Asp.net Mvc, Razor and Localization

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

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

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

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

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

这个解决方案让我将每个文本都放在资源中,以及视图中的每个标记,甚至是[strong]或[span]等内联标记。

优点:

  • 清洁分离,无需任何结构定位。
  • 简单编码:从资源返回的所有内容都经过html编码。

缺点:

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

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

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

优点:

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

缺点:

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

本地化的意见

优点:

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

缺点:

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

结论

上述技术的混合继承了优点和缺点,但它仍然没有好处。 我很难找到一个合适的生产解决方案,而上述所有都被认为是“不实用”和“耗时”。

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

因此我陷入困境,找不到任何合适的东西,也无法在网上找到任何东西。 是否有可能没有其他人遇到过这个问题,并找到了解决方案?

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


性别选项:

我想到并且非常喜欢的另一个选择是使用像StackOverflow自己的MarkdownSharp这样的“可读标记”语言。 这样,您不会在资源文件中存储任何HTML,只会在标记文本中存储。 因此,在您的资源中,您将拥有**dog**然后通过视图中的markdown分流(我为此创建了一个帮助,(用法: Html.Markdown(string text) )。现在您不存储标记,你正在存储一个常见的人类可读标记语言.markdownnsharp源是一个.CS文件,它很容易修改。所以你总是可以改变它呈现结束HTML的方式。这使你可以完全控制你的所有资源而不存储HTML ,并且没有重复HTML的视图或块。

编辑

这也使您可以控制编码。 您可以轻松确保资源文件的内容不包含有效的HTML。 Markdown语法(如您所知,使用堆栈溢出)不包含HTML标记,因此可以无害地编码。 然后,您只需使用助手将Markdown语法转换为有效的HTML。

编辑#2

降价中有一个错误,我必须自己解决。 任何降价检测都将被呈现为“代码”块将被HTML编码。 如果您已经将HTML编码的所有内容传递给markdown,则会出现问题,因为代码块中的任何内容都将基本上重新编码,并且转换为&gt; 进入&amp;gt; 并完全搞砸了代码块中的文本。 为了解决这个问题,我修改了markdown.cs文件以包含一个布尔选项,该选项可以停止在代码块中编码文本的降序。 有关我添加到MarkdownSharp项目问题的已修复.cs文件, 请参阅此问题。

编辑#3 - 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)

您是否考虑过使用本地化模型,让您的视图成为IMyModel的强类型,然后传入适当装饰的模型,然后通过修改适当的模型,您可以使用/更改您的本地化工作的方式。

它干净,非常灵活,而且非常易于维护。

您可以从基于Recourse文件的本地化开始,然后根据需要更新的步骤更频繁地将该模型切换到基于缓存的基于DB的本地化模型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM