다국어 사이트에서 언어 처리
주로 작업하는 사이트가 다국어 사이트이다 보니 기존 솔루션(예를 들면 그누보드 등)은 다국어 처리가 가능은 하지만 그럴려면 소스의 많은 부분을 수정해야만 하기 때문에.. 더구나 회사 홈페이지의 경우 회원 가입, 커뮤니티 활동 등은 필요가 없는 기능이기 때문에.. 더구나 게시글 역시 관리자 페이지에서 작성하는 경우가 많기 때문에 필요한 기능만 있는 자체 개발 솔루션을 사용하고 있다. 개발기간이 대략 3주 정도 걸리긴 했지만 일단은 편하게 사용할 수 있어서 좋은 것 같다.
사이트 언어처리는 php 배열을 이용해서 아래와 같은 구조를 가지고 있다.
<?php
$LANG = array(
'ko' => array(
'L001' => '올바른 방법으로 이용해 주십시오.',
'L002' => '요청된 정보가 존재하지 않습니다.',
),
'en' => array(
'L001' => 'Please use it in the correct way.',
'L002' => 'The requested information does not exist.',
)
);
그리고 자바스크립트 등에서도 사용이 되기 때문에 php 배열을 그대로 사용할 수는 없고 아래와 같은 json 형태의 데이터를 생성해서 처리하도록 했다.
var LANG = {"ko":{"L001":"\uc62c\ubc14\ub978 \ubc29\ubc95\uc73c\ub85c \uc774\uc6a9\ud574 \uc8fc\uc2ed\uc2dc\uc624.","L002":"\uc694\uccad\ub41c \uc815\ubcf4\uac00 \uc874\uc7ac\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4."},"en":{"L001":"Please use it in the correct way.","L002":"The requested information does not exist."}};
function _l($code, $lng = '')
{
$LANG = $GLOBALS['LANG'];
if (!isset($LANG) || empty($LANG))
return '';
if (!$lng)
$lng = getSiteLanguage();
if (!$lng) {
$l = array_shift($LANG);
} else {
if (!isset($LANG[$lng]))
$l = array_shift($LANG);
else
$l = $LANG[$lng];
}
return isset($l[$code]) ? $l[$code] : '';
}
function _l(code, lng)
{
if (typeof(LANG) === "undefined" || Object.keys(LANG).length < 1)
return "";
if (typeof(cm_language) === "undefined")
return "";
if (!lng)
lng = cm_language;
var lk = Object.keys(LANG);
var l;
if (!lng) {
l = LANG[lk[0]];
} else {
if (lk.indexOf(lng) == -1)
l = LANG[lk[0]];
else
l = LANG[lng];
}
if (typeof(l) === "undefined")
return "";
return typeof(l[code]) !== "undefined" ? l[code] : "";
}
json 데이터를 별도로 생성해야하는가 생각할 수도 있지만 php 배열을 json_encode
함수로 처리만 해주면 된다. php 배열이 변경되면 파일 수정 시간을 체크해서 새로 json 데이터를 생성하면 편하다. 이제 사이트 방문자가 언어를 변경하겠다고 요청했을 때 처리하는 부분이 남았는데 언어 변경 후 다시 메인 등으로 이동하지 않고 방문한 페이지에서 처리되도록 하기 위해 아래와 같이 했다.
function changeLanguage(lng)
{
var keys = Object.keys(LANG);
var url = document.location.href;
if (keys.indexOf(lng) == -1)
document.location.reload();
var sp = url.replace(/^https?:\/\//g, "").replace(/\/+/g, "/").split("/");
if (keys.indexOf(sp[1]) != -1) {
sp[1] = lng;
} else {
var sp1 = sp.slice(0, 1);
var sp2 = sp.slice(1);
sp = sp1.concat([lng], sp2);
}
document.location.href = window.location.protocol + "//" + sp.join("/");
}
언어 처리 기능이 충분한 테스트를 하지 못해서 오류가 있을 수도 있지만 크게 이런 식으로 처리를 하면 좋겠다 생각이 들어서 이렇게 작업을 진행하고 있다.