From acdb92ad425b1f7035b677f430516ab4a9f645c2 Mon Sep 17 00:00:00 2001 From: Yarden Shoham Date: Mon, 17 Oct 2022 07:08:21 +0300 Subject: Localize all timestamps (#21440) Following * #21410 We are now able to localize all timestamps. Some examples: `short-date` format, French, user profile page: ![image](https://user-images.githubusercontent.com/20454870/195622461-aa0d5b93-f8df-42ad-881c-9c16606bf387.png) `date-time` format, Portuguese, mirror repository settings page: ![image](https://user-images.githubusercontent.com/20454870/195623191-7a37d77c-4a02-4140-846d-f290a65ea21d.png) Signed-off-by: Yarden Shoham Signed-off-by: Yarden Shoham Co-authored-by: Gusted Co-authored-by: techknowlogick Co-authored-by: Lunny Xiao --- web_src/js/features/formatting.js | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) (limited to 'web_src/js') diff --git a/web_src/js/features/formatting.js b/web_src/js/features/formatting.js index 5f4633bba2..c8f5db9e14 100644 --- a/web_src/js/features/formatting.js +++ b/web_src/js/features/formatting.js @@ -1,7 +1,10 @@ import {prettyNumber} from '../utils.js'; const {lang} = document.documentElement; + const dateFormatter = new Intl.DateTimeFormat(lang, {year: 'numeric', month: 'long', day: 'numeric'}); +const shortDateFormatter = new Intl.DateTimeFormat(lang, {year: 'numeric', month: 'short', day: 'numeric'}); +const dateTimeFormatter = new Intl.DateTimeFormat(lang, {year: 'numeric', month: 'short', day: 'numeric', hour: 'numeric', minute: 'numeric', second: 'numeric'}); export function initFormattingReplacements() { // replace english formatted numbers with locale-specific separators @@ -13,9 +16,28 @@ export function initFormattingReplacements() { } } - // for each tag, if it has the data-format="date" attribute, format - // the text according to the user's chosen locale - for (const timeElement of document.querySelectorAll('time[data-format="date"]')) { - timeElement.textContent = dateFormatter.format(new Date(timeElement.dateTime)); + // for each tag, if it has the data-format attribute, format + // the text according to the user's chosen locale and formatter. + formatAllTimeElements(); +} + +function formatAllTimeElements() { + const timeElements = document.querySelectorAll('time[data-format]'); + for (const timeElement of timeElements) { + const formatter = getFormatter(timeElement.dataset.format); + timeElement.textContent = formatter.format(new Date(timeElement.dateTime)); + } +} + +function getFormatter(format) { + switch (format) { + case 'date': + return dateFormatter; + case 'short-date': + return shortDateFormatter; + case 'date-time': + return dateTimeFormatter; + default: + throw new Error('Unknown format'); } } -- cgit v1.2.3