2016-11-23 1 views
0

내 웹 사이트에 다국어 지원을 추가하고 싶지만 잘 구현하는 방법을 모르겠습니다. Laravel 문서 (https://laravel.com/docs/5.3/localization)는 매우 드물어서 연구를 해봤지만 모두가 다른 해결책을 사용하고 있으며 그 안에 언어가 포함 된 URL을 사용하고 있습니다 (예 : example.com/en/pagename).세션을 사용하여 Laravel 5.3에 다국어를 추가하는 방법

언어 태그가없는 URL 스키마가 필요합니다. 이런 식으로 뭔가 : example.com/pagename

이 이제 사용자의 언어에 따라 URL을 번역해야합니다

example.com/pagename (english) example.com/seitenname (german)

초기 언어가 브라우저 설정/언어에 의해 감지해야합니다. 또한 사용자는 제공된 언어를 전환 할 수있는 옵션이 있어야합니다.

내 웹 사이트에서 사용자는 계정을 등록 할 수 있습니다. 그는 자신이 선호하는 언어를 데이터베이스에 저장할 수 있습니다. 테이블 userspref_lang에있는 테이블을 예로 들어 보겠습니다. 이 경우 간단하게 유지하려면 "en"(영어) 또는 "de"(독일어)와 같은 문자열 일뿐입니다.

경로를 변환하는 것은이 같은 언어 파일을 작성하여 쉽게 : EN에 대한

// resources/lang/de/routes.php 

return array(
    'contact' => 'kontakt', 
    'pagename' => 'seitenname' 
); 
... 그리고 하나

: 예를 들면 경로와 합쳐서

// resources/lang/en/routes.php 

return array(
    'contact' => 'contact', 
    'pagename' => 'pagename' 
); 

...

// routes/web.php 

Route::get('/', function() { 
    return view('pages.dashboard'); 
}); 

Route::get('/{contact}', function() { 
    return view('pages.contact'); 
}); 

Route::get('/{pay2gether-system}', function() { 
    return view('pages.pagename'); 
}); 

이제는 "언어 전환"버튼을 어떻게 만들 수 있습니까? 브라우저 설정/스위치 동작 또는 SESSION의 데이터베이스에서 HTML <a href="#"> 태그의 경로와 URL에 대해 어떻게 다시 사용할 수 있습니까?

답변

1

나는 이것을 두 번 했으므로 달성하기가 쉽습니다. 아래 단계를 따르고 다른 질문이 있으면 언제든지 물어보십시오.

  1. users 테이블에 language 열을 만듭니다. 이것이 내가 과거에 설정 한 방법입니다. $table->string('language')->default('en');
  2. 언어 변경을 감지 할 수있는 새로운 미들웨어를 만듭니다 (예 : SetLanguage).
  3. app\Http\Kernel.phpweb 미들웨어 그룹 하단에 미들웨어를 추가하십시오.
  4. handle 방법 안에 다음을 붙여 넣으십시오.

    if ($request->has('language')) { 
        if (auth()->user()) { 
         auth()->user()->language = $request->language; 
         auth()->user()->save(); 
        } 
        App::setLocale($request->language); 
    } elseif (auth()->user()) { 
        App::setLocale(auth()->user()->language); 
    } 
    return $next($request); 
    
  5. 는 서비스 제공 업체를 작성하고 config/app.php에 등록하고 부팅 방법에 다음 코드를 붙여 넣습니다. 지금의

    view()->composer('template.name', function($view) { 
        $languages = []; 
        $folders = File::directories(base_path('resources/lang/')); 
        foreach ($folders as $folder) { 
         $languages[] = str_replace('\\', '', last(explode('/',$folder))); 
        } 
        $view->with('languages', $languages); 
    }); 
    
  6. 당신의 template.name.blade.php 당신이 할 수있는 응용 프로그램에서 사용할 수있는 언어를 통해 루프.

드롭 다운 목록에서 반복 할 때 {{ url('/') . '?language=' . $language }}을 링크로 사용해야합니다. language 키를 다른 것으로 변경할 수도 있지만 그렇게 할 경우 미들웨어에서도 키를 변경해야합니다.

+0

Laravel이 데이터베이스에서 아직 설정되지 않은 브라우저의 첫 번째/기본 언어는 어디에서 읽습니까? 그게 없어 졌니? 또한 : 나는 {{url ('/')}과 같은 언어로 언어를 저장하고 싶지 않습니다. '? language ='. $ language}}',하지만 쿠키/세션에서. 그게 가능하지 않니? – user2966991

+0

데이터베이스에 기본값이 있는데, 'en'으로 설정되어 있습니다. 원하는대로 변경할 수 있습니다. – tomirons

0

나는 미들웨어에 뭔가를 할 것이다 : 나는 경우 매우 확실하지 않다

<ul class="dropdown-menu" role="menu"> 
    @foreach ($languages as $lang) 
     <li> 
      <a href="{{ url()->current() . '/?language=' . $lang }}" title="">{{ $lang }}</a> 
     </li> 
    @endforeach 
</ul> 

: 공급자에 지금

public function handle($request, Closure $next) 
{ 
    if ($request->has('language')) { 
     $path = $request->path(); 
     $locale = $request->get('language'); 

     # save locale 
     Cookie::queue(Cookie::make(
      'language', $locale, 1440 // 24h 
     )); 

     # set locale 
     \App::setLocale($locale); 

     return redirect($path)->withCookie(cookie('language')); 
    } 

    if ($locale = $request->cookie('language')) { 
     \App::setLocale($locale); 
    } 

    return $next($request); 
} 

:

public function boot() 
{ 
    View::composer('template.name', function($view) { 
     $directory = base_path('resources/lang/'); 
     $languages = \File::directories($directory); 
     $view->with('languages', array_map('basename', $languages)); 
    }); 
} 

그리고보기 이것은 최고의 솔루션입니다 ... 어쩌면 Laravel에서 더 많은 경험을 가진 누군가가 우리에게 또 다른 해결책을 보여줄 수 있습니다

+0

코드 최적화는 실제로 중요한 부분이 아닙니다. 다른 대답을 말하는거야? 충분히 명확하지 않습니다. –

관련 문제