Как перевести немецкий на английский с помощью Laravel (Локализация?) - PullRequest
1 голос
/ 23 апреля 2019

У меня есть немецкий сайт, и я хочу, чтобы он перевел его на английский с помощью Laravel (Локализация?).Для каждого языка будут разные ссылки, поэтому указывать их локаль не обязательно.

Я прочитал документы и многие статьи, но все еще не уверен, как это сделать.

Что мне нужно:

  • У меня есть только два языка, немецкий (основной) и английский (второй)

  • Мне нужны параметры en и de в URL, но я не нашел учебника, делающего это

  • Я думаю, что мне нужно использовать строки перевода в качестве ключей, так как это имеет смысл только с двумяязыки, поэтому мне нужен файл json

Итак, мои вопросы:

  1. Я хочу перевести на английский, но уже есть en в папке lang, так что мне делать?Просто поместите туда файл en.json?

  2. Необходимо ли использовать промежуточное ПО?Или есть другой, безопасный для идиота способ добиться этого для кого-то с очень небольшим опытом?

  3. Как я могу установить и получить языковой параметр в URL и перевестисайт на его основе?

  4. Нужен ли мне только один en -файл для перевода, даже если у меня есть около 3 разных маршрутов / сайтов?

Ответы [ 2 ]

2 голосов
/ 23 апреля 2019

У вас уже есть структура / функциональность локализации, которая в Laravel очень проста:

В папке

resources/lang

вам нужна папка для каждого языка, как

resources/lang/en -> English
resources/lang/de -> German/Deutsch

в каждом lang forlder вы создаете блейд, например перевод приложения:

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();

0 голосов
/ 25 мая 2019

Я показываю вам метод, который я использовал для перевода веб-сайта на несколько языков с вашими потребностями в 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) Для маршрута вы можете перевести URL , соответствующий 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) Добавление маршрута для действия переключения флага 'language'.

Имена других маршрутов в маршрутах / 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);
}

Вы добавляете этот промежуточный класс в приложение / Http / Kernel.php:

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

8) Вам также необходим контроллер для действия «language» (переключение языка):

Для этого мне нужно получить предыдущее имя маршрута для добавления новой локали для перенаправления на правильный маршрут. Я использую отличный совет здесь , чтобы сделать это!

<?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" из ваших немецких URL, например:

yourwebsite.com / Aktuelles * +1101 *

вместо

yourwebsite.com / де / Aktuelles

...

...