wal*_*lid 7 php localization laravel
我在尝试使用新设置的区域设置为我的路线添加前缀时遇到了问题。当我从控制器或路由闭包返回 app()->getLocale() 时,它会正确返回新设置的区域设置,但是当我将其放入路由前缀时,我会得到默认的“en”。就我而言,新的语言环境是“ar”。
这是我在 web.php 中的代码
<?php
//Request to put the choosen locale into the session
Route::get('locale/{locale}', function($locale) {
session()->put('userLocale', $locale);
return redirect(app()->getLocale());
});
//Group of routes that are supposed to be prefixed with new set locale 'ar'
Route::group(['prefix' => app()->getLocale(), 'middleware' => 'locale'], function() {
Route::get('/', function() {
return app()->getLocale();
});
});
Run Code Online (Sandbox Code Playgroud)
这是中间件:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Foundation\Application;
use Illuminate\Http\Request;
class Locale
{
protected $app;
public function __construct(Application $app)
{
$this->app = $app;
}
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$this->app->setLocale(session('userLocale'));
return $next($request);
}
}
Run Code Online (Sandbox Code Playgroud)
注意路由前缀中的“app()->getLocale()”语句,该语句的值始终为“en”。但是当我从闭包中返回它时,它会打印新设置的区域设置“ar”。
我想说的是,在 prefix 内部,app()->getLocale() 的值始终是“en”,但在 Closure 内部它的值是“ar”。
因此,当我在浏览器中运行“localehost:8000 / locale / ar”时,输出是“ar”,这是正确的,但网址变为“localehost:8000 / en”,而应该是“localehost:8000 / ar”不是'它 ?当我在浏览器中运行“localehost:8000/ar”时,我得到一个 404 页面。
我尝试从RouteServiceProvider 的 mapWebRoutes 方法中设置前缀中设置前缀,但它不起作用,因为我认为服务提供程序在中间件之前执行,因此它无法识别中间件设置的新语言环境。
我希望获得帮助或其他方法来为路由添加新的语言环境前缀,因为也许我做错了。
在中间件运行之前,不会从会话中设置您的区域设置。您的路由必须在中间件运行之前定义,否则系统将不知道哪个中间件应该在哪些路由上运行。
由于 app()->locale() 将在中间件运行之前返回“en”,因此您的代码所做的就是定义“en”前缀。
看来您可能想为区域设置定义一个变量,在这种情况下,您会执行以下操作:
Route::group(['prefix' => '{locale}', 'middleware' => 'locale'], function() {
...
});
Run Code Online (Sandbox Code Playgroud)
或者您可以使用一个为您处理本地化网址的包,例如https://github.com/mcamara/laravel-localization
| 归档时间: |
|
| 查看次数: |
25176 次 |
| 最近记录: |