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

Я пытаюсь использовать Mustache вместе с 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}}{{/__}}, это не сработает. Я предполагаю, что внутренний тег преобразуется первым, и поэтому перевод фразы не может быть найден.

Любые идеи, как добиться этого чисто с помощью Mustache?

ОБНОВЛЕНИЕ: вот фрагмент конечного результата (с огромной помощью 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');
  }   
}   

person gingerlime    schedule 01.01.2012    source источник
comment
Какое ключевое слово вы использовали для извлечения строк из шаблона усов?   -  person Dave Kiss    schedule 15.01.2014


Ответы (2)


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

person bobthecow    schedule 03.01.2012
comment
Похоже, это то, что я искал... вместе с этим комментарием на гитхабе - person gingerlime; 04.01.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 );

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

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

person Eugene    schedule 02.01.2012
comment
Спасибо за попытку. На самом деле это не решает проблему, и я бы не назвал это чистым. В некотором смысле это усугубляет ситуацию, когда приходится поддерживать все эти теги, условия и т. Д. Удивительно, что Mustache не имеет встроенной поддержки интернационализации в шаблонах. - person gingerlime; 02.01.2012
comment
Сделай сам. Никогда не говорил, что это чистое решение. В первом абзаце я уже предлагал использование нормального полнофункционального шаблонизатора. ;) - person Eugene; 02.01.2012