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

时间:2014-10-14 作者:Taco Verdo

我已经看到了使用超链接制作可翻译文本的不同方法。然而,我一直无法找到一个最佳实践。

下面是我找到的一些解决方案:

// 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部分。

然而,当在推特上发布这个问题时,人们回答说,正如你所看到的,方法3是最好的here.

那么,我应该如何在WordPress中使用可翻译的超链接文本?

3 个回复
最合适的回答,由SO网友:Rarst 整理而成

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

因此,我们必须结合:

文本(可翻译形式)

  • HTML标记(难以打破,但最好是灵活的形式)
  • URL目标(安全且最好是可翻译形式,可能特定于语言!)
  • 我们还需要考虑熟悉度和现有技术,换句话说,core会做什么。好吧,从quick check(快速检查)来看,核心以大多数(如果不是全部的话)方式来实现这一点是没有帮助的。

    从这些因素和surrounding discussion 我想说,根据需要和优先事项,有三种方法。

    简单-包含所有内容的一个字符串

    __( \'Please read <a href="https://goo.gl">this</a>\', \'example-domain\' );
    
    代码易于理解,允许将所有部分(文本、标记、URL)作为一个整体进行翻译,URL硬编码,容易出现HTML中断
    sprintf( 
        __( \'Please read <a href="%s">this</a>\', \'example-domain\' ), 
        esc_url( \'https://goo.gl\' ) 
    );
    
    易于理解的URL可以翻译所有部分,但URL需要单独的翻译调用。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中断,核心不太流行,需要为翻译提供更多的上下文(据我所知)simple 使其尽可能简单piecemeal 防止HTML中断balanced 对于所有其他情况(可能是最常见的)

    SO网友:gmazzap

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

    链接的URL通常需要可翻译__() 但总是这样esc_html__() / esc_attr__(). 这意味着要翻译的字符串不能包含任何类型的HTML*_x() 翻译功能的变体%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 );
    
    这是安全的,很容易被非技术人员翻译,但也很冗长,需要实现PITA,特别是如果必须对多个链接执行此操作。。。

    然而,对于一个在野外发布的代码,有数千(真实或潜在)用户使用多种语言,这就是我会采取的方式。

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

    <小时>Note:

    要让“谷歌”这个词单独翻译可能显得太多了,对于这个特定的案例来说可能也是这样。但有时甚至认为品牌名称是错误的。举个例子,在意大利我们有这个品牌"Algida" 这是已知的~30 different names around the world.

    在这种情况下,硬编码URL和/或品牌名称将导致问题。

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

    SO网友:fuxia

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

    同样重要的是建立一个口语链接文本,而不是这个或这里。

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

    结束

    相关推荐

    Plugin Localization

    我刚刚为wp构建了我的第一个插件,即使它不是一个伟大的“代码诗意”;)它正常工作。这是一个使用GalleryView 3.0 jquery插件转换默认wp库的插件(http://spaceforaname.com/galleryview).我唯一不能做的就是本地化。此插件的本地化意味着转换管理界面,在这里可以配置jquery插件选项来更改结果库的外观。我试着关注网络上数百万的教程,在论坛上阅读了很多关于这个问题的帖子,并遵循了codex的指南。。。但仍然没有运气。这就是我所做的:每个文本行都位于gette