Project Crestia

PHP에서 다국어 페이지를 만드는 방법은 여러가지가 있습니다.


첫째로 언어별로 페이지 (예 : index_korean.php, index_english.php 등...)를 만드는 고전적인 방법이 있고,

두번째로는 조금 복잡하지만 i10n이나 i18n 라이브러리를 쓰는 방법이 있습니다.

세번째로는 간단히 PHP 함수와 배열 (또는 변수)을 이용한 간단한 다국어 지원 페이지를 만드는 방법이 있습니다.


본 포스트에서 소개드릴 방법은 바로 세번째입니다. 이 방법은 단순한 다국어 페이지를 만들 때 유용하게 사용할 수 있는 방법입니다. 만약 큰 규모의 다국어 페이지라면 이런 방법보다는 i10n이나 i18n을 사용하는 것이 언어 파일 관리나 작성하는 면에서 훨씬 효율적입니다.


일단은 사용자의 브라우저에서 최우선 순위에 있는 언어에 대한 변수를 받아와야 합니다. $_SERVER 함수를 이용해서 받아오는데, 받아오는 속성은 HTTP_ACCEPT_LANGUAGE 입니다. HTTP_ACCEPT_LANGUAGE에 대해 브라우저는 한국어라면 ko-KR, 영어 (미국)이라면 en-US와 같이 서버에 최우선 순위 언어를 알려주게 됩니다.


그럼 이제 언어 코드의 맨 앞 두글자만 substr을 이용해 잘라오도록 하겠습니다. 만약 한국어가 최우선 순위라면 ko-KR에서 ko만 잘려 나오게 됩니다.

substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);


이렇게 잘라낸 부분을 $lang 변수에 집어넣도록 하겠습니다.


$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);


그리고 이제 $lang 변수의 값에 따른 if ~ elseif ~ else 문을 구성해 보도록 하겠습니다.

일일이 변수를 지정해주는 방법도 있지만, 코딩할 때하고 페이지 로드할 때 굉장히 비효율적이기 때문에 배열을 이용해서 하는 편이 나은 것 같아 배열을 사용하기로 했습니다. 배열을 사용할 때 주의할 점은 PHP 배열 순서는 "0부터 시작"하므로 실수하지 않도록 주의하셔야 합니다.


그러면 이제 한국어, 영어, 프랑스어, 기타 언어에 대한 배열을 구성해 보겠습니다.


	if ($lang == "ko") // 한국어
		{
			$strings = array ("예", "아니오", "취소", "로그인", "이 메시지는 테스트 메시지입니다.", "이 페이지의 언어는 한국어입니다.");
		}
	elseif ($lang == "en") // 영어
		{
			$strings = array ("Yes", "No", "Cancel", "Sign in", "This message is a test message.", "The language of this page is English.");
		}
	elseif ($lang == "fr") // 프랑스어
		{
			$strings = array ("Oui", "Non", "Annuler", "Connexion", "Ce message est un message test", "La langue de cette page est française.");
		}
	else // 일치하는 언어 없으면 영어로 표시
		{
		  $strings = array ("Yes", "No", "Cancel", "Sign in", "This message is a test message.", "The language of this page is English.");
		}


그리고 디버깅을 위한 출력부를 아래에 추가합니다.


	echo
	"
	<h1>브라우저 언어 : $lang</h1>
	<p>
	<strong>예</strong> : $strings[0] <br>
	<strong>아니오</strong> : $strings[1] <br>
	<strong>취소</strong> : $strings[2] <br>
	<strong>로그인</strong> : $strings[3] <br>
	<strong>이 메시지는 테스트 메시지입니다.</strong> : $strings[4] <br>
	<strong>이 페이지의 언어는 ~~어입니다.</strong> : $strings[5]
	</p>
	";


이제 디버깅을 해 볼 차례네요. 맨 위의 $lang 앞에 //을 추가해서 주석 처리한 뒤에 $lang = "en"; 을 아래에 집어넣고 페이지를 띄웁니다. 페이지 내용이 영어로 뜨게 될 것입니다. 만약 $lang 변수를 fr로 바꾸면 프랑스어가 뜨게 됩니다. 정상적으로 작동하는 것을 확인한 뒤에는 앞에서 주석 처리한 코드를 다시 살리고 디버깅용 코드를 삭제합니다.


완성된 최종 코드는 다음과 같습니다.