如何使带有超链接的文本在WordPress中可翻译?


15

我已经看到了使带有超链接的文本可翻译的不同方法。但是,我一直找不到一个最佳实践。

因此,这是我发现的一些解决方案:

// METHOD 1
sprintf( __( 'Please read %1$sthis%2$s.', 'tacoverdo-example-domain' ), '<a target="_blank" href="' . esc_url( 'https://goo.gl' ) . '">', '</a>' );

// METHOD 2
echo '<a target="_blank" href="' . esc_url( 'https://goo.gl' ) . '">';
_e( 'Please read this.', 'tacoverdo-example-domain' );
echo '</a>';

// METHOD 3
sprintf( __( 'Please read <a href="%s">this</a>.', 'tacoverdo-example-domain' ), esc_url( 'https://goo.gl' ) );

// METHOD 4
sprintf( __( 'Please read %sthis%s.', 'tacoverdo-example-domain' ), '<a target="_blank" href="' . esc_url( 'https://goo.gl' ) . '">', '</a>' );

// METHOD 5
_e( 'Please read <a target="_blank" href="' . esc_url( 'https://goo.gl' ) . '">this</a>', 'tacoverdo-example-domain' );

我首先想到的是方法1最好。它不需要您的翻译者了解HTML。但是,它也不允许这样做的人弄乱它。它也很干燥(不要重复自己),因为您不必一遍又一遍地翻译整个HTML部分。

但是,当在Twitter上发布此问题时,人们回答说方法3最好,如您在此处看到的那样。

因此,我应该如何使带有超链接的文本在WordPress中可翻译?

Answers:


17

这是一个非常多方面的问题。它结合了固有的HTML内容问题和翻译挑战的全新负担,例如扫描字符串,翻译过程本身及其验证。

所以我们必须结合:

  1. 文字(可翻译形式)
  2. HTML标记(很难破解,但最好是灵活的形式)
  3. URL目标(以安全且最好是可翻译的形式,可能特定于语言!)

换句话说,我们还需要考虑熟悉程度和现有技术-核心功能。好的,从快速检查内核以大多数(即使不是全部)方式执行此操作也无济于事。

从这些因素和周围的讨论中,我会说有三类方法,具体取决于需求和优先级。

简单—一串东西

__( 'Please read <a href="https://goo.gl">this</a>', 'example-domain' );
  • 易于遵循代码
  • 允许整体翻译所有部分(文本,标记,URL)
  • 网址已硬编码
  • 容易出现HTML中断
  • 核心流行

已平衡-URL已损坏

sprintf( 
    __( 'Please read <a href="%s">this</a>', 'example-domain' ), 
    esc_url( 'https://goo.gl' ) 
);
  • 容易遵循
  • 可以翻译所有部分,但URL需要单独的翻译调用
  • 网址可以是动态的并且可以转义
  • 容易出现HTML中断
  • 核心流行
  • 在开发人员/翻译人员中风行一时

零碎—标记破裂

sprintf( 
    __( 'Please read %1$sthis%2$s.', 'example-domain' ), 
    '<a href="' . esc_url( 'https://goo.gl' ) . '">',
    '</a>' 
);

或通过串联

'<a href="' . esc_url( 'https://goo.gl' ) . '">' 
. __( 'Please read this.', 'example-domain' );
. '</a>';
  • 可读性较差
  • 对HTML中断更具弹性
  • 核心不那么受欢迎
  • 需要提供更多翻译环境

经验法则(据我所知)

  1. 简单,使其尽可能简单
  2. 零碎地防止HTML中断
  3. 在所有其他情况下(可能是最常见的)保持平衡

+1。我喜欢“平衡”选项,也许可以使用_x而不是__
gmazzap

我打算将摘要作为基本示例,而不是全面的示例。由于场景和翻译功能的数量众多,每种情况都可能会有差异。
腊斯特2014年

平衡选项还存在翻译人员可能创建错误标记的问题。为了确保翻译的安全可靠,最好不要使用html。我也投票支持具有上下文的翻译功能。这使翻译人员有机会了解如何在不了解插件的位置,上下文和主题的情况下进行操作。
bueltge 2014年

我之前听过“翻译人员需要上下文”的说法,但这让我感到奇怪。在此示例中,他们需要什么上下文?我认为在需要时提供上下文是一种很好的做法,但是在这种情况下,翻译人员真的需要吗?他们是否需要知道%s代表<strong>还是<a href target="#">?会影响他们的翻译吗?
塔科·韦尔多

@TacoVerdo如果链接断开,我会假设没有它的文本可能非常模棱两可,在这种情况下,上下文应告诉文本目标是什么。上下文起到填充信息的作用,直到信息完整且明确为止。当您将文本分解成较小的独立部分时,每个文本都需要更多的上下文才能整体显示。
腊斯特2014年

8

这些天,我与许多多语言网站合作,我不得不说:

  1. 链接的URL通常需要可翻译。
  2. 信任翻译功能输出不良。我几乎从不使用,__()但总是esc_html__()/ esc_attr__()。这意味着要翻译的字符串不能包含任何形式的HTML。
  3. 用英语写作时,我们常常没有意识到,在其他语言中,一个单词可能会根据不同的单词以不同的方式来书写。因此,当文本包含1个或几个单词时,最好使用*_x()翻译功能的变体。
  4. 每个可翻译字符串包含多个占位符可能是“危险的”。如果翻译员不是开发人员,他们将很容易中断页面渲染。在这个例子中%1$sthis%2$s的非技术性翻译不明白的是,s之前this有必要进行适当的渲染,也可以认为,开发商想键入this,但有一个错字,写了sthis

由于所有这些原因,很难“正确地”翻译包含链接的文本。考虑到上述所有问题的唯一可行解决方案是:

$anchor = esc_html_x( 'Google', 'link text for google.com', 'txt-domain' );
$domain = esc_url( __( 'google.com', 'txt-domain' ) );  
$link   = sprintf( '<a href="https://%s">%s</a>', $domain, $anchor );

 /* translators: 1 is a link with text "Google" and URL google.com */
echo sprintf( esc_html__( 'Use %1$s to search.', 'example-domain' ), $link );

非技术人员可以轻松,安全地翻译该文档,但也要冗长且易于实施,尤其是如果必须针对多个链接进行此操作时...

但是,对于成千上万(真实或潜在)用户说多种语言的通用代码,这是我的选择。

即使是仅供内部使用的代码,这实际上也是我采用的方式,但这就是我。


注意事项

似乎无法单独翻译“ Google”一词,对于这种情况可能是正确的。但有时甚至认为品牌名称是错误的。仅举一个例子,在意大利,我们有“ Algida”品牌,在全世界30多个不同的名称

在这种情况下,对URL和/或品牌名称进行硬编码会引起问题。

提供翻译的上下文将帮助翻译人员确定他们是否需要翻译品牌名称。


2

您必须将标记保留在可翻译字符串中,因为翻译人员必须知道存在链接。在某些语言中,生成的链接文本可能会跨越多个单词,甚至在内部或其他标记中甚至可能需要正确嵌套一个逗号(或等效符号)。

构建语音链接文本(而不是thishere)也很重要。

2或3是唯一可翻译的选项,但是您也应该使URL可翻译。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.