2009-11-20 4 views
11

php (또는 일반적으로 gettext)에서 gettext는 변수를 동적 내용으로 간주 할 때 무엇을합니까?gettext는 동적 콘텐츠를 어떻게 처리합니까?

나는 두 가지 경우를 염두에두고 있습니다.

1) 제가 <?=$user1?> poked John <?=$user2?>이라고 가정 해 봅시다. 어쩌면 어떤 언어에서는 단어의 순서가 다릅니다. gettext는 어떻게 처리합니까? (아니, 나는 페이스 북을 만들지 않고있다.)

2) 데이터베이스에 몇 개의 카테고리를 저장한다고 가정 해 봅시다. 그들은 거의 없지만 데이터베이스에 저장합니다. <?php echo gettext($data['name']); ?>을하면 어떻게됩니까? 나는 번역가들도 그 카테고리 이름을 번역하길 원하지만 데이터베이스 자체에서 번역해야만합니까?

+1

이 질문을 읽는 독자는 "gettext .po 파일에서 정렬 된 변수를 지정하는 방법"에 관심이있을 수 있습니다. http://stackoverflow.com/questions/13979962/how-to -specify-ordered-variables-in-gettext-po-files – Ryan

답변

19

당신의 최선의 선택

덕분에 spritf() 함수를 사용하는 것입니다. 그런 다음 printf 표기법을 사용하여 문자열의 동적 내용을 처리합니다.

%s poked %s 

는 것 입력 :

function translate() 
{ 
    $args = func_get_args(); 
    $num = func_num_args(); 
    $args[0] = gettext($args[0]); 

    if($num <= 1) 
     return $args[0]; 

    return call_user_func_array('sprintf', $args); 

} 

지금 예를 하나 들어, 당신이 문자열을 변경할 것 : 여기 당신을 위해 쉽게이 문제를 처리하기 위해 얼마 전에 여기에 볼 수있는 기능입니다

<?php echo translate('%s poked %s', $user1, $user2); ?> 

translate() 함수는 poEdit으로 구문 분석합니다. % 문자열 자리 표시자를 수정하지 않고 문자열 "% s poked % s"을 원하는 언어로 번역하십시오. 그것들은 각각 user1과 user2와 함께 translate() 함수에 의한 출력을 대체 할 것이다. PHP 매뉴얼에서 sprintf()에 대한 자세한 내용은 고급 사용법을 참조하십시오.

문제 # 2. poEdit이 카테고리 이름을 포함하는 구문 분석 할 수있는 정적 파일을 만들어야합니다. 예를 들어 "misctranslations.php"

<?php 

_('Cars'); 
_('Trains'); 
_('Airplanes'); 

그런 다음 poEdit 구문 분석 misctranslations.php 있습니다. <?php echo gettext($data['name']); ?>

+4

사례 1은보다 쉽게 ​​처리 될 수 있습니다 :''. 여분의 함수는 필요 없으며 poedit은 여전히 ​​다른 문자열처럼 문자열을 파싱합니다. – DanMan

+1

"% s poked % s"을 (를) 번역하는 경우 두 사용자가 모두 같은 자리 표시 자로 표시되어있을 때 두 명의 사용자 이름을 어떻게 바꿀 수 있습니까? 일부 언어에서는 대상이 대상 앞에 표시됩니다. – bdsl

4

위의 해결 방법에 대한 유일한 문제는 정적 목록을 항상 손으로 관리해야한다는 것입니다. 추가 할 경우 다른 모든 문자열 앞에 새 문자열이 있거나 기존 문자열을 완전히 변경하면 번역을 위해 사용하는 소프트가 새 문자열을 혼동시킬 수 있으며 일부 번역은 손실 될 수 있습니다.

실제로이에 대한 기사 쓰고 있어요 (! 너무 적은 시간은 곧 그것을 완성하기 위해)하지만 내 제안 된 답변은 다음과 같이 진행됩니다

하기 Gettext이 문자열이 나타납니다 당신이 줄 번호를 저장할 수를 .po 파일 안의 코드. 문자열을 완전히 변경하면 .po 편집기는 문자열이 새로운 것은 아니지만 이전 문자열 인 것을 알 수 있습니다 (행 번호 덕분에).

내 솔루션은 데이터베이스를 읽고 모든 gettext 문자열을 사용하여 정적 파일을 만드는 스크립트를 작성하는 것입니다. Mark의 솔루션과 큰 차이점은 데이터베이스의 기본 키 (ID라고 부름)가 새 파일의 행 번호와 일치하도록하는 것입니다. 이 경우 한 원본 번역을 완전히 변경하면 줄은 여전히 ​​동일하며 번역자는 문자열을 인식합니다.

물론 더 새롭고 지능있는 .po 편집자가있을 수 있습니다.하지만 적어도 새로운 문자열로 문제가 생기면 해결할 수 있습니다.

내 2 센트.

1

@ 줄리아

나는 당신의 접근 방식이 실제로 잘 작동하지 않을 것이라고 생각합니다. 코드에서 일부 기능을 이동한다고 가정 해보십시오. 줄 번호가 달라지며 파일 이름도 다를 수 있습니다.

번역 ID 변경을 관리하는 유일한 방법은 .po 파일에서 유사한 ID를 찾으려는 것입니다. 편집자는 새 번역 텍스트를 기존 번역 텍스트와 병합하기위한 제안을 보여줄 수 있습니다 (매우 비슷하고 코드의 저장된 줄 번호에 번역 문자열이없는 경우).

1

코드에 어딘가가 있다면 : <?=sprintf(_('%s poked %s'), $user1, $user2)?> 여러분의 언어 중 하나가 매우 간단합니다. msgid "%s poked %s" msgstr "%2$s translation_of_poked %1$s"