2012-01-01 32 views
5

Tôi đang cố gắng sử dụng Mustache cùng với i18n (php, trong Wordpress). Tôi đã có các chức năng cơ bản __ làm việc độc đáo, một cái gì đó như thế nàymustache i18n với tham số

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

Sau đó, để ra một mẫu với một chuỗi i18n, tôi có thể chỉ đơn giản là thực hiện điều này

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

Cho đến nay mọi thứ đều tốt. Tuy nhiên, tôi muốn có thể dịch các chuỗi với các tham số. tức là tương đương với sprint_f(__('Account Balance: %s'), $balance);.

Dường như nếu tôi làm điều gì đó như {{#__}}Account Balance: {{balance}}{{/__}} thì nó không hoạt động. Tôi đoán vì thẻ bên trong được chuyển đổi đầu tiên và do đó không thể tìm thấy bản dịch cho cụm từ.

Bất kỳ ý tưởng nào để đạt được điều này một cách rõ ràng với Mustache?

UPDATE: đây là đoạn kết quả cuối cùng (với sự giúp đỡ lớn từ 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'); 
    } 
} 
+1

"nó không hoạt động">. < –

+0

Bạn đã sử dụng từ khóa nào để trích xuất các chuỗi từ mẫu ria mép? –

Trả lời

4

I added an i18n example here ... nó khá cheesy, nhưng thử nghiệm vượt qua. Có vẻ như nó gần giống như những gì bạn đang làm. Có thể bạn đang sử dụng phiên bản Mustache lỗi thời không? Thông số được sử dụng để chỉ định các quy tắc nội suy biến khác nhau, điều này sẽ làm cho trường hợp sử dụng này không hoạt động như mong đợi.

+0

Điều này giống như điều tôi đang tìm kiếm ... cùng với [bình luận này] (https://github.com/bobthecow/mustache.php/issues/69#issuecomment-3347583) trên github – gingerlime

0

Thay mặt tôi, tôi sẽ đề nghị sử dụng bình thường, mẫu động cơ đầy đủ chức năng. Tôi hiểu, điều đó thật tuyệt vời và tất cả mọi thứ, nhưng ví dụ Twig thì tiến bộ hơn nhiều. Vì vậy, tôi sẽ giới thiệu nó.

Giới thiệu về bộ ria mép. Bạn không thể chỉ mở rộng phương pháp dịch của bạn! Ví dụ: bạn vượt qua {{#__}}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); 

Đây là ví dụ rất xấu, nhưng bạn có thể làm cho nó trở nên lạ mắt. Như tôi thấy Mustache trên của riêng nó sẽ không thể làm những gì bạn muốn.

Hy vọng điều đó sẽ hữu ích.

+0

Cảm ơn bạn đã nỗ lực. Điều này là không thực sự giải quyết vấn đề, và tôi sẽ không thực sự gọi nó là sạch sẽ. Nó làm cho mọi thứ tồi tệ hơn trong một số cách phải duy trì tất cả các thẻ và điều kiện, vv Thật đáng ngạc nhiên rằng Mustache dường như không có hỗ trợ tích hợp cho quốc tế trong các mẫu. – gingerlime

+0

Tự làm một mình. Không bao giờ nói, đây là một giải pháp sạch. Tôi là parargaph đầu tiên tôi đã đề nghị sử dụng một công cụ mẫu đầy đủ chức năng bình thường. ;) – Eugene

Các vấn đề liên quan