如何使用Laravel(本地化?)将德语翻译成英语

时间:2019-04-23 11:54:47

标签: php laravel translation multilingual

我有一个德国站点,希望它使用Laravel(本地化?)将其翻译成英语。 每种语言都有不同的链接,因此不必获取其语言环境。

我已经阅读了文档和许多文章,但是仍然不确定如何做到这一点。

我需要什么:

  • 我只有两种语言,德语(主要)和英语(第二)

  • 我在网址中需要参数ende,但是我还没有找到执行此操作的教程

  • 我认为我必须使用翻译字符串作为键,因为只有两种语言才有意义,因此我需要一个json文件

所以我的问题:

  1. 我想翻译成英文,但是en文件夹中已经有一个lang文件夹,那么我该怎么办?只需将en.json文件放在其中?

  2. 是否需要使用中间件?还是有另一种白痴安全的方法可以为经验很少的人实现这一目标?

  3. 如何在URL中设置和获取语言参数并根据其翻译网站?

  4. 即使我有大约3条不同的路线/站点,我也只需要翻译一个en文件吗?

2 个答案:

答案 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

...