¿Cuál es el equivalente de php drupal format_interval para javascript?

8

Quiero usar con JavaScript y Drupal.t()el equivalente de format_interval().

Con PHP, usaría el siguiente código.

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

¿Cuál sería el equivalente en JavaScript?

Iulian Boiculese
fuente
El tmétodo es un texto de Drupal que desinfecta y traduce equivalente a la t()función PHP del núcleo de Drupal.
AyeshK

Respuestas:

4

Drupal no implementa una versión JS de format_interval(); Este es un puerto aproximado (probado mínimamente):

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 });
}

Algunos resultados aleatorios usando lo anterior (parecen coincidir con la función PHP como se esperaba):

  • 3643 => 1 hora 43 segundos
  • 92900 => 1 día 1 hora
  • 2592000 => 1 mes
  • 9331200 => 3 meses 2 semanas
  • 297605232 => 9 años 5 meses
Clive
fuente
1

La implementación de Clives está funcionando bien. Sin embargo, el agregador de JavaScript Drupals necesita analizar todos los archivos de JavaScript para cadenas traducibles. Como Clive usa valores dinámicos para Drupal.formatPlural, esto no funcionará aquí.

Así que aquí hay otra implementación con traducción de trabajo:

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');
}
haggis
fuente