mirror of
https://github.com/snapotter-hq/SnapOtter.git
synced 2026-08-03 07:46:42 +02:00
feat(feedback): gate onboarding survey on first processing, add prompt lifecycle events (#615)
Defers the onboarding usage survey to the instance's first successful processing (the worker writes a one-time onboarding.firstProcessedAt marker and the overlay gates on it), so it reaches engaged users instead of first-landing visitors. Replaces the two questions telemetry already answers (modality preference from tool_used, install method from instance_started) with what it can't infer: prior tool, self-host motivation, and discovery source. Adds feedback_prompt_shown and feedback_prompt_dismissed on all five feedback surfaces (usage survey, per-job prompt, admin install card, global nav dialog, search-miss) so skip and completion rates are measurable, not just submissions. New survey strings translated into all 20 non-English locales.
This commit is contained in:
@@ -27,6 +27,11 @@ export const ANALYTICS_EVENTS = {
|
||||
PIPELINE_TEMPLATE_SELECTED: "pipeline_template_selected",
|
||||
AUTH_LOGIN: "auth_login",
|
||||
AUTH_LOGIN_FAILED: "auth_login_failed",
|
||||
// Feedback prompt lifecycle (client-side). Fired when any feedback surface is
|
||||
// shown to a user and when it is dismissed without submitting, so completion
|
||||
// and skip rates become measurable instead of counting only submissions.
|
||||
FEEDBACK_PROMPT_SHOWN: "feedback_prompt_shown",
|
||||
FEEDBACK_PROMPT_DISMISSED: "feedback_prompt_dismissed",
|
||||
} as const;
|
||||
|
||||
export type AnalyticsEvent = (typeof ANALYTICS_EVENTS)[keyof typeof ANALYTICS_EVENTS];
|
||||
|
||||
@@ -24,6 +24,14 @@ export const FEEDBACK_SURVEY_ID_VALUES = [
|
||||
] as const;
|
||||
export type FeedbackSurveyId = (typeof FEEDBACK_SURVEY_ID_VALUES)[number];
|
||||
|
||||
/**
|
||||
* Settings key marking the instance's first successful processing. The worker
|
||||
* writes it on the first completed job; the web app gates the onboarding survey
|
||||
* on it so the survey only reaches instances that have produced a real result,
|
||||
* not first-landing visitors. Shared so the worker and web can never drift.
|
||||
*/
|
||||
export const ONBOARDING_FIRST_PROCESSED_KEY = "onboarding.firstProcessedAt";
|
||||
|
||||
export const FEEDBACK_SENTIMENT_VALUES = [
|
||||
"great",
|
||||
"okay",
|
||||
@@ -62,6 +70,41 @@ export const FEEDBACK_USAGE_TYPE_VALUES = [
|
||||
] as const;
|
||||
export type FeedbackUsageType = (typeof FEEDBACK_USAGE_TYPE_VALUES)[number];
|
||||
|
||||
// The onboarding survey asks only what telemetry cannot infer. Modality
|
||||
// preference (tool_used by category) and install method (instance_started's
|
||||
// deploy_mode) are already captured by behavior, so the survey spends its
|
||||
// questions on identity, prior tool, motivation, and acquisition channel.
|
||||
|
||||
/** "What were you using before SnapOtter?" — competitor / replacement signal. */
|
||||
export const FEEDBACK_PRIOR_TOOL_VALUES = [
|
||||
"online_tools",
|
||||
"desktop_apps",
|
||||
"command_line",
|
||||
"self_hosted",
|
||||
"nothing",
|
||||
] as const;
|
||||
export type FeedbackPriorTool = (typeof FEEDBACK_PRIOR_TOOL_VALUES)[number];
|
||||
|
||||
/** "Why self-host it?" — positioning / motivation signal. */
|
||||
export const FEEDBACK_SELFHOST_MOTIVATION_VALUES = [
|
||||
"privacy_control",
|
||||
"upload_limits",
|
||||
"cost",
|
||||
"offline",
|
||||
"trying",
|
||||
] as const;
|
||||
export type FeedbackSelfHostMotivation = (typeof FEEDBACK_SELFHOST_MOTIVATION_VALUES)[number];
|
||||
|
||||
/** "How did you hear about us?" — acquisition channel, invisible to analytics. */
|
||||
export const FEEDBACK_DISCOVERY_SOURCE_VALUES = [
|
||||
"github",
|
||||
"reddit_hn",
|
||||
"search",
|
||||
"word_of_mouth",
|
||||
"other",
|
||||
] as const;
|
||||
export type FeedbackDiscoverySource = (typeof FEEDBACK_DISCOVERY_SOURCE_VALUES)[number];
|
||||
|
||||
export const FEEDBACK_IMPORTANT_AREA_VALUES = [
|
||||
"images",
|
||||
"pdf_docs",
|
||||
|
||||
@@ -145,11 +145,34 @@ export const ar: TranslationKeys = {
|
||||
batch_workflows: "سير العمل بالدفعات",
|
||||
ai_tools: "أدوات الذكاء الاصطناعي",
|
||||
},
|
||||
priorTools: {
|
||||
online_tools: "أدوات عبر الإنترنت",
|
||||
desktop_apps: "تطبيقات سطح المكتب (Photoshop، GIMP)",
|
||||
command_line: "سطر الأوامر (ffmpeg، ImageMagick)",
|
||||
self_hosted: "أداة أخرى ذاتية الاستضافة",
|
||||
nothing: "لا شيء، هذه تجربة جديدة",
|
||||
},
|
||||
selfHostMotivations: {
|
||||
privacy_control: "الخصوصية والتحكم في البيانات",
|
||||
upload_limits: "حدود الرفع والعلامات المائية",
|
||||
cost: "التكلفة",
|
||||
offline: "بلا اتصال أو شبكة معزولة",
|
||||
trying: "مجرد تجربة",
|
||||
},
|
||||
discoverySources: {
|
||||
github: "GitHub",
|
||||
reddit_hn: "Reddit أو Hacker News",
|
||||
search: "محرك بحث",
|
||||
word_of_mouth: "صديق أو زميل",
|
||||
other: "أخرى",
|
||||
},
|
||||
},
|
||||
onboarding: {
|
||||
usageSurveyTitle: "كيف تستخدم SnapOtter؟",
|
||||
usageSurveyToolsLabel: "ما الأهم بالنسبة لك؟",
|
||||
pickAnyHint: "(اختر ما تريد)",
|
||||
priorToolLabel: "ماذا كنت تستخدم من قبل؟",
|
||||
selfHostMotivationLabel: "لماذا الاستضافة الذاتية؟",
|
||||
discoverySourceLabel: "كيف سمعت عنا؟",
|
||||
optionalHint: "(اختياري)",
|
||||
continueLabel: "متابعة",
|
||||
},
|
||||
categories: {
|
||||
|
||||
@@ -149,11 +149,34 @@ export const de: TranslationKeys = {
|
||||
batch_workflows: "Stapel-Workflows",
|
||||
ai_tools: "AI-Tools",
|
||||
},
|
||||
priorTools: {
|
||||
online_tools: "Online-Tools",
|
||||
desktop_apps: "Desktop-Programme (Photoshop, GIMP)",
|
||||
command_line: "Kommandozeile (ffmpeg, ImageMagick)",
|
||||
self_hosted: "Ein anderes selbstgehostetes Tool",
|
||||
nothing: "Nichts, das ist neu für mich",
|
||||
},
|
||||
selfHostMotivations: {
|
||||
privacy_control: "Datenschutz und Datenkontrolle",
|
||||
upload_limits: "Upload-Limits und Wasserzeichen",
|
||||
cost: "Kosten",
|
||||
offline: "Offline oder abgeschottet",
|
||||
trying: "Ich probiere es nur aus",
|
||||
},
|
||||
discoverySources: {
|
||||
github: "GitHub",
|
||||
reddit_hn: "Reddit oder Hacker News",
|
||||
search: "Suchmaschine",
|
||||
word_of_mouth: "Freund oder Kollege",
|
||||
other: "Sonstiges",
|
||||
},
|
||||
},
|
||||
onboarding: {
|
||||
usageSurveyTitle: "Wie nutzt du SnapOtter?",
|
||||
usageSurveyToolsLabel: "Was ist dir am wichtigsten?",
|
||||
pickAnyHint: "(beliebig viele auswählen)",
|
||||
priorToolLabel: "Was hast du vorher verwendet?",
|
||||
selfHostMotivationLabel: "Warum selbst hosten?",
|
||||
discoverySourceLabel: "Wie hast du von uns erfahren?",
|
||||
optionalHint: "(optional)",
|
||||
continueLabel: "Weiter",
|
||||
},
|
||||
categories: {
|
||||
|
||||
@@ -143,11 +143,34 @@ export const en = {
|
||||
batch_workflows: "Batch workflows",
|
||||
ai_tools: "AI tools",
|
||||
},
|
||||
priorTools: {
|
||||
online_tools: "Online tools",
|
||||
desktop_apps: "Desktop apps (Photoshop, GIMP)",
|
||||
command_line: "Command line (ffmpeg, ImageMagick)",
|
||||
self_hosted: "Another self-hosted tool",
|
||||
nothing: "Nothing, this is new",
|
||||
},
|
||||
selfHostMotivations: {
|
||||
privacy_control: "Privacy and data control",
|
||||
upload_limits: "Upload limits and watermarks",
|
||||
cost: "Cost",
|
||||
offline: "Offline or air-gapped",
|
||||
trying: "Just trying it out",
|
||||
},
|
||||
discoverySources: {
|
||||
github: "GitHub",
|
||||
reddit_hn: "Reddit or Hacker News",
|
||||
search: "Search engine",
|
||||
word_of_mouth: "Friend or colleague",
|
||||
other: "Other",
|
||||
},
|
||||
},
|
||||
onboarding: {
|
||||
usageSurveyTitle: "How are you using SnapOtter?",
|
||||
usageSurveyToolsLabel: "What matters most to you?",
|
||||
pickAnyHint: "(pick any)",
|
||||
priorToolLabel: "What were you using before?",
|
||||
selfHostMotivationLabel: "Why self-host it?",
|
||||
discoverySourceLabel: "How did you hear about us?",
|
||||
optionalHint: "(optional)",
|
||||
continueLabel: "Continue",
|
||||
},
|
||||
categories: {
|
||||
|
||||
@@ -147,11 +147,34 @@ export const es: TranslationKeys = {
|
||||
batch_workflows: "Flujos por lotes",
|
||||
ai_tools: "Herramientas de IA",
|
||||
},
|
||||
priorTools: {
|
||||
online_tools: "Herramientas en línea",
|
||||
desktop_apps: "Programas de escritorio (Photoshop, GIMP)",
|
||||
command_line: "Línea de comandos (ffmpeg, ImageMagick)",
|
||||
self_hosted: "Otra herramienta autoalojada",
|
||||
nothing: "Nada, esto es nuevo para mí",
|
||||
},
|
||||
selfHostMotivations: {
|
||||
privacy_control: "Privacidad y control de datos",
|
||||
upload_limits: "Límites de subida y marcas de agua",
|
||||
cost: "Coste",
|
||||
offline: "Sin conexión o aislado",
|
||||
trying: "Solo lo estoy probando",
|
||||
},
|
||||
discoverySources: {
|
||||
github: "GitHub",
|
||||
reddit_hn: "Reddit o Hacker News",
|
||||
search: "Motor de búsqueda",
|
||||
word_of_mouth: "Amigo o colega",
|
||||
other: "Otro",
|
||||
},
|
||||
},
|
||||
onboarding: {
|
||||
usageSurveyTitle: "¿Cómo usas SnapOtter?",
|
||||
usageSurveyToolsLabel: "¿Qué es lo más importante para ti?",
|
||||
pickAnyHint: "(elige las que quieras)",
|
||||
priorToolLabel: "¿Qué usabas antes?",
|
||||
selfHostMotivationLabel: "¿Por qué autoalojarlo?",
|
||||
discoverySourceLabel: "¿Cómo nos conociste?",
|
||||
optionalHint: "(opcional)",
|
||||
continueLabel: "Continuar",
|
||||
},
|
||||
categories: {
|
||||
|
||||
@@ -149,11 +149,34 @@ export const fr: TranslationKeys = {
|
||||
batch_workflows: "Traitements par lots",
|
||||
ai_tools: "Outils AI",
|
||||
},
|
||||
priorTools: {
|
||||
online_tools: "Outils en ligne",
|
||||
desktop_apps: "Applications de bureau (Photoshop, GIMP)",
|
||||
command_line: "Ligne de commande (ffmpeg, ImageMagick)",
|
||||
self_hosted: "Un autre outil auto-hébergé",
|
||||
nothing: "Rien, c'est nouveau pour moi",
|
||||
},
|
||||
selfHostMotivations: {
|
||||
privacy_control: "Confidentialité et contrôle des données",
|
||||
upload_limits: "Limites de téléversement et filigranes",
|
||||
cost: "Coût",
|
||||
offline: "Hors ligne ou isolé du réseau",
|
||||
trying: "Je fais juste un essai",
|
||||
},
|
||||
discoverySources: {
|
||||
github: "GitHub",
|
||||
reddit_hn: "Reddit ou Hacker News",
|
||||
search: "Moteur de recherche",
|
||||
word_of_mouth: "Un ami ou un collègue",
|
||||
other: "Autre",
|
||||
},
|
||||
},
|
||||
onboarding: {
|
||||
usageSurveyTitle: "Comment utilisez-vous SnapOtter ?",
|
||||
usageSurveyToolsLabel: "Qu'est-ce qui compte le plus pour vous ?",
|
||||
pickAnyHint: "(plusieurs choix possibles)",
|
||||
priorToolLabel: "Qu'utilisiez-vous auparavant ?",
|
||||
selfHostMotivationLabel: "Pourquoi l'auto-héberger ?",
|
||||
discoverySourceLabel: "Comment avez-vous entendu parler de nous ?",
|
||||
optionalHint: "(facultatif)",
|
||||
continueLabel: "Continuer",
|
||||
},
|
||||
categories: {
|
||||
|
||||
@@ -145,11 +145,34 @@ export const hi: TranslationKeys = {
|
||||
batch_workflows: "बैच वर्कफ्लो",
|
||||
ai_tools: "AI टूल्स",
|
||||
},
|
||||
priorTools: {
|
||||
online_tools: "ऑनलाइन टूल्स",
|
||||
desktop_apps: "डेस्कटॉप ऐप्स (Photoshop, GIMP)",
|
||||
command_line: "कमांड लाइन (ffmpeg, ImageMagick)",
|
||||
self_hosted: "कोई और सेल्फ-होस्टेड टूल",
|
||||
nothing: "कुछ नहीं, यह नया है",
|
||||
},
|
||||
selfHostMotivations: {
|
||||
privacy_control: "प्राइवेसी और डेटा नियंत्रण",
|
||||
upload_limits: "अपलोड सीमाएं और वॉटरमार्क",
|
||||
cost: "लागत",
|
||||
offline: "ऑफ़लाइन या एयर-गैप्ड",
|
||||
trying: "बस आज़मा रहे हैं",
|
||||
},
|
||||
discoverySources: {
|
||||
github: "GitHub",
|
||||
reddit_hn: "Reddit या Hacker News",
|
||||
search: "सर्च इंजन",
|
||||
word_of_mouth: "दोस्त या सहकर्मी",
|
||||
other: "अन्य",
|
||||
},
|
||||
},
|
||||
onboarding: {
|
||||
usageSurveyTitle: "आप SnapOtter का उपयोग कैसे कर रहे हैं?",
|
||||
usageSurveyToolsLabel: "आपके लिए सबसे ज़्यादा महत्वपूर्ण क्या है?",
|
||||
pickAnyHint: "(कोई भी चुनें)",
|
||||
priorToolLabel: "इससे पहले आप क्या इस्तेमाल कर रहे थे?",
|
||||
selfHostMotivationLabel: "इसे सेल्फ-होस्ट क्यों करें?",
|
||||
discoverySourceLabel: "आपको हमारे बारे में कैसे पता चला?",
|
||||
optionalHint: "(वैकल्पिक)",
|
||||
continueLabel: "जारी रखें",
|
||||
},
|
||||
categories: {
|
||||
|
||||
@@ -147,11 +147,34 @@ export const id: TranslationKeys = {
|
||||
batch_workflows: "Alur kerja batch",
|
||||
ai_tools: "Alat AI",
|
||||
},
|
||||
priorTools: {
|
||||
online_tools: "Alat online",
|
||||
desktop_apps: "Aplikasi desktop (Photoshop, GIMP)",
|
||||
command_line: "Baris perintah (ffmpeg, ImageMagick)",
|
||||
self_hosted: "Alat self-hosted lain",
|
||||
nothing: "Tidak ada, ini baru",
|
||||
},
|
||||
selfHostMotivations: {
|
||||
privacy_control: "Privasi dan kontrol data",
|
||||
upload_limits: "Batas unggahan dan watermark",
|
||||
cost: "Biaya",
|
||||
offline: "Offline atau air-gapped",
|
||||
trying: "Sekadar mencoba",
|
||||
},
|
||||
discoverySources: {
|
||||
github: "GitHub",
|
||||
reddit_hn: "Reddit atau Hacker News",
|
||||
search: "Mesin pencari",
|
||||
word_of_mouth: "Teman atau rekan kerja",
|
||||
other: "Lainnya",
|
||||
},
|
||||
},
|
||||
onboarding: {
|
||||
usageSurveyTitle: "Bagaimana Anda menggunakan SnapOtter?",
|
||||
usageSurveyToolsLabel: "Apa yang paling penting bagi Anda?",
|
||||
pickAnyHint: "(pilih sebanyak yang Anda mau)",
|
||||
priorToolLabel: "Apa yang Anda gunakan sebelumnya?",
|
||||
selfHostMotivationLabel: "Mengapa meng-host sendiri?",
|
||||
discoverySourceLabel: "Dari mana Anda mengetahui kami?",
|
||||
optionalHint: "(opsional)",
|
||||
continueLabel: "Lanjutkan",
|
||||
},
|
||||
categories: {
|
||||
|
||||
@@ -148,11 +148,34 @@ export const it: TranslationKeys = {
|
||||
batch_workflows: "Flusso di lavoro multiplo",
|
||||
ai_tools: "Strumenti IA",
|
||||
},
|
||||
priorTools: {
|
||||
online_tools: "Strumenti online",
|
||||
desktop_apps: "App desktop (Photoshop, GIMP)",
|
||||
command_line: "Riga di comando (ffmpeg, ImageMagick)",
|
||||
self_hosted: "Un altro strumento self-hosted",
|
||||
nothing: "Niente, è una novità per me",
|
||||
},
|
||||
selfHostMotivations: {
|
||||
privacy_control: "Privacy e controllo dei dati",
|
||||
upload_limits: "Limiti di caricamento e filigrane",
|
||||
cost: "Costo",
|
||||
offline: "Offline o isolato dalla rete",
|
||||
trying: "Lo sto solo provando",
|
||||
},
|
||||
discoverySources: {
|
||||
github: "GitHub",
|
||||
reddit_hn: "Reddit o Hacker News",
|
||||
search: "Motore di ricerca",
|
||||
word_of_mouth: "Un amico o un collega",
|
||||
other: "Altro",
|
||||
},
|
||||
},
|
||||
onboarding: {
|
||||
usageSurveyTitle: "Come usi SnapOtter?",
|
||||
usageSurveyToolsLabel: "Cosa conta di più per te?",
|
||||
pickAnyHint: "(scegli quante ne vuoi)",
|
||||
priorToolLabel: "Cosa usavi prima?",
|
||||
selfHostMotivationLabel: "Perché ospitarlo in autonomia?",
|
||||
discoverySourceLabel: "Come hai saputo di noi?",
|
||||
optionalHint: "(facoltativo)",
|
||||
continueLabel: "Continua",
|
||||
},
|
||||
categories: {
|
||||
|
||||
@@ -149,11 +149,34 @@ export const ja: TranslationKeys = {
|
||||
batch_workflows: "バッチ処理",
|
||||
ai_tools: "AIツール",
|
||||
},
|
||||
priorTools: {
|
||||
online_tools: "オンラインツール",
|
||||
desktop_apps: "デスクトップアプリ (Photoshop、GIMP)",
|
||||
command_line: "コマンドライン (ffmpeg、ImageMagick)",
|
||||
self_hosted: "別のセルフホスト型ツール",
|
||||
nothing: "特になし、初めて使う",
|
||||
},
|
||||
selfHostMotivations: {
|
||||
privacy_control: "プライバシーとデータの管理",
|
||||
upload_limits: "アップロード制限やウォーターマーク",
|
||||
cost: "コスト",
|
||||
offline: "オフラインや隔離環境",
|
||||
trying: "とりあえず試している",
|
||||
},
|
||||
discoverySources: {
|
||||
github: "GitHub",
|
||||
reddit_hn: "RedditやHacker News",
|
||||
search: "検索エンジン",
|
||||
word_of_mouth: "友人や同僚",
|
||||
other: "その他",
|
||||
},
|
||||
},
|
||||
onboarding: {
|
||||
usageSurveyTitle: "SnapOtterをどのように使っていますか?",
|
||||
usageSurveyToolsLabel: "あなたにとって最も重要なものは?",
|
||||
pickAnyHint: "(いくつでも選択可)",
|
||||
priorToolLabel: "以前は何を使っていましたか?",
|
||||
selfHostMotivationLabel: "セルフホストする理由は?",
|
||||
discoverySourceLabel: "SnapOtterをどこで知りましたか?",
|
||||
optionalHint: "(任意)",
|
||||
continueLabel: "続ける",
|
||||
},
|
||||
categories: {
|
||||
|
||||
@@ -147,11 +147,34 @@ export const ko: TranslationKeys = {
|
||||
batch_workflows: "일괄 워크플로",
|
||||
ai_tools: "AI 도구",
|
||||
},
|
||||
priorTools: {
|
||||
online_tools: "온라인 도구",
|
||||
desktop_apps: "데스크톱 앱 (Photoshop, GIMP)",
|
||||
command_line: "명령줄 (ffmpeg, ImageMagick)",
|
||||
self_hosted: "다른 자체 호스팅 도구",
|
||||
nothing: "없음, 처음 사용함",
|
||||
},
|
||||
selfHostMotivations: {
|
||||
privacy_control: "개인정보 및 데이터 관리",
|
||||
upload_limits: "업로드 제한 및 워터마크",
|
||||
cost: "비용",
|
||||
offline: "오프라인 또는 폐쇄망",
|
||||
trying: "그냥 사용해 보는 중",
|
||||
},
|
||||
discoverySources: {
|
||||
github: "GitHub",
|
||||
reddit_hn: "Reddit 또는 Hacker News",
|
||||
search: "검색 엔진",
|
||||
word_of_mouth: "친구 또는 동료",
|
||||
other: "기타",
|
||||
},
|
||||
},
|
||||
onboarding: {
|
||||
usageSurveyTitle: "SnapOtter를 어떻게 사용하고 계신가요?",
|
||||
usageSurveyToolsLabel: "가장 중요하게 생각하는 것은 무엇인가요?",
|
||||
pickAnyHint: "(원하는 만큼 선택)",
|
||||
priorToolLabel: "이전에는 무엇을 사용하셨나요?",
|
||||
selfHostMotivationLabel: "직접 호스팅하는 이유는 무엇인가요?",
|
||||
discoverySourceLabel: "SnapOtter를 어떻게 알게 되셨나요?",
|
||||
optionalHint: "(선택 사항)",
|
||||
continueLabel: "계속",
|
||||
},
|
||||
categories: {
|
||||
|
||||
@@ -148,11 +148,34 @@ export const nl: TranslationKeys = {
|
||||
batch_workflows: "Batchworkflows",
|
||||
ai_tools: "AI-tools",
|
||||
},
|
||||
priorTools: {
|
||||
online_tools: "Online tools",
|
||||
desktop_apps: "Desktopapps (Photoshop, GIMP)",
|
||||
command_line: "Opdrachtregel (ffmpeg, ImageMagick)",
|
||||
self_hosted: "Een andere zelfgehoste tool",
|
||||
nothing: "Niets, dit is nieuw voor mij",
|
||||
},
|
||||
selfHostMotivations: {
|
||||
privacy_control: "Privacy en controle over data",
|
||||
upload_limits: "Uploadlimieten en watermerken",
|
||||
cost: "Kosten",
|
||||
offline: "Offline of afgeschermd netwerk",
|
||||
trying: "Gewoon aan het uitproberen",
|
||||
},
|
||||
discoverySources: {
|
||||
github: "GitHub",
|
||||
reddit_hn: "Reddit of Hacker News",
|
||||
search: "Zoekmachine",
|
||||
word_of_mouth: "Vriend of collega",
|
||||
other: "Anders",
|
||||
},
|
||||
},
|
||||
onboarding: {
|
||||
usageSurveyTitle: "Hoe gebruik je SnapOtter?",
|
||||
usageSurveyToolsLabel: "Wat is voor jou het belangrijkst?",
|
||||
pickAnyHint: "(kies er zoveel als je wilt)",
|
||||
priorToolLabel: "Wat gebruikte je hiervoor?",
|
||||
selfHostMotivationLabel: "Waarom zelf hosten?",
|
||||
discoverySourceLabel: "Hoe heb je ons gevonden?",
|
||||
optionalHint: "(optioneel)",
|
||||
continueLabel: "Doorgaan",
|
||||
},
|
||||
categories: {
|
||||
|
||||
@@ -146,11 +146,34 @@ export const pl: TranslationKeys = {
|
||||
batch_workflows: "Przetwarzanie wsadowe",
|
||||
ai_tools: "Narzędzia AI",
|
||||
},
|
||||
priorTools: {
|
||||
online_tools: "Narzędzia online",
|
||||
desktop_apps: "Aplikacje desktopowe (Photoshop, GIMP)",
|
||||
command_line: "Wiersz poleceń (ffmpeg, ImageMagick)",
|
||||
self_hosted: "Inne narzędzie hostowane samodzielnie",
|
||||
nothing: "Nic, to dla mnie nowość",
|
||||
},
|
||||
selfHostMotivations: {
|
||||
privacy_control: "Prywatność i kontrola nad danymi",
|
||||
upload_limits: "Limity przesyłania i znaki wodne",
|
||||
cost: "Koszt",
|
||||
offline: "Offline lub sieć odizolowana",
|
||||
trying: "Po prostu testuję",
|
||||
},
|
||||
discoverySources: {
|
||||
github: "GitHub",
|
||||
reddit_hn: "Reddit lub Hacker News",
|
||||
search: "Wyszukiwarka",
|
||||
word_of_mouth: "Znajomy lub współpracownik",
|
||||
other: "Inne",
|
||||
},
|
||||
},
|
||||
onboarding: {
|
||||
usageSurveyTitle: "Jak korzystasz ze SnapOtter?",
|
||||
usageSurveyToolsLabel: "Co jest dla Ciebie najważniejsze?",
|
||||
pickAnyHint: "(wybierz dowolną liczbę)",
|
||||
priorToolLabel: "Czego używałeś wcześniej?",
|
||||
selfHostMotivationLabel: "Dlaczego hostujesz samodzielnie?",
|
||||
discoverySourceLabel: "Skąd o nas wiesz?",
|
||||
optionalHint: "(opcjonalnie)",
|
||||
continueLabel: "Dalej",
|
||||
},
|
||||
categories: {
|
||||
|
||||
@@ -148,11 +148,34 @@ export const ptBR: TranslationKeys = {
|
||||
batch_workflows: "Fluxos em lote",
|
||||
ai_tools: "Ferramentas de AI",
|
||||
},
|
||||
priorTools: {
|
||||
online_tools: "Ferramentas online",
|
||||
desktop_apps: "Aplicativos de desktop (Photoshop, GIMP)",
|
||||
command_line: "Linha de comando (ffmpeg, ImageMagick)",
|
||||
self_hosted: "Outra ferramenta auto-hospedada",
|
||||
nothing: "Nada, isso é novo para mim",
|
||||
},
|
||||
selfHostMotivations: {
|
||||
privacy_control: "Privacidade e controle dos dados",
|
||||
upload_limits: "Limites de upload e marcas d'água",
|
||||
cost: "Custo",
|
||||
offline: "Offline ou isolado da rede",
|
||||
trying: "Só estou experimentando",
|
||||
},
|
||||
discoverySources: {
|
||||
github: "GitHub",
|
||||
reddit_hn: "Reddit ou Hacker News",
|
||||
search: "Mecanismo de busca",
|
||||
word_of_mouth: "Amigo ou colega",
|
||||
other: "Outro",
|
||||
},
|
||||
},
|
||||
onboarding: {
|
||||
usageSurveyTitle: "Como você usa o SnapOtter?",
|
||||
usageSurveyToolsLabel: "O que é mais importante para você?",
|
||||
pickAnyHint: "(escolha quantas quiser)",
|
||||
priorToolLabel: "O que você usava antes?",
|
||||
selfHostMotivationLabel: "Por que auto-hospedar?",
|
||||
discoverySourceLabel: "Como você ficou sabendo da gente?",
|
||||
optionalHint: "(opcional)",
|
||||
continueLabel: "Continuar",
|
||||
},
|
||||
categories: {
|
||||
|
||||
@@ -147,11 +147,34 @@ export const ru: TranslationKeys = {
|
||||
batch_workflows: "Пакетная обработка",
|
||||
ai_tools: "AI-инструменты",
|
||||
},
|
||||
priorTools: {
|
||||
online_tools: "Онлайн-инструменты",
|
||||
desktop_apps: "Настольные приложения (Photoshop, GIMP)",
|
||||
command_line: "Командная строка (ffmpeg, ImageMagick)",
|
||||
self_hosted: "Другой self-hosted инструмент",
|
||||
nothing: "Ничего, это впервые",
|
||||
},
|
||||
selfHostMotivations: {
|
||||
privacy_control: "Приватность и контроль над данными",
|
||||
upload_limits: "Ограничения на загрузку и водяные знаки",
|
||||
cost: "Стоимость",
|
||||
offline: "Офлайн или изолированная сеть",
|
||||
trying: "Просто пробую",
|
||||
},
|
||||
discoverySources: {
|
||||
github: "GitHub",
|
||||
reddit_hn: "Reddit или Hacker News",
|
||||
search: "Поисковая система",
|
||||
word_of_mouth: "Друг или коллега",
|
||||
other: "Другое",
|
||||
},
|
||||
},
|
||||
onboarding: {
|
||||
usageSurveyTitle: "Как вы используете SnapOtter?",
|
||||
usageSurveyToolsLabel: "Что для вас важнее всего?",
|
||||
pickAnyHint: "(выберите любое количество)",
|
||||
priorToolLabel: "Чем вы пользовались раньше?",
|
||||
selfHostMotivationLabel: "Почему выбрали self-hosting?",
|
||||
discoverySourceLabel: "Как вы о нас узнали?",
|
||||
optionalHint: "(необязательно)",
|
||||
continueLabel: "Продолжить",
|
||||
},
|
||||
categories: {
|
||||
|
||||
@@ -148,11 +148,34 @@ export const sv: TranslationKeys = {
|
||||
batch_workflows: "Batch-arbetsflöden",
|
||||
ai_tools: "AI-verktyg",
|
||||
},
|
||||
priorTools: {
|
||||
online_tools: "Onlineverktyg",
|
||||
desktop_apps: "Skrivbordsappar (Photoshop, GIMP)",
|
||||
command_line: "Kommandorad (ffmpeg, ImageMagick)",
|
||||
self_hosted: "Ett annat självhostat verktyg",
|
||||
nothing: "Inget, det här är nytt för mig",
|
||||
},
|
||||
selfHostMotivations: {
|
||||
privacy_control: "Integritet och kontroll över data",
|
||||
upload_limits: "Uppladdningsgränser och vattenstämplar",
|
||||
cost: "Kostnad",
|
||||
offline: "Offline eller isolerat nätverk",
|
||||
trying: "Testar bara",
|
||||
},
|
||||
discoverySources: {
|
||||
github: "GitHub",
|
||||
reddit_hn: "Reddit eller Hacker News",
|
||||
search: "Sökmotor",
|
||||
word_of_mouth: "Vän eller kollega",
|
||||
other: "Annat",
|
||||
},
|
||||
},
|
||||
onboarding: {
|
||||
usageSurveyTitle: "Hur använder du SnapOtter?",
|
||||
usageSurveyToolsLabel: "Vad betyder mest för dig?",
|
||||
pickAnyHint: "(välj hur många du vill)",
|
||||
priorToolLabel: "Vad använde du tidigare?",
|
||||
selfHostMotivationLabel: "Varför självhosta?",
|
||||
discoverySourceLabel: "Hur hörde du talas om oss?",
|
||||
optionalHint: "(valfritt)",
|
||||
continueLabel: "Fortsätt",
|
||||
},
|
||||
categories: {
|
||||
|
||||
@@ -145,11 +145,34 @@ export const th: TranslationKeys = {
|
||||
batch_workflows: "เวิร์กโฟลว์แบบชุด",
|
||||
ai_tools: "เครื่องมือ AI",
|
||||
},
|
||||
priorTools: {
|
||||
online_tools: "เครื่องมือออนไลน์",
|
||||
desktop_apps: "แอปเดสก์ท็อป (Photoshop, GIMP)",
|
||||
command_line: "คอมมานด์ไลน์ (ffmpeg, ImageMagick)",
|
||||
self_hosted: "เครื่องมือโฮสต์เองอื่น",
|
||||
nothing: "ไม่มีเลย นี่เป็นครั้งแรก",
|
||||
},
|
||||
selfHostMotivations: {
|
||||
privacy_control: "ความเป็นส่วนตัวและการควบคุมข้อมูล",
|
||||
upload_limits: "ข้อจำกัดการอัปโหลดและลายน้ำ",
|
||||
cost: "ค่าใช้จ่าย",
|
||||
offline: "ออฟไลน์หรือแยกจากเครือข่าย",
|
||||
trying: "แค่ลองใช้ดู",
|
||||
},
|
||||
discoverySources: {
|
||||
github: "GitHub",
|
||||
reddit_hn: "Reddit หรือ Hacker News",
|
||||
search: "เครื่องมือค้นหา",
|
||||
word_of_mouth: "เพื่อนหรือเพื่อนร่วมงาน",
|
||||
other: "อื่นๆ",
|
||||
},
|
||||
},
|
||||
onboarding: {
|
||||
usageSurveyTitle: "คุณใช้ SnapOtter อย่างไร?",
|
||||
usageSurveyToolsLabel: "อะไรสำคัญที่สุดสำหรับคุณ?",
|
||||
pickAnyHint: "(เลือกได้หลายข้อ)",
|
||||
priorToolLabel: "ก่อนหน้านี้คุณใช้อะไรอยู่?",
|
||||
selfHostMotivationLabel: "ทำไมถึงโฮสต์เอง?",
|
||||
discoverySourceLabel: "คุณรู้จักเราได้อย่างไร?",
|
||||
optionalHint: "(ไม่บังคับ)",
|
||||
continueLabel: "ดำเนินการต่อ",
|
||||
},
|
||||
categories: {
|
||||
|
||||
@@ -147,11 +147,34 @@ export const tr: TranslationKeys = {
|
||||
batch_workflows: "Toplu iş akışları",
|
||||
ai_tools: "AI araçları",
|
||||
},
|
||||
priorTools: {
|
||||
online_tools: "Çevrimiçi araçlar",
|
||||
desktop_apps: "Masaüstü uygulamaları (Photoshop, GIMP)",
|
||||
command_line: "Komut satırı (ffmpeg, ImageMagick)",
|
||||
self_hosted: "Başka bir kendi sunucunuzda barındırılan araç",
|
||||
nothing: "Hiçbiri, bu benim için yeni",
|
||||
},
|
||||
selfHostMotivations: {
|
||||
privacy_control: "Gizlilik ve veri denetimi",
|
||||
upload_limits: "Yükleme sınırları ve filigranlar",
|
||||
cost: "Maliyet",
|
||||
offline: "Çevrimdışı veya izole ağ",
|
||||
trying: "Sadece deniyorum",
|
||||
},
|
||||
discoverySources: {
|
||||
github: "GitHub",
|
||||
reddit_hn: "Reddit veya Hacker News",
|
||||
search: "Arama motoru",
|
||||
word_of_mouth: "Arkadaş veya iş arkadaşı",
|
||||
other: "Diğer",
|
||||
},
|
||||
},
|
||||
onboarding: {
|
||||
usageSurveyTitle: "SnapOtter'ı nasıl kullanıyorsunuz?",
|
||||
usageSurveyToolsLabel: "Sizin için en önemlisi ne?",
|
||||
pickAnyHint: "(istediğiniz kadar seçin)",
|
||||
priorToolLabel: "Daha önce ne kullanıyordunuz?",
|
||||
selfHostMotivationLabel: "Neden kendi sunucunuzda barındırıyorsunuz?",
|
||||
discoverySourceLabel: "Bizi nereden duydunuz?",
|
||||
optionalHint: "(isteğe bağlı)",
|
||||
continueLabel: "Devam et",
|
||||
},
|
||||
categories: {
|
||||
|
||||
@@ -147,11 +147,34 @@ export const uk: TranslationKeys = {
|
||||
batch_workflows: "Пакетні робочі процеси",
|
||||
ai_tools: "Інструменти AI",
|
||||
},
|
||||
priorTools: {
|
||||
online_tools: "Онлайн-інструменти",
|
||||
desktop_apps: "Настільні застосунки (Photoshop, GIMP)",
|
||||
command_line: "Командний рядок (ffmpeg, ImageMagick)",
|
||||
self_hosted: "Інший self-hosted інструмент",
|
||||
nothing: "Нічого, це вперше",
|
||||
},
|
||||
selfHostMotivations: {
|
||||
privacy_control: "Приватність і контроль над даними",
|
||||
upload_limits: "Обмеження на завантаження та водяні знаки",
|
||||
cost: "Вартість",
|
||||
offline: "Офлайн або ізольована мережа",
|
||||
trying: "Просто пробую",
|
||||
},
|
||||
discoverySources: {
|
||||
github: "GitHub",
|
||||
reddit_hn: "Reddit або Hacker News",
|
||||
search: "Пошукова система",
|
||||
word_of_mouth: "Друг або колега",
|
||||
other: "Інше",
|
||||
},
|
||||
},
|
||||
onboarding: {
|
||||
usageSurveyTitle: "Як ви використовуєте SnapOtter?",
|
||||
usageSurveyToolsLabel: "Що для вас найважливіше?",
|
||||
pickAnyHint: "(виберіть будь-яку кількість)",
|
||||
priorToolLabel: "Чим ви користувалися раніше?",
|
||||
selfHostMotivationLabel: "Чому обрали self-hosting?",
|
||||
discoverySourceLabel: "Як ви про нас дізналися?",
|
||||
optionalHint: "(необовʼязково)",
|
||||
continueLabel: "Продовжити",
|
||||
},
|
||||
categories: {
|
||||
|
||||
@@ -149,11 +149,34 @@ export const vi: TranslationKeys = {
|
||||
batch_workflows: "Quy trình hàng loạt",
|
||||
ai_tools: "Công cụ AI",
|
||||
},
|
||||
priorTools: {
|
||||
online_tools: "Công cụ trực tuyến",
|
||||
desktop_apps: "Ứng dụng máy tính (Photoshop, GIMP)",
|
||||
command_line: "Dòng lệnh (ffmpeg, ImageMagick)",
|
||||
self_hosted: "Công cụ tự lưu trữ khác",
|
||||
nothing: "Không có gì, đây là lần đầu",
|
||||
},
|
||||
selfHostMotivations: {
|
||||
privacy_control: "Quyền riêng tư và kiểm soát dữ liệu",
|
||||
upload_limits: "Giới hạn tải lên và hình mờ",
|
||||
cost: "Chi phí",
|
||||
offline: "Ngoại tuyến hoặc cách ly mạng",
|
||||
trying: "Chỉ dùng thử",
|
||||
},
|
||||
discoverySources: {
|
||||
github: "GitHub",
|
||||
reddit_hn: "Reddit hoặc Hacker News",
|
||||
search: "Công cụ tìm kiếm",
|
||||
word_of_mouth: "Bạn bè hoặc đồng nghiệp",
|
||||
other: "Khác",
|
||||
},
|
||||
},
|
||||
onboarding: {
|
||||
usageSurveyTitle: "Bạn đang sử dụng SnapOtter như thế nào?",
|
||||
usageSurveyToolsLabel: "Điều gì quan trọng nhất với bạn?",
|
||||
pickAnyHint: "(chọn bao nhiêu tùy thích)",
|
||||
priorToolLabel: "Trước đây bạn đã dùng gì?",
|
||||
selfHostMotivationLabel: "Tại sao tự lưu trữ?",
|
||||
discoverySourceLabel: "Bạn biết đến chúng tôi bằng cách nào?",
|
||||
optionalHint: "(tùy chọn)",
|
||||
continueLabel: "Tiếp tục",
|
||||
},
|
||||
categories: {
|
||||
|
||||
@@ -143,11 +143,34 @@ export const zhCN: TranslationKeys = {
|
||||
batch_workflows: "批量工作流",
|
||||
ai_tools: "AI 工具",
|
||||
},
|
||||
priorTools: {
|
||||
online_tools: "在线工具",
|
||||
desktop_apps: "桌面应用 (Photoshop、GIMP)",
|
||||
command_line: "命令行 (ffmpeg、ImageMagick)",
|
||||
self_hosted: "其他自托管工具",
|
||||
nothing: "没有,这是第一次用",
|
||||
},
|
||||
selfHostMotivations: {
|
||||
privacy_control: "隐私和数据控制",
|
||||
upload_limits: "上传限制和水印",
|
||||
cost: "成本",
|
||||
offline: "离线或隔离网络",
|
||||
trying: "只是试用一下",
|
||||
},
|
||||
discoverySources: {
|
||||
github: "GitHub",
|
||||
reddit_hn: "Reddit 或 Hacker News",
|
||||
search: "搜索引擎",
|
||||
word_of_mouth: "朋友或同事",
|
||||
other: "其他",
|
||||
},
|
||||
},
|
||||
onboarding: {
|
||||
usageSurveyTitle: "您如何使用 SnapOtter?",
|
||||
usageSurveyToolsLabel: "您最看重什么?",
|
||||
pickAnyHint: "(可多选)",
|
||||
priorToolLabel: "您之前用的是什么?",
|
||||
selfHostMotivationLabel: "为什么选择自托管?",
|
||||
discoverySourceLabel: "您是如何了解到我们的?",
|
||||
optionalHint: "(可选)",
|
||||
continueLabel: "继续",
|
||||
},
|
||||
categories: {
|
||||
|
||||
@@ -144,11 +144,34 @@ export const zhTW: TranslationKeys = {
|
||||
batch_workflows: "批次工作流程",
|
||||
ai_tools: "AI 工具",
|
||||
},
|
||||
priorTools: {
|
||||
online_tools: "線上工具",
|
||||
desktop_apps: "桌面應用程式 (Photoshop、GIMP)",
|
||||
command_line: "命令列 (ffmpeg、ImageMagick)",
|
||||
self_hosted: "其他自架工具",
|
||||
nothing: "沒有,這是第一次用",
|
||||
},
|
||||
selfHostMotivations: {
|
||||
privacy_control: "隱私與資料掌控",
|
||||
upload_limits: "上傳限制與浮水印",
|
||||
cost: "成本",
|
||||
offline: "離線或隔離網路",
|
||||
trying: "只是試用看看",
|
||||
},
|
||||
discoverySources: {
|
||||
github: "GitHub",
|
||||
reddit_hn: "Reddit 或 Hacker News",
|
||||
search: "搜尋引擎",
|
||||
word_of_mouth: "朋友或同事",
|
||||
other: "其他",
|
||||
},
|
||||
},
|
||||
onboarding: {
|
||||
usageSurveyTitle: "您如何使用 SnapOtter?",
|
||||
usageSurveyToolsLabel: "您最重視什麼?",
|
||||
pickAnyHint: "(可複選)",
|
||||
priorToolLabel: "您之前用的是什麼?",
|
||||
selfHostMotivationLabel: "為什麼選擇自架?",
|
||||
discoverySourceLabel: "您是如何得知我們的?",
|
||||
optionalHint: "(選填)",
|
||||
continueLabel: "繼續",
|
||||
},
|
||||
categories: {
|
||||
|
||||
Reference in New Issue
Block a user