feat(analytics): build-time bake + telemetry depth (#336)

Bake PostHog + Sentry into the published Docker image (SNAPOTTER_ANALYTICS
build arg, codegen script). Delete entire consent system. Move event emission
to BullMQ worker. Add cross-tier identity stitching, Sentry performance
tracing on both tiers, frontend funnel events. Fix stateful regex bug.

86 files changed, 1593 insertions(+), 3747 deletions(-)
This commit is contained in:
SnapOtter
2026-06-24 11:05:39 +08:00
committed by GitHub
parent a53038ed96
commit 5d36ac06d8
86 changed files with 1594 additions and 3748 deletions
+8
View File
@@ -0,0 +1,8 @@
// AUTO-GENERATED by scripts/bake-analytics.mjs -- do not edit manually
export const ANALYTICS_BAKED = {
enabled: false,
posthogApiKey: "",
posthogHost: "",
sentryDsn: "",
sampleRate: 0,
} as const;
-14
View File
@@ -1,14 +0,0 @@
import type { ConsentState } from "./types.js";
export function shouldShowConsent(consent: ConsentState, serverEnabled: boolean): boolean {
if (!serverEnabled) return false;
if (consent.analyticsEnabled !== null) return false;
if (consent.analyticsConsentShownAt === null) return true;
if (consent.analyticsConsentRemindAt === null) return false;
return Date.now() >= consent.analyticsConsentRemindAt;
}
export function isConsentEnabled(consent: ConsentState, serverEnabled: boolean): boolean {
if (!serverEnabled) return false;
return consent.analyticsEnabled === true;
}
+8
View File
@@ -1,8 +1,16 @@
export const ANALYTICS_EVENTS = {
TOOL_USED: "tool_used",
TOOL_OPENED: "tool_opened",
FILE_ADDED: "file_added",
TOOL_STARTED: "tool_started",
TOOL_CLIENT_ERROR: "tool_client_error",
RESULT_DOWNLOADED: "result_downloaded",
RESULT_SAVED: "result_saved",
SEARCH: "search",
PIPELINE_EXECUTED: "pipeline_executed",
AI_BUNDLE_ACTION: "ai_bundle_action",
AI_BUNDLE_PROMPTED: "ai_bundle_prompted",
BATCH_PROCESSED: "batch_processed",
} as const;
export type AnalyticsEvent = (typeof ANALYTICS_EVENTS)[keyof typeof ANALYTICS_EVENTS];
-6
View File
@@ -6,9 +6,3 @@ export interface AnalyticsConfig {
sampleRate: number;
instanceId: string;
}
export interface ConsentState {
analyticsEnabled: boolean | null;
analyticsConsentShownAt: number | null;
analyticsConsentRemindAt: number | null;
}
-23
View File
@@ -2679,7 +2679,6 @@ export const ar: TranslationKeys = {
apiKeys: "مفاتيح API",
aiFeatures: "ميزات AI",
tools: "الأدوات",
productAnalytics: "تحليلات المنتج",
about: "حول",
},
general: {
@@ -3004,15 +3003,6 @@ export const ar: TranslationKeys = {
auditRetentionDaysDesc:
"مدة الاحتفاظ بإدخالات سجل التدقيق. 0 = الاحتفاظ للأبد. الافتراضي: للأبد.",
},
analytics: {
heading: "تحليلات المنتج",
description: "مشاركة بيانات الاستخدام المجهولة للمساعدة في تحسين SnapOtter.",
privacyNote: "ملفاتك لا تغادر شبكتك أبدًا.",
disabledByAdmin: "تم تعطيل تحليلات المنتج بواسطة مسؤول الخادم.",
enabledLabel: "التحليلات مفعّلة",
disabledLabel: "التحليلات معطّلة",
learnMore: "معرفة المزيد",
},
aiFeatures: {
title: "ميزات AI",
description: "إدارة حزم نماذج AI لمعالجة الملفات المتقدمة.",
@@ -3358,19 +3348,6 @@ export const ar: TranslationKeys = {
invalidCredentials: "اسم المستخدم أو كلمة المرور غير صحيحة",
connectionError: "خطأ في الاتصال",
},
analytics: {
consentTitle: "ساعد في تحسين SnapOtter",
consentDescription:
"إحصائيات الاستخدام المجهولة تساعدنا في إصلاح الأخطاء وبناء الأدوات التي تحتاجها فعلًا. ملفاتك تبقى على شبكتك.",
consentChangeable: "يمكنك إيقاف هذا في أي وقت من الإعدادات.",
acceptButton: "بالتأكيد، موافق",
declineButton: "ليس الآن",
settingsTitle: "تحليلات المنتج",
settingsDescription: "مشاركة بيانات الاستخدام المجهولة للمساعدة في تحسين SnapOtter.",
settingsPrivacy: "ملفاتك لا تغادر شبكتك أبدًا.",
settingsDisabledByAdmin: "تم تعطيل تحليلات المنتج بواسطة مسؤول الخادم.",
learnMore: "معرفة المزيد",
},
sidebar: {
tools: "الأدوات",
grid: "شبكة",
-23
View File
@@ -2698,7 +2698,6 @@ export const de: TranslationKeys = {
apiKeys: "API-Schlüssel",
aiFeatures: "AI-Funktionen",
tools: "Werkzeuge",
productAnalytics: "Produktanalytik",
about: "Info",
},
general: {
@@ -3037,15 +3036,6 @@ export const de: TranslationKeys = {
auditRetentionDaysDesc:
"Wie lange Audit-Protokolleinträge aufbewahrt werden. 0 = unbegrenzt. Standard: unbegrenzt.",
},
analytics: {
heading: "Produktanalytik",
description: "Anonyme Nutzungsdaten teilen, um SnapOtter zu verbessern.",
privacyNote: "Ihre Dateien verlassen niemals Ihr Netzwerk.",
disabledByAdmin: "Produktanalytik wurde vom Serveradministrator deaktiviert.",
enabledLabel: "Analytik aktiviert",
disabledLabel: "Analytik deaktiviert",
learnMore: "Mehr erfahren",
},
aiFeatures: {
title: "AI-Funktionen",
description: "AI-Modellpakete für erweiterte Dateiverarbeitung verwalten.",
@@ -3400,19 +3390,6 @@ export const de: TranslationKeys = {
invalidCredentials: "Ungültiger Benutzername oder Passwort",
connectionError: "Verbindungsfehler",
},
analytics: {
consentTitle: "Helfen Sie, SnapOtter zu verbessern",
consentDescription:
"Anonyme Nutzungsstatistiken helfen uns, Fehler zu beheben und die Werkzeuge zu entwickeln, die Sie wirklich brauchen. Ihre Dateien bleiben auf Ihrem Netzwerk.",
consentChangeable: "Sie können dies jederzeit in den Einstellungen deaktivieren.",
acceptButton: "Klar, einverstanden",
declineButton: "Jetzt nicht",
settingsTitle: "Produktanalytik",
settingsDescription: "Anonyme Nutzungsdaten teilen, um SnapOtter zu verbessern.",
settingsPrivacy: "Ihre Dateien verlassen niemals Ihr Netzwerk.",
settingsDisabledByAdmin: "Produktanalytik wurde vom Serveradministrator deaktiviert.",
learnMore: "Mehr erfahren",
},
sidebar: {
tools: "Werkzeuge",
grid: "Raster",
-23
View File
@@ -2644,7 +2644,6 @@ export const en = {
apiKeys: "API Keys",
aiFeatures: "AI Features",
tools: "Tools",
productAnalytics: "Product Analytics",
about: "About",
},
general: {
@@ -2989,15 +2988,6 @@ export const en = {
auditRetentionDaysDesc:
"How long to keep audit log entries. 0 = keep forever. Default: forever.",
},
analytics: {
heading: "Product Analytics",
description: "Share anonymous usage data to help improve SnapOtter.",
privacyNote: "Your files never leave your network.",
disabledByAdmin: "Product analytics has been disabled by the server administrator.",
enabledLabel: "Analytics enabled",
disabledLabel: "Analytics disabled",
learnMore: "Learn more",
},
about: {
heading: "About",
appName: "SnapOtter",
@@ -3328,19 +3318,6 @@ export const en = {
invalidCredentials: "Invalid username or password",
connectionError: "Connection error",
},
analytics: {
consentTitle: "Help improve SnapOtter",
consentDescription:
"Anonymous usage stats help us fix bugs and build the tools you actually need. Your files stay on your network.",
consentChangeable: "You can turn this off anytime in Settings.",
acceptButton: "Sure, sounds good",
declineButton: "Not right now",
settingsTitle: "Product Analytics",
settingsDescription: "Share anonymous usage data to help improve SnapOtter.",
settingsPrivacy: "Your files never leave your network.",
settingsDisabledByAdmin: "Product analytics has been disabled by the server administrator.",
learnMore: "Learn more",
},
sidebar: {
tools: "Tools",
grid: "Grid",
-25
View File
@@ -2681,7 +2681,6 @@ export const es: TranslationKeys = {
apiKeys: "Claves API",
aiFeatures: "Funciones de AI",
tools: "Herramientas",
productAnalytics: "Analítica del producto",
about: "Acerca de",
},
general: {
@@ -3019,16 +3018,6 @@ export const es: TranslationKeys = {
auditRetentionDaysDesc:
"Tiempo de conservación de entradas del registro de auditoría. 0 = conservar siempre. Predeterminado: siempre.",
},
analytics: {
heading: "Analítica del producto",
description: "Comparte datos de uso anónimos para ayudar a mejorar SnapOtter.",
privacyNote: "Tus archivos nunca salen de tu red.",
disabledByAdmin:
"La analítica del producto ha sido desactivada por el administrador del servidor.",
enabledLabel: "Analítica activada",
disabledLabel: "Analítica desactivada",
learnMore: "Más información",
},
aiFeatures: {
title: "Funciones de AI",
description: "Gestiona paquetes de modelos AI para procesamiento avanzado de archivos.",
@@ -3382,20 +3371,6 @@ export const es: TranslationKeys = {
invalidCredentials: "Nombre de usuario o contraseña inválidos",
connectionError: "Error de conexión",
},
analytics: {
consentTitle: "Ayuda a mejorar SnapOtter",
consentDescription:
"Las estadísticas de uso anónimas nos ayudan a corregir errores y crear las herramientas que realmente necesitas. Tus archivos se quedan en tu red.",
consentChangeable: "Puedes desactivar esto en cualquier momento en Configuración.",
acceptButton: "Claro, me parece bien",
declineButton: "Ahora no",
settingsTitle: "Analítica del producto",
settingsDescription: "Comparte datos de uso anónimos para ayudar a mejorar SnapOtter.",
settingsPrivacy: "Tus archivos nunca salen de tu red.",
settingsDisabledByAdmin:
"La analítica del producto ha sido desactivada por el administrador del servidor.",
learnMore: "Más información",
},
sidebar: {
tools: "Herramientas",
grid: "Cuadrícula",
-25
View File
@@ -2704,7 +2704,6 @@ export const fr: TranslationKeys = {
apiKeys: "Clés API",
aiFeatures: "Fonctionnalités AI",
tools: "Outils",
productAnalytics: "Analytique produit",
about: "À propos",
},
general: {
@@ -3042,15 +3041,6 @@ export const fr: TranslationKeys = {
auditRetentionDaysDesc:
"Durée de conservation des entrées du journal d'audit. 0 = conserver indéfiniment. Par défaut : indéfiniment.",
},
analytics: {
heading: "Analytique produit",
description: "Partagez des données d'utilisation anonymes pour aider à améliorer SnapOtter.",
privacyNote: "Vos fichiers ne quittent jamais votre réseau.",
disabledByAdmin: "L'analytique produit a été désactivée par l'administrateur du serveur.",
enabledLabel: "Analytique activée",
disabledLabel: "Analytique désactivée",
learnMore: "En savoir plus",
},
aiFeatures: {
title: "Fonctionnalités AI",
description: "Gérez les paquets de modèles AI pour le traitement avancé de fichiers.",
@@ -3404,21 +3394,6 @@ export const fr: TranslationKeys = {
invalidCredentials: "Nom d'utilisateur ou mot de passe invalide",
connectionError: "Erreur de connexion",
},
analytics: {
consentTitle: "Aidez à améliorer SnapOtter",
consentDescription:
"Les statistiques d'utilisation anonymes nous aident à corriger les bugs et à créer les outils dont vous avez vraiment besoin. Vos fichiers restent sur votre réseau.",
consentChangeable: "Vous pouvez désactiver cela à tout moment dans les Paramètres.",
acceptButton: "Bien sûr, ça me va",
declineButton: "Pas maintenant",
settingsTitle: "Analytique produit",
settingsDescription:
"Partagez des données d'utilisation anonymes pour aider à améliorer SnapOtter.",
settingsPrivacy: "Vos fichiers ne quittent jamais votre réseau.",
settingsDisabledByAdmin:
"L'analytique produit a été désactivée par l'administrateur du serveur.",
learnMore: "En savoir plus",
},
sidebar: {
tools: "Outils",
grid: "Grille",
-23
View File
@@ -2676,7 +2676,6 @@ export const hi: TranslationKeys = {
apiKeys: "API कुंजियां",
aiFeatures: "AI फीचर्स",
tools: "टूल्स",
productAnalytics: "प्रोडक्ट एनालिटिक्स",
about: "जानकारी",
},
general: {
@@ -2997,15 +2996,6 @@ export const hi: TranslationKeys = {
auditRetentionDays: "ऑडिट लॉग अवधारण (दिन)",
auditRetentionDaysDesc: "ऑडिट लॉग प्रविष्टियां कितने समय तक रखें। 0 = हमेशा रखें। डिफ़ॉल्ट: हमेशा।",
},
analytics: {
heading: "प्रोडक्ट एनालिटिक्स",
description: "SnapOtter को बेहतर बनाने में मदद के लिए गुमनाम उपयोग डेटा शेयर करें।",
privacyNote: "आपकी फ़ाइलें कभी आपके नेटवर्क से बाहर नहीं जातीं।",
disabledByAdmin: "सर्वर एडमिनिस्ट्रेटर ने प्रोडक्ट एनालिटिक्स अक्षम कर दिया है।",
enabledLabel: "एनालिटिक्स सक्रिय",
disabledLabel: "एनालिटिक्स निष्क्रिय",
learnMore: "और जानें",
},
aiFeatures: {
title: "AI सुविधाएं",
description: "उन्नत फ़ाइल प्रोसेसिंग के लिए AI मॉडल बंडल प्रबंधित करें।",
@@ -3353,19 +3343,6 @@ export const hi: TranslationKeys = {
invalidCredentials: "गलत यूज़रनेम या पासवर्ड",
connectionError: "कनेक्शन त्रुटि",
},
analytics: {
consentTitle: "SnapOtter को बेहतर बनाने में मदद करें",
consentDescription:
"गुमनाम उपयोग आंकड़े हमें बग ठीक करने और आपके काम के टूल्स बनाने में मदद करते हैं। आपकी फ़ाइलें आपके नेटवर्क पर ही रहती हैं।",
consentChangeable: "आप इसे कभी भी सेटिंग्स से बंद कर सकते हैं।",
acceptButton: "ज़रूर, ठीक लगता है",
declineButton: "अभी नहीं",
settingsTitle: "प्रोडक्ट एनालिटिक्स",
settingsDescription: "SnapOtter को बेहतर बनाने में मदद के लिए गुमनाम उपयोग डेटा शेयर करें।",
settingsPrivacy: "आपकी फ़ाइलें कभी आपके नेटवर्क से बाहर नहीं जातीं।",
settingsDisabledByAdmin: "सर्वर एडमिनिस्ट्रेटर ने प्रोडक्ट एनालिटिक्स अक्षम कर दिया है।",
learnMore: "और जानें",
},
sidebar: {
tools: "टूल्स",
grid: "ग्रिड",
-23
View File
@@ -2690,7 +2690,6 @@ export const id: TranslationKeys = {
apiKeys: "Kunci API",
aiFeatures: "Fitur AI",
tools: "Alat",
productAnalytics: "Analitik Produk",
about: "Tentang",
},
general: {
@@ -3021,15 +3020,6 @@ export const id: TranslationKeys = {
auditRetentionDaysDesc:
"Berapa lama menyimpan entri log audit. 0 = simpan selamanya. Default: selamanya.",
},
analytics: {
heading: "Analitik Produk",
description: "Bagikan data penggunaan anonim untuk membantu meningkatkan SnapOtter.",
privacyNote: "File Anda tidak pernah meninggalkan jaringan Anda.",
disabledByAdmin: "Analitik produk telah dinonaktifkan oleh administrator server.",
enabledLabel: "Analitik aktif",
disabledLabel: "Analitik nonaktif",
learnMore: "Pelajari lebih lanjut",
},
aiFeatures: {
title: "Fitur AI",
description: "Kelola bundel model AI untuk pemrosesan file tingkat lanjut.",
@@ -3381,19 +3371,6 @@ export const id: TranslationKeys = {
invalidCredentials: "Nama pengguna atau kata sandi salah",
connectionError: "Kesalahan koneksi",
},
analytics: {
consentTitle: "Bantu tingkatkan SnapOtter",
consentDescription:
"Statistik penggunaan anonim membantu kami memperbaiki bug dan membangun alat yang benar-benar Anda butuhkan. File Anda tetap di jaringan Anda.",
consentChangeable: "Anda dapat menonaktifkan ini kapan saja di Pengaturan.",
acceptButton: "Tentu, kedengarannya bagus",
declineButton: "Nanti saja",
settingsTitle: "Analitik Produk",
settingsDescription: "Bagikan data penggunaan anonim untuk membantu meningkatkan SnapOtter.",
settingsPrivacy: "File Anda tidak pernah meninggalkan jaringan Anda.",
settingsDisabledByAdmin: "Analitik produk telah dinonaktifkan oleh administrator server.",
learnMore: "Pelajari lebih lanjut",
},
sidebar: {
tools: "Alat",
grid: "Kisi",
-25
View File
@@ -2695,7 +2695,6 @@ export const it: TranslationKeys = {
apiKeys: "Chiavi API",
aiFeatures: "Funzionalità AI",
tools: "Strumenti",
productAnalytics: "Analisi del prodotto",
about: "Informazioni",
},
general: {
@@ -3032,15 +3031,6 @@ export const it: TranslationKeys = {
auditRetentionDaysDesc:
"Per quanto tempo conservare le voci del log di audit. 0 = conserva per sempre. Predefinito: per sempre.",
},
analytics: {
heading: "Analisi del prodotto",
description: "Condividi dati di utilizzo anonimi per contribuire a migliorare SnapOtter.",
privacyNote: "I tuoi file non lasciano mai la tua rete.",
disabledByAdmin: "L'analisi del prodotto è stata disattivata dall'amministratore del server.",
enabledLabel: "Analisi attivata",
disabledLabel: "Analisi disattivata",
learnMore: "Scopri di più",
},
aiFeatures: {
title: "Funzionalità IA",
description: "Gestisci pacchetti di modelli di IA per l'elaborazione avanzata dei file.",
@@ -3393,21 +3383,6 @@ export const it: TranslationKeys = {
invalidCredentials: "Nome utente o password non validi",
connectionError: "Errore di connessione",
},
analytics: {
consentTitle: "Aiuta a migliorare SnapOtter",
consentDescription:
"Le statistiche d'uso anonime ci aiutano a correggere bug e creare gli strumenti di cui hai davvero bisogno. I tuoi file restano sulla tua rete.",
consentChangeable: "Puoi disattivare questa opzione in qualsiasi momento nelle Impostazioni.",
acceptButton: "Certo, va bene",
declineButton: "Non ora",
settingsTitle: "Analisi del prodotto",
settingsDescription:
"Condividi dati di utilizzo anonimi per contribuire a migliorare SnapOtter.",
settingsPrivacy: "I tuoi file non lasciano mai la tua rete.",
settingsDisabledByAdmin:
"L'analisi del prodotto è stata disattivata dall'amministratore del server.",
learnMore: "Scopri di più",
},
sidebar: {
tools: "Strumenti",
grid: "Griglia",
-23
View File
@@ -2648,7 +2648,6 @@ export const ja: TranslationKeys = {
apiKeys: "APIキー",
aiFeatures: "AI機能",
tools: "ツール",
productAnalytics: "プロダクト分析",
about: "SnapOtterについて",
},
general: {
@@ -2973,15 +2972,6 @@ export const ja: TranslationKeys = {
auditRetentionDays: "監査ログの保持期間(日)",
auditRetentionDaysDesc: "監査ログエントリの保持期間。0 = 永久保持。デフォルト: 永久。",
},
analytics: {
heading: "プロダクト分析",
description: "匿名の使用データを共有してSnapOtterの改善にご協力ください。",
privacyNote: "ファイルがネットワーク外に出ることはありません。",
disabledByAdmin: "プロダクト分析はサーバー管理者によって無効化されています。",
enabledLabel: "分析が有効",
disabledLabel: "分析が無効",
learnMore: "詳しく見る",
},
aiFeatures: {
title: "AI 機能",
description: "高度なファイル処理のためのAIモデルバンドルを管理します。",
@@ -3333,19 +3323,6 @@ export const ja: TranslationKeys = {
invalidCredentials: "ユーザー名またはパスワードが無効です",
connectionError: "接続エラー",
},
analytics: {
consentTitle: "SnapOtterの改善にご協力ください",
consentDescription:
"匿名の使用データはバグ修正や本当に必要なツールの開発に役立ちます。ファイルがネットワーク外に出ることはありません。",
consentChangeable: "設定からいつでもオフにできます。",
acceptButton: "はい、協力します",
declineButton: "今はしない",
settingsTitle: "プロダクト分析",
settingsDescription: "匿名の使用データを共有してSnapOtterの改善にご協力ください。",
settingsPrivacy: "ファイルがネットワーク外に出ることはありません。",
settingsDisabledByAdmin: "プロダクト分析はサーバー管理者によって無効化されています。",
learnMore: "詳しく見る",
},
sidebar: {
tools: "ツール",
grid: "グリッド",
-23
View File
@@ -2632,7 +2632,6 @@ export const ko: TranslationKeys = {
apiKeys: "API 키",
aiFeatures: "AI 기능",
tools: "도구",
productAnalytics: "제품 분석",
about: "정보",
},
general: {
@@ -2958,15 +2957,6 @@ export const ko: TranslationKeys = {
auditRetentionDays: "감사 로그 보관 기간(일)",
auditRetentionDaysDesc: "감사 로그 항목 보관 기간입니다. 0 = 영구 보관. 기본값: 영구 보관.",
},
analytics: {
heading: "제품 분석",
description: "익명 사용 데이터를 공유하여 SnapOtter 개선에 도움을 주세요.",
privacyNote: "파일은 절대 네트워크 밖으로 나가지 않습니다.",
disabledByAdmin: "서버 관리자가 제품 분석을 비활성화했습니다.",
enabledLabel: "분석 활성화됨",
disabledLabel: "분석 비활성화됨",
learnMore: "자세히 알아보기",
},
aiFeatures: {
title: "AI 기능",
description: "고급 파일 처리를 위한 AI 모델 번들을 관리합니다.",
@@ -3315,19 +3305,6 @@ export const ko: TranslationKeys = {
invalidCredentials: "사용자명 또는 비밀번호가 올바르지 않습니다",
connectionError: "연결 오류",
},
analytics: {
consentTitle: "SnapOtter 개선에 도움을 주세요",
consentDescription:
"익명 사용 데이터는 버그 수정과 정말 필요한 도구 개발에 도움이 됩니다. 파일은 항상 네트워크 안에 머물러요.",
consentChangeable: "설정에서 언제든 끌 수 있어요.",
acceptButton: "네, 좋아요",
declineButton: "지금은 괜찮아요",
settingsTitle: "제품 분석",
settingsDescription: "익명 사용 데이터를 공유하여 SnapOtter 개선에 도움을 주세요.",
settingsPrivacy: "파일은 절대 네트워크 밖으로 나가지 않습니다.",
settingsDisabledByAdmin: "서버 관리자가 제품 분석을 비활성화했습니다.",
learnMore: "자세히 알아보기",
},
sidebar: {
tools: "도구",
grid: "그리드",
-23
View File
@@ -2696,7 +2696,6 @@ export const nl: TranslationKeys = {
apiKeys: "API-sleutels",
aiFeatures: "AI-functies",
tools: "Gereedschap",
productAnalytics: "Productanalyse",
about: "Over",
},
general: {
@@ -3028,15 +3027,6 @@ export const nl: TranslationKeys = {
auditRetentionDaysDesc:
"Hoe lang auditlogvermeldingen bewaard blijven. 0 = voor altijd bewaren. Standaard: voor altijd.",
},
analytics: {
heading: "Productanalyse",
description: "Deel anonieme gebruiksgegevens om SnapOtter te verbeteren.",
privacyNote: "Je bestanden verlaten nooit je netwerk.",
disabledByAdmin: "Productanalyse is uitgeschakeld door de serverbeheerder.",
enabledLabel: "Analyse ingeschakeld",
disabledLabel: "Analyse uitgeschakeld",
learnMore: "Meer informatie",
},
aiFeatures: {
title: "AI-functies",
description: "Beheer AI-modelbundels voor geavanceerde bestandsverwerking.",
@@ -3389,19 +3379,6 @@ export const nl: TranslationKeys = {
invalidCredentials: "Ongeldige gebruikersnaam of wachtwoord",
connectionError: "Verbindingsfout",
},
analytics: {
consentTitle: "Help SnapOtter verbeteren",
consentDescription:
"Anonieme gebruiksstatistieken helpen ons bugs te fixen en tools te bouwen die je echt nodig hebt. Je bestanden blijven op je netwerk.",
consentChangeable: "Je kunt dit altijd uitschakelen bij Instellingen.",
acceptButton: "Ja, klinkt goed",
declineButton: "Nu even niet",
settingsTitle: "Productanalyse",
settingsDescription: "Deel anonieme gebruiksgegevens om SnapOtter te verbeteren.",
settingsPrivacy: "Je bestanden verlaten nooit je netwerk.",
settingsDisabledByAdmin: "Productanalyse is uitgeschakeld door de serverbeheerder.",
learnMore: "Meer informatie",
},
sidebar: {
tools: "Tools",
grid: "Raster",
-24
View File
@@ -2695,7 +2695,6 @@ export const pl: TranslationKeys = {
apiKeys: "Klucze API",
aiFeatures: "Funkcje AI",
tools: "Narzędzia",
productAnalytics: "Analityka",
about: "Informacje",
},
general: {
@@ -3034,15 +3033,6 @@ export const pl: TranslationKeys = {
auditRetentionDaysDesc:
"Jak długo przechowywać wpisy dziennika audytu. 0 = zachowaj na zawsze. Domyślnie: na zawsze.",
},
analytics: {
heading: "Analityka",
description: "Udostępnianie anonimowych danych o użytkowaniu w celu ulepszenia SnapOtter.",
privacyNote: "Państwa pliki nigdy nie opuszczają komputera.",
disabledByAdmin: "Analityka została wyłączona przez administratora serwera.",
enabledLabel: "Analityka włączona",
disabledLabel: "Analityka wyłączona",
learnMore: "Dowiedz się więcej",
},
aiFeatures: {
title: "Funkcje AI",
description: "Zarządzanie pakietami modeli AI do zaawansowanego przetwarzania plików.",
@@ -3396,20 +3386,6 @@ export const pl: TranslationKeys = {
invalidCredentials: "Nieprawidłowa nazwa użytkownika lub hasło",
connectionError: "Błąd połączenia",
},
analytics: {
consentTitle: "Pomóż ulepszyć SnapOtter",
consentDescription:
"Anonimowe statystyki użytkowania pomagają nam naprawiać błędy i tworzyć narzędzia, których naprawdę potrzebujesz. Twoje pliki pozostają na Twoim komputerze.",
consentChangeable: "Możesz to wyłączyć w każdej chwili w Ustawieniach.",
acceptButton: "Jasne, brzmi dobrze",
declineButton: "Nie teraz",
settingsTitle: "Analityka",
settingsDescription:
"Udostępnianie anonimowych danych o użytkowaniu w celu ulepszenia SnapOtter.",
settingsPrivacy: "Państwa pliki nigdy nie opuszczają komputera.",
settingsDisabledByAdmin: "Analityka została wyłączona przez administratora serwera.",
learnMore: "Dowiedz się więcej",
},
sidebar: {
tools: "Narzędzia",
grid: "Siatka",
-24
View File
@@ -2692,7 +2692,6 @@ export const ptBR: TranslationKeys = {
apiKeys: "Chaves API",
aiFeatures: "Recursos de AI",
tools: "Ferramentas",
productAnalytics: "Analítica do produto",
about: "Sobre",
},
general: {
@@ -3027,15 +3026,6 @@ export const ptBR: TranslationKeys = {
auditRetentionDaysDesc:
"Por quanto tempo manter registros de auditoria. 0 = manter para sempre. Padrão: para sempre.",
},
analytics: {
heading: "Analítica do produto",
description: "Compartilhe dados de uso anônimos para ajudar a melhorar o SnapOtter.",
privacyNote: "Seus arquivos nunca saem do seu computador.",
disabledByAdmin: "A analítica do produto foi desativada pelo administrador do servidor.",
enabledLabel: "Analítica ativada",
disabledLabel: "Analítica desativada",
learnMore: "Saiba mais",
},
aiFeatures: {
title: "Recursos de AI",
description: "Gerencie pacotes de modelos de IA para processamento avançado de arquivos.",
@@ -3388,20 +3378,6 @@ export const ptBR: TranslationKeys = {
invalidCredentials: "Nome de usuário ou senha inválidos",
connectionError: "Erro de conexão",
},
analytics: {
consentTitle: "Ajude a melhorar o SnapOtter",
consentDescription:
"Estatísticas de uso anônimas nos ajudam a corrigir bugs e criar as ferramentas que você realmente precisa. Seus arquivos ficam no seu computador.",
consentChangeable: "Você pode desativar isso a qualquer momento nas Configurações.",
acceptButton: "Claro, parece bom",
declineButton: "Agora não",
settingsTitle: "Analítica do produto",
settingsDescription: "Compartilhe dados de uso anônimos para ajudar a melhorar o SnapOtter.",
settingsPrivacy: "Seus arquivos nunca saem do seu computador.",
settingsDisabledByAdmin:
"A analítica do produto foi desativada pelo administrador do servidor.",
learnMore: "Saiba mais",
},
sidebar: {
tools: "Ferramentas",
grid: "Grade",
-23
View File
@@ -2691,7 +2691,6 @@ export const ru: TranslationKeys = {
apiKeys: "API-ключи",
aiFeatures: "AI-функции",
tools: "Инструменты",
productAnalytics: "Аналитика",
about: "О программе",
},
general: {
@@ -3024,15 +3023,6 @@ export const ru: TranslationKeys = {
auditRetentionDaysDesc:
"Как долго хранить записи журнала аудита. 0 = хранить бессрочно. По умолчанию: бессрочно.",
},
analytics: {
heading: "Аналитика",
description: "Отправка анонимных данных об использовании для улучшения SnapOtter.",
privacyNote: "Ваши файлы никогда не покидают Ваш компьютер.",
disabledByAdmin: "Аналитика отключена администратором сервера.",
enabledLabel: "Аналитика включена",
disabledLabel: "Аналитика отключена",
learnMore: "Подробнее",
},
aiFeatures: {
title: "AI-функции",
description: "Управление пакетами AI-моделей для расширенной обработки файлов.",
@@ -3384,19 +3374,6 @@ export const ru: TranslationKeys = {
invalidCredentials: "Неверное имя пользователя или пароль",
connectionError: "Ошибка подключения",
},
analytics: {
consentTitle: "Помогите улучшить SnapOtter",
consentDescription:
"Анонимная статистика использования помогает нам исправлять ошибки и создавать нужные Вам инструменты. Ваши файлы остаются на Вашем компьютере.",
consentChangeable: "Вы можете отключить это в любое время в Настройках.",
acceptButton: "Конечно, звучит хорошо",
declineButton: "Не сейчас",
settingsTitle: "Аналитика",
settingsDescription: "Отправка анонимных данных об использовании для улучшения SnapOtter.",
settingsPrivacy: "Ваши файлы никогда не покидают Ваш компьютер.",
settingsDisabledByAdmin: "Аналитика отключена администратором сервера.",
learnMore: "Подробнее",
},
sidebar: {
tools: "Инструменты",
grid: "Сетка",
-23
View File
@@ -2688,7 +2688,6 @@ export const sv: TranslationKeys = {
apiKeys: "API-nycklar",
aiFeatures: "AI-funktioner",
tools: "Verktyg",
productAnalytics: "Produktanalys",
about: "Om",
},
general: {
@@ -3018,15 +3017,6 @@ export const sv: TranslationKeys = {
auditRetentionDaysDesc:
"Hur länge granskningsloggposter behålls. 0 = behåll för alltid. Standard: för alltid.",
},
analytics: {
heading: "Produktanalys",
description: "Dela anonym användningsdata för att förbättra SnapOtter.",
privacyNote: "Dina filer lämnar aldrig din dator.",
disabledByAdmin: "Produktanalys har inaktiverats av serveradministratören.",
enabledLabel: "Analys aktiverad",
disabledLabel: "Analys inaktiverad",
learnMore: "Läs mer",
},
aiFeatures: {
title: "AI-funktioner",
description: "Hantera AI-modellpaket för avancerad filbehandling.",
@@ -3376,19 +3366,6 @@ export const sv: TranslationKeys = {
invalidCredentials: "Ogiltigt användarnamn eller lösenord",
connectionError: "Anslutningsfel",
},
analytics: {
consentTitle: "Hjälp till att förbättra SnapOtter",
consentDescription:
"Anonym användningsstatistik hjälper oss fixa buggar och bygga verktygen du faktiskt behöver. Dina filer stannar på din dator.",
consentChangeable: "Du kan stänga av detta när som helst i Inställningar.",
acceptButton: "Visst, låter bra",
declineButton: "Inte just nu",
settingsTitle: "Produktanalys",
settingsDescription: "Dela anonym användningsdata för att förbättra SnapOtter.",
settingsPrivacy: "Dina filer lämnar aldrig din dator.",
settingsDisabledByAdmin: "Produktanalys har inaktiverats av serveradministratören.",
learnMore: "Läs mer",
},
sidebar: {
tools: "Verktyg",
grid: "Rutnät",
-23
View File
@@ -2664,7 +2664,6 @@ export const th: TranslationKeys = {
apiKeys: "คีย์ API",
aiFeatures: "ฟีเจอร์ AI",
tools: "เครื่องมือ",
productAnalytics: "การวิเคราะห์ผลิตภัณฑ์",
about: "เกี่ยวกับ",
},
general: {
@@ -2985,15 +2984,6 @@ export const th: TranslationKeys = {
auditRetentionDays: "ระยะเวลาเก็บบันทึกตรวจสอบ (วัน)",
auditRetentionDaysDesc: "ระยะเวลาเก็บรักษารายการบันทึกตรวจสอบ 0 = เก็บตลอด ค่าเริ่มต้น: เก็บตลอด",
},
analytics: {
heading: "การวิเคราะห์ผลิตภัณฑ์",
description: "แบ่งปันข้อมูลการใช้งานแบบไม่ระบุตัวตนเพื่อช่วยปรับปรุง SnapOtter",
privacyNote: "ไฟล์ของคุณไม่ออกจากเครื่องเด็ดขาด",
disabledByAdmin: "ผู้ดูแลเซิร์ฟเวอร์ปิดการวิเคราะห์ผลิตภัณฑ์แล้ว",
enabledLabel: "เปิดการวิเคราะห์",
disabledLabel: "ปิดการวิเคราะห์",
learnMore: "เรียนรู้เพิ่มเติม",
},
aiFeatures: {
title: "ฟีเจอร์ AI",
description: "จัดการชุดโมเดล AI สำหรับการประมวลผลไฟล์ขั้นสูง",
@@ -3338,19 +3328,6 @@ export const th: TranslationKeys = {
invalidCredentials: "ชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง",
connectionError: "ข้อผิดพลาดในการเชื่อมต่อ",
},
analytics: {
consentTitle: "ช่วยปรับปรุง SnapOtter",
consentDescription:
"สถิติการใช้งานแบบไม่ระบุตัวตนช่วยให้เราแก้ไขข้อผิดพลาดและสร้างเครื่องมือที่คุณต้องการจริงๆ ไฟล์ของคุณอยู่บนเครื่องของคุณ",
consentChangeable: "คุณสามารถปิดได้ทุกเมื่อในการตั้งค่า",
acceptButton: "ได้เลย ฟังดูดี",
declineButton: "ไว้ทีหลัง",
settingsTitle: "การวิเคราะห์ผลิตภัณฑ์",
settingsDescription: "แบ่งปันข้อมูลการใช้งานแบบไม่ระบุตัวตนเพื่อช่วยปรับปรุง SnapOtter",
settingsPrivacy: "ไฟล์ของคุณไม่ออกจากเครื่องเด็ดขาด",
settingsDisabledByAdmin: "ผู้ดูแลเซิร์ฟเวอร์ปิดการวิเคราะห์ผลิตภัณฑ์แล้ว",
learnMore: "เรียนรู้เพิ่มเติม",
},
sidebar: {
tools: "เครื่องมือ",
grid: "กริด",
-25
View File
@@ -2694,7 +2694,6 @@ export const tr: TranslationKeys = {
apiKeys: "API Anahtarları",
aiFeatures: "AI Özellikleri",
tools: "Araçlar",
productAnalytics: "Ürün Analitiği",
about: "Hakkında",
},
general: {
@@ -3028,16 +3027,6 @@ export const tr: TranslationKeys = {
auditRetentionDaysDesc:
"Denetim günlüğü kayıtlarının saklanma süresi. 0 = süresiz. Varsayılan: süresiz.",
},
analytics: {
heading: "Ürün Analitiği",
description:
"SnapOtter'ı geliştirmeye yardımcı olmak için anonim kullanım verilerini paylaşın.",
privacyNote: "Dosyalarınız asla ağınızdan ayrılmaz.",
disabledByAdmin: "Ürün analitiği sunucu yöneticisi tarafından devre dışı bırakıldı.",
enabledLabel: "Analitik etkin",
disabledLabel: "Analitik devre dışı",
learnMore: "Daha fazla bilgi",
},
aiFeatures: {
title: "AI Özellikleri",
description: "Gelişmiş dosya işleme için AI model paketlerini yönetin.",
@@ -3390,20 +3379,6 @@ export const tr: TranslationKeys = {
invalidCredentials: "Geçersiz kullanıcı adı veya parola",
connectionError: "Bağlantı hatası",
},
analytics: {
consentTitle: "SnapOtter'ı geliştirmeye yardım edin",
consentDescription:
"Anonim kullanım istatistikleri hataları düzeltmemize ve gerçekten ihtiyaç duyduğunuz araçları oluşturmamıza yardımcı olur. Dosyalarınız ağınızda kalır.",
consentChangeable: "Bunu istediğiniz zaman Ayarlar'dan kapatabilirsiniz.",
acceptButton: "Elbette, kulağa iyi geliyor",
declineButton: "Şimdi değil",
settingsTitle: "Ürün Analitiği",
settingsDescription:
"SnapOtter'ı geliştirmeye yardımcı olmak için anonim kullanım verilerini paylaşın.",
settingsPrivacy: "Dosyalarınız asla ağınızdan ayrılmaz.",
settingsDisabledByAdmin: "Ürün analitiği sunucu yöneticisi tarafından devre dışı bırakıldı.",
learnMore: "Daha fazla bilgi",
},
sidebar: {
tools: "Araçlar",
grid: "Izgara",
-23
View File
@@ -2694,7 +2694,6 @@ export const uk: TranslationKeys = {
apiKeys: "API-ключі",
aiFeatures: "AI-функції",
tools: "Інструменти",
productAnalytics: "Аналітика",
about: "Про програму",
},
general: {
@@ -3025,15 +3024,6 @@ export const uk: TranslationKeys = {
auditRetentionDaysDesc:
"Як довго зберігати записи журналу аудиту. 0 = назавжди. Типово: назавжди.",
},
analytics: {
heading: "Аналітика",
description: "Надсилання анонімних даних про використання для поліпшення SnapOtter.",
privacyNote: "Ваші файли ніколи не залишають Вашу мережу.",
disabledByAdmin: "Аналітику вимкнено адміністратором сервера.",
enabledLabel: "Аналітику увімкнено",
disabledLabel: "Аналітику вимкнено",
learnMore: "Дізнатися більше",
},
aiFeatures: {
title: "AI-функції",
description: "Керування пакетами AI-моделей для розширеної обробки файлів.",
@@ -3386,19 +3376,6 @@ export const uk: TranslationKeys = {
invalidCredentials: "Невірне ім'я користувача або пароль",
connectionError: "Помилка з'єднання",
},
analytics: {
consentTitle: "Допоможіть поліпшити SnapOtter",
consentDescription:
"Анонімна статистика використання допомагає нам виправляти помилки та створювати потрібні Вам інструменти. Ваші файли залишаються у Вашій мережі.",
consentChangeable: "Ви можете вимкнути це будь-коли у Налаштуваннях.",
acceptButton: "Звісно, добре",
declineButton: "Не зараз",
settingsTitle: "Аналітика",
settingsDescription: "Надсилання анонімних даних про використання для поліпшення SnapOtter.",
settingsPrivacy: "Ваші файли ніколи не залишають Вашу мережу.",
settingsDisabledByAdmin: "Аналітику вимкнено адміністратором сервера.",
learnMore: "Дізнатися більше",
},
sidebar: {
tools: "Інструменти",
grid: "Сітка",
-23
View File
@@ -2690,7 +2690,6 @@ export const vi: TranslationKeys = {
apiKeys: "Khóa API",
aiFeatures: "Tính năng AI",
tools: "Công cụ",
productAnalytics: "Phân tích sản phẩm",
about: "Giới thiệu",
},
general: {
@@ -3019,15 +3018,6 @@ export const vi: TranslationKeys = {
auditRetentionDaysDesc:
"Thời gian giữ các mục nhật ký kiểm tra. 0 = giữ mãi. Mặc định: vĩnh viễn.",
},
analytics: {
heading: "Phân tích sản phẩm",
description: "Chia sẻ dữ liệu sử dụng ẩn danh để giúp cải thiện SnapOtter.",
privacyNote: "Tệp của bạn không bao giờ rời khỏi mạng của bạn.",
disabledByAdmin: "Phân tích sản phẩm đã bị vô hiệu hóa bởi quản trị viên máy chủ.",
enabledLabel: "Đã bật phân tích",
disabledLabel: "Đã tắt phân tích",
learnMore: "Tìm hiểu thêm",
},
aiFeatures: {
title: "Tính năng AI",
description: "Quản lý các gói mô hình AI cho xử lý tệp nâng cao.",
@@ -3377,19 +3367,6 @@ export const vi: TranslationKeys = {
invalidCredentials: "Tên đăng nhập hoặc mật khẩu không đúng",
connectionError: "Lỗi kết nối",
},
analytics: {
consentTitle: "Giúp cải thiện SnapOtter",
consentDescription:
"Thống kê sử dụng ẩn danh giúp chúng tôi sửa lỗi và xây dựng các công cụ bạn thực sự cần. Tệp của bạn luôn ở trên mạng của bạn.",
consentChangeable: "Bạn có thể tắt bất cứ lúc nào trong Cài đặt.",
acceptButton: "Được thôi, nghe hay đấy",
declineButton: "Để sau",
settingsTitle: "Phân tích sản phẩm",
settingsDescription: "Chia sẻ dữ liệu sử dụng ẩn danh để giúp cải thiện SnapOtter.",
settingsPrivacy: "Tệp của bạn không bao giờ rời khỏi mạng của bạn.",
settingsDisabledByAdmin: "Phân tích sản phẩm đã bị vô hiệu hóa bởi quản trị viên máy chủ.",
learnMore: "Tìm hiểu thêm",
},
sidebar: {
tools: "Công cụ",
grid: "Lưới",
-23
View File
@@ -2617,7 +2617,6 @@ export const zhCN: TranslationKeys = {
apiKeys: "API 密钥",
aiFeatures: "AI 功能",
tools: "工具",
productAnalytics: "产品分析",
about: "关于",
},
general: {
@@ -2937,15 +2936,6 @@ export const zhCN: TranslationKeys = {
auditRetentionDays: "审计日志保留时间(天)",
auditRetentionDaysDesc: "审计日志条目的保留时长。0 = 永久保留。默认:永久。",
},
analytics: {
heading: "产品分析",
description: "分享匿名使用数据,帮助改进 SnapOtter。",
privacyNote: "您的文件永远不会离开您的网络。",
disabledByAdmin: "产品分析已被服务器管理员禁用。",
enabledLabel: "分析已启用",
disabledLabel: "分析已禁用",
learnMore: "了解更多",
},
aiFeatures: {
title: "AI 功能",
description: "管理用于高级文件处理的 AI 模型包。",
@@ -3287,19 +3277,6 @@ export const zhCN: TranslationKeys = {
invalidCredentials: "用户名或密码错误",
connectionError: "连接错误",
},
analytics: {
consentTitle: "帮助改进 SnapOtter",
consentDescription:
"匿名使用统计帮助我们修复问题并构建您真正需要的工具。您的文件始终留在您的网络中。",
consentChangeable: "您可以随时在设置中关闭。",
acceptButton: "好的,没问题",
declineButton: "暂时不了",
settingsTitle: "产品分析",
settingsDescription: "分享匿名使用数据,帮助改进 SnapOtter。",
settingsPrivacy: "您的文件永远不会离开您的网络。",
settingsDisabledByAdmin: "产品分析已被服务器管理员禁用。",
learnMore: "了解更多",
},
sidebar: {
tools: "工具",
grid: "网格",
-23
View File
@@ -2615,7 +2615,6 @@ export const zhTW: TranslationKeys = {
apiKeys: "API金鑰",
aiFeatures: "AI功能",
tools: "工具",
productAnalytics: "產品分析",
about: "關於",
},
general: {
@@ -2935,15 +2934,6 @@ export const zhTW: TranslationKeys = {
auditRetentionDays: "稽核記錄保留時間(天)",
auditRetentionDaysDesc: "稽核記錄項目的保留時間。0 = 永久保留。預設:永久保留。",
},
analytics: {
heading: "產品分析",
description: "分享匿名使用資料以協助改進SnapOtter。",
privacyNote: "您的檔案永遠不會離開您的網路。",
disabledByAdmin: "產品分析已被伺服器管理員停用。",
enabledLabel: "分析已啟用",
disabledLabel: "分析已停用",
learnMore: "了解更多",
},
aiFeatures: {
title: "AI 功能",
description: "管理用於進階檔案處理的AI模型套件。",
@@ -3287,19 +3277,6 @@ export const zhTW: TranslationKeys = {
invalidCredentials: "使用者名稱或密碼無效",
connectionError: "連線錯誤",
},
analytics: {
consentTitle: "協助改進SnapOtter",
consentDescription:
"匿名使用資料協助我們修復問題並開發你真正需要的工具。你的檔案始終留在你的網路中。",
consentChangeable: "你可以隨時在設定中關閉。",
acceptButton: "好的,沒問題",
declineButton: "暫時不用",
settingsTitle: "產品分析",
settingsDescription: "分享匿名使用資料以協助改進SnapOtter。",
settingsPrivacy: "您的檔案永遠不會離開您的網路。",
settingsDisabledByAdmin: "產品分析已被伺服器管理員停用。",
learnMore: "了解更多",
},
sidebar: {
tools: "工具",
grid: "格線",
+1 -1
View File
@@ -1,4 +1,4 @@
export * from "./analytics/consent.js";
export * from "./analytics/baked.js";
export * from "./analytics/events.js";
export * from "./analytics/types.js";
export * from "./audit-events.js";