Skip to content

Commit 94feb90

Browse files
Merge pull request #584 from Aeledfyr/localize-timezones
Localize timezones
2 parents dfb5e84 + 7233044 commit 94feb90

File tree

2 files changed

+15
-28
lines changed

2 files changed

+15
-28
lines changed

src/components/markup/TimestampMention.tsx

Lines changed: 13 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import { formatTimestamp, formatTimestampRelative } from "@/common/date";
1+
import { formatters as dateFormatters, formatTimestamp, formatTimestampRelative } from "@/common/date";
2+
import { Temporal } from "temporal-polyfill";
23
import {
34
createEffect,
45
createMemo,
@@ -14,7 +15,6 @@ import { Modal } from "../ui/modal";
1415
import { addReminder } from "@/chat-api/services/ReminderService";
1516
import { Message } from "@/chat-api/store/useMessages";
1617
import Text from "../ui/Text";
17-
import { WorldTimezones } from "@/common/WorldTimezones";
1818
import { t } from "@nerimity/i18lite";
1919

2020
export enum TimestampType {
@@ -31,38 +31,24 @@ export function TimestampMention(props: {
3131
const { createPortal } = useCustomPortal();
3232
const [formattedTime, setFormattedTime] = createSignal("...");
3333

34-
const isValidTimezone = createMemo(() => {
35-
return WorldTimezones.includes(props.timestamp as unknown as string);
36-
});
37-
3834
const updateTime = () => {
3935
if (props.type === TimestampType.RELATIVE) {
4036
return setFormattedTime(formatTimestampRelative(props.timestamp));
4137
}
4238
if (props.type === TimestampType.OFFSET) {
4339
const offset = props.timestamp as unknown as string;
44-
45-
if (isValidTimezone()) {
46-
const date = new Date().toLocaleString("en-GB", { timeZone: offset });
47-
return setFormattedTime(date.split(",")[1]?.trim() || "...");
40+
try {
41+
const datetime = Temporal.Now.zonedDateTimeISO(offset)
42+
.round({
43+
smallestUnit: "second",
44+
roundingMode: "floor",
45+
});
46+
const formatted = dateFormatters().datetime.seconds
47+
.format(datetime.toPlainTime());
48+
return setFormattedTime(formatted);
49+
} catch {
50+
return setFormattedTime(t("datetime.invalidTimezone"));
4851
}
49-
const offsetSign = offset[0] as "+" | "-";
50-
const offsetHours = Number(offsetSign + offset.slice(1, 3));
51-
const offsetMinutes = Number(offsetSign + offset.slice(3, 6));
52-
53-
const date = new Date();
54-
const utcDate = new Date(
55-
date.getUTCFullYear(),
56-
date.getUTCMonth(),
57-
date.getUTCDate(),
58-
date.getUTCHours(),
59-
date.getUTCMinutes(),
60-
date.getUTCSeconds()
61-
);
62-
63-
utcDate.setMinutes(utcDate.getMinutes() + offsetMinutes);
64-
utcDate.setHours(utcDate.getHours() + offsetHours);
65-
setFormattedTime(formatTimestamp(utcDate.getTime(), true));
6652
}
6753
};
6854

src/locales/list/en-gb.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1351,6 +1351,7 @@
13511351
"relativeNow": "now",
13521352
"yesterdayTime": "Yesterday at {{time}}",
13531353
"dateTime": "{{date}} at {{time}}",
1354-
"error": "error"
1354+
"error": "error",
1355+
"invalidTimezone": "invalid time zone"
13551356
}
13561357
}

0 commit comments

Comments
 (0)