我有一个德语网站,希望用Laravel(Localization?)将其翻译成英文。每种语言都有不同的链接,因此没有必要获得他们的语言环境。
我已经阅读了文档和许多文章,但仍不确定如何做到这一点。
我需要的:
en
和de
,但我还没有找到这样做的教程所以我的问题:
en
文件夹中已经有一个lang
文件夹,所以我该怎么做?把en.json
文件放在那里?en
文件来翻译吗?您已经拥有了Laravel中非常容易的Localization的结构/功能:
在文件夹中
resources/lang
你需要有一个像lang一样的文件夹
resources/lang/en -> English
resources/lang/de -> German/Deutsch
在每个lang文件夹中,您可以创建一个刀片,例如应用程序翻译:
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();
我向您展示了一种方法,用于在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)为切换标志动作“语言”添加路由。
在routes / web.php中命名其他路由:
'locale.那么
保持名称始终使用德语(您的主要语言)。
你得到德国名字和英文名字:
'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)最后,我还没有解决这样一个事实:你想从你的德国网址中删除粒子“de”,例如:
有人website.com/阿K兔Elle是
代替
有人website.com/的/阿K兔Elle是
...