about summary refs log tree commit diff
path: root/app
diff options
context:
space:
mode:
authorYamagishi Kazutoshi <ykzts@desire.sh>2017-05-25 21:09:25 +0900
committerEugen Rochko <eugen@zeonfederated.com>2017-05-25 14:09:25 +0200
commit531c1bb245b01eb78e142da92ca2f3d46c261579 (patch)
tree65ec5d05f10a339755596f915dd333d32a51c405 /app
parent58f5040ee8cfb1230477ac3ac2cbe9144815520c (diff)
Add localization of datetime in public page (#3296)
Diffstat (limited to 'app')
-rw-r--r--app/javascript/packs/public.js171
-rw-r--r--app/views/stream_entries/_detailed_status.html.haml2
2 files changed, 79 insertions, 94 deletions
diff --git a/app/javascript/packs/public.js b/app/javascript/packs/public.js
index 38ef7203e..9f71b6dc5 100644
--- a/app/javascript/packs/public.js
+++ b/app/javascript/packs/public.js
@@ -1,111 +1,96 @@
 import emojify from 'mastodon/emoji';
+import { getLocale } from 'mastodon/locales';
 import { length } from 'stringz';
-import { default as dateFormat } from 'date-fns/format';
-import distanceInWordsStrict from 'date-fns/distance_in_words_strict';
+import IntlRelativeFormat from 'intl-relativeformat';
 import { delegate } from 'rails-ujs';
 
 require.context('../images/', true);
 
-const parseFormat = (format) => format.replace(/%(\w)/g, (_, modifier) => {
-  switch (modifier) {
-  case '%':
-    return '%';
-  case 'a':
-    return 'ddd';
-  case 'A':
-    return 'ddd';
-  case 'b':
-    return 'MMM';
-  case 'B':
-    return 'MMMM';
-  case 'd':
-    return 'DD';
-  case 'H':
-    return 'HH';
-  case 'I':
-    return 'hh';
-  case 'l':
-    return 'H';
-  case 'm':
-    return 'M';
-  case 'M':
-    return 'mm';
-  case 'p':
-    return 'A';
-  case 'S':
-    return 'ss';
-  case 'w':
-    return 'd';
-  case 'y':
-    return 'YY';
-  case 'Y':
-    return 'YYYY';
-  default:
-    return `%${modifier}`;
-  }
-});
+const { localeData } = getLocale();
+localeData.forEach(IntlRelativeFormat.__addLocaleData);
 
-document.addEventListener('DOMContentLoaded', () => {
-  [].forEach.call(document.querySelectorAll('.emojify'), (content) => {
-    content.innerHTML = emojify(content.innerHTML);
+function main() {
+  const locale = document.documentElement.lang;
+  const dateTimeFormat = new Intl.DateTimeFormat(locale, {
+    year: 'numeric',
+    month: 'long',
+    day: 'numeric',
+    hour: 'numeric',
+    minute: 'numeric',
   });
+  const relativeFormat = new IntlRelativeFormat(locale);
 
-  [].forEach.call(document.querySelectorAll('time[data-format]'), (content) => {
-    const format = parseFormat(content.dataset.format);
-    const formattedDate = dateFormat(content.getAttribute('datetime'), format);
-    content.textContent = formattedDate;
-  });
+  document.addEventListener('DOMContentLoaded', () => {
+    [].forEach.call(document.querySelectorAll('.emojify'), (content) => {
+      content.innerHTML = emojify(content.innerHTML);
+    });
+
+    [].forEach.call(document.querySelectorAll('time.formatted'), (content) => {
+      const datetime = new Date(content.getAttribute('datetime'));
+      const formattedDate = dateTimeFormat.format(datetime);
+      content.title = formattedDate;
+      content.textContent = formattedDate;
+    });
 
-  [].forEach.call(document.querySelectorAll('time.time-ago'), (content) => {
-    const timeAgo = distanceInWordsStrict(new Date(), content.getAttribute('datetime'), {
-      addSuffix: true,
+    [].forEach.call(document.querySelectorAll('time.time-ago'), (content) => {
+      const datetime = new Date(content.getAttribute('datetime'));
+      content.textContent = relativeFormat.format(datetime);;
     });
-    content.textContent = timeAgo;
   });
-});
 
-delegate(document, '.video-player video', 'click', ({ target }) => {
-  if (target.paused) {
-    target.play();
-  } else {
-    target.pause();
-  }
-});
+  delegate(document, '.video-player video', 'click', ({ target }) => {
+    if (target.paused) {
+      target.play();
+    } else {
+      target.pause();
+    }
+  });
+
+  delegate(document, '.media-spoiler', 'click', ({ target }) => {
+    target.style.display = 'none';
+  });
 
-delegate(document, '.media-spoiler', 'click', ({ target }) => {
-  target.style.display = 'none';
-});
+  delegate(document, '.webapp-btn', 'click', ({ target, button }) => {
+    if (button !== 0) {
+      return true;
+    }
+    window.location.href = target.href;
+    return false;
+  });
 
-delegate(document, '.webapp-btn', 'click', ({ target, button }) => {
-  if (button !== 0) {
-    return true;
-  }
-  window.location.href = target.href;
-  return false;
-});
+  delegate(document, '.status__content__spoiler-link', 'click', ({ target }) => {
+    const contentEl = target.parentNode.parentNode.querySelector('.e-content');
+    if (contentEl.style.display === 'block') {
+      contentEl.style.display = 'none';
+      target.parentNode.style.marginBottom = 0;
+    } else {
+      contentEl.style.display = 'block';
+      target.parentNode.style.marginBottom = null;
+    }
+    return false;
+  });
 
-delegate(document, '.status__content__spoiler-link', 'click', ({ target }) => {
-  const contentEl = target.parentNode.parentNode.querySelector('.e-content');
-  if (contentEl.style.display === 'block') {
-    contentEl.style.display = 'none';
-    target.parentNode.style.marginBottom = 0;
-  } else {
-    contentEl.style.display = 'block';
-    target.parentNode.style.marginBottom = null;
-  }
-  return false;
-});
+  delegate(document, '.account_display_name', 'input', ({ target }) => {
+    const nameCounter = document.querySelector('.name-counter');
+    if (nameCounter) {
+      nameCounter.textContent = 30 - length(target.value);
+    }
+  });
 
-delegate(document, '.account_display_name', 'input', ({ target }) => {
-  const nameCounter = document.querySelector('.name-counter');
-  if (nameCounter) {
-    nameCounter.textContent = 30 - length(target.value);
-  }
-});
+  delegate(document, '.account_note', 'input', ({ target }) => {
+    const noteCounter = document.querySelector('.note-counter');
+    if (noteCounter) {
+      noteCounter.textContent = 160 - length(target.value);
+    }
+  });
+}
 
-delegate(document, '.account_note', 'input', ({ target }) => {
-  const noteCounter = document.querySelector('.note-counter');
-  if (noteCounter) {
-    noteCounter.textContent = 160 - length(target.value);
-  }
-});
+if (!window.Intl) {
+  import(/* webpackChunkName: "base_polyfills" */ 'mastodon/base_polyfills').then(() => {
+    main();
+  }).catch(error => {
+    console.log(error); // eslint-disable-line no-console
+  });
+} else {
+  main();
+}
diff --git a/app/views/stream_entries/_detailed_status.html.haml b/app/views/stream_entries/_detailed_status.html.haml
index d22afb082..a3e2f766e 100644
--- a/app/views/stream_entries/_detailed_status.html.haml
+++ b/app/views/stream_entries/_detailed_status.html.haml
@@ -31,7 +31,7 @@
   .detailed-status__meta
     %data.dt-published{ value: status.created_at.to_time.iso8601 }
     = link_to TagManager.instance.url_for(status), class: 'detailed-status__datetime u-url u-uid', target: stream_link_target, rel: 'noopener' do
-      %time{ datetime: status.created_at.iso8601, title: l(status.created_at), data: { format: t('time.formats.default') } }= l(status.created_at)
+      %time.formatted{ datetime: status.created_at.iso8601, title: l(status.created_at) }= l(status.created_at)
     ·
     - if status.application
       - if status.application.website.blank?