我正在使用 Symfony2 开发一个可翻译的应用程序。该应用程序启用了 Assetic,可以缩小和合并
*.js
和 *.css
文件。但是,我编写了一个 jQuery 插件,其中包含文字字符串。例如,考虑以下代码:
$('<p>Are you sure you want to proceed?</p>').dialog({
buttons: {
"Yes" : function() {
// ...
},
"No" : function() {
// ...
}
}
});
在上面的代码片段中,“你确定...”、“是”和“否”将始终是英语,我无法在 .js 文件中使用 Twig 模板来翻译它,例如:
{{ "yes"|trans }}
我想知道的是,使用 Twig 来利用内置的 Symfony2 翻译机制来翻译 JS 脚本中的文字字符串的最佳方式是什么。
有没有办法创建例如:
myscript.js.twig
文件?
有没有办法创建例如:myscript.js.twig 文件?
这似乎是个坏主意。
您可以检查https://github.com/willdurand/BazingaExposeTranslationBundle
或自己创建它,例如将其包含在您的模板中:
<script type="text/javascript">
var translations = {
// ...
'yes' : {{ 'yes' | trans }},
// ...
}
</script>
然后,如果您的 javascript 文件包含在
</body>
之前,您可以在其中使用 translations
变量。
这是一个解决方案,在 Symfony 4 和 5 上进行了测试。
首先,我们创建一个控制器,它将根据当前语言环境创建一个包含所有翻译的 JavaScript 文件:
<?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
我们可以在任何 JavaScript 文件中显示我们的翻译:
console.log(trans['month']['january']);
console.log(trans['medium']);
我希望它对某人有用。
我正在寻找一些东西来使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 扩展,但它可以很好地工作,而无需复制您的翻译资源。