这是我的解决方案(在 Symfony 4 和 5 上测试):
首先,我们创建一个控制器,它将根据当前变量语言环境创建包含所有翻译的 JS 文件:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Yaml\Yaml;
/**
* Translation controller.
*/
class TranslationController extends AbstractController
{
/**
* @Route("/translation.js", name="translation")
*/
public function index(Request $request)
{
$locale = $request->getLocale();
$file = __DIR__.'/../../translations/messages.'.$locale.'.yaml';
$parsed = Yaml::parse(file_get_contents($file));
$translations = $this->renderView(
'translation/translation.js.twig',
array(
'json' => json_encode($parsed)
)
);
return new Response($translations, 200,
array('Content-Type' => 'text/javascript')
);
}
}
然后我们创建一个 TWIG 模板来渲染(/templates/translation/translation.js.twig):
var trans = JSON.parse('{{ json|raw }}');
我们将我们的动态翻译文件放在模板中其他资产之前:
<script src="{{ path('translation') }}"></script>
对于示例翻译文件 /translations/messages.pl.yaml:
projects: Projekty
medium: Średnio
month:
january: Styczeń
february: Luty
我们可以在任何 JS 文件中显示我们的翻译:
console.log(trans['month']['january']);
console.log(trans['medium']);
我希望它对某人有用