diff --git a/apps/web/core/components/home/user-greetings.tsx b/apps/web/core/components/home/user-greetings.tsx
index 8d5d6cc1e86..f48b82c63fd 100644
--- a/apps/web/core/components/home/user-greetings.tsx
+++ b/apps/web/core/components/home/user-greetings.tsx
@@ -7,9 +7,8 @@
// plane types
import { useTranslation } from "@plane/i18n";
import type { IUser } from "@plane/types";
-// plane ui
// hooks
-import { useCurrentTime } from "@/hooks/use-current-time";
+import { useGreeting } from "@/hooks/use-greeting";
export interface IUserGreetingsView {
user: IUser;
@@ -17,41 +16,16 @@ export interface IUserGreetingsView {
export function UserGreetingsView(props: IUserGreetingsView) {
const { user } = props;
- // current time hook
- const { currentTime } = useCurrentTime();
- // store hooks
+ const { greeting, timeString, weekDay, date } = useGreeting(user);
const { t } = useTranslation();
- const hour = new Intl.DateTimeFormat("en-US", {
- hour12: false,
- hour: "numeric",
- }).format(currentTime);
-
- const date = new Intl.DateTimeFormat("en-US", {
- month: "short",
- day: "numeric",
- }).format(currentTime);
-
- const weekDay = new Intl.DateTimeFormat("en-US", {
- weekday: "long",
- }).format(currentTime);
-
- const timeString = new Intl.DateTimeFormat("en-US", {
- timeZone: user?.user_timezone,
- hour12: false, // Use 24-hour format
- hour: "2-digit",
- minute: "2-digit",
- }).format(currentTime);
-
- const greeting = parseInt(hour, 10) < 12 ? "morning" : parseInt(hour, 10) < 18 ? "afternoon" : "evening";
-
return (
- {t("good")} {t(greeting)}, {user?.first_name} {user?.last_name}
+ {t(`greetings.${greeting}`, { first_name: user?.first_name ?? "", last_name: user?.last_name ?? "" })}
-
{greeting === "morning" ? "🌤️" : greeting === "afternoon" ? "🌥️" : "🌙️"}
+ {greeting === "morning" ? "🌤️" : greeting === "afternoon" ? "🌥️" : "🌙"}
{weekDay}, {date} {timeString}
diff --git a/apps/web/core/components/user/user-greetings.tsx b/apps/web/core/components/user/user-greetings.tsx
index ff00a23ca93..f48b82c63fd 100644
--- a/apps/web/core/components/user/user-greetings.tsx
+++ b/apps/web/core/components/user/user-greetings.tsx
@@ -6,10 +6,9 @@
// plane types
import { useTranslation } from "@plane/i18n";
-// hooks
import type { IUser } from "@plane/types";
-import { useCurrentTime } from "@/hooks/use-current-time";
-// types
+// hooks
+import { useGreeting } from "@/hooks/use-greeting";
export interface IUserGreetingsView {
user: IUser;
@@ -17,41 +16,16 @@ export interface IUserGreetingsView {
export function UserGreetingsView(props: IUserGreetingsView) {
const { user } = props;
- // current time hook
- const { currentTime } = useCurrentTime();
- // store hooks
+ const { greeting, timeString, weekDay, date } = useGreeting(user);
const { t } = useTranslation();
- const hour = new Intl.DateTimeFormat("en-US", {
- hour12: false,
- hour: "numeric",
- }).format(currentTime);
-
- const date = new Intl.DateTimeFormat("en-US", {
- month: "short",
- day: "numeric",
- }).format(currentTime);
-
- const weekDay = new Intl.DateTimeFormat("en-US", {
- weekday: "long",
- }).format(currentTime);
-
- const timeString = new Intl.DateTimeFormat("en-US", {
- timeZone: user?.user_timezone,
- hour12: false, // Use 24-hour format
- hour: "2-digit",
- minute: "2-digit",
- }).format(currentTime);
-
- const greeting = parseInt(hour, 10) < 12 ? "morning" : parseInt(hour, 10) < 18 ? "afternoon" : "evening";
-
return (
- {t("good")} {t(greeting)}, {user?.first_name} {user?.last_name}
+ {t(`greetings.${greeting}`, { first_name: user?.first_name ?? "", last_name: user?.last_name ?? "" })}
-
{greeting === "morning" ? "🌤️" : greeting === "afternoon" ? "🌥️" : "🌙️"}
+ {greeting === "morning" ? "🌤️" : greeting === "afternoon" ? "🌥️" : "🌙"}
{weekDay}, {date} {timeString}
diff --git a/apps/web/core/hooks/use-greeting.ts b/apps/web/core/hooks/use-greeting.ts
new file mode 100644
index 00000000000..51dcb9f54a0
--- /dev/null
+++ b/apps/web/core/hooks/use-greeting.ts
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2023-present Plane Software, Inc. and contributors
+ * SPDX-License-Identifier: AGPL-3.0-only
+ * See the LICENSE file for details.
+ */
+
+import { useMemo } from "react";
+import type { IUser } from "@plane/types";
+import { useCurrentTime } from "@/hooks/use-current-time";
+
+export type TGreeting = "morning" | "afternoon" | "evening";
+
+export const useGreeting = (_user: IUser) => {
+ const { currentTime } = useCurrentTime();
+
+ const hourFormatter = useMemo(
+ () => new Intl.DateTimeFormat("en-US", { hourCycle: "h23", hour: "numeric" }),
+ []
+ );
+
+ const dateFormatter = useMemo(
+ () => new Intl.DateTimeFormat("en-US", { month: "short", day: "numeric" }),
+ []
+ );
+
+ const weekDayFormatter = useMemo(
+ () => new Intl.DateTimeFormat("en-US", { weekday: "long" }),
+ []
+ );
+
+ const timeStringFormatter = useMemo(
+ () => new Intl.DateTimeFormat("en-US", { hourCycle: "h23", hour: "2-digit", minute: "2-digit" }),
+ []
+ );
+
+ const hour = hourFormatter.format(currentTime);
+ const date = dateFormatter.format(currentTime);
+ const weekDay = weekDayFormatter.format(currentTime);
+ const timeString = timeStringFormatter.format(currentTime);
+
+ const hourNum = parseInt(hour, 10);
+ // 5–11: morning, 12–16: afternoon, 17–4: evening
+ const greeting: TGreeting =
+ hourNum >= 5 && hourNum < 12 ? "morning" : hourNum >= 12 && hourNum < 17 ? "afternoon" : "evening";
+
+ return { greeting, timeString, weekDay, date };
+};
diff --git a/packages/i18n/src/locales/cs/translations.ts b/packages/i18n/src/locales/cs/translations.ts
index d2a818f3b89..fc9f9a281e1 100644
--- a/packages/i18n/src/locales/cs/translations.ts
+++ b/packages/i18n/src/locales/cs/translations.ts
@@ -489,6 +489,11 @@ export default {
morning: "ráno",
afternoon: "odpoledne",
evening: "večer",
+ greetings: {
+ morning: "Dobré ráno, {first_name} {last_name}",
+ afternoon: "Dobré odpoledne, {first_name} {last_name}",
+ evening: "Dobrý večer, {first_name} {last_name}",
+ },
show_all: "Zobrazit vše",
show_less: "Zobrazit méně",
no_data_yet: "Zatím žádná data",
diff --git a/packages/i18n/src/locales/de/translations.ts b/packages/i18n/src/locales/de/translations.ts
index db4925f1f92..c39be25c285 100644
--- a/packages/i18n/src/locales/de/translations.ts
+++ b/packages/i18n/src/locales/de/translations.ts
@@ -502,6 +502,11 @@ export default {
morning: "Morgen",
afternoon: "Nachmittag",
evening: "Abend",
+ greetings: {
+ morning: "Guten Morgen, {first_name} {last_name}",
+ afternoon: "Guten Nachmittag, {first_name} {last_name}",
+ evening: "Guten Abend, {first_name} {last_name}",
+ },
show_all: "Alle anzeigen",
show_less: "Weniger anzeigen",
no_data_yet: "Noch keine Daten",
diff --git a/packages/i18n/src/locales/en/translations.ts b/packages/i18n/src/locales/en/translations.ts
index 2885fd3f0a1..a9f69e16371 100644
--- a/packages/i18n/src/locales/en/translations.ts
+++ b/packages/i18n/src/locales/en/translations.ts
@@ -322,6 +322,11 @@ export default {
morning: "morning",
afternoon: "afternoon",
evening: "evening",
+ greetings: {
+ morning: "Good morning, {first_name} {last_name}",
+ afternoon: "Good afternoon, {first_name} {last_name}",
+ evening: "Good evening, {first_name} {last_name}",
+ },
show_all: "Show all",
show_less: "Show less",
no_data_yet: "No Data yet",
diff --git a/packages/i18n/src/locales/es/translations.ts b/packages/i18n/src/locales/es/translations.ts
index 5ed015d06ca..6d847ef1f76 100644
--- a/packages/i18n/src/locales/es/translations.ts
+++ b/packages/i18n/src/locales/es/translations.ts
@@ -502,6 +502,11 @@ export default {
morning: "días",
afternoon: "tardes",
evening: "noches",
+ greetings: {
+ morning: "Buenos días, {first_name} {last_name}",
+ afternoon: "Buenas tardes, {first_name} {last_name}",
+ evening: "Buenas noches, {first_name} {last_name}",
+ },
show_all: "Mostrar todo",
show_less: "Mostrar menos",
no_data_yet: "Aún no hay datos",
diff --git a/packages/i18n/src/locales/fr/translations.ts b/packages/i18n/src/locales/fr/translations.ts
index f7ace4c6914..5790f92b050 100644
--- a/packages/i18n/src/locales/fr/translations.ts
+++ b/packages/i18n/src/locales/fr/translations.ts
@@ -498,6 +498,11 @@ export default {
morning: "matin",
afternoon: "après-midi",
evening: "soir",
+ greetings: {
+ morning: "Bonjour, {first_name} {last_name}",
+ afternoon: "Bon après-midi, {first_name} {last_name}",
+ evening: "Bonsoir, {first_name} {last_name}",
+ },
show_all: "Tout afficher",
show_less: "Afficher moins",
no_data_yet: "Pas encore de données",
diff --git a/packages/i18n/src/locales/id/translations.ts b/packages/i18n/src/locales/id/translations.ts
index f933b215e04..b8297af5aab 100644
--- a/packages/i18n/src/locales/id/translations.ts
+++ b/packages/i18n/src/locales/id/translations.ts
@@ -494,6 +494,11 @@ export default {
morning: "pagi",
afternoon: "siang",
evening: "malam",
+ greetings: {
+ morning: "Selamat pagi, {first_name} {last_name}",
+ afternoon: "Selamat siang, {first_name} {last_name}",
+ evening: "Selamat malam, {first_name} {last_name}",
+ },
show_all: "Tampilkan semua",
show_less: "Tampilkan lebih sedikit",
no_data_yet: "Belum ada data",
diff --git a/packages/i18n/src/locales/it/translations.ts b/packages/i18n/src/locales/it/translations.ts
index a0cb1b5c54f..c50a71f3d99 100644
--- a/packages/i18n/src/locales/it/translations.ts
+++ b/packages/i18n/src/locales/it/translations.ts
@@ -495,6 +495,11 @@ export default {
morning: "Mattina",
afternoon: "Pomeriggio",
evening: "Sera",
+ greetings: {
+ morning: "Buongiorno, {first_name} {last_name}",
+ afternoon: "Buon pomeriggio, {first_name} {last_name}",
+ evening: "Buonasera, {first_name} {last_name}",
+ },
show_all: "Mostra tutto",
show_less: "Mostra meno",
no_data_yet: "Nessun dato disponibile",
diff --git a/packages/i18n/src/locales/ja/translations.ts b/packages/i18n/src/locales/ja/translations.ts
index 6d79979904e..1a95f971c2f 100644
--- a/packages/i18n/src/locales/ja/translations.ts
+++ b/packages/i18n/src/locales/ja/translations.ts
@@ -488,6 +488,11 @@ export default {
morning: "ございます",
afternoon: "こんにちは",
evening: "こんばんは",
+ greetings: {
+ morning: "おはようございます、{first_name} {last_name}",
+ afternoon: "こんにちは、{first_name} {last_name}",
+ evening: "こんばんは、{first_name} {last_name}",
+ },
show_all: "すべて表示",
show_less: "表示を減らす",
no_data_yet: "まだデータがありません",
diff --git a/packages/i18n/src/locales/ko/translations.ts b/packages/i18n/src/locales/ko/translations.ts
index cf7e68d36a2..943e92cf233 100644
--- a/packages/i18n/src/locales/ko/translations.ts
+++ b/packages/i18n/src/locales/ko/translations.ts
@@ -482,6 +482,11 @@ export default {
morning: "아침",
afternoon: "오후",
evening: "저녁",
+ greetings: {
+ morning: "좋은 아침, {first_name} {last_name}",
+ afternoon: "좋은 오후, {first_name} {last_name}",
+ evening: "좋은 저녁, {first_name} {last_name}",
+ },
show_all: "모두 보기",
show_less: "간략히 보기",
no_data_yet: "아직 데이터 없음",
diff --git a/packages/i18n/src/locales/pl/translations.ts b/packages/i18n/src/locales/pl/translations.ts
index 225859e9635..e4485a1b646 100644
--- a/packages/i18n/src/locales/pl/translations.ts
+++ b/packages/i18n/src/locales/pl/translations.ts
@@ -488,6 +488,11 @@ export default {
morning: "rano",
afternoon: "po południu",
evening: "wieczorem",
+ greetings: {
+ morning: "Dzień dobry, {first_name} {last_name}",
+ afternoon: "Dzień dobry, {first_name} {last_name}",
+ evening: "Dobry wieczór, {first_name} {last_name}",
+ },
show_all: "Pokaż wszystko",
show_less: "Pokaż mniej",
no_data_yet: "Brak danych",
diff --git a/packages/i18n/src/locales/pt-BR/translations.ts b/packages/i18n/src/locales/pt-BR/translations.ts
index 5282692a17b..8230a00647a 100644
--- a/packages/i18n/src/locales/pt-BR/translations.ts
+++ b/packages/i18n/src/locales/pt-BR/translations.ts
@@ -498,6 +498,11 @@ export default {
morning: "manhã",
afternoon: "tarde",
evening: "noite",
+ greetings: {
+ morning: "Bom dia, {first_name} {last_name}",
+ afternoon: "Boa tarde, {first_name} {last_name}",
+ evening: "Boa noite, {first_name} {last_name}",
+ },
show_all: "Mostrar tudo",
show_less: "Mostrar menos",
no_data_yet: "Nenhum dado ainda",
diff --git a/packages/i18n/src/locales/ro/translations.ts b/packages/i18n/src/locales/ro/translations.ts
index 09a3312b6c8..a2e6028fb79 100644
--- a/packages/i18n/src/locales/ro/translations.ts
+++ b/packages/i18n/src/locales/ro/translations.ts
@@ -495,6 +495,11 @@ export default {
morning: "dimineața",
afternoon: "după-amiaza",
evening: "seara",
+ greetings: {
+ morning: "Bună dimineața, {first_name} {last_name}",
+ afternoon: "Bună ziua, {first_name} {last_name}",
+ evening: "Bună seara, {first_name} {last_name}",
+ },
show_all: "Arată tot",
show_less: "Arată mai puțin",
no_data_yet: "Nicio dată încă",
diff --git a/packages/i18n/src/locales/ru/translations.ts b/packages/i18n/src/locales/ru/translations.ts
index 52024d06cd1..8836278187a 100644
--- a/packages/i18n/src/locales/ru/translations.ts
+++ b/packages/i18n/src/locales/ru/translations.ts
@@ -497,6 +497,11 @@ export default {
morning: "утра",
afternoon: "дня",
evening: "вечера",
+ greetings: {
+ morning: "Доброе утро, {first_name} {last_name}",
+ afternoon: "Добрый день, {first_name} {last_name}",
+ evening: "Добрый вечер, {first_name} {last_name}",
+ },
show_all: "Показать все",
show_less: "Свернуть",
no_data_yet: "Нет данных",
diff --git a/packages/i18n/src/locales/sk/translations.ts b/packages/i18n/src/locales/sk/translations.ts
index 9a0c42e8e9e..7ed41885533 100644
--- a/packages/i18n/src/locales/sk/translations.ts
+++ b/packages/i18n/src/locales/sk/translations.ts
@@ -489,6 +489,11 @@ export default {
morning: "ráno",
afternoon: "popoludnie",
evening: "večer",
+ greetings: {
+ morning: "Dobré ráno, {first_name} {last_name}",
+ afternoon: "Dobré popoludnie, {first_name} {last_name}",
+ evening: "Dobrý večer, {first_name} {last_name}",
+ },
show_all: "Zobraziť všetko",
show_less: "Zobraziť menej",
no_data_yet: "Zatiaľ žiadne dáta",
diff --git a/packages/i18n/src/locales/tr-TR/translations.ts b/packages/i18n/src/locales/tr-TR/translations.ts
index 4e60e0cfbec..a6145a3398e 100644
--- a/packages/i18n/src/locales/tr-TR/translations.ts
+++ b/packages/i18n/src/locales/tr-TR/translations.ts
@@ -490,6 +490,11 @@ export default {
morning: "sabah",
afternoon: "öğleden sonra",
evening: "akşam",
+ greetings: {
+ morning: "Günaydın, {first_name} {last_name}",
+ afternoon: "İyi günler, {first_name} {last_name}",
+ evening: "İyi akşamlar, {first_name} {last_name}",
+ },
show_all: "Tümünü göster",
show_less: "Daha az göster",
no_data_yet: "Henüz veri yok",
diff --git a/packages/i18n/src/locales/ua/translations.ts b/packages/i18n/src/locales/ua/translations.ts
index 0c949cf0567..15edbd6bc5a 100644
--- a/packages/i18n/src/locales/ua/translations.ts
+++ b/packages/i18n/src/locales/ua/translations.ts
@@ -497,6 +497,11 @@ export default {
morning: "ранку",
afternoon: "дня",
evening: "вечора",
+ greetings: {
+ morning: "Добрий ранок, {first_name} {last_name}",
+ afternoon: "Добрий день, {first_name} {last_name}",
+ evening: "Добрий вечір, {first_name} {last_name}",
+ },
show_all: "Показати все",
show_less: "Показати менше",
no_data_yet: "Поки що немає даних",
diff --git a/packages/i18n/src/locales/vi-VN/translations.ts b/packages/i18n/src/locales/vi-VN/translations.ts
index 0cc12c75ea0..1c7d1ffa282 100644
--- a/packages/i18n/src/locales/vi-VN/translations.ts
+++ b/packages/i18n/src/locales/vi-VN/translations.ts
@@ -495,6 +495,11 @@ export default {
morning: "Buổi sáng",
afternoon: "Buổi chiều",
evening: "Buổi tối",
+ greetings: {
+ morning: "Chào buổi sáng, {first_name} {last_name}",
+ afternoon: "Chào buổi chiều, {first_name} {last_name}",
+ evening: "Chào buổi tối, {first_name} {last_name}",
+ },
show_all: "Hiển thị tất cả",
show_less: "Hiển thị ít hơn",
no_data_yet: "Chưa có dữ liệu",
diff --git a/packages/i18n/src/locales/zh-CN/translations.ts b/packages/i18n/src/locales/zh-CN/translations.ts
index 585ae13aa68..f60e3d741cf 100644
--- a/packages/i18n/src/locales/zh-CN/translations.ts
+++ b/packages/i18n/src/locales/zh-CN/translations.ts
@@ -477,6 +477,11 @@ export default {
morning: "早上",
afternoon: "下午",
evening: "晚上",
+ greetings: {
+ morning: "早上好,{first_name} {last_name}",
+ afternoon: "下午好,{first_name} {last_name}",
+ evening: "晚上好,{first_name} {last_name}",
+ },
show_all: "显示全部",
show_less: "显示更少",
no_data_yet: "暂无数据",
diff --git a/packages/i18n/src/locales/zh-TW/translations.ts b/packages/i18n/src/locales/zh-TW/translations.ts
index 1fcf528fb1d..699f5c4751b 100644
--- a/packages/i18n/src/locales/zh-TW/translations.ts
+++ b/packages/i18n/src/locales/zh-TW/translations.ts
@@ -476,6 +476,11 @@ export default {
morning: "早上",
afternoon: "下午",
evening: "晚上",
+ greetings: {
+ morning: "早安,{first_name} {last_name}",
+ afternoon: "午安,{first_name} {last_name}",
+ evening: "晚上好,{first_name} {last_name}",
+ },
show_all: "顯示全部",
show_less: "顯示較少",
no_data_yet: "尚無資料",