Add localization of datetime in public page (#3296)
This commit is contained in:
		
							parent
							
								
									58f5040ee8
								
							
						
					
					
						commit
						531c1bb245
					
				
					 4 changed files with 81 additions and 100 deletions
				
			
		|  | @ -1,111 +1,96 @@ | ||||||
| import emojify from 'mastodon/emoji'; | import emojify from 'mastodon/emoji'; | ||||||
|  | import { getLocale } from 'mastodon/locales'; | ||||||
| import { length } from 'stringz'; | import { length } from 'stringz'; | ||||||
| import { default as dateFormat } from 'date-fns/format'; | import IntlRelativeFormat from 'intl-relativeformat'; | ||||||
| import distanceInWordsStrict from 'date-fns/distance_in_words_strict'; |  | ||||||
| import { delegate } from 'rails-ujs'; | import { delegate } from 'rails-ujs'; | ||||||
| 
 | 
 | ||||||
| require.context('../images/', true); | require.context('../images/', true); | ||||||
| 
 | 
 | ||||||
| const parseFormat = (format) => format.replace(/%(\w)/g, (_, modifier) => { | const { localeData } = getLocale(); | ||||||
|   switch (modifier) { | localeData.forEach(IntlRelativeFormat.__addLocaleData); | ||||||
|   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}`; |  | ||||||
|   } |  | ||||||
| }); |  | ||||||
| 
 | 
 | ||||||
| document.addEventListener('DOMContentLoaded', () => { | function main() { | ||||||
|   [].forEach.call(document.querySelectorAll('.emojify'), (content) => { |   const locale = document.documentElement.lang; | ||||||
|     content.innerHTML = emojify(content.innerHTML); |   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) => { |   document.addEventListener('DOMContentLoaded', () => { | ||||||
|     const format = parseFormat(content.dataset.format); |     [].forEach.call(document.querySelectorAll('.emojify'), (content) => { | ||||||
|     const formattedDate = dateFormat(content.getAttribute('datetime'), format); |       content.innerHTML = emojify(content.innerHTML); | ||||||
|     content.textContent = formattedDate; |     }); | ||||||
|   }); | 
 | ||||||
| 
 |     [].forEach.call(document.querySelectorAll('time.formatted'), (content) => { | ||||||
|   [].forEach.call(document.querySelectorAll('time.time-ago'), (content) => { |       const datetime = new Date(content.getAttribute('datetime')); | ||||||
|     const timeAgo = distanceInWordsStrict(new Date(), content.getAttribute('datetime'), { |       const formattedDate = dateTimeFormat.format(datetime); | ||||||
|       addSuffix: true, |       content.title = formattedDate; | ||||||
|  |       content.textContent = formattedDate; | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     [].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 }) => { |   delegate(document, '.video-player video', 'click', ({ target }) => { | ||||||
|   if (target.paused) { |     if (target.paused) { | ||||||
|     target.play(); |       target.play(); | ||||||
|   } else { |     } else { | ||||||
|     target.pause(); |       target.pause(); | ||||||
|   } |     } | ||||||
| }); |   }); | ||||||
| 
 | 
 | ||||||
| delegate(document, '.media-spoiler', 'click', ({ target }) => { |   delegate(document, '.media-spoiler', 'click', ({ target }) => { | ||||||
|   target.style.display = 'none'; |     target.style.display = 'none'; | ||||||
| }); |   }); | ||||||
| 
 | 
 | ||||||
| delegate(document, '.webapp-btn', 'click', ({ target, button }) => { |   delegate(document, '.webapp-btn', 'click', ({ target, button }) => { | ||||||
|   if (button !== 0) { |     if (button !== 0) { | ||||||
|     return true; |       return true; | ||||||
|   } |     } | ||||||
|   window.location.href = target.href; |     window.location.href = target.href; | ||||||
|   return false; |     return false; | ||||||
| }); |   }); | ||||||
| 
 | 
 | ||||||
| delegate(document, '.status__content__spoiler-link', 'click', ({ target }) => { |   delegate(document, '.status__content__spoiler-link', 'click', ({ target }) => { | ||||||
|   const contentEl = target.parentNode.parentNode.querySelector('.e-content'); |     const contentEl = target.parentNode.parentNode.querySelector('.e-content'); | ||||||
|   if (contentEl.style.display === 'block') { |     if (contentEl.style.display === 'block') { | ||||||
|     contentEl.style.display = 'none'; |       contentEl.style.display = 'none'; | ||||||
|     target.parentNode.style.marginBottom = 0; |       target.parentNode.style.marginBottom = 0; | ||||||
|   } else { |     } else { | ||||||
|     contentEl.style.display = 'block'; |       contentEl.style.display = 'block'; | ||||||
|     target.parentNode.style.marginBottom = null; |       target.parentNode.style.marginBottom = null; | ||||||
|   } |     } | ||||||
|   return false; |     return false; | ||||||
| }); |   }); | ||||||
| 
 | 
 | ||||||
| delegate(document, '.account_display_name', 'input', ({ target }) => { |   delegate(document, '.account_display_name', 'input', ({ target }) => { | ||||||
|   const nameCounter = document.querySelector('.name-counter'); |     const nameCounter = document.querySelector('.name-counter'); | ||||||
|   if (nameCounter) { |     if (nameCounter) { | ||||||
|     nameCounter.textContent = 30 - length(target.value); |       nameCounter.textContent = 30 - length(target.value); | ||||||
|   } |     } | ||||||
| }); |   }); | ||||||
| 
 | 
 | ||||||
| delegate(document, '.account_note', 'input', ({ target }) => { |   delegate(document, '.account_note', 'input', ({ target }) => { | ||||||
|   const noteCounter = document.querySelector('.note-counter'); |     const noteCounter = document.querySelector('.note-counter'); | ||||||
|   if (noteCounter) { |     if (noteCounter) { | ||||||
|     noteCounter.textContent = 160 - length(target.value); |       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(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -31,7 +31,7 @@ | ||||||
|   .detailed-status__meta |   .detailed-status__meta | ||||||
|     %data.dt-published{ value: status.created_at.to_time.iso8601 } |     %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 |     = 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 | ||||||
|       - if status.application.website.blank? |       - if status.application.website.blank? | ||||||
|  |  | ||||||
|  | @ -42,7 +42,6 @@ | ||||||
|     "coffee-script": "^1.12.5", |     "coffee-script": "^1.12.5", | ||||||
|     "compression-webpack-plugin": "^0.4.0", |     "compression-webpack-plugin": "^0.4.0", | ||||||
|     "css-loader": "^0.28.0", |     "css-loader": "^0.28.0", | ||||||
|     "date-fns": "^1.28.4", |  | ||||||
|     "dotenv": "^4.0.0", |     "dotenv": "^4.0.0", | ||||||
|     "emojione": "^2.2.7", |     "emojione": "^2.2.7", | ||||||
|     "emojione-picker": "^2.2.1", |     "emojione-picker": "^2.2.1", | ||||||
|  | @ -57,6 +56,7 @@ | ||||||
|     "immutable": "^3.8.1", |     "immutable": "^3.8.1", | ||||||
|     "intersection-observer": "^0.2.1", |     "intersection-observer": "^0.2.1", | ||||||
|     "intl": "^1.2.5", |     "intl": "^1.2.5", | ||||||
|  |     "intl-relativeformat": "^1.3.0", | ||||||
|     "is-nan": "^1.2.1", |     "is-nan": "^1.2.1", | ||||||
|     "js-yaml": "^3.8.3", |     "js-yaml": "^3.8.3", | ||||||
|     "lodash": "^4.17.4", |     "lodash": "^4.17.4", | ||||||
|  |  | ||||||
|  | @ -2016,10 +2016,6 @@ dashdash@^1.12.0: | ||||||
|   dependencies: |   dependencies: | ||||||
|     assert-plus "^1.0.0" |     assert-plus "^1.0.0" | ||||||
| 
 | 
 | ||||||
| date-fns@^1.28.4: |  | ||||||
|   version "1.28.4" |  | ||||||
|   resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.28.4.tgz#7938aec34ba31fc8bd134d2344bc2e0bbfd95165" |  | ||||||
| 
 |  | ||||||
| date-now@^0.1.4: | date-now@^0.1.4: | ||||||
|   version "0.1.4" |   version "0.1.4" | ||||||
|   resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" |   resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue