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

时间:2011-08-04 11:17:45

标签: symfony twig

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

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

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

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

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

3 个答案:

答案 0 :(得分:30)

  

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

这似乎是一个坏主意。


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

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

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

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

答案 1 :(得分:3)

这是我的解决方案(在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.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']);

我希望这对某人有用

答案 2 :(得分:0)

我正在寻找make twig.js work with translations的东西,这似乎是我最好的解决方案。还在搜索。

与此同时,我正在使用这个jsgettext,这是Javascript中的gettext实现,Joshua I. Miller。我已经上传回github,因为最初的回购已经失效。

<script language="javascript" src="/path/LC_MESSAGES/myDomain.json"></script>
<script language="javascript" src="/path/Gettext.js"></script>

您将翻译文件加载到DOM中,jsgettext可以解析它:

function _(msgid) { return gt.gettext(msgid); }

alert(_("some string"));

要从Symfony获取翻译文件的路径,您必须围绕翻译服务进行一些php / twig扩展,但它可以很好地工作而不会重复您的翻译资源。