Laravel 使用 html 本地化更复杂的内容

问题描述 投票:0回答:1

查看文档 https://laravel.com/docs/11.x/localization#using-translation-strings-as-keys 对于仅字符串内容,使用

__("My string")
相当简单,但我不确定对于更大或更复杂的内容的最佳方法,例如:

<a href="https://en.wikipedia.org/wiki/Wikipedia" title="About Wikipedia">Wikipedia</a></b> is a <a href="https://en.wikipedia.org/wiki/Wikipedia:Free_encyclopedia" title="Free encyclopedia">free online encyclopedia</a> that anyone can edit, and <a href="https://en.wikipedia.org/wiki/Special:RecentChanges" title="See all recent changes">millions already have</a>

将会输出:

维基百科是任何人都可以编辑的免费在线百科全书,并且数百万人已经拥有

有一些文本,但它包含多个

<a>
以及用于 SEO 等的
title
属性

我是否应该将 URL 和其他属性(例如标题)作为参数传递给

__("")
方法?但是在 lang 文件中包含
<a>
感觉很奇怪,而且如果链接上有一些 AlpineJS 标签,比如
x-on:click=""

另一方面,如果我只想通过将翻译分成多个部分来翻译文本并将 HTML 保留在刀片视图中,则存在某些语言没有完全相同的单词上的链接或从右到左的问题...

您能给出这个用例的真实示例吗?谢谢

laravel localization
1个回答
0
投票

我有一个 helpers.php 文件,我在其中定义了一些方便的函数,如下所示:

if (!function_exists('l')) {
    /**
     * Generates an html anchor tag
     */
    function l($url, $title, $attributes = [], $blank = false) {
        $_attr = ['href' => $url,];
        
        if ($blank) {
            $_attr['target'] = '_blank';
        }

        $bag = new ComponentAttributeBag($_attr);

        if (count($attributes)) {
            $bag = $bag->merge($attributes);
        }

        return '<a ' . $bag->toHtml() . '>' . $title . '</a>';
    }
}

我会像你的例子一样处理翻译:

<p>
    {!! __(
        ':wikiUrl is a :wikiDef that anyone can edit, and :manyHave.',
        [
            'wikiUrl' => l(
                'https://en.wikipedia.org/wiki/Wikipedia',
                __('Wikipedia'), // translate the link text again if necessary
                [
                    'title' => __('translatable title'),
                    'attribute' => 'foobar',
                ],
                true
            ),
            'wikiDef' => l(
                'https://en.wikipedia.org/wiki/Wikipedia:Free_encyclopedia',
                __('free online encyclopedia'),
                [],
                true
            ),
            'manyHave' => l(
                'https://en.wikipedia.org/wiki/Wikipedia:Free_encyclopedia',
                __('millions already have'),
                [],
                true
            ),
            
        ]
    ) !!}
</p>

所以可翻译的文本字符串只是

:wikiUrl is a :wikiDef that anyone can edit, and :manyHave.
这种方法有它自己的好处和问题,但我发现它真的很强大。

您还可以之前在变量中定义 url,并在

l()
函数中使用时根据语言或其他变量更改它们。

© www.soinside.com 2019 - 2024. All rights reserved.