v1.18.x
Julian Lam 10 years ago
parent 64ab43b7fc
commit 3d9415b65e

@ -44,9 +44,7 @@
};
translator.prepareDOM = function() {
// Load the appropriate timeago locale file
if (config.userLang !== 'en_GB' && config.userLang !== 'en_US') {
// Correct NodeBB language codes to timeago codes, if necessary
// Load the appropriate timeago locale file, and correct NodeBB language codes to timeago codes, if necessary
var languageCode;
switch(config.userLang) {
case 'cs':
@ -80,9 +78,25 @@
$.getScript(RELATIVE_PATH + '/vendor/jquery/timeago/locales/jquery.timeago.' + languageCode + '.js').success(function() {
$('.timeago').timeago();
translator.timeagoShort = $.extend({}, jQuery.timeago.settings.strings);
// Retrieve the shorthand timeago values as well
$.getScript(RELATIVE_PATH + '/vendor/jquery/timeago/locales/jquery.timeago.' + languageCode + '-short.js').success(function() {
// Switch back to long-form
translator.toggleTimeagoShorthand();
}).fail(function() {
$.getScript(RELATIVE_PATH + '/vendor/jquery/timeago/locales/jquery.timeago.en-short.js').success(function() {
// Switch back to long-form
translator.toggleTimeagoShorthand();
});
});
}).fail(function() {
$.getScript(RELATIVE_PATH + '/vendor/jquery/timeago/locales/jquery.timeago.en-short.js').success(function() {
// Switch back to long-form
translator.toggleTimeagoShorthand();
$.getScript(RELATIVE_PATH + '/vendor/jquery/timeago/locales/jquery.timeago.en.js');
});
});
// Add directional code if necessary
translator.translate('[[language:dir]]', function(value) {
@ -90,35 +104,12 @@
$('html').css('direction', value).attr('data-dir', value);
}
});
}
};
translator.toggleTimeagoShorthand = function() {
if (!translator.timeagoStrings) {
translator.timeagoStrings = $.extend({}, jQuery.timeago.settings.strings);
jQuery.timeago.settings.strings = {
prefixAgo: null,
prefixFromNow: null,
suffixAgo: "",
suffixFromNow: "",
seconds: "1m",
minute: "1m",
minutes: "%dm",
hour: "1h",
hours: "%dh",
day: "1d",
days: "%dd",
month: "1mo",
months: "%dmo",
year: "1yr",
years: "%dyr",
wordSeparator: " ",
numbers: []
};
} else {
jQuery.timeago.settings.strings = $.extend({}, translator.timeagoStrings);
delete translator.timeagoStrings;
}
var tmp = $.extend({}, jQuery.timeago.settings.strings);
jQuery.timeago.settings.strings = $.extend({}, translator.timeagoShort);
translator.timeagoShort = $.extend({}, tmp);
};
translator.translate = function (text, language, callback) {

@ -0,0 +1,221 @@
/**
* Timeago is a jQuery plugin that makes it easy to support automatically
* updating fuzzy timestamps (e.g. "4 minutes ago" or "about 1 day ago").
*
* @name timeago
* @version 1.4.1
* @requires jQuery v1.2.3+
* @author Ryan McGeary
* @license MIT License - http://www.opensource.org/licenses/mit-license.php
*
* For usage and examples, visit:
* http://timeago.yarp.com/
*
* Copyright (c) 2008-2015, Ryan McGeary (ryan -[at]- mcgeary [*dot*] org)
*/
(function (factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(['jquery'], factory);
} else {
// Browser globals
factory(jQuery);
}
}(function ($) {
$.timeago = function(timestamp) {
if (timestamp instanceof Date) {
return inWords(timestamp);
} else if (typeof timestamp === "string") {
return inWords($.timeago.parse(timestamp));
} else if (typeof timestamp === "number") {
return inWords(new Date(timestamp));
} else {
return inWords($.timeago.datetime(timestamp));
}
};
var $t = $.timeago;
$.extend($.timeago, {
settings: {
refreshMillis: 60000,
allowPast: true,
allowFuture: false,
localeTitle: false,
cutoff: 0,
strings: {
prefixAgo: null,
prefixFromNow: null,
suffixAgo: "ago",
suffixFromNow: "from now",
inPast: 'any moment now',
seconds: "less than a minute",
minute: "about a minute",
minutes: "%d minutes",
hour: "about an hour",
hours: "about %d hours",
day: "a day",
days: "%d days",
month: "about a month",
months: "%d months",
year: "about a year",
years: "%d years",
wordSeparator: " ",
numbers: []
}
},
inWords: function(distanceMillis) {
if(!this.settings.allowPast && ! this.settings.allowFuture) {
throw 'timeago allowPast and allowFuture settings can not both be set to false.';
}
var $l = this.settings.strings;
var prefix = $l.prefixAgo;
var suffix = $l.suffixAgo;
if (this.settings.allowFuture) {
if (distanceMillis < 0) {
prefix = $l.prefixFromNow;
suffix = $l.suffixFromNow;
}
}
if(!this.settings.allowPast && distanceMillis >= 0) {
return this.settings.strings.inPast;
}
var seconds = Math.abs(distanceMillis) / 1000;
var minutes = seconds / 60;
var hours = minutes / 60;
var days = hours / 24;
var years = days / 365;
function substitute(stringOrFunction, number) {
var string = $.isFunction(stringOrFunction) ? stringOrFunction(number, distanceMillis) : stringOrFunction;
var value = ($l.numbers && $l.numbers[number]) || number;
return string.replace(/%d/i, value);
}
var words = seconds < 45 && substitute($l.seconds, Math.round(seconds)) ||
seconds < 90 && substitute($l.minute, 1) ||
minutes < 45 && substitute($l.minutes, Math.round(minutes)) ||
minutes < 90 && substitute($l.hour, 1) ||
hours < 24 && substitute($l.hours, Math.round(hours)) ||
hours < 42 && substitute($l.day, 1) ||
days < 30 && substitute($l.days, Math.round(days)) ||
days < 45 && substitute($l.month, 1) ||
days < 365 && substitute($l.months, Math.round(days / 30)) ||
years < 1.5 && substitute($l.year, 1) ||
substitute($l.years, Math.round(years));
var separator = $l.wordSeparator || "";
if ($l.wordSeparator === undefined) { separator = " "; }
return $.trim([prefix, words, suffix].join(separator));
},
parse: function(iso8601) {
var s = $.trim(iso8601);
s = s.replace(/\.\d+/,""); // remove milliseconds
s = s.replace(/-/,"/").replace(/-/,"/");
s = s.replace(/T/," ").replace(/Z/," UTC");
s = s.replace(/([\+\-]\d\d)\:?(\d\d)/," $1$2"); // -04:00 -> -0400
s = s.replace(/([\+\-]\d\d)$/," $100"); // +09 -> +0900
return new Date(s);
},
datetime: function(elem) {
var iso8601 = $t.isTime(elem) ? $(elem).attr("datetime") : $(elem).attr("title");
return $t.parse(iso8601);
},
isTime: function(elem) {
// jQuery's `is()` doesn't play well with HTML5 in IE
return $(elem).get(0).tagName.toLowerCase() === "time"; // $(elem).is("time");
}
});
// functions that can be called via $(el).timeago('action')
// init is default when no action is given
// functions are called with context of a single element
var functions = {
init: function(){
var refresh_el = $.proxy(refresh, this);
refresh_el();
var $s = $t.settings;
if ($s.refreshMillis > 0) {
this._timeagoInterval = setInterval(refresh_el, $s.refreshMillis);
}
},
update: function(time){
var parsedTime = $t.parse(time);
$(this).data('timeago', { datetime: parsedTime });
if($t.settings.localeTitle) $(this).attr("title", parsedTime.toLocaleString());
refresh.apply(this);
},
updateFromDOM: function(){
$(this).data('timeago', { datetime: $t.parse( $t.isTime(this) ? $(this).attr("datetime") : $(this).attr("title") ) });
refresh.apply(this);
},
dispose: function () {
if (this._timeagoInterval) {
window.clearInterval(this._timeagoInterval);
this._timeagoInterval = null;
}
}
};
$.fn.timeago = function(action, options) {
var fn = action ? functions[action] : functions.init;
if(!fn){
throw new Error("Unknown function name '"+ action +"' for timeago");
}
// each over objects here and call the requested function
this.each(function(){
fn.call(this, options);
});
return this;
};
function refresh() {
//check if it's still visible
if(!$.contains(document.documentElement,this)){
//stop if it has been removed
$(this).timeago("dispose");
return this;
}
var data = prepareData(this);
var $s = $t.settings;
if (!isNaN(data.datetime)) {
if ( $s.cutoff == 0 || Math.abs(distance(data.datetime)) < $s.cutoff) {
$(this).text(inWords(data.datetime));
}
}
return this;
}
function prepareData(element) {
element = $(element);
if (!element.data("timeago")) {
element.data("timeago", { datetime: $t.datetime(element) });
var text = $.trim(element.text());
if ($t.settings.localeTitle) {
element.attr("title", element.data('timeago').datetime.toLocaleString());
} else if (text.length > 0 && !($t.isTime(element) && element.attr("title"))) {
element.attr("title", text);
}
}
return element.data("timeago");
}
function inWords(date) {
return $t.inWords(distance(date));
}
function distance(date) {
return (new Date().getTime() - date.getTime());
}
// fix for IE6 suckage
document.createElement("abbr");
document.createElement("time");
}));

@ -1,16 +0,0 @@
/**
* Timeago is a jQuery plugin that makes it easy to support automatically
* updating fuzzy timestamps (e.g. "4 minutes ago" or "about 1 day ago").
*
* @name timeago
* @version 1.3.1
* @requires jQuery v1.2.3+
* @author Ryan McGeary
* @license MIT License - http://www.opensource.org/licenses/mit-license.php
*
* For usage and examples, visit:
* http://timeago.yarp.com/
*
* Copyright (c) 2008-2013, Ryan McGeary (ryan -[at]- mcgeary [*dot*] org)
*/
!function(factory){if(typeof define==="function"&&define.amd){define(["jquery"],factory)}else{factory(jQuery)}}(function($){$.timeago=function(timestamp){if(timestamp instanceof Date){return inWords(timestamp)}else if(typeof timestamp==="string"){return inWords($.timeago.parse(timestamp))}else if(typeof timestamp==="number"){return inWords(new Date(timestamp))}else{return inWords($.timeago.datetime(timestamp))}};var $t=$.timeago;$.extend($.timeago,{settings:{refreshMillis:6e4,allowFuture:false,localeTitle:false,cutoff:0,strings:{prefixAgo:null,prefixFromNow:null,suffixAgo:"ago",suffixFromNow:"from now",seconds:"less than a minute",minute:"about a minute",minutes:"%d minutes",hour:"about an hour",hours:"about %d hours",day:"a day",days:"%d days",month:"about a month",months:"%d months",year:"about a year",years:"%d years",wordSeparator:" ",numbers:[]}},inWords:function(distanceMillis){var $l=this.settings.strings;var prefix=$l.prefixAgo;var suffix=$l.suffixAgo;if(this.settings.allowFuture){if(distanceMillis<0){prefix=$l.prefixFromNow;suffix=$l.suffixFromNow}}var seconds=Math.abs(distanceMillis)/1e3;var minutes=seconds/60;var hours=minutes/60;var days=hours/24;var years=days/365;function substitute(stringOrFunction,number){var string=$.isFunction(stringOrFunction)?stringOrFunction(number,distanceMillis):stringOrFunction;var value=$l.numbers&&$l.numbers[number]||number;return string.replace(/%d/i,value)}var words=seconds<45&&substitute($l.seconds,Math.round(seconds))||seconds<90&&substitute($l.minute,1)||minutes<45&&substitute($l.minutes,Math.round(minutes))||minutes<90&&substitute($l.hour,1)||hours<24&&substitute($l.hours,Math.round(hours))||hours<42&&substitute($l.day,1)||days<30&&substitute($l.days,Math.round(days))||days<45&&substitute($l.month,1)||days<365&&substitute($l.months,Math.round(days/30))||years<1.5&&substitute($l.year,1)||substitute($l.years,Math.round(years));var separator=$l.wordSeparator||"";if($l.wordSeparator===undefined){separator=" "}return $.trim([prefix,words,suffix].join(separator))},parse:function(iso8601){var s=$.trim(iso8601);s=s.replace(/\.\d+/,"");s=s.replace(/-/,"/").replace(/-/,"/");s=s.replace(/T/," ").replace(/Z/," UTC");s=s.replace(/([\+\-]\d\d)\:?(\d\d)/," $1$2");s=s.replace(/([\+\-]\d\d)$/," $100");return new Date(s)},datetime:function(elem){var iso8601=$t.isTime(elem)?$(elem).attr("datetime"):$(elem).attr("title");return $t.parse(iso8601)},isTime:function(elem){return $(elem).get(0).tagName.toLowerCase()==="time"}});var functions={init:function(){var refresh_el=$.proxy(refresh,this);refresh_el();var $s=$t.settings;if($s.refreshMillis>0){this._timeagoInterval=setInterval(refresh_el,$s.refreshMillis)}},update:function(time){var parsedTime=$t.parse(time);$(this).data("timeago",{datetime:parsedTime});if($t.settings.localeTitle)$(this).attr("title",parsedTime.toLocaleString());refresh.apply(this)},updateFromDOM:function(){$(this).data("timeago",{datetime:$t.parse($t.isTime(this)?$(this).attr("datetime"):$(this).attr("title"))});refresh.apply(this)},dispose:function(){if(this._timeagoInterval){window.clearInterval(this._timeagoInterval);this._timeagoInterval=null}}};$.fn.timeago=function(action,options){var fn=action?functions[action]:functions.init;if(!fn){throw new Error("Unknown function name '"+action+"' for timeago")}this.each(function(){fn.call(this,options)});return this};function refresh(){var data=prepareData(this);var $s=$t.settings;if(!isNaN(data.datetime)){if($s.cutoff==0||distance(data.datetime)<$s.cutoff){$(this).text(inWords(data.datetime))}}return this}function prepareData(element){element=$(element);if(!element.data("timeago")){element.data("timeago",{datetime:$t.datetime(element)});var text=$.trim(element.text());if($t.settings.localeTitle){element.attr("title",element.data("timeago").datetime.toLocaleString())}else if(text.length>0&&!($t.isTime(element)&&element.attr("title"))){element.attr("title",text)}}return element.data("timeago")}function inWords(date){return $t.inWords(distance(date))}function distance(date){return(new Date).getTime()-date.getTime()}document.createElement("abbr");document.createElement("time")});

@ -4,15 +4,15 @@ jQuery.timeago.settings.strings = {
prefixFromNow: null,
suffixAgo: "tagasi",
suffixFromNow: "pärast",
seconds: function(n, d) { return d < 0 ? "vähem kui minuti aja" : "vähem kui minut aega" },
minute: function(n, d) { return d < 0 ? "umbes minuti aja" : "umbes minut aega" },
minutes: function(n, d) { return d < 0 ? "%d minuti" : "%d minutit" },
hour: function(n, d) { return d < 0 ? "umbes tunni aja" : "umbes tund aega" },
hours: function(n, d) { return d < 0 ? "%d tunni" : "%d tundi" },
day: function(n, d) { return d < 0 ? "umbes päeva" : "umbes päev" },
days: function(n, d) { return d < 0 ? "%d päeva" : "%d päeva" },
month: function(n, d) { return d < 0 ? "umbes kuu aja" : "umbes kuu aega" },
months: function(n, d) { return d < 0 ? "%d kuu" : "%d kuud" },
year: function(n, d) { return d < 0 ? "umbes aasta aja" : "umbes aasta aega" },
years: function(n, d) { return d < 0 ? "%d aasta" : "%d aastat" }
seconds: function(n, d) { return d < 0 ? "vähem kui minuti aja" : "vähem kui minut aega"; },
minute: function(n, d) { return d < 0 ? "umbes minuti aja" : "umbes minut aega"; },
minutes: function(n, d) { return d < 0 ? "%d minuti" : "%d minutit"; },
hour: function(n, d) { return d < 0 ? "umbes tunni aja" : "umbes tund aega"; },
hours: function(n, d) { return d < 0 ? "%d tunni" : "%d tundi"; },
day: function(n, d) { return d < 0 ? "umbes päeva" : "umbes päev"; },
days: function(n, d) { return d < 0 ? "%d päeva" : "%d päeva"; },
month: function(n, d) { return d < 0 ? "umbes kuu aja" : "umbes kuu aega"; },
months: function(n, d) { return d < 0 ? "%d kuu" : "%d kuud"; },
year: function(n, d) { return d < 0 ? "umbes aasta aja" : "umbes aasta aega"; },
years: function(n, d) { return d < 0 ? "%d aasta" : "%d aastat"; }
};

@ -1,4 +1,4 @@

// Persian
// Use DIR attribute for RTL text in Persian Language for ABBR tag .
// By MB.seifollahi@gmail.com

@ -1,18 +1,16 @@
// Hebrew
jQuery.timeago.settings.strings = {
prefixAgo: "לפני",
prefixFromNow: "מעכשיו",
suffixAgo: "",
suffixFromNow: "",
prefixFromNow: "עוד",
seconds: "פחות מדקה",
minute: "דקה",
minutes: "%d דקות",
hour: "שעה",
hours: "%d שעות",
hours: function(number){return (number==2) ? "שעתיים" : "%d שעות";},
day: "יום",
days: "%d ימים",
days: function(number){return (number==2) ? "יומיים" : "%d ימים";},
month: "חודש",
months: "%d חודשים",
months: function(number){return (number==2) ? "חודשיים" : "%d חודשים";},
year: "שנה",
years: "%d שנים"
years: function(number){return (number==2) ? "שנתיים" : "%d שנים";}
};

@ -1,17 +1,20 @@
// Korean
jQuery.timeago.settings.strings = {
prefixAgo: null,
prefixFromNow: null,
suffixAgo: "전",
suffixFromNow: "후",
seconds: "1분 이내",
minute: "1분",
seconds: "1분",
minute: "1분",
minutes: "%d분",
hour: "1시간",
hours: "%d시간",
hour: "1시간",
hours: "%d시간",
day: "하루",
days: "%d일",
month: "한 달",
months: "%d",
year: "1년",
month: "약 1개월",
months: "%d개월",
year: "1년",
years: "%d년",
wordSeparator: " "
wordSeparator: " ",
numbers: []
};

@ -16,5 +16,5 @@
months: "%d месеци",
year: "%d година",
years: "%d години"
}
};
})();

@ -1,9 +1,9 @@
// Dutch
jQuery.timeago.settings.strings = {
prefixAgo: null,
prefixFromNow: "",
prefixFromNow: "over",
suffixAgo: "geleden",
suffixFromNow: "van nu",
suffixFromNow: null,
seconds: "minder dan een minuut",
minute: "ongeveer een minuut",
minutes: "%d minuten",

@ -1,5 +1,5 @@
// Romanian
$.timeago.settings.strings = {
jQuery.timeago.settings.strings = {
prefixAgo: "acum",
prefixFromNow: "in timp de",
suffixAgo: "",

@ -39,7 +39,7 @@
months: function (value) {
return numpf(value, "%d mesec", "%d meseca", "%d meseci");
},
year: "pre godinu dana",
year: "godinu dana",
years: function (value) {
return numpf(value, "%d godinu", "%d godine", "%d godina");
},

@ -1,42 +1,38 @@
// Slovenian with support for dual
(function () {
var numpf;
numpf = function (n, d, m) {
if (n == 2) {
return d;
} else {
return m;
}
numpf = function (n, a) {
return a[n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 0];
};
jQuery.timeago.settings.strings = {
prefixAgo: "pred",
prefixAgo: null,
prefixFromNow: "čez",
suffixAgo: null,
suffixAgo: "nazaj",
suffixFromNow: null,
second: "sekundo",
seconds: function (value) {
return numpf(value, "%d sekundama", "%d sekundami");
return numpf(value, ["%d sekund", "%d sekundo", "%d sekundi", "%d sekunde"]);
},
minute: "minuto",
minutes: function (value) {
return numpf(value, "%d minutama", "%d minutami");
return numpf(value, ["%d minut", "%d minuto", "%d minuti", "%d minute"]);
},
hour: "uro",
hour: "eno uro",
hours: function (value) {
return numpf(value, "%d urama", "%d urami");
return numpf(value, ["%d ur", "%d uro", "%d uri", "%d ure"]);
},
day: "dnevom",
day: "en dan",
days: function (value) {
return numpf(value, "%d dnevi", "%d dnevi");
return numpf(value, ["%d dni", "%d dan", "%d dneva", "%d dni"]);
},
month: "enim mescem",
month: "en mesec",
months: function (value) {
return numpf(value, "%d mesecema", "%d meseci");
return numpf(value, ["%d mescov", "%d mesec", "%d mesca", "%d mesce"]);
},
year: "enim letom",
year: "eno leto",
years: function (value) {
return numpf(value, "%d letoma", "%d leti");
return numpf(value, ["%d let", "%d leto", "%d leti", "%d leta"]);
},
wordSeparator: " "
};

@ -1,5 +1,5 @@
// Turkish
jQuery.extend($.timeago.settings.strings, {
jQuery.timeago.settings.strings = {
suffixAgo: 'önce',
suffixFromNow: null,
seconds: '1 dakikadan',
@ -13,4 +13,4 @@ jQuery.extend($.timeago.settings.strings, {
months: '%d ay',
year: '1 yıl',
years: '%d yıl'
});
};

@ -6,14 +6,14 @@ jQuery.timeago.settings.strings = {
suffixFromNow: null,
seconds: "bir necha soniya",
minute: "1 daqiqa",
minutes: function(value) { return "%d daqiqa" },
minutes: function(value) { return "%d daqiqa"; },
hour: "1 soat",
hours: function(value) { return "%d soat" },
hours: function(value) { return "%d soat"; },
day: "1 kun",
days: function(value) { return "%d kun" },
days: function(value) { return "%d kun"; },
month: "1 oy",
months: function(value) { return "%d oy" },
months: function(value) { return "%d oy"; },
year: "1 yil",
years: function(value) { return "%d yil" },
years: function(value) { return "%d yil"; },
wordSeparator: " "
};

@ -23,7 +23,7 @@ module.exports = function(Meta) {
base: [
'public/vendor/jquery/js/jquery.js',
'./node_modules/socket.io-client/socket.io.js',
'public/vendor/jquery/timeago/jquery.timeago.min.js',
'public/vendor/jquery/timeago/jquery.timeago.js',
'public/vendor/jquery/js/jquery.form.min.js',
'public/vendor/visibility/visibility.min.js',
'public/vendor/bootstrap/js/bootstrap.min.js',

Loading…
Cancel
Save