19

我正在使用 Symfony2 开发一个可翻译的应用程序。该应用程序启用了 Assetic 以缩小和合并*.js文件*.css。但是,我编写了一个 jQuery 插件,其中包含文字字符串。例如,考虑以下代码:

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

在上面的代码片段中,“Are you sure...”、“Yes”和“No”将始终是英语,我不能在 .js 文件中使用 Twig 模板来翻译它,例如:{{ "yes"|trans }}

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

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

4

3 回答 3

34

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

这似乎是个坏主意。


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

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

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

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

于 2011-08-04T21:38:06.787 回答
9

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

我希望它对某人有用

于 2020-03-18T10:16:11.460 回答
0

我正在寻找一些东西来使 twig.js 与翻译一起工作,这在我看来是最好的解决方案。不过还是在找。

同时,我正在使用这个jsgettext,它是 Joshua I. Miller 的 Javascript 中的 gettext 实现。由于原始仓库已关闭,我已上传回 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 获取翻译文件的路径,您必须围绕 Translator 服务进行一些 php/twig 扩展,但它在不复制翻译资源的情况下效果很好。

于 2017-02-11T11:06:59.107 回答