[Laravel] 다국어 지원 앱 제작

[Laravel] 다국어 지원 앱 제작 updated_at: 2024-03-06 11:33

다국어 지원 앱 제작

다국어를 지원하는 앱을 구성하기위한 레이아웃에 대한 내용입니다.
다국어 지원 앱을 보면

  • 서브도메인을 이용하는 방식: ko.onstory.fun. en.onstory.fun...
  • url속에 랭귀지 타입을 표현하는 방식: onstory.fun?lan=ko
  • 세션을 이용하는 방식: 동일 url이지만 세션을 적용하는 방식이 있습니다.

여기서는 세션을 이용하는 방식으로 url은 누구에게나 동일하나 세션에 따라 다른 언어 페이지를 디스플레이 하는 방식에 대해 설명 드리겠습니다.

    1. user가 접근 초기 접근하였을 경우 사용브라우저의 언어를 인식하여 초기 세션 처리
    1. user가 언어를 선택하였을 경우 세션 처리
    1. 생성된 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') }}
@lang('app.title')
  • vendor에서의 언어 참조
{{ __('bbs::messages.admin.title') }}
@lang('bbs::messages.admin.title')
평점을 남겨주세요
평점 : 5.0
총 투표수 : 1

질문 및 답글