워드프레스 날짜표기 한글화 문제


워드프레스를 한글화할 때 가장 문제되는 것 중 하나가 날짜 표기 문제이다. 대부분 날짜 표기는 테마파일을 수정함으로써 간단하게 한글화할 수 있지만, 다음의 wp_get_archives() 함수만큼은 테마파일의 수정을 통해서 한글화할 수가 없다.

[php]
/* wp-content/themes/default/sidebar.php */
45 < ?php wp_get_archives('type=monthly'); ?>
[/php]

이 함수는 글들을 연월일 별로 분류할 때 호출하는 함수인데, 월별 분류를 선택(즉, ‘type=monthly’)하면 연월이 ‘January 2006′ 식으로 출력된다. 함수의 정의상 인자를 통해서 연월 표기형식을 전달받지는 않으므로, 이 표기를 한글화하려면 두 가지 과정을 거쳐야 한다. 먼저 ko_KR.po 파일을 번역하여 ko_KR.mo 파일을 생성하고, 그 다음 서양식의 ‘월-년’ 순서를 동양식의 ‘년-월’ 순서로 바꾸어야 한다.

워드프레스를 지역언어로 번역(localization)하기 위해 필요한 ko_KR.po 파일 662행 이하는 월명의 번역 내용을 담고 있다. 이 월명은 wp-includes/locale.php 파일의 38행 이하에서 참조되어 배열변수에 저장된다.

[php]
/* wp-includes/languages/ko_KR.po */
662 #: wp-includes/locale.php:38
663 #: wp-includes/locale.php:53
664 msgid “January”
665 msgstr “1월”
667 #: wp-includes/locale.php:39
668 #: wp-includes/locale.php:54
669 msgid “February”
670 msgstr “2월”

/* wp-includes/locale.php */
38 $month['01'] = __(‘January’);
39 $month['02'] = __(‘February’);
53 $month_abbrev[__('January')] = __(‘Jan_January_abbreviation’);
54 $month_abbrev[__('February')] = __(‘Feb_February_abbreviation’);
[/php]

이 배열변수를 이용하는 것이 바로 wp_get_archives() 함수이므로, ko_KR.mo 파일의 생성이 전제되지 않는 한, 월별로 분류된 글을 볼 때의 연월 표기는 한글화될 수가 없다. 물론 ko_KR.mo 파일의 번역된 데이타를 저장하는 것은 결국 locale.php 파일이므로, ko_KR.mo 파일을 생성하는 일이 번거롭다면 locale.php 파일의 관련 데이타만 한글로 번역해도 무방하다. 가령 38행의 ‘January’를 ’1월’로 변경하면 될 것이다.

그 다음, wp_get_archives() 함수의 실체적 내용은 get_archives() 함수가 정의하고 있으므로, 우리는 서양식의 연월 순서를 바꾸기 위해서는 get_archives() 함수의 정의 자체를 수정해야 한다.

[php]
/* wp-includes/template-functions-general.php */
279 function wp_get_archives($args = ”) {
280 parse_str($args, $r);
281 if ( !isset($r['type']) )
282 $r['type'] = ”;
294 get_archives($r['type'], $r['limit'], $r['format'], $r['before'], $r['after'], $r['show_post_count']);
295 }

298 function get_archives($type=”, $limit=”, $format=’html’, $before = ”, $after = ”, $show_post_count = false) {
332 if ( ‘monthly’ == $type ) {
333 $arcresults = $wpdb->get_results(“SELECT DISTINCT YEAR(post_date) AS `year`, MONTH(post_date) AS `month`, count(ID) as posts FROM $wpdb->posts WHERE post_date < '$now' AND post_date != '0000-00-00 00:00:00' AND post_status = 'publish' GROUP BY YEAR(post_date), MONTH(post_date) ORDER BY post_date DESC" . $limit);
334 if ( $arcresults ) {
335 $afterafter = $after;
336 foreach ( $arcresults as $arcresult ) {
337 $url = get_month_link($arcresult->year, $arcresult->month);
338 if ( $show_post_count ) {
339 $text = sprintf(‘%s %d’, $month[zeroise($arcresult->month,2)], $arcresult->year);
340 $after = ‘ (‘.$arcresult->posts.’)’ . $afterafter;
341 } else {
342 $text = sprintf(‘%s %d’, $month[zeroise($arcresult->month,2)], $arcresult->year);
343 }
344 echo get_archives_link($url, $text, $format, $before, $after);
345 }
346 }
391 }
[/php]

위 파일의 339행과 342행이 바로 연월 표기를 정의하고 있다. 이 표기를 바꾸면 비로소 월별로 분류된 글들을 볼 때 서양식으로 표기되던 연월 표기를 한글화할 수 있게 된다. 즉,

[php]
339 $text = sprintf(‘%s %d’, $month[zeroise($arcresult->month,2)], $arcresult->year);
342 $text = sprintf(‘%s %d’, $month[zeroise($arcresult->month,2)], $arcresult->year);

을 다음처럼 변경하면 된다.

339 $text = sprintf(‘%d년 %s’, $arcresult->year, $month[zeroise($arcresult->month,2)]);
342 $text = sprintf(‘%d년 %s’, $arcresult->year, $month[zeroise($arcresult->month,2)]);
[/php]

요약하자면, 먼저 ko_KR.mo 파일을 생성하거나 혹은 locale.php 파일의 월명을 한글화하고, 그 다음 template-functions-general.php 파일의 get_archives() 함수 정의를 수정해야 한다. 그래야 ‘January 2006′ 식으로 표기되던 것을 ’2006년 1월’로 변경할 수 있다.


이 글은 2006년 01월 13일에 작성되어 컴퓨터·웹(으)로 분류되었습니다.

RSS로 이 글의 댓글을 구독하실 수 있으며 TrackBack으로 댓글을 쓰실 수도 있습니다.

태그:



'워드프레스 날짜표기 한글화 문제'에 대한 댓글 5


  1. 안그래도 궁금하던 정보였는데 자세하게 설명해 주셨네요.
    좋은 정보 감사합니다. :)

    FineApple

    2006년 01월 13일

  2. 제 블로그에서 표정아이콘도 가능하군요. 저도 미처 몰랐네요 :)

    Gosinga

    2006년 01월 13일

  3. 339행과 342행의 sprintf의 인자를 ‘%d년 %s’로 수정하고 template-functions-general.php 파일을 utf-8로 변경하여 저장했을 경우, WP와 Gallery2 간에 충돌이 발생합니다.

    이 문제를 임시적으로 피하기 위해서는 template-functions-general.php을 utf-8이 아니라 원래의 인코딩 형식으로 저장해야 하며, 그 결과 ‘%d년 %s’처럼 함수의 정의 내용에 한글을 써서는 안됩니다. 그래서 저는 ‘%d/%s’ 같은 형식으로 수정하였습니다. 이는 wp-includes/ 디렉토리 내의 파일들을 되도록이면 utf-8로 저장해서는 안된다는 증거이기도 합니다.

    따라서 locale.php 파일의 월명을 한글로 수정하고 utf-8로 저장하는 방식 역시 되도록 피해야 할 것입니다.

    Gosinga

    2006년 01월 16일

  4. 안녕하세요. 제 블로그에 남겨주신 글 잘 봤습니다.

    정보 고맙습니다. :)

    한날

    2006년 01월 24일

  5. 한날 님, “XHTML 태그 중첩 자동 정정” 기능 때문에 방문하셨군요. 고수님들의 맹점이라고나 할까요. 모든 것을 프로그래밍의 관점에서 접근하다 보니까 체크상자로 해결되는 것을 오히려 모르는 그런 맹점이요…

    Gosinga

    2006년 01월 26일

댓글남기기