当你链接到翻译文本时,如何使用gettext?

时间:2010-07-29 19:47:35

标签: php multilingual gettext

我使用gettext翻译我的网站。

在文本中翻译链接会很好,但我不想在gettext文件中编写html标签,因为这些翻译可能会在其他地方使用。

我可以为网站创建文本(带链接)和文本用于各种目的 我将不得不维护2个版本。 : - (

我也可以编写一个自定义解析器来插入文本中的链接,但它似乎有点过分,我害怕The Danger of Naïveté

对于那些遇到同样问题的人,你是怎么处理的?

4 个答案:

答案 0 :(得分:3)

我曾经把链接作为参数。大多数情况下,整个<a> -tag是一个参数。与Please see %s this link %s for more information.类似,第一个%s传递链接标记,第二个传递结束</a>标记。

现在,在链接文本必须翻译时,我只使用整个短语作为链接。因此,我们只有“请查看此链接以获取更多信息”的文字,将其翻译并在其周围添加链接标记。管理翻译要容易得多,而且你没有困惑的翻译,或者需要花时间来解释你想要做的事情。

答案 1 :(得分:1)

老实说,我不会太在意将一些基本HTML(或使用bbCodetextilemarkdown等)直接用于翻译文件。 URL似乎是目前唯一的问题,但其他文本标记呢?

更不用说根据语言,网址本身可能会有所不同。

我同意翻译文件确实存在问题。

答案 2 :(得分:1)

为了补充所选答案,这是一个实际的例子:

printf( __( 'Please see %s this link %s for more information.', 'text-domain' ), '<a href="http://yolo.io" title="yolo">', '</a>' );

答案 3 :(得分:1)

此处有另一种解决方案:https://zargony.com/2008/01/24/links-in-gettext-translated-strings

建议使用{curly brackets}作为链接。例如:

_("Please click {here} or {here}")

然后编写自己的函数linkify,用给定的参数替换大括号中的内容。

linkify(
    _("Please click {here} or {here}"),
    "</a>",
    "<a href='www.example1.com'>", 
    "<a href='www.example2.com'>"
)

PHP中的定义:

function linkify($string, $closingTag) {
    $arguments = func_get_args();
    return preg_replace_callback(
        '/{(.*?)}/', // Ungreedy (*?)
        function($matches) use ($arguments, $closingTag) {
            static $i = 1; 
            $i++;
            return $arguments[$i] . $matches[1] . $closingTag;
        },
        $string
    );
}

PS:您也可以轻松地将{}替换为[],因为我注意到在POEdit中这些大括号会向翻译人员发出警告,并建议他们不要翻译。