diff --git a/change.log b/change.log index 139d785..37f35c9 100644 --- a/change.log +++ b/change.log @@ -1,4 +1,5 @@ ## 更新日志 +- 20260425 新增德语/法语/西班牙语支持 - 20260423 优化 firefox 抖动问题和支持手机版,支持 edge 浏览器扩展 - 20260422 调整发送设置,支持仅发送附件 #### 20260421 更新匹配 0.27.x diff --git a/chrome/_locales/de/messages.json b/chrome/_locales/de/messages.json new file mode 100644 index 0000000..611e0b4 --- /dev/null +++ b/chrome/_locales/de/messages.json @@ -0,0 +1,197 @@ +{ + "extName": { + "message": "Memos" + }, + "actionTitle": { + "message": "An Memos senden" + }, + "extDescription": { + "message": "memos: Ein leichtgewichtiges, selbst gehostetes Memo-Hub." + }, + "sendTo": { + "message": "An Memos senden \"%s\"" + }, + "sendLinkTo": { + "message": "Link an Memos senden" + }, + "sendImageTo": { + "message": "Bild an Memos senden" + }, + "saveBtn": { + "message": "Speichern" + }, + "supportedMemosVersion": { + "message": "Kompatibel mit Memos v0.15.0 - 0.27.x" + }, + "settingsConnectionTitle": { + "message": "Verbindung" + }, + "settingsConnectionDesc": { + "message": "Konfiguriere die URL der Memos-Instanz und das Zugriffstoken." + }, + "settingsPostingTitle": { + "message": "Verfassen" + }, + "settingsPostingDesc": { + "message": "Standardtext für Uploads ohne Text" + }, + "placeApiUrl": { + "message": "URL der Memos-Instanz" + }, + "placeApiTokens": { + "message": "Memos-Zugriffstoken" + }, + "placeContent": { + "message": "Was geht dir durch den Kopf..." + }, + "lockPrivate": { + "message": "Privat" + }, + "lockProtected": { + "message": "Geschützt" + }, + "lockPublic": { + "message": "Öffentlich" + }, + "submitBtn": { + "message": "Speichern" + }, + "placeHideInput": { + "message": "Standardname für den Tag \"Privat\"" + }, + "placeShowInput": { + "message": "Standardname für den Tag \"Für alle sichtbar\"" + }, + "placeAttachmentOnlyDefaultText": { + "message": "Standardtext für Uploads ohne Text (leer lassen, um den eingebauten Text zu verwenden)" + }, + "uploadedListTitle": { + "message": "Hochgeladene Dateien, zum Neuordnen ziehen" + }, + "uploadedListEmpty": { + "message": "Keine hochgeladenen Dateien" + }, + "tipReorder": { + "message": "Zum Neuordnen ziehen" + }, + "tipDeleteAttachment": { + "message": "Löschen" + }, + "attachmentDeleteSuccess": { + "message": "Gelöscht" + }, + "attachmentDeleteFailed": { + "message": "Löschen fehlgeschlagen 😭" + }, + "picDrag": { + "message": "Bild zum Hochladen hierher ziehen" + }, + "picCancelDrag": { + "message": "Upload abbrechen" + }, + "picUploading": { + "message": "Bild wird hochgeladen..." + }, + "picSuccess": { + "message": "Upload abgeschlossen" + }, + "picFailed": { + "message": "Upload fehlgeschlagen" + }, + "picPending": { + "message": "Bild wird noch hochgeladen" + }, + "saveSuccess": { + "message": "Einstellungen gespeichert!" + }, + "searchNow": { + "message": "Wonach suchst du?" + }, + "searchNone": { + "message": "Versuche es mit einem anderen Wort!" + }, + "archiveSuccess": { + "message": "Archiviert 😊" + }, + "archiveFailed": { + "message": "Archivieren fehlgeschlagen 😭" + }, + "getTabFailed": { + "message": "Tab konnte nicht gelesen werden 😭" + }, + "memoUploading": { + "message": "Wird gesendet" + }, + "memoSuccess": { + "message": "Erfolgreich! 😊" + }, + "memoFailed": { + "message": "Fehlgeschlagen! 😭" + }, + "invalidToken": { + "message": "Ungültiges Token oder ungültige URL 😭" + }, + "tipOpenSite": { + "message": "Memos öffnen" + }, + "tipSettings": { + "message": "Einstellungen" + }, + "tipTags": { + "message": "Tag einfügen" + }, + "tipTodo": { + "message": "Todo einfügen" + }, + "tipUpload": { + "message": "Datei hochladen" + }, + "tipLink": { + "message": "Link des aktuellen Tabs einfügen" + }, + "tipRandom": { + "message": "Zufälliges Memo" + }, + "tipSearch": { + "message": "Suchen" + }, + "tipVisibility": { + "message": "Sichtbarkeit" + }, + "tipSend": { + "message": "Senden (Strg/⌘+Enter)" + }, + "tipLanguage": { + "message": "Sprache" + }, + "langAuto": { + "message": "Automatisch" + }, + "langEnglish": { + "message": "English" + }, + "langGerman": { + "message": "Deutsch" + }, + "langFrench": { + "message": "Français" + }, + "langSpanish": { + "message": "Español" + }, + "langChineseSimplified": { + "message": "简体中文" + }, + "langJapanese": { + "message": "日本語" + }, + "langKorean": { + "message": "한국어" + }, + "tipFullscreen": { + "message": "Vollbild-Editor öffnen" + }, + "tipResize": { + "message": "Zum Ändern der Größe ziehen (Minimum: Standardgröße)" + } +} \ No newline at end of file diff --git a/chrome/_locales/en/messages.json b/chrome/_locales/en/messages.json index 7404ca3..99ad187 100644 --- a/chrome/_locales/en/messages.json +++ b/chrome/_locales/en/messages.json @@ -170,6 +170,15 @@ "langEnglish": { "message": "English" }, + "langGerman": { + "message": "Deutsch" + }, + "langFrench": { + "message": "Français" + }, + "langSpanish": { + "message": "Español" + }, "langChineseSimplified": { "message": "简体中文" }, diff --git a/chrome/_locales/es/messages.json b/chrome/_locales/es/messages.json new file mode 100644 index 0000000..1d9d6b3 --- /dev/null +++ b/chrome/_locales/es/messages.json @@ -0,0 +1,197 @@ +{ + "extName": { + "message": "Memos" + }, + "actionTitle": { + "message": "Enviar a Memos" + }, + "extDescription": { + "message": "memos: un centro de notas ligero y autoalojado." + }, + "sendTo": { + "message": "Enviar a Memos \"%s\"" + }, + "sendLinkTo": { + "message": "Enviar enlace a Memos" + }, + "sendImageTo": { + "message": "Enviar imagen a Memos" + }, + "saveBtn": { + "message": "Guardar" + }, + "supportedMemosVersion": { + "message": "Compatible con Memos v0.15.0 - 0.27.x" + }, + "settingsConnectionTitle": { + "message": "Conexión" + }, + "settingsConnectionDesc": { + "message": "Configura la URL del sitio de Memos y el token de acceso." + }, + "settingsPostingTitle": { + "message": "Publicación" + }, + "settingsPostingDesc": { + "message": "Texto predeterminado para envíos solo con adjuntos" + }, + "placeApiUrl": { + "message": "URL del sitio de Memos" + }, + "placeApiTokens": { + "message": "Tokens de acceso de Memos" + }, + "placeContent": { + "message": "¿Qué tienes en mente...?" + }, + "lockPrivate": { + "message": "Privado" + }, + "lockProtected": { + "message": "Protegido" + }, + "lockPublic": { + "message": "Público" + }, + "submitBtn": { + "message": "Guardar" + }, + "placeHideInput": { + "message": "Nombre predeterminado de la etiqueta \"Privado\"" + }, + "placeShowInput": { + "message": "Nombre predeterminado de la etiqueta \"Visible para todos\"" + }, + "placeAttachmentOnlyDefaultText": { + "message": "Texto predeterminado para envíos solo con adjuntos (déjalo vacío para usar el texto integrado)" + }, + "uploadedListTitle": { + "message": "Archivos subidos, arrastra para reordenar" + }, + "uploadedListEmpty": { + "message": "No hay archivos subidos" + }, + "tipReorder": { + "message": "Arrastra para reordenar" + }, + "tipDeleteAttachment": { + "message": "Eliminar" + }, + "attachmentDeleteSuccess": { + "message": "Eliminado" + }, + "attachmentDeleteFailed": { + "message": "Error al eliminar 😭" + }, + "picDrag": { + "message": "Arrastra la imagen para subirla" + }, + "picCancelDrag": { + "message": "Cancelar subida" + }, + "picUploading": { + "message": "Subiendo la imagen..." + }, + "picSuccess": { + "message": "Subida completada" + }, + "picFailed": { + "message": "La subida falló" + }, + "picPending": { + "message": "La imagen aún se está subiendo" + }, + "saveSuccess": { + "message": "¡Configuración guardada!" + }, + "searchNow": { + "message": "¿Qué estás buscando?" + }, + "searchNone": { + "message": "¡Prueba con otra palabra!" + }, + "archiveSuccess": { + "message": "Archivado 😊" + }, + "archiveFailed": { + "message": "Error al archivar 😭" + }, + "getTabFailed": { + "message": "Error al obtener la pestaña 😭" + }, + "memoUploading": { + "message": "Enviando" + }, + "memoSuccess": { + "message": "¡Éxito! 😊" + }, + "memoFailed": { + "message": "¡Falló! 😭" + }, + "invalidToken": { + "message": "Token o URL no válidos 😭" + }, + "tipOpenSite": { + "message": "Abrir Memos" + }, + "tipSettings": { + "message": "Configuración" + }, + "tipTags": { + "message": "Insertar etiqueta" + }, + "tipTodo": { + "message": "Insertar tarea" + }, + "tipUpload": { + "message": "Subir archivo" + }, + "tipLink": { + "message": "Insertar enlace de la pestaña actual" + }, + "tipRandom": { + "message": "Memo aleatorio" + }, + "tipSearch": { + "message": "Buscar" + }, + "tipVisibility": { + "message": "Visibilidad" + }, + "tipSend": { + "message": "Enviar (Ctrl/⌘+Enter)" + }, + "tipLanguage": { + "message": "Idioma" + }, + "langAuto": { + "message": "Auto" + }, + "langEnglish": { + "message": "English" + }, + "langGerman": { + "message": "Deutsch" + }, + "langFrench": { + "message": "Français" + }, + "langSpanish": { + "message": "Español" + }, + "langChineseSimplified": { + "message": "简体中文" + }, + "langJapanese": { + "message": "日本語" + }, + "langKorean": { + "message": "한국어" + }, + "tipFullscreen": { + "message": "Abrir editor en pantalla completa" + }, + "tipResize": { + "message": "Arrastra para cambiar el tamaño (mín.: tamaño predeterminado)" + } +} \ No newline at end of file diff --git a/chrome/_locales/fr/messages.json b/chrome/_locales/fr/messages.json new file mode 100644 index 0000000..0362bfc --- /dev/null +++ b/chrome/_locales/fr/messages.json @@ -0,0 +1,197 @@ +{ + "extName": { + "message": "Memos" + }, + "actionTitle": { + "message": "Envoyer à Memos" + }, + "extDescription": { + "message": "memos : un hub de mémos léger et auto-hébergé." + }, + "sendTo": { + "message": "Envoyer à Memos \"%s\"" + }, + "sendLinkTo": { + "message": "Envoyer le lien vers Memos" + }, + "sendImageTo": { + "message": "Envoyer l'image vers Memos" + }, + "saveBtn": { + "message": "Enregistrer" + }, + "supportedMemosVersion": { + "message": "Compatible avec Memos v0.15.0 - 0.27.x" + }, + "settingsConnectionTitle": { + "message": "Connexion" + }, + "settingsConnectionDesc": { + "message": "Configurez l'URL du site Memos et le jeton d'accès." + }, + "settingsPostingTitle": { + "message": "Publication" + }, + "settingsPostingDesc": { + "message": "Texte par défaut pour les envois avec pièce jointe uniquement" + }, + "placeApiUrl": { + "message": "URL du site Memos" + }, + "placeApiTokens": { + "message": "Jetons d'accès Memos" + }, + "placeContent": { + "message": "À quoi pensez-vous..." + }, + "lockPrivate": { + "message": "Privé" + }, + "lockProtected": { + "message": "Protégé" + }, + "lockPublic": { + "message": "Public" + }, + "submitBtn": { + "message": "Enregistrer" + }, + "placeHideInput": { + "message": "Nom par défaut du tag \"Privé\"" + }, + "placeShowInput": { + "message": "Nom par défaut du tag \"Visible par tous\"" + }, + "placeAttachmentOnlyDefaultText": { + "message": "Texte par défaut pour les envois avec pièce jointe uniquement (laisser vide pour utiliser le texte intégré)" + }, + "uploadedListTitle": { + "message": "Fichiers téléversés, faites glisser pour réorganiser" + }, + "uploadedListEmpty": { + "message": "Aucun fichier téléversé" + }, + "tipReorder": { + "message": "Glisser pour réorganiser" + }, + "tipDeleteAttachment": { + "message": "Supprimer" + }, + "attachmentDeleteSuccess": { + "message": "Supprimé" + }, + "attachmentDeleteFailed": { + "message": "Échec de la suppression 😭" + }, + "picDrag": { + "message": "Faites glisser l'image pour la téléverser" + }, + "picCancelDrag": { + "message": "Annuler le téléversement" + }, + "picUploading": { + "message": "Téléversement de l'image..." + }, + "picSuccess": { + "message": "Téléversement terminé" + }, + "picFailed": { + "message": "Échec du téléversement" + }, + "picPending": { + "message": "Le téléversement de l'image est en cours" + }, + "saveSuccess": { + "message": "Paramètres enregistrés !" + }, + "searchNow": { + "message": "Que recherchez-vous ?" + }, + "searchNone": { + "message": "Essayez un autre mot !" + }, + "archiveSuccess": { + "message": "Archivé 😊" + }, + "archiveFailed": { + "message": "Échec de l'archivage 😭" + }, + "getTabFailed": { + "message": "Échec de la récupération de l'onglet 😭" + }, + "memoUploading": { + "message": "Envoi en cours" + }, + "memoSuccess": { + "message": "Succès ! 😊" + }, + "memoFailed": { + "message": "Échec ! 😭" + }, + "invalidToken": { + "message": "Jeton ou URL invalide 😭" + }, + "tipOpenSite": { + "message": "Ouvrir Memos" + }, + "tipSettings": { + "message": "Paramètres" + }, + "tipTags": { + "message": "Insérer un tag" + }, + "tipTodo": { + "message": "Insérer une tâche" + }, + "tipUpload": { + "message": "Téléverser un fichier" + }, + "tipLink": { + "message": "Insérer le lien de l'onglet actuel" + }, + "tipRandom": { + "message": "Mémo aléatoire" + }, + "tipSearch": { + "message": "Rechercher" + }, + "tipVisibility": { + "message": "Visibilité" + }, + "tipSend": { + "message": "Envoyer (Ctrl/⌘+Entrée)" + }, + "tipLanguage": { + "message": "Langue" + }, + "langAuto": { + "message": "Auto" + }, + "langEnglish": { + "message": "English" + }, + "langGerman": { + "message": "Deutsch" + }, + "langFrench": { + "message": "Français" + }, + "langSpanish": { + "message": "Español" + }, + "langChineseSimplified": { + "message": "简体中文" + }, + "langJapanese": { + "message": "日本語" + }, + "langKorean": { + "message": "한국어" + }, + "tipFullscreen": { + "message": "Ouvrir l'éditeur en plein écran" + }, + "tipResize": { + "message": "Glisser pour redimensionner (min. : taille par défaut)" + } +} \ No newline at end of file diff --git a/chrome/_locales/ja/messages.json b/chrome/_locales/ja/messages.json index d86008b..9fadab7 100644 --- a/chrome/_locales/ja/messages.json +++ b/chrome/_locales/ja/messages.json @@ -170,6 +170,15 @@ "langEnglish": { "message": "English" }, + "langGerman": { + "message": "Deutsch" + }, + "langFrench": { + "message": "Français" + }, + "langSpanish": { + "message": "Español" + }, "langChineseSimplified": { "message": "简体中文" }, diff --git a/chrome/_locales/ko/messages.json b/chrome/_locales/ko/messages.json index 8e20cac..32ee389 100644 --- a/chrome/_locales/ko/messages.json +++ b/chrome/_locales/ko/messages.json @@ -170,6 +170,15 @@ "langEnglish": { "message": "English" }, + "langGerman": { + "message": "Deutsch" + }, + "langFrench": { + "message": "Français" + }, + "langSpanish": { + "message": "Español" + }, "langChineseSimplified": { "message": "简体中文" }, diff --git a/chrome/_locales/zh_CN/messages.json b/chrome/_locales/zh_CN/messages.json index 97974b8..c4ae262 100644 --- a/chrome/_locales/zh_CN/messages.json +++ b/chrome/_locales/zh_CN/messages.json @@ -170,6 +170,15 @@ "langEnglish": { "message": "English" }, + "langGerman": { + "message": "Deutsch" + }, + "langFrench": { + "message": "Français" + }, + "langSpanish": { + "message": "Español" + }, "langChineseSimplified": { "message": "简体中文" }, diff --git a/chrome/js/de.js b/chrome/js/de.js new file mode 100644 index 0000000..98f535c --- /dev/null +++ b/chrome/js/de.js @@ -0,0 +1 @@ +!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],n):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_de=n(e.dayjs)}(this,(function(e){"use strict";function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=n(e),a={name:"de",weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),months:"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sept._Okt._Nov._Dez.".split("_"),weekStart:1,formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:"einer Minute",mm:"%d Minuten",h:"einer Stunde",hh:"%d Stunden",d:"einem Tag",dd:"%d Tagen",M:"einem Monat",MM:"%d Monaten",y:"einem Jahr",yy:"%d Jahren"},ordinal:function(e){return e+"."}};return t.default.locale(a,null,!0),a})); \ No newline at end of file diff --git a/chrome/js/es.js b/chrome/js/es.js new file mode 100644 index 0000000..b787ce0 --- /dev/null +++ b/chrome/js/es.js @@ -0,0 +1 @@ +!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],n):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_es=n(e.dayjs)}(this,(function(e){"use strict";function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=n(e),a={name:"es",weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_sá".split("_"),months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:"ene._feb._mar._abr._may._jun._jul._ago._sept._oct._nov._dic.".split("_"),weekStart:1,formats:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},ordinal:function(e){return e+"º"}};return t.default.locale(a,null,!0),a})); \ No newline at end of file diff --git a/chrome/js/fr.js b/chrome/js/fr.js new file mode 100644 index 0000000..67789c5 --- /dev/null +++ b/chrome/js/fr.js @@ -0,0 +1 @@ +!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],n):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_fr=n(e.dayjs)}(this,(function(e){"use strict";function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=n(e),a={name:"fr",weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),weekStart:1,formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinal:function(e){return e+(1===e?"er":"")}};return t.default.locale(a,null,!0),a})); \ No newline at end of file diff --git a/chrome/js/i18n.js b/chrome/js/i18n.js index 734718a..31014aa 100644 --- a/chrome/js/i18n.js +++ b/chrome/js/i18n.js @@ -1,6 +1,6 @@ const UI_LANGUAGE_STORAGE_KEY = 'uiLanguage' -const SUPPORTED_UI_LANGUAGES = new Set(['auto', 'en', 'zh_CN', 'ja', 'ko']) +const SUPPORTED_UI_LANGUAGES = new Set(['auto', 'en', 'de', 'fr', 'es', 'zh_CN', 'ja', 'ko']) function normalizeUiLanguage(value) { const lang = String(value || 'auto') @@ -49,6 +49,9 @@ let overrideMessages = null function getLanguageToggleLabel(lang) { if (lang === 'en') return 'EN' + if (lang === 'de') return 'DE' + if (lang === 'fr') return 'FR' + if (lang === 'es') return 'ES' if (lang === 'zh_CN') return '中' if (lang === 'ja') return '日' if (lang === 'ko') return '한' @@ -132,6 +135,9 @@ function applyStaticI18n() { // Language switcher setText('langOptionAuto', 'langAuto') setText('langOptionEn', 'langEnglish') + setText('langOptionDe', 'langGerman') + setText('langOptionFr', 'langFrench') + setText('langOptionEs', 'langSpanish') setText('langOptionZhCN', 'langChineseSimplified') setText('langOptionJa', 'langJapanese') setText('langOptionKo', 'langKorean') diff --git a/chrome/js/oper.js b/chrome/js/oper.js index 461c6be..99b3ede 100644 --- a/chrome/js/oper.js +++ b/chrome/js/oper.js @@ -162,6 +162,21 @@ function msg(key) { function applyDayjsLocaleByUiLanguage(uiLang) { const lang = String(uiLang || 'auto') + if (lang === 'de') { + dayjs.locale('de') + return + } + + if (lang === 'fr') { + dayjs.locale('fr') + return + } + + if (lang === 'es') { + dayjs.locale('es') + return + } + if (lang === 'zh_CN') { dayjs.locale('zh-cn') return @@ -184,6 +199,18 @@ function applyDayjsLocaleByUiLanguage(uiLang) { // auto: best-effort infer from browser UI language const ui = String(chrome.i18n.getUILanguage ? chrome.i18n.getUILanguage() : '').toLowerCase() + if (ui.startsWith('de')) { + dayjs.locale('de') + return + } + if (ui.startsWith('fr')) { + dayjs.locale('fr') + return + } + if (ui.startsWith('es')) { + dayjs.locale('es') + return + } if (ui.startsWith('zh')) { dayjs.locale('zh-cn') return diff --git a/chrome/manifest.json b/chrome/manifest.json index 0e901ed..ee61808 100644 --- a/chrome/manifest.json +++ b/chrome/manifest.json @@ -2,7 +2,7 @@ "manifest_version": 3, "name": "__MSG_extName__", "default_locale": "en", - "version": "2026.04.24", + "version": "2026.04.25", "action": { "default_popup": "popup.html", "default_icon": "assets/logo_24x24.png", diff --git a/chrome/popup.html b/chrome/popup.html index ad1741e..18e9305 100644 --- a/chrome/popup.html +++ b/chrome/popup.html @@ -25,6 +25,9 @@