усы i18n с параметрами - PullRequest
       17

усы i18n с параметрами

5 голосов
/ 02 января 2012

Я пытаюсь использовать Усы вместе с i18n (php, в Wordpress). У меня базовая функциональность __ работает нормально, что-то вроде этого

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

Затем, чтобы вывести шаблон со строкой i18n, я могу просто сделать это

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

Пока все в порядке. Тем не менее, я хочу иметь возможность переводить строки с параметрами. то есть эквивалент sprint_f(__('Account Balance: %s'), $balance);.

Кажется, что если я сделаю что-то вроде {{#__}}Account Balance: {{balance}}{{/__}}, это не сработает. Я предполагаю, потому что внутренний тег конвертируется первым и, следовательно, перевод фразы не найден.

Есть идеи, как добиться этого чисто с усами?

ОБНОВЛЕНИЕ: вот фрагмент конечного результата (с огромной помощью bobthecow):

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');
  }   
}   

Ответы [ 2 ]

4 голосов
/ 04 января 2012

Я добавил здесь пример i18n ... это довольно глупо, но тест проходит.Похоже, это почти то же самое, что вы делаете.Возможно ли, что вы используете устаревшую версию Усов?Спецификация использовалась для указания различных правил интерполяции переменных, что могло бы привести к тому, что этот вариант использования не будет работать должным образом.

0 голосов
/ 02 января 2012

От своего имени я бы предложил использовать обычный полнофункциональный шаблонизатор.Я понимаю, что маленький большой и все, но, например, Twig гораздо более продвинутый.Поэтому я бы порекомендовал это.

Насчет усов.Не могли бы вы просто расширить свой метод перевода!Например, вы передаете {{#__}}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 );

Это очень уродливый пример, но вы можете сделать это сами.Как я вижу, усы сами по себе не смогут делать то, что вы хотите.

Надеюсь, это помогло.

...