Quel est l'équivalent de php drupal format_interval pour javascript?


8

Je veux utiliser avec JavaScript et Drupal.t()l'équivalent de format_interval().

Avec PHP, j'utiliserais le code suivant.

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

Quel serait l'équivalent en JavaScript?


La tméthode est un texte Drupal assainissant et traduisant équivalent à la t()fonction PHP du noyau Drupal.
AyeshK

Réponses:


4

Drupal n'implémente pas de version JS de format_interval(); il s'agit d'un port approximatif (testé de façon minimale):

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

Quelques résultats aléatoires en utilisant ce qui précède (ils semblent correspondre à la fonction PHP comme prévu):

  • 3643 => 1 heure 43 sec
  • 92900 => 1 jour 1 heure
  • 2592000 => 1 mois
  • 9331200 => 3 mois 2 semaines
  • 297605232 => 9 ans 5 mois

1

La mise en œuvre de Clives se porte bien. Cependant, l'agrégateur javascript de Drupals doit analyser tous les fichiers javascript pour les chaînes traduisibles. Comme Clive utilise des valeurs dynamiques pour Drupal.formatPlural, cela ne fonctionnera pas ici.

Voici donc une autre implémentation avec traduction de travail:

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');
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.