|
1 | 1 | <script setup lang="ts">
|
2 |
| -import { ref, computed, watchEffect, onMounted } from 'vue' |
| 2 | +import { useNavigatorLanguage } from '@vueuse/core' |
| 3 | +import { computed, onMounted, shallowRef, useTemplateRef, watchEffect } from 'vue' |
3 | 4 | import { useData } from '../composables/data'
|
4 | 5 |
|
5 |
| -const { theme, page, lang } = useData() |
| 6 | +const { theme, page, lang: pageLang } = useData() |
| 7 | +const { language: browserLang } = useNavigatorLanguage() |
6 | 8 |
|
7 |
| -const date = computed( |
8 |
| - () => new Date(page.value.lastUpdated!) |
9 |
| -) |
| 9 | +const timeRef = useTemplateRef('timeRef') |
| 10 | +
|
| 11 | +const date = computed(() => new Date(page.value.lastUpdated!)) |
10 | 12 | const isoDatetime = computed(() => date.value.toISOString())
|
11 |
| -const datetime = ref('') |
| 13 | +const datetime = shallowRef('') |
12 | 14 |
|
13 | 15 | // set time on mounted hook to avoid hydration mismatch due to
|
14 | 16 | // potential differences in timezones of the server and clients
|
15 | 17 | onMounted(() => {
|
16 | 18 | watchEffect(() => {
|
| 19 | + const lang = theme.value.lastUpdated?.formatOptions?.forceLocale |
| 20 | + ? pageLang.value |
| 21 | + : browserLang.value |
| 22 | +
|
17 | 23 | datetime.value = new Intl.DateTimeFormat(
|
18 |
| - theme.value.lastUpdated?.formatOptions?.forceLocale ? lang.value : undefined, |
| 24 | + lang, |
19 | 25 | theme.value.lastUpdated?.formatOptions ?? {
|
20 |
| - dateStyle: 'short', |
21 |
| - timeStyle: 'short' |
| 26 | + dateStyle: 'medium', |
| 27 | + timeStyle: 'medium' |
22 | 28 | }
|
23 | 29 | ).format(date.value)
|
| 30 | +
|
| 31 | + if (lang && pageLang.value !== lang) { |
| 32 | + timeRef.value?.setAttribute('lang', lang) |
| 33 | + } else { |
| 34 | + timeRef.value?.removeAttribute('lang') |
| 35 | + } |
24 | 36 | })
|
25 | 37 | })
|
26 | 38 | </script>
|
27 | 39 |
|
28 | 40 | <template>
|
29 | 41 | <p class="VPLastUpdated">
|
30 | 42 | {{ theme.lastUpdated?.text || theme.lastUpdatedText || 'Last updated' }}:
|
31 |
| - <time :datetime="isoDatetime">{{ datetime }}</time> |
| 43 | + <time ref="timeRef" :datetime="isoDatetime">{{ datetime }}</time> |
32 | 44 | </p>
|
33 | 45 | </template>
|
34 | 46 |
|
|
0 commit comments