앞선 글(https://xetown.com/square/354440)에서 '다국어 지원이 되지 않는 단일/다중선택 형식의 확장변수 기본값 문제'를 언급한 바 있습니다.
따옴표 안의 말이 복잡하고 참 길죠? 그만큼 실제 문제도 복잡합니다;;;
어쨌든 (다국어 지원이 되는) 카테고리 지정을 우회함으로써, 게시판 목록에서 게시물의 확장변수 값을 다국어로 구현하는 데 성공했습니다.
과정이 좀 복잡하긴 합니다.
XEedition 게시판 스킨 기준입니다.
1. 다행이라면 다행일 텐데. _header.html에 다음과 같은 변수 정의가 있어서 수고를 좀 덜었습니다.
{@ $cate_list = array(); $current_key = null; } <!--@foreach($category_list as $key=>$val)--> <!--@if(!$val->depth)--> {@ $cate_list[$key] = $val; $cate_list[$key]->children = array(); $current_key = $key; } <!--@elseif($current_key)--> {@ $cate_list[$current_key]->children[] = $val } <!--@end--> <!--@end-->
카테고리 목록을 계층화해주는 것 같습니다. 이렇게 하면 카테고리 군과 확장변수를 매칭시키기가 한층 수월해집니다.
2. 다음으로 게시판 설정의 '분류 관리'로 들어가서 계층화된 카테고리를 만들어줍니다. 물론 다음과 같이 다국어로요.
번역이나 맞춤법이 잘 됐는지는 신경쓰지 말아주세요ㅠㅠ 저는 여기서 '형식(Type)'은 일반적인 카테고리 변수로 활용할 것이고, '주제(Theme)'는 확장변수와 매칭시킬 더미 변수로 활용할 것입니다.
3. 위의 '주제(Theme)' 분류에 맞출 확장변수도 설정해줍니다. 똑같이요.
앞선 글에서도 썼지만, '기본값(Default Value)'는 다국어 지원을 하지 않는다는 걸 재확인할 수 있습니다.
덧붙여, 향후의 귀찮은 공백 제거 작업을 방지하기 위해 기본값과 쉼표 사이에 띄어쓰기는 하지 않도록 합니다.
4. 이제 게시판 스킨의 목록 파일로 돌아가보겠습니다.
{$category_list[$document->get('category_srl')]->title}로 하면 해당 글의 카테고리 제목이 출력됩니다. 이 부분은 크게 어렵지 않으니 패스하겠습니다.
다음으로, 위에서 theme이라는 변수명으로 설정했던 확장변수의 변수값을 불러옵니다. 보통은 {$document->getExtraValue(1)}으로 불러오죠. 하지만 이렇게 하면 당연히 다국어 출력이 되지 않습니다. 요렇게 말입니다.
따라서, 애초 계획대로 확장변수의 기본값을 카테고리 변수값으로 매칭시켜주는 절차를 밟아보도록 하겠습니다.
5. 일단 다음과 같이 두 가지 변수를 준비해보겠습니다. 하나는 eval이고 다른 하나는 cval입니다.
결코 욕이 아닙니다. eval은 확장변수의 약자이고, cval은 카테고리변수의 약자일 뿐입니다.
{@ $eval = explode(',',$document->getExtraVars()[1]->default); } <block loop="$cate_list[array_keys($cate_list)[1]]->children=>$key,$val"> {@ $cval[$key] = $cate_list[array_keys($cate_list)[1]]->children[$key]->title; } </block>
$eval은 쉼표 단위로 구분되어 있는 확장변수의 기본값을 배열 변수로 만들어준 것입니다. 비교적 간단하죠. 여기서 [1]은 사용자 정의에서 설정돼 있던 확장변수의 일련번호를 가리킵니다.
$cval은 _header.html에서 만들어졌던 1차 카테고리 목록($cate_list) 중 두 번째 키값을 추출해내고(array_keys($cate_list)[1]), 이것을 이용해 '주제(Theme)' 카테고리의 하위 카테고리들을 루프로 돌려줘서 얻은 결과입니다. 그리고 $key 값에 따라서 하위 카테고리의 제목을 입력시켜서 배열변수로 만들어줬습니다.
6. {print_r($eval)}과 {print_r($cval)}로 확인해보면 다음과 같은 결과가 나옵니다. 일단 한국어 모드입니다. 위쪽이 $eval이고 아래쪽이 $cval이에요.
성공적이네요. 두 변수가 동일한 결과를 보여주죠? 하지만 $eval과 $cval이 언제나 동일하지만은 않습니다. 이번엔 영어 모드에서 print_r로 출력해보도록 하겠습니다.
보시는 바와 같이 우리의 $cval(아래쪽)은 언어 모드에 따라 다른 값을 뿌려줍니다. 즉, 한국어 모드에선 두 변수가 동일하고 영어 모드에선 서로 다릅니다. $cval은 다국어 지원 기능이 있는 카테고리 변수로부터 얻어왔기 때문이에요.
7. 이로써 긴~ 준비가 끝났습니다. 그러면 아까 4번 항목에서 {$document->getExtraValue(1)}로 다국어 출력에 실패했던 문제를 해결해보겠습니다.
{$cval[array_search($document->getExtraValue(1),$eval)]}
끝입니다... 엥? ㅋㅋㅋ
array_search는 $document->getExtraValue(1)로 배열 변수 $eval을 검색해서 성공시에 해당하는 키를 반환시켜줍니다. 즉 $eval과 $cval의 배열이 매칭하는 점에 착안한 겁니다.
예컨대, {$document->getExtraValue(1)}이 어느 언어 모드에서든 '그 외'로 출력되는 데 그쳤다면, 위의 구문은 '그 외'에 해당하는 키값을 [4]로 매칭되는 $cval을 뿌려주게 됩니다.
그 결과, 위의 4번 항목에서 한국어로 잘못 출력됐던 부분도 다음과 같이 잘 나오게 됩니다.
... 이상입니다. 이로써 다국어 지원 블로그가 완성의 길로 가는 것일까요?
사실, 아직 모르겠습니다. 이 글을 사용팁이 아니라 자유 게시판에 쓰는 이유도 이 때문입니다.
_read.html과 _write_document.html에서도 확장변수 부분을 제어해줘야 하는 건 물론이고, 무엇보다도 영어모드에선 게시판 검색이 안 된다는 가장 큰 난관이 기다리고 있기 때문입니다.
다국어 기능을 시험해보신 분들은 아시겠지만, 확장변수로 게시판 검색을 할 때는 오로지 한국어로만 됩니다;;;;
여러모로 노력을 다하곤 있지만 검색 문제를 해결할 수 있을지는 자신이 1도 없습니다ㅠ 저는 이런 식으로 다국어 지원 블로그 제작에 성공할 수 있을까요? 아니면 기능 제한을 운명으로 받아들이고 이쯤에서 멈춰야 하는 걸까요?
벌써 새벽 5시반이네요. 이만 자야겠습니다.
※ 첨가: 이 글은 게시판 목록에서 활용되는 사례이며, 게시판 본문에서는 다음의 글을 참조해주세요. https://xetown.com/lakepark/359530
고생하셨습니다.