如何在 prestashop 的 smarty 翻译中使用 html 标签?
how to use html tags in prestashop's smarty translations?
我找不到解决办法。我要做的就是翻译这个:
se stai inserendo un indirizzo per consegna all'interno dell'area <span class=orange>EXPO</span>
进入这个:
If your delivery address is in the <span class=orange>EXPO</span> area
如果我使用标签,像这样:
{l s="se stai inserendo un indirizzo per consegna all'interno dell'area <span class=orange>EXPO</span>"}
他们不会被看到。那又怎样?
尽量将 HTML 排除在翻译字符串之外。你可以通过制作两个字符串来做到这一点:
{l s="se stai inserendo un indirizzo per consegna all'interno dell'area"} <span class="orange">{l s='EXPO'}</span>
翻译功能将删除所有 html 标签,因此您必须使用像这样的替代方法
{capture "string"}
{l s="se stai inserendo un indirizzo per consegna all'interno dell'area _h1_EXPO_h2_"}
{/capture}
{$smarty.capture.string|replace:'_h1_':'<span class="orange">'|replace:'_h2_':'</span>'}
_h1_
和_h2_
在翻译中,分别被<span class="orange">
和</span>
取代
smarty capture 函数用于获取变量的翻译 string
而不是显示它
所以你的英文翻译应该是这样的
If your delivery address is in the _h1_EXPO_h2_ area
Prestashop 为此提供了一个未记录的解决方案:
您可以在 {l}
函数调用中添加一个 tags
参数。该参数的值是一个字符串数组。要在字符串中添加此数组中的标签,您需要使用 [i]x[/i]
(其中 i
是数组中从 1 开始的标签索引,而 x
是您希望看到的包围的文本通过标签)
例如,如果我想在单个翻译行中呈现此字符串:
<strong>Welcome</strong> <i class="name_class">Florian Lemaitre</i>!
我可以使用这个代码:
{l s='[1]Welcome[/1] [2]%s[/2]!' sprintf=[$name] tags=['<strong>', '<i class="name_class">']}
在你的情况下你可以使用:
{l s="se stai inserendo un indirizzo per consegna all'interno dell'area [1]EXPO[/1]" tags=['<span class=orange>']}
您可以在文件 classes/Translate.php
中找到相关代码:
/**
* Perform operations on translations after everything is escaped and before displaying it
*/
public static function postProcessTranslation($string, $params)
{
// If tags were explicitely provided, we want to use them *after* the translation string is escaped.
if (!empty($params['tags'])) {
foreach ($params['tags'] as $index => $tag) {
// Make positions start at 1 so that it behaves similar to the %1$d etc. sprintf positional params
$position = $index + 1;
// extract tag name
$match = array();
if (preg_match('/^\s*<\s*(\w+)/', $tag, $match)) {
$opener = $tag;
$closer = '</'.$match[1].'>';
$string = str_replace('['.$position.']', $opener, $string);
$string = str_replace('[/'.$position.']', $closer, $string);
$string = str_replace('['.$position.'/]', $opener.$closer, $string);
}
}
}
return $string;
}
{assign var="name" value="Bob"}
{l s='[1]Welcome[/1] [2] %s [/2]!' sprintf=[$name] tags=['<strong>', '<i class="name_class">']}
给我们
[1]Welcome[/1] [2] Bob [/2]!
我找不到解决办法。我要做的就是翻译这个:
se stai inserendo un indirizzo per consegna all'interno dell'area <span class=orange>EXPO</span>
进入这个:
If your delivery address is in the <span class=orange>EXPO</span> area
如果我使用标签,像这样:
{l s="se stai inserendo un indirizzo per consegna all'interno dell'area <span class=orange>EXPO</span>"}
他们不会被看到。那又怎样?
尽量将 HTML 排除在翻译字符串之外。你可以通过制作两个字符串来做到这一点:
{l s="se stai inserendo un indirizzo per consegna all'interno dell'area"} <span class="orange">{l s='EXPO'}</span>
翻译功能将删除所有 html 标签,因此您必须使用像这样的替代方法
{capture "string"}
{l s="se stai inserendo un indirizzo per consegna all'interno dell'area _h1_EXPO_h2_"}
{/capture}
{$smarty.capture.string|replace:'_h1_':'<span class="orange">'|replace:'_h2_':'</span>'}
_h1_
和_h2_
在翻译中,分别被<span class="orange">
和</span>
取代
smarty capture 函数用于获取变量的翻译 string
而不是显示它
所以你的英文翻译应该是这样的
If your delivery address is in the _h1_EXPO_h2_ area
Prestashop 为此提供了一个未记录的解决方案:
您可以在 {l}
函数调用中添加一个 tags
参数。该参数的值是一个字符串数组。要在字符串中添加此数组中的标签,您需要使用 [i]x[/i]
(其中 i
是数组中从 1 开始的标签索引,而 x
是您希望看到的包围的文本通过标签)
例如,如果我想在单个翻译行中呈现此字符串:
<strong>Welcome</strong> <i class="name_class">Florian Lemaitre</i>!
我可以使用这个代码:
{l s='[1]Welcome[/1] [2]%s[/2]!' sprintf=[$name] tags=['<strong>', '<i class="name_class">']}
在你的情况下你可以使用:
{l s="se stai inserendo un indirizzo per consegna all'interno dell'area [1]EXPO[/1]" tags=['<span class=orange>']}
您可以在文件 classes/Translate.php
中找到相关代码:
/**
* Perform operations on translations after everything is escaped and before displaying it
*/
public static function postProcessTranslation($string, $params)
{
// If tags were explicitely provided, we want to use them *after* the translation string is escaped.
if (!empty($params['tags'])) {
foreach ($params['tags'] as $index => $tag) {
// Make positions start at 1 so that it behaves similar to the %1$d etc. sprintf positional params
$position = $index + 1;
// extract tag name
$match = array();
if (preg_match('/^\s*<\s*(\w+)/', $tag, $match)) {
$opener = $tag;
$closer = '</'.$match[1].'>';
$string = str_replace('['.$position.']', $opener, $string);
$string = str_replace('[/'.$position.']', $closer, $string);
$string = str_replace('['.$position.'/]', $opener.$closer, $string);
}
}
}
return $string;
}
{assign var="name" value="Bob"}
{l s='[1]Welcome[/1] [2] %s [/2]!' sprintf=[$name] tags=['<strong>', '<i class="name_class">']}
给我们
[1]Welcome[/1] [2] Bob [/2]!