我想使用Twig模板系统来模拟我的电子邮件.电子邮件的区域设置应基于用户设置,而不是基于会话或请求区域设置.在渲染Twig模板时如何强制语言环境?
该手册确实提到了如何强制翻译器的语言环境.但我想将此区域设置传递给render()方法,以便在此区域设置中呈现树枝模板内的翻译.
这是使用不同的成模板,因为我觉得这迫使在特定的语言环境的模板中的转换.
所以,以Symfony为例,我正在寻找这样的东西:
public function indexAction($name)
{
$message = \Swift_Message::newInstance()
->setSubject('Hello Email')
->setFrom('send@example.com')
->setTo('recipient@example.com')
->setBody(
$this->renderView(
'HelloBundle:Hello:email.txt.twig',
array('name' => $name),
'nl_NL' // <-- This would be nice!
)
)
;
$this->get('mailer')->send($message);
return $this->render(...);
}
Run Code Online (Sandbox Code Playgroud) 在Symfony/Twig中,我可以通过在翻译块中使用百分比来使用标记.例如:
Hello {{nickname}}
Run Code Online (Sandbox Code Playgroud)
会成为
{% trans %}Hello %nickname%{% endtrans %}
Run Code Online (Sandbox Code Playgroud)
这按预期工作.我传递给Twig的占位符数组会自动映射到%placeHolder%.不需要额外的工作.所以这适用于来自控制器的我的PHP数组:
Array('nickname' => 'rolandow')
Run Code Online (Sandbox Code Playgroud)
当我想在翻译块中使用昵称时,我所要做的就是用百分比%来包围它.不幸的是,当我传递给它时,这似乎不起作用trans.
现在我想使用标签翻译整个文本块.我无法弄清楚如何在翻译中使用这些标签.所以,我的树枝看起来像这样:
{{ say.hello|trans }}
Run Code Online (Sandbox Code Playgroud)
和我的翻译片段
<trans-unit id="1">
<source>say.hello</source>
<target>Hello %nickName%, how are you doing today? lots-of-text-here</target>
</trans-unit>
Run Code Online (Sandbox Code Playgroud)
我通过在我的模板中使用它来实现它,但感觉就像做两次.我现在需要将占位符数组再次放入trans函数中.例如:
{{ say.hello|trans('%nickName%' : nickName) }}
Run Code Online (Sandbox Code Playgroud)
如果我想在控制器中使用给予twig的其他标签,我也需要将它们传递给翻译器.我不能以某种方式通过完整的阵列吗?
我想避免git自动合并我的composer.json.这样我可以在开发分支中使用composer.json,该分支使用dev-develop包,而master中的那个只使用dev-master包.
我可以使用这里建议的两个composer.json文件,但我担心我最终会忘记在我的composer.json中为master添加一个bundle.特别是在自动化任务时,这可能最终导致灾难.
所以实际上我想要git:
我创建了一个控制器,该控制器根据加密的GET参数手动设置安全令牌。我用它来创建一个远程登录URL,当用户点击此链接时,它将执行登录。
现在,我想添加语言环境的设置。提供Lang参数时,应设置区域设置。我将此添加到我的控制器:
$lang = strtolower($lang);
$this->getRequest()->getSession()->set('_locale', $lang);
$this->getRequest()->setLocale($lang);
$this->container->get('translator')->setLocale($lang);
Run Code Online (Sandbox Code Playgroud)
根据开发栏,将_locale变量设置为该设置。语言文件虽然未加载,但已恢复为默认语言。
我读过有关创建一个侦听器以实现此目的的信息,但在我看来,当您想在URL中提供语言时,这很有用。我不想将其添加到我的路由中,我只想在创建会话时设置语言环境。
更新:
我去了Symfony提供的“ 模拟旧行为 ”解决方案。设置请求语言环境似乎不起作用。当我在Twig模板中回显此值时,值不相等:req lang: {{ app.request.locale }} session: {{ app.session.get('_locale') }}。虽然如下所示,但LocaleListener仍在工作,我通过插入进行了检查die(),并且还设置了Translator服务的语言环境似乎正常。
因此,通过设置翻译器的语言环境,我可以完成此工作。我不明白为什么。翻译服务不应该使用请求区域设置吗?为什么需要手动设置?
除翻译外,Request对象中的语言环境是否还包含其他内容?
<?php
namespace Mb\MyBundle\Listener;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class LocaleListener implements EventSubscriberInterface
{
private $translator;
public function __construct($translator) {
$this->translator = $translator;
}
public function onKernelRequest(GetResponseEvent $event)
{
$request = $event->getRequest();
if (!$request->hasPreviousSession()) {
return;
}
if (strlen( $request->getSession()->get('_locale') )) {
$request->setLocale($request->getSession()->get('_locale'));
$this->translator->setLocale($request->getSession()->get('_locale'));
}
}
static public function …Run Code Online (Sandbox Code Playgroud) 对于我的一些捆绑包,我将psr-0自动加载更改为psr-4.现在,当我尝试使用app/console命令生成实体时,它给了我
找不到"MbDbFooBundle"的基本路径(路径:"/ home/roland/projects/rolandtest/mbmbisbundle/Symfony/vendor/mb/mb-db-foo-bundle",destination:"/ home/roland/projects/rolandtest/mbmbisbundle/Symfony的/供应商/ MB/MB-DB-FOO束").
起初我认为生成的自动加载器会出现问题.但是当我对我的项目进行新的克隆,然后运行composer update来完成供应商时,它仍然会给我这个错误.
在我的 angular 项目中,我有一个包含类型和状态字段的对象。状态可能因类型而异。有人可能会说这是糟糕的设计,但目前就是这样。关键是我似乎不能在这个对象上使用扩展运算符,因为编译器说Property 'getStatusList' is missing in type ...
我简化了课程,但它看起来像这样:
export class Foo {
constructor(
public type: number,
public status: number
) { }
getStatusList(): string[] {
switch (this.type) {
case 3: {
return ['Off', 'Interval', 'On Hold']
}
default: {
return ['Off', 'On']
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是使用 typescript 2.9.2 和 angular cli 6.1.1
下面的代码会触发错误,但是在 typescript playground 中编写示例代码时,我想也许我应该使用 Object.assign。虽然我仍然认为我可以使用扩展运算符简单地否决对象的某些属性?
const oldFoo: Foo = new Foo(3, 5);
console.log('old status: ', oldFoo.status);
const newFoo: Foo = { ...oldFoo, type: 1, …Run Code Online (Sandbox Code Playgroud) symfony ×4
php ×2
twig ×2
angular ×1
composer-php ×1
doctrine ×1
git ×1
psr-0 ×1
psr-4 ×1
typescript ×1