Cái nào tương đương với php drupal format_interval cho javascript?


8

Tôi muốn sử dụng với JavaScript và Drupal.t()tương đương format_interval().

Với PHP tôi sẽ sử dụng đoạn mã sau.

print t("!date ago", array("!date" => format_interval(time() - $lastActivity, 1)));

Tương đương trong JavaScript là gì?


Các tphương pháp là một văn bản Drupal vệ sinh và dịch tương đương với t()chức năng PHP từ Drupal core.
AyeshK

Câu trả lời:


4

Drupal không triển khai phiên bản JS của format_interval(); đây là một cổng thô (được kiểm tra tối thiểu):

Drupal.formatInterval = function(interval, granularity, langcode) {
  granularity = typeof granularity !== 'undefined' ? granularity : 2;
  langcode = typeof langcode !== 'undefined' ? langcode : null;

  var units = {
    '1 year|@count years': 31536000,
    '1 month|@count months': 2592000,
    '1 week|@count weeks': 604800,
    '1 day|@count days': 86400,
    '1 hour|@count hours': 3600,
    '1 min|@count min': 60,
    '1 sec|@count sec': 1
  },
  output = '';

  for (var key in units) {
    var keys = key.split('|'); 
    var value = units[key];
    if (interval >= value) {
      output += (output.length ? ' ' : '') + Drupal.formatPlural(Math.floor(interval / value), keys[0], keys[1], {}, { langcode: langcode });
      interval %= value;
      granularity--;
    }

    if (granularity == 0) {
      break;
    }
  }

  return output.length ? output : Drupal.t('0 sec', {}, { langcode: langcode });
}

Một số kết quả ngẫu nhiên sử dụng ở trên (dường như chúng khớp với chức năng PHP như mong đợi):

  • 3643 => 1 giờ 43 giây
  • 92900 => 1 ngày 1 giờ
  • 2592000 => 1 tháng
  • 9331200 => 3 tháng 2 tuần
  • 297605232 => 9 năm 5 tháng

1

Clives thực hiện đang làm tốt. Tuy nhiên, trình tổng hợp javascript của Drupals cần phân tích tất cả các tệp javascript cho các chuỗi có thể dịch. Vì Clive sử dụng các giá trị động cho Drupal.formatPlural, điều này sẽ không hoạt động ở đây.

Vì vậy, đây là một triển khai khác với bản dịch làm việc:

Drupal.formatInterval = function(interval, granularity) {
  granularity = typeof granularity !== 'undefined' ? granularity : 2;    
  output = '';

  while (granularity > 0) {
    var value = 0;
    if (interval >= 31536000) {
      value = 31536000;
      output += (output.length ? ' ' : '') + Drupal.formatPlural(Math.floor(interval / value), '1 year', '@count years');
    }
    else if (interval >= 2592000) {
      value = 2592000;
      output += (output.length ? ' ' : '') + Drupal.formatPlural(Math.floor(interval / value), '1 month', '@count months');
    }
    else if (interval >= 604800) {
      value = 604800;
      output += (output.length ? ' ' : '') + Drupal.formatPlural(Math.floor(interval / value), '1 week', '@count weeks');
    }
    else if (interval >= 86400) {
      value = 86400;
      output += (output.length ? ' ' : '') + Drupal.formatPlural(Math.floor(interval / value), '1 day', '@count days');
    }
    else if (interval >= 3600) {
      value = 3600;
      output += (output.length ? ' ' : '') + Drupal.formatPlural(Math.floor(interval / value), '1 hour', '@count hours');
    }
    else if (interval >= 60) {
      value = 60;
      output += (output.length ? ' ' : '') + Drupal.formatPlural(Math.floor(interval / value), '1 min', '@count min');
    }
    else if (interval >= 1) {
      value = 1;
      output += (output.length ? ' ' : '') + Drupal.formatPlural(Math.floor(interval / value), '1 sec', '@count sec');
    }

    interval %= value;
    granularity--;
  }

  return output.length ? output : Drupal.t('0 sec');
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.