Laravel 3 I18N/L10N

laravel 3에서 다국어 페이지를 처리하는 방법을 정리했다. laravel 4에서는 다르게 처리를 해야 하는 것 같은데 이는 차후에 정리를 하겠다.

설정

config/application.php 수정

//영문 URL을 /en/sample로 사용하고자 한다면 
'languages' => array('en', 'kr', 'cn'),
    
//영문 URL을 /sample로 사용하고자 한다면 
'languages' => array('kr', 'cn'),

언어 리소스 파일 수정

  • language/en/sample.php
  • language/en/validation.php
  • language/kr/sample.php
  • language/kr/validation.php
  • language/cn/sample.php
  • language/cn/validation.php

언어 리소스 예제: language/kr/sample.php

<?php
    
return array(
    'page-title' => '한글 페이지',
);

사용예

** blade **

@section('page_title', __('sample.page-title'))

form validation message localization

** Server Side Validation **

$messages = array(
	'phone_match' => __('sample.phrase-phone-match'),
	'phone_required' => __('sample.phrase-phone-required'),
	'phone_min' => __('sample.phrase-phone-min'),
);

$validation = Validator::make($input, $rules, $messages);

** Client Side Validation **

  • jQuery validation 플러그인의 언어별 메세지 파일을 로드한다.
  • custom rule에서 $.validator.messages를 사용한다면 반드시 메시지 파일 다음에 로드해야 한다.

validate.js 파일에서 $.validator.messages.required를 사용한다.

$.validator.addMethod("selected", function(value, element, parameter) {
    return (parseInt(value) || 0) >= 0 ? true : false;
}, $.validator.messages.required);

client side validation 예제

@section('script')
@parent
<script type="text/javascript">
jQuery(function ($) {
	$('#frmSample').validate();
});
</script>

@if (URI::segment(1) === 'kr')
<script type="text/javascript" src="/js/jquery/plugins/validate/1.11.1/localization/messages_ko.js"> </script>
<script type="text/javascript" src="/js/lib/plugin/validate/validate.js"> </script>
@endif
@endsection

URL

URL 앞부분에 언어 정보가 포함되어 언어별 스위칭이 이루어지고 이는 laravel.php에서 수행된다.

  • /sample : 영문
  • /kr/sample : 한글
  • /cn/sample : 중문

view 단에서 언어 스위칭 예제

<?php
$lang = URI::segment(1);
if (strlen($lang) != 2) $lang = 'en';
?>
<ul class="nav nav-pills">
	<li class="{{ $lang === 'en' ? 'active' : '' }}"><a href="{{ $lang === 'en' ? 'javascript:void(0)' : str_replace('/kr', '', preg_replace('/http:\/\/[^\/]+/', '', URL::full())) }}"">{{ __('sample.label-engligh') }}</a></li>
	<li class="{{ $lang === 'kr' ? 'active' : '' }}"><a href="{{ $lang === 'kr' ? 'javascript:void(0)' : '/kr' . preg_replace('/http:\/\/[^\/]+/', '', URL::full()) }}">{{ __('sample.label-korean') }}</a></li>
</ul>

laravel.php에서 언어 정보 처리 코드

/*
|--------------------------------------------------------------------------
| Gather The URI And Locales
|--------------------------------------------------------------------------
|
| When routing, we'll need to grab the URI and the supported locales for
| the route so we can properly set the language and route the request
| to the proper end-point in the application.
|
*/

$uri = URI::current();

$languages = Config::get('application.languages', array());

$languages[] = Config::get('application.language');

/*
|--------------------------------------------------------------------------
| Set The Locale Based On The Route
|--------------------------------------------------------------------------
|
| If the URI starts with one of the supported languages, we will set
| the default lagnauge to match that URI segment and shorten the
| URI we'll pass to the router to not include the lang segment.
|
*/

foreach ($languages as $language)
{
	if (preg_match("#^{$language}(?:$|/)#i", $uri))
	{
		Config::set('application.language', $language);

		$uri = trim(substr($uri, strlen($language)), '/'); break;
	}
}

if ($uri == '') $uri = '/';

URI::$uri = $uri;

관련 Helper

$url = URL::to_language('fr');

References