【发布时间】:2017-12-09 03:22:22
【问题描述】:
我正在使用 slim 和 Laravel 的照明/翻译。我对这一切都很陌生,我找到了翻译页面的解决方案,但是当我尝试在运行期间将另一个翻译器实例(以更改页面的翻译)传递给容器时遇到问题是时候改变翻译了。 这就是我正在做的事情: 我有一个这样的 Twig 导航栏:
<li><a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">lang<span class="caret"></span> </a>
<ul class="dropdown-menu">
<li><a href="{{path_for('en')}}" >english</a> </li>
<li><a href="{{path_for('fr')}}">french</a> </li>
</ul>
</li>
还有一个语言控制器,我在其中将翻译器的新实例设置为容器:
public function getFrench($request, $response){
$loader = new FileLoader(new Filesystem(), __DIR__ . '/../resources/lang' );
// Register the french translator (set to "en" for English)
$translator = new Translator($loader, "fr");
$this->translator=$translator;
}
这就是我的容器的设置方式:
$container['translator']= function($container){
$loader = new FileLoader(new Filesystem(), __DIR__ . '/../resources/lang' );
// Register the french translator (set to "en" for English)
$translator = new Translator($loader, "en");
return $translator;
};
**我要添加翻译扩展的视图**:
$container['view']= function($container){
$view= new \Slim\Views\Twig(__DIR__ .'/../resources/views',['cache'=> false,]);
// add translator functions to Twig
$view->addExtension(new TranslatorExtension($container->get('translator')));
return $view;
};
我不知道这是否是错误的方式,因为无论我做什么我都无法在运行时更改翻译,我总是得到我在容器中设置的翻译(在这种情况下是英文),我应该使用全局变量而不是控制器方式?我该怎么办?
【问题讨论】:
-
你应该为此实现一个中间件。在此中间件中,您检测语言(通过标头接受语言或路由或会话)并将语言设置到翻译器对象中。
-
你是怎么做到的呢?我了解中间件的机制,但是您如何将视图(在我的情况下为树枝)的输出与不同的翻译相关联?考虑到您必须将 TranslatorExtension 添加到视图中,同时将翻译器实例添加到容器中。
-
什么应该触发翻译开关?我的意思是,您想在运行时的哪个时间点更改它?
标签: php laravel twig translation slim