如何替换 slim 框架中的翻译器实例?
How to replace translator instance in slim framework?
我正在使用 slim 和 Laravel 的 illuminate/Translation。我是这一切的新手,我找到了一个翻译我的页面的解决方案,但是当我试图在 运行 是时候改翻译了。
这是我在做什么:
我有一个像这样的 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;
};
**我要添加 translationExtension 的视图 **:
$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;
};
我不知道这样做是否错误,因为无论我做什么我都无法在 运行 时间内更改翻译,我总是得到我在容器内设置的翻译(在这种情况是英语),我应该使用全局变量而不是控制器方式吗?我该怎么做?
你可以use the Accept-Language
-header to detect which language a user want to see。您可以在中间件中执行此操作。
首先你应该从容器中移除 extension-adding
$container['view']= function($container){
$view= new \Slim\Views\Twig(__DIR__ .'/../resources/views',['cache'=> false,]);
return $view;
};
然后通过中间件添加扩展,解析后的语言形式为 header:
$container = $app->getContainer();
$app->add(function (\Slim\Http\Request $request, $response, $next) use ($container) {
$lang = $request->getHeader('Accept-Language');
// $lang could be something like 'de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7'
// see above link for more information about parsing it
$parsedLang = parseLang($lang);
$loader = new FileLoader(new Filesystem(), __DIR__ . '/../resources/lang' );
$translator = new Translator($loader, $parsedLang);
// add the extension to twig
$view = $container->get('view');
$view->addExtension(new TranslatorExtension($translator));
// execute the other middleware and the actual route
return $next($request, $response);
});
我正在使用 slim 和 Laravel 的 illuminate/Translation。我是这一切的新手,我找到了一个翻译我的页面的解决方案,但是当我试图在 运行 是时候改翻译了。 这是我在做什么: 我有一个像这样的 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;
};
**我要添加 translationExtension 的视图 **:
$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;
};
我不知道这样做是否错误,因为无论我做什么我都无法在 运行 时间内更改翻译,我总是得到我在容器内设置的翻译(在这种情况是英语),我应该使用全局变量而不是控制器方式吗?我该怎么做?
你可以use the Accept-Language
-header to detect which language a user want to see。您可以在中间件中执行此操作。
首先你应该从容器中移除 extension-adding
$container['view']= function($container){
$view= new \Slim\Views\Twig(__DIR__ .'/../resources/views',['cache'=> false,]);
return $view;
};
然后通过中间件添加扩展,解析后的语言形式为 header:
$container = $app->getContainer();
$app->add(function (\Slim\Http\Request $request, $response, $next) use ($container) {
$lang = $request->getHeader('Accept-Language');
// $lang could be something like 'de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7'
// see above link for more information about parsing it
$parsedLang = parseLang($lang);
$loader = new FileLoader(new Filesystem(), __DIR__ . '/../resources/lang' );
$translator = new Translator($loader, $parsedLang);
// add the extension to twig
$view = $container->get('view');
$view->addExtension(new TranslatorExtension($translator));
// execute the other middleware and the actual route
return $next($request, $response);
});