【问题标题】:Laravel 8 multilanguage routes and how get the translated link of the same pageLaravel 8 多语言路由以及如何获取同一页面的翻译链接
【发布时间】:2022-01-18 01:58:33
【问题描述】:

我正在尝试以多语言方式制作我的测试应用程序。

这个问题有两个相关的问题:

第一个问题:

我遵循How to create multilingual translated routes in Laravel 中的第二个答案,这有助于我拥有一个多语言网站和缓存的路线,但我有一个问题和一些误解。

AppServiceProver.php 中覆盖应用程序配置是一个很好的做法,这样做:

Config::set('app.locale_prefix', Request::segment(1));

在任何情况下使用 Session::locale 不是更好吗?

第二个问题:

就我而言,我有两种语言,在导航栏中,当语言环境为原始语言时,我只想打印 ENG,而当会话语言环境为英语时,我想打印 ITA。

如果我在意大利语页面,导航栏中的 ENG 链接应该指向同一个英文翻译页面。

使用另一个问题中使用的方法,我遇到了很多问题:

Config::set('app.locale_prefix', Request::segment(1));

我们覆盖了配置文件local_prefix中的变量,每次我切换到英语时locale_prefix都会变成'eng',这听起来很奇怪,我做的另一件事是:

   if ( $lang && in_array($lang, config('app.alt_langs')) ){
       return app('url')->route($lang . '_' . $name, $parameters, $absolute);
   }

我们使用仅定义替代语言的 alt_langs,如果我传递本地语言,这是一个问题,在我的情况下是 'it',如 lang 参数,这将找不到原因,从描述中, alt_lang 不应包含区域设置语言,您将只能获得翻译后的字符串。

如果我改变:

   if ( $lang && in_array($lang, config('app.alt_langs')) ){
       return app('url')->route($lang . '_' . $name, $parameters, $absolute);
   }

在:

   if ( $lang && in_array($lang, config('app.all_langs')) ){
       return app('url')->route($lang . '_' . $name, $parameters, $absolute);
   }

现在使用app.all_langs,我可以选择你想要的网址和我想要的语言。

如何获得翻译后的网址?

在刀片文件中,我需要获取页面的翻译 URL,如果阅读其他问题,我们使用 $prefix 缓存路由并给路由一个新名称 ->name($prefix.'_home'); 这样我可以缓存所有路由,我可以使用不带前缀{{ route('name') }} 的刀片调用路由,但是,需要实际页面的翻译 url 将其放在视图顶部:

@php
     $ThisRoute = Route::currentRouteName();
    
     $result = substr($ThisRoute, 0, 2);
     if ($result =='it' ){
        $routeName = str_replace('it_', '', $ThisRoute);
        $url = route($routeName,[],true,'en');
     } else {
        $routeName = str_replace('en_', '', $ThisRoute);
        $url = route($routeName,[],true,'it');
    }
@endphp

这样做我得到了应该是 it_home 的实际路由名称我检查是否以 it_ 或 en_ 开头,我删除了 it_ 或 en_ 前缀,我得到了翻译后的 URL,现在你可以使用 $url 作为<a href="{{ $url" }}>text</a> 原因如果我调用 {{ route('page') }} 我会得到链接,使用语言环境。

这个代码不是很好,我知道,但是我写了5分钟,需要更多的实现,并检查,但目前只是为了玩Laravel。

这是个好方法??我怎样才能做得更好(刀片链接检索除外)?我发现许多解决方案都使用了中间件,但我想避免导航栏中的链接,例如 mysite.com/changelang?lang=en

重写 app.locale_prefix 是一种好方法吗?

【问题讨论】:

    标签: laravel


    【解决方案1】:

    首先

    根据您的问题,将首选项保存到 .envsession 是一种不好的做法,因为一旦会话完成,保存的语言将被删除,当您需要存储与您的网站,例如(ColorFontLanguage、...等),您必须将它们中的任何一个存储到缓存中。

    第二

    老实说,您的代码是一种非常奇怪且不常见的方式,有两种方法可以处理您需要的内容

    第一

    有一个非常有用且很棒的软件包,名为 mcamara,它会帮助你太多(我推荐这个解决方案)。

    第二

    您可以使用位于 resource 文件夹中的 lang 文件夹从头开始执行此操作,并且您必须创建具有相同数量的所需语言的文件,然后使用您将在这些文件中定义的键进入视图和您可以使用所选语言为您的路线添加前缀,您可以使用 group 方法,如下所示

    Route::group(['prefix' => 'selected_lang'], function() {
        Route::get('first_route', [Controller::class, 'your_method']);
    });
    

    或者您可以将所选语言添加为查询字符串,例如localhost:8000/your_route?lang=en,您可以关注此tutorial 了解更多信息。

    【讨论】:

    • 最后一个带参数的方法对seo不好。我会看看 mcamara 包!
    • 我正在尝试使用该软件包,非常好,正在使用中间件做我正在做的事情
    • 不幸的是,这个包不适用于 laravel 8 :(
    • 你肯定不知道怎么用的,所以你可以看看这个包用到的项目github.com/mahmoudmohamedramadan/eCommerce/blob/master/routes/…
    • 我遇到了很多问题,其中之一就是路由缓存。如果我通过 mcamara cache 命令缓存路由,如果我访问已转换的页面,我会得到 404 错误,如果我清理缓存一切正常......
    猜你喜欢
    • 1970-01-01
    • 2011-12-22
    • 2017-04-21
    • 2014-09-24
    • 1970-01-01
    • 2016-10-27
    • 2013-09-13
    相关资源
    最近更新 更多