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

jos*_*erk 15 symfony twig

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

   $('<p>Are you sure you want to proceed?</p>').dialog({
        buttons: {
            "Yes" : function() {
                // ...
            },
            "No" : function() {
                // ...
            }
        }
    });
Run Code Online (Sandbox Code Playgroud)

在上面的代码片段中,"你确定......","是"和"否"将始终是英文,我不能在.js文件中使用Twig模板来翻译它,例如:{{"是"| trans}}

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

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

jul*_*bou 29

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

这似乎是个坏主意.


您可以查看https://github.com/willdurand/BazingaExposeTranslationBundle

或者自己创建,例如在模板中包含它:

<script type="text/javascript">
    var translations = {
       // ... 
       'yes' : {{ 'yes' | trans }},
       // ...
    }
</script>
Run Code Online (Sandbox Code Playgroud)

然后,如果您的javascript文件包含在</body>您可以使用translations变量之前.

  • 您应该将`{{'是'| 反引号,否则将引发错误。 (2认同)

小智 8

这是我的解决方案(在 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')
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我们创建一个 TWIG 模板来渲染(/templates/translation/translation.js.twig):

var trans = JSON.parse('{{ json|raw }}');
Run Code Online (Sandbox Code Playgroud)

我们将我们的动态翻译文件放在其他资产之前的模板中:

<script src="{{ path('translation') }}"></script>
Run Code Online (Sandbox Code Playgroud)

对于示例翻译文件 /translations/messages.pl.yaml:

projects: Projekty
medium: ?rednio
month:
  january: Stycze?
  february: Luty
Run Code Online (Sandbox Code Playgroud)

我们可以在任何 JS 文件中显示我们的翻译:

console.log(trans['month']['january']);
console.log(trans['medium']);
Run Code Online (Sandbox Code Playgroud)

我希望它对某人有用

  • 好想法 !我按照你的逻辑做了它,但我创建了一个 Twig 函数 (2认同)