diff --git a/cwd cwd-admin/src/locales/fr.json b/cwd cwd-admin/src/locales/fr.json new file mode 100644 index 0000000..cc9d595 --- /dev/null +++ b/cwd cwd-admin/src/locales/fr.json @@ -0,0 +1,304 @@ +{ + "menu": { + "comments": "Gérer les commentaires", + "stats": "Tableau de bord", + "analytics": "Analytique", + "settings": "Paramètres du site", + "data": "Gestion des données" + }, + "layout": { + "toggleMenu": "Basculer le menu", + "docs": "Documentation", + "logout": "Déconnexion", + "moreActions": "Plus d'actions", + "defaultSite": "Site par défaut", + "theme": { + "light": "Mode clair", + "dark": "Mode sombre", + "system": "Système" + }, + "version": { + "title": "Informations sur la version", + "apiAddress": "Adresse API", + "apiVersion": "Version API", + "adminVersion": "Version Admin", + "match": "Les versions Admin et API correspondent.", + "mismatch": "Les versions ne correspondent pas. Mise à jour de l'API recommandée.", + "fetchError": "Échec de la récupération de la version:", + "loading": "Chargement...", + "notConfigured": "Non configuré", + "notFetched": "Non récupéré", + "ok": "Compris" + } + }, + "stats": { + "title": "Tableau de bord", + "overview": "Aperçu", + "total": "Total des commentaires", + "approved": "Approuvé", + "pending": "En attente", + "rejected": "Rejeté", + "trend": "Tendance des commentaires", + "bySite": "Statistiques par site", + "last7Days": "7 derniers jours", + "last30Days": "30 derniers jours", + "noData": "Aucune donnée de commentaire", + "table": { + "domain": "Domaine", + "total": "Total", + "approved": "Approuvé", + "pending": "En attente", + "rejected": "Rejeté" + }, + "loadError": "Échec du chargement des statistiques" + }, + "analytics": { + "title": "Analytique", + "overview": "Aperçu", + "totalPv": "Visites totales", + "todayPv": "Aujourd'hui", + "weekPv": "Cette semaine", + "monthPv": "Ce mois", + "totalPages": "Pages avec visites", + "trend": "Tendance des visites", + "pageDetail": "Détails des pages", + "likeRank": "Classement des J'aime", + "last7Days": "7 derniers jours", + "last30Days": "30 derniers jours", + "sort": { + "pv": "Trier par PV", + "latest": "Dernière visite" + }, + "table": { + "title": "Titre de la page", + "pv": "Visites", + "time": "Dernière visite", + "url": "URL", + "rank": "Rang", + "like": "J'aime" + }, + "noData": "Aucune donnée de visite", + "noLikeData": "Aucune donnée de J'aime", + "loadError": "Échec du chargement des données d'analyse" + }, + "data": { + "title": "Gestion des données", + "sections": { + "comments": { + "title": "Données de commentaires", + "desc": "Gérer le contenu des commentaires et migrer des données d'autres systèmes de commentaires.", + "exportLabel": "Exporter:", + "exporting": "Exportation...", + "exportJson": "Exporter JSON", + "importLabel": "Importer:", + "importButton": "Importer les commentaires", + "source": { + "cwd": "CWD (.json)", + "twikoo": "Twikoo (.json)", + "artalk": "Artalk (.json)" + } + }, + "config": { + "title": "Configuration système", + "desc": "Gérer les paramètres admin, configuration e-mail, listes noires, etc.", + "export": "Exporter la config", + "import": "Importer la config" + }, + "stats": { + "title": "Statistiques de visites", + "desc": "Gérer les vues de pages, J'aime et tendances quotidiennes.", + "export": "Exporter les statistiques", + "import": "Importer les statistiques" + }, + "backup": { + "title": "Sauvegarde complète", + "desc": "Sauvegard ou restaurer toutes les données (commentaires + config + statistiques) en un clic.", + "export": "Tout exporter", + "import": "Tout restaurer" + } + }, + "logs": { + "title": "Journal des opérations" + }, + "prefixModal": { + "title": "URLs sans préfixe détectées", + "descPart1": "Détecté ", + "descPart2": " commentaires dont les URLs n'ont pas de préfixe de domaine (http/https).", + "descPart3": "Ajouter le préfixe automatiquement lors de l'importation?", + "label": "Préfixe de domaine (ex. https://example.me)", + "placeholder": "Entrez le préfixe de domaine", + "skip": "Importer directement (sans préfixe)", + "confirm": "Ajouter le préfixe et importer" + }, + "messages": { + "exportSuccess": "Exportation réussie", + "exportFailed": "Échec de l'exportation", + "fileReadFailed": "Échec de la lecture du fichier", + "jsonParseFailed": "Échec de l'analyse JSON, vérifiez le format du fichier", + "importConfigSuccess": "Configuration importée avec succès", + "importStatsSuccess": "Statistiques importées avec succès", + "importBackupSuccess": "Restauration complète réussie", + "importCommentsSuccess": "Commentaires importés avec succès", + "prefixRequired": "Veuillez entrer un préfixe de domaine", + "importStart": "Démarrage de l'importation: {name} (mode: {mode})", + "fileParseSuccess": "Fichier analysé avec succès, début du traitement...", + "errorWithMessage": "Erreur: {msg}", + "parsedCommentsCount": "{count} enregistrements de commentaires analysés", + "detectMissingPrefix": "{count} URLs sans préfixe détectées, en attente de confirmation...", + "prefixAdded": "Préfixe ajouté, poursuite de l'importation...", + "skipPrefix": "Utilisateur a sauté l'ajout du préfixe", + "readFileFailedLog": "Échec de la lecture du fichier", + "importCommentsDone": "Importation terminée: {message}" + } + }, + "comments": { + "title": "Gérer les commentaires", + "statusFilter": { + "all": "Tous les statuts", + "approved": "Approuvé", + "pending": "En attente", + "rejected": "Rejeté" + }, + "refresh": "Actualiser", + "table": { + "author": "Utilisateur", + "content": "Contenu", + "path": "Chemin", + "status": "Statut", + "actions": "Actions", + "admin": "Admin", + "time": "Heure", + "ip": "IP", + "email": "E-mail" + }, + "actions": { + "approv": "Approuver", + "pending": "En attente", + "reject": "Rejeter", + "edit": "Modifier", + "delete": "Supprimer", + "blockIp": "Bloquer l'IP", + "blockEmail": "Bloquer l'e-mail", + "pin": "Épingler" + }, + "pagination": { + "prev": "Précédent", + "next": "Suivant", + "jumpTo": "Aller à", + "page": "Page", + "confirm": "Go" + }, + "confirmDelete": "Voulez-vous vraiment supprimer le commentaire {id}?", + "confirmBlockIp": "Voulez-vous vraiment bloquer l'IP {ip}?", + "confirmBlockEmail": "Voulez-vous vraiment bloquer l'e-mail {email}?", + "successBlockIp": "IP bloqué avec succès", + "successBlockEmail": "E-mail bloqué avec succès", + "empty": "Aucune donnée", + "editModal": { + "title": "Modifier le commentaire", + "name": "Pseudo", + "email": "E-mail", + "url": "Site web", + "postSlug": "Slug", + "postUrl": "URL", + "content": "Contenu", + "status": "Statut", + "priority": "Priorité (1=Normal, Plus élevé=En haut)", + "cancel": "Annuler", + "save": "Enregistrer", + "saving": "Enregistrement..." + } + }, + "settings": { + "title": "Paramètres du site", + "tabs": { + "comment": "Commentaires et Sécurité", + "feature": "Fonctionnalités", + "emailNotify": "Notification par E-mail", + "telegramNotify": "Notification Telegram", + "display": "Affichage Admin" + }, + "comment": { + "title": "Configuration d'affichage des commentaires", + "adminEmail": "E-mail Admin", + "adminBadge": "Texte du Badge Admin (Laisser vide pour l'icône par défaut)", + "adminEnabled": "Afficher le Badge Admin", + "avatarPrefix": "Préfixe d'Avatar (Par défaut: https://gravatar.com/avatar)", + "securityTitle": "Paramètres de sécurité", + "requireReview": "Nécessite une approbation pour les nouveaux commentaires", + "adminKey": "Clé Admin (Requis pour utiliser l'e-mail admin dans les commentaires frontend)", + "adminKeyPlaceholder": "Entrez la clé pour définir ou modifier", + "allowedDomains": "Domaines autorisés (Seuls les domaines correspondants peuvent utiliser le widget. Séparés par espace ou virgule. Laisser vide pour tous.)", + "blockedIps": "IPs bloquées (Séparées par virgule ou saut de ligne)", + "blockedEmails": "E-mails bloqués (Séparés par virgule ou saut de ligne)", + "save": "Enregistrer", + "saving": "Enregistrement..." + }, + "feature": { + "title": "Paramètres des fonctionnalités", + "articleLike": "Activer J'aime sur les articles", + "articleLikeHint": "Affiche un bouton J'aime en haut de la section des commentaires.", + "commentLike": "Activer J'aime sur les commentaires", + "commentLikeHint": "Affiche un bouton J'aime pour chaque commentaire.", + "imageLightbox": "Lightbox d'images", + "imageLightboxHint": "Active la prévisualisation en lightbox lors du clic sur les images dans les commentaires.", + "placeholder": "Texte de remplacement de la zone de commentaires", + "placeholderHint": "Texte de remplacement personnalisé. Laisser vide pour la valeur par défaut.", + "widgetLanguage": "Langue du Widget", + "widgetLanguageHint": "Langue affichée dans le widget de commentaires frontend.", + "save": "Enregistrer", + "saving": "Enregistrement..." + }, + "emailNotify": { + "title": "Paramètres de notification par E-mail", + "enable": "Activer la notification par E-mail", + "smtpTitle": "1. Configuration SMTP", + "provider": "Fournisseur d'E-mail", + "host": "Hôte SMTP", + "port": "Port SMTP", + "secure": "Connexion SSL", + "user": "Compte E-mail", + "pass": "Code d'autorisation / Mot de passe", + "qqHint": "Note: QQ Mail nécessite un code d'autorisation, pas votre mot de passe.", + "163Hint": "Note: 163 Mail nécessite un code d'autorisation, pas votre mot de passe.", + "templateTitle": "2. Modèles d'E-mail", + "adminTemplate": "Modèle de notification Admin (HTML)", + "adminTemplateHint": "Variables: ${commentAuthor}, ${postTitle}, ${postUrl}, ${commentContent}", + "replyTemplate": "Modèle de notification de réponse (HTML)", + "replyTemplateHint": "Variables: ${toName}, ${replyAuthor}, ${postTitle}, ${postUrl}, ${parentComment}, ${replyContent}", + "testBtn": "Envoyer un E-mail de test", + "testingBtn": "Envoi...", + "resetBtn": "Réinitialiser les modèles", + "save": "Enregistrer la configuration", + "saving": "Enregistrement..." + }, + "telegramNotify": { + "title": "Paramètres de notification Telegram", + "enable": "Activer la notification Telegram", + "botToken": "Token du Bot", + "botTokenHint": "Cherchez @BotFather dans Telegram pour créer un bot et obtenir le Token", + "chatId": "ID de Chat", + "chatIdHint": "ID d'utilisateur ou de groupe. Envoyez d'abord un message au bot, puis obtenez l'ID via l'API, ou utilisez @userinfobot.", + "webhookBtn": "Configuration Webhook en un clic", + "webhookSetting": "Configuration en cours...", + "testBtn": "Envoyer un message de test", + "testingBtn": "Envoi...", + "save": "Enregistrer", + "saving": "Enregistrement..." + }, + "display": { + "title": "Paramètres d'affichage Admin", + "layoutTitle": "Titre Admin", + "layoutTitleHint": "Affiché à gauche de la barre de navigation supérieure.", + "adminLanguage": "Langue Admin", + "adminLanguageHint": "Langue affichée dans le panneau d'administration.", + "save": "Enregistrer", + "saving": "Enregistrement..." + } + }, + "common": { + "saveSuccess": "Enregistré avec succès", + "saveFailed": "Échec de l'enregistrement", + "loading": "Chargement..." + } +} diff --git a/cwd-admin/package.json b/cwd-admin/package.json index 1552492..7854259 100644 --- a/cwd-admin/package.json +++ b/cwd-admin/package.json @@ -11,6 +11,7 @@ "@phosphor-icons/vue": "^2.2.1", "echarts": "^5.5.0", "vue": "^3.5.13", + "vue-i18n": "^9.14.5", "vue-router": "^4.4.5" }, "devDependencies": { @@ -20,4 +21,4 @@ "vite": "^6.0.11", "vue-tsc": "^2.1.10" } -} \ No newline at end of file +} diff --git a/cwd-admin/src/i18n.ts b/cwd-admin/src/i18n.ts new file mode 100644 index 0000000..54d7178 --- /dev/null +++ b/cwd-admin/src/i18n.ts @@ -0,0 +1,41 @@ +import { createI18n } from 'vue-i18n'; +import zhCN from './locales/zh-CN.json'; +import enUS from './locales/en-US.json'; +import zhTW from './locales/zh-TW.json'; +import es from './locales/es.json'; +import pt from './locales/pt.json'; +import fr from './locales/fr.json'; +import de from './locales/de.json'; +import ja from './locales/ja.json'; +import ko from './locales/ko.json'; +import ru from './locales/ru.json'; +import it from './locales/it.json'; +import nl from './locales/nl.json'; +import ar from './locales/ar.json'; +import hi from './locales/hi.json'; +import id from './locales/id.json'; + +const i18n = createI18n({ + legacy: false, // 使用 Composition API + locale: localStorage.getItem('admin_language') || 'zh-CN', // 默认语言 + fallbackLocale: 'zh-CN', + messages: { + 'zh-CN': zhCN, + 'en-US': enUS, + 'zh-TW': zhTW, + 'es': es, + 'pt': pt, + 'fr': fr, + 'de': de, + 'ja': ja, + 'ko': ko, + 'ru': ru, + 'it': it, + 'nl': nl, + 'ar': ar, + 'hi': hi, + 'id': id, + }, +}); + +export default i18n; diff --git a/cwd-admin/src/locales/ar.json b/cwd-admin/src/locales/ar.json new file mode 100644 index 0000000..da39582 --- /dev/null +++ b/cwd-admin/src/locales/ar.json @@ -0,0 +1,304 @@ +{ + "menu": { + "comments": "إدارة التعليقات", + "stats": "لوحة المعلومات", + "analytics": "إحصائيات الزيارات", + "settings": "إعدادات الموقع", + "data": "إدارة البيانات" + }, + "layout": { + "toggleMenu": "تبديل القائمة", + "docs": "الوثائق", + "logout": "تسجيل الخروج", + "moreActions": "المزيد من الإجراءات", + "defaultSite": "الموقع الافتراضي", + "theme": { + "light": "فاتح", + "dark": "داكن", + "system": "النظام" + }, + "version": { + "title": "معلومات الإصدار", + "apiAddress": "عنوان API", + "apiVersion": "إصدار الواجهة", + "adminVersion": "إصدار الإدارة", + "match": "إصدار الإدارة الحالي متطابق مع إصدار الواجهة، يمكنك استخدامه بشكل طبيعي.", + "mismatch": "إصدار الإدارة الحالي غير متطابق مع إصدار الواجهة، يوصى بتحديث خدمة API لتجنب مشاكل التوافق.", + "fetchError": "فشل في جلب إصدار الواجهة:", + "loading": "جارٍ التحميل...", + "notConfigured": "غير مكون", + "notFetched": "لم يتم الجلب", + "ok": "حسناً" + } + }, + "stats": { + "title": "لوحة المعلومات", + "overview": "نظرة عامة", + "total": "إجمالي التعليقات", + "approved": "تمت الموافقة", + "pending": "قيد الانتظار", + "rejected": "مرفوض", + "trend": "اتجاه التعليقات", + "bySite": "الإحصائيات حسب الموقع", + "last7Days": "آخر 7 أيام", + "last30Days": "آخر 30 يوماً", + "noData": "لا توجد بيانات تعليقات", + "table": { + "domain": "النطاق", + "total": "الإجمالي", + "approved": "تمت الموافقة", + "pending": "قيد الانتظار", + "rejected": "مرفوض" + }, + "loadError": "فشل تحميل الإحصائيات" + }, + "analytics": { + "title": "إحصائيات الزيارات", + "overview": "نظرة عامة", + "totalPv": "إجمالي الزيارات", + "todayPv": "زيارات اليوم", + "weekPv": "زيارات الأسبوع", + "monthPv": "زيارات الشهر", + "totalPages": "الصفحات التي تمت زيارتها", + "trend": "اتجاه الزيارات", + "pageDetail": "تفاصيل الصفحة", + "likeRank": "أعلى الصفحات إعجاباً", + "last7Days": "آخر 7 أيام", + "last30Days": "آخر 30 يوماً", + "sort": { + "pv": "ترتيب حسب المشاهدات", + "latest": "أحدث زيارة" + }, + "table": { + "title": "عنوان الصفحة", + "pv": "المشاهدات", + "time": "آخر زيارة", + "url": "رابط الصفحة", + "rank": "الترتيب", + "like": "الإعجابات" + }, + "noData": "لا توجد بيانات زيارة", + "noLikeData": "لا توجد بيانات إعجاب", + "loadError": "فشل تحميل إحصائيات الزيارات" + }, + "data": { + "title": "إدارة البيانات", + "sections": { + "comments": { + "title": "بيانات التعليقات", + "desc": "إدارة محتوى التعليقات، يدعم نقل البيانات من أنظمة التعليقات الأخرى.", + "exportLabel": "تصدير:", + "exporting": "جارٍ التصدير...", + "exportJson": "تصدير JSON", + "importLabel": "استيراد:", + "importButton": "استيراد التعليقات", + "source": { + "cwd": "CWD (.json)", + "twikoo": "Twikoo (.json)", + "artalk": "Artalk (.json)" + } + }, + "config": { + "title": "تكوين النظام", + "desc": "إدارة إعدادات الخلفية، تكوين البريد الإلكتروني، القوائم السوداء، إلخ.", + "export": "تصدير التكوين", + "import": "استيراد التكوين" + }, + "stats": { + "title": "إحصائيات الزيارات", + "desc": "إدارة زيارات المقالات، الإعجابات، واتجاهات الزيارة اليومية.", + "export": "تصدير الإحصائيات", + "import": "استيراد الإحصائيات" + }, + "backup": { + "title": "نسخ احتياطي كامل", + "desc": "نسخ احتياطي أو استعادة جميع بيانات النظام (التعليقات + التكوين + الإحصائيات).", + "export": "تصدير كامل", + "import": "استعادة كاملة" + } + }, + "logs": { + "title": "سجلات العمليات" + }, + "prefixModal": { + "title": "بادئة URL مفقودة", + "descPart1": "تم اكتشاف ", + "descPart2": " تعليق بدون بادئة النطاق (http/https).", + "descPart3": "هل تريد إضافتها أثناء الاستيراد؟", + "label": "بادئة النطاق (مثال: https://example.me)", + "placeholder": "الرجاء إدخال بادئة النطاق", + "skip": "استيراد مباشر (بدون إضافة)", + "confirm": "إضافة واستيراد" + }, + "messages": { + "exportSuccess": "تم التصدير بنجاح", + "exportFailed": "فشل التصدير", + "fileReadFailed": "فشل قراءة الملف", + "jsonParseFailed": "فشل تحليل JSON، يرجى التحقق من تنسيق الملف", + "importConfigSuccess": "تم استيراد التكوين بنجاح", + "importStatsSuccess": "تم استيراد بيانات الإحصائيات بنجاح", + "importBackupSuccess": "تمت الاستعادة الكاملة بنجاح", + "importCommentsSuccess": "تم استيراد التعليقات بنجاح", + "prefixRequired": "الرجاء إدخال بادئة النطاق", + "importStart": "بدء الاستيراد: {name} (الوضع: {mode})", + "fileParseSuccess": "تم تحليل الملف بنجاح، جارٍ المعالجة...", + "errorWithMessage": "خطأ: {msg}", + "parsedCommentsCount": "تم تحليل {count} تعليق", + "detectMissingPrefix": "تم اكتشاف {count} رابط بدون بادئة، في انتظار تأكيد المستخدم...", + "prefixAdded": "تمت إضافة البادئة، متابعة الاستيراد...", + "skipPrefix": "تخطى المستخدم إضافة البادئة", + "readFileFailedLog": "فشل قراءة الملف", + "importCommentsDone": "اكتمل الاستيراد: {message}" + } + }, + "comments": { + "title": "إدارة التعليقات", + "statusFilter": { + "all": "كل الحالات", + "approved": "تمت الموافقة", + "pending": "قيد الانتظار", + "rejected": "مرفوض" + }, + "refresh": "تحديث", + "table": { + "author": "المستخدم", + "content": "المحتوى", + "path": "المسار", + "status": "الحالة", + "actions": "إجراءات", + "admin": "المسؤول", + "time": "الوقت", + "ip": "IP", + "email": "البريد الإلكتروني" + }, + "actions": { + "approve": "موافقة", + "pending": "انتظار", + "reject": "رفض", + "edit": "تحرير", + "delete": "حذف", + "blockIp": "حظر IP", + "blockEmail": "حظر البريد الإلكتروني", + "pin": "تثبيت" + }, + "pagination": { + "prev": "السابق", + "next": "التالي", + "jumpTo": "انتقال إلى", + "page": "صفحة", + "confirm": "تأكيد" + }, + "confirmDelete": "هل أنت متأكد من حذف التعليق {id}؟", + "confirmBlockIp": "هل أنت متأكد من إضافة IP {ip} إلى القائمة السوداء؟", + "confirmBlockEmail": "هل أنت متأكد من إضافة البريد الإلكتروني {email} إلى القائمة السوداء؟", + "successBlockIp": "تمت إضافة IP إلى القائمة السوداء", + "successBlockEmail": "تمت إضافة البريد الإلكتروني إلى القائمة السوداء", + "empty": "لا توجد بيانات", + "editModal": { + "title": "تحرير التعليق", + "name": "اسم الزائر", + "email": "بريد الزائر", + "url": "رابط الزائر", + "postSlug": "معرف الصفحة", + "postUrl": "رابط التعليق", + "content": "محتوى التعليق", + "status": "الحالة", + "priority": "الأولوية (1 افتراضي، الرقم الأكبر يظهر أولاً)", + "cancel": "إلغاء", + "save": "حفظ", + "saving": "جارٍ الحفظ..." + } + }, + "settings": { + "title": "إعدادات الموقع", + "tabs": { + "comment": "التعليقات والأمان", + "feature": "مفاتيح الميزات", + "emailNotify": "إشعارات البريد", + "telegramNotify": "إشعارات Telegram", + "display": "العرض" + }, + "comment": { + "title": "تكوين عرض التعليقات", + "adminEmail": "بريد المسؤول", + "adminBadge": "نص شارة المسؤول (اتركه فارغاً لاستخدام الرمز الافتراضي)", + "adminEnabled": "تمكين عرض شارة المسؤول", + "avatarPrefix": "بادئة الصورة الرمزية (الافتراضي: https://gravatar.com/avatar)", + "securityTitle": "إعدادات الأمان", + "requireReview": "هل تتطلب التعليقات الجديدة مراجعة قبل العرض", + "adminKey": "مفتاح تعليق المسؤول (مطلوب عند استخدام بريد المسؤول للتعليق)", + "adminKeyPlaceholder": "أدخل المفتاح للإعداد أو التعديل", + "allowedDomains": "النطاقات المسموح بها (اتركه فارغاً للسماح للكل، افصل بفواصل أو مسافات)", + "blockedIps": "القائمة السوداء لـ IP (افصل بفواصل أو أسطر جديدة)", + "blockedEmails": "القائمة السوداء للبريد الإلكتروني (افصل بفواصل أو أسطر جديدة)", + "save": "حفظ", + "saving": "جارٍ الحفظ..." + }, + "feature": { + "title": "مفاتيح الميزات", + "articleLike": "تمكين إعجاب المقال", + "articleLikeHint": "عند التمكين، سيظهر زر الإعجاب بالمقال أعلى قسم التعليقات.", + "commentLike": "تمكين إعجاب التعليق", + "commentLikeHint": "عند التمكين، سيظهر زر إعجاب لكل تعليق.", + "imageLightbox": "وضع الصندوق المضيء للصور", + "imageLightboxHint": "عند التمكين، سيؤدي النقر على الصور في التعليقات إلى تكبيرها بملء الشاشة.", + "placeholder": "نص العنصر النائب لمربع التعليق", + "placeholderHint": "نص مخصص لمربع الإدخال. اتركه فارغاً لاستخدام الافتراضي.", + "widgetLanguage": "لغة الأداة", + "widgetLanguageHint": "تعيين لغة أداة التعليقات في الواجهة الأمامية.", + "save": "حفظ", + "saving": "جارٍ الحفظ..." + }, + "emailNotify": { + "title": "إعدادات البريد الإلكتروني", + "enable": "تمكين إشعارات البريد", + "smtpTitle": "1. تكوين SMTP", + "provider": "مقدم الخدمة", + "host": "خادم SMTP", + "port": "منفذ SMTP", + "secure": "اتصال SSL آمن", + "user": "حساب البريد الإلكتروني", + "pass": "كلمة المرور/رمز التفويض", + "qqHint": "ملاحظة: لبريد QQ، استخدم رمز التفويض بدلاً من كلمة المرور.", + "163Hint": "ملاحظة: لبريد 163، استخدم رمز التفويض بدلاً من كلمة المرور.", + "templateTitle": "2. قوالب البريد الإلكتروني", + "adminTemplate": "قالب إشعار المسؤول (HTML)", + "adminTemplateHint": "المتغيرات المتاحة: ${commentAuthor}, ${postTitle}, ${postUrl}, ${commentContent}", + "replyTemplate": "قالب إشعار الرد (HTML)", + "replyTemplateHint": "المتغيرات المتاحة: ${toName}, ${replyAuthor}, ${postTitle}, ${postUrl}, ${parentComment}, ${replyContent}", + "testBtn": "إرسال بريد تجريبي", + "testingBtn": "جارٍ الإرسال...", + "resetBtn": "استعادة القوالب الافتراضية", + "save": "حفظ التكوين", + "saving": "جارٍ الحفظ..." + }, + "telegramNotify": { + "title": "إعدادات Telegram", + "enable": "تمكين إشعارات Telegram", + "botToken": "رمز البوت (Bot Token)", + "botTokenHint": "ابحث عن @BotFather في Telegram لإنشاء بوت والحصول على الرمز", + "chatId": "معرف المحادثة (Chat ID)", + "chatIdHint": "معرف المستخدم أو المجموعة. أرسل رسالة للبوت واستخدم API أو @userinfobot للعثور عليه.", + "webhookBtn": "إعداد Webhook", + "webhookSetting": "جارٍ الإعداد...", + "testBtn": "إرسال رسالة تجريبية", + "testingBtn": "جارٍ الإرسال...", + "save": "حفظ", + "saving": "جارٍ الحفظ..." + }, + "display": { + "title": "إعدادات العرض", + "layoutTitle": "عنوان الخلفية", + "layoutTitleHint": "يظهر في شريط التنقل العلوي.", + "adminLanguage": "لغة الخلفية", + "adminLanguageHint": "تعيين لغة نظام الإدارة.", + "save": "حفظ", + "saving": "جارٍ الحفظ..." + } + }, + "common": { + "saveSuccess": "تم الحفظ بنجاح", + "saveFailed": "فشل الحفظ", + "loading": "جارٍ التحميل..." + } +} \ No newline at end of file diff --git a/cwd-admin/src/locales/de.json b/cwd-admin/src/locales/de.json new file mode 100644 index 0000000..89f38cc --- /dev/null +++ b/cwd-admin/src/locales/de.json @@ -0,0 +1,304 @@ +{ + "menu": { + "comments": "Kommentarverwaltung", + "stats": "Dashboard", + "analytics": "Statistiken", + "settings": "Einstellungen", + "data": "Datenverwaltung" + }, + "layout": { + "toggleMenu": "Menü umschalten", + "docs": "Dokumentation", + "logout": "Abmelden", + "moreActions": "Mehr Aktionen", + "defaultSite": "Standardseite", + "theme": { + "light": "Hell", + "dark": "Dunkel", + "system": "System" + }, + "version": { + "title": "Versionsinfo", + "apiAddress": "API-Adresse", + "apiVersion": "API-Version", + "adminVersion": "Admin-Version", + "match": "Admin- und API-Versionen stimmen überein.", + "mismatch": "Versionskonflikt. Bitte aktualisieren Sie den API-Dienst.", + "fetchError": "Versionsabruf fehlgeschlagen:", + "loading": "Laden...", + "notConfigured": "Nicht konfiguriert", + "notFetched": "Nicht abgerufen", + "ok": "OK" + } + }, + "stats": { + "title": "Dashboard", + "overview": "Übersicht", + "total": "Gesamtkommentare", + "approved": "Genehmigt", + "pending": "Ausstehend", + "rejected": "Abgelehnt", + "trend": "Kommentartrend", + "bySite": "Nach Seite", + "last7Days": "Letzte 7 Tage", + "last30Days": "Letzte 30 Tage", + "noData": "Keine Daten", + "table": { + "domain": "Domain", + "total": "Gesamt", + "approved": "Genehmigt", + "pending": "Ausstehend", + "rejected": "Abgelehnt" + }, + "loadError": "Fehler beim Laden der Statistiken" + }, + "analytics": { + "title": "Statistiken", + "overview": "Übersicht", + "totalPv": "Gesamt-PV", + "todayPv": "Heute PV", + "weekPv": "Woche PV", + "monthPv": "Monat PV", + "totalPages": "Besuchte Seiten", + "trend": "Traffic-Trend", + "pageDetail": "Seitendetails", + "likeRank": "Top-Likes", + "last7Days": "Letzte 7 Tage", + "last30Days": "Letzte 30 Tage", + "sort": { + "pv": "Nach PV sortieren", + "latest": "Zuletzt besucht" + }, + "table": { + "title": "Seitentitel", + "pv": "PV", + "time": "Letzter Besuch", + "url": "URL", + "rank": "Rang", + "like": "Likes" + }, + "noData": "Keine Daten", + "noLikeData": "Keine Like-Daten", + "loadError": "Fehler beim Laden der Analysen" + }, + "data": { + "title": "Datenverwaltung", + "sections": { + "comments": { + "title": "Kommentardaten", + "desc": "Kommentare verwalten und importieren.", + "exportLabel": "Export:", + "exporting": "Export läuft...", + "exportJson": "JSON exportieren", + "importLabel": "Import:", + "importButton": "Kommentare importieren", + "source": { + "cwd": "CWD (.json)", + "twikoo": "Twikoo (.json)", + "artalk": "Artalk (.json)" + } + }, + "config": { + "title": "Systemkonfig", + "desc": "Einstellungen, E-Mail, Blocklisten, etc.", + "export": "Konfig exportieren", + "import": "Konfig importieren" + }, + "stats": { + "title": "Analysedaten", + "desc": "Aufrufe, Likes und Trends.", + "export": "Statistiken exportieren", + "import": "Statistiken importieren" + }, + "backup": { + "title": "Vollbackup", + "desc": "Alles sichern oder wiederherstellen (Kommentare + Konfig + Stats).", + "export": "Vollexport", + "import": "Vollwiederherstellung" + } + }, + "logs": { + "title": "Betriebsprotokolle" + }, + "prefixModal": { + "title": "URL-Präfix fehlt", + "descPart1": "Erkannt: ", + "descPart2": " Kommentare ohne Protokoll-Präfix (http/https).", + "descPart3": "Beim Import hinzufügen?", + "label": "Domain-Präfix (z.B. https://example.me)", + "placeholder": "Präfix eingeben", + "skip": "Überspringen", + "confirm": "Hinzufügen & Importieren" + }, + "messages": { + "exportSuccess": "Export erfolgreich", + "exportFailed": "Export fehlgeschlagen", + "fileReadFailed": "Dateilesefehler", + "jsonParseFailed": "JSON-Parse-Fehler", + "importConfigSuccess": "Konfig importiert", + "importStatsSuccess": "Statistiken importiert", + "importBackupSuccess": "Vollwiederherstellung erfolgreich", + "importCommentsSuccess": "Kommentare importiert", + "prefixRequired": "Bitte Präfix eingeben", + "importStart": "Import: {name} (Modus: {mode})", + "fileParseSuccess": "Datei geparst, verarbeite...", + "errorWithMessage": "Fehler: {msg}", + "parsedCommentsCount": "{count} Kommentare geparst", + "detectMissingPrefix": "{count} URLs ohne Präfix, warte auf Bestätigung...", + "prefixAdded": "Präfix hinzugefügt, fahre fort...", + "skipPrefix": "Präfix übersprungen", + "readFileFailedLog": "Dateilesefehler", + "importCommentsDone": "Import fertig: {message}" + } + }, + "comments": { + "title": "Kommentarverwaltung", + "statusFilter": { + "all": "Alle", + "approved": "Genehmigt", + "pending": "Ausstehend", + "rejected": "Abgelehnt" + }, + "refresh": "Aktualisieren", + "table": { + "author": "Benutzer", + "content": "Kommentar", + "path": "Pfad", + "status": "Status", + "actions": "Aktionen", + "admin": "Admin", + "time": "Zeit", + "ip": "IP", + "email": "E-Mail" + }, + "actions": { + "approve": "Genehmigen", + "pending": "Zurückstellen", + "reject": "Ablehnen", + "edit": "Bearbeiten", + "delete": "Löschen", + "blockIp": "IP blockieren", + "blockEmail": "E-Mail blockieren", + "pin": "Anpinnen" + }, + "pagination": { + "prev": "Zurück", + "next": "Weiter", + "jumpTo": "Gehe zu", + "page": "Seite", + "confirm": "OK" + }, + "confirmDelete": "Kommentar {id} löschen?", + "confirmBlockIp": "IP {ip} blockieren?", + "confirmBlockEmail": "E-Mail {email} blockieren?", + "successBlockIp": "IP blockiert", + "successBlockEmail": "E-Mail blockiert", + "empty": "Keine Daten", + "editModal": { + "title": "Kommentar bearbeiten", + "name": "Name", + "email": "E-Mail", + "url": "URL", + "postSlug": "Slug", + "postUrl": "Post-URL", + "content": "Inhalt", + "status": "Status", + "priority": "Priorität (1=Normal, höher=Oben)", + "cancel": "Abbrechen", + "save": "Speichern", + "saving": "Speichert..." + } + }, + "settings": { + "title": "Einstellungen", + "tabs": { + "comment": "Kommentare & Sicherheit", + "feature": "Funktionen", + "emailNotify": "E-Mail-Benachrichtigung", + "telegramNotify": "Telegram-Benachrichtigung", + "display": "Anzeige" + }, + "comment": { + "title": "Kommentaranzeige", + "adminEmail": "Admin-E-Mail", + "adminBadge": "Admin-Badge-Text (Leer für Standard-Icon)", + "adminEnabled": "Admin-Badge anzeigen", + "avatarPrefix": "Avatar-Präfix (Standard: https://gravatar.com/avatar)", + "securityTitle": "Sicherheit", + "requireReview": "Überprüfung für neue Kommentare erforderlich", + "adminKey": "Admin-Schlüssel (Erforderlich für Admin-E-Mail-Kommentare)", + "adminKeyPlaceholder": "Schlüssel eingeben", + "allowedDomains": "Erlaubte Domains (Leer für alle. Trennung durch Leerzeichen/Komma)", + "blockedIps": "Blockierte IPs (Trennung durch Komma/Zeilenumbruch)", + "blockedEmails": "Blockierte E-Mails (Trennung durch Komma/Zeilenumbruch)", + "save": "Speichern", + "saving": "Speichert..." + }, + "feature": { + "title": "Funktionen", + "articleLike": "Artikel-Likes aktivieren", + "articleLikeHint": "Like-Button oben im Kommentarbereich anzeigen.", + "commentLike": "Kommentar-Likes aktivieren", + "commentLikeHint": "Like-Button bei jedem Kommentar anzeigen.", + "imageLightbox": "Bild-Lightbox", + "imageLightboxHint": "Vollbildvorschau für Bilder in Kommentaren.", + "placeholder": "Platzhaltertext", + "placeholderHint": "Benutzerdefinierter Platzhalter für Kommentareingabe.", + "widgetLanguage": "Widget-Sprache", + "widgetLanguageHint": "Sprache für das Frontend-Widget.", + "save": "Speichern", + "saving": "Speichert..." + }, + "emailNotify": { + "title": "E-Mail-Benachrichtigung", + "enable": "E-Mail-Benachrichtigung aktivieren", + "smtpTitle": "1. SMTP-Konfig", + "provider": "Anbieter", + "host": "SMTP-Host", + "port": "SMTP-Port", + "secure": "SSL-Sicherheit", + "user": "E-Mail-Benutzer", + "pass": "Passwort/App-Token", + "qqHint": "Hinweis: Für QQ Mail App-Token verwenden.", + "163Hint": "Hinweis: Für 163 Mail App-Token verwenden.", + "templateTitle": "2. Vorlagen-Konfig", + "adminTemplate": "Admin-Vorlage (HTML)", + "adminTemplateHint": "Vars: ${commentAuthor}, ${postTitle}, ${postUrl}, ${commentContent}", + "replyTemplate": "Antwort-Vorlage (HTML)", + "replyTemplateHint": "Vars: ${toName}, ${replyAuthor}, ${postTitle}, ${postUrl}, ${parentComment}, ${replyContent}", + "testBtn": "Test-E-Mail senden", + "testingBtn": "Sendet...", + "resetBtn": "Vorlagen zurücksetzen", + "save": "Konfig speichern", + "saving": "Speichert..." + }, + "telegramNotify": { + "title": "Telegram-Benachrichtigung", + "enable": "Telegram-Benachrichtigung aktivieren", + "botToken": "Bot-Token", + "botTokenHint": "Von @BotFather erhalten", + "chatId": "Chat-ID", + "chatIdHint": "Benutzer-ID oder Gruppen-ID. @userinfobot verwenden.", + "webhookBtn": "Webhook setzen", + "webhookSetting": "Setze...", + "testBtn": "Testnachricht senden", + "testingBtn": "Sendet...", + "save": "Speichern", + "saving": "Speichert..." + }, + "display": { + "title": "Anzeigeeinstellungen", + "layoutTitle": "Admin-Titel", + "layoutTitleHint": "Wird in der oberen Navigationsleiste angezeigt.", + "adminLanguage": "Admin-Sprache", + "adminLanguageHint": "Sprache für das Admin-Panel.", + "save": "Speichern", + "saving": "Speichert..." + }, + "common": { + "saveSuccess": "Erfolgreich gespeichert", + "saveFailed": "Speichern fehlgeschlagen", + "loading": "Laden..." + } + } +} \ No newline at end of file diff --git a/cwd-admin/src/locales/en-US.json b/cwd-admin/src/locales/en-US.json new file mode 100644 index 0000000..8841548 --- /dev/null +++ b/cwd-admin/src/locales/en-US.json @@ -0,0 +1,304 @@ +{ + "menu": { + "comments": "Comments", + "stats": "Dashboard", + "analytics": "Analytics", + "settings": "Settings", + "data": "Data" + }, + "layout": { + "toggleMenu": "Toggle Menu", + "docs": "Documentation", + "logout": "Logout", + "moreActions": "More Actions", + "defaultSite": "Default Site", + "theme": { + "light": "Light", + "dark": "Dark", + "system": "System" + }, + "version": { + "title": "Version Info", + "apiAddress": "API Address", + "apiVersion": "API Version", + "adminVersion": "Admin Version", + "match": "Admin and API versions match.", + "mismatch": "Version mismatch. Please update API service to match Admin version.", + "fetchError": "Failed to fetch version:", + "loading": "Loading...", + "notConfigured": "Not Configured", + "notFetched": "Not Fetched", + "ok": "OK" + } + }, + "stats": { + "title": "Dashboard", + "overview": "Overview", + "total": "Total Comments", + "approved": "Approved", + "pending": "Pending", + "rejected": "Rejected", + "trend": "Comment Trend", + "bySite": "By Site", + "last7Days": "Last 7 Days", + "last30Days": "Last 30 Days", + "noData": "No Data", + "table": { + "domain": "Domain", + "total": "Total", + "approved": "Approved", + "pending": "Pending", + "rejected": "Rejected" + }, + "loadError": "Failed to load stats" + }, + "analytics": { + "title": "Analytics", + "overview": "Overview", + "totalPv": "Total PV", + "todayPv": "Today PV", + "weekPv": "Week PV", + "monthPv": "Month PV", + "totalPages": "Pages Visited", + "trend": "Traffic Trend", + "pageDetail": "Page Details", + "likeRank": "Top Liked Pages", + "last7Days": "Last 7 Days", + "last30Days": "Last 30 Days", + "sort": { + "pv": "Sort by PV", + "latest": "Latest Visited" + }, + "table": { + "title": "Page Title", + "pv": "PV", + "time": "Last Visit", + "url": "URL", + "rank": "Rank", + "like": "Likes" + }, + "noData": "No Data", + "noLikeData": "No Like Data", + "loadError": "Failed to load analytics" + }, + "data": { + "title": "Data Management", + "sections": { + "comments": { + "title": "Comments", + "desc": "Manage comments and import from other frameworks.", + "exportLabel": "Export:", + "exporting": "Exporting...", + "exportJson": "Export JSON", + "importLabel": "Import:", + "importButton": "Import Comments", + "source": { + "cwd": "CWD (.json)", + "twikoo": "Twikoo (.json)", + "artalk": "Artalk (.json)" + } + }, + "config": { + "title": "System Config", + "desc": "Manage settings, email config, blocklists, etc.", + "export": "Export Config", + "import": "Import Config" + }, + "stats": { + "title": "Analytics Data", + "desc": "Manage page views, likes, and trends.", + "export": "Export Stats", + "import": "Import Stats" + }, + "backup": { + "title": "Full Backup", + "desc": "Backup or restore all system data (Comments + Config + Stats).", + "export": "Full Export", + "import": "Full Restore" + } + }, + "logs": { + "title": "Operation Logs" + }, + "prefixModal": { + "title": "Missing URL Prefix Detected", + "descPart1": "Detected ", + "descPart2": " comments with URL missing protocol prefix (http/https).", + "descPart3": "Add prefix during import?", + "label": "Domain Prefix (e.g. https://example.me)", + "placeholder": "Enter domain prefix", + "skip": "Skip (Don't Add)", + "confirm": "Add & Import" + }, + "messages": { + "exportSuccess": "Export Success", + "exportFailed": "Export Failed", + "fileReadFailed": "File Read Failed", + "jsonParseFailed": "JSON Parse Failed", + "importConfigSuccess": "Config Imported", + "importStatsSuccess": "Stats Imported", + "importBackupSuccess": "Full Restore Success", + "importCommentsSuccess": "Comments Imported", + "prefixRequired": "Please enter domain prefix", + "importStart": "Importing: {name} (Mode: {mode})", + "fileParseSuccess": "File parsed, processing...", + "errorWithMessage": "Error: {msg}", + "parsedCommentsCount": "Parsed {count} comments", + "detectMissingPrefix": "Detected {count} URLs missing prefix, waiting for confirmation...", + "prefixAdded": "Prefix added, continuing...", + "skipPrefix": "Skipped prefix addition", + "readFileFailedLog": "Read file failed", + "importCommentsDone": "Import Done: {message}" + } + }, + "comments": { + "title": "Comment Management", + "statusFilter": { + "all": "All", + "approved": "Approved", + "pending": "Pending", + "rejected": "Rejected" + }, + "refresh": "Refresh", + "table": { + "author": "User", + "content": "Comment", + "path": "Path", + "status": "Status", + "actions": "Actions", + "admin": "Admin", + "time": "Time", + "ip": "IP", + "email": "Email" + }, + "actions": { + "approve": "Approve", + "pending": "Pending", + "reject": "Reject", + "edit": "Edit", + "delete": "Delete", + "blockIp": "Block IP", + "blockEmail": "Block Email", + "pin": "Pin" + }, + "pagination": { + "prev": "Prev", + "next": "Next", + "jumpTo": "Go to", + "page": "Page", + "confirm": "OK" + }, + "confirmDelete": "Delete comment {id}?", + "confirmBlockIp": "Block IP {ip}?", + "confirmBlockEmail": "Block Email {email}?", + "successBlockIp": "IP Blocked", + "successBlockEmail": "Email Blocked", + "empty": "No Data", + "editModal": { + "title": "Edit Comment", + "name": "Nickname", + "email": "Email", + "url": "URL", + "postSlug": "Slug", + "postUrl": "Post URL", + "content": "Content", + "status": "Status", + "priority": "Priority (1=Normal, higher=Top)", + "cancel": "Cancel", + "save": "Save", + "saving": "Saving..." + } + }, + "settings": { + "title": "Settings", + "tabs": { + "comment": "Comments & Security", + "feature": "Features", + "emailNotify": "Email Notify", + "telegramNotify": "Telegram Notify", + "display": "Display" + }, + "comment": { + "title": "Comment Display", + "adminEmail": "Admin Email", + "adminBadge": "Admin Badge Text (Empty for default icon)", + "adminEnabled": "Show Admin Badge", + "avatarPrefix": "Avatar Prefix (Default: https://gravatar.com/avatar)", + "securityTitle": "Security", + "requireReview": "Require Review for New Comments", + "adminKey": "Admin Key (Required for admin email comments)", + "adminKeyPlaceholder": "Enter key to set or change", + "allowedDomains": "Allowed Domains (Empty to allow all. Split by space or comma)", + "blockedIps": "Blocked IPs (Split by comma or newline)", + "blockedEmails": "Blocked Emails (Split by comma or newline)", + "save": "Save", + "saving": "Saving..." + }, + "feature": { + "title": "Features", + "articleLike": "Enable Article Likes", + "articleLikeHint": "Show like button at top of comments.", + "commentLike": "Enable Comment Likes", + "commentLikeHint": "Show like button on each comment.", + "imageLightbox": "Image Lightbox", + "imageLightboxHint": "Enable fullscreen preview for images in comments.", + "placeholder": "Placeholder Text", + "placeholderHint": "Custom placeholder for comment input.", + "widgetLanguage": "Widget Language", + "widgetLanguageHint": "Language for the frontend widget.", + "save": "Save", + "saving": "Saving..." + }, + "emailNotify": { + "title": "Email Notification", + "enable": "Enable Email Notify", + "smtpTitle": "1. SMTP Config", + "provider": "Provider", + "host": "SMTP Host", + "port": "SMTP Port", + "secure": "SSL Secure", + "user": "Email User", + "pass": "Password/App Token", + "qqHint": "Note: For QQ Mail, use App Token instead of password.", + "163Hint": "Note: For 163 Mail, use App Token instead of password.", + "templateTitle": "2. Template Config", + "adminTemplate": "Admin Template (HTML)", + "adminTemplateHint": "Vars: ${commentAuthor}, ${postTitle}, ${postUrl}, ${commentContent}", + "replyTemplate": "Reply Template (HTML)", + "replyTemplateHint": "Vars: ${toName}, ${replyAuthor}, ${postTitle}, ${postUrl}, ${parentComment}, ${replyContent}", + "testBtn": "Send Test Email", + "testingBtn": "Sending...", + "resetBtn": "Reset Templates", + "save": "Save Config", + "saving": "Saving..." + }, + "telegramNotify": { + "title": "Telegram Notification", + "enable": "Enable Telegram Notify", + "botToken": "Bot Token", + "botTokenHint": "Get from @BotFather", + "chatId": "Chat ID", + "chatIdHint": "User ID or Group ID. Use @userinfobot to find.", + "webhookBtn": "Set Webhook", + "webhookSetting": "Setting...", + "testBtn": "Send Test Message", + "testingBtn": "Sending...", + "save": "Save", + "saving": "Saving..." + }, + "display": { + "title": "Display Settings", + "layoutTitle": "Admin Title", + "layoutTitleHint": "Displayed in top navigation bar.", + "adminLanguage": "Admin Language", + "adminLanguageHint": "Language for the admin panel.", + "save": "Save", + "saving": "Saving..." + } + }, + "common": { + "saveSuccess": "Saved Successfully", + "saveFailed": "Save Failed", + "loading": "Loading..." + } +} \ No newline at end of file diff --git a/cwd-admin/src/locales/es.json b/cwd-admin/src/locales/es.json new file mode 100644 index 0000000..1a0785c --- /dev/null +++ b/cwd-admin/src/locales/es.json @@ -0,0 +1,304 @@ +{ + "menu": { + "comments": "Gestión de Comentarios", + "stats": "Panel de Control", + "analytics": "Analítica", + "settings": "Ajustes", + "data": "Datos" + }, + "layout": { + "toggleMenu": "Alternar Menú", + "docs": "Documentación", + "logout": "Cerrar Sesión", + "moreActions": "Más Acciones", + "defaultSite": "Sitio Predeterminado", + "theme": { + "light": "Claro", + "dark": "Oscuro", + "system": "Sistema" + }, + "version": { + "title": "Info de Versión", + "apiAddress": "Dirección API", + "apiVersion": "Versión API", + "adminVersion": "Versión Admin", + "match": "Las versiones Admin y API coinciden.", + "mismatch": "Versión no coincidente. Actualice el servicio API.", + "fetchError": "Error al obtener versión:", + "loading": "Cargando...", + "notConfigured": "No Configurado", + "notFetched": "No Obtenido", + "ok": "OK" + } + }, + "stats": { + "title": "Panel de Control", + "overview": "Resumen", + "total": "Total Comentarios", + "approved": "Aprobados", + "pending": "Pendientes", + "rejected": "Rechazados", + "trend": "Tendencia", + "bySite": "Por Sitio", + "last7Days": "Últimos 7 Días", + "last30Days": "Últimos 30 Días", + "noData": "Sin Datos", + "table": { + "domain": "Dominio", + "total": "Total", + "approved": "Aprobados", + "pending": "Pendientes", + "rejected": "Rechazados" + }, + "loadError": "Error al cargar estadísticas" + }, + "analytics": { + "title": "Analítica", + "overview": "Resumen", + "totalPv": "PV Total", + "todayPv": "PV Hoy", + "weekPv": "PV Semana", + "monthPv": "PV Mes", + "totalPages": "Páginas Visitadas", + "trend": "Tendencia Tráfico", + "pageDetail": "Detalles Página", + "likeRank": "Top Likes", + "last7Days": "Últimos 7 Días", + "last30Days": "Últimos 30 Días", + "sort": { + "pv": "Ordenar por PV", + "latest": "Última Visita" + }, + "table": { + "title": "Título Página", + "pv": "PV", + "time": "Última Visita", + "url": "URL", + "rank": "Rango", + "like": "Me gusta" + }, + "noData": "Sin Datos", + "noLikeData": "Sin Datos de Me gusta", + "loadError": "Error al cargar analítica" + }, + "data": { + "title": "Gestión de Datos", + "sections": { + "comments": { + "title": "Datos Comentarios", + "desc": "Gestionar e importar comentarios.", + "exportLabel": "Exportar:", + "exporting": "Exportando...", + "exportJson": "Exportar JSON", + "importLabel": "Importar:", + "importButton": "Importar Comentarios", + "source": { + "cwd": "CWD (.json)", + "twikoo": "Twikoo (.json)", + "artalk": "Artalk (.json)" + } + }, + "config": { + "title": "Config Sistema", + "desc": "Ajustes, correo, lista negra, etc.", + "export": "Exportar Config", + "import": "Importar Config" + }, + "stats": { + "title": "Datos Analíticos", + "desc": "Vistas, likes y tendencias.", + "export": "Exportar Stats", + "import": "Importar Stats" + }, + "backup": { + "title": "Copia de Seguridad Completa", + "desc": "Copia o restaura todo (Comentarios + Config + Stats).", + "export": "Exportación Completa", + "import": "Restauración Completa" + } + }, + "logs": { + "title": "Registros de Operación" + }, + "prefixModal": { + "title": "Prefijo URL Faltante", + "descPart1": "Detectados ", + "descPart2": " comentarios sin prefijo de protocolo (http/https).", + "descPart3": "¿Añadir al importar?", + "label": "Prefijo Dominio (ej. https://example.me)", + "placeholder": "Introducir prefijo", + "skip": "Omitir", + "confirm": "Añadir e Importar" + }, + "messages": { + "exportSuccess": "Exportación Exitosa", + "exportFailed": "Fallo Exportación", + "fileReadFailed": "Fallo Lectura Archivo", + "jsonParseFailed": "Fallo Análisis JSON", + "importConfigSuccess": "Config Importada", + "importStatsSuccess": "Stats Importadas", + "importBackupSuccess": "Restauración Completa Exitosa", + "importCommentsSuccess": "Comentarios Importados", + "prefixRequired": "Por favor introduzca prefijo", + "importStart": "Importando: {name} (Modo: {mode})", + "fileParseSuccess": "Archivo analizado, procesando...", + "errorWithMessage": "Error: {msg}", + "parsedCommentsCount": "{count} comentarios analizados", + "detectMissingPrefix": "{count} URLs sin prefijo, esperando confirmación...", + "prefixAdded": "Prefijo añadido, continuando...", + "skipPrefix": "Adición prefijo omitida", + "readFileFailedLog": "Fallo lectura archivo", + "importCommentsDone": "Importación Hecha: {message}" + } + }, + "comments": { + "title": "Gestión Comentarios", + "statusFilter": { + "all": "Todos", + "approved": "Aprobados", + "pending": "Pendientes", + "rejected": "Rechazados" + }, + "refresh": "Refrescar", + "table": { + "author": "Usuario", + "content": "Comentario", + "path": "Ruta", + "status": "Estado", + "actions": "Acciones", + "admin": "Admin", + "time": "Hora", + "ip": "IP", + "email": "Correo" + }, + "actions": { + "approve": "Aprobar", + "pending": "Pendiente", + "reject": "Rechazar", + "edit": "Editar", + "delete": "Eliminar", + "blockIp": "Bloquear IP", + "blockEmail": "Bloquear Correo", + "pin": "Fijar" + }, + "pagination": { + "prev": "Ant", + "next": "Sig", + "jumpTo": "Ir a", + "page": "Página", + "confirm": "OK" + }, + "confirmDelete": "¿Eliminar comentario {id}?", + "confirmBlockIp": "¿Bloquear IP {ip}?", + "confirmBlockEmail": "¿Bloquear correo {email}?", + "successBlockIp": "IP Bloqueada", + "successBlockEmail": "Correo Bloqueado", + "empty": "Sin Datos", + "editModal": { + "title": "Editar Comentario", + "name": "Nombre", + "email": "Correo", + "url": "URL", + "postSlug": "Slug", + "postUrl": "URL Post", + "content": "Contenido", + "status": "Estado", + "priority": "Prioridad (1=Normal, mayor=Arriba)", + "cancel": "Cancelar", + "save": "Guardar", + "saving": "Guardando..." + } + }, + "settings": { + "title": "Ajustes", + "tabs": { + "comment": "Comentarios y Seguridad", + "feature": "Características", + "emailNotify": "Notificación Correo", + "telegramNotify": "Notificación Telegram", + "display": "Visualización" + }, + "comment": { + "title": "Visualización Comentarios", + "adminEmail": "Correo Admin", + "adminBadge": "Texto Insignia Admin (Vacío para icono por defecto)", + "adminEnabled": "Mostrar Insignia Admin", + "avatarPrefix": "Prefijo Avatar (Defecto: https://gravatar.com/avatar)", + "securityTitle": "Seguridad", + "requireReview": "Requerir Revisión para Nuevos Comentarios", + "adminKey": "Clave Admin (Requerida para comentarios con correo admin)", + "adminKeyPlaceholder": "Introducir clave", + "allowedDomains": "Dominios Permitidos (Vacío para todos. Separar por espacio/coma)", + "blockedIps": "IPs Bloqueadas (Separar por coma/nueva línea)", + "blockedEmails": "Correos Bloqueados (Separar por coma/nueva línea)", + "save": "Guardar", + "saving": "Guardando..." + }, + "feature": { + "title": "Características", + "articleLike": "Habilitar Me gusta Artículo", + "articleLikeHint": "Mostrar botón Me gusta arriba de comentarios.", + "commentLike": "Habilitar Me gusta Comentario", + "commentLikeHint": "Mostrar botón Me gusta en cada comentario.", + "imageLightbox": "Lightbox Imagen", + "imageLightboxHint": "Habilitar vista pantalla completa para imágenes.", + "placeholder": "Texto Marcador", + "placeholderHint": "Marcador personalizado para entrada de comentarios.", + "widgetLanguage": "Idioma Widget", + "widgetLanguageHint": "Idioma para el widget frontend.", + "save": "Guardar", + "saving": "Guardando..." + }, + "emailNotify": { + "title": "Notificación Correo", + "enable": "Habilitar Notificación Correo", + "smtpTitle": "1. Config SMTP", + "provider": "Proveedor", + "host": "Host SMTP", + "port": "Puerto SMTP", + "secure": "Seguridad SSL", + "user": "Usuario Correo", + "pass": "Contraseña/Token App", + "qqHint": "Nota: Para QQ Mail, usar Token App.", + "163Hint": "Nota: Para 163 Mail, usar Token App.", + "templateTitle": "2. Config Plantillas", + "adminTemplate": "Plantilla Admin (HTML)", + "adminTemplateHint": "Vars: ${commentAuthor}, ${postTitle}, ${postUrl}, ${commentContent}", + "replyTemplate": "Plantilla Respuesta (HTML)", + "replyTemplateHint": "Vars: ${toName}, ${replyAuthor}, ${postTitle}, ${postUrl}, ${parentComment}, ${replyContent}", + "testBtn": "Enviar Correo Prueba", + "testingBtn": "Enviando...", + "resetBtn": "Restablecer Plantillas", + "save": "Guardar Config", + "saving": "Guardando..." + }, + "telegramNotify": { + "title": "Notificación Telegram", + "enable": "Habilitar Notificación Telegram", + "botToken": "Token Bot", + "botTokenHint": "Obtener de @BotFather", + "chatId": "ID Chat", + "chatIdHint": "ID Usuario o Grupo. Usar @userinfobot.", + "webhookBtn": "Establecer Webhook", + "webhookSetting": "Configurando...", + "testBtn": "Enviar Mensaje Prueba", + "testingBtn": "Enviando...", + "save": "Guardar", + "saving": "Guardando..." + }, + "display": { + "title": "Ajustes Visualización", + "layoutTitle": "Título Admin", + "layoutTitleHint": "Mostrado en barra navegación superior.", + "adminLanguage": "Idioma Admin", + "adminLanguageHint": "Idioma para el panel de administración.", + "save": "Guardar", + "saving": "Guardando..." + }, + "common": { + "saveSuccess": "Guardado Exitosamente", + "saveFailed": "Fallo al Guardar", + "loading": "Cargando..." + } + } +} \ No newline at end of file diff --git a/cwd-admin/src/locales/fr.json b/cwd-admin/src/locales/fr.json new file mode 100644 index 0000000..696319d --- /dev/null +++ b/cwd-admin/src/locales/fr.json @@ -0,0 +1,304 @@ +{ + "menu": { + "comments": "Gestion des Commentaires", + "stats": "Tableau de Bord", + "analytics": "Analytique", + "settings": "Paramètres", + "data": "Données" + }, + "layout": { + "toggleMenu": "Basculer le Menu", + "docs": "Documentation", + "logout": "Déconnexion", + "moreActions": "Plus d'Actions", + "defaultSite": "Site par Défaut", + "theme": { + "light": "Clair", + "dark": "Sombre", + "system": "Système" + }, + "version": { + "title": "Infos Version", + "apiAddress": "Adresse API", + "apiVersion": "Version API", + "adminVersion": "Version Admin", + "match": "Les versions Admin et API correspondent.", + "mismatch": "Version incompatible. Veuillez mettre à jour le service API.", + "fetchError": "Échec de récupération de version :", + "loading": "Chargement...", + "notConfigured": "Non Configuré", + "notFetched": "Non Récupéré", + "ok": "OK" + } + }, + "stats": { + "title": "Tableau de Bord", + "overview": "Aperçu", + "total": "Total Commentaires", + "approved": "Approuvés", + "pending": "En Attente", + "rejected": "Rejetés", + "trend": "Tendance", + "bySite": "Par Site", + "last7Days": "7 Derniers Jours", + "last30Days": "30 Derniers Jours", + "noData": "Aucune Donnée", + "table": { + "domain": "Domaine", + "total": "Total", + "approved": "Approuvés", + "pending": "En Attente", + "rejected": "Rejetés" + }, + "loadError": "Erreur chargement stats" + }, + "analytics": { + "title": "Analytique", + "overview": "Aperçu", + "totalPv": "Total PV", + "todayPv": "PV Aujourd'hui", + "weekPv": "PV Semaine", + "monthPv": "PV Mois", + "totalPages": "Pages Visitées", + "trend": "Tendance Trafic", + "pageDetail": "Détails Page", + "likeRank": "Top Likes", + "last7Days": "7 Derniers Jours", + "last30Days": "30 Derniers Jours", + "sort": { + "pv": "Trier par PV", + "latest": "Dernière Visite" + }, + "table": { + "title": "Titre Page", + "pv": "PV", + "time": "Dernière Visite", + "url": "URL", + "rank": "Rang", + "like": "J'aime" + }, + "noData": "Aucune Donnée", + "noLikeData": "Aucune Donnée de Like", + "loadError": "Erreur chargement analytique" + }, + "data": { + "title": "Gestion des Données", + "sections": { + "comments": { + "title": "Données Commentaires", + "desc": "Gérer et importer des commentaires.", + "exportLabel": "Exporter :", + "exporting": "Export en cours...", + "exportJson": "Exporter JSON", + "importLabel": "Importer :", + "importButton": "Importer Commentaires", + "source": { + "cwd": "CWD (.json)", + "twikoo": "Twikoo (.json)", + "artalk": "Artalk (.json)" + } + }, + "config": { + "title": "Config Système", + "desc": "Paramètres, e-mail, liste noire, etc.", + "export": "Exporter Config", + "import": "Importer Config" + }, + "stats": { + "title": "Données Analytiques", + "desc": "Vues, likes et tendances.", + "export": "Exporter Stats", + "import": "Importer Stats" + }, + "backup": { + "title": "Sauvegarde Complète", + "desc": "Sauvegarder ou restaurer tout (Commentaires + Config + Stats).", + "export": "Export Complet", + "import": "Restauration Complète" + } + }, + "logs": { + "title": "Journal d'Opérations" + }, + "prefixModal": { + "title": "Préfixe URL Manquant", + "descPart1": "Détecté ", + "descPart2": " commentaires sans préfixe (http/https).", + "descPart3": "Ajouter lors de l'import ?", + "label": "Préfixe Domaine (ex: https://example.me)", + "placeholder": "Entrer le préfixe", + "skip": "Ignorer", + "confirm": "Ajouter & Importer" + }, + "messages": { + "exportSuccess": "Export Réussi", + "exportFailed": "Échec Export", + "fileReadFailed": "Échec Lecture Fichier", + "jsonParseFailed": "Échec Analyse JSON", + "importConfigSuccess": "Config Importée", + "importStatsSuccess": "Stats Importées", + "importBackupSuccess": "Restauration Complète Réussie", + "importCommentsSuccess": "Commentaires Importés", + "prefixRequired": "Veuillez entrer le préfixe", + "importStart": "Import : {name} (Mode : {mode})", + "fileParseSuccess": "Fichier analysé, traitement...", + "errorWithMessage": "Erreur : {msg}", + "parsedCommentsCount": "{count} commentaires analysés", + "detectMissingPrefix": "{count} URL sans préfixe, en attente...", + "prefixAdded": "Préfixe ajouté, continuation...", + "skipPrefix": "Ajout préfixe ignoré", + "readFileFailedLog": "Échec lecture fichier", + "importCommentsDone": "Import Terminé : {message}" + } + }, + "comments": { + "title": "Gestion Commentaires", + "statusFilter": { + "all": "Tous", + "approved": "Approuvés", + "pending": "En Attente", + "rejected": "Rejetés" + }, + "refresh": "Actualiser", + "table": { + "author": "Utilisateur", + "content": "Commentaire", + "path": "Chemin", + "status": "Statut", + "actions": "Actions", + "admin": "Admin", + "time": "Date", + "ip": "IP", + "email": "E-mail" + }, + "actions": { + "approve": "Approuver", + "pending": "Mettre en Attente", + "reject": "Rejeter", + "edit": "Éditer", + "delete": "Supprimer", + "blockIp": "Bloquer IP", + "blockEmail": "Bloquer E-mail", + "pin": "Épingler" + }, + "pagination": { + "prev": "Préc", + "next": "Suiv", + "jumpTo": "Aller à", + "page": "Page", + "confirm": "OK" + }, + "confirmDelete": "Supprimer le commentaire {id} ?", + "confirmBlockIp": "Bloquer l'IP {ip} ?", + "confirmBlockEmail": "Bloquer l'e-mail {email} ?", + "successBlockIp": "IP Bloquée", + "successBlockEmail": "E-mail Bloqué", + "empty": "Aucune Donnée", + "editModal": { + "title": "Éditer Commentaire", + "name": "Pseudo", + "email": "E-mail", + "url": "URL", + "postSlug": "Slug", + "postUrl": "URL Article", + "content": "Contenu", + "status": "Statut", + "priority": "Priorité (1=Normal, plus élevé=Haut)", + "cancel": "Annuler", + "save": "Sauvegarder", + "saving": "Sauvegarde..." + } + }, + "settings": { + "title": "Paramètres", + "tabs": { + "comment": "Commentaires & Sécurité", + "feature": "Fonctionnalités", + "emailNotify": "Notifications E-mail", + "telegramNotify": "Notifications Telegram", + "display": "Affichage" + }, + "comment": { + "title": "Affichage Commentaires", + "adminEmail": "E-mail Admin", + "adminBadge": "Badge Admin (Vide pour icône par défaut)", + "adminEnabled": "Afficher Badge Admin", + "avatarPrefix": "Préfixe Avatar (Défaut : https://gravatar.com/avatar)", + "securityTitle": "Sécurité", + "requireReview": "Approbation Requise pour Nouveaux Commentaires", + "adminKey": "Clé Admin (Requise pour commentaires via e-mail admin)", + "adminKeyPlaceholder": "Entrer clé", + "allowedDomains": "Domaines Autorisés (Vide pour tous. Séparer par espace/virgule)", + "blockedIps": "IP Bloquées (Séparer par virgule/nouvelle ligne)", + "blockedEmails": "E-mails Bloqués (Séparer par virgule/nouvelle ligne)", + "save": "Sauvegarder", + "saving": "Sauvegarde..." + }, + "feature": { + "title": "Fonctionnalités", + "articleLike": "Activer J'aime Article", + "articleLikeHint": "Afficher bouton J'aime en haut des commentaires.", + "commentLike": "Activer J'aime Commentaire", + "commentLikeHint": "Afficher bouton J'aime sur chaque commentaire.", + "imageLightbox": "Lightbox Image", + "imageLightboxHint": "Aperçu plein écran des images.", + "placeholder": "Texte Placeholder", + "placeholderHint": "Texte d'invite pour la saisie de commentaire.", + "widgetLanguage": "Langue Widget", + "widgetLanguageHint": "Langue pour le widget frontend.", + "save": "Sauvegarder", + "saving": "Sauvegarde..." + }, + "emailNotify": { + "title": "Notification E-mail", + "enable": "Activer Notifications E-mail", + "smtpTitle": "1. Config SMTP", + "provider": "Fournisseur", + "host": "Hôte SMTP", + "port": "Port SMTP", + "secure": "Sécurité SSL", + "user": "Utilisateur", + "pass": "Mot de passe/Token", + "qqHint": "Note : Pour QQ Mail, utilisez un Token d'App.", + "163Hint": "Note : Pour 163 Mail, utilisez un Token d'App.", + "templateTitle": "2. Config Modèles", + "adminTemplate": "Modèle Admin (HTML)", + "adminTemplateHint": "Vars : ${commentAuthor}, ${postTitle}, ${postUrl}, ${commentContent}", + "replyTemplate": "Modèle Réponse (HTML)", + "replyTemplateHint": "Vars : ${toName}, ${replyAuthor}, ${postTitle}, ${postUrl}, ${parentComment}, ${replyContent}", + "testBtn": "Envoyer Test", + "testingBtn": "Envoi...", + "resetBtn": "Réinitialiser Modèles", + "save": "Sauvegarder Config", + "saving": "Sauvegarde..." + }, + "telegramNotify": { + "title": "Notification Telegram", + "enable": "Activer Notifications Telegram", + "botToken": "Token Bot", + "botTokenHint": "Obtenir via @BotFather", + "chatId": "ID Chat", + "chatIdHint": "ID Utilisateur ou Groupe. Utiliser @userinfobot.", + "webhookBtn": "Définir Webhook", + "webhookSetting": "Configuration...", + "testBtn": "Envoyer Message Test", + "testingBtn": "Envoi...", + "save": "Sauvegarder", + "saving": "Sauvegarde..." + }, + "display": { + "title": "Paramètres Affichage", + "layoutTitle": "Titre Admin", + "layoutTitleHint": "Affiché dans la barre de navigation.", + "adminLanguage": "Langue Admin", + "adminLanguageHint": "Langue du panneau d'administration.", + "save": "Sauvegarder", + "saving": "Sauvegarde..." + }, + "common": { + "saveSuccess": "Sauvegarde Réussie", + "saveFailed": "Échec Sauvegarde", + "loading": "Chargement..." + } + } +} \ No newline at end of file diff --git a/cwd-admin/src/locales/hi.json b/cwd-admin/src/locales/hi.json new file mode 100644 index 0000000..33f2c7e --- /dev/null +++ b/cwd-admin/src/locales/hi.json @@ -0,0 +1,304 @@ +{ + "menu": { + "comments": "टिप्पणी प्रबंधन", + "stats": "डेटा डैशबोर्ड", + "analytics": "विज़िट विश्लेषण", + "settings": "साइट सेटिंग्स", + "data": "डेटा प्रबंधन" + }, + "layout": { + "toggleMenu": "मेनू टॉगल करें", + "docs": "दस्तावेज़ीकरण", + "logout": "लॉग आउट", + "moreActions": "अधिक क्रियाएं", + "defaultSite": "डिफ़ॉल्ट साइट", + "theme": { + "light": "लाइट", + "dark": "डार्क", + "system": "सिस्टम" + }, + "version": { + "title": "संस्करण जानकारी", + "apiAddress": "API पता", + "apiVersion": "इंटरफ़ेस संस्करण", + "adminVersion": "बैकएंड संस्करण", + "match": "वर्तमान बैकएंड संस्करण इंटरफ़ेस संस्करण से मेल खाता है, आप इसे सामान्य रूप से उपयोग कर सकते हैं।", + "mismatch": "वर्तमान बैकएंड संस्करण इंटरफ़ेस संस्करण से मेल नहीं खाता है। संगतता समस्याओं से बचने के लिए API सेवा को अपडेट करने की अनुशंसा की जाती है।", + "fetchError": "इंटरफ़ेस संस्करण प्राप्त करने में विफल:", + "loading": "लोड हो रहा है...", + "notConfigured": "कॉन्फ़िगर नहीं किया गया", + "notFetched": "प्राप्त नहीं किया गया", + "ok": "समझ गया" + } + }, + "stats": { + "title": "डेटा डैशबोर्ड", + "overview": "अवलोकन", + "total": "कुल टिप्पणियाँ", + "approved": "स्वीकृत", + "pending": "लंबित", + "rejected": "अस्वीकृत", + "trend": "टिप्पणी रुझान", + "bySite": "साइट द्वारा आँकड़े", + "last7Days": "पिछले 7 दिन", + "last30Days": "पिछले 30 दिन", + "noData": "कोई टिप्पणी डेटा नहीं", + "table": { + "domain": "डोमेन", + "total": "कुल", + "approved": "स्वीकृत", + "pending": "लंबित", + "rejected": "अस्वीकृत" + }, + "loadError": "आँकड़े लोड करने में विफल" + }, + "analytics": { + "title": "विज़िट विश्लेषण", + "overview": "अवलोकन", + "totalPv": "कुल विज़िट", + "todayPv": "आज की विज़िट", + "weekPv": "इस सप्ताह की विज़िट", + "monthPv": "इस महीने की विज़िट", + "totalPages": "विज़िट किए गए पेज", + "trend": "विज़िट रुझान", + "pageDetail": "पेज विवरण", + "likeRank": "लाइक रैंकिंग", + "last7Days": "पिछले 7 दिन", + "last30Days": "पिछले 30 दिन", + "sort": { + "pv": "PV द्वारा क्रमबद्ध करें", + "latest": "नवीनतम विज़िट" + }, + "table": { + "title": "पेज शीर्षक", + "pv": "विज़िट", + "time": "अंतिम विज़िट", + "url": "पेज URL", + "rank": "रैंक", + "like": "लाइक" + }, + "noData": "कोई विज़िट डेटा नहीं", + "noLikeData": "कोई लाइक डेटा नहीं", + "loadError": "विज़िट आँकड़े लोड करने में विफल" + }, + "data": { + "title": "डेटा प्रबंधन", + "sections": { + "comments": { + "title": "टिप्पणी डेटा", + "desc": "टिप्पणी सामग्री प्रबंधित करें, अन्य टिप्पणी प्रणालियों से माइग्रेशन का समर्थन करें।", + "exportLabel": "निर्यात:", + "exporting": "निर्यात हो रहा है...", + "exportJson": "JSON निर्यात करें", + "importLabel": "आयात:", + "importButton": "टिप्पणियाँ आयात करें", + "source": { + "cwd": "CWD (.json)", + "twikoo": "Twikoo (.json)", + "artalk": "Artalk (.json)" + } + }, + "config": { + "title": "सिस्टम कॉन्फ़िगरेशन", + "desc": "बैकएंड सेटिंग्स, ईमेल कॉन्फ़िगरेशन, ब्लैकलिस्ट आदि प्रबंधित करें।", + "export": "कॉन्फ़िगरेशन निर्यात करें", + "import": "कॉन्फ़िगरेशन आयात करें" + }, + "stats": { + "title": "विज़िट आँकड़े", + "desc": "लेख विज़िट, लाइक और दैनिक रुझान प्रबंधित करें।", + "export": "आँकड़े निर्यात करें", + "import": "आँकड़े आयात करें" + }, + "backup": { + "title": "पूर्ण बैकअप", + "desc": "सभी सिस्टम डेटा (टिप्पणियाँ + कॉन्फ़िगरेशन + आँकड़े) का बैकअप लें या पुनर्स्थापित करें।", + "export": "पूर्ण निर्यात", + "import": "पूर्ण पुनर्स्थापना" + } + }, + "logs": { + "title": "ऑपरेशन लॉग" + }, + "prefixModal": { + "title": "URL उपसर्ग गायब है", + "descPart1": "पता चला ", + "descPart2": " डोमेन उपसर्ग (http/https) के बिना टिप्पणियाँ।", + "descPart3": "क्या आप आयात करते समय इसे जोड़ना चाहते हैं?", + "label": "डोमेन उपसर्ग (उदाहरण: https://example.me)", + "placeholder": "डोमेन उपसर्ग दर्ज करें", + "skip": "सीधे आयात करें (बिना जोड़े)", + "confirm": "जोड़ें और आयात करें" + }, + "messages": { + "exportSuccess": "निर्यात सफल", + "exportFailed": "निर्यात विफल", + "fileReadFailed": "फ़ाइल पढ़ने में विफल", + "jsonParseFailed": "JSON पार्सिंग विफल, कृपया फ़ाइल प्रारूप की जाँच करें", + "importConfigSuccess": "कॉन्फ़िगरेशन आयात सफल", + "importStatsSuccess": "आँकड़े आयात सफल", + "importBackupSuccess": "पूर्ण पुनर्स्थापना सफल", + "importCommentsSuccess": "टिप्पणी आयात सफल", + "prefixRequired": "कृपया डोमेन उपसर्ग दर्ज करें", + "importStart": "आयात शुरू: {name} (मोड: {mode})", + "fileParseSuccess": "फ़ाइल पार्स सफल, प्रसंस्करण...", + "errorWithMessage": "त्रुटि: {msg}", + "parsedCommentsCount": "{count} टिप्पणी डेटा पार्स किया गया", + "detectMissingPrefix": "{count} URL बिना उपसर्ग के पाए गए, उपयोगकर्ता की पुष्टि की प्रतीक्षा में...", + "prefixAdded": "उपसर्ग जोड़ा गया, आयात जारी...", + "skipPrefix": "उपयोगकर्ता ने उपसर्ग जोड़ना छोड़ दिया", + "readFileFailedLog": "फ़ाइल पढ़ने में विफल", + "importCommentsDone": "आयात पूर्ण: {message}" + } + }, + "comments": { + "title": "टिप्पणी प्रबंधन", + "statusFilter": { + "all": "सभी स्थितियाँ", + "approved": "स्वीकृत", + "pending": "लंबित", + "rejected": "अस्वीकृत" + }, + "refresh": "ताज़ा करें", + "table": { + "author": "उपयोगकर्ता", + "content": "सामग्री", + "path": "पथ", + "status": "स्थिति", + "actions": "क्रियाएं", + "admin": "व्यवस्थापक", + "time": "समय", + "ip": "IP", + "email": "ईमेल" + }, + "actions": { + "approve": "स्वीकृत करें", + "pending": "लंबित", + "reject": "अस्वीकार करें", + "edit": "संपादित करें", + "delete": "हटाएं", + "blockIp": "IP ब्लॉक करें", + "blockEmail": "ईमेल ब्लॉक करें", + "pin": "पिन करें" + }, + "pagination": { + "prev": "पिछला", + "next": "अगला", + "jumpTo": "पर जाएं", + "page": "पेज", + "confirm": "पुष्टि करें" + }, + "confirmDelete": "क्या आप वाकई टिप्पणी {id} हटाना चाहते हैं?", + "confirmBlockIp": "क्या आप वाकई IP {ip} को ब्लैकलिस्ट करना चाहते हैं?", + "confirmBlockEmail": "क्या आप वाकई ईमेल {email} को ब्लैकलिस्ट करना चाहते हैं?", + "successBlockIp": "IP को ब्लैकलिस्ट में जोड़ा गया", + "successBlockEmail": "ईमेल को ब्लैकलिस्ट में जोड़ा गया", + "empty": "कोई डेटा नहीं", + "editModal": { + "title": "टिप्पणी संपादित करें", + "name": "आगंतुक का नाम", + "email": "आगंतुक का ईमेल", + "url": "आगंतुक का URL", + "postSlug": "पेज ID", + "postUrl": "टिप्पणी URL", + "content": "सामग्री", + "status": "स्थिति", + "priority": "प्राथमिकता (1 डिफ़ॉल्ट है, उच्चतर पहले)", + "cancel": "रद्द करें", + "save": "सहेजें", + "saving": "सहेजा जा रहा है..." + } + }, + "settings": { + "title": "साइट सेटिंग्स", + "tabs": { + "comment": "टिप्पणियाँ और सुरक्षा", + "feature": "सुविधाएँ", + "emailNotify": "ईमेल सूचनाएँ", + "telegramNotify": "Telegram सूचनाएँ", + "display": "प्रदर्शन" + }, + "comment": { + "title": "टिप्पणी प्रदर्शन कॉन्फ़िगरेशन", + "adminEmail": "व्यवस्थापक ईमेल", + "adminBadge": "व्यवस्थापक बैज टेक्स्ट (डिफ़ॉल्ट आइकन के लिए खाली छोड़ें)", + "adminEnabled": "व्यवस्थापक बैज प्रदर्शन सक्षम करें", + "avatarPrefix": "अवतार उपसर्ग (डिफ़ॉल्ट: https://gravatar.com/avatar)", + "securityTitle": "सुरक्षा सेटिंग्स", + "requireReview": "नई टिप्पणियों को प्रदर्शन से पहले समीक्षा की आवश्यकता है", + "adminKey": "व्यवस्थापक टिप्पणी कुंजी (व्यवस्थापक ईमेल का उपयोग करते समय आवश्यक)", + "adminKeyPlaceholder": "सेट या संशोधित करने के लिए कुंजी दर्ज करें", + "allowedDomains": "अनुमत डोमेन (सभी के लिए खाली छोड़ें, अल्पविराम या स्थान से अलग करें)", + "blockedIps": "IP ब्लैकलिस्ट (अल्पविराम या नई लाइन से अलग करें)", + "blockedEmails": "ईमेल ब्लैकलिस्ट (अल्पविराम या नई लाइन से अलग करें)", + "save": "सहेजें", + "saving": "सहेजा जा रहा है..." + }, + "feature": { + "title": "सुविधाएँ", + "articleLike": "लेख लाइक सक्षम करें", + "articleLikeHint": "सक्षम होने पर, टिप्पणी अनुभाग के ऊपर एक लेख लाइक बटन प्रदर्शित होगा।", + "commentLike": "टिप्पणी लाइक सक्षम करें", + "commentLikeHint": "सक्षम होने पर, प्रत्येक टिप्पणी के साथ एक लाइक बटन प्रदर्शित होगा।", + "imageLightbox": "छवि लाइटबॉक्स", + "imageLightboxHint": "सक्षम होने पर, टिप्पणियों में छवियों पर क्लिक करने से वे पूर्ण स्क्रीन में दिखाई देंगी।", + "placeholder": "टिप्पणी बॉक्स प्लेसहोल्डर टेक्स्ट", + "placeholderHint": "इनपुट बॉक्स के लिए कस्टम टेक्स्ट। डिफ़ॉल्ट के लिए खाली छोड़ें।", + "widgetLanguage": "विजेट भाषा", + "widgetLanguageHint": "फ्रंटएंड टिप्पणी विजेट की भाषा सेट करें।", + "save": "सहेजें", + "saving": "सहेजा जा रहा है..." + }, + "emailNotify": { + "title": "ईमेल सेटिंग्स", + "enable": "ईमेल सूचनाएँ सक्षम करें", + "smtpTitle": "1. SMTP कॉन्फ़िगरेशन", + "provider": "प्रदाता", + "host": "SMTP होस्ट", + "port": "SMTP पोर्ट", + "secure": "SSL कनेक्शन", + "user": "ईमेल खाता", + "pass": "पासवर्ड/ऐप पासवर्ड", + "qqHint": "नोट: QQ मेल के लिए, पासवर्ड के बजाय प्राधिकरण कोड का उपयोग करें।", + "163Hint": "नोट: 163 मेल के लिए, पासवर्ड के बजाय प्राधिकरण कोड का उपयोग करें।", + "templateTitle": "2. ईमेल टेम्प्लेट", + "adminTemplate": "व्यवस्थापक अधिसूचना (HTML)", + "adminTemplateHint": "चर: ${commentAuthor}, ${postTitle}, ${postUrl}, ${commentContent}", + "replyTemplate": "उत्तर अधिसूचना (HTML)", + "replyTemplateHint": "चर: ${toName}, ${replyAuthor}, ${postTitle}, ${postUrl}, ${parentComment}, ${replyContent}", + "testBtn": "परीक्षण ईमेल भेजें", + "testingBtn": "भेजा जा रहा है...", + "resetBtn": "टेम्प्लेट रीसेट करें", + "save": "कॉन्फ़िगरेशन सहेजें", + "saving": "सहेजा जा रहा है..." + }, + "telegramNotify": { + "title": "Telegram सेटिंग्स", + "enable": "Telegram सूचनाएँ सक्षम करें", + "botToken": "Bot Token", + "botTokenHint": "Bot बनाने और Token प्राप्त करने के लिए Telegram में @BotFather खोजें", + "chatId": "Chat ID", + "chatIdHint": "उपयोगकर्ता या समूह ID। बॉट को संदेश भेजें और इसे खोजने के लिए API या @userinfobot का उपयोग करें।", + "webhookBtn": "Webhook सेट करें", + "webhookSetting": "सेट हो रहा है...", + "testBtn": "परीक्षण संदेश भेजें", + "testingBtn": "भेजा जा रहा है...", + "save": "सहेजें", + "saving": "सहेजा जा रहा है..." + }, + "display": { + "title": "प्रदर्शन सेटिंग्स", + "layoutTitle": "व्यवस्थापक पैनल शीर्षक", + "layoutTitleHint": "शीर्ष नेविगेशन बार में प्रदर्शित होता है।", + "adminLanguage": "व्यवस्थापक पैनल भाषा", + "adminLanguageHint": "व्यवस्थापक सिस्टम की भाषा सेट करें।", + "save": "सहेजें", + "saving": "सहेजा जा रहा है..." + } + }, + "common": { + "saveSuccess": "सफलतापूर्वक सहेजा गया", + "saveFailed": "सहेजने में विफल", + "loading": "लोड हो रहा है..." + } +} \ No newline at end of file diff --git a/cwd-admin/src/locales/id.json b/cwd-admin/src/locales/id.json new file mode 100644 index 0000000..168b54f --- /dev/null +++ b/cwd-admin/src/locales/id.json @@ -0,0 +1,304 @@ +{ + "menu": { + "comments": "Manajemen Komentar", + "stats": "Dasbor", + "analytics": "Analitik Kunjungan", + "settings": "Pengaturan Situs", + "data": "Manajemen Data" + }, + "layout": { + "toggleMenu": "Alihkan Menu", + "docs": "Dokumentasi", + "logout": "Keluar", + "moreActions": "Tindakan Lainnya", + "defaultSite": "Situs Default", + "theme": { + "light": "Terang", + "dark": "Gelap", + "system": "Sistem" + }, + "version": { + "title": "Informasi Versi", + "apiAddress": "Alamat API", + "apiVersion": "Versi API", + "adminVersion": "Versi Admin", + "match": "Versi admin saat ini cocok dengan versi API, Anda dapat menggunakannya dengan normal.", + "mismatch": "Versi admin saat ini tidak cocok dengan versi API. Disarankan untuk memperbarui layanan API untuk menghindari masalah kompatibilitas.", + "fetchError": "Gagal mengambil versi API:", + "loading": "Memuat...", + "notConfigured": "Belum Dikonfigurasi", + "notFetched": "Tidak Diambil", + "ok": "Mengerti" + } + }, + "stats": { + "title": "Dasbor", + "overview": "Ikhtisar", + "total": "Total Komentar", + "approved": "Disetujui", + "pending": "Tertunda", + "rejected": "Ditolak", + "trend": "Tren Komentar", + "bySite": "Statistik per Situs", + "last7Days": "7 Hari Terakhir", + "last30Days": "30 Hari Terakhir", + "noData": "Tidak ada data komentar", + "table": { + "domain": "Domain", + "total": "Total", + "approved": "Disetujui", + "pending": "Tertunda", + "rejected": "Ditolak" + }, + "loadError": "Gagal memuat statistik" + }, + "analytics": { + "title": "Analitik Kunjungan", + "overview": "Ikhtisar", + "totalPv": "Total Kunjungan", + "todayPv": "Kunjungan Hari Ini", + "weekPv": "Kunjungan Minggu Ini", + "monthPv": "Kunjungan Bulan Ini", + "totalPages": "Halaman Dikunjungi", + "trend": "Tren Kunjungan", + "pageDetail": "Detail Halaman", + "likeRank": "Peringkat Suka", + "last7Days": "7 Hari Terakhir", + "last30Days": "30 Hari Terakhir", + "sort": { + "pv": "Urutkan berdasarkan PV", + "latest": "Kunjungan Terbaru" + }, + "table": { + "title": "Judul Halaman", + "pv": "Kunjungan", + "time": "Kunjungan Terakhir", + "url": "URL Halaman", + "rank": "Peringkat", + "like": "Suka" + }, + "noData": "Tidak ada data kunjungan", + "noLikeData": "Tidak ada data suka", + "loadError": "Gagal memuat analitik kunjungan" + }, + "data": { + "title": "Manajemen Data", + "sections": { + "comments": { + "title": "Data Komentar", + "desc": "Kelola konten komentar, dukung migrasi dari sistem komentar lain.", + "exportLabel": "Ekspor:", + "exporting": "Mengekspor...", + "exportJson": "Ekspor JSON", + "importLabel": "Impor:", + "importButton": "Impor Komentar", + "source": { + "cwd": "CWD (.json)", + "twikoo": "Twikoo (.json)", + "artalk": "Artalk (.json)" + } + }, + "config": { + "title": "Konfigurasi Sistem", + "desc": "Kelola pengaturan admin, konfigurasi email, daftar hitam, dll.", + "export": "Ekspor Konfigurasi", + "import": "Impor Konfigurasi" + }, + "stats": { + "title": "Statistik Kunjungan", + "desc": "Kelola kunjungan artikel, suka, dan tren kunjungan harian.", + "export": "Ekspor Statistik", + "import": "Impor Statistik" + }, + "backup": { + "title": "Cadangan Lengkap", + "desc": "Cadangkan atau pulihkan semua data sistem (Komentar + Konfigurasi + Statistik).", + "export": "Ekspor Lengkap", + "import": "Pulihkan Lengkap" + } + }, + "logs": { + "title": "Log Operasi" + }, + "prefixModal": { + "title": "Awalan URL Hilang", + "descPart1": "Terdeteksi ", + "descPart2": " komentar tanpa awalan domain (http/https).", + "descPart3": "Apakah Anda ingin menambahkannya saat mengimpor?", + "label": "Awalan Domain (contoh: https://example.me)", + "placeholder": "Masukkan awalan domain", + "skip": "Impor Langsung (Tanpa Menambahkan)", + "confirm": "Tambahkan dan Impor" + }, + "messages": { + "exportSuccess": "Ekspor Berhasil", + "exportFailed": "Ekspor Gagal", + "fileReadFailed": "Gagal Membaca File", + "jsonParseFailed": "Gagal Mengurai JSON, silakan periksa format file", + "importConfigSuccess": "Impor Konfigurasi Berhasil", + "importStatsSuccess": "Impor Statistik Berhasil", + "importBackupSuccess": "Pemulihan Lengkap Berhasil", + "importCommentsSuccess": "Impor Komentar Berhasil", + "prefixRequired": "Silakan masukkan awalan domain", + "importStart": "Mulai Impor: {name} (Mode: {mode})", + "fileParseSuccess": "File berhasil diurai, memproses...", + "errorWithMessage": "Kesalahan: {msg}", + "parsedCommentsCount": "Mengurai {count} data komentar", + "detectMissingPrefix": "Terdeteksi {count} URL tanpa awalan, menunggu konfirmasi pengguna...", + "prefixAdded": "Awalan ditambahkan, melanjutkan impor...", + "skipPrefix": "Pengguna melewati penambahan awalan", + "readFileFailedLog": "Gagal membaca file", + "importCommentsDone": "Impor Selesai: {message}" + } + }, + "comments": { + "title": "Manajemen Komentar", + "statusFilter": { + "all": "Semua Status", + "approved": "Disetujui", + "pending": "Tertunda", + "rejected": "Ditolak" + }, + "refresh": "Segarkan", + "table": { + "author": "Pengguna", + "content": "Konten", + "path": "Jalur", + "status": "Status", + "actions": "Tindakan", + "admin": "Admin", + "time": "Waktu", + "ip": "IP", + "email": "Email" + }, + "actions": { + "approve": "Setujui", + "pending": "Tunda", + "reject": "Tolak", + "edit": "Edit", + "delete": "Hapus", + "blockIp": "Blokir IP", + "blockEmail": "Blokir Email", + "pin": "Sematkan" + }, + "pagination": { + "prev": "Sebelumnya", + "next": "Berikutnya", + "jumpTo": "Lompat ke", + "page": "Halaman", + "confirm": "Konfirmasi" + }, + "confirmDelete": "Apakah Anda yakin ingin menghapus komentar {id}?", + "confirmBlockIp": "Apakah Anda yakin ingin memblokir IP {ip}?", + "confirmBlockEmail": "Apakah Anda yakin ingin memblokir email {email}?", + "successBlockIp": "IP telah ditambahkan ke daftar hitam", + "successBlockEmail": "Email telah ditambahkan ke daftar hitam", + "empty": "Tidak ada data", + "editModal": { + "title": "Edit Komentar", + "name": "Nama Pengunjung", + "email": "Email Pengunjung", + "url": "URL Pengunjung", + "postSlug": "ID Halaman", + "postUrl": "URL Komentar", + "content": "Konten", + "status": "Status", + "priority": "Prioritas (1 default, lebih tinggi lebih dulu)", + "cancel": "Batal", + "save": "Simpan", + "saving": "Menyimpan..." + } + }, + "settings": { + "title": "Pengaturan Situs", + "tabs": { + "comment": "Komentar & Keamanan", + "feature": "Fitur", + "emailNotify": "Notifikasi Email", + "telegramNotify": "Notifikasi Telegram", + "display": "Tampilan" + }, + "comment": { + "title": "Konfigurasi Tampilan Komentar", + "adminEmail": "Email Admin", + "adminBadge": "Teks Lencana Admin (kosongkan untuk ikon default)", + "adminEnabled": "Tampilkan Lencana Admin", + "avatarPrefix": "Awalan Avatar (Default: https://gravatar.com/avatar)", + "securityTitle": "Pengaturan Keamanan", + "requireReview": "Komentar baru memerlukan persetujuan", + "adminKey": "Kunci Komentar Admin (diperlukan saat menggunakan email admin)", + "adminKeyPlaceholder": "Masukkan kunci untuk mengatur atau mengubah", + "allowedDomains": "Domain yang Diizinkan (kosongkan untuk semua, pisahkan dengan koma atau spasi)", + "blockedIps": "Daftar Hitam IP (pisahkan dengan koma atau baris baru)", + "blockedEmails": "Daftar Hitam Email (pisahkan dengan koma atau baris baru)", + "save": "Simpan", + "saving": "Menyimpan..." + }, + "feature": { + "title": "Fitur", + "articleLike": "Aktifkan Suka Artikel", + "articleLikeHint": "Menampilkan tombol suka artikel di atas bagian komentar.", + "commentLike": "Aktifkan Suka Komentar", + "commentLikeHint": "Menampilkan tombol suka pada setiap komentar.", + "imageLightbox": "Lightbox Gambar", + "imageLightboxHint": "Klik gambar dalam komentar untuk melihat layar penuh.", + "placeholder": "Teks Placeholder Komentar", + "placeholderHint": "Teks kustom untuk kotak input. Kosongkan untuk default.", + "widgetLanguage": "Bahasa Widget", + "widgetLanguageHint": "Atur bahasa widget komentar frontend.", + "save": "Simpan", + "saving": "Menyimpan..." + }, + "emailNotify": { + "title": "Pengaturan Email", + "enable": "Aktifkan Notifikasi Email", + "smtpTitle": "1. Konfigurasi SMTP", + "provider": "Penyedia", + "host": "Host SMTP", + "port": "Port SMTP", + "secure": "Koneksi SSL", + "user": "Akun Email", + "pass": "Kata Sandi/Kata Sandi Aplikasi", + "qqHint": "Catatan: Untuk QQ Mail, gunakan kode otorisasi, bukan kata sandi.", + "163Hint": "Catatan: Untuk 163 Mail, gunakan kode otorisasi, bukan kata sandi.", + "templateTitle": "2. Template Email", + "adminTemplate": "Notifikasi Admin (HTML)", + "adminTemplateHint": "Variabel: ${commentAuthor}, ${postTitle}, ${postUrl}, ${commentContent}", + "replyTemplate": "Notifikasi Balasan (HTML)", + "replyTemplateHint": "Variabel: ${toName}, ${replyAuthor}, ${postTitle}, ${postUrl}, ${parentComment}, ${replyContent}", + "testBtn": "Kirim Email Uji", + "testingBtn": "Mengirim...", + "resetBtn": "Atur Ulang Template", + "save": "Simpan Konfigurasi", + "saving": "Menyimpan..." + }, + "telegramNotify": { + "title": "Pengaturan Telegram", + "enable": "Aktifkan Notifikasi Telegram", + "botToken": "Token Bot", + "botTokenHint": "Cari @BotFather di Telegram untuk membuat bot dan mendapatkan token", + "chatId": "ID Obrolan", + "chatIdHint": "ID Pengguna atau Grup. Kirim pesan ke bot dan gunakan API atau @userinfobot untuk menemukannya.", + "webhookBtn": "Atur Webhook", + "webhookSetting": "Mengatur...", + "testBtn": "Kirim Pesan Uji", + "testingBtn": "Mengirim...", + "save": "Simpan", + "saving": "Menyimpan..." + }, + "display": { + "title": "Pengaturan Tampilan", + "layoutTitle": "Judul Panel Admin", + "layoutTitleHint": "Ditampilkan di bilah navigasi atas.", + "adminLanguage": "Bahasa Panel Admin", + "adminLanguageHint": "Atur bahasa sistem admin.", + "save": "Simpan", + "saving": "Menyimpan..." + } + }, + "common": { + "saveSuccess": "Berhasil Disimpan", + "saveFailed": "Gagal Disimpan", + "loading": "Memuat..." + } +} \ No newline at end of file diff --git a/cwd-admin/src/locales/it.json b/cwd-admin/src/locales/it.json new file mode 100644 index 0000000..bdd1ebd --- /dev/null +++ b/cwd-admin/src/locales/it.json @@ -0,0 +1,304 @@ +{ + "menu": { + "comments": "Gestione Commenti", + "stats": "Dashboard", + "analytics": "Analitica", + "settings": "Impostazioni", + "data": "Dati" + }, + "layout": { + "toggleMenu": "Attiva/Disattiva Menu", + "docs": "Documentazione", + "logout": "Esci", + "moreActions": "Altre Azioni", + "defaultSite": "Sito Predefinito", + "theme": { + "light": "Chiaro", + "dark": "Scuro", + "system": "Sistema" + }, + "version": { + "title": "Info Versione", + "apiAddress": "Indirizzo API", + "apiVersion": "Versione API", + "adminVersion": "Versione Admin", + "match": "Le versioni Admin e API corrispondono.", + "mismatch": "Versione non corrispondente. Aggiorna il servizio API.", + "fetchError": "Errore recupero versione:", + "loading": "Caricamento...", + "notConfigured": "Non Configurato", + "notFetched": "Non Recuperato", + "ok": "OK" + } + }, + "stats": { + "title": "Dashboard", + "overview": "Panoramica", + "total": "Totale Commenti", + "approved": "Approvati", + "pending": "In Attesa", + "rejected": "Rifiutati", + "trend": "Tendenza", + "bySite": "Per Sito", + "last7Days": "Ultimi 7 Giorni", + "last30Days": "Ultimi 30 Giorni", + "noData": "Nessun Dato", + "table": { + "domain": "Dominio", + "total": "Totale", + "approved": "Approvati", + "pending": "In Attesa", + "rejected": "Rifiutati" + }, + "loadError": "Errore caricamento statistiche" + }, + "analytics": { + "title": "Analitica", + "overview": "Panoramica", + "totalPv": "Totale PV", + "todayPv": "PV Oggi", + "weekPv": "PV Settimana", + "monthPv": "PV Mese", + "totalPages": "Pagine Visitate", + "trend": "Tendenza Traffico", + "pageDetail": "Dettagli Pagina", + "likeRank": "Top Mi Piace", + "last7Days": "Ultimi 7 Giorni", + "last30Days": "Ultimi 30 Giorni", + "sort": { + "pv": "Ordina per PV", + "latest": "Ultima Visita" + }, + "table": { + "title": "Titolo Pagina", + "pv": "PV", + "time": "Ultima Visita", + "url": "URL", + "rank": "Rango", + "like": "Mi Piace" + }, + "noData": "Nessun Dato", + "noLikeData": "Nessun Dato Mi Piace", + "loadError": "Errore caricamento analitica" + }, + "data": { + "title": "Gestione Dati", + "sections": { + "comments": { + "title": "Dati Commenti", + "desc": "Gestisci e importa commenti.", + "exportLabel": "Esporta:", + "exporting": "Esportazione...", + "exportJson": "Esporta JSON", + "importLabel": "Importa:", + "importButton": "Importa Commenti", + "source": { + "cwd": "CWD (.json)", + "twikoo": "Twikoo (.json)", + "artalk": "Artalk (.json)" + } + }, + "config": { + "title": "Config Sistema", + "desc": "Impostazioni, email, blacklist, ecc.", + "export": "Esporta Config", + "import": "Importa Config" + }, + "stats": { + "title": "Dati Analitici", + "desc": "Visualizzazioni, mi piace e tendenze.", + "export": "Esporta Stats", + "import": "Importa Stats" + }, + "backup": { + "title": "Backup Completo", + "desc": "Backup o ripristino completo (Commenti + Config + Stats).", + "export": "Esportazione Completa", + "import": "Ripristino Completo" + } + }, + "logs": { + "title": "Log Operazioni" + }, + "prefixModal": { + "title": "Prefisso URL Mancante", + "descPart1": "Rilevati ", + "descPart2": " commenti senza prefisso protocollo (http/https).", + "descPart3": "Aggiungere durante importazione?", + "label": "Prefisso Dominio (es. https://example.me)", + "placeholder": "Inserisci prefisso", + "skip": "Salta", + "confirm": "Aggiungi & Importa" + }, + "messages": { + "exportSuccess": "Esportazione Riuscita", + "exportFailed": "Esportazione Fallita", + "fileReadFailed": "Lettura File Fallita", + "jsonParseFailed": "Analisi JSON Fallita", + "importConfigSuccess": "Config Importata", + "importStatsSuccess": "Stats Importate", + "importBackupSuccess": "Ripristino Completo Riuscito", + "importCommentsSuccess": "Commenti Importati", + "prefixRequired": "Inserisci prefisso", + "importStart": "Importazione: {name} (Modo: {mode})", + "fileParseSuccess": "File analizzato, elaborazione...", + "errorWithMessage": "Errore: {msg}", + "parsedCommentsCount": "{count} commenti analizzati", + "detectMissingPrefix": "{count} URL senza prefisso, in attesa...", + "prefixAdded": "Prefisso aggiunto, continuo...", + "skipPrefix": "Aggiunta prefisso saltata", + "readFileFailedLog": "Lettura file fallita", + "importCommentsDone": "Importazione Completata: {message}" + } + }, + "comments": { + "title": "Gestione Commenti", + "statusFilter": { + "all": "Tutti", + "approved": "Approvati", + "pending": "In Attesa", + "rejected": "Rifiutati" + }, + "refresh": "Aggiorna", + "table": { + "author": "Utente", + "content": "Commento", + "path": "Percorso", + "status": "Stato", + "actions": "Azioni", + "admin": "Admin", + "time": "Ora", + "ip": "IP", + "email": "Email" + }, + "actions": { + "approve": "Approva", + "pending": "Sospendi", + "reject": "Rifiuta", + "edit": "Modifica", + "delete": "Elimina", + "blockIp": "Blocca IP", + "blockEmail": "Blocca Email", + "pin": "Fissa" + }, + "pagination": { + "prev": "Prec", + "next": "Succ", + "jumpTo": "Vai a", + "page": "Pagina", + "confirm": "OK" + }, + "confirmDelete": "Eliminare commento {id}?", + "confirmBlockIp": "Bloccare IP {ip}?", + "confirmBlockEmail": "Bloccare email {email}?", + "successBlockIp": "IP Bloccato", + "successBlockEmail": "Email Bloccata", + "empty": "Nessun Dato", + "editModal": { + "title": "Modifica Commento", + "name": "Nome", + "email": "Email", + "url": "URL", + "postSlug": "Slug", + "postUrl": "URL Post", + "content": "Contenuto", + "status": "Stato", + "priority": "Priorità (1=Normale, maggiore=Alto)", + "cancel": "Annulla", + "save": "Salva", + "saving": "Salvataggio..." + } + }, + "settings": { + "title": "Impostazioni", + "tabs": { + "comment": "Commenti & Sicurezza", + "feature": "Funzionalità", + "emailNotify": "Notifica Email", + "telegramNotify": "Notifica Telegram", + "display": "Visualizzazione" + }, + "comment": { + "title": "Visualizzazione Commenti", + "adminEmail": "Email Admin", + "adminBadge": "Testo Badge Admin (Vuoto per icona default)", + "adminEnabled": "Mostra Badge Admin", + "avatarPrefix": "Prefisso Avatar (Default: https://gravatar.com/avatar)", + "securityTitle": "Sicurezza", + "requireReview": "Richiedi Revisione per Nuovi Commenti", + "adminKey": "Chiave Admin (Richiesta per commenti con email admin)", + "adminKeyPlaceholder": "Inserisci chiave", + "allowedDomains": "Domini Consentiti (Vuoto per tutti. Separare con spazio/virgola)", + "blockedIps": "IP Bloccati (Separare con virgola/nuova riga)", + "blockedEmails": "Email Bloccate (Separare con virgola/nuova riga)", + "save": "Salva", + "saving": "Salvataggio..." + }, + "feature": { + "title": "Funzionalità", + "articleLike": "Abilita Mi Piace Articolo", + "articleLikeHint": "Mostra pulsante Mi Piace sopra i commenti.", + "commentLike": "Abilita Mi Piace Commento", + "commentLikeHint": "Mostra pulsante Mi Piace su ogni commento.", + "imageLightbox": "Lightbox Immagine", + "imageLightboxHint": "Abilita anteprima a schermo intero per le immagini.", + "placeholder": "Testo Placeholder", + "placeholderHint": "Placeholder personalizzato per input commenti.", + "widgetLanguage": "Lingua Widget", + "widgetLanguageHint": "Lingua per il widget frontend.", + "save": "Salva", + "saving": "Salvataggio..." + }, + "emailNotify": { + "title": "Notifica Email", + "enable": "Abilita Notifica Email", + "smtpTitle": "1. Config SMTP", + "provider": "Provider", + "host": "Host SMTP", + "port": "Porta SMTP", + "secure": "Sicurezza SSL", + "user": "Utente Email", + "pass": "Password/Token App", + "qqHint": "Nota: Per QQ Mail, usa Token App.", + "163Hint": "Nota: Per 163 Mail, usa Token App.", + "templateTitle": "2. Config Template", + "adminTemplate": "Template Admin (HTML)", + "adminTemplateHint": "Vars: ${commentAuthor}, ${postTitle}, ${postUrl}, ${commentContent}", + "replyTemplate": "Template Risposta (HTML)", + "replyTemplateHint": "Vars: ${toName}, ${replyAuthor}, ${postTitle}, ${postUrl}, ${parentComment}, ${replyContent}", + "testBtn": "Invia Email Test", + "testingBtn": "Invio...", + "resetBtn": "Reimposta Template", + "save": "Salva Config", + "saving": "Salvataggio..." + }, + "telegramNotify": { + "title": "Notifica Telegram", + "enable": "Abilita Notifica Telegram", + "botToken": "Token Bot", + "botTokenHint": "Ottieni da @BotFather", + "chatId": "ID Chat", + "chatIdHint": "ID Utente o Gruppo. Usa @userinfobot.", + "webhookBtn": "Imposta Webhook", + "webhookSetting": "Configurazione...", + "testBtn": "Invia Messaggio Test", + "testingBtn": "Invio...", + "save": "Salva", + "saving": "Salvataggio..." + }, + "display": { + "title": "Impostazioni Visualizzazione", + "layoutTitle": "Titolo Admin", + "layoutTitleHint": "Visualizzato nella barra di navigazione superiore.", + "adminLanguage": "Lingua Admin", + "adminLanguageHint": "Lingua per il pannello di amministrazione.", + "save": "Salva", + "saving": "Salvataggio..." + }, + "common": { + "saveSuccess": "Salvato con Successo", + "saveFailed": "Salvataggio Fallito", + "loading": "Caricamento..." + } + } +} \ No newline at end of file diff --git a/cwd-admin/src/locales/ja.json b/cwd-admin/src/locales/ja.json new file mode 100644 index 0000000..dc00bd6 --- /dev/null +++ b/cwd-admin/src/locales/ja.json @@ -0,0 +1,304 @@ +{ + "menu": { + "comments": "コメント管理", + "stats": "ダッシュボード", + "analytics": "アクセス統計", + "settings": "サイト設定", + "data": "データ管理" + }, + "layout": { + "toggleMenu": "メニュー切り替え", + "docs": "ドキュメント", + "logout": "ログアウト", + "moreActions": "その他の操作", + "defaultSite": "デフォルトサイト", + "theme": { + "light": "ライト", + "dark": "ダーク", + "system": "システム" + }, + "version": { + "title": "バージョン情報", + "apiAddress": "API アドレス", + "apiVersion": "API バージョン", + "adminVersion": "管理画面バージョン", + "match": "管理画面とAPIのバージョンが一致しています。", + "mismatch": "バージョンが一致しません。互換性の問題を避けるため、APIサービスを更新してください。", + "fetchError": "バージョン情報の取得に失敗しました:", + "loading": "読み込み中...", + "notConfigured": "未設定", + "notFetched": "未取得", + "ok": "OK" + } + }, + "stats": { + "title": "ダッシュボード", + "overview": "概要", + "total": "総コメント数", + "approved": "承認済み", + "pending": "承認待ち", + "rejected": "却下済み", + "trend": "コメント傾向", + "bySite": "サイト別統計", + "last7Days": "過去7日間", + "last30Days": "過去30日間", + "noData": "データなし", + "table": { + "domain": "ドメイン", + "total": "合計", + "approved": "承認済み", + "pending": "承認待ち", + "rejected": "却下済み" + }, + "loadError": "統計データの読み込みに失敗しました" + }, + "analytics": { + "title": "アクセス統計", + "overview": "概要", + "totalPv": "総PV", + "todayPv": "今日のPV", + "weekPv": "今週のPV", + "monthPv": "今月のPV", + "totalPages": "訪問ページ数", + "trend": "アクセス傾向", + "pageDetail": "ページ詳細", + "likeRank": "いいねランキング", + "last7Days": "過去7日間", + "last30Days": "過去30日間", + "sort": { + "pv": "PV順", + "latest": "最新の訪問" + }, + "table": { + "title": "ページタイトル", + "pv": "PV", + "time": "最終訪問", + "url": "URL", + "rank": "順位", + "like": "いいね" + }, + "noData": "データなし", + "noLikeData": "いいねデータなし", + "loadError": "統計データの読み込みに失敗しました" + }, + "data": { + "title": "データ管理", + "sections": { + "comments": { + "title": "コメントデータ", + "desc": "コメントの管理と他のフレームワークからのインポート。", + "exportLabel": "エクスポート:", + "exporting": "エクスポート中...", + "exportJson": "JSONエクスポート", + "importLabel": "インポート:", + "importButton": "コメントをインポート", + "source": { + "cwd": "CWD (.json)", + "twikoo": "Twikoo (.json)", + "artalk": "Artalk (.json)" + } + }, + "config": { + "title": "システム設定", + "desc": "管理画面設定、メール設定、ブラックリストなど。", + "export": "設定エクスポート", + "import": "設定インポート" + }, + "stats": { + "title": "アクセス統計", + "desc": "PV、いいね、アクセス傾向の管理。", + "export": "統計エクスポート", + "import": "統計インポート" + }, + "backup": { + "title": "完全バックアップ", + "desc": "全システムデータのバックアップと復元(コメント+設定+統計)。", + "export": "完全エクスポート", + "import": "完全復元" + } + }, + "logs": { + "title": "操作ログ" + }, + "prefixModal": { + "title": "URLプレフィックス欠落を検出", + "descPart1": "検出された ", + "descPart2": " 件のコメントURLにプロトコルプレフィックス(http/https)がありません。", + "descPart3": "インポート時に追加しますか?", + "label": "ドメインプレフィックス (例: https://example.me)", + "placeholder": "プレフィックスを入力", + "skip": "スキップ (追加しない)", + "confirm": "追加してインポート" + }, + "messages": { + "exportSuccess": "エクスポート成功", + "exportFailed": "エクスポート失敗", + "fileReadFailed": "ファイル読み込み失敗", + "jsonParseFailed": "JSON解析失敗", + "importConfigSuccess": "設定インポート成功", + "importStatsSuccess": "統計インポート成功", + "importBackupSuccess": "完全復元成功", + "importCommentsSuccess": "コメントインポート成功", + "prefixRequired": "ドメインプレフィックスを入力してください", + "importStart": "インポート開始: {name} (モード: {mode})", + "fileParseSuccess": "ファイル解析成功、処理中...", + "errorWithMessage": "エラー: {msg}", + "parsedCommentsCount": "{count} 件のコメントを解析しました", + "detectMissingPrefix": "{count} 件のURL欠落を検出、確認待ち...", + "prefixAdded": "プレフィックス追加済み、続行中...", + "skipPrefix": "プレフィックス追加をスキップ", + "readFileFailedLog": "ファイル読み込み失敗", + "importCommentsDone": "インポート完了: {message}" + } + }, + "comments": { + "title": "コメント管理", + "statusFilter": { + "all": "すべて", + "approved": "承認済み", + "pending": "承認待ち", + "rejected": "却下済み" + }, + "refresh": "更新", + "table": { + "author": "ユーザー", + "content": "コメント", + "path": "パス", + "status": "ステータス", + "actions": "操作", + "admin": "管理者", + "time": "時間", + "ip": "IP", + "email": "メール" + }, + "actions": { + "approve": "承認", + "pending": "保留", + "reject": "却下", + "edit": "編集", + "delete": "削除", + "blockIp": "IPブロック", + "blockEmail": "メールブロック", + "pin": "固定" + }, + "pagination": { + "prev": "前へ", + "next": "次へ", + "jumpTo": "移動", + "page": "ページ", + "confirm": "OK" + }, + "confirmDelete": "コメント {id} を削除しますか?", + "confirmBlockIp": "IP {ip} をブラックリストに追加しますか?", + "confirmBlockEmail": "メール {email} をブラックリストに追加しますか?", + "successBlockIp": "IPをブロックしました", + "successBlockEmail": "メールをブロックしました", + "empty": "データなし", + "editModal": { + "title": "コメント編集", + "name": "名前", + "email": "メール", + "url": "URL", + "postSlug": "スラッグ", + "postUrl": "記事URL", + "content": "内容", + "status": "ステータス", + "priority": "優先度 (1=通常, 大きいほど上)", + "cancel": "キャンセル", + "save": "保存", + "saving": "保存中..." + } + }, + "settings": { + "title": "設定", + "tabs": { + "comment": "コメントとセキュリティ", + "feature": "機能設定", + "emailNotify": "メール通知", + "telegramNotify": "Telegram通知", + "display": "表示設定" + }, + "comment": { + "title": "コメント表示設定", + "adminEmail": "管理者メール", + "adminBadge": "管理者バッジ文字 (空の場合はデフォルトアイコン)", + "adminEnabled": "管理者バッジを表示", + "avatarPrefix": "アバタープレフィックス (デフォルト: https://gravatar.com/avatar)", + "securityTitle": "セキュリティ設定", + "requireReview": "新規コメントを承認制にする", + "adminKey": "管理者キー (管理者メールでのコメントに必要)", + "adminKeyPlaceholder": "キーを入力", + "allowedDomains": "許可ドメイン (空の場合は制限なし。スペースまたはカンマ区切り)", + "blockedIps": "ブロックIP (カンマまたは改行区切り)", + "blockedEmails": "ブロックメール (カンマまたは改行区切り)", + "save": "保存", + "saving": "保存中..." + }, + "feature": { + "title": "機能設定", + "articleLike": "記事へのいいねを有効化", + "articleLikeHint": "コメント欄上部に記事へのいいねボタンを表示します。", + "commentLike": "コメントへのいいねを有効化", + "commentLikeHint": "各コメントにいいねボタンを表示します。", + "imageLightbox": "画像ライトボックス", + "imageLightboxHint": "コメント内の画像を全画面プレビューします。", + "placeholder": "プレースホルダー", + "placeholderHint": "コメント入力欄のヒントテキスト。", + "widgetLanguage": "ウィジェット言語", + "widgetLanguageHint": "フロントエンドウィジェットの言語。", + "save": "保存", + "saving": "保存中..." + }, + "emailNotify": { + "title": "メール通知設定", + "enable": "メール通知を有効化", + "smtpTitle": "1. SMTP設定", + "provider": "プロバイダー", + "host": "SMTPホスト", + "port": "SMTPポート", + "secure": "SSL接続", + "user": "メールユーザー", + "pass": "パスワード/アプリパスワード", + "qqHint": "注意: QQメールはパスワードではなく認証コードを使用してください。", + "163Hint": "注意: 163メールはパスワードではなく認証コードを使用してください。", + "templateTitle": "2. テンプレート設定", + "adminTemplate": "管理者通知テンプレート (HTML)", + "adminTemplateHint": "変数: ${commentAuthor}, ${postTitle}, ${postUrl}, ${commentContent}", + "replyTemplate": "返信通知テンプレート (HTML)", + "replyTemplateHint": "変数: ${toName}, ${replyAuthor}, ${postTitle}, ${postUrl}, ${parentComment}, ${replyContent}", + "testBtn": "テストメール送信", + "testingBtn": "送信中...", + "resetBtn": "テンプレートをリセット", + "save": "設定を保存", + "saving": "保存中..." + }, + "telegramNotify": { + "title": "Telegram通知設定", + "enable": "Telegram通知を有効化", + "botToken": "Bot Token", + "botTokenHint": "@BotFather から取得", + "chatId": "Chat ID", + "chatIdHint": "ユーザーIDまたはグループID。@userinfobot で確認できます。", + "webhookBtn": "Webhook設定", + "webhookSetting": "設定中...", + "testBtn": "テストメッセージ送信", + "testingBtn": "送信中...", + "save": "保存", + "saving": "保存中..." + }, + "display": { + "title": "表示設定", + "layoutTitle": "管理画面タイトル", + "layoutTitleHint": "トップナビゲーションバーに表示されます。", + "adminLanguage": "管理画面言語", + "adminLanguageHint": "管理パネルの言語設定。", + "save": "保存", + "saving": "保存中..." + }, + "common": { + "saveSuccess": "保存成功", + "saveFailed": "保存失敗", + "loading": "読み込み中..." + } + } +} \ No newline at end of file diff --git a/cwd-admin/src/locales/ko.json b/cwd-admin/src/locales/ko.json new file mode 100644 index 0000000..cf3fd36 --- /dev/null +++ b/cwd-admin/src/locales/ko.json @@ -0,0 +1,304 @@ +{ + "menu": { + "comments": "댓글 관리", + "stats": "대시보드", + "analytics": "방문 통계", + "settings": "사이트 설정", + "data": "데이터 관리" + }, + "layout": { + "toggleMenu": "메뉴 전환", + "docs": "문서", + "logout": "로그아웃", + "moreActions": "더보기", + "defaultSite": "기본 사이트", + "theme": { + "light": "라이트 모드", + "dark": "다크 모드", + "system": "시스템 설정" + }, + "version": { + "title": "버전 정보", + "apiAddress": "API 주소", + "apiVersion": "API 버전", + "adminVersion": "관리자 버전", + "match": "관리자와 API 버전이 일치합니다.", + "mismatch": "버전 불일치. 호환성 문제를 방지하기 위해 API 서비스를 업데이트하세요.", + "fetchError": "버전 정보를 가져올 수 없습니다:", + "loading": "로딩 중...", + "notConfigured": "설정되지 않음", + "notFetched": "가져오지 못함", + "ok": "확인" + } + }, + "stats": { + "title": "대시보드", + "overview": "개요", + "total": "총 댓글 수", + "approved": "승인됨", + "pending": "대기 중", + "rejected": "거절됨", + "trend": "댓글 추세", + "bySite": "사이트별 통계", + "last7Days": "최근 7일", + "last30Days": "최근 30일", + "noData": "데이터 없음", + "table": { + "domain": "도메인", + "total": "합계", + "approved": "승인됨", + "pending": "대기 중", + "rejected": "거절됨" + }, + "loadError": "통계 로드 실패" + }, + "analytics": { + "title": "방문 통계", + "overview": "개요", + "totalPv": "총 PV", + "todayPv": "오늘 PV", + "weekPv": "이번 주 PV", + "monthPv": "이번 달 PV", + "totalPages": "방문한 페이지 수", + "trend": "트래픽 추세", + "pageDetail": "페이지 상세", + "likeRank": "좋아요 순위", + "last7Days": "최근 7일", + "last30Days": "최근 30일", + "sort": { + "pv": "PV순 정렬", + "latest": "최신 방문" + }, + "table": { + "title": "페이지 제목", + "pv": "PV", + "time": "마지막 방문", + "url": "URL", + "rank": "순위", + "like": "좋아요" + }, + "noData": "데이터 없음", + "noLikeData": "좋아요 데이터 없음", + "loadError": "통계 로드 실패" + }, + "data": { + "title": "데이터 관리", + "sections": { + "comments": { + "title": "댓글 데이터", + "desc": "댓글 관리 및 타 프레임워크에서 가져오기.", + "exportLabel": "내보내기:", + "exporting": "내보내는 중...", + "exportJson": "JSON 내보내기", + "importLabel": "가져오기:", + "importButton": "댓글 가져오기", + "source": { + "cwd": "CWD (.json)", + "twikoo": "Twikoo (.json)", + "artalk": "Artalk (.json)" + } + }, + "config": { + "title": "시스템 설정", + "desc": "관리자 설정, 이메일 설정, 차단 목록 등.", + "export": "설정 내보내기", + "import": "설정 가져오기" + }, + "stats": { + "title": "통계 데이터", + "desc": "페이지 조회수, 좋아요, 추세 관리.", + "export": "통계 내보내기", + "import": "통계 가져오기" + }, + "backup": { + "title": "전체 백업", + "desc": "시스템 전체 데이터 백업 및 복원 (댓글 + 설정 + 통계).", + "export": "전체 내보내기", + "import": "전체 복원" + } + }, + "logs": { + "title": "작업 로그" + }, + "prefixModal": { + "title": "URL 접두사 누락 감지됨", + "descPart1": "감지됨: ", + "descPart2": "개의 댓글 URL에 프로토콜 접두사(http/https)가 없습니다.", + "descPart3": "가져올 때 추가하시겠습니까?", + "label": "도메인 접두사 (예: https://example.me)", + "placeholder": "접두사 입력", + "skip": "건너뛰기 (추가 안 함)", + "confirm": "추가 및 가져오기" + }, + "messages": { + "exportSuccess": "내보내기 성공", + "exportFailed": "내보내기 실패", + "fileReadFailed": "파일 읽기 실패", + "jsonParseFailed": "JSON 파싱 실패", + "importConfigSuccess": "설정 가져오기 성공", + "importStatsSuccess": "통계 가져오기 성공", + "importBackupSuccess": "전체 복원 성공", + "importCommentsSuccess": "댓글 가져오기 성공", + "prefixRequired": "도메인 접두사를 입력하세요", + "importStart": "가져오기 시작: {name} (모드: {mode})", + "fileParseSuccess": "파일 파싱 성공, 처리 중...", + "errorWithMessage": "오류: {msg}", + "parsedCommentsCount": "{count}개 댓글 파싱됨", + "detectMissingPrefix": "{count}개 URL 누락 감지, 확인 대기 중...", + "prefixAdded": "접두사 추가됨, 계속 진행 중...", + "skipPrefix": "접두사 추가 건너뜀", + "readFileFailedLog": "파일 읽기 실패", + "importCommentsDone": "가져오기 완료: {message}" + } + }, + "comments": { + "title": "댓글 관리", + "statusFilter": { + "all": "전체", + "approved": "승인됨", + "pending": "대기 중", + "rejected": "거절됨" + }, + "refresh": "새로고침", + "table": { + "author": "사용자", + "content": "내용", + "path": "경로", + "status": "상태", + "actions": "작업", + "admin": "관리자", + "time": "시간", + "ip": "IP", + "email": "이메일" + }, + "actions": { + "approve": "승인", + "pending": "보류", + "reject": "거절", + "edit": "편집", + "delete": "삭제", + "blockIp": "IP 차단", + "blockEmail": "이메일 차단", + "pin": "고정" + }, + "pagination": { + "prev": "이전", + "next": "다음", + "jumpTo": "이동", + "page": "페이지", + "confirm": "확인" + }, + "confirmDelete": "댓글 {id}를 삭제하시겠습니까?", + "confirmBlockIp": "IP {ip}를 차단하시겠습니까?", + "confirmBlockEmail": "이메일 {email}을 차단하시겠습니까?", + "successBlockIp": "IP 차단됨", + "successBlockEmail": "이메일 차단됨", + "empty": "데이터 없음", + "editModal": { + "title": "댓글 편집", + "name": "이름", + "email": "이메일", + "url": "URL", + "postSlug": "슬러그", + "postUrl": "게시물 URL", + "content": "내용", + "status": "상태", + "priority": "우선순위 (1=보통, 높을수록 상단)", + "cancel": "취소", + "save": "저장", + "saving": "저장 중..." + } + }, + "settings": { + "title": "설정", + "tabs": { + "comment": "댓글 및 보안", + "feature": "기능", + "emailNotify": "이메일 알림", + "telegramNotify": "Telegram 알림", + "display": "표시 설정" + }, + "comment": { + "title": "댓글 표시 설정", + "adminEmail": "관리자 이메일", + "adminBadge": "관리자 배지 텍스트 (기본 아이콘 사용 시 비워둠)", + "adminEnabled": "관리자 배지 표시", + "avatarPrefix": "아바타 접두사 (기본값: https://gravatar.com/avatar)", + "securityTitle": "보안 설정", + "requireReview": "새 댓글 검토 후 표시", + "adminKey": "관리자 키 (관리자 이메일 댓글 작성 시 필요)", + "adminKeyPlaceholder": "키 입력", + "allowedDomains": "허용 도메인 (비워두면 모두 허용. 공백/콤마로 구분)", + "blockedIps": "차단된 IP (콤마/줄바꿈으로 구분)", + "blockedEmails": "차단된 이메일 (콤마/줄바꿈으로 구분)", + "save": "저장", + "saving": "저장 중..." + }, + "feature": { + "title": "기능 설정", + "articleLike": "게시물 좋아요 활성화", + "articleLikeHint": "댓글 상단에 좋아요 버튼 표시.", + "commentLike": "댓글 좋아요 활성화", + "commentLikeHint": "각 댓글에 좋아요 버튼 표시.", + "imageLightbox": "이미지 라이트박스", + "imageLightboxHint": "댓글 이미지 클릭 시 전체 화면 미리보기.", + "placeholder": "플레이스홀더", + "placeholderHint": "댓글 입력창 안내 문구.", + "widgetLanguage": "위젯 언어", + "widgetLanguageHint": "프론트엔드 위젯 언어.", + "save": "저장", + "saving": "저장 중..." + }, + "emailNotify": { + "title": "이메일 알림", + "enable": "이메일 알림 활성화", + "smtpTitle": "1. SMTP 설정", + "provider": "제공자", + "host": "SMTP 호스트", + "port": "SMTP 포트", + "secure": "SSL 보안", + "user": "이메일 계정", + "pass": "비밀번호/앱 토큰", + "qqHint": "참고: QQ 메일은 비밀번호 대신 앱 토큰을 사용하세요.", + "163Hint": "참고: 163 메일은 비밀번호 대신 앱 토큰을 사용하세요.", + "templateTitle": "2. 템플릿 설정", + "adminTemplate": "관리자 알림 템플릿 (HTML)", + "adminTemplateHint": "변수: ${commentAuthor}, ${postTitle}, ${postUrl}, ${commentContent}", + "replyTemplate": "답글 알림 템플릿 (HTML)", + "replyTemplateHint": "변수: ${toName}, ${replyAuthor}, ${postTitle}, ${postUrl}, ${parentComment}, ${replyContent}", + "testBtn": "테스트 이메일 전송", + "testingBtn": "전송 중...", + "resetBtn": "템플릿 초기화", + "save": "설정 저장", + "saving": "저장 중..." + }, + "telegramNotify": { + "title": "Telegram 알림", + "enable": "Telegram 알림 활성화", + "botToken": "Bot Token", + "botTokenHint": "@BotFather에서 획득", + "chatId": "Chat ID", + "chatIdHint": "사용자 ID 또는 그룹 ID. @userinfobot으로 확인.", + "webhookBtn": "웹훅 설정", + "webhookSetting": "설정 중...", + "testBtn": "테스트 메시지 전송", + "testingBtn": "전송 중...", + "save": "저장", + "saving": "저장 중..." + }, + "display": { + "title": "표시 설정", + "layoutTitle": "관리자 제목", + "layoutTitleHint": "상단 내비게이션 바에 표시됨.", + "adminLanguage": "관리자 언어", + "adminLanguageHint": "관리자 패널 언어.", + "save": "저장", + "saving": "저장 중..." + }, + "common": { + "saveSuccess": "저장 성공", + "saveFailed": "저장 실패", + "loading": "로딩 중..." + } + } +} \ No newline at end of file diff --git a/cwd-admin/src/locales/nl.json b/cwd-admin/src/locales/nl.json new file mode 100644 index 0000000..c98f405 --- /dev/null +++ b/cwd-admin/src/locales/nl.json @@ -0,0 +1,304 @@ +{ + "menu": { + "comments": "Reactiebeheer", + "stats": "Dashboard", + "analytics": "Bezoekstatistieken", + "settings": "Instellingen", + "data": "Gegevensbeheer" + }, + "layout": { + "toggleMenu": "Menu wisselen", + "docs": "Documentatie", + "logout": "Uitloggen", + "moreActions": "Meer acties", + "defaultSite": "Standaard site", + "theme": { + "light": "Licht", + "dark": "Donker", + "system": "Systeem" + }, + "version": { + "title": "Versie-informatie", + "apiAddress": "API-adres", + "apiVersion": "API-versie", + "adminVersion": "Beheerversie", + "match": "De huidige beheerversie komt overeen met de API-versie, u kunt deze normaal gebruiken.", + "mismatch": "De huidige beheerversie komt niet overeen met de API-versie. Het wordt aanbevolen om de API-service bij te werken om compatibiliteitsproblemen te voorkomen.", + "fetchError": "Kan API-versie niet ophalen:", + "loading": "Laden...", + "notConfigured": "Niet geconfigureerd", + "notFetched": "Niet opgehaald", + "ok": "Begrepen" + } + }, + "stats": { + "title": "Dashboard", + "overview": "Overzicht", + "total": "Totaal reacties", + "approved": "Goedgekeurd", + "pending": "In afwachting", + "rejected": "Geweigerd", + "trend": "Reactietrend", + "bySite": "Statistieken per site", + "last7Days": "Laatste 7 dagen", + "last30Days": "Laatste 30 dagen", + "noData": "Geen reactiegegevens", + "table": { + "domain": "Domein", + "total": "Totaal", + "approved": "Goedgekeurd", + "pending": "In afwachting", + "rejected": "Geweigerd" + }, + "loadError": "Kan statistieken niet laden" + }, + "analytics": { + "title": "Bezoekstatistieken", + "overview": "Overzicht", + "totalPv": "Totaal aantal bezoeken", + "todayPv": "Bezoeken vandaag", + "weekPv": "Bezoeken deze week", + "monthPv": "Bezoeken deze maand", + "totalPages": "Pagina's met bezoeken", + "trend": "Bezoektrend", + "pageDetail": "Paginadetails", + "likeRank": "Pagina's met meeste likes", + "last7Days": "Laatste 7 dagen", + "last30Days": "Laatste 30 dagen", + "sort": { + "pv": "Sorteer op PV", + "latest": "Nieuwste bezoek" + }, + "table": { + "title": "Paginatitel", + "pv": "Bezoeken", + "time": "Laatste bezoek", + "url": "Pagina-URL", + "rank": "Rang", + "like": "Likes" + }, + "noData": "Geen bezoekgegevens", + "noLikeData": "Geen like-gegevens", + "loadError": "Kan bezoekstatistieken niet laden" + }, + "data": { + "title": "Gegevensbeheer", + "sections": { + "comments": { + "title": "Reactiegegevens", + "desc": "Beheer reacties, ondersteunt migratie van andere reactiesystemen.", + "exportLabel": "Exporteren:", + "exporting": "Exporteren...", + "exportJson": "JSON exporteren", + "importLabel": "Importeren:", + "importButton": "Reacties importeren", + "source": { + "cwd": "CWD (.json)", + "twikoo": "Twikoo (.json)", + "artalk": "Artalk (.json)" + } + }, + "config": { + "title": "Systeemconfiguratie", + "desc": "Beheer systeeminstellingen, e-mailconfiguratie, zwarte lijsten, enz.", + "export": "Configuratie exporteren", + "import": "Configuratie importeren" + }, + "stats": { + "title": "Bezoekstatistieken", + "desc": "Beheer paginabezoeken, likes en dagelijkse trends.", + "export": "Statistieken exporteren", + "import": "Statistieken importeren" + }, + "backup": { + "title": "Volledige back-up", + "desc": "Back-up of herstel van alle systeemgegevens (reacties + configuratie + statistieken).", + "export": "Volledig exporteren", + "import": "Volledig herstellen" + } + }, + "logs": { + "title": "Actielogs" + }, + "prefixModal": { + "title": "URL-voorvoegsel ontbreekt", + "descPart1": "Gedetecteerd ", + "descPart2": " reacties zonder domeinvoorvoegsel (http/https).", + "descPart3": "Wilt u dit toevoegen tijdens het importeren?", + "label": "Domeinvoorvoegsel (bijv. https://example.me)", + "placeholder": "Voer domeinvoorvoegsel in", + "skip": "Direct importeren (niet toevoegen)", + "confirm": "Toevoegen en importeren" + }, + "messages": { + "exportSuccess": "Exporteren geslaagd", + "exportFailed": "Exporteren mislukt", + "fileReadFailed": "Bestand lezen mislukt", + "jsonParseFailed": "JSON parsen mislukt, controleer het bestandsformaat", + "importConfigSuccess": "Configuratie importeren geslaagd", + "importStatsSuccess": "Statistieken importeren geslaagd", + "importBackupSuccess": "Volledig herstel geslaagd", + "importCommentsSuccess": "Reacties importeren geslaagd", + "prefixRequired": "Voer een domeinvoorvoegsel in", + "importStart": "Start import: {name} (Modus: {mode})", + "fileParseSuccess": "Bestand geparsed, verwerken...", + "errorWithMessage": "Fout: {msg}", + "parsedCommentsCount": "{count} reacties geparsed", + "detectMissingPrefix": "{count} URL's zonder voorvoegsel gedetecteerd, wachten op bevestiging...", + "prefixAdded": "Voorvoegsel toegevoegd, doorgaan met importeren...", + "skipPrefix": "Gebruiker heeft voorvoegsel toevoegen overgeslagen", + "readFileFailedLog": "Bestand lezen mislukt", + "importCommentsDone": "Import voltooid: {message}" + } + }, + "comments": { + "title": "Reactiebeheer", + "statusFilter": { + "all": "Alle statussen", + "approved": "Goedgekeurd", + "pending": "In afwachting", + "rejected": "Geweigerd" + }, + "refresh": "Vernieuwen", + "table": { + "author": "Gebruiker", + "content": "Inhoud", + "path": "Pad", + "status": "Status", + "actions": "Acties", + "admin": "Beheerder", + "time": "Tijd", + "ip": "IP", + "email": "E-mail" + }, + "actions": { + "approve": "Goedkeuren", + "pending": "Wachten", + "reject": "Weigeren", + "edit": "Bewerken", + "delete": "Verwijderen", + "blockIp": "IP blokkeren", + "blockEmail": "E-mail blokkeren", + "pin": "Vastzetten" + }, + "pagination": { + "prev": "Vorige", + "next": "Volgende", + "jumpTo": "Ga naar", + "page": "Pagina", + "confirm": "Bevestigen" + }, + "confirmDelete": "Weet u zeker dat u reactie {id} wilt verwijderen?", + "confirmBlockIp": "Weet u zeker dat u IP {ip} op de zwarte lijst wilt zetten?", + "confirmBlockEmail": "Weet u zeker dat u e-mail {email} op de zwarte lijst wilt zetten?", + "successBlockIp": "IP toegevoegd aan zwarte lijst", + "successBlockEmail": "E-mail toegevoegd aan zwarte lijst", + "empty": "Geen gegevens", + "editModal": { + "title": "Reactie bewerken", + "name": "Naam bezoeker", + "email": "E-mail bezoeker", + "url": "URL bezoeker", + "postSlug": "Pagina-ID", + "postUrl": "Reactie-URL", + "content": "Inhoud", + "status": "Status", + "priority": "Prioriteit (1 is standaard, hoger is belangrijker)", + "cancel": "Annuleren", + "save": "Opslaan", + "saving": "Opslaan..." + } + }, + "settings": { + "title": "Instellingen", + "tabs": { + "comment": "Reacties & Beveiliging", + "feature": "Functies", + "emailNotify": "E-mailmeldingen", + "telegramNotify": "Telegram-meldingen", + "display": "Weergave" + }, + "comment": { + "title": "Reactieweergave", + "adminEmail": "E-mailadres beheerder", + "adminBadge": "Beheerderlabel (leeg laten voor standaardpictogram)", + "adminEnabled": "Beheerderlabel weergeven", + "avatarPrefix": "Avatar-voorvoegsel (standaard: https://gravatar.com/avatar)", + "securityTitle": "Beveiligingsinstellingen", + "requireReview": "Nieuwe reacties moeten worden goedgekeurd", + "adminKey": "Beheerderssleutel (vereist voor reacties met beheerders-e-mail)", + "adminKeyPlaceholder": "Voer sleutel in om in te stellen of te wijzigen", + "allowedDomains": "Toegestane domeinen (leeg laten voor alle domeinen, scheiden met komma of spatie)", + "blockedIps": "IP zwarte lijst (scheiden met komma of nieuwe regel)", + "blockedEmails": "E-mail zwarte lijst (scheiden met komma of nieuwe regel)", + "save": "Opslaan", + "saving": "Opslaan..." + }, + "feature": { + "title": "Functies", + "articleLike": "Artikel likes inschakelen", + "articleLikeHint": "Toont een like-knop boven de reactiesectie.", + "commentLike": "Reactie likes inschakelen", + "commentLikeHint": "Toont een like-knop bij elke reactie.", + "imageLightbox": "Lightbox voor afbeeldingen", + "imageLightboxHint": "Klik op afbeeldingen in reacties om ze op volledig scherm te bekijken.", + "placeholder": "Plaatsaanduiding invoerveld", + "placeholderHint": "Aangepaste tekst voor het invoerveld. Leeg laten voor standaard.", + "widgetLanguage": "Widgettaal", + "widgetLanguageHint": "Taal van de frontend-widget.", + "save": "Opslaan", + "saving": "Opslaan..." + }, + "emailNotify": { + "title": "E-mailinstellingen", + "enable": "E-mailmeldingen inschakelen", + "smtpTitle": "1. SMTP-configuratie", + "provider": "Provider", + "host": "SMTP-host", + "port": "SMTP-poort", + "secure": "SSL-verbinding", + "user": "E-mailadres", + "pass": "Wachtwoord/App-wachtwoord", + "qqHint": "Opmerking: Gebruik voor QQ Mail een autorisatiecode, geen wachtwoord.", + "163Hint": "Opmerking: Gebruik voor 163 Mail een autorisatiecode, geen wachtwoord.", + "templateTitle": "2. E-mailjablonen", + "adminTemplate": "Beheerdersmelding (HTML)", + "adminTemplateHint": "Variabelen: ${commentAuthor}, ${postTitle}, ${postUrl}, ${commentContent}", + "replyTemplate": "Antwoordmelding (HTML)", + "replyTemplateHint": "Variabelen: ${toName}, ${replyAuthor}, ${postTitle}, ${postUrl}, ${parentComment}, ${replyContent}", + "testBtn": "Test e-mail verzenden", + "testingBtn": "Verzenden...", + "resetBtn": "Sjablonen resetten", + "save": "Configuratie opslaan", + "saving": "Opslaan..." + }, + "telegramNotify": { + "title": "Telegram-instellingen", + "enable": "Telegram-meldingen inschakelen", + "botToken": "Bot Token", + "botTokenHint": "Maak een bot aan via @BotFather om een token te krijgen", + "chatId": "Chat ID", + "chatIdHint": "Gebruiker- of groeps-ID. Stuur een bericht naar de bot en gebruik API of @userinfobot om ID te vinden.", + "webhookBtn": "Webhook instellen", + "webhookSetting": "Instellen...", + "testBtn": "Testbericht verzenden", + "testingBtn": "Verzenden...", + "save": "Opslaan", + "saving": "Opslaan..." + }, + "display": { + "title": "Weergave-instellingen", + "layoutTitle": "Titel beheerpaneel", + "layoutTitleHint": "Wordt weergegeven in de navigatiebalk.", + "adminLanguage": "Taal beheerpaneel", + "adminLanguageHint": "Taal van het beheersysteem.", + "save": "Opslaan", + "saving": "Opslaan..." + } + }, + "common": { + "saveSuccess": "Opslaan geslaagd", + "saveFailed": "Opslaan mislukt", + "loading": "Laden..." + } +} \ No newline at end of file diff --git a/cwd-admin/src/locales/pt.json b/cwd-admin/src/locales/pt.json new file mode 100644 index 0000000..18b6f79 --- /dev/null +++ b/cwd-admin/src/locales/pt.json @@ -0,0 +1,304 @@ +{ + "menu": { + "comments": "Gestão de Comentários", + "stats": "Painel", + "analytics": "Analítica", + "settings": "Configurações", + "data": "Dados" + }, + "layout": { + "toggleMenu": "Alternar Menu", + "docs": "Documentação", + "logout": "Sair", + "moreActions": "Mais Ações", + "defaultSite": "Site Padrão", + "theme": { + "light": "Claro", + "dark": "Escuro", + "system": "Sistema" + }, + "version": { + "title": "Info da Versão", + "apiAddress": "Endereço da API", + "apiVersion": "Versão da API", + "adminVersion": "Versão do Admin", + "match": "As versões do Admin e da API correspondem.", + "mismatch": "Versão incompatível. Atualize o serviço da API.", + "fetchError": "Falha ao obter versão:", + "loading": "Carregando...", + "notConfigured": "Não Configurado", + "notFetched": "Não Obtido", + "ok": "OK" + } + }, + "stats": { + "title": "Painel", + "overview": "Visão Geral", + "total": "Total de Comentários", + "approved": "Aprovados", + "pending": "Pendentes", + "rejected": "Rejeitados", + "trend": "Tendência", + "bySite": "Por Site", + "last7Days": "Últimos 7 Dias", + "last30Days": "Últimos 30 Dias", + "noData": "Sem Dados", + "table": { + "domain": "Domínio", + "total": "Total", + "approved": "Aprovados", + "pending": "Pendentes", + "rejected": "Rejeitados" + }, + "loadError": "Erro ao carregar estatísticas" + }, + "analytics": { + "title": "Analítica", + "overview": "Visão Geral", + "totalPv": "PV Total", + "todayPv": "PV Hoje", + "weekPv": "PV Semana", + "monthPv": "PV Mês", + "totalPages": "Páginas Visitadas", + "trend": "Tendência de Tráfego", + "pageDetail": "Detalhes da Página", + "likeRank": "Top Curtidas", + "last7Days": "Últimos 7 Dias", + "last30Days": "Últimos 30 Dias", + "sort": { + "pv": "Ordenar por PV", + "latest": "Última Visita" + }, + "table": { + "title": "Título da Página", + "pv": "PV", + "time": "Última Visita", + "url": "URL", + "rank": "Rank", + "like": "Curtidas" + }, + "noData": "Sem Dados", + "noLikeData": "Sem Dados de Curtidas", + "loadError": "Erro ao carregar analítica" + }, + "data": { + "title": "Gestão de Dados", + "sections": { + "comments": { + "title": "Dados de Comentários", + "desc": "Gerenciar e importar comentários.", + "exportLabel": "Exportar:", + "exporting": "Exportando...", + "exportJson": "Exportar JSON", + "importLabel": "Importar:", + "importButton": "Importar Comentários", + "source": { + "cwd": "CWD (.json)", + "twikoo": "Twikoo (.json)", + "artalk": "Artalk (.json)" + } + }, + "config": { + "title": "Config do Sistema", + "desc": "Configurações, e-mail, lista negra, etc.", + "export": "Exportar Config", + "import": "Importar Config" + }, + "stats": { + "title": "Dados Analíticos", + "desc": "Visualizações, curtidas e tendências.", + "export": "Exportar Stats", + "import": "Importar Stats" + }, + "backup": { + "title": "Backup Completo", + "desc": "Backup ou restauração de tudo (Comentários + Config + Stats).", + "export": "Exportação Completa", + "import": "Restauração Completa" + } + }, + "logs": { + "title": "Logs de Operação" + }, + "prefixModal": { + "title": "Prefixo de URL Ausente", + "descPart1": "Detectado ", + "descPart2": " comentários sem prefixo de protocolo (http/https).", + "descPart3": "Adicionar ao importar?", + "label": "Prefixo de Domínio (ex: https://example.me)", + "placeholder": "Inserir prefixo", + "skip": "Pular", + "confirm": "Adicionar e Importar" + }, + "messages": { + "exportSuccess": "Exportação com Sucesso", + "exportFailed": "Falha na Exportação", + "fileReadFailed": "Falha na Leitura do Arquivo", + "jsonParseFailed": "Falha na Análise JSON", + "importConfigSuccess": "Config Importada", + "importStatsSuccess": "Stats Importadas", + "importBackupSuccess": "Restauração Completa com Sucesso", + "importCommentsSuccess": "Comentários Importados", + "prefixRequired": "Por favor, insira o prefixo", + "importStart": "Importando: {name} (Modo: {mode})", + "fileParseSuccess": "Arquivo analisado, processando...", + "errorWithMessage": "Erro: {msg}", + "parsedCommentsCount": "{count} comentários analisados", + "detectMissingPrefix": "{count} URLs sem prefixo, aguardando confirmação...", + "prefixAdded": "Prefixo adicionado, continuando...", + "skipPrefix": "Adição de prefixo pulada", + "readFileFailedLog": "Falha na leitura do arquivo", + "importCommentsDone": "Importação Concluída: {message}" + } + }, + "comments": { + "title": "Gestão de Comentários", + "statusFilter": { + "all": "Todos", + "approved": "Aprovados", + "pending": "Pendentes", + "rejected": "Rejeitados" + }, + "refresh": "Atualizar", + "table": { + "author": "Usuário", + "content": "Comentário", + "path": "Caminho", + "status": "Status", + "actions": "Ações", + "admin": "Admin", + "time": "Hora", + "ip": "IP", + "email": "E-mail" + }, + "actions": { + "approve": "Aprovar", + "pending": "Pendente", + "reject": "Rejeitar", + "edit": "Editar", + "delete": "Excluir", + "blockIp": "Bloquear IP", + "blockEmail": "Bloquear E-mail", + "pin": "Fixar" + }, + "pagination": { + "prev": "Ant", + "next": "Próx", + "jumpTo": "Ir para", + "page": "Página", + "confirm": "OK" + }, + "confirmDelete": "Excluir comentário {id}?", + "confirmBlockIp": "Bloquear IP {ip}?", + "confirmBlockEmail": "Bloquear e-mail {email}?", + "successBlockIp": "IP Bloqueado", + "successBlockEmail": "E-mail Bloqueado", + "empty": "Sem Dados", + "editModal": { + "title": "Editar Comentário", + "name": "Nome", + "email": "E-mail", + "url": "URL", + "postSlug": "Slug", + "postUrl": "URL do Post", + "content": "Conteúdo", + "status": "Status", + "priority": "Prioridade (1=Normal, maior=Topo)", + "cancel": "Cancelar", + "save": "Salvar", + "saving": "Salvando..." + } + }, + "settings": { + "title": "Configurações", + "tabs": { + "comment": "Comentários e Segurança", + "feature": "Funcionalidades", + "emailNotify": "Notificação por E-mail", + "telegramNotify": "Notificação Telegram", + "display": "Exibição" + }, + "comment": { + "title": "Exibição de Comentários", + "adminEmail": "E-mail Admin", + "adminBadge": "Texto do Emblema Admin (Vazio para ícone padrão)", + "adminEnabled": "Mostrar Emblema Admin", + "avatarPrefix": "Prefixo do Avatar (Padrão: https://gravatar.com/avatar)", + "securityTitle": "Segurança", + "requireReview": "Exigir Revisão para Novos Comentários", + "adminKey": "Chave Admin (Necessária para comentários com e-mail admin)", + "adminKeyPlaceholder": "Inserir chave", + "allowedDomains": "Domínios Permitidos (Vazio para todos. Separar por espaço/vírgula)", + "blockedIps": "IPs Bloqueados (Separar por vírgula/nova linha)", + "blockedEmails": "E-mails Bloqueados (Separar por vírgula/nova linha)", + "save": "Salvar", + "saving": "Salvando..." + }, + "feature": { + "title": "Funcionalidades", + "articleLike": "Ativar Curtidas no Artigo", + "articleLikeHint": "Mostrar botão de curtir acima dos comentários.", + "commentLike": "Ativar Curtidas no Comentário", + "commentLikeHint": "Mostrar botão de curtir em cada comentário.", + "imageLightbox": "Lightbox de Imagem", + "imageLightboxHint": "Ativar visualização em tela cheia para imagens.", + "placeholder": "Texto do Placeholder", + "placeholderHint": "Placeholder personalizado para entrada de comentários.", + "widgetLanguage": "Idioma do Widget", + "widgetLanguageHint": "Idioma para o widget frontend.", + "save": "Salvar", + "saving": "Salvando..." + }, + "emailNotify": { + "title": "Notificação por E-mail", + "enable": "Ativar Notificação por E-mail", + "smtpTitle": "1. Config SMTP", + "provider": "Provedor", + "host": "Host SMTP", + "port": "Porta SMTP", + "secure": "Segurança SSL", + "user": "Usuário de E-mail", + "pass": "Senha/Token de App", + "qqHint": "Nota: Para QQ Mail, use Token de App.", + "163Hint": "Nota: Para 163 Mail, use Token de App.", + "templateTitle": "2. Config de Modelos", + "adminTemplate": "Modelo Admin (HTML)", + "adminTemplateHint": "Vars: ${commentAuthor}, ${postTitle}, ${postUrl}, ${commentContent}", + "replyTemplate": "Modelo Resposta (HTML)", + "replyTemplateHint": "Vars: ${toName}, ${replyAuthor}, ${postTitle}, ${postUrl}, ${parentComment}, ${replyContent}", + "testBtn": "Enviar E-mail de Teste", + "testingBtn": "Enviando...", + "resetBtn": "Redefinir Modelos", + "save": "Salvar Config", + "saving": "Salvando..." + }, + "telegramNotify": { + "title": "Notificação Telegram", + "enable": "Ativar Notificação Telegram", + "botToken": "Token do Bot", + "botTokenHint": "Obter via @BotFather", + "chatId": "ID do Chat", + "chatIdHint": "ID de Usuário ou Grupo. Use @userinfobot.", + "webhookBtn": "Definir Webhook", + "webhookSetting": "Configurando...", + "testBtn": "Enviar Mensagem de Teste", + "testingBtn": "Enviando...", + "save": "Salvar", + "saving": "Salvando..." + }, + "display": { + "title": "Configurações de Exibição", + "layoutTitle": "Título do Admin", + "layoutTitleHint": "Exibido na barra de navegação superior.", + "adminLanguage": "Idioma do Admin", + "adminLanguageHint": "Idioma para o painel de administração.", + "save": "Salvar", + "saving": "Salvando..." + }, + "common": { + "saveSuccess": "Salvo com Sucesso", + "saveFailed": "Falha ao Salvar", + "loading": "Carregando..." + } + } +} \ No newline at end of file diff --git a/cwd-admin/src/locales/ru.json b/cwd-admin/src/locales/ru.json new file mode 100644 index 0000000..f82e90b --- /dev/null +++ b/cwd-admin/src/locales/ru.json @@ -0,0 +1,304 @@ +{ + "menu": { + "comments": "Управление Комментариями", + "stats": "Панель", + "analytics": "Аналитика", + "settings": "Настройки", + "data": "Данные" + }, + "layout": { + "toggleMenu": "Меню", + "docs": "Документация", + "logout": "Выйти", + "moreActions": "Ещё", + "defaultSite": "Сайт по Умолчанию", + "theme": { + "light": "Светлая", + "dark": "Тёмная", + "system": "Системная" + }, + "version": { + "title": "Версия", + "apiAddress": "Адрес API", + "apiVersion": "Версия API", + "adminVersion": "Версия Админки", + "match": "Версии совпадают.", + "mismatch": "Версии не совпадают. Обновите API.", + "fetchError": "Ошибка получения версии:", + "loading": "Загрузка...", + "notConfigured": "Не настроено", + "notFetched": "Не получено", + "ok": "ОК" + } + }, + "stats": { + "title": "Панель", + "overview": "Обзор", + "total": "Всего Комментариев", + "approved": "Одобрено", + "pending": "На проверке", + "rejected": "Отклонено", + "trend": "Тренд", + "bySite": "По сайтам", + "last7Days": "7 дней", + "last30Days": "30 дней", + "noData": "Нет данных", + "table": { + "domain": "Домен", + "total": "Всего", + "approved": "Одобрено", + "pending": "На проверке", + "rejected": "Отклонено" + }, + "loadError": "Ошибка загрузки статистики" + }, + "analytics": { + "title": "Аналитика", + "overview": "Обзор", + "totalPv": "Всего PV", + "todayPv": "PV Сегодня", + "weekPv": "PV Неделя", + "monthPv": "PV Месяц", + "totalPages": "Посещённые страницы", + "trend": "Тренд Трафика", + "pageDetail": "Детали Страницы", + "likeRank": "Топ Лайков", + "last7Days": "7 дней", + "last30Days": "30 дней", + "sort": { + "pv": "Сорт. по PV", + "latest": "Последние" + }, + "table": { + "title": "Заголовок", + "pv": "PV", + "time": "Последний Визит", + "url": "URL", + "rank": "Ранг", + "like": "Лайки" + }, + "noData": "Нет данных", + "noLikeData": "Нет данных о лайках", + "loadError": "Ошибка загрузки аналитики" + }, + "data": { + "title": "Управление Данными", + "sections": { + "comments": { + "title": "Данные Комментариев", + "desc": "Управление и импорт комментариев.", + "exportLabel": "Экспорт:", + "exporting": "Экспорт...", + "exportJson": "Экспорт JSON", + "importLabel": "Импорт:", + "importButton": "Импорт Комментариев", + "source": { + "cwd": "CWD (.json)", + "twikoo": "Twikoo (.json)", + "artalk": "Artalk (.json)" + } + }, + "config": { + "title": "Конфигурация", + "desc": "Настройки, email, чёрный список.", + "export": "Экспорт Конфига", + "import": "Импорт Конфига" + }, + "stats": { + "title": "Аналитика", + "desc": "Просмотры, лайки, тренды.", + "export": "Экспорт Статистики", + "import": "Импорт Статистики" + }, + "backup": { + "title": "Полный Бэкап", + "desc": "Бэкап или восстановление всего (Комментарии + Конфиг + Статистика).", + "export": "Полный Экспорт", + "import": "Полное Восстановление" + } + }, + "logs": { + "title": "Журнал Операций" + }, + "prefixModal": { + "title": "Отсутствует префикс URL", + "descPart1": "Обнаружено ", + "descPart2": " комментариев без префикса (http/https).", + "descPart3": "Добавить при импорте?", + "label": "Префикс домена (напр. https://example.me)", + "placeholder": "Введите префикс", + "skip": "Пропустить", + "confirm": "Добавить и Импортировать" + }, + "messages": { + "exportSuccess": "Экспорт успешен", + "exportFailed": "Ошибка экспорта", + "fileReadFailed": "Ошибка чтения файла", + "jsonParseFailed": "Ошибка парсинга JSON", + "importConfigSuccess": "Конфиг импортирован", + "importStatsSuccess": "Статистика импортирована", + "importBackupSuccess": "Восстановление успешно", + "importCommentsSuccess": "Комментарии импортированы", + "prefixRequired": "Введите префикс", + "importStart": "Импорт: {name} (Режим: {mode})", + "fileParseSuccess": "Файл разобран, обработка...", + "errorWithMessage": "Ошибка: {msg}", + "parsedCommentsCount": "Разобрано {count} комментариев", + "detectMissingPrefix": "{count} URL без префикса, ожидание...", + "prefixAdded": "Префикс добавлен, продолжение...", + "skipPrefix": "Добавление префикса пропущено", + "readFileFailedLog": "Ошибка чтения файла", + "importCommentsDone": "Импорт завершён: {message}" + } + }, + "comments": { + "title": "Управление Комментариями", + "statusFilter": { + "all": "Все", + "approved": "Одобрено", + "pending": "На проверке", + "rejected": "Отклонено" + }, + "refresh": "Обновить", + "table": { + "author": "Пользователь", + "content": "Комментарий", + "path": "Путь", + "status": "Статус", + "actions": "Действия", + "admin": "Админ", + "time": "Время", + "ip": "IP", + "email": "Email" + }, + "actions": { + "approve": "Одобрить", + "pending": "На проверку", + "reject": "Отклонить", + "edit": "Редактировать", + "delete": "Удалить", + "blockIp": "Блок IP", + "blockEmail": "Блок Email", + "pin": "Закрепить" + }, + "pagination": { + "prev": "Пред", + "next": "След", + "jumpTo": "Перейти", + "page": "Стр", + "confirm": "ОК" + }, + "confirmDelete": "Удалить комментарий {id}?", + "confirmBlockIp": "Блокировать IP {ip}?", + "confirmBlockEmail": "Блокировать Email {email}?", + "successBlockIp": "IP заблокирован", + "successBlockEmail": "Email заблокирован", + "empty": "Нет данных", + "editModal": { + "title": "Редактировать Комментарий", + "name": "Имя", + "email": "Email", + "url": "URL", + "postSlug": "Слаг", + "postUrl": "URL Поста", + "content": "Контент", + "status": "Статус", + "priority": "Приоритет (1=Обычный, выше=Топ)", + "cancel": "Отмена", + "save": "Сохранить", + "saving": "Сохранение..." + } + }, + "settings": { + "title": "Настройки", + "tabs": { + "comment": "Комментарии и Безопасность", + "feature": "Функции", + "emailNotify": "Email Уведомления", + "telegramNotify": "Telegram Уведомления", + "display": "Отображение" + }, + "comment": { + "title": "Отображение Комментариев", + "adminEmail": "Email Админа", + "adminBadge": "Текст Бейджа Админа (Пусто для иконки)", + "adminEnabled": "Показывать Бейдж Админа", + "avatarPrefix": "Префикс Аватара (По умолч.: https://gravatar.com/avatar)", + "securityTitle": "Безопасность", + "requireReview": "Премодерация Новых Комментариев", + "adminKey": "Ключ Админа (Для комм. с email админа)", + "adminKeyPlaceholder": "Введите ключ", + "allowedDomains": "Разрешённые Домены (Пусто для всех. Разделитель пробел/запятая)", + "blockedIps": "Заблокированные IP (Разделитель запятая/новая строка)", + "blockedEmails": "Заблокированные Email (Разделитель запятая/новая строка)", + "save": "Сохранить", + "saving": "Сохранение..." + }, + "feature": { + "title": "Функции", + "articleLike": "Включить Лайки Статей", + "articleLikeHint": "Кнопка лайка над комментариями.", + "commentLike": "Включить Лайки Комментариев", + "commentLikeHint": "Кнопка лайка у каждого комментария.", + "imageLightbox": "Лайтбокс Изображений", + "imageLightboxHint": "Полноэкранный просмотр изображений.", + "placeholder": "Текст Плейсхолдера", + "placeholderHint": "Текст подсказки в поле ввода.", + "widgetLanguage": "Язык Виджета", + "widgetLanguageHint": "Язык фронтенд виджета.", + "save": "Сохранить", + "saving": "Сохранение..." + }, + "emailNotify": { + "title": "Email Уведомления", + "enable": "Включить Email Уведомления", + "smtpTitle": "1. Настройки SMTP", + "provider": "Провайдер", + "host": "SMTP Хост", + "port": "SMTP Порт", + "secure": "SSL Безопасность", + "user": "Email Пользователь", + "pass": "Пароль/Токен", + "qqHint": "Для QQ Mail используйте токен приложения.", + "163Hint": "Для 163 Mail используйте токен приложения.", + "templateTitle": "2. Настройки Шаблонов", + "adminTemplate": "Шаблон Админа (HTML)", + "adminTemplateHint": "Перем: ${commentAuthor}, ${postTitle}, ${postUrl}, ${commentContent}", + "replyTemplate": "Шаблон Ответа (HTML)", + "replyTemplateHint": "Перем: ${toName}, ${replyAuthor}, ${postTitle}, ${postUrl}, ${parentComment}, ${replyContent}", + "testBtn": "Отправить Тест", + "testingBtn": "Отправка...", + "resetBtn": "Сбросить Шаблоны", + "save": "Сохранить Конфиг", + "saving": "Сохранение..." + }, + "telegramNotify": { + "title": "Telegram Уведомления", + "enable": "Включить Telegram Уведомления", + "botToken": "Токен Бота", + "botTokenHint": "Получить у @BotFather", + "chatId": "ID Чата", + "chatIdHint": "ID Пользователя или Группы. Исп. @userinfobot.", + "webhookBtn": "Установить Вебхук", + "webhookSetting": "Настройка...", + "testBtn": "Отправить Тест", + "testingBtn": "Отправка...", + "save": "Сохранить", + "saving": "Сохранение..." + }, + "display": { + "title": "Настройки Отображения", + "layoutTitle": "Заголовок Админки", + "layoutTitleHint": "Отображается в верхней панели.", + "adminLanguage": "Язык Админки", + "adminLanguageHint": "Язык панели администратора.", + "save": "Сохранить", + "saving": "Сохранение..." + }, + "common": { + "saveSuccess": "Сохранено", + "saveFailed": "Ошибка Сохранения", + "loading": "Загрузка..." + } + } +} \ No newline at end of file diff --git a/cwd-admin/src/locales/zh-CN.json b/cwd-admin/src/locales/zh-CN.json new file mode 100644 index 0000000..a891d78 --- /dev/null +++ b/cwd-admin/src/locales/zh-CN.json @@ -0,0 +1,304 @@ +{ + "menu": { + "comments": "评论管理", + "stats": "数据看板", + "analytics": "访问统计", + "settings": "网站设置", + "data": "数据管理" + }, + "layout": { + "toggleMenu": "切换菜单", + "docs": "使用文档", + "logout": "退出", + "moreActions": "更多操作", + "defaultSite": "默认站点", + "theme": { + "light": "明亮模式", + "dark": "暗黑模式", + "system": "跟随系统" + }, + "version": { + "title": "版本信息", + "apiAddress": "API 地址", + "apiVersion": "接口版本", + "adminVersion": "后台版本", + "match": "当前后台与接口版本一致,可以正常使用。", + "mismatch": "当前后台与接口版本不一致,推荐将 API 服务更新到与后台版本一致,以避免潜在的兼容性问题。", + "fetchError": "无法获取接口版本:", + "loading": "加载中...", + "notConfigured": "未配置", + "notFetched": "未获取到", + "ok": "我知道了" + } + }, + "stats": { + "title": "数据看板", + "overview": "整体概览", + "total": "总评论数", + "approved": "已通过", + "pending": "待审核", + "rejected": "已拒绝", + "trend": "评论数趋势", + "bySite": "按站点统计", + "last7Days": "最近 7 天", + "last30Days": "最近 30 天", + "noData": "暂无评论数据", + "table": { + "domain": "域名", + "total": "总数", + "approved": "已通过", + "pending": "待审核", + "rejected": "已拒绝" + }, + "loadError": "加载统计数据失败" + }, + "analytics": { + "title": "访问统计", + "overview": "整体概览", + "totalPv": "全站总访问量", + "todayPv": "今日访问量", + "weekPv": "本周访问量", + "monthPv": "本月访问量", + "totalPages": "有访问记录的页面数", + "trend": "访问趋势", + "pageDetail": "页面访问明细", + "likeRank": "点赞页面排行榜", + "last7Days": "最近 7 天", + "last30Days": "最近 30 天", + "sort": { + "pv": "按 PV 排序", + "latest": "最新访问" + }, + "table": { + "title": "页面标题", + "pv": "访问量", + "time": "最后访问时间", + "url": "页面地址", + "rank": "排名", + "like": "点赞数" + }, + "noData": "暂无访问数据", + "noLikeData": "暂无点赞数据", + "loadError": "加载访问统计数据失败" + }, + "data": { + "title": "数据管理", + "sections": { + "comments": { + "title": "评论数据", + "desc": "管理评论内容,支持从其他评论框架迁移数据。", + "exportLabel": "导出:", + "exporting": "导出中...", + "exportJson": "导出 JSON", + "importLabel": "导入:", + "importButton": "导入评论", + "source": { + "cwd": "CWD (.json)", + "twikoo": "Twikoo (.json)", + "artalk": "Artalk (.json)" + } + }, + "config": { + "title": "系统配置", + "desc": "管理后台设置、邮件配置、黑名单等。", + "export": "导出配置", + "import": "导入配置" + }, + "stats": { + "title": "访问统计", + "desc": "管理文章访问量、点赞数及每日访问趋势。", + "export": "导出统计", + "import": "导入统计" + }, + "backup": { + "title": "全量备份", + "desc": "一键备份或恢复系统所有数据(评论 + 配置 + 统计)。", + "export": "全量导出", + "import": "全量恢复" + } + }, + "logs": { + "title": "操作日志" + }, + "prefixModal": { + "title": "检测到 URL 缺失前缀", + "descPart1": "检测到 ", + "descPart2": " 条评论的 URL 不存在域名前缀(http/https)。", + "descPart3": "是否在导入时统一添加?", + "label": "域名前缀 (例如 https://example.me)", + "placeholder": "请输入域名前缀", + "skip": "直接导入 (不添加)", + "confirm": "添加并导入" + }, + "messages": { + "exportSuccess": "导出成功", + "exportFailed": "导出失败", + "fileReadFailed": "读取文件失败", + "jsonParseFailed": "JSON 解析失败,请检查文件格式", + "importConfigSuccess": "配置导入成功", + "importStatsSuccess": "统计数据导入成功", + "importBackupSuccess": "全量恢复成功", + "importCommentsSuccess": "评论导入成功", + "prefixRequired": "请输入域名前缀", + "importStart": "开始导入: {name} (模式: {mode})", + "fileParseSuccess": "文件解析成功,开始处理...", + "errorWithMessage": "错误: {msg}", + "parsedCommentsCount": "解析到 {count} 条评论数据", + "detectMissingPrefix": "检测到 {count} 条 URL 缺失前缀,等待用户确认...", + "prefixAdded": "已添加前缀,继续导入...", + "skipPrefix": "用户跳过前缀添加", + "readFileFailedLog": "读取文件失败", + "importCommentsDone": "导入完成: {message}" + } + }, + "comments": { + "title": "评论管理", + "statusFilter": { + "all": "全部状态", + "approved": "已通过", + "pending": "待审核", + "rejected": "已拒绝" + }, + "refresh": "刷新", + "table": { + "author": "用户", + "content": "评论信息", + "path": "评论地址", + "status": "状态", + "actions": "操作", + "admin": "网站管理员", + "time": "时间", + "ip": "IP", + "email": "邮箱" + }, + "actions": { + "approve": "通过", + "pending": "待审", + "reject": "拒绝", + "edit": "编辑", + "delete": "删除", + "blockIp": "屏蔽该 IP", + "blockEmail": "屏蔽该邮箱", + "pin": "置顶" + }, + "pagination": { + "prev": "上一页", + "next": "下一页", + "jumpTo": "跳转到", + "page": "页", + "confirm": "确定" + }, + "confirmDelete": "确认删除评论 {id} 吗", + "confirmBlockIp": "确认将 IP {ip} 加入黑名单吗?", + "confirmBlockEmail": "确认将邮箱 {email} 加入黑名单吗?", + "successBlockIp": "已加入 IP 黑名单", + "successBlockEmail": "已加入邮箱黑名单", + "empty": "暂无数据", + "editModal": { + "title": "编辑评论", + "name": "访客昵称", + "email": "访客邮箱", + "url": "访客网址", + "postSlug": "页面标识", + "postUrl": "评论地址", + "content": "评论内容", + "status": "评论状态", + "priority": "置顶权重(1 为不置顶,数值越大越靠前)", + "cancel": "取消", + "save": "保存", + "saving": "保存中..." + } + }, + "settings": { + "title": "网站设置", + "tabs": { + "comment": "评论与安全", + "feature": "功能开关", + "emailNotify": "邮箱提醒", + "telegramNotify": "Telegram 通知", + "display": "后台显示" + }, + "comment": { + "title": "评论显示配置", + "adminEmail": "管理员邮箱", + "adminBadge": "博主标签文字(留空使用默认图标)", + "adminEnabled": "是否开启博主标签显示", + "avatarPrefix": "头像前缀(默认:https://gravatar.com/avatar)", + "securityTitle": "安全设置", + "requireReview": "新评论是否审核后再显示", + "adminKey": "管理员评论密钥(设置后前台使用管理员邮箱评论需输入此密钥。)", + "adminKeyPlaceholder": "输入密钥以设置或修改", + "allowedDomains": "允许调用的域名(设置后仅匹配域名可调用前台评论组件,留空则不限制。使用空格或者逗号进行分割。)", + "blockedIps": "IP 黑名单(多个 IP 用逗号或换行分隔,留空则不限制)", + "blockedEmails": "邮箱黑名单(多个邮箱用逗号或换行分隔,留空则不限制)", + "save": "保存", + "saving": "保存中..." + }, + "feature": { + "title": "功能开关", + "articleLike": "开启文章点赞功能", + "articleLikeHint": "开启后,评论区顶部会显示的文章点赞(喜欢)按钮。", + "commentLike": "开启评论点赞功能", + "commentLikeHint": "开启后,评论列表中的每条评论都会显示点赞按钮。", + "imageLightbox": "评论列表图片灯箱模式", + "imageLightboxHint": "开启后,点击评论中的图片时会全屏放大预览。", + "placeholder": "评论框提示文案 (Placeholder)", + "placeholderHint": "自定义评论输入框的提示文字,支持换行。留空则使用默认值。", + "widgetLanguage": "组件语言", + "widgetLanguageHint": "设置前端评论组件显示的语言。", + "save": "保存", + "saving": "保存中..." + }, + "emailNotify": { + "title": "通知邮箱设置", + "enable": "开启邮件通知", + "smtpTitle": "1. SMTP 发件配置", + "provider": "邮件服务商", + "host": "SMTP 服务器", + "port": "SMTP 端口", + "secure": "SSL 安全连接", + "user": "发件邮箱账号", + "pass": "授权码/密码", + "qqHint": "注意:QQ 邮箱必须使用授权码,而非 QQ 密码。请登录 QQ 邮箱网页版,在【设置 - 账户】中开启 POP3/SMTP 服务并生成授权码。", + "163Hint": "注意:163 邮箱必须使用授权码,而非登录密码。请登录 163 邮箱网页版,在【设置 - POP3/SMTP/IMAP】中开启服务并生成授权码。", + "templateTitle": "2. 邮件模板设置", + "adminTemplate": "管理员通知模板 (HTML)", + "adminTemplateHint": "可用变量:${commentAuthor} (评论人昵称), ${postTitle} (文章标题), ${postUrl} (文章链接), ${commentContent} (评论内容)", + "replyTemplate": "回复通知模板 (HTML)", + "replyTemplateHint": "可用变量:${toName} (接收人昵称), ${replyAuthor} (回复人昵称), ${postTitle} (文章标题), ${postUrl} (文章链接), ${parentComment} (原评论), ${replyContent} (回复内容)", + "testBtn": "发送测试邮件", + "testingBtn": "发送中...", + "resetBtn": "恢复默认模板", + "save": "保存配置", + "saving": "保存中..." + }, + "telegramNotify": { + "title": "Telegram 通知设置", + "enable": "开启 Telegram 通知", + "botToken": "Bot Token", + "botTokenHint": "在 Telegram 中搜索 @BotFather 创建机器人获取 Token", + "chatId": "Chat ID", + "chatIdHint": "这是接收通知的用户 ID 或群组 ID。可以先给机器人发消息,然后通过 API 获取 ID,或者使用 @userinfobot 查询。", + "webhookBtn": "一键设置 Webhook", + "webhookSetting": "设置中...", + "testBtn": "发送测试消息", + "testingBtn": "发送中...", + "save": "保存", + "saving": "保存中..." + }, + "display": { + "title": "后台显示设置", + "layoutTitle": "后台标题", + "layoutTitleHint": "显示在后台顶部导航栏左侧。", + "adminLanguage": "后台语言", + "adminLanguageHint": "设置后台管理系统的显示语言。", + "save": "保存", + "saving": "保存中..." + } + }, + "common": { + "saveSuccess": "保存成功", + "saveFailed": "保存失败", + "loading": "加载中..." + } +} \ No newline at end of file diff --git a/cwd-admin/src/locales/zh-TW.json b/cwd-admin/src/locales/zh-TW.json new file mode 100644 index 0000000..cc8816c --- /dev/null +++ b/cwd-admin/src/locales/zh-TW.json @@ -0,0 +1,304 @@ +{ + "menu": { + "comments": "評論管理", + "stats": "數據看板", + "analytics": "訪問統計", + "settings": "網站設置", + "data": "數據管理" + }, + "layout": { + "toggleMenu": "切換菜單", + "docs": "使用文檔", + "logout": "退出", + "moreActions": "更多操作", + "defaultSite": "默認站點", + "theme": { + "light": "明亮模式", + "dark": "暗黑模式", + "system": "跟隨系統" + }, + "version": { + "title": "版本信息", + "apiAddress": "API 地址", + "apiVersion": "接口版本", + "adminVersion": "後台版本", + "match": "當前後台與接口版本一致,可以正常使用。", + "mismatch": "當前後台與接口版本不一致,推薦將 API 服務更新到與後台版本一致,以避免潛在的兼容性問題。", + "fetchError": "無法獲取接口版本:", + "loading": "加載中...", + "notConfigured": "未配置", + "notFetched": "未獲取到", + "ok": "我知道了" + } + }, + "stats": { + "title": "數據看板", + "overview": "整體概覽", + "total": "總評論數", + "approved": "已通過", + "pending": "待審核", + "rejected": "已拒絕", + "trend": "評論數趨勢", + "bySite": "按站點統計", + "last7Days": "最近 7 天", + "last30Days": "最近 30 天", + "noData": "暫無評論數據", + "table": { + "domain": "域名", + "total": "總數", + "approved": "已通過", + "pending": "待審核", + "rejected": "已拒絕" + }, + "loadError": "加載統計數據失敗" + }, + "analytics": { + "title": "訪問統計", + "overview": "整體概覽", + "totalPv": "全站總訪問量", + "todayPv": "今日訪問量", + "weekPv": "本週訪問量", + "monthPv": "本月訪問量", + "totalPages": "有訪問記錄的頁面數", + "trend": "訪問趨勢", + "pageDetail": "頁面訪問明細", + "likeRank": "點贊頁面排行榜", + "last7Days": "最近 7 天", + "last30Days": "最近 30 天", + "sort": { + "pv": "按 PV 排序", + "latest": "最新訪問" + }, + "table": { + "title": "頁面標題", + "pv": "訪問量", + "time": "最後訪問時間", + "url": "頁面地址", + "rank": "排名", + "like": "點贊數" + }, + "noData": "暫無訪問數據", + "noLikeData": "暫無點贊數據", + "loadError": "加載訪問統計數據失敗" + }, + "data": { + "title": "數據管理", + "sections": { + "comments": { + "title": "評論數據", + "desc": "管理評論內容,支持從其他評論框架遷移數據。", + "exportLabel": "導出:", + "exporting": "導出中...", + "exportJson": "導出 JSON", + "importLabel": "導入:", + "importButton": "導入評論", + "source": { + "cwd": "CWD (.json)", + "twikoo": "Twikoo (.json)", + "artalk": "Artalk (.json)" + } + }, + "config": { + "title": "系統配置", + "desc": "管理後台設置、郵件配置、黑名單等。", + "export": "導出配置", + "import": "導入配置" + }, + "stats": { + "title": "訪問統計", + "desc": "管理文章訪問量、點贊數及每日訪問趨勢。", + "export": "導出統計", + "import": "導入統計" + }, + "backup": { + "title": "全量備份", + "desc": "一鍵備份或恢復系統所有數據(評論 + 配置 + 統計)。", + "export": "全量導出", + "import": "全量恢復" + } + }, + "logs": { + "title": "操作日誌" + }, + "prefixModal": { + "title": "檢測到 URL 缺失前綴", + "descPart1": "檢測到 ", + "descPart2": " 條評論的 URL 不存在域名前綴(http/https)。", + "descPart3": "是否在導入時統一添加?", + "label": "域名前綴 (例如 https://example.me)", + "placeholder": "請輸入域名前綴", + "skip": "直接導入 (不添加)", + "confirm": "添加並導入" + }, + "messages": { + "exportSuccess": "導出成功", + "exportFailed": "導出失敗", + "fileReadFailed": "讀取文件失敗", + "jsonParseFailed": "JSON 解析失敗,請檢查文件格式", + "importConfigSuccess": "配置導入成功", + "importStatsSuccess": "統計數據導入成功", + "importBackupSuccess": "全量恢復成功", + "importCommentsSuccess": "評論導入成功", + "prefixRequired": "請輸入域名前綴", + "importStart": "開始導入: {name} (模式: {mode})", + "fileParseSuccess": "文件解析成功,開始處理...", + "errorWithMessage": "錯誤: {msg}", + "parsedCommentsCount": "解析到 {count} 條評論數據", + "detectMissingPrefix": "檢測到 {count} 條 URL 缺失前綴,等待用戶確認...", + "prefixAdded": "已添加前綴,繼續導入...", + "skipPrefix": "用戶跳過前綴添加", + "readFileFailedLog": "讀取文件失敗", + "importCommentsDone": "導入完成: {message}" + } + }, + "comments": { + "title": "評論管理", + "statusFilter": { + "all": "全部狀態", + "approved": "已通過", + "pending": "待審核", + "rejected": "已拒絕" + }, + "refresh": "刷新", + "table": { + "author": "用戶", + "content": "評論信息", + "path": "評論地址", + "status": "狀態", + "actions": "操作", + "admin": "網站管理員", + "time": "時間", + "ip": "IP", + "email": "郵箱" + }, + "actions": { + "approve": "通過", + "pending": "待審", + "reject": "拒絕", + "edit": "編輯", + "delete": "刪除", + "blockIp": "屏蔽該 IP", + "blockEmail": "屏蔽該郵箱", + "pin": "置頂" + }, + "pagination": { + "prev": "上一頁", + "next": "下一頁", + "jumpTo": "跳轉到", + "page": "頁", + "confirm": "確定" + }, + "confirmDelete": "確認刪除評論 {id} 嗎", + "confirmBlockIp": "確認將 IP {ip} 加入黑名單嗎?", + "confirmBlockEmail": "確認將郵箱 {email} 加入黑名單嗎?", + "successBlockIp": "已加入 IP 黑名單", + "successBlockEmail": "已加入郵箱黑名單", + "empty": "暫無數據", + "editModal": { + "title": "編輯評論", + "name": "訪客暱稱", + "email": "訪客郵箱", + "url": "訪客網址", + "postSlug": "頁面標識", + "postUrl": "評論地址", + "content": "評論內容", + "status": "評論狀態", + "priority": "置頂權重(1 為不置頂,數值越大越靠前)", + "cancel": "取消", + "save": "保存", + "saving": "保存中..." + } + }, + "settings": { + "title": "網站設置", + "tabs": { + "comment": "評論與安全", + "feature": "功能開關", + "emailNotify": "郵箱提醒", + "telegramNotify": "Telegram 通知", + "display": "後台顯示" + }, + "comment": { + "title": "評論顯示配置", + "adminEmail": "管理員郵箱", + "adminBadge": "博主標籤文字(留空使用默認圖標)", + "adminEnabled": "是否開啟博主標籤顯示", + "avatarPrefix": "頭像前綴(默認:https://gravatar.com/avatar)", + "securityTitle": "安全設置", + "requireReview": "新評論是否審核後再顯示", + "adminKey": "管理員評論密鑰(設置後前台使用管理員郵箱評論需輸入此密鑰。)", + "adminKeyPlaceholder": "輸入密鑰以設置或修改", + "allowedDomains": "允許調用的域名(設置後僅匹配域名可調用前台評論組件,留空則不限制。使用空格或者逗號進行分割。)", + "blockedIps": "IP 黑名單(多個 IP 用逗號或換行分隔,留空則不限制)", + "blockedEmails": "郵箱黑名單(多個郵箱用逗號或換行分隔,留空則不限制)", + "save": "保存", + "saving": "保存中..." + }, + "feature": { + "title": "功能開關", + "articleLike": "開啟文章點贊功能", + "articleLikeHint": "開啟後,評論區頂部會顯示的文章點贊(喜歡)按鈕。", + "commentLike": "開啟評論點贊功能", + "commentLikeHint": "開啟後,評論列表中的每條評論都會顯示點贊按鈕。", + "imageLightbox": "評論列表圖片灯箱模式", + "imageLightboxHint": "開啟後,點擊評論中的圖片時會全屏放大預覽。", + "placeholder": "評論框提示文案 (Placeholder)", + "placeholderHint": "自定義評論輸入框的提示文字,支持換行。留空則使用默認值。", + "widgetLanguage": "組件語言", + "widgetLanguageHint": "設置前端評論組件顯示的語言。", + "save": "保存", + "saving": "保存中..." + }, + "emailNotify": { + "title": "通知郵箱設置", + "enable": "開啟郵件通知", + "smtpTitle": "1. SMTP 發件配置", + "provider": "郵件服務商", + "host": "SMTP 服務器", + "port": "SMTP 端口", + "secure": "SSL 安全連接", + "user": "發件郵箱賬號", + "pass": "授權碼/密碼", + "qqHint": "注意:QQ 郵箱必須使用授權碼,而非 QQ 密碼。請登錄 QQ 郵箱網頁版,在【設置 - 賬戶】中開啟 POP3/SMTP 服務並生成授權碼。", + "163Hint": "注意:163 郵箱必須使用授權碼,而非登錄密碼。請登錄 163 郵箱網頁版,在【設置 - POP3/SMTP/IMAP】中開啟服務並生成授權碼。", + "templateTitle": "2. 郵件模板設置", + "adminTemplate": "管理員通知模板 (HTML)", + "adminTemplateHint": "可用變量:${commentAuthor} (評論人暱稱), ${postTitle} (文章標題), ${postUrl} (文章鏈接), ${commentContent} (評論內容)", + "replyTemplate": "回覆通知模板 (HTML)", + "replyTemplateHint": "可用變量:${toName} (接收人暱稱), ${replyAuthor} (回覆人暱稱), ${postTitle} (文章標題), ${postUrl} (文章鏈接), ${parentComment} (原評論), ${replyContent} (回覆內容)", + "testBtn": "發送測試郵件", + "testingBtn": "發送中...", + "resetBtn": "恢復默認模板", + "save": "保存配置", + "saving": "保存中..." + }, + "telegramNotify": { + "title": "Telegram 通知設置", + "enable": "開啟 Telegram 通知", + "botToken": "Bot Token", + "botTokenHint": "在 Telegram 中搜索 @BotFather 創建機器人獲取 Token", + "chatId": "Chat ID", + "chatIdHint": "這是接收通知的用戶 ID 或群組 ID。可以先給機器人發消息,然後通過 API 獲取 ID,或者使用 @userinfobot 查詢。", + "webhookBtn": "一鍵設置 Webhook", + "webhookSetting": "設置中...", + "testBtn": "發送測試消息", + "testingBtn": "發送中...", + "save": "保存", + "saving": "保存中..." + }, + "display": { + "title": "後台顯示設置", + "layoutTitle": "後台標題", + "layoutTitleHint": "顯示在後台頂部導航欄左側。", + "adminLanguage": "後台語言", + "adminLanguageHint": "設置後台管理系統的顯示語言。", + "save": "保存", + "saving": "保存中..." + }, + "common": { + "saveSuccess": "保存成功", + "saveFailed": "保存失敗", + "loading": "加載中..." + } + } +} \ No newline at end of file diff --git a/cwd-admin/src/main.ts b/cwd-admin/src/main.ts index 64bafc6..419de0f 100644 --- a/cwd-admin/src/main.ts +++ b/cwd-admin/src/main.ts @@ -1,6 +1,7 @@ import { createApp } from 'vue'; import App from './App.vue'; import { router } from './router'; +import i18n from './i18n'; import PhosphorIcons from '@phosphor-icons/vue'; @@ -9,5 +10,6 @@ import './styles/common.less'; const app = createApp(App); app.use(router); +app.use(i18n); app.use(PhosphorIcons); app.mount('#app'); diff --git a/cwd-admin/src/styles/layout.less b/cwd-admin/src/styles/layout.less index ae6c9ee..c460331 100644 --- a/cwd-admin/src/styles/layout.less +++ b/cwd-admin/src/styles/layout.less @@ -157,6 +157,12 @@ gap: 8px; } +.menu-item span { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + .menu-item-icon { flex: 0 0 auto; } @@ -307,4 +313,4 @@ .layout-actions-item-danger:hover { background-color: rgba(209, 36, 47, 0.1); } -} +} \ No newline at end of file diff --git a/cwd-admin/src/views/AnalyticsVisitView/index.vue b/cwd-admin/src/views/AnalyticsVisitView/index.vue index 6f1b72d..f017b57 100644 --- a/cwd-admin/src/views/AnalyticsVisitView/index.vue +++ b/cwd-admin/src/views/AnalyticsVisitView/index.vue @@ -1,7 +1,7 @@