[Laravel] 다국어 지원 앱 제작
다국어 지원 앱 제작
다국어를 지원하는 앱을 구성하기위한 레이아웃에 대한 내용입니다.
다국어 지원 앱을 보면
- 서브도메인을 이용하는 방식: ko.onstory.fun. en.onstory.fun...
- url속에 랭귀지 타입을 표현하는 방식: onstory.fun?lan=ko
- 세션을 이용하는 방식: 동일 url이지만 세션을 적용하는 방식이 있습니다.
여기서는 세션을 이용하는 방식으로 url은 누구에게나 동일하나 세션에 따라 다른 언어 페이지를 디스플레이 하는 방식에 대해 설명 드리겠습니다.
-
- user가 접근 초기 접근하였을 경우 사용브라우저의 언어를 인식하여 초기 세션 처리
-
- user가 언어를 선택하였을 경우 세션 처리
-
- 생성된 session을 이용하여 언어에 맞는 페이지 불러오기
1. Middleware 를 이용한 locale 초기화 하기
- Http > Middleware > SetLocale.php
<?php
namespace App\Http\Middleware;
use Closure;
class SetLocale
{
public function handle($request, Closure $next)
{
$lan = preg_split('/,|;/', $request->server('HTTP_ACCEPT_LANGUAGE'));
$locales = ['ko-kr'];
if (strtolower($lan[0]) == 'ko-kr') {
$locale = 'ko';
} else {
$locale = 'en';
}
if (!session('locale')) {
session(['locale' => $locale]);
} else {
$locale = session('locale');
}
\App::setLocale($locale); // 세션 뿐만 아니라 라라벨에서 제공하는 setLocale 을 지정하여 주면 resources > lang 내의 파일을 자동으로 인식한다.
return $next($request);
}
}
- Http > Kernel.php
web 에 위에서 생성한 SetLocale 클래스를 넣어준다.
<?php
..........
class Kernel extends HttpKernel
{
..........
protected $middlewareGroups = [
'web' => [
..........
\App\Http\Middleware\SetLocale::class,
],
..........
];
}
2. 다국어 변경
사용자가 다국어를 변경하려고 할때는 아래와 같이 현재 session값만 변경하면 된다.
public function setLan(Request $request)
{
$lan = $request->input('lan', 'ko');
if ($lan !== 'ko' && $lan !== 'en' ) {
$lan = 'ko';
}
session(['locale' => $lan]);
\App::setLocale($lan);
return redirect()->back();
}
3. Controller에서 분기하기
public function welcome(Request $request)
{
return view('pages/'.session('locale').'/welcome', []);
}
언어팩
Controller
\App::setLocale($locale); 을 이용하여 현재 언어를 세팅하면 resources > lang 내의 파일에서 매치되는 언어팩을 가져올 수 있다.
아래 예제는 resources > lang > [선택된 언어] > messages.php 파일내의 rollout['PASSWORD_NOT_MATCH'=>'비밀번호가 일치하지 않습니다.',] 을 리턴한다.
없을 경우 기본 언어팩인 en에서 처리된다.
return response()->json(['error'=>trans('messages.rollout.PASSWORD_NOT_MATCH')], 200);
blade
아래의 열거된 방법들이 사용 가능하다
- 일반적인 예
{{ __('app.title') }}
{{trans("app.title")}}
@lang('app.title')
- vendor에서의 언어 참조
{{ __('bbs::messages.admin.title') }}
@lang('bbs::messages.admin.title')