JavaScriptのphp drupal format_intervalに相当するものはどれですか?


8

JavaScriptとDrupal.t()同等のものを使用したいと思いますformat_interval()

PHPでは、次のコードを使用します。

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

JavaScriptで同等のものは何でしょうか?


このtメソッドは、t()DrupalコアのPHP関数に相当するDrupalテキストのサニタイズおよび変換です。
AyeshK 2013年

回答:


4

DrupalはJSバージョンのを実装していませんformat_interval()。これはおおまかな(最小限のテスト)ポートです。

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

上記を使用したいくつかのランダムな結果(期待どおりにPHP関数と一致するようです):

  • 3643 => 1時間43秒
  • 92900 => 1日1時間
  • 2592000 => 1か月
  • 9331200 => 3か月2週間
  • 297605232 => 9年5か月

1

Clivesの実装は順調です。ただし、DrupalsのJavaScriptアグリゲーターは、すべてのJavaScriptファイルを解析して、翻訳可能な文字列を見つける必要があります。CliveはDrupal.formatPluralに動的な値を使用するため、これはここでは機能しません。

だからここに翻訳が機能する別の実装があります:

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');
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.