我试图通过 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,但我正在尝试在模板中传递数据。
我用一个函数
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}}`);