我正在国际化ASP.NET MVC应用程序,但我不确定如何处理链接文本。以下面的例子为例:
由于“login”是超链接的,我必须有翻译标记,当文本被本地化时,相应的单词或短语应该被超链接。恩特雷里奥斯。
什么是最佳战略解决方案?
是否有标准方式来标记特殊文本(以及使用翻译结果的标准方式)...或者我走错了路,期望我的内容和演示文稿信息如此紧密耦合(尽管我可以在这种情况下,不要想任何方法来移除耦合。)
当前实施:
我目前正在使用Views的本地资源文件和an extension method on HtmlHelper来获取本地化的sting:
<%= Html.Resource("LoginMessage")%>
更新 请参阅Keith's answer 。
我发现它最有帮助,但系统auto selected另一个。
答案 0 :(得分:14)
我认为这归结为4种选择:
我认为有一个主要原因可以避免1 - 你混淆了本地化和应用程序导航。
选项2最终为每个文本块提供了多个资源,但只要您有良好的方法来管理所有本地化,它就不应成为问题。然而,对于第三方翻译来说,这可能是一种痛苦 - 你需要某种方式告诉他们上下文,或者你会得到一些非常奇怪的单词翻译。
选项3是我的首选解决方案。您仍然会为翻译人员创建问题 - 大多数人都不会理解文本中的标记/ HTML /标记。我们已经做了一些HTML,所以3.3对我们有用。
选项4可能值得考虑 - 您是否已经获得了足够的链接,以使其值得额外的工作和维护?这是一个特定于你的应用程序的重要问题:如果整个句子是链接(而不仅仅是主动词 - 这是链接最佳实践)你是否真的失去了足够的选项2或3值得额外的努力?< / em>的
我认为这可能就是为什么没有更多标准化的方法来执行此操作,因为大多数项目(可能是10次中的9次)选项4就足够了,所以这只会成为某些特殊情况的问题。我们有一个复杂的应用程序,大约有11,000个本地化文本,绝大多数时间用于4个,并且只有4或5个地方我们必须使用3.3
我们的技术实施与您的相似:
<%= Html.Localise("Controller/Action/KeyOfTextOnPage") %>
对于链接,我们有一个特定的帮助者:
<%= Html.LocaliseLink("Controller/Action/KeyOfTextOnPage", "~/link.aspx") %>
<%= Html.LocaliseAction("Controller/Action/KeyOfTextOnPage", "action", "controller") %>
答案 1 :(得分:4)
我目前正在使用的是他的设置:
我有一个包含我的主要文本的全局资源文件,名为Strings.resx(Strings.NL-nl.resx等)。接下来,我的全局文件包含了我的actionlinks的所有本地化。那就是:ActionLinks.resx和本地人。
现在我做的是,在我的Strings.resx中,我有类似的东西:
Strings.resx
请{0}继续
本地语言Strings.NL-nl.resx
{0} om verder te gaan
现在的诀窍是做一些事情:
<%= Html.Encode(string.Format(Resources.Strings.ControllernameViewnameKey,
Html.ActionLink(Resources.ActionLinks.login, "Account", "LogOn")))
如果链接中需要多个变量,则可以将对象数组提供给
string.Format()
keynaming是我自己的约定,用于理解主文本的使用位置(页面)。因为我的主要是非常具体的。当然可以自己制作钥匙。
有关我如何操作的更多信息,您可以在我自己的问题上查看我的答案: here
修改强>
当然你可以使用本地文件而不是全局文件,但我喜欢我的强类型资源:)。
答案 2 :(得分:2)
我必须同意其他答案 - 在2中分开。
那说我会补充一点,不要考虑分开/不相关的2个单词。坚持一个简单的约定,如:LoginMessage&amp; LoginMessageLink,对应于句子的整个文本&amp;链接的文字。
那是中立的&amp;如果这就是语言需要的话,翻译者可以将整个句子作为链接。
如果您发现自己需要多次链接到同一页面,那么请为其添加一些标记。像:
English: "Please ##login## to continue."
Português: "##Entre## por favor para continuar."
答案 3 :(得分:1)
我建议将资源分成两个值,比如这个
- 1:请{0}继续。
- 2:登录
或者对于Português
- 1:{0}赞成para continuar
- 2:Entre
然后将它们组合起来构建链接和消息。 {0}取代了链接/ actionlink /您需要的任何内容。
答案 4 :(得分:1)
我只是寻找自定义占位符,索引到您想要放置在文本周围的链接。例如
"Please #123#login#123# to continue"
如果你在字符串中找到#n#,你知道它所包围的字符串应该是你查找文件中索引n指定的url的链接(db或者其他)。
答案 5 :(得分:1)
我知道这是一个老问题,但我认为这可能会有所帮助。
在ASP.net Core 2.2中,您可以拥有一个包含以下内容的资源文件:
dbc.QryLogUtilityV
然后您将在其中插入本地化器视图:
AllText: There are 2 links and one string. Links are {0} and {1}, the string is {2}
Link1Text: link1
Link2Text: link2
String1: something special
最后是您的HTML:
@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer
无需编码或解码任何内容,只需将参数提供给Localizer。