首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Asp.net Mvc、剃刀和本地化

Asp.net Mvc、剃刀和本地化
EN

Stack Overflow用户
提问于 2011-03-19 01:24:16
回答 3查看 10.4K关注 0票数 17

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

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

  • 资源文件(包含viewengine的本地或global)
  • Localized视图,用于根据区域性调用相应的视图

我将解释我尝试过的解决方案,以及我遇到的每一个问题。

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

这个解决方案会让我把每个文本放在资源中,把每个标签放在视图中,甚至把像strong或span这样的内联标签也放进去。

优点:

在localization.

  • Easy编码中没有任何结构:从资源返回的所有内容都经过编码。

缺点:

  • 如果我有一个包含一些强项,几个链接等的段落,我必须将它拆分成许多资源键。由于上述原因,如果两种不同语言的强文本位于不同的位置(如"Il can di Marco“和"Marcos's ”),我就无法实现它,因为我的所有标签都在视图中。

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

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

优点:

强分隔干净,文本中只有占位符,所以如果我要用em替换

  • ,我会在视图中将其作为参数传递,并且它在每种语言

中都会发生变化

缺点:

  • 编码有点难,我必须对来自资源的值进行预编码,然后使用string.Format,最后将其作为MvcHtmlString返回,以告知视图引擎在执行displaying.
  • For时不要重新编码它。原因与上面相同,例如,包括ActionLink as参数将会很麻烦。假设我从一个资源中获得了我的actionlink链接的文本。我的方法已经对其进行了编码。但是,ActionLink方法会再次对其进行重新编码。我需要一个不同的方法来获取资源而不对它们进行编码,或者需要新的助手方法来获取MvcHtmlString而不是字符串作为文本参数,但这两者都相当于unpractical.
  • Still构建视图,必须创建所有的资源键,然后填充它们。

本地化视图

优点:

  • 所有的视图都是纯html的。没有要读取的资源。

缺点:

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

结论

上述技术人员的混合继承了利弊,但仍然是不好的。我面临着找到一个适当的有效解决方案的挑战,而以上所有这些都被认为是“不切实际的”和“耗时的”。

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-19 01:48:16

我个人喜欢在资源文件中存储内联标签的想法。然而,我做这件事的方式有点不同。我存储非常普通的标签,比如<span class='emphasis'>dog</span>,然后我使用CSS来适当地设置标签的样式。现在,我不需要“传入”标记作为参数,只需在我的CSS中适当地设置span.emphasis规则的样式。所有语言都会发生变化。

Sexier选项:

我想到并非常喜欢的另一个选择是使用一种“可读标记”语言,比如StackOverflow自己的MarkdownSharp。这样,您就不会在资源文件中存储任何HTML,只会存储标记文本。因此,在您的资源中,您应该有**dog**,然后通过视图中的标记对其进行分流(我为此创建了一个帮助器,(用法:Html.Markdown(string text))。现在你不是在存储标签,而是在存储一种常见的人类可读的标记语言。markdownsharp的源代码是一个.CS文件,它很容易修改。因此,您可以随时更改它呈现结尾HTML的方式。这使您可以完全控制所有资源,而无需存储HTML,也无需复制视图或HTML块。

编辑

这也让你可以控制编码。您可以很容易地确保资源文件的内容不包含有效的HTML。Markdown语法(正如您在使用堆栈溢出时所了解的那样)不包含HTML标记,因此可以对其进行编码而不会造成损害。然后,您只需使用助手将Markdown语法转换为有效的HTML即可。

编辑#2

markdown中有一个bug,我必须自己修复。markdown检测到的任何东西都将被呈现为一个“代码”块,它将被HTML编码。这是一个问题,如果你已经用超文本标记语言编码了所有传递给markdown的内容,因为代码块中的任何东西都将被重新编码,这会将&gt;转换成&amp;gt;,并完全搞乱代码块中的文本。为了解决这个问题,我修改了markdown.cs文件,使其包含一个布尔选项,以阻止markdown在代码块中对文本进行编码。用于修复我添加到MarkdownSharp项目问题中的.cs文件的See this issue

EDIT #3 - Helper示例

代码语言:javascript
复制
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);
    }
}
票数 7
EN

Stack Overflow用户

发布于 2011-03-19 01:31:21

没有什么能阻止您在资源文件中存储超文本标记语言,然后调用@Html.Raw(MyResources.Resource)

票数 2
EN

Stack Overflow用户

发布于 2011-03-19 03:05:07

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

它很干净,非常灵活,并且非常容易维护。

您可以从基于回溯文件的本地化开始,然后为了速度,您需要更频繁地将该模型切换到基于缓存DB的本地化模型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5355646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档