Memoize timeago locales

Each localized function call of the timeago calls gettext 28! times.
Even though gettext is rather fast, this escalates pretty quickly. We
effectively memoize the locales, which results in a maximum of 28
function calls in total. For pages with normal data, less calls (< 10)
are much more realistic.
This commit is contained in:
Lukas Eipert 2019-01-22 00:14:21 +01:00
parent bd91bf1ea8
commit 6e4dac3589
No known key found for this signature in database
GPG key ID: 148BEA37CB35B2AC

View file

@ -87,44 +87,92 @@ let timeagoInstance;
*/
export const getTimeago = () => {
if (!timeagoInstance) {
const localeRemaining = (number, index) =>
[
[s__('Timeago|just now'), s__('Timeago|right now')],
[s__('Timeago|%s seconds ago'), s__('Timeago|%s seconds remaining')],
[s__('Timeago|1 minute ago'), s__('Timeago|1 minute remaining')],
[s__('Timeago|%s minutes ago'), s__('Timeago|%s minutes remaining')],
[s__('Timeago|1 hour ago'), s__('Timeago|1 hour remaining')],
[s__('Timeago|%s hours ago'), s__('Timeago|%s hours remaining')],
[s__('Timeago|1 day ago'), s__('Timeago|1 day remaining')],
[s__('Timeago|%s days ago'), s__('Timeago|%s days remaining')],
[s__('Timeago|1 week ago'), s__('Timeago|1 week remaining')],
[s__('Timeago|%s weeks ago'), s__('Timeago|%s weeks remaining')],
[s__('Timeago|1 month ago'), s__('Timeago|1 month remaining')],
[s__('Timeago|%s months ago'), s__('Timeago|%s months remaining')],
[s__('Timeago|1 year ago'), s__('Timeago|1 year remaining')],
[s__('Timeago|%s years ago'), s__('Timeago|%s years remaining')],
][index];
const memoizedLocaleRemaining = () => {
const cache = [];
const locale = (number, index) =>
[
[s__('Timeago|just now'), s__('Timeago|right now')],
[s__('Timeago|%s seconds ago'), s__('Timeago|in %s seconds')],
[s__('Timeago|1 minute ago'), s__('Timeago|in 1 minute')],
[s__('Timeago|%s minutes ago'), s__('Timeago|in %s minutes')],
[s__('Timeago|1 hour ago'), s__('Timeago|in 1 hour')],
[s__('Timeago|%s hours ago'), s__('Timeago|in %s hours')],
[s__('Timeago|1 day ago'), s__('Timeago|in 1 day')],
[s__('Timeago|%s days ago'), s__('Timeago|in %s days')],
[s__('Timeago|1 week ago'), s__('Timeago|in 1 week')],
[s__('Timeago|%s weeks ago'), s__('Timeago|in %s weeks')],
[s__('Timeago|1 month ago'), s__('Timeago|in 1 month')],
[s__('Timeago|%s months ago'), s__('Timeago|in %s months')],
[s__('Timeago|1 year ago'), s__('Timeago|in 1 year')],
[s__('Timeago|%s years ago'), s__('Timeago|in %s years')],
][index];
return (number, index) => {
if (cache[index]) {
return cache[index];
}
let result = [];
if (index === 0) {
result = [s__('Timeago|just now'), s__('Timeago|right now')];
} else if (index === 1) {
result = [s__('Timeago|%s seconds ago'), s__('Timeago|%s seconds remaining')];
} else if (index === 2) {
result = [s__('Timeago|1 minute ago'), s__('Timeago|1 minute remaining')];
} else if (index === 3) {
result = [s__('Timeago|%s minutes ago'), s__('Timeago|%s minutes remaining')];
} else if (index === 4) {
result = [s__('Timeago|1 hour ago'), s__('Timeago|1 hour remaining')];
} else if (index === 5) {
result = [s__('Timeago|%s hours ago'), s__('Timeago|%s hours remaining')];
} else if (index === 6) {
result = [s__('Timeago|1 day ago'), s__('Timeago|1 day remaining')];
} else if (index === 7) {
result = [s__('Timeago|%s days ago'), s__('Timeago|%s days remaining')];
} else if (index === 8) {
result = [s__('Timeago|1 week ago'), s__('Timeago|1 week remaining')];
} else if (index === 9) {
result = [s__('Timeago|%s weeks ago'), s__('Timeago|%s weeks remaining')];
} else if (index === 10) {
result = [s__('Timeago|1 month ago'), s__('Timeago|1 month remaining')];
} else if (index === 11) {
result = [s__('Timeago|%s months ago'), s__('Timeago|%s months remaining')];
} else if (index === 12) {
result = [s__('Timeago|1 year ago'), s__('Timeago|1 year remaining')];
} else if (index === 13) {
result = [s__('Timeago|%s years ago'), s__('Timeago|%s years remaining')];
}
cache[index] = result;
return result;
};
};
timeago.register(timeagoLanguageCode, locale);
timeago.register(`${timeagoLanguageCode}-remaining`, localeRemaining);
const memoizedLocale = () => {
const cache = [];
return (number, index) => {
if (cache[index]) {
return cache[index];
}
let result = [];
if (index === 0) {
result = [s__('Timeago|just now'), s__('Timeago|right now')];
} else if (index === 1) {
result = [s__('Timeago|%s seconds ago'), s__('Timeago|in %s seconds')];
} else if (index === 2) {
result = [s__('Timeago|1 minute ago'), s__('Timeago|in 1 minute')];
} else if (index === 3) {
result = [s__('Timeago|%s minutes ago'), s__('Timeago|in %s minutes')];
} else if (index === 4) {
result = [s__('Timeago|1 hour ago'), s__('Timeago|in 1 hour')];
} else if (index === 5) {
result = [s__('Timeago|%s hours ago'), s__('Timeago|in %s hours')];
} else if (index === 6) {
result = [s__('Timeago|1 day ago'), s__('Timeago|in 1 day')];
} else if (index === 7) {
result = [s__('Timeago|%s days ago'), s__('Timeago|in %s days')];
} else if (index === 8) {
result = [s__('Timeago|1 week ago'), s__('Timeago|in 1 week')];
} else if (index === 9) {
result = [s__('Timeago|%s weeks ago'), s__('Timeago|in %s weeks')];
} else if (index === 10) {
result = [s__('Timeago|1 month ago'), s__('Timeago|in 1 month')];
} else if (index === 11) {
result = [s__('Timeago|%s months ago'), s__('Timeago|in %s months')];
} else if (index === 12) {
result = [s__('Timeago|1 year ago'), s__('Timeago|in 1 year')];
} else if (index === 13) {
result = [s__('Timeago|%s years ago'), s__('Timeago|in %s years')];
}
cache[index] = result;
return result;
};
};
timeago.register(timeagoLanguageCode, memoizedLocale());
timeago.register(`${timeagoLanguageCode}-remaining`, memoizedLocaleRemaining());
timeagoInstance = timeago();
}