如何将带有键和值的翻译从 Twig 传递到 JavaScript 对象?

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

我试图通过 Twig 模板将翻译字符串作为键值对传递,而不必一一重新分配它们。

我的翻译保存在文件中

translations/messages.fr.yaml
。示例:

entity:
  foo: some translation
  bar: another translation
  third:
    title: one more

目前,我使用“trans”过滤器通过 JS 代码块中的 Twig 模板传递翻译:

const translations = {
  foo: "{{'entity.foo'|trans}}",
  bar: "{{'entity.bar'|trans}}",
  third: {
    title: "{{'entity.third.title'|trans}}"
  }
}

有没有办法直接传递“实体”的所有属性?我可以将翻译作为对象访问并通过 JSON 将其传递到变量中(作为 Twig 变量,或者如果需要,使用

<?php ... ?>
回显某些内容)?

我知道我可以使用 AJAX,但我正在尝试在模板中传递数据。

php symfony twig
1个回答
1
投票

我用一个函数

getTranslations
解决了这个问题,该函数检索目录并将其与后备目录合并。然后它调用递归函数
addToArray
从点分隔的关键片段创建一个多维数组:

function addToArray(array $keySegments, array|string $translations, string $translation) : array|string 
{
    if (count($keySegments) === 0) {
        return $translation;
    }

    if (!is_array($translations)) {
        // syntax error in yaml file - a dot inside a key name
        return $translations;
    }

    $keySegment = array_shift($keySegments);
    if (!isset($translations[$keySegment])) {
        $translations[$keySegment] = [];
    }

    $translations[$keySegment] = addToArray($keySegments, $translations[$keySegment], $translation);

    return $translations;
}


function getTranslations(Symfony\Contracts\Translation\TranslatorInterface $translator) : array
{
    // replace 'messages' with the required domain
    $catalogue = array_merge(
        $translator->getCatalogue()->getFallbackCatalogue()->all('messages'),
        $translator->getCatalogue()->all('messages')
    );
    $translations = [];
    foreach ($catalogue as $key => $translation) {
        $keySegments = explode('.', $key);
        $translations = array_merge($translations, addToArray($keySegments, $translations, $translation));
    }

    return $translations;
}

在树枝模板中,我在脚本块中使用输出:

const translations = JSON.parse(`{{translations|json_encode|raw}}`);
© www.soinside.com 2019 - 2024. All rights reserved.