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