__ () 또는 _e () 언어 번역 문자열 내의 HTML


24

번역 문자열을 작성하는 올바른 방법은 무엇입니까?

예를 들어

echo __( 'Hello ' . $first . ' you owe me money.' );
echo __( '<div><p>Top: ' . $t_margin . '</p>' . '<p>Bottom: ' . $b_margin . '</p></div>' )

문자열 및 / 또는 HTML을 추가해도 좋습니까? 먼저 수행 한 다음 다음과 같은 번역을 통해 실행해야합니다.

$html = '<div><p>Top: ' . $t_margin . '</p>' . '<p>Bottom: ' . $b_margin . '</p></div>';
echo __( $html ); 

답변:


41

__()함수 에는 두 번째 인수가 있습니다. 플러그인 또는 테마에 사용중인 도메인으로 설정해야합니다. 아래 예제에서는을 사용 'text_domain'합니다. 도메인 문자열은 고유해야합니다. 다른 도메인 문자열과 일치하지 않아야합니다. 텍스트 도메인 인수를 사용하지 않으면 기본적으로 'default'WordPress 도메인 이름이 사용됩니다. 자세한 내용은 링크를 참조하십시오.

항상 문자열 ( 'text_domain')을 사용하십시오 . 문자열에 변수, 함수 또는 상수를 사용하지 마십시오. 대부분의 (모든?) 번역 프로그램은 문자열이 없으면 볼 수 없습니다.

귀하의 코드 :

echo __( 'Hello ' . $first . ' you own me money.' );

문자열에 변수를 포함시키지 마십시오.

더 좋은 방법 :

echo sprintf( __( 'Hello %s you own me money.', 'text_domain' ), $first );

아니면 그냥 :

printf( __( 'Hello %s you own me money.', 'text_domain' ), $first );

%s자리 표시자는 사람에게 통역사에게 줄 이 들어 오고 있음을 알려줍니다. %d숫자에 사용하십시오 . 다른 자리 표시 자도 있습니다 .

(이 문장은 문법적으로 잘못된 영어입니다. 사용 중 'Hello %s, you owe me money.'또는 'Hello %s, you own my money.'당신이 의도 한 의미에 따라 다릅니다.)


귀하의 코드 :

$html = '<div><p>Top: ' . $t_margin . '</p>' . <p>Bottom: ' . $b_margin . '</p></div>';

HTML을 번역하지 마십시오. 모든 언어에서 동일합니다.

더 좋은 방법 :

$html = sprintf( '<div><p>%s</p><p>%s</p></div>', __( 'Top: ', 'text_domain' ) .  $t_margin, __( 'Bottom: ', 'text_domain' ) . $b_margin );

또는 여러 줄로 나눕니다.

$html = sprintf(
    '<div><p>%s</p><p>%s</p></div>',
    __( 'Top: ', 'text_domain' ) .  $t_margin,
    __( 'Bottom: ', 'text_domain' ) . $b_margin
);

그것이 무엇인지 알 수없는 경우 상단하단이 있습니다 당신은을 사용할 수 있습니다 _x()이러한 용어의 맥락을 설명 할 수 있습니다.


다른 번역 사례는 여기에서 찾을 수 있습니다. 국제화 : 아마 잘못하고있을 것입니다.


당신은 HTML을 번역하지 않는다고 말합니다. 번역되지 않았다는 것을 지적 할 수 있으며, 사전 번역 된 문자열의 기존 테이블에서 조회되고 있습니다. 번역자가 HTML을 제거하지 않으면 문자열에 HTML이 있어도 아무런 차이가 없습니다. 실제로 일부 상황에서는 정규식 검색 및 바꾸기보다 성능이 향상됩니다.
Twifty

관련이 없지만 주목할 점 textdomain은 리터럴 문자열이어야하며 변수 / 상수 / 속성이 될 수 없습니다.
brasofilo

@ brasofilo, 그 조언은 상단 근처의 답변에 작성되었지만 반복됩니다. 고객을 위해 작성한 몇 가지 사용자 정의 플러그인 에서이 실수를했습니다.
Charles Clarkson

일에 대한 sprintf(). 그것은 번역 가능한 문자열에 HTML을 사용하는 방법입니다.
helgatheviking

sprintf()좀 더 깨끗한 외모가 아닌 다른 방법 으로 도움을받는 방법을 모르겠습니다 . 당신은 같은 HTML의 내부와 문장이 있으면 Some text with a <strong>strong</strong> word inside.가능 번역 전체 문장을 번역하지 않는 것입니다 방법 Some text with a, strongword inside(아무 의미가없는) 개별적으로합니다.
phpheini

4

문자열의 변수 문제는 이미 언급되었으므로 다루지 않습니다.

문자열을 정적으로 유지하려고합니다. 즉, 내용이 변경되지 않습니다. 또한 불필요한 HTML을 유지하려고합니다.

__( '<p>Hello World!</p>' );
__( '<h1>Hello World!</h1>' );

위의 내용은 본질적으로 동일한 텍스트에 대해 두 개의 행을 차지합니다. 다음과 같이 다시 작성할 수 있습니다.

'<p>' . __( 'Hello World!' ) . '</p>'
'<h1>' . __( 'Hello World!' ) . '</h1>'

단일 행으로 줄입니다.

때로는 텍스트의 HTML을 피할 수없는 경우가 있습니다. 예를 들어 보자.

__( 'You currently owe <b>%s</b> dollars' );

언어는 문법이므로 텍스트를 나누면 번역하는 사람에게 문제가 발생할 수 있습니다.

엄지 손가락의 규칙. 문장 중간에 HTML 텍스트 서식 태그가 정상입니다. HTML로 시작하고 끝나는 문장은 공간을 낭비합니다.


마지막 예에서 삽입 된 인수 주위에 굵은 체 태그를 감쌀 수 "<b>$string</b>"있습니다. 그런 다음을 사용할 수 있습니다 'You currently owe %s dollars'. 그러나 자리 표시자가 _n()필요한 함수 와 함께 사용하면 유지해야 할 수도 있습니다 %d.
Charles Clarkson

@CharlesClarkson 잘 했어. 아마도 %s좀 더 명확하게하기 위해를 생략해야했을 것 입니다.
Twifty
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.