CakePhp将变量转换为JS变量

时间:2017-08-24 13:32:39

标签: javascript php cakephp

我想从php文件中分割js代码,我将转换变量从php转移到js有问题。 CakePhp使用__('text {VAR}', [VAR]);

进行翻译

这是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 mix)

<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++;
  }
  ?>

2 个答案:

答案 0 :(得分:3)

使用I18next并使用gulp-i18next-conv转换* .po文件或使用i18next-po-loader但是po-loader要求您将webpack添加到堆栈中(如果尚未添加)。 / p>

这对我们来说是最好的,也是最完美的,因为它允许我们分享翻译。

答案 1 :(得分:1)

我们遇到了同样的问题,但只有一次使用,所以这是我的解决方案:

替换您的翻译字符串功能

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

使用cakePhp的翻译

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

并在你的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将是我的选择