当您有翻译文本的链接时,如何使用 gettext?

发布于 2024-09-12 05:19:09 字数 334 浏览 7 评论 0 原文

我使用 gettext 来翻译我的网站。

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

我可以仅为网站(带有链接)创建文本,也可以为所有目的创建文本。
我必须维护两个版本。 :-(

我还可以编写一个自定义解析器来在文本中插入链接,但这似乎有点过分了,我担心 天真的危险

对于那些遇到同样问题的人,您是如何处理的?

I use gettext to translate my web site.

It would be nice to have link in text translated but I don't want to write html tags in gettext files because these translations may be used elsewhere.

I could create text for web site only (with links) and text for all purpose.
I'll have to maintain 2 versions. :-(

I could also write a custom parser to insert links in text but it seems overkill and I'm affraid of The Danger of Naïveté

For those who had the same problem, how did you handle that ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

暮色兮凉城 2024-09-19 05:19:10

这里的另一个解决方案: https://zargony.com/2008/ 01/24/links-in-gettext-translated-strings

它建议使用{大括号}作为链接。例如:

_("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 中这些大括号向译者发出警告并建议他们不要翻译。

Another solution here: https://zargony.com/2008/01/24/links-in-gettext-translated-strings.

It suggests using {curly brackets} for links. As for example:

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

And then write your own function linkify that replaces things in curly brackets with the parameters given.

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

Definition in 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: You can also easily substitute the {} for [], as I've noticed that in POEdit these curly brackets give warnings to the translators and recommend them not to be translated.

滥情空心 2024-09-19 05:19:09

我曾经将链接作为参数。大多数时候,整个 标签就是一个参数。就像 请参阅 %s 此链接 %s 了解更多信息。 第一个 %s 传递链接标记,第二个 %s 传递结束 标签。

现在,当必须翻译链接文本时,我仅使用整个短语作为链接。因此,我们只有“请参阅此链接以获取更多信息”之类的文本,将其翻译并在其周围放置链接标签。管理翻译要容易得多,而且您不会遇到困惑的翻译,也不会需要花时间解释您要做什么。

I used to put links as parameters. Most of the time the whole <a> -tag is a parameter. Like Please see %s this link %s for more information. The first %s is passed the link tag, and the second one is passed the closing </a> tag.

Now I use only whole phrases as links when a link text must be translated. So we have just text like 'Please see this link for more information', get it translated and put the link tags around it. It's much easier to manage the translations, and you don't have a confused translator, or need to spend time explaining what you're trying to do.

睡美人的小仙女 2024-09-19 05:19:09

老实说,我不会太担心使用一些基本的 HTML(或使用 bbCode纺织markdown 等)直接添加到您的翻译文件中。 URL 可能是目前唯一的问题,但是其他文本标记呢?

更不用说 URL 本身可能根据语言的不同而有所不同。

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

I honestly wouldn't be too concerned about using some basic HTML (or use bbCode, textile, markdown, etc.) directly into your translation files. URL's might appear to be the only problem right now, but what about other text markup?

Not to mention that the URL's themselves could potentially be different depending on the language.

I do agree that translation files do have their issues though.

俯瞰星空 2024-09-19 05:19:09

为了补充所选答案,这里有一个实际示例:

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

To complement the selected answer, here is a practical example:

printf( __( 'Please see %s this link %s for more information.', 'text-domain' ), '<a href="http://yolo.io" title="yolo">', '</a>' );
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文