如何在本地化文本中嵌入链接

Rob*_*ool 16 asp.net-mvc hyperlink internationalization

问题:

我正在国际化一个ASP.Net MVC应用程序,但带有链接文本的句子让我暂停.以下面的例子为例:

  • 英语:"请登录继续."
  • Português:" Entre por favor para continuar."

请注意,由于"login"是超链接的,因此我必须让翻译者在文本本地化时表示哪些相应的单词或短语应该被超链接,例如Entre.

我不能成为第一个遇到这个问题的人,那么你所看到或使用的最佳战略解决方案是什么?

是否存在为翻译者表示此类事物的标准(以及使用翻译结果的标准方式)......或者我是否走错了路,期望我的内容和演示信息如此紧密耦合(尽管我可以'在这种情况下,想一想去除耦合的方法).

目前的实施:

我目前正在使用View的本地资源文件和HtmlHelper的扩展方法来获取本地化的sting:

<%= Html.Resource("LoginMessage")%>
Run Code Online (Sandbox Code Playgroud)

更新: 请参阅Keith的回答.

我发现它最有帮助,但系统自动选择另一个.

Kei*_*ith 14

我认为这归结为4种选择:

  1. 在您的本地化中添加一个链接:"请<a href="#">登录</a>继续"
  2. 多个本地化 - 要么:
    1. "请{0}继续"和"登录",或
    2. "请","登录"和"继续"
  3. 在您的本地化内部标记,例如:
    1. "请{0}登录{1}继续"
    2. "请{start-login}登录{end-login}继续"
    3. "请<a href="{0}">登录</a>继续"
  4. 只是不支持它 - 使整个句子成为一个链接

我认为有一个主要原因可以避免1 - 你混淆了本地化和应用程序导航.

选项2最终为每个文本块提供了多个资源,但只要您有管理所有本地化的好方法,它就不应成为问题.然而,对于第三方翻译来说,这可能是一种痛苦 - 你需要某种方式来告诉他们上下文,或者你会得到一些非常奇怪的单词翻译.

选项3是我的首选解决方案.您仍然会为翻译人员创建问题 - 大多数人都不会理解文本中的标记/ HTML /标记.我们已经做了一些HTML,所以3.3对我们有用.

选项4可能值得考虑 - 你是否已经获得足够的链接嵌入以使其值得额外的工作和维护?这是一个特定于你的应用程序的一个重要问题:如果整个句子是链接(而不仅仅是主动动词 - 这是链接最佳实践)你真的失去了足够的选项2或3值得额外的努力吗?

我认为这可能就是为什么没有更多标准化的方法来执行此操作,因为大多数项目(可能是10次中的9次)选项4就足够了,所以这只会成为某些特殊情况的问题.我们有一个复杂的应用程序,大约有11,000个本地化文本,绝大多数时间用于4个,并且只有4或5个地方我们必须使用3.3

我们的技术实施与您的相似:

<%= Html.Localise("Controller/Action/KeyOfTextOnPage") %>
Run Code Online (Sandbox Code Playgroud)

对于链接,我们有一个特定的帮助:

<%= Html.LocaliseLink("Controller/Action/KeyOfTextOnPage", "~/link.aspx") %>
<%= Html.LocaliseAction("Controller/Action/KeyOfTextOnPage", "action", "controller") %>
Run Code Online (Sandbox Code Playgroud)


bas*_*ijn 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")))
Run Code Online (Sandbox Code Playgroud)

如果链接中需要多个变量,则可以给出一组对象

 string.Format()
Run Code Online (Sandbox Code Playgroud)

keynaming是我自己的约定,用于理解主文本的使用位置(页面).因为我的主要是非常具体的.当然钥匙可以自己制作.

有关我如何做的更多信息,您可以在我自己的问题上查看我的答案: 这里


编辑

当然你可以使用本地文件而不是全局文件但我喜欢我的强类型资源:).

  • 在德语和英语等语言中,动词可以分为两个彼此不相邻的部分,例如"记录应用程序的帐户".当然,在英语中,我们倾向于"登录应用程序的帐户",但其他语言可能不喜欢.此外,某些语言使用非根形式的单词,例如使用"Entre"而不是"Entrar"的西班牙语示例.译者需要看整个句子才能知道要选择的正确单词形式. (5认同)
  • 我认为将动作链接的翻译与句子的其余部分分开可能是有风险的。如果一个句子可以被分成几个片段,独立翻译并拼凑在一起,而不会引入糟糕的单词选择和糟糕的词序,那么你的建议总是有效的。但由于一种语言与另一种语言的句子结构不同,并且单词选择与上下文相关,因此我认为必须将句子作为一个整体进行翻译。你遇到过这个问题吗?感谢您的投入!我喜欢你所做的很多事情,而且绝对有帮助。 (3认同)