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

问题描述 投票:1回答:1

我有一个德语网站,希望用Laravel(Localization?)将其翻译成英文。每种语言都有不同的链接,因此没有必要获得他们的语言环境。

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

我需要的:

  • 我只有两种语言,德语(主要)和英语(第二)
  • 我需要在网址中输入参数ende,但我还没有找到这样做的教程
  • 我想我必须使用翻译字符串作为键,因为它只用两种语言才有意义,因此我需要一个json文件

所以我的问题:

  1. 我想翻译成英文,但en文件夹中已经有一个lang文件夹,所以我该怎么做?把en.json文件放在那里?
  2. 是否有必要使用中间件?或者,对于那些经验不足的人来说,是否还有另一种安全的方法来实现这一目标?
  3. 如何在网址中设置和获取语言参数并根据它翻译网站?
  4. 即使我有大约3个不同的路线/网站,我只需要一个en文件来翻译吗?
php laravel translation multilingual
1个回答
2
投票

您已经拥有了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();


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)为切换标志动作“语言”添加路由。

在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是

...

© www.soinside.com 2019 - 2024. All rights reserved.