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

How to translate german into english using Laravel (Localization?)

我有一个德文站点,希望它用 Laravel(本地化?)将其翻译成英文。 每种语言会有不同的链接,所以没有必要获取他们的语言环境。

我已经通读了文档和许多文章,但仍然不确定如何执行此操作。

我需要的:

所以我的问题是:

  1. 我想翻译成英文,但是lang文件夹里已经有en文件夹了,怎么办?把 en.json 文件放在那里?

  2. 有必要使用中间件吗?或者对于经验非常少的人来说,是否有另一种白痴安全的方法来实现这一目标?

  3. 如何设置和获取 url 中的语言参数并根据它翻译网站?

  4. 即使我有大约 3 个不同的 routes/sites,我是否只需要一个 en 文件来翻译?

你已经在 Laravel 中实现了本地化 structure/functionality 超级简单:

在文件夹中

resources/lang

你需要像

这样的每语言文件夹
resources/lang/en -> English
resources/lang/de -> German/Deutsch

在每个 lang forlder 中创建一个 blade 例如应用程序翻译:

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',
    ];

然后你可以在 blade 中用

调用它
@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) 进入你不同的 blade views 文件你可以使用两种方法:

echo __('messages.Willkommen');
echo __('Ich akzeptiere die Bedingungen der Datenschutzerklärung.');

or with the blade helpers:

{{ __('messages.Willkommen') }}
@lang('messages.Willkommen'')

4) 路由可以根据SEO翻译url 例如:

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',

要获得语言切换器,您必须将此代码添加到布局中 blade 例如:

@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) 为切换标志动作添加路由'language'.

在routes/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) 现在您必须添加一个中间件 来验证区域设置是否已在 session:

中注册
<?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 中添加此中间件 class。php:

protected $middlewareGroups = [
    'web' => [
        ...,
        \App\Http\Middleware\Locale::class,
    ],
    ...
];

8) 'language' 动作(切换语言)还需要控制器:

为此,我需要获取以前的路由名称以添加新的语言环境以重定向到正确的路由。 我使用了一个很好的技巧 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) 除了路线之外,您可能还想翻译菜单项。所以在您的 blade 视图中:

{{-- 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

...