【发布时间】: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