【问题标题】:Symfony2 Translation Add HtmlSymfony2 翻译添加 Html
【发布时间】:2015-10-07 06:55:23
【问题描述】:

我想在 Symfony 2 Translation 中添加一些 HTML。这样我就可以知道我的应用程序中哪些短语被翻译了,哪些没有。 我在“Symfony\Component\Translation\Translator.php”函数“trans”中找到。现在我想在函数返回中添加一些东西,例如“”:

/**
 * {@inheritdoc}
 *
 * @api
 */
public function trans($id, array $parameters = array(), $domain = null, $locale = null)
{
    if (null === $locale) {
        $locale = $this->getLocale();
    } else {
        $this->assertValidLocale($locale);
    }

    if (null === $domain) {
        $domain = 'messages';
    }

    if (!isset($this->catalogues[$locale])) {
        $this->loadCatalogue($locale);
    }

    return strtr($this->catalogues[$locale]->get((string) $id, $domain)."</br>", $parameters);
}

问题是,当我运行我的应用程序时,我得到例如“标签”(我添加了空格,因为通常情况下它不会在此处显示。HTML 不会将其解释为 HTML 代码但作为一个字符串。有什么方法可以实现我想要的吗?也许是,但以另一种方式?

【问题讨论】:

  • 显示时可能使用原始过滤器。例如:{{ my_translated_var|raw }}
  • 翻译不仅用于 Twig,还用于 Javascript 和 PHP 控制器。所以这种方式只能在某些方面解决这个问题,我必须在任何地方进行更改。我只想在 Devoloper Environment 的一个功能中更改它。

标签: php html symfony translation translate


【解决方案1】:

发生这种情况是因为您激活了 Twig Escaper 扩展程序。该扩展将自动输出转义添加到 Twig,它定义了 autoescape 标记和 raw 过滤器。

所以我认为你在这里得到的最佳选择是定义一个新的 twig 扩展,让你翻译你的 html 字符串,而不必每次都重复 myvar|raw

要了解如何创建新的 Twig 扩展,请查看文档here

在转义 JS 时使用相同的扩展名,并且不需要使用其他任何东西,尤其是在您的 PHP 控制器中。那是因为转义是在 Twig 级别完成的。请记住将新的 Twig 过滤器声明为安全的,以避免再次自动转义:

$filter = new Twig_SimpleFilter('nl2br', 'nl2br', array('is_safe' => array('html')));

如果您需要对请求的数据进行一些额外的处理,以便您可以跟踪正在请求的字符串以及不请求的字符串,那么只需声明一个新服务作为 Symfony 翻译服务的代理。您的 Twig 扩展程序可以使用相同的服务。这样您就可以将所有请求集中到一个服务中。

这里有一些对你有用的链接:

【讨论】:

  • 看起来很有趣。我今天会努力做到这一点,从现在开始。我会让你知道我会实现什么;-)
  • 我有一个问题。我的 nl2br 应该是什么样子,这是第一个。以及如何在不添加“|nl2br”部分的情况下声明要始终使用的树枝过滤器。
  • 我猜你的nl2br 应该调用一个你应该创建的服务来处理你需要的翻译。毕竟,您的新 Twig 扩展将是一个类,因此您可以使用依赖注入模式来处理那里的依赖关系并提供我提到的服务。关于避免 |nl2br 部分,我认为扩展是不可行的。您可以禁用自动转义功能twig.sensiolabs.org/doc/tags/autoescape.html 或使用宏twig.sensiolabs.org/doc/tags/macro.htmlmacrosparent 返回的模板数据被认为是安全的)
  • 我的做法有点不同,但你的回答对我帮助很大。
【解决方案2】:

我建议您在翻译中只使用 Markdown。
然后您可以使用 Markdown 解析器解析您翻译的消息。

Twig 中的示例:'my.message'|trans|markdown(我想你有一个 Markdown 过滤器,有 KnpMarkdownBundle

【讨论】:

  • 据我了解,它仅适用于 Twig 翻译。所以这种方式只能在某些方面解决这个问题,我必须在任何地方进行更改。我只想在 Devoloper Environment 的一个函数中更改它,我不想更改我的应用程序中的任何内容。
【解决方案3】:

我的解决方案:

我已经通过几个步骤实现了我想要的:

  1. 覆盖 Translator.php 并更改 parameters.yml 中的translator.class

    公共函数 trans($id, $parameters, $domain, $locale) { $return = parent::trans($id, $parameters, $domain, $locale); return "".$return.''); }

  2. 在您的 css 中设置翻译类。

  3. 在 parameters.yml 中将 autoescape 选项设置为 false

    树枝: 自动转义:假

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    相关资源
    最近更新 更多