我知道这个问题已经在这些页面上提到过很多次了,但我仍然没有找到我需要找到的“好的解决方案”。让我们开始解释吧。
.net 和 mvc 中的本地化是通过两种甚至可以混合在一起的方式进行的:
- 资源文件(本地或全局)
- 使用 View 引擎本地化 View 以根据文化调用适当的 View
我将解释我尝试过的解决方案以及我遇到的所有问题。
资源文件中的文本, View 中的所有标签
这个解决方案会让我把每个文本都放在资源中,每个标签都放在 View 中,甚至是 [strong] 或 [span] 这样的内联标签。
优点:
- 清晰的分离,在本地化中没有任何结构。
- 轻松编码:从资源返回的所有内容都经过 html 编码。
缺点:
- 如果我有一个包含一些强项、几个链接等的段落,我必须将它分成许多资源键。这被认为会使 View 难以阅读,并且创建它也需要花费太多时间。
- 出于与上述相同的原因,如果在两种不同的语言中 [strong] 文本位于不同的位置(例如“Il cane di Marco”和“Marcos's dog "),我无法实现它,因为我所有的标签都在 View 中。
资源文件中的文本和内联标签,通过参数
此方法将使资源包含一些 string.Format 的占位符,这些占位符将在编码后填充内联标记。
优点:
- 干净的分隔,文本中只有占位符,所以如果我要用 [em] 替换 [strong],我会在 View 中将它作为参数传递,并且它会在每种语言中发生变化
缺点:
- 编码有点难,我必须对资源中的值进行预编码,然后使用 string.Format,最后将其作为 MvcHtmlString 返回,以告诉 View 引擎在显示时不要重新编码。
- 出于与上述相同的原因,例如,包括一个 ActionLink 作为参数会很麻烦。假设我从资源中获取了我的操作链接的文本。我的方法已经对其进行了编码。但是随后,ActionLink 方法将再次对其进行重新编码。我需要一种独特的方法来获取资源而不对它们进行编码,或者需要新的辅助方法来获取 MvcHtmlString 而不是字符串作为文本参数,但这两种方法都不切实际。
- 仍然需要大量时间来构建 View ,必须创建所有资源键然后填充它们。
本地化 View
优点:
- 所有 View 都是纯 html。没有可供阅读的资源。
缺点:
- 到处都是重复的 html。我什至不需要解释这是多么邪恶。
- 必须手动编码所有麻烦的字符,如元音、引号等。
结论
上述技术的混合继承了优点和缺点,但仍然不好。我面临着寻找合适的高效解决方案的挑战,而上述所有问题都被认为“不切实际”且“耗时”。
更糟糕的是,我发现没有一种工具可以将“文本”从 aspx 或 cshtml(甚至 html) View /页面重构为资源。那里的所有工具都可以将代码文件(.cs 或 .vb)中的 System.String 实例重构为仅资源(例如 resharper,以及其他几个我现在不记得了)。
所以我被困住了,无法自己找到合适的东西,也无法在网络上找到任何东西。有没有可能没有其他人以前遇到过这个问题并找到了解决方案?
最佳答案
我个人喜欢在资源文件中存储内联标签的想法。但是我做的有点不同。我存储非常简单的标签,如 <span class='emphasis'>dog</span>
然后我使用 CSS 适本地设置标签的样式。现在,我不再将标签作为参数“传入”,而是简单地设置 span.emphasis
的样式。在我的 CSS 中适本地规则。变化会延续到所有语言。
更性感的选择:
我想到并且非常喜欢的另一个选择是使用“可读标记”语言,例如 StackOverflow 自己的 MarkdownSharp .这样你就不会在资源文件中存储任何 HTML,只有 Markdown 文本。所以在你的资源中你会有 **dog**
然后它通过 View 中的 markdown 分流(我为此创建了一个帮助程序,(用法:Html.Markdown(string text)
)。现在你不是在存储标签,而是在存储一种常见的人类可读标记语言。markdownsharp 源是一个.CS 文件,它很容易修改。因此您可以随时更改它呈现结尾 HTML 的方式。这使您可以完全控制所有资源,而无需存储 HTML,也无需复制 View 或 HTML block 。
编辑
这也让您可以控制编码。您可以轻松地确保资源文件的内容不包含有效的 HTML。 Markdown 语法(正如您从使用堆栈溢出中了解到的那样)不包含 HTML 标记,因此可以无害地进行编码。然后您只需使用您的助手将 Markdown 语法转换为有效的 HTML。
编辑 #2
我必须自己修复 markdown 中的一个错误。 Markdown 检测到的任何内容都将呈现为“代码” block ,并将进行 HTML 编码。如果您已经对传递给 markdown 的所有内容进行了 HTML 编码,那么这是一个问题,因为代码块中的任何内容都将被重新编码,这将变成 >
。进入&gt;
并完全搞砸了代码块中的文本。为了解决这个问题,我修改了 markdown.cs 文件以包含一个 bool 选项,该选项阻止 markdown 在代码块中对文本进行编码。 See this issue对于我添加到 MarkdownSharp 项目问题的固定 .cs 文件。
编辑 #3 - Html Helper 示例
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);
}
}
关于c# - Asp.net Mvc、Razor 和本地化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5355646/