当前位置: 首页 > 知识库问答 >
问题:

如何在Laravel 8中设置没有前缀的默认语言环境

苏高峰
2023-03-14

我写一个多语言应用程序。我不想为默认语言使用区域设置前缀,所以例如,我的URL结构应该是这样的:

https://example.com/about-us
https://example.com/contant
https://example.com/es/about-us
https://example.com/es/contant
https://example.com/de/about-us
https://example.com/de/contant

我使用Route::grouplocale前缀对我的路线进行分组:

Route::group([
    'prefix' => '{locale}',
    'where' => ['locale' => '[a-z]{2}'],
    'middleware' => 'setlocale'
], function () {
    Route::get('/{page}', [PageController::class, 'show'])->name('page');
});

在我的中间件setlocale中,我设置了URL的区域设置和前缀:

    public function handle(Request $request, Closure $next)
    {
        if (in_array($request->segment(1), ['es', 'de'])) {
            URL::defaults(['locale' => $request->segment(1)]);
            app()->setLocale($request->segment(1));
        } else {
            URL::defaults(['locale' => 'en']);
            app()->setLocale('en');
        }
        return $next($request);
    }

然后我的控制器打印数据:

class PageController extends Controller
{
    public function show($lang, Page $page)
    {
        dd($page);
    }
}

这对于dees前缀很有效,但对于英语lang,没有前缀也不行。我试图复制Route::get('/{page}',[PageController::class',show'])-

函数的参数太少App\Http\Controller\PageController::show(),1传入 /Users/mati/Sites/laravel-app/vendor/laravel/framework/src/Illuminate/Routing/Controller.php在第54行,正好2预期


共有2个答案

阎祖鹤
2023-03-14

这个完整的解决方案:

https://example.com/
https://example.com/contact
https://example.com/en/
https://example.com/en/contact

文件'路线/web.php'

if(!function_exists('parseLocale')) {
    function parseLocale()
    {
        $locale = request()->segment(1);
        if (in_array($locale, ['js', 'css'])) // for speed up :)
            return $locale;
        if (array_key_exists($locale, config('languages'))) {
            app()->setLocale($locale);
            return $locale;
        }
        app()->setLocale('es');  // this default locale
        return '/';
    }
}

/** Here route */
Route::prefix(parseLocale())->group(function () {

Route::get('/', [App\Http\Controllers\PropertiesController::class, 'home']);
Route::get('/contact', function () {
        return view('contact');
    });

});

配置languages.php

<?php

return [
    'en' => [
        'display' => 'English',
    ],
    'es' => [
        'display' => 'Español',
    ],
];

文件*。刀身php

<a href="{{ $init['lang'] }}">Home</a>
<a href="{{ $init['lang'] }}contact">Contact</a>

文件应用程序/供应商/AppServiceProvider.php

public function boot()
    {
        View::composer('*', function ($view) {
                $view->with('init', $this->loadTranslate());
        });
    }

 private function loadTranslate()
    {
$locale = app()->getLocale();
        if ($locale == 'es') $lang = '';
        else $lang = $locale . '/';

return [
            'lang' => '/' . $lang,
        ];
    }
卫甫
2023-03-14

你可以这样做。

检查第一个slug是否为语言前缀,并且不是默认语言,然后像前缀一样使用它,否则不使用任何内容(null)。

Route::prefix(parseLocale())->group(function () {
     Route::get('/{page}', [PageController::class, 'show'])->name('page');
}

function parseLocale(){
    $locale = request()->segment(1);
    $locales = config('translatable.locales');
    $default = config('app.fallback_locale');

    if ($locale !== $default && in_array($locale, $locales)) {
        app()->setLocale($locale);
        return $locale;
    }
}

在这个例子中config('translatable.locales')是区域设置的数组。

然后从控制器中删除无用的$lang参数:

class PageController extends Controller
{
    public function show(Page $page)
    {
        dd($page);
    }
}
 类似资料:
  • 问题内容: 我有一个要移植到Django 1.4的现有多语言Django应用程序。I18n支持目前基于一些丑陋的技巧,我想使其使用Django的内置i18n模块。 一个约束是我不想更改已经存在的URL。这个网站已经活跃了一段时间,并且有一些我不想破坏或重定向的外部链接。url方案的工作原理如下:英语内容位于网站的根目录,而其他语言则在域名中使用前缀: 英文网址: 西班牙语网址: 我已经将翻译后的页

  • 问题内容: 我想将我的JVM的默认语言环境设置为。有哪些可能的选择呢? 我只知道一种选择 问题答案: 从Oracle参考: 应用程序的默认语言环境是通过三种方式确定的。首先,除非你已显式更改默认值,否则该 方法将返回Java虚拟机(JVM)首次加载时最初确定的语言环境。也就是说,JVM从主机环境中确定默认语言环境。主机环境的语言环境由主机操作系统和在该系统上建立的用户首选项确定。 其次,一些Jav

  • 如何在Spring Boot中设置默认环境? 我放入了<code>application.properties</code>: 和用户变量: 因此,当我在我的合成中开发时,我的环境是开发,但是当我生成我的并在tomcat中部署时,他仍然使用带有环境的(我在另一个没有其他conv的情况下部署) 我如何设置我的默认环境(如果他在用户变量或命令行中找不到任何使用产品)?

  • 问题内容: 我有一个大型的Swift项目,从技术上讲是一个混合项目,因为它包含少量的Objective- C代码。但是,每当我进入LLDB时,表达式评估器都期望使用Objective-C语法。我可以将Swift与一起使用,但这每次都很难输入。 我可以将LLDB表达式评估器默认为Swift吗? 问题答案: 有一个目标级别设置可以强制使用该语言: 或者,您可以为特定的快速表达式创建别名:

  • 问题内容: 我正在寻找一组命令行参数,这些参数将允许我为Java应用程序强制设置一组特定的语言环境设置。 假设我无法修改应用程序,因此必须使用设置属性。 我正在特别想更改日期/时间格式,使其符合ISO-8601(军用时间),但是我无法为此找到合适的属性。 问题答案: 很好,我对同一件事也很感兴趣,但到目前为止,我只有 部分解决方案 : 您可以使用加拿大,因为加拿大是使用ISO 8601格式的国家之

  • 问题内容: 我刚刚安装了jre7,很惊讶地看到我的默认语言环境现在是en_US。对于jre6,它是de_CH。 jre7有什么不同?默认语言环境不再是操作系统之一吗?(顺便说一句,我正在使用Windows7) 谢谢你的回答。 编辑:我已经看到了 Category.FORMAT 的语言环境是“旧”的(de_CH)。区域设置为 Category.DISPLAY 从OS的语言的语言(在Windows中,