2017-08-24 136 views
3

我想從PHP文件中分離js代碼,並且我將轉換變量從php轉換爲js時出現問題。 CakePhp使用__('text {VAR}', [VAR])進行翻譯;CakePhp將變量作爲JS變量

這裏是一個PHP文件

$orders = [1=>...,2=>...., 3=>..., 4=>...]; 

<script> 
    var allOrders = <?= json_encode($orders ?? null) ?>; 

    var text_ok = '<?= __('OK') ?>'; 
    . 
    . 
    . 
    var text_doYouWantToDeleteOrder = '<?= __('Do you really want to delete house No. {0}?', [json_encode($order->id)]); ?>'; 

</script> 

結束代碼和我的外部文件(僅JS):

<script type="text/javascript"> 
    var i = 0; 
    $.each(allOrders, function (index, order) { 
    $('#delete-order-' + order.id).click(function() { 
     swal({ 
     title: text_doYouWantToDeleteOrder, 
     ... 
     closeOnCancel: true 
     }, function (isConfirm) { 
     if (isConfirm) { 
    ... 
     } 
     }); 
    }); 
    i++; 
    }); 

所以問題是如何從第一個文件匹配翻譯到二得到:

你真的想刪除1號房嗎?
你真的想刪除5號房嗎?
你真的想刪除8號房嗎?

舊工作的代碼(PHP和JS混合)

<script type="text/javascript"> 
    <?php 
    $i = 0; 
    foreach ($orders as $order) { 
    ?> 
    $('#delete-order-<?= $order->id ?>').click(function() { 
    swal({ 
     title: "<?= __('Do you really want to delete house No. {0}?', [$order->id]); ?>", 
     ... 
     closeOnCancel: true 
    }, function (isConfirm) { 
     if (isConfirm) { 
     ... 
     } 
    }); 
    }); 
    <?php 
    $i++; 
    } 
    ?> 

回答

3

使用I18next和使用gulp-i18next-conv轉換您的* .po文件,或者使用i18next-po-loader但寶裝載機需要你的WebPack添加到你的籌碼,如果你還沒有。

這對我們來說是最好的和最無懈可擊的,因爲它可以讓我們分享翻譯。

1

我們有同樣的問題,但只能一次性使用,所以這是我的解決方案:

從CakePHP的

function translateMe(param) { 
    var text = "<?= __('Do you really want to delete order No. {0}?'); ?>"; 
    return strFormat(text, [param]); 
    } 

更換你的翻譯字符串函數

function strFormat(source, params) { 
    params.forEach(function (n, i) { 
    source = source.replace(new RegExp("\\{" + i + "\\}", "g"), n); 
    }); 
    return source; 

用翻譯並用於您的swal

var i = 0; 
$.each(orderData, function (key, order) { 
    $('#delete-order-' + order.id).click(function() { 
    swal({ 
     title: translateMe(order.id), 
     ... 
     closeOnCancel: true 
    }, function (isConfirm) { 
     if (isConfirm) { 
     ... 
     } 
    }); 
    }); 
    i++; 
}); 

但是對於經常使用https://www.i18next.com/getting-started.html將是我的選擇