Symfony 在Assetic资产中翻译JavaScript文本字符串的最佳方法是什么?

Symfony 在Assetic资产中翻译JavaScript文本字符串的最佳方法是什么?,symfony,twig,Symfony,Twig,我正在使用Symfony2开发一个可翻译的应用程序。应用程序已启用Assetic以缩小和合并*.js和*.css文件。然而,我有一个我写的jQuery插件,里面有文字字符串。例如,考虑下面的代码: $(“确实要继续吗?”)。对话框({ 按钮:{ “是”:函数(){ // ... }, “否”:函数(){ // ... } } }); 在上面的代码片段中,“你确定…”,“是”和“否”将始终是英文的,我不能在.js文件中使用Twig模板来翻译它,比如:{“Yes”| trans} 我想知道的是,使

我正在使用Symfony2开发一个可翻译的应用程序。应用程序已启用Assetic以缩小和合并
*.js
*.css
文件。然而,我有一个我写的jQuery插件,里面有文字字符串。例如,考虑下面的代码:

$(“确实要继续吗?

”)。对话框({ 按钮:{ “是”:函数(){ // ... }, “否”:函数(){ // ... } } });
在上面的代码片段中,“你确定…”,“是”和“否”将始终是英文的,我不能在.js文件中使用Twig模板来翻译它,比如:
{“Yes”| trans}

我想知道的是,使用Twig来利用内置的Symfony2翻译机制翻译JS脚本中的文字字符串的最佳方法是什么

有没有办法创建例如:
myscript.js.twig
文件

有没有办法创建例如:myscript.js.twig文件

这似乎是个坏主意


你可以查一下

或者自己创建,例如,在模板中包含以下内容:

<script type="text/javascript">
    var translations = {
       // ... 
       'yes' : {{ 'yes' | trans }},
       // ...
    }
</script>

变量转换={
// ... 
‘是’:{{‘是’| trans},
// ...
}

然后,如果您的javascript文件就在
之前包含,您可以在其中使用
翻译
变量。

我在搜索一些我认为是最佳解决方案的内容。但仍在寻找

同时,我使用的是Joshua I.Miller用Javascript实现的gettext。我已经上传回github,因为最初的回购协议已经关闭

<script language="javascript" src="/path/LC_MESSAGES/myDomain.json"></script>
<script language="javascript" src="/path/Gettext.js"></script>
要从Symfony获取翻译文件的路径,您必须对Translator服务进行一些php/twig扩展,但它在不复制翻译资源的情况下运行良好。

以下是我的解决方案(在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')
        );
    }
}
我们将动态翻译文件放在模板中的其他资产之前:

<script src="{{ path('translation') }}"></script>
我们可以在任何JS文件中显示我们的翻译:

console.log(trans['month']['january']);
console.log(trans['medium']);

我希望它对某人有用

你的两个想法都很完美!我想给猫剥皮的方法总不止一种吧!;)您应该在
{{'yes'|trans}}
周围加引号,否则会引发错误。将翻译yaml放入json转换器;)好主意!我是按照你的逻辑做的,但是我创建了一个细枝函数
<script src="{{ path('translation') }}"></script>
projects: Projekty
medium: Średnio
month:
  january: Styczeń
  february: Luty
console.log(trans['month']['january']);
console.log(trans['medium']);