잡다한 내 인생의 기록

[Theme My Login] Register, Lost Password 번역불가 오류 수정 본문

워드프레스

[Theme My Login] Register, Lost Password 번역불가 오류 수정

알 수 없는 사용자 2015. 5. 19. 12:23
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

안녕하세요 앤틱입니다.


이번 포스팅은 Theme My Login 플러그인 사용중 생긴 에피소드와 해당 문제에 대한 해결책에 대한 부분을 다뤄보겠습니다.


먼저 이 이야기부터 시작하도록 하죠.


[Wordpress의 기본 자동번역 함수들]


위의 이야기를 하는 것은 제가 겪은 문제가 '번역'이 되지 않아 발생된 오류였기 때문입니다. 다음 스샷을 보시면 로그인 아이디, 비밀번호, 아이디 기억하기 등의 텍스트는 제대로 번역된 값이 출력되는데 반해 Register, Lost Password 라는 텍스트는 번역이 되지 않는 문제를 발견했습니다.



분명 po 파일을 domain-ko-KR.po 형식의 파일(이 플러그인은 정확히 theme-my-login-ko_KR.po 파일이 되죠)로 추가 생성하여 서버에 올렸고, Register 등의 번역을 마친 상태였는데 해당 부분만 영어로 출력되는 것이었습니다.


이 문제가 발생하고 처음 시도한 방법은 관련된 나머지 플러그인의 번역파일인 domain-ko_KR 파일이 혹시 누락되지 않았는지 살펴보는 것이었습니다.


또 상위의 플러그인 번역파일도요. 그 위의 워드프레스 번역 파일도....


이런 삽질을 하다, 너무 답답해 플러그인의 템플릿 중 로그인 템플릿을 확인해 보기로 했습니다.


[실제 플러그인 변경 방법]


탬플릿 확인을 위해 플러그인을 통째로 받아 Aptana로 확인해 보았습니다. 해당 부분의 소스는 다음과 같았습니다.


디렉토리 - 워드프레스폴더/wp-content/plugins/theme-my-login/templates/login-form.php


아래부터 관련소스


<?php $template->the_action_links( array( 'login' => false ) ); ?>


위와 같이 template에 정의된 the_action_links 함수를 호출하는데요, 해당 부분을 쭉 타고 들어가 문제가 되는 함수를 발견했습니다.


템플릿 관련 함수가 정의되어 있는 파일은 플러그인폴더/includes/class-theme-my-login-template.php 이구요.

아래부분이 소스상으로 문제가 있었습니다.


[문제의 소스]


소스상의 문제는 이렇습니다. the_action_links 함수를 호출하고 Register, Lost Password 등의 타이틀과 액션 url을 배열객체에 담아 filter hook에 추가하게 되는데 객체를 생성할 때 get_title이라는 함수로 해당 케이스에 대한 번역본을 가져오는데 else 부분을 타지 않기 때문에(if문에서 무조건 걸리게 되어 있습니다.) switch-case 구문에 접근하지 못해 번역문을 리턴받아오지 못하는 것입니다. 그래서 이 문제를 해결하기 위해 else 부분의 switch-case 구문을 복사하여 붙여넣고 default 부분에 기존의 소스를 박아주면 해결이 되는거죠.(if문의 조건을 변경하는 방법도 있습니다.)



광고2



저는 이렇게 해결했습니다.

위의 구문 중

if ( $page_id = Theme_My_Login::get_page_id( $action ) ) {

$title = get_post_field( 'post_title', $page_id ); ---> 이 구문은 변경 후 기본 케이스로 사용합니다.

} else {

-- 후략 --

이란 조건문이 있습니다.


조건문의 else 부분에 있는 switch case 구문을 복사하고 default의 구문을 기존 if문에 있던 구문으로 교체합니다. 그렇게 되면 다음과 같이 변경되겠죠.


if ( $page_id = Theme_My_Login::get_page_id( $action ) ) {

switch ( $action ) {

case 'register':

$title = __( 'Register', 'theme-my-login' );

break;

case 'lostpassword':

case 'retrievepassword':

case 'resetpass':

case 'rp':

$title = __( 'Lost Password', 'theme-my-login' );

break;

case 'login':

$title = __( 'Log In', 'theme-my-login' );
break;

default:

$title = get_post_field( 'post_title', $page_id ); --> 기존 if문에 있던 구문

}

} else {

-- 후략 --


이렇게 수정하면 해당 if문을 타면서 switch case 구문을 타기 때문에 register 가 들어왔을 때 $title에 제대로 된 번역값이 들어가게 되어 정상적으로 한글이 출력됩니다.


물론 해결방법은 여러가지가 있습니다. 하지만 해당 부분의 변경으로 인해 다른 부분이 손상될 우려가 있기 때문에 너무 많은 부분을 건들지 않되 수정되는 방법을 사용하는 것이 좋겠지요.


혹시 저처럼 Theme My Login을 사용하는데 이 문제를 몰라 프로세스 자체를 코드에 박으신 분들은 이 방법으로 사용하시면 유용할 것 같아 포스팅을 해 보았습니다.


앞으로도 많은 삽질이 있겠지요, 하지만 재미있으니까 하는 것 아닐까요!? 그것이 코더, 프로그래머의 운명인거죠 ㅎㅎ


유용한 내용이었을진 모르겠지만 많은 도움이 되었으면 좋겠습니다.:)