From 42d39b496267cdb4f860c41e98f89acbcb90aeab Mon Sep 17 00:00:00 2001 From: Darren Yu Date: Fri, 22 Aug 2025 12:16:12 +0800 Subject: [PATCH] feat(email): add preferred language setting in email template editor --- public/locales/de-DE/dashboard.json | 4 +++ public/locales/en-US/dashboard.json | 4 +++ public/locales/es-ES/dashboard.json | 4 +++ public/locales/fr-FR/dashboard.json | 4 +++ public/locales/it-IT/dashboard.json | 4 +++ public/locales/ja-JP/dashboard.json | 4 +++ public/locales/ko-KR/dashboard.json | 4 +++ public/locales/pt-BR/dashboard.json | 4 +++ public/locales/ru-RU/dashboard.json | 4 +++ public/locales/zh-CN/dashboard.json | 4 +++ public/locales/zh-TW/dashboard.json | 4 +++ .../Settings/Email/EmailTemplateEditor.tsx | 32 +++++++++++++++++-- 12 files changed, 73 insertions(+), 3 deletions(-) diff --git a/public/locales/de-DE/dashboard.json b/public/locales/de-DE/dashboard.json index 97c3a98..7f67c3d 100644 --- a/public/locales/de-DE/dashboard.json +++ b/public/locales/de-DE/dashboard.json @@ -567,6 +567,10 @@ "quotaExceededEmailTemplateDes": "E-Mail-Vorlage, die an Benutzer gesendet wird, wenn sie ihr Speicherkontingent überschreiten.", "resetPasswordEmailTemplate": "Passwort-Reset-Vorlage", "resetPasswordEmailTemplateDes": "E-Mail-Vorlage, die an Benutzer gesendet wird, wenn sie ein Passwort-Reset anfordern.", + "preferredLanguage": "Bevorzugte Sprache", + "setAsPreferredLanguage": "Als bevorzugte Sprache festlegen", + "setAsPreferredLanguageDes": "Wenn die Sprache des Benutzers nicht festgelegt ist, wird diese bevorzugte Sprache verwendet.", + "alreadyAsPreferredLanguageDes": "Die aktuelle Sprache ist bereits als bevorzugte Sprache festgelegt. Wenn die Sprache des Benutzers nicht festgelegt ist, wird diese bevorzugte Sprache verwendet.", "addLanguage": "Sprache hinzufügen", "languageCodeDes": "Bitte wählen Sie die Sprache aus, die Sie hinzufügen möchten.", "emailSubject": "E-Mail-Betreff", diff --git a/public/locales/en-US/dashboard.json b/public/locales/en-US/dashboard.json index d508b38..358c188 100644 --- a/public/locales/en-US/dashboard.json +++ b/public/locales/en-US/dashboard.json @@ -566,6 +566,10 @@ "quotaExceededEmailTemplateDes": "Email template sent to users when they exceed their storage quota.", "resetPasswordEmailTemplate": "Password reset template", "resetPasswordEmailTemplateDes": "Email template sent to users when they request a password reset.", + "preferredLanguage": "Preferred language", + "setAsPreferredLanguage": "Set as preferred language", + "setAsPreferredLanguageDes": "This language will be used as the default email template if the user's language preference cannot be determined.", + "alreadyAsPreferredLanguageDes": "This language is already set as the preferred language. If the user's language preference cannot be determined, this email template will be used.", "addLanguage": "Add language", "languageCodeDes": "Please select the language you want to add.", "emailSubject": "Email saveChanges", diff --git a/public/locales/es-ES/dashboard.json b/public/locales/es-ES/dashboard.json index 13527e0..d9a0f86 100644 --- a/public/locales/es-ES/dashboard.json +++ b/public/locales/es-ES/dashboard.json @@ -567,6 +567,10 @@ "quotaExceededEmailTemplateDes": "Plantilla de email enviada a los usuarios cuando exceden su cuota de almacenamiento.", "resetPasswordEmailTemplate": "Plantilla de restablecimiento de contraseña", "resetPasswordEmailTemplateDes": "Plantilla de email enviada a los usuarios cuando solicitan un restablecimiento de contraseña.", + "preferredLanguage": "Idioma preferido", + "setAsPreferredLanguage": "Establecer como idioma preferido", + "setAsPreferredLanguageDes": "Si no se puede obtener la preferencia de idioma del usuario, se utilizará la plantilla de correo electrónico del idioma preferido.", + "alreadyAsPreferredLanguageDes": "El idioma actual ya está establecido como preferido. Si no se puede obtener la preferencia de idioma del usuario, se utilizará esta plantilla de correo electrónico.", "addLanguage": "Agregar idioma", "languageCodeDes": "Por favor selecciona el idioma que quieres agregar.", "emailSubject": "Asunto del email", diff --git a/public/locales/fr-FR/dashboard.json b/public/locales/fr-FR/dashboard.json index 55fbd40..264e6da 100644 --- a/public/locales/fr-FR/dashboard.json +++ b/public/locales/fr-FR/dashboard.json @@ -567,6 +567,10 @@ "quotaExceededEmailTemplateDes": "Modèle d'e-mail envoyé aux utilisateurs lorsqu'ils dépassent leur quota de stockage.", "resetPasswordEmailTemplate": "Modèle de réinitialisation de mot de passe", "resetPasswordEmailTemplateDes": "Modèle d'e-mail envoyé aux utilisateurs lorsqu'ils demandent une réinitialisation de mot de passe.", + "preferredLanguage": "Langue préférée", + "setAsPreferredLanguage": "Définir comme langue préférée", + "setAsPreferredLanguageDes": "Si la préférence de langue de l'utilisateur ne peut pas être obtenue, le modèle d'e-mail de la langue préférée sera utilisé.", + "alreadyAsPreferredLanguageDes": "La langue actuelle est déjà définie comme langue préférée. Si la préférence de langue de l'utilisateur ne peut pas être obtenue, ce modèle d'e-mail sera utilisé.", "addLanguage": "Ajouter une langue", "languageCodeDes": "Veuillez sélectionner la langue que vous souhaitez ajouter.", "emailSubject": "Sujet de l'e-mail", diff --git a/public/locales/it-IT/dashboard.json b/public/locales/it-IT/dashboard.json index bdf3ca4..29e5dc2 100644 --- a/public/locales/it-IT/dashboard.json +++ b/public/locales/it-IT/dashboard.json @@ -567,6 +567,10 @@ "quotaExceededEmailTemplateDes": "Template email inviato agli utenti quando superano la loro quota di archiviazione.", "resetPasswordEmailTemplate": "Template reset password", "resetPasswordEmailTemplateDes": "Template email inviato agli utenti quando richiedono un reset della password.", + "preferredLanguage": "Lingua preferita", + "setAsPreferredLanguage": "Imposta come lingua preferita", + "setAsPreferredLanguageDes": "Se non è possibile ottenere le preferenze linguistiche dell'utente, verrà utilizzato il template email della lingua preferita.", + "alreadyAsPreferredLanguageDes": "La lingua corrente è già impostata come preferita. Se non è possibile ottenere le preferenze linguistiche dell'utente, verrà utilizzato il template email della lingua corrente.", "addLanguage": "Aggiungi lingua", "languageCodeDes": "Seleziona la lingua che vuoi aggiungere.", "emailSubject": "Oggetto email", diff --git a/public/locales/ja-JP/dashboard.json b/public/locales/ja-JP/dashboard.json index cf0afb9..18fc69a 100644 --- a/public/locales/ja-JP/dashboard.json +++ b/public/locales/ja-JP/dashboard.json @@ -566,6 +566,10 @@ "quotaExceededEmailTemplateDes": "ユーザーがストレージクォータを超過した際にユーザーに送信されるメールテンプレート。", "resetPasswordEmailTemplate": "パスワードリセットテンプレート", "resetPasswordEmailTemplateDes": "ユーザーがパスワードのリセットを要求した際にユーザーに送信されるメールテンプレート。", + "preferredLanguage": "優先言語", + "setAsPreferredLanguage": "優先言語に設定", + "setAsPreferredLanguageDes": "ユーザーの言語設定が取得できない場合、優先言語のメールテンプレートが使用されます。", + "alreadyAsPreferredLanguageDes": "現在の言語は既に優先言語として設定されています。ユーザーの言語設定が取得できない場合、優先言語のメールテンプレートが使用されます。", "addLanguage": "言語を追加", "languageCodeDes": "追加する言語を選択してください。", "emailSubject": "メール件名", diff --git a/public/locales/ko-KR/dashboard.json b/public/locales/ko-KR/dashboard.json index ed77b25..9612c27 100644 --- a/public/locales/ko-KR/dashboard.json +++ b/public/locales/ko-KR/dashboard.json @@ -566,6 +566,10 @@ "quotaExceededEmailTemplateDes": "사용자가 저장 할당량을 초과할 때 보내는 이메일 템플릿", "resetPasswordEmailTemplate": "비밀번호 재설정 템플릿", "resetPasswordEmailTemplateDes": "사용자가 비밀번호 재설정을 요청할 때 보내는 이메일 템플릿", + "preferredLanguage": "선호 언어", + "setAsPreferredLanguage": "선호 언어로 설정", + "setAsPreferredLanguageDes": "사용자의 언어 선호도를 가져올 수 없는 경우 선호 언어의 이메일 템플릿이 사용됩니다.", + "alreadyAsPreferredLanguageDes": "현재 언어가 선호 언어로 설정되어 있습니다. 사용자의 언어 선호도를 가져올 수 없는 경우 이 이메일 템플릿이 사용됩니다.", "addLanguage": "언어 추가", "languageCodeDes": "추가할 언어를 선택해 주세요.", "emailSubject": "이메일 제목", diff --git a/public/locales/pt-BR/dashboard.json b/public/locales/pt-BR/dashboard.json index 3cdc8df..a121ccd 100644 --- a/public/locales/pt-BR/dashboard.json +++ b/public/locales/pt-BR/dashboard.json @@ -567,6 +567,10 @@ "quotaExceededEmailTemplateDes": "Modelo de email enviado aos usuários quando excedem sua cota de armazenamento.", "resetPasswordEmailTemplate": "Modelo de redefinição de senha", "resetPasswordEmailTemplateDes": "Modelo de email enviado aos usuários quando solicitam redefinição de senha.", + "preferredLanguage": "Idioma preferido", + "setAsPreferredLanguage": "Definir como idioma preferido", + "setAsPreferredLanguageDes": "Se o idioma preferido do usuário não puder ser obtido, o modelo de email deste idioma será usado.", + "alreadyAsPreferredLanguageDes": "O idioma atual já está definido como preferido. Se o idioma preferido do usuário não puder ser obtido, o modelo de email deste idioma será usado.", "addLanguage": "Adicionar idioma", "languageCodeDes": "Selecione o idioma que deseja adicionar.", "emailSubject": "Assunto do email", diff --git a/public/locales/ru-RU/dashboard.json b/public/locales/ru-RU/dashboard.json index ea797d5..78f8295 100644 --- a/public/locales/ru-RU/dashboard.json +++ b/public/locales/ru-RU/dashboard.json @@ -567,6 +567,10 @@ "quotaExceededEmailTemplateDes": "Шаблон электронного письма, отправляемого пользователю при превышении квоты хранилища.", "resetPasswordEmailTemplate": "Шаблон сброса пароля", "resetPasswordEmailTemplateDes": "Шаблон электронного письма, отправляемого пользователю при запросе сброса пароля.", + "preferredLanguage": "Предпочитаемый язык", + "setAsPreferredLanguage": "Установить как предпочитаемый язык", + "setAsPreferredLanguageDes": "Если язык пользователя не может быть определен, будет использоваться предпочитаемый язык.", + "alreadyAsPreferredLanguageDes": "Этот язык уже установлен как предпочитаемый. Если язык пользователя не может быть определен, будет использоваться этот шаблон письма.", "addLanguage": "Добавить язык", "languageCodeDes": "Пожалуйста, выберите язык для добавления.", "emailSubject": "Тема письма", diff --git a/public/locales/zh-CN/dashboard.json b/public/locales/zh-CN/dashboard.json index 6d2347f..76be053 100644 --- a/public/locales/zh-CN/dashboard.json +++ b/public/locales/zh-CN/dashboard.json @@ -566,6 +566,10 @@ "quotaExceededEmailTemplateDes": "当用户超出存储配额时发送给用户的邮件模板。", "resetPasswordEmailTemplate": "密码重置模板", "resetPasswordEmailTemplateDes": "当用户请求重置密码时发送给用户的邮件模板。", + "preferredLanguage": "首选语言", + "setAsPreferredLanguage": "设为首选语言", + "setAsPreferredLanguageDes": "如果无法获取用户的语言偏好,将使用首选语言的邮件模板。", + "alreadyAsPreferredLanguageDes": "当前语言已设为首选语言。如果无法获取用户的语言偏好,将使用此邮件模板。", "addLanguage": "添加语言", "languageCodeDes": "请选择要添加的语言。", "emailSubject": "邮件主题", diff --git a/public/locales/zh-TW/dashboard.json b/public/locales/zh-TW/dashboard.json index 1199ece..8377506 100644 --- a/public/locales/zh-TW/dashboard.json +++ b/public/locales/zh-TW/dashboard.json @@ -566,6 +566,10 @@ "quotaExceededEmailTemplateDes": "當使用者超出儲存配額時傳送給使用者的郵件模板。", "resetPasswordEmailTemplate": "密碼重置模板", "resetPasswordEmailTemplateDes": "當使用者請求重置密碼時傳送給使用者的郵件模板。", + "preferredLanguage": "首選語言", + "setAsPreferredLanguage": "設為首選語言", + "setAsPreferredLanguageDes": "如果無法獲取使用者的語言偏好,將使用首選語言的郵件模板。", + "alreadyAsPreferredLanguageDes": "當前語言已設為首選語言。如果無法獲取使用者的語言偏好,將使用此郵件模板。", "addLanguage": "新增語言", "languageCodeDes": "請選擇要新增的語言。", "emailSubject": "郵件主題", diff --git a/src/component/Admin/Settings/Email/EmailTemplateEditor.tsx b/src/component/Admin/Settings/Email/EmailTemplateEditor.tsx index 54bb12f..dd8bc63 100644 --- a/src/component/Admin/Settings/Email/EmailTemplateEditor.tsx +++ b/src/component/Admin/Settings/Email/EmailTemplateEditor.tsx @@ -1,4 +1,3 @@ -import { Add } from "@mui/icons-material"; import { Box, Button, @@ -15,7 +14,8 @@ import React, { lazy, Suspense, useCallback, useEffect, useRef, useState } from import { Trans, useTranslation } from "react-i18next"; import { languages } from "../../../../i18n.ts"; import CircularProgress from "../../../Common/CircularProgress.tsx"; -import { DenseFilledTextField, DenseSelect } from "../../../Common/StyledComponents.tsx"; +import { DenseFilledTextField, DenseSelect, SecondaryButton } from "../../../Common/StyledComponents.tsx"; +import Add from "../../../Icons/Add"; import DraggableDialog from "../../../Dialogs/DraggableDialog.tsx"; import { SquareMenuItem } from "../../../FileManager/ContextMenu/ContextMenu.tsx"; import SettingForm from "../../../Pages/Setting/SettingForm.tsx"; @@ -57,6 +57,9 @@ const EmailTemplateEditor: React.FC = ({ value, onChan if (parsedTemplates.length === 0) { setTemplates([{ language: "en-US", title: "", body: "" }]); } + if (currentTab > parsedTemplates.length) { + setCurrentTab(0); + } } catch (e) { console.error("Failed to parse email template:", e); setTemplates([{ language: "en-US", title: "", body: "" }]); @@ -114,6 +117,12 @@ const EmailTemplateEditor: React.FC = ({ value, onChan setCurrentTab(templates.length); }; + const setPreferredLanguage = (index: number) => { + isUpdatingFromProp.current = false; // Ensure this is a user interaction + setTemplates([templates[index], ...templates.filter((_, i) => i !== index)]); + setCurrentTab(0); // Switch to the first tab as the preferred language is now at the top + }; + const openMagicVar = useCallback((e: React.MouseEvent) => { setMagicVarOpen(true); e.stopPropagation(); @@ -154,6 +163,23 @@ const EmailTemplateEditor: React.FC = ({ value, onChan > {currentTab === index && ( + + + {t("settings.preferredLanguage")} + + + (index === 0 ? undefined : setPreferredLanguage(index))} + > + {t("settings.setAsPreferredLanguage")} + + + + {t(index === 0 ? "settings.alreadyAsPreferredLanguageDes" : "settings.setAsPreferredLanguageDes")} + + + {t("settings.emailSubject")} @@ -242,4 +268,4 @@ const EmailTemplateEditor: React.FC = ({ value, onChan ); }; -export default EmailTemplateEditor; \ No newline at end of file +export default EmailTemplateEditor;