2012-01-01 3 views
5

나는 ustache를 i18n (php, Wordpress 내)과 함께 사용하려고합니다. 나는 그런 다음 출력에 국제화 문자열 템플릿, 나는 단순히이매개 변수가있는 콧수염 i18n

$context = new mytache; 
$template = "<div>{{#__}}String to translate{{/__}}</div>"; 
$m = new Mustache; 
echo $m->render($template, $context); 

지금까지 모든 것이 괜찮 할 수있는이

class my_i18n { 
    public function __trans($string) { 
    return __($string, 'theme-name'); 
    } 
} 
class mytache { 
    public function __() 
    { 
    return array('my_i18n', '__trans'); 
    } 
} 

같은 기본적인 __ 잘 작동 기능, 뭔가있어. 그러나, 나는 매개 변수로 문자열을 번역 할 수 있기를 원한다. 즉 sprint_f(__('Account Balance: %s'), $balance);에 해당합니다.

내가 {{#__}}Account Balance: {{balance}}{{/__}}과 같은 것을하면 작동하지 않는 것 같습니다. 내면 태그가 먼저 변환되어 번역문을 찾을 수 없기 때문에 추측하고 있습니다.

콧수염으로 이것을 어떻게 완성 할 수 있습니까?

UPDATE :

class I18nMapper { 
    public static function translate($str) { 
     $matches = array(); 
     // searching for all {{tags}} in the string 
     if (preg_match_all('/{{\s*.*?\s*}}/',$str, &$matches)) { 
      // first we remove ALL tags and replace with %s and retrieve the translated version 
      $result = __(preg_replace('/{{\s*.*?\s*}}/','%s', $str), 'theme-name'); 
      // then replace %s back to {{tag}} with the matches 
      return vsprintf($result, $matches[0]); 
     } 
     else 
      return __($str, 'theme-name'); 
    } 
} 

class mytache { 
    public function __() 
    { 
    return array('I18nMapper', 'trans'); 
    } 
} 
+1

"작동하지 않습니다">. < –

+0

콧수염 템플리트에서 문자열을 추출하는 데 사용한 키워드는 무엇입니까? –

답변

4

I added an i18n example here ... 꽤 시끄럽지만 테스트가 통과됩니다. 그것은 마치 당신이하고있는 것과 거의 같습니다. 구식 버전의 콧수염을 사용하고있을 가능성이 있습니까? 이 스펙은 다양한 변수 보간 규칙을 지정하는 데 사용되었으므로이 사용 사례는 예상대로 작동하지 않습니다.

+0

이것은 내가 찾고있는 것 같아요 ... github의 [이 댓글 (https://github.com/bobthecow/mustache.php/issues/69#issuecomment-3347583))과 함께 – gingerlime

0

내가 정상, 완전한 기능을 템플릿 엔진을 사용하는 것이 좋습니다 것입니다 내 대신하여 : 여기 (bobthecow에서 대규모의 도움으로) 최종 결과 미리보기가 있습니다. 나는 작은 것이 위대하고 모든 것이지만, 예를 들어 나뭇 가지가 훨씬 더 진보 된 것을 이해합니다. 그래서 나는 그것을 추천 할 것이다.

콧수염에 관하여. 번역 방법을 확장 할 수 없습니까? 예를 들어, 당신은 이것은 매우 추한 예입니다 {{#__}}Account Balance: #balance#{{/__}}

function __($string, $replacement) 
{ 
    $replaceWith = ''; 

    if ('balance' == $replacement) 
    { 
     $replaceWith = 234.56; 
    } 

    return str_replace('#' . $replacement . '#', $replaceWith, $string); 
} 

class my_i18n 
{ 
    public function __trans($string) 
    { 
     $matches  = array(); 
     $replacement = ''; 

     preg_match('~(\#[a-zA-Z0-9]+\#)~', $string, $matches); 

     if (! empty($matches)) 
     { 
      $replacement = trim($matches[0], '#'); 
     } 

     return __($string, $replacement); 
    } 
} 

$Mustache = new Mustache(); 
$template = '{{#__}}Some lime #tag#{{/__}}'; 
$MyTache = new mytache(); 

echo $Mustache->render($template, $MyTache); 

통과,하지만 당신은 자신을 공상 할 수 있습니다. 내가 콧수염을 보니 자기가 원하는대로 할 수는 없을 것입니다.

희망을 얻었습니다.

+0

노력에 감사드립니다. 이것은 실제로 문제를 해결하는 것이 아니며, 나는 그것을 정말로 깨끗하게 부르지 않을 것입니다. 어떤면에서는 모든 태그와 조건문 등을 유지해야하는 상황이 더욱 악화됩니다. Mustache에는 템플릿 내에서 국제화 지원 기능이 내장되어 있지 않은 것 같습니다. – gingerlime

+0

스스로 해결하십시오. 이것은 결코 깨끗한 해결책이라고 말하지 않았습니다. 나는 첫 번째 패러 그래프에서 이미 정상적인 기능을 갖춘 템플릿 엔진의 사용을 제안했다. ;) – Eugene