我有一个德国站点,希望它使用Laravel(本地化?)将其翻译成英语。 每种语言都有不同的链接,因此不必获取其语言环境。
我已经阅读了文档和许多文章,但是仍然不确定如何做到这一点。
我需要什么:
我只有两种语言,德语(主要)和英语(第二)
我在网址中需要参数en
和de
,但是我还没有找到执行此操作的教程
我认为我必须使用翻译字符串作为键,因为只有两种语言才有意义,因此我需要一个json文件
所以我的问题:
我想翻译成英文,但是en
文件夹中已经有一个lang
文件夹,那么我该怎么办?只需将en.json
文件放在其中?
是否需要使用中间件?还是有另一种白痴安全的方法可以为经验很少的人实现这一目标?
如何在URL中设置和获取语言参数并根据其翻译网站?
即使我有大约3条不同的路线/站点,我也只需要翻译一个en
文件吗?
答案 0 :(得分:2)
您已经拥有本地化的结构/功能,这在Laravel中非常简单:
在文件夹
resources/lang
您需要一个像
这样的按语言的文件夹resources/lang/en -> English
resources/lang/de -> German/Deutsch
在每个语言包中,您都会创建一个刀片,例如应用翻译:
app.blade.php
您将具有以下结构:
resources/lang/en/app.blade.php -> English
resources/lang/de/app.blade.php -> German/Deutsch
您放置在哪里
<?php
return [
/*
|--------------------------------------------------------------------------
| Application Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are used by the app library to build
| the simple pagination links. You are free to change them to anything
| you want to customize your views to better match your application.
|
*/
'greets' => 'Welcome',
];
在您输入的德语app.blade.php中:
<?php
return [
/*
|--------------------------------------------------------------------------
| Application Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are used by the app library to build
| the simple pagination links. You are free to change them to anything
| you want to customize your views to better match your application.
|
*/
'greets' => 'Wilkommen',
];
然后您可以使用
在刀片中调用它@lang('app.greets')
在config/app.php
的语言环境常量中设置了默认语言,您可以在其中创建逻辑以使用App::setLocale('de');
进行切换,以查看使用的语言环境仅在使用App::getLocale();
答案 1 :(得分:0)
我向您展示了一种用于根据LARAVEL 5.8中的需要翻译几种语言的网站的方法
在此示例中,单击一个标志即可翻译(符合SEO)我的路线,并且文本也会同时翻译。
您可以同时使用两种方法,一种用于短字符串,另一种用于长字符串(https://laravel.com/docs/5.8/localization#defining-translation-strings)。 首先,您得到以下文件夹:
resources/lang
1)对于使用短键的短字符串:
resources/lang/de/messages.php
resources/lang/en/messages.php
您会收到php文件消息,例如其中之一为英语:
<?php
// resources/lang/en/messages.php
return [
'Willkommen' => 'Welcome',
'kontakt' => 'contact',
'Aktuelles' => 'News',
];
2)对于长字符串,使用翻译字符串作为键:
resources/lang/de.json
resources/lang/en.json
您将获得json文件,例如其中之一,德语到英语(en.json):
{
"Ich akzeptiere die Bedingungen der Datenschutzerklärung.": "I accept the terms and conditions of the privacy policy.",
"Das Album wurde gut aufgenommen.": "The album has been saved",
}
3)您可以同时使用两种方法进入不同的刀片视图文件:
echo __('messages.Willkommen');
echo __('Ich akzeptiere die Bedingungen der Datenschutzerklärung.');
or with the blade helpers:
{{ __('messages.Willkommen') }}
@lang('messages.Willkommen'')
4)对于路由,您可以翻译符合SEO的网址,例如:
https://website.com/de/aktuelles/
https://website.com/en/news/
您必须为该路线创建两个文件:
resources/lang/de/routes.php
resources/lang/en/routes.php
您将获得文件路由,例如其中一个到英语:
<?php
// resources/lang/en/routes.php
return [
'willkommen' => 'welcome',
'aktuelles' => 'news',
];
5)使用标志切换路由,您必须将config / app.php与以下参数配合使用:
<?php
// config/app.php
'locales' => ['de', 'en'],
'fallback_locale' => 'de',
要获取语言切换器,您必须将此代码添加到布局刀片中,例如:
@foreach(config('app.locales') as $locale)
@if($locale != session('locale'))
<a class="btn btn-sm" href="{{ route('language', $locale) }}">
<img alt="{{ $locale }}" title="{{ $locale }}"
src="{!! asset('images/flags/' . $locale . '.png') !!}"/>
</a>
@endif
@endforeach
6)为切换标记动作“语言”添加路由。
在route / web.php中命名其他路由:
'locale.name'
始终使用德语(您的主要语言)保留名称。
您将获得德语名称和英语名称:
'de.aktuelles'
'en.aktuelles'
<?php
// routes/web.php
Route::name('language')->get('/{lang}', 'YourController@language');
foreach(['de', 'en'] as $locale) {
Route::prefix($locale)->group(function() use ($locale) {
Route::get(trans('routes.aktuelles', array(), $locale), function() {
return view('aktuelles', ['name'=>'aktuelles', 'localName' => trans('routes.aktuelles', array(), session('locale'))]);//trans('routes.aktuelles');
})->name($locale.'.'.'aktuelles');
});
}
您可以为网站主页添加默认路由,如下所示:
Route::get('/', function () {
return redirect('/de/willkommen');
});
7)现在,您必须添加一个中间件,以验证会话中是否注册了语言环境:
<?php
app/Http/Middleware/Locale.php
public function handle($request, Closure $next)
{
if (!session ()->has ('locale')) {
session (['locale' => $request->getPreferredLanguage (config ('app.locales'))]);
}
$locale = session ('locale');
app ()->setLocale ($locale);
setlocale (LC_TIME, app()->environment('local') ? $locale : config('locale.languages')[$locale][1]);
return $next ($request);
}
您将此中间件类添加到app / Http / Kernel.php中:
protected $middlewareGroups = [
'web' => [
...,
\App\Http\Middleware\Locale::class,
],
...
];
8)您还需要一个控制器来执行“语言”操作(切换语言):
要做到这一点,我需要获得以前的路由名称,以添加新的语言环境以重定向到正确的路由。 我使用了出色的技巧here来做到这一点!
<?php
// app/Http/Controllers/YourController.php
public function language(String $locale, Request $request)
{
// Previous route name Visit
$oneRoute = app('router')->getRoutes()->match(app('request')->create(url()->previous()))->getName();
// Replacing the locale in the road name
$nextRoute = substr_replace($oneRoute, $locale, 0, 2);
$locale = in_array ($locale, config ('app.locales')) ? $locale : config ('app.fallback_locale');
session (['locale' => $locale]);
return redirect()->route($nextRoute);
}
9)也许您还想翻译路线。因此,在您的刀片视图中:
{{-- ie for one item --}}
<li class="nav-item">
<a class="nav-link" href="{{ route(session('locale') .'.aktuelles') }}">{{ __('messages.Aktuelles') }}</a>
</li>
10)最后,我还没有解决您想从德语URL中删除粒子“ de”的事实,例如:
yourwebsite.com/aktuelles
代替
yourwebsite.com/de/aktuelles
...