Commit 6e4dac35 authored by Lukas Eipert's avatar Lukas Eipert

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.
parent bd91bf1e
...@@ -87,44 +87,92 @@ let timeagoInstance; ...@@ -87,44 +87,92 @@ let timeagoInstance;
*/ */
export const getTimeago = () => { export const getTimeago = () => {
if (!timeagoInstance) { if (!timeagoInstance) {
const localeRemaining = (number, index) => const memoizedLocaleRemaining = () => {
[ const cache = [];
[s__('Timeago|just now'), s__('Timeago|right now')],
[s__('Timeago|%s seconds ago'), s__('Timeago|%s seconds remaining')], return (number, index) => {
[s__('Timeago|1 minute ago'), s__('Timeago|1 minute remaining')], if (cache[index]) {
[s__('Timeago|%s minutes ago'), s__('Timeago|%s minutes remaining')], return cache[index];
[s__('Timeago|1 hour ago'), s__('Timeago|1 hour remaining')], }
[s__('Timeago|%s hours ago'), s__('Timeago|%s hours remaining')], let result = [];
[s__('Timeago|1 day ago'), s__('Timeago|1 day remaining')], if (index === 0) {
[s__('Timeago|%s days ago'), s__('Timeago|%s days remaining')], result = [s__('Timeago|just now'), s__('Timeago|right now')];
[s__('Timeago|1 week ago'), s__('Timeago|1 week remaining')], } else if (index === 1) {
[s__('Timeago|%s weeks ago'), s__('Timeago|%s weeks remaining')], result = [s__('Timeago|%s seconds ago'), s__('Timeago|%s seconds remaining')];
[s__('Timeago|1 month ago'), s__('Timeago|1 month remaining')], } else if (index === 2) {
[s__('Timeago|%s months ago'), s__('Timeago|%s months remaining')], result = [s__('Timeago|1 minute ago'), s__('Timeago|1 minute remaining')];
[s__('Timeago|1 year ago'), s__('Timeago|1 year remaining')], } else if (index === 3) {
[s__('Timeago|%s years ago'), s__('Timeago|%s years remaining')], result = [s__('Timeago|%s minutes ago'), s__('Timeago|%s minutes remaining')];
][index]; } else if (index === 4) {
result = [s__('Timeago|1 hour ago'), s__('Timeago|1 hour remaining')];
const locale = (number, index) => } else if (index === 5) {
[ result = [s__('Timeago|%s hours ago'), s__('Timeago|%s hours remaining')];
[s__('Timeago|just now'), s__('Timeago|right now')], } else if (index === 6) {
[s__('Timeago|%s seconds ago'), s__('Timeago|in %s seconds')], result = [s__('Timeago|1 day ago'), s__('Timeago|1 day remaining')];
[s__('Timeago|1 minute ago'), s__('Timeago|in 1 minute')], } else if (index === 7) {
[s__('Timeago|%s minutes ago'), s__('Timeago|in %s minutes')], result = [s__('Timeago|%s days ago'), s__('Timeago|%s days remaining')];
[s__('Timeago|1 hour ago'), s__('Timeago|in 1 hour')], } else if (index === 8) {
[s__('Timeago|%s hours ago'), s__('Timeago|in %s hours')], result = [s__('Timeago|1 week ago'), s__('Timeago|1 week remaining')];
[s__('Timeago|1 day ago'), s__('Timeago|in 1 day')], } else if (index === 9) {
[s__('Timeago|%s days ago'), s__('Timeago|in %s days')], result = [s__('Timeago|%s weeks ago'), s__('Timeago|%s weeks remaining')];
[s__('Timeago|1 week ago'), s__('Timeago|in 1 week')], } else if (index === 10) {
[s__('Timeago|%s weeks ago'), s__('Timeago|in %s weeks')], result = [s__('Timeago|1 month ago'), s__('Timeago|1 month remaining')];
[s__('Timeago|1 month ago'), s__('Timeago|in 1 month')], } else if (index === 11) {
[s__('Timeago|%s months ago'), s__('Timeago|in %s months')], result = [s__('Timeago|%s months ago'), s__('Timeago|%s months remaining')];
[s__('Timeago|1 year ago'), s__('Timeago|in 1 year')], } else if (index === 12) {
[s__('Timeago|%s years ago'), s__('Timeago|in %s years')], result = [s__('Timeago|1 year ago'), s__('Timeago|1 year remaining')];
][index]; } else if (index === 13) {
result = [s__('Timeago|%s years ago'), s__('Timeago|%s years remaining')];
timeago.register(timeagoLanguageCode, locale); }
timeago.register(`${timeagoLanguageCode}-remaining`, localeRemaining); cache[index] = result;
return result;
};
};
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(); timeagoInstance = timeago();
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment