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

cvxl0en2  于 2023-06-24  发布在  Java
关注(0)|答案(1)|浏览(124)

我试图将翻译字符串作为键值对通过Twig模板传递,而不必一个接一个地再次赋值。
我把我的翻译放在一个文件translations/messages.fr.yaml中。示例:

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

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

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

有没有一种方法直接传递'实体'的所有属性?我可以将翻译作为一个对象访问,并通过JSON将其传递到变量中吗(作为Twig变量,或者如果需要,用<?php ... ?>回显某些内容)?
我知道我可以使用 AJAX ,但我试图传递模板中的数据。

krcsximq

krcsximq1#

我用一个函数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;
}

在twig模板中,我使用脚本块中的输出:

const translations = JSON.parse(`{{translations|json_encode|raw}}`);

相关问题