如何使用HTMLURL打印支持翻译的文本

时间:2017-03-18 作者:Simon Vetterli

我对WordPress有些陌生,如果它是关于;“更深”;自定义。

现在我有了这个功能:

esc_html_e( \'Dear Guest, with Your information we not find any room at the moment. Please contact us per email [email protected].\', \'awebooking\' );
目前正在显示文本。

但是,当我想添加a href (HTML链接)?

因此,我希望有以下文字:

亲爱的客人,根据您的信息,我们目前找不到任何房间。

请联系我们<a href="http://www.whitesandsamuiresort.com/contact-us/">contact page</a> 或每封电子邮件[email protected].

我无法同时支持翻译(国际化/本地化)和转义HTML链接。

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

自从esc_html_e 将转义HTML链接(因此将HTML锚定显示为纯文本),您需要使用esc_html_eesc_html__, 并打印HTML链接部分,而不进行HTML转义。

方法1(仅供您理解):

您可以分部分进行,如下所示:

esc_html_e( \'Dear Guest, with Your information we could not find any room at the moment.\', \'text-domain\' );
echo "<br><br>";

printf(
    esc_html__( \'%1$s %2$s\', \'text-domain\' ),
    esc_html__( \'Please contact us on our\', \'text-domain\' ),
    sprintf(
        \'<a href="%s">%s</a>\',
        esc_url( \'http://www.example.com/contact-us/\' ),
        esc_html__( \'Contact Page\', \'text-domain\' )
    )
);

printf(
    \' or <a href="%s">%s</a>\',
    esc_url( \'mailto:[email protected]\', array( \'mailto\' ) ),
    esc_html__( \'Email\', \'text-domain\' )
);
方法2(仅供您理解):显然,不同的语言会有不同的文本顺序,因此为了给翻译人员更多的灵活性(对文本进行转义和排序),您可以通过以下方式进行:

printf(
    esc_html__( \'%1$s%2$s%3$s%4$s%5$s\', \'text-domain\' ),
    esc_html__( \'Dear Guest, with Your information we could not find any room at the moment.\', \'text-domain\' ),
    nl2br( esc_html__( "\\n\\n", \'text-domain\' ) ),
    sprintf(
        esc_html__( \'%1$s %2$s\', \'text-domain\' ),
        esc_html__( \'Please contact us on our\', \'text-domain\' ),
        sprintf(
            \'<a href="%s">%s</a>\',
            esc_url( \'http://www.example.com/contact-us/\' ),
            esc_html__( \'Contact Page\', \'text-domain\' )
        )
    ),
    esc_html__( \' or \', \'text-domain\' ),
    sprintf(
        \'<a href="%s">%s</a>\',
        esc_url( \'mailto:[email protected]\', array( \'mailto\' ) ),
        esc_html__( \'Email\', \'text-domain\' )
    )
);
这种方法将:

避开所有必要的翻译文本。

允许HTML用于链接、电子邮件(带有mailto: 语法)等。

允许译者对不同语言的文本进行各种不同的排序。这个argument swapping notation (%1$s, %2$s 等),以便翻译人员可以在需要时对译文重新排序。

方法3(更新和推荐):如@shea rightly pointed out, Method-2 以上工作很好,但对于翻译人员来说,添加对不同语言的支持可能很困难。因此,我们需要一个解决方案:

保持句子完整(不断句)。

  • 进行正确的转义。

  • 为联系人提供了不同的订购方式;翻译句子中的电子邮件链接(或任何类似链接)。

    因此,为了避免method-2, 下面的解决方案保持了可翻译句子的完整性,并进行了正确的URL转义&;同时交换参数(代码注释中有更多注释):

    // sample contact url (may be from an unsafe place like user input)
    $contact_url = \'http://www.example.com/contact-us/\';
    // escaping $contact_url
    $contact_url = esc_url( $contact_url );
    
    // sample contact email (may be from an unsafe place like user input)
    $contact_email = \'[email protected]\';
    // escaping, sanitizing & hiding $contact_email.
    // Yes, you may still need to sanitize & escape email while using antispambot() function
    $contact_email = esc_url( sprintf( \'mailto:%s\', antispambot( sanitize_email( $contact_email ) ) ), array( \'mailto\' ) );
    
    esc_html_e( \'Dear Guest, with Your information we could not find any room at the moment.\', \'text-domain\' );
    echo "<br><br>";
    
    printf(
        esc_html__( \'Please contact us on our %1$s or per %2$s.\', \'text-domain\' ),
        sprintf(
            \'<a href="%s">%s</a>\',
            $contact_url,
            esc_html__( \'Contact Page\', \'text-domain\' )
            ),
        sprintf(
            \'<a href="%s">%s</a>\',
            $contact_email,
            esc_html__( \'Email\', \'text-domain\' )
            )
        );
    
    这样做会给翻译人员两个完整的句子&;要翻译的两个单独的单词。因此,翻译人员只需担心以下简单的行(而代码会处理其余的行):

    esc_html_e( \'Dear Guest, with Your information we could not find any room at the moment.\', \'text-domain\' );
    // ...
    esc_html__( \'Please contact us on our %1$s or per %2$s\', \'text-domain\' )
    // ...
    esc_html__( \'Contact Page\', \'text-domain\' )
    // ...
    esc_html__( \'Email\', \'text-domain\' )
    
    就是这样,结构简单,并进行适当的转义和参数交换。

    了解更多信息internationalization for themes &;internationalization for plugins.

  • SO网友:shea

    我认为@Fayaz的回答很好;它们肯定走在了正确的道路上,因为您应该使用围绕翻译的sprintf()来包含诸如HTML和链接之类的内容。

    然而,我不认为把句子分成几个部分进行翻译是一个好主意,因为许多语言有不同的句子结构,与英语完全不兼容。通过拆分单个单词,翻译特定单词的大量上下文非常复杂,可能导致歧义和翻译错误。

    相反,我建议将短语和句子作为一个整体进行翻译,然后使用sprintf 或在适当的情况下使用不同的ESCAPing功能。

    对于您的文本,第一部分可以通过esc_html_e:

    esc_html_e( \'Dear Guest, with your information we not find any room at the moment. \', \'text-domain\' );
    
    第二部分稍微难一些。现在,我假设您正在以某种方式从数据库检索页面URL和电子邮件,可能使用get_the_permalink()get_option() 或其他功能。所以我假设它们存储在$contact_page_url$contact_email 变量。

    第一步是翻译字符串,不带链接。请注意,我们需要使用__() 在这一点上没有逃脱——那将在稍后发生。

    __( \'Please contact us on our <a href="%1$s">contact page</a> or by email %2$s.\', text-domain\' );
    
    这样,翻译人员就可以根据需要自由地说出句子,并将链接URL和电子邮件放在需要的地方。

    下一步是使用sprintf() 插入链接URL和电子邮件。请注意,我们使用esc_url() 此处转义URL,以及antispambot() 要对电子邮件地址进行编码以提供最低限度的防刮保护,请执行以下操作:

    $text = sprintf(
        __( \'Please contact us on our <a href="%1$s">contact page</a> or by email %2$s.\', \'text-domain\' );
        esc_url( $contact_page_url ),
        sprintf( \'<a href="mailto:%1$s">%1$s</a>\', antispambot( $contact_email ) );
    );
    
    最后,而不是使用esc_html() , 我们需要使用wp_kses() 要仅允许在翻译的HTML中使用链接元素,请执行以下操作:

    echo wp_kses( $text, array( \'a\' => array( \'href\'  => array() ) ) );
    
    就这样!最终代码为:

    esc_html_e( \'Dear Guest, with your information we not find any room at the moment. \', \'text-domain\' )
    
    $text = sprintf(
        __( \'Please contact us on our <a href="%1$s">contact page</a> or by email %2$s.\', \'text-domain\' );
        esc_url( $contact_page_url ),
        sprintf( \'<a href="mailto:%1$s">%1$s</a>\', antispambot( $contact_email ) );
    );
    
    echo wp_kses( $text, array( \'a\' => array( \'href\'  => array() ) ) );
    

    SO网友:Aftab

    如果您使用的是esc\\u html\\u e,那么此函数只表示它将转义html标记。因此,您无法在此esc\\u HTML\\u e中使用HTML标记。

    相关推荐

    Force pretty permalinks?

    我正在构建一个插件,该插件将用于单个站点,并依赖于add_rewrite_rule 要工作,需要打开永久链接。打开它们并不困难,因为它只是一个站点,但我担心其中一个管理员可能会在不知道自己在做什么的情况下关闭它,并破坏该站点。如何以编程方式强制保持漂亮的永久链接?