diff --git a/scripts/inject-missing-messages.mjs b/scripts/inject-missing-messages.mjs deleted file mode 100644 index b69f0bd90..000000000 --- a/scripts/inject-missing-messages.mjs +++ /dev/null @@ -1,1447 +0,0 @@ -import { readFileSync, writeFileSync, readdirSync } from 'node:fs'; -import { join, dirname } from 'node:path'; -import { fileURLToPath } from 'node:url'; - -const __dirname = dirname(fileURLToPath(import.meta.url)); -const messagesDir = join(__dirname, '..', 'public', 'intl', 'messages'); - -// Keys same in all languages (acronyms / technical terms) -const universal = { - label: { - aov: 'AOV', - arpu: 'ARPU', - cls: 'CLS', - fcp: 'FCP', - inp: 'INP', - lcp: 'LCP', - 'replay-id': 'Replay ID', - slug: 'Slug', - ttfb: 'TTFB', - }, -}; - -// Per-locale translations for the remaining 20 keys -const translations = { - 'ar-SA': { - label: { - 'block-selector': 'محدد الكتلة', - duration: 'المدة', - good: 'جيد', - 'mask-level': 'مستوى القناع', - 'max-duration': 'الحد الأقصى للمدة', - 'needs-improvement': 'يحتاج إلى تحسين', - performance: 'الأداء', - play: 'تشغيل', - poor: 'ضعيف', - 'recorded-at': 'سُجِّل في', - replay: 'إعادة التشغيل', - 'replay-enabled': 'إعادة التشغيل مفعلة', - replays: 'إعادات التشغيل', - 'retention-days': 'أيام الاحتفاظ', - 'sample-rate': 'معدل أخذ العينات', - 'sample-size': 'حجم العينة', - 'select-component': 'اختر مكونًا', - }, - message: { - 'empty-dashboard': 'لوحة التحكم الخاصة بك فارغة. انقر فوق تحرير لإضافة مكونك الأول.', - 'select-component-preview': 'اختر مكونًا للمعاينة', - 'select-website-first': 'اختر موقعًا أولاً', - }, - }, - 'be-BY': { - label: { - 'block-selector': 'Выбар блока', - duration: 'Працягласць', - good: 'Добра', - 'mask-level': 'Узровень маскіравання', - 'max-duration': 'Максімальная працягласць', - 'needs-improvement': 'Патрэбна паляпшэнне', - performance: 'Прадукцыйнасць', - play: 'Прайграць', - poor: 'Дрэнна', - 'recorded-at': 'Запісана ў', - replay: 'Паўтор', - 'replay-enabled': 'Паўтор уключаны', - replays: 'Паўторы', - 'retention-days': 'Дні захоўвання', - 'sample-rate': 'Частата выбаркі', - 'sample-size': "Аб'ём выбаркі", - 'select-component': 'Выберыце кампанент', - }, - message: { - 'empty-dashboard': - 'Ваша панэль кіравання пустая. Націсніце Рэдагаваць, каб дадаць першы кампанент.', - 'select-component-preview': 'Выберыце кампанент для прагляду', - 'select-website-first': 'Спачатку выберыце сайт', - }, - }, - 'bg-BG': { - label: { - 'block-selector': 'Избор на блок', - duration: 'Продължителност', - good: 'Добро', - 'mask-level': 'Ниво на маскиране', - 'max-duration': 'Максимална продължителност', - 'needs-improvement': 'Нуждае се от подобрение', - performance: 'Производителност', - play: 'Пусни', - poor: 'Слабо', - 'recorded-at': 'Записано на', - replay: 'Повторение', - 'replay-enabled': 'Повторението е активирано', - replays: 'Повторения', - 'retention-days': 'Дни на съхранение', - 'sample-rate': 'Честота на извадката', - 'sample-size': 'Размер на извадката', - 'select-component': 'Изберете компонент', - }, - message: { - 'empty-dashboard': - 'Вашето табло е празно. Щракнете Редактиране, за да добавите първия си компонент.', - 'select-component-preview': 'Изберете компонент за преглед', - 'select-website-first': 'Първо изберете уебсайт', - }, - }, - 'bn-BD': { - label: { - 'block-selector': 'ব্লক নির্বাচক', - duration: 'সময়কাল', - good: 'ভালো', - 'mask-level': 'মাস্ক স্তর', - 'max-duration': 'সর্বোচ্চ সময়কাল', - 'needs-improvement': 'উন্নতি প্রয়োজন', - performance: 'পারফরম্যান্স', - play: 'চালান', - poor: 'খারাপ', - 'recorded-at': 'রেকর্ড করা হয়েছে', - replay: 'রিপ্লে', - 'replay-enabled': 'রিপ্লে সক্রিয়', - replays: 'রিপ্লেসমূহ', - 'retention-days': 'ধারণ দিন', - 'sample-rate': 'নমুনার হার', - 'sample-size': 'নমুনার আকার', - 'select-component': 'উপাদান নির্বাচন করুন', - }, - message: { - 'empty-dashboard': - 'আপনার ড্যাশবোর্ড খালি। প্রথম উপাদান যোগ করতে সম্পাদনা ক্লিক করুন।', - 'select-component-preview': 'প্রিভিউয়ের জন্য একটি উপাদান নির্বাচন করুন', - 'select-website-first': 'প্রথমে একটি ওয়েবসাইট নির্বাচন করুন', - }, - }, - 'bs-BA': { - label: { - 'block-selector': 'Odabir bloka', - duration: 'Trajanje', - good: 'Dobro', - 'mask-level': 'Nivo maske', - 'max-duration': 'Maksimalno trajanje', - 'needs-improvement': 'Treba poboljšanje', - performance: 'Performanse', - play: 'Reprodukuj', - poor: 'Loše', - 'recorded-at': 'Snimljeno u', - replay: 'Ponovna reprodukcija', - 'replay-enabled': 'Ponovna reprodukcija omogućena', - replays: 'Ponovne reprodukcije', - 'retention-days': 'Dani zadržavanja', - 'sample-rate': 'Stopa uzorkovanja', - 'sample-size': 'Veličina uzorka', - 'select-component': 'Odaberite komponentu', - }, - message: { - 'empty-dashboard': - 'Vaša kontrolna tabla je prazna. Kliknite Uredi da dodate prvu komponentu.', - 'select-component-preview': 'Odaberite komponentu za pregled', - 'select-website-first': 'Prvo odaberite web stranicu', - }, - }, - 'ca-ES': { - label: { - 'block-selector': 'Selector de bloc', - duration: 'Durada', - good: 'Bo', - 'mask-level': 'Nivell de màscara', - 'max-duration': 'Durada màxima', - 'needs-improvement': 'Necessita millora', - performance: 'Rendiment', - play: 'Reprodueix', - poor: 'Deficient', - 'recorded-at': 'Registrat a', - replay: 'Repetició', - 'replay-enabled': 'Repetició activada', - replays: 'Repeticions', - 'retention-days': 'Dies de retenció', - 'sample-rate': 'Taxa de mostreig', - 'sample-size': 'Mida de la mostra', - 'select-component': 'Selecciona un component', - }, - message: { - 'empty-dashboard': - "El teu tauler és buit. Fes clic a Edita per afegir el teu primer component.", - 'select-component-preview': 'Selecciona un component per previsualitzar', - 'select-website-first': 'Primer selecciona un lloc web', - }, - }, - 'cs-CZ': { - label: { - 'block-selector': 'Výběr bloku', - duration: 'Trvání', - good: 'Dobré', - 'mask-level': 'Úroveň masky', - 'max-duration': 'Maximální trvání', - 'needs-improvement': 'Potřebuje zlepšení', - performance: 'Výkon', - play: 'Přehrát', - poor: 'Špatné', - 'recorded-at': 'Zaznamenáno v', - replay: 'Přehrávání', - 'replay-enabled': 'Přehrávání povoleno', - replays: 'Přehrávání', - 'retention-days': 'Dny uchování', - 'sample-rate': 'Frekvence vzorkování', - 'sample-size': 'Velikost vzorku', - 'select-component': 'Vyberte komponentu', - }, - message: { - 'empty-dashboard': - 'Váš řídicí panel je prázdný. Klikněte na Upravit a přidejte první komponentu.', - 'select-component-preview': 'Vyberte komponentu pro náhled', - 'select-website-first': 'Nejprve vyberte web', - }, - }, - 'da-DK': { - label: { - 'block-selector': 'Blokvælger', - duration: 'Varighed', - good: 'God', - 'mask-level': 'Maskeniveau', - 'max-duration': 'Maksimal varighed', - 'needs-improvement': 'Behøver forbedring', - performance: 'Ydeevne', - play: 'Afspil', - poor: 'Dårlig', - 'recorded-at': 'Optaget den', - replay: 'Afspilning', - 'replay-enabled': 'Afspilning aktiveret', - replays: 'Afspilninger', - 'retention-days': 'Opbevaringsdage', - 'sample-rate': 'Samplingshastighed', - 'sample-size': 'Stikprøvestørrelse', - 'select-component': 'Vælg komponent', - }, - message: { - 'empty-dashboard': - 'Dit dashboard er tomt. Klik på Rediger for at tilføje din første komponent.', - 'select-component-preview': 'Vælg en komponent for at se forhåndsvisning', - 'select-website-first': 'Vælg et websted først', - }, - }, - 'de-CH': { - label: { - 'block-selector': 'Blockauswahl', - duration: 'Dauer', - good: 'Gut', - 'mask-level': 'Maskierungsstufe', - 'max-duration': 'Maximale Dauer', - 'needs-improvement': 'Verbesserungsbedarf', - performance: 'Leistung', - play: 'Abspielen', - poor: 'Schlecht', - 'recorded-at': 'Aufgezeichnet am', - replay: 'Wiedergabe', - 'replay-enabled': 'Wiedergabe aktiviert', - replays: 'Wiedergaben', - 'retention-days': 'Aufbewahrungstage', - 'sample-rate': 'Abtastrate', - 'sample-size': 'Stichprobengrösse', - 'select-component': 'Komponente auswählen', - }, - message: { - 'empty-dashboard': - 'Ihr Dashboard ist leer. Klicken Sie auf Bearbeiten, um Ihre erste Komponente hinzuzufügen.', - 'select-component-preview': 'Wählen Sie eine Komponente für die Vorschau', - 'select-website-first': 'Wählen Sie zuerst eine Website', - }, - }, - 'de-DE': { - label: { - 'block-selector': 'Blockauswahl', - duration: 'Dauer', - good: 'Gut', - 'mask-level': 'Maskierungsstufe', - 'max-duration': 'Maximale Dauer', - 'needs-improvement': 'Verbesserungsbedarf', - performance: 'Leistung', - play: 'Abspielen', - poor: 'Schlecht', - 'recorded-at': 'Aufgezeichnet am', - replay: 'Wiedergabe', - 'replay-enabled': 'Wiedergabe aktiviert', - replays: 'Wiedergaben', - 'retention-days': 'Aufbewahrungstage', - 'sample-rate': 'Abtastrate', - 'sample-size': 'Stichprobengröße', - 'select-component': 'Komponente auswählen', - }, - message: { - 'empty-dashboard': - 'Ihr Dashboard ist leer. Klicken Sie auf Bearbeiten, um Ihre erste Komponente hinzuzufügen.', - 'select-component-preview': 'Wählen Sie eine Komponente für die Vorschau', - 'select-website-first': 'Wählen Sie zuerst eine Website', - }, - }, - 'el-GR': { - label: { - 'block-selector': 'Επιλογέας μπλοκ', - duration: 'Διάρκεια', - good: 'Καλό', - 'mask-level': 'Επίπεδο μάσκας', - 'max-duration': 'Μέγιστη διάρκεια', - 'needs-improvement': 'Χρειάζεται βελτίωση', - performance: 'Απόδοση', - play: 'Αναπαραγωγή', - poor: 'Κακό', - 'recorded-at': 'Καταγράφηκε στις', - replay: 'Επανάληψη', - 'replay-enabled': 'Επανάληψη ενεργοποιημένη', - replays: 'Επαναλήψεις', - 'retention-days': 'Ημέρες διατήρησης', - 'sample-rate': 'Ρυθμός δειγματοληψίας', - 'sample-size': 'Μέγεθος δείγματος', - 'select-component': 'Επιλέξτε στοιχείο', - }, - message: { - 'empty-dashboard': - 'Ο πίνακας ελέγχου σας είναι κενός. Κάντε κλικ στην Επεξεργασία για να προσθέσετε το πρώτο σας στοιχείο.', - 'select-component-preview': 'Επιλέξτε ένα στοιχείο για προεπισκόπηση', - 'select-website-first': 'Επιλέξτε πρώτα έναν ιστότοπο', - }, - }, - 'en-GB': { - label: { - 'block-selector': 'Block selector', - duration: 'Duration', - good: 'Good', - 'mask-level': 'Mask level', - 'max-duration': 'Max duration', - 'needs-improvement': 'Needs improvement', - performance: 'Performance', - play: 'Play', - poor: 'Poor', - 'recorded-at': 'Recorded at', - replay: 'Replay', - 'replay-enabled': 'Replay enabled', - replays: 'Replays', - 'retention-days': 'Retention days', - 'sample-rate': 'Sample rate', - 'sample-size': 'Sample size', - 'select-component': 'Select component', - }, - message: { - 'empty-dashboard': 'Your dashboard is empty. Click Edit to add your first component.', - 'select-component-preview': 'Select a component to preview', - 'select-website-first': 'Select a website first', - }, - }, - 'es-ES': { - label: { - 'block-selector': 'Selector de bloque', - duration: 'Duración', - good: 'Bueno', - 'mask-level': 'Nivel de máscara', - 'max-duration': 'Duración máxima', - 'needs-improvement': 'Necesita mejora', - performance: 'Rendimiento', - play: 'Reproducir', - poor: 'Deficiente', - 'recorded-at': 'Registrado el', - replay: 'Repetición', - 'replay-enabled': 'Repetición activada', - replays: 'Repeticiones', - 'retention-days': 'Días de retención', - 'sample-rate': 'Tasa de muestreo', - 'sample-size': 'Tamaño de muestra', - 'select-component': 'Seleccionar componente', - }, - message: { - 'empty-dashboard': - 'Tu panel está vacío. Haz clic en Editar para añadir tu primer componente.', - 'select-component-preview': 'Selecciona un componente para previsualizar', - 'select-website-first': 'Selecciona un sitio web primero', - }, - }, - 'fa-IR': { - label: { - 'block-selector': 'انتخابگر بلوک', - duration: 'مدت', - good: 'خوب', - 'mask-level': 'سطح ماسک', - 'max-duration': 'حداکثر مدت', - 'needs-improvement': 'نیاز به بهبود', - performance: 'عملکرد', - play: 'پخش', - poor: 'ضعیف', - 'recorded-at': 'ثبت شده در', - replay: 'پخش مجدد', - 'replay-enabled': 'پخش مجدد فعال', - replays: 'پخش‌های مجدد', - 'retention-days': 'روزهای نگهداری', - 'sample-rate': 'نرخ نمونه‌گیری', - 'sample-size': 'اندازه نمونه', - 'select-component': 'یک کامپوننت انتخاب کنید', - }, - message: { - 'empty-dashboard': - 'داشبورد شما خالی است. روی ویرایش کلیک کنید تا اولین کامپوننت خود را اضافه کنید.', - 'select-component-preview': 'یک کامپوننت برای پیش‌نمایش انتخاب کنید', - 'select-website-first': 'ابتدا یک وب‌سایت انتخاب کنید', - }, - }, - 'fi-FI': { - label: { - 'block-selector': 'Lohkovalitsin', - duration: 'Kesto', - good: 'Hyvä', - 'mask-level': 'Maskitaso', - 'max-duration': 'Enimmäiskesto', - 'needs-improvement': 'Tarvitsee parannusta', - performance: 'Suorituskyky', - play: 'Toista', - poor: 'Huono', - 'recorded-at': 'Tallennettu', - replay: 'Toisto', - 'replay-enabled': 'Toisto käytössä', - replays: 'Toistot', - 'retention-days': 'Säilytyspäivät', - 'sample-rate': 'Näytteenottotaajuus', - 'sample-size': 'Otoskoko', - 'select-component': 'Valitse komponentti', - }, - message: { - 'empty-dashboard': - 'Koontinäyttösi on tyhjä. Napsauta Muokkaa lisätäksesi ensimmäisen komponentin.', - 'select-component-preview': 'Valitse komponentti esikatselua varten', - 'select-website-first': 'Valitse ensin verkkosivusto', - }, - }, - 'fo-FO': { - label: { - 'block-selector': 'Blokkveljari', - duration: 'Tíðarlongd', - good: 'Gott', - 'mask-level': 'Maskustig', - 'max-duration': 'Mesta tíðarlongd', - 'needs-improvement': 'Tørvar at bætast', - performance: 'Effektivni', - play: 'Spæla', - poor: 'Dårligt', - 'recorded-at': 'Upptikið tann', - replay: 'Uppspæling', - 'replay-enabled': 'Uppspæling virkjað', - replays: 'Uppspælingar', - 'retention-days': 'Geymingardagar', - 'sample-rate': 'Samplingartiðindi', - 'sample-size': 'Samplingarstødd', - 'select-component': 'Vel eina íhlut', - }, - message: { - 'empty-dashboard': - 'Stjórnarborðið títt er tómt. Trýst á Rætta fyri at leggja afturat fyrstu íhlut.', - 'select-component-preview': 'Vel eina íhlut at forskoða', - 'select-website-first': 'Vel fyrst eina heimasíðu', - }, - }, - 'fr-FR': { - label: { - 'block-selector': 'Sélecteur de bloc', - duration: 'Durée', - good: 'Bon', - 'mask-level': 'Niveau de masque', - 'max-duration': 'Durée maximale', - 'needs-improvement': 'Doit être amélioré', - performance: 'Performance', - play: 'Lire', - poor: 'Mauvais', - 'recorded-at': 'Enregistré le', - replay: 'Relecture', - 'replay-enabled': 'Relecture activée', - replays: 'Relectures', - 'retention-days': 'Jours de rétention', - 'sample-rate': "Taux d'échantillonnage", - 'sample-size': "Taille de l'échantillon", - 'select-component': 'Sélectionner un composant', - }, - message: { - 'empty-dashboard': - 'Votre tableau de bord est vide. Cliquez sur Modifier pour ajouter votre premier composant.', - 'select-component-preview': 'Sélectionnez un composant pour le prévisualiser', - 'select-website-first': "Sélectionnez d'abord un site web", - }, - }, - 'ga-ES': { - label: { - 'block-selector': 'Selector de bloque', - duration: 'Duración', - good: 'Bo', - 'mask-level': 'Nivel de máscara', - 'max-duration': 'Duración máxima', - 'needs-improvement': 'Necesita mellora', - performance: 'Rendemento', - play: 'Reproducir', - poor: 'Deficiente', - 'recorded-at': 'Rexistrado en', - replay: 'Reprodución', - 'replay-enabled': 'Reprodución activada', - replays: 'Reproducións', - 'retention-days': 'Días de retención', - 'sample-rate': 'Taxa de mostraxe', - 'sample-size': 'Tamaño da mostra', - 'select-component': 'Seleccionar compoñente', - }, - message: { - 'empty-dashboard': - 'O teu panel está baleiro. Fai clic en Editar para engadir o teu primeiro compoñente.', - 'select-component-preview': 'Selecciona un compoñente para previsualizar', - 'select-website-first': 'Selecciona primeiro un sitio web', - }, - }, - 'he-IL': { - label: { - 'block-selector': 'בוחר בלוק', - duration: 'משך', - good: 'טוב', - 'mask-level': 'רמת מסיכה', - 'max-duration': 'משך מקסימלי', - 'needs-improvement': 'דרוש שיפור', - performance: 'ביצועים', - play: 'הפעל', - poor: 'גרוע', - 'recorded-at': 'הוקלט ב', - replay: 'הקלטה חוזרת', - 'replay-enabled': 'הקלטה חוזרת מופעלת', - replays: 'הקלטות חוזרות', - 'retention-days': 'ימי שמירה', - 'sample-rate': 'קצב דגימה', - 'sample-size': 'גודל מדגם', - 'select-component': 'בחר רכיב', - }, - message: { - 'empty-dashboard': 'לוח המחוונים שלך ריק. לחץ על עריכה כדי להוסיף את הרכיב הראשון שלך.', - 'select-component-preview': 'בחר רכיב לתצוגה מקדימה', - 'select-website-first': 'בחר תחילה אתר אינטרנט', - }, - }, - 'hi-IN': { - label: { - 'block-selector': 'ब्लॉक चयनकर्ता', - duration: 'अवधि', - good: 'अच्छा', - 'mask-level': 'मास्क स्तर', - 'max-duration': 'अधिकतम अवधि', - 'needs-improvement': 'सुधार की आवश्यकता है', - performance: 'प्रदर्शन', - play: 'चलाएं', - poor: 'खराब', - 'recorded-at': 'रिकॉर्ड किया गया', - replay: 'रीप्ले', - 'replay-enabled': 'रीप्ले सक्षम', - replays: 'रीप्ले', - 'retention-days': 'प्रतिधारण दिन', - 'sample-rate': 'नमूना दर', - 'sample-size': 'नमूना आकार', - 'select-component': 'घटक चुनें', - }, - message: { - 'empty-dashboard': - 'आपका डैशबोर्ड खाली है। अपना पहला घटक जोड़ने के लिए संपादित करें पर क्लिक करें।', - 'select-component-preview': 'पूर्वावलोकन के लिए एक घटक चुनें', - 'select-website-first': 'पहले एक वेबसाइट चुनें', - }, - }, - 'hr-HR': { - label: { - 'block-selector': 'Odabir bloka', - duration: 'Trajanje', - good: 'Dobro', - 'mask-level': 'Razina maske', - 'max-duration': 'Maksimalno trajanje', - 'needs-improvement': 'Treba poboljšanje', - performance: 'Performanse', - play: 'Reproduciraj', - poor: 'Loše', - 'recorded-at': 'Snimljeno u', - replay: 'Ponovna reprodukcija', - 'replay-enabled': 'Ponovna reprodukcija omogućena', - replays: 'Ponovne reprodukcije', - 'retention-days': 'Dani zadržavanja', - 'sample-rate': 'Stopa uzorkovanja', - 'sample-size': 'Veličina uzorka', - 'select-component': 'Odaberite komponentu', - }, - message: { - 'empty-dashboard': - 'Vaša nadzorna ploča je prazna. Kliknite Uredi da dodate prvu komponentu.', - 'select-component-preview': 'Odaberite komponentu za pregled', - 'select-website-first': 'Prvo odaberite web stranicu', - }, - }, - 'hu-HU': { - label: { - 'block-selector': 'Blokk kiválasztó', - duration: 'Időtartam', - good: 'Jó', - 'mask-level': 'Maszkolási szint', - 'max-duration': 'Maximális időtartam', - 'needs-improvement': 'Fejlesztésre szorul', - performance: 'Teljesítmény', - play: 'Lejátszás', - poor: 'Gyenge', - 'recorded-at': 'Rögzítve', - replay: 'Visszajátszás', - 'replay-enabled': 'Visszajátszás engedélyezve', - replays: 'Visszajátszások', - 'retention-days': 'Megőrzési napok', - 'sample-rate': 'Mintavételi arány', - 'sample-size': 'Mintaméret', - 'select-component': 'Válasszon komponenst', - }, - message: { - 'empty-dashboard': - 'Az irányítópult üres. Kattintson a Szerkesztés gombra az első komponens hozzáadásához.', - 'select-component-preview': 'Válasszon egy komponenst az előnézethez', - 'select-website-first': 'Először válasszon egy webhelyet', - }, - }, - 'id-ID': { - label: { - 'block-selector': 'Pemilih blok', - duration: 'Durasi', - good: 'Baik', - 'mask-level': 'Tingkat masker', - 'max-duration': 'Durasi maksimal', - 'needs-improvement': 'Perlu perbaikan', - performance: 'Kinerja', - play: 'Putar', - poor: 'Buruk', - 'recorded-at': 'Direkam pada', - replay: 'Pemutaran ulang', - 'replay-enabled': 'Pemutaran ulang diaktifkan', - replays: 'Pemutaran ulang', - 'retention-days': 'Hari penyimpanan', - 'sample-rate': 'Laju sampel', - 'sample-size': 'Ukuran sampel', - 'select-component': 'Pilih komponen', - }, - message: { - 'empty-dashboard': 'Dasbor Anda kosong. Klik Edit untuk menambahkan komponen pertama Anda.', - 'select-component-preview': 'Pilih komponen untuk pratinjau', - 'select-website-first': 'Pilih situs web terlebih dahulu', - }, - }, - 'it-IT': { - label: { - 'block-selector': 'Selettore di blocco', - duration: 'Durata', - good: 'Buono', - 'mask-level': 'Livello di maschera', - 'max-duration': 'Durata massima', - 'needs-improvement': 'Necessita miglioramento', - performance: 'Prestazioni', - play: 'Riproduci', - poor: 'Scarso', - 'recorded-at': 'Registrato il', - replay: 'Replay', - 'replay-enabled': 'Replay abilitato', - replays: 'Replay', - 'retention-days': 'Giorni di conservazione', - 'sample-rate': 'Frequenza di campionamento', - 'sample-size': 'Dimensione del campione', - 'select-component': 'Seleziona componente', - }, - message: { - 'empty-dashboard': - 'La tua dashboard è vuota. Fai clic su Modifica per aggiungere il tuo primo componente.', - 'select-component-preview': "Seleziona un componente per l'anteprima", - 'select-website-first': 'Seleziona prima un sito web', - }, - }, - 'ja-JP': { - label: { - 'block-selector': 'ブロックセレクター', - duration: '継続時間', - good: '良好', - 'mask-level': 'マスクレベル', - 'max-duration': '最大継続時間', - 'needs-improvement': '改善が必要', - performance: 'パフォーマンス', - play: '再生', - poor: '不良', - 'recorded-at': '記録日時', - replay: 'リプレイ', - 'replay-enabled': 'リプレイを有効化', - replays: 'リプレイ', - 'retention-days': '保存期間', - 'sample-rate': 'サンプリングレート', - 'sample-size': 'サンプルサイズ', - 'select-component': 'コンポーネントを選択', - }, - message: { - 'empty-dashboard': - 'ダッシュボードは空です。編集をクリックして最初のコンポーネントを追加してください。', - 'select-component-preview': 'プレビューするコンポーネントを選択してください', - 'select-website-first': '最初にウェブサイトを選択してください', - }, - }, - 'km-KH': { - label: { - 'block-selector': 'ឧបករណ៍ជ្រើសរើសប្លុក', - duration: 'រយៈពេល', - good: 'ល្អ', - 'mask-level': 'កម្រិតម៉ាស', - 'max-duration': 'រយៈពេលអតិបរមា', - 'needs-improvement': 'ត្រូវការកែប្រែ', - performance: 'ប្រសិទ្ធភាព', - play: 'លេង', - poor: 'ខ្សោយ', - 'recorded-at': 'ថត​នៅ', - replay: 'ចាក់ឡើងវិញ', - 'replay-enabled': 'បើកការចាក់ឡើងវិញ', - replays: 'ការចាក់ឡើងវិញ', - 'retention-days': 'ថ្ងៃរក្សាទុក', - 'sample-rate': 'អត្រាគំរូ', - 'sample-size': 'ទំហំគំរូ', - 'select-component': 'ជ្រើសរើសធាតុ', - }, - message: { - 'empty-dashboard': - 'ផ្ទាំងគ្រប់គ្រងរបស់អ្នកទទេ។ ចុចកែសម្រួលដើម្បីបន្ថែមធាតុដំបូងរបស់អ្នក។', - 'select-component-preview': 'ជ្រើសរើសធាតុមួយដើម្បីមើលជាមុន', - 'select-website-first': 'ជ្រើសរើសគេហទំព័រជាមុន', - }, - }, - 'ko-KR': { - label: { - 'block-selector': '블록 선택기', - duration: '재생 시간', - good: '좋음', - 'mask-level': '마스크 수준', - 'max-duration': '최대 재생 시간', - 'needs-improvement': '개선 필요', - performance: '성능', - play: '재생', - poor: '나쁨', - 'recorded-at': '기록 시간', - replay: '다시보기', - 'replay-enabled': '다시보기 활성화', - replays: '다시보기', - 'retention-days': '보존 기간', - 'sample-rate': '샘플링 비율', - 'sample-size': '샘플 크기', - 'select-component': '컴포넌트 선택', - }, - message: { - 'empty-dashboard': - '대시보드가 비어 있습니다. 편집을 클릭하여 첫 번째 구성 요소를 추가하세요.', - 'select-component-preview': '미리 볼 컴포넌트를 선택하세요', - 'select-website-first': '먼저 웹사이트를 선택하세요', - }, - }, - 'lt-LT': { - label: { - 'block-selector': 'Bloko pasirinkiklis', - duration: 'Trukmė', - good: 'Gerai', - 'mask-level': 'Maskavimo lygis', - 'max-duration': 'Maksimali trukmė', - 'needs-improvement': 'Reikia tobulinti', - performance: 'Veikimas', - play: 'Leisti', - poor: 'Blogai', - 'recorded-at': 'Įrašyta', - replay: 'Pakartojimas', - 'replay-enabled': 'Pakartojimas įjungtas', - replays: 'Pakartojimai', - 'retention-days': 'Saugojimo dienos', - 'sample-rate': 'Imties dažnis', - 'sample-size': 'Imties dydis', - 'select-component': 'Pasirinkite komponentą', - }, - message: { - 'empty-dashboard': - 'Jūsų prietaisų skydelis tuščias. Spustelėkite Redaguoti, kad pridėtumėte pirmąjį komponentą.', - 'select-component-preview': 'Pasirinkite komponentą peržiūrai', - 'select-website-first': 'Pirmiausia pasirinkite svetainę', - }, - }, - 'mn-MN': { - label: { - 'block-selector': 'Блок сонгогч', - duration: 'Хугацаа', - good: 'Сайн', - 'mask-level': 'Маскийн түвшин', - 'max-duration': 'Хамгийн их хугацаа', - 'needs-improvement': 'Сайжруулалт шаардлагатай', - performance: 'Гүйцэтгэл', - play: 'Тоглуулах', - poor: 'Муу', - 'recorded-at': 'Бичигдсэн огноо', - replay: 'Дахин тоглуулах', - 'replay-enabled': 'Дахин тоглуулах идэвхжүүлсэн', - replays: 'Дахин тоглуулах', - 'retention-days': 'Хадгалалтын өдрүүд', - 'sample-rate': 'Дээжлэлтийн хурд', - 'sample-size': 'Дээжний хэмжээ', - 'select-component': 'Бүрэлдэхүүн хэсэг сонгох', - }, - message: { - 'empty-dashboard': - 'Таны хяналтын самбар хоосон байна. Эхний бүрэлдэхүүн хэсгийг нэмэхийн тулд Засах дарна уу.', - 'select-component-preview': 'Урьдчилан харахын тулд бүрэлдэхүүн хэсэг сонгоно уу', - 'select-website-first': 'Эхлээд вэб сайт сонгоно уу', - }, - }, - 'ms-MY': { - label: { - 'block-selector': 'Pemilih blok', - duration: 'Tempoh', - good: 'Baik', - 'mask-level': 'Tahap pelindung', - 'max-duration': 'Tempoh maksimum', - 'needs-improvement': 'Perlu penambahbaikan', - performance: 'Prestasi', - play: 'Main', - poor: 'Lemah', - 'recorded-at': 'Direkodkan pada', - replay: 'Main semula', - 'replay-enabled': 'Main semula diaktifkan', - replays: 'Main semula', - 'retention-days': 'Hari penyimpanan', - 'sample-rate': 'Kadar pensampelan', - 'sample-size': 'Saiz sampel', - 'select-component': 'Pilih komponen', - }, - message: { - 'empty-dashboard': - 'Papan pemuka anda kosong. Klik Edit untuk menambah komponen pertama anda.', - 'select-component-preview': 'Pilih komponen untuk pratonton', - 'select-website-first': 'Pilih laman web dahulu', - }, - }, - 'my-MM': { - label: { - 'block-selector': 'ဘလောက် ရွေးချယ်မှု', - duration: 'ကြာချိန်', - good: 'ကောင်း', - 'mask-level': 'နှုတ်ဖုံးအဆင့်', - 'max-duration': 'အများဆုံး ကြာချိန်', - 'needs-improvement': 'တိုးတက်မှု လိုအပ်', - performance: 'စွမ်းဆောင်ရည်', - play: 'ဖွင့်မည်', - poor: 'ညံ့', - 'recorded-at': 'မှတ်တမ်းတင်ချိန်', - replay: 'ပြန်ဖွင့်ခြင်း', - 'replay-enabled': 'ပြန်ဖွင့်ခြင်း ဖွင့်ထားသည်', - replays: 'ပြန်ဖွင့်ခြင်းများ', - 'retention-days': 'သိမ်းဆည်းရက်', - 'sample-rate': 'နမူနာနှုန်း', - 'sample-size': 'နမူနာအရွယ်အစား', - 'select-component': 'အစိတ်အပိုင်း ရွေးချယ်ပါ', - }, - message: { - 'empty-dashboard': - 'သင်၏ ဒက်ရ်ဘုတ် ဗလာဖြစ်နေသည်။ ပထမဆုံး အစိတ်အပိုင်း ထည့်ရန် တည်းဖြတ်ကို နှိပ်ပါ။', - 'select-component-preview': 'အစိတ်အပိုင်းတစ်ခု ရွေးချယ်၍ ကြိုကြည့်ပါ', - 'select-website-first': 'ဦးစွာ ဝဘ်ဆိုက်တစ်ခု ရွေးချယ်ပါ', - }, - }, - 'nb-NO': { - label: { - 'block-selector': 'Blokkvelger', - duration: 'Varighet', - good: 'God', - 'mask-level': 'Maskenivå', - 'max-duration': 'Maksimal varighet', - 'needs-improvement': 'Trenger forbedring', - performance: 'Ytelse', - play: 'Spill av', - poor: 'Dårlig', - 'recorded-at': 'Registrert den', - replay: 'Avspilling', - 'replay-enabled': 'Avspilling aktivert', - replays: 'Avspillinger', - 'retention-days': 'Oppbevaringsdager', - 'sample-rate': 'Samplingsfrekvens', - 'sample-size': 'Utvalgsstørrelse', - 'select-component': 'Velg komponent', - }, - message: { - 'empty-dashboard': - 'Dashbordet ditt er tomt. Klikk Rediger for å legge til din første komponent.', - 'select-component-preview': 'Velg en komponent for forhåndsvisning', - 'select-website-first': 'Velg et nettsted først', - }, - }, - 'nl-NL': { - label: { - 'block-selector': 'Blokselectie', - duration: 'Duur', - good: 'Goed', - 'mask-level': 'Maskeerniveau', - 'max-duration': 'Maximale duur', - 'needs-improvement': 'Verbetering nodig', - performance: 'Prestaties', - play: 'Afspelen', - poor: 'Slecht', - 'recorded-at': 'Opgenomen op', - replay: 'Herhaling', - 'replay-enabled': 'Herhaling ingeschakeld', - replays: 'Herhalingen', - 'retention-days': 'Bewaardagen', - 'sample-rate': 'Bemonsteringsfrequentie', - 'sample-size': 'Steekproefgrootte', - 'select-component': 'Component selecteren', - }, - message: { - 'empty-dashboard': - 'Uw dashboard is leeg. Klik op Bewerken om uw eerste component toe te voegen.', - 'select-component-preview': 'Selecteer een component voor een voorvertoning', - 'select-website-first': 'Selecteer eerst een website', - }, - }, - 'pl-PL': { - label: { - 'block-selector': 'Selektor bloków', - duration: 'Czas trwania', - good: 'Dobrze', - 'mask-level': 'Poziom maski', - 'max-duration': 'Maksymalny czas trwania', - 'needs-improvement': 'Wymaga poprawy', - performance: 'Wydajność', - play: 'Odtwórz', - poor: 'Słabo', - 'recorded-at': 'Nagrano o', - replay: 'Odtwarzanie', - 'replay-enabled': 'Odtwarzanie włączone', - replays: 'Odtwarzania', - 'retention-days': 'Dni przechowywania', - 'sample-rate': 'Częstotliwość próbkowania', - 'sample-size': 'Rozmiar próbki', - 'select-component': 'Wybierz komponent', - }, - message: { - 'empty-dashboard': 'Twój pulpit jest pusty. Kliknij Edytuj, aby dodać pierwszy komponent.', - 'select-component-preview': 'Wybierz komponent do podglądu', - 'select-website-first': 'Najpierw wybierz stronę internetową', - }, - }, - 'pt-BR': { - label: { - 'block-selector': 'Seletor de bloco', - duration: 'Duração', - good: 'Bom', - 'mask-level': 'Nível de máscara', - 'max-duration': 'Duração máxima', - 'needs-improvement': 'Precisa melhorar', - performance: 'Desempenho', - play: 'Reproduzir', - poor: 'Ruim', - 'recorded-at': 'Registrado em', - replay: 'Reprodução', - 'replay-enabled': 'Reprodução habilitada', - replays: 'Reproduções', - 'retention-days': 'Dias de retenção', - 'sample-rate': 'Taxa de amostragem', - 'sample-size': 'Tamanho da amostra', - 'select-component': 'Selecionar componente', - }, - message: { - 'empty-dashboard': - 'Seu painel está vazio. Clique em Editar para adicionar seu primeiro componente.', - 'select-component-preview': 'Selecione um componente para visualizar', - 'select-website-first': 'Selecione um site primeiro', - }, - }, - 'pt-PT': { - label: { - 'block-selector': 'Seletor de bloco', - duration: 'Duração', - good: 'Bom', - 'mask-level': 'Nível de máscara', - 'max-duration': 'Duração máxima', - 'needs-improvement': 'Precisa de melhoria', - performance: 'Desempenho', - play: 'Reproduzir', - poor: 'Mau', - 'recorded-at': 'Registado em', - replay: 'Reprodução', - 'replay-enabled': 'Reprodução ativada', - replays: 'Reproduções', - 'retention-days': 'Dias de retenção', - 'sample-rate': 'Taxa de amostragem', - 'sample-size': 'Tamanho da amostra', - 'select-component': 'Selecionar componente', - }, - message: { - 'empty-dashboard': - 'O seu painel está vazio. Clique em Editar para adicionar o seu primeiro componente.', - 'select-component-preview': 'Selecione um componente para pré-visualizar', - 'select-website-first': 'Selecione primeiro um site', - }, - }, - 'ro-RO': { - label: { - 'block-selector': 'Selector de bloc', - duration: 'Durată', - good: 'Bun', - 'mask-level': 'Nivel mască', - 'max-duration': 'Durată maximă', - 'needs-improvement': 'Are nevoie de îmbunătățiri', - performance: 'Performanță', - play: 'Redă', - poor: 'Slab', - 'recorded-at': 'Înregistrat la', - replay: 'Reluare', - 'replay-enabled': 'Reluare activată', - replays: 'Reluări', - 'retention-days': 'Zile de păstrare', - 'sample-rate': 'Rată de eșantionare', - 'sample-size': 'Dimensiunea eșantionului', - 'select-component': 'Selectați componenta', - }, - message: { - 'empty-dashboard': - 'Tabloul de bord este gol. Faceți clic pe Editare pentru a adăuga primul component.', - 'select-component-preview': 'Selectați o componentă pentru previzualizare', - 'select-website-first': 'Selectați mai întâi un site web', - }, - }, - 'ru-RU': { - label: { - 'block-selector': 'Выбор блока', - duration: 'Длительность', - good: 'Хорошо', - 'mask-level': 'Уровень маскировки', - 'max-duration': 'Максимальная длительность', - 'needs-improvement': 'Требует улучшения', - performance: 'Производительность', - play: 'Воспроизвести', - poor: 'Плохо', - 'recorded-at': 'Записано', - replay: 'Запись сессии', - 'replay-enabled': 'Запись сессий включена', - replays: 'Записи сессий', - 'retention-days': 'Дни хранения', - 'sample-rate': 'Частота выборки', - 'sample-size': 'Размер выборки', - 'select-component': 'Выберите компонент', - }, - message: { - 'empty-dashboard': - 'Ваша панель управления пуста. Нажмите Изменить, чтобы добавить первый компонент.', - 'select-component-preview': 'Выберите компонент для предпросмотра', - 'select-website-first': 'Сначала выберите сайт', - }, - }, - 'si-LK': { - label: { - 'block-selector': 'කොටස් තෝරනය', - duration: 'කාලය', - good: 'හොඳ', - 'mask-level': 'මාස් මට්ටම', - 'max-duration': 'උපරිම කාලය', - 'needs-improvement': 'වැඩිදියුණු කිරීම අවශ්‍ය', - performance: 'කාර්යක්ෂමතාව', - play: 'ධාවනය කරන්න', - poor: 'දුර්වල', - 'recorded-at': 'පටිගත කළේ', - replay: 'නැවත ධාවනය', - 'replay-enabled': 'නැවත ධාවනය සක්‍රිය', - replays: 'නැවත ධාවනයන්', - 'retention-days': 'රඳවා ගැනීමේ දින', - 'sample-rate': 'සාම්පල් අනුපාතය', - 'sample-size': 'සාම්පල් ප්‍රමාණය', - 'select-component': 'කොටසක් තෝරන්න', - }, - message: { - 'empty-dashboard': - 'ඔබේ ඩැෂ්බෝඩ් හිස් ය. ඔබේ පළමු කොටස එක් කිරීමට සංස්කරණය ක්ලික් කරන්න.', - 'select-component-preview': 'පෙරදසුනක් සඳහා කොටසක් තෝරන්න', - 'select-website-first': 'පළමුව වෙබ් අඩවියක් තෝරන්න', - }, - }, - 'sk-SK': { - label: { - 'block-selector': 'Výber bloku', - duration: 'Trvanie', - good: 'Dobré', - 'mask-level': 'Úroveň masky', - 'max-duration': 'Maximálne trvanie', - 'needs-improvement': 'Vyžaduje zlepšenie', - performance: 'Výkon', - play: 'Prehrať', - poor: 'Zlé', - 'recorded-at': 'Zaznamenané', - replay: 'Prehrávanie', - 'replay-enabled': 'Prehrávanie povolené', - replays: 'Prehrávanie', - 'retention-days': 'Dni uchovávania', - 'sample-rate': 'Frekvencia vzorkovania', - 'sample-size': 'Veľkosť vzorky', - 'select-component': 'Vyberte komponent', - }, - message: { - 'empty-dashboard': - 'Váš dashboard je prázdny. Kliknite na Upraviť a pridajte prvý komponent.', - 'select-component-preview': 'Vyberte komponent na náhľad', - 'select-website-first': 'Najprv vyberte webovú stránku', - }, - }, - 'sl-SI': { - label: { - 'block-selector': 'Izbirnik blokov', - duration: 'Trajanje', - good: 'Dobro', - 'mask-level': 'Raven maske', - 'max-duration': 'Največje trajanje', - 'needs-improvement': 'Potrebuje izboljšave', - performance: 'Zmogljivost', - play: 'Predvajaj', - poor: 'Slabo', - 'recorded-at': 'Zabeleženo ob', - replay: 'Predvajanje', - 'replay-enabled': 'Predvajanje omogočeno', - replays: 'Predvajanja', - 'retention-days': 'Dni hrambe', - 'sample-rate': 'Hitrost vzorčenja', - 'sample-size': 'Velikost vzorca', - 'select-component': 'Izberite komponento', - }, - message: { - 'empty-dashboard': - 'Vaša nadzorna plošča je prazna. Kliknite Uredi, da dodate svojo prvo komponento.', - 'select-component-preview': 'Izberite komponento za predogled', - 'select-website-first': 'Najprej izberite spletno mesto', - }, - }, - 'sv-SE': { - label: { - 'block-selector': 'Blockväljare', - duration: 'Varaktighet', - good: 'Bra', - 'mask-level': 'Masknivå', - 'max-duration': 'Maximal varaktighet', - 'needs-improvement': 'Behöver förbättring', - performance: 'Prestanda', - play: 'Spela upp', - poor: 'Dålig', - 'recorded-at': 'Registrerad den', - replay: 'Uppspelning', - 'replay-enabled': 'Uppspelning aktiverad', - replays: 'Uppspelningar', - 'retention-days': 'Lagringsdagar', - 'sample-rate': 'Samplingshastighet', - 'sample-size': 'Urvalsstorlek', - 'select-component': 'Välj komponent', - }, - message: { - 'empty-dashboard': - 'Din instrumentpanel är tom. Klicka på Redigera för att lägga till din första komponent.', - 'select-component-preview': 'Välj en komponent för att förhandsgranska', - 'select-website-first': 'Välj en webbplats först', - }, - }, - 'ta-IN': { - label: { - 'block-selector': 'தொகுதி தேர்வி', - duration: 'கால அளவு', - good: 'நல்லது', - 'mask-level': 'முகமூடி நிலை', - 'max-duration': 'அதிகபட்ச கால அளவு', - 'needs-improvement': 'மேம்பாடு தேவை', - performance: 'செயல்திறன்', - play: 'இயக்கு', - poor: 'மோசம்', - 'recorded-at': 'பதிவுசெய்த நேரம்', - replay: 'மறுபடியும் இயக்கு', - 'replay-enabled': 'மறுபடியும் இயக்கு இயக்கப்பட்டது', - replays: 'மறுபடியும் இயக்குதல்கள்', - 'retention-days': 'தக்கவைப்பு நாட்கள்', - 'sample-rate': 'மாதிரி விகிதம்', - 'sample-size': 'மாதிரி அளவு', - 'select-component': 'ஒரு கூறு தேர்ந்தெடுக்கவும்', - }, - message: { - 'empty-dashboard': - 'உங்கள் டாஷ்போர்டு காலியாக உள்ளது. உங்கள் முதல் கூறை சேர்க்க திருத்து கிளிக் செய்யுங்கள்.', - 'select-component-preview': 'முன்னோட்டம் பார்க்க ஒரு கூறு தேர்ந்தெடுக்கவும்', - 'select-website-first': 'முதலில் ஒரு வலைத்தளம் தேர்ந்தெடுக்கவும்', - }, - }, - 'th-TH': { - label: { - 'block-selector': 'ตัวเลือกบล็อก', - duration: 'ระยะเวลา', - good: 'ดี', - 'mask-level': 'ระดับมาสก์', - 'max-duration': 'ระยะเวลาสูงสุด', - 'needs-improvement': 'ต้องปรับปรุง', - performance: 'ประสิทธิภาพ', - play: 'เล่น', - poor: 'แย่', - 'recorded-at': 'บันทึกเมื่อ', - replay: 'เล่นซ้ำ', - 'replay-enabled': 'เปิดใช้งานการเล่นซ้ำ', - replays: 'การเล่นซ้ำ', - 'retention-days': 'วันที่เก็บข้อมูล', - 'sample-rate': 'อัตราการสุ่มตัวอย่าง', - 'sample-size': 'ขนาดตัวอย่าง', - 'select-component': 'เลือกส่วนประกอบ', - }, - message: { - 'empty-dashboard': 'แดชบอร์ดของคุณว่างเปล่า คลิกแก้ไขเพื่อเพิ่มส่วนประกอบแรก', - 'select-component-preview': 'เลือกส่วนประกอบเพื่อดูตัวอย่าง', - 'select-website-first': 'เลือกเว็บไซต์ก่อน', - }, - }, - 'tr-TR': { - label: { - 'block-selector': 'Blok seçici', - duration: 'Süre', - good: 'İyi', - 'mask-level': 'Maske seviyesi', - 'max-duration': 'Maksimum süre', - 'needs-improvement': 'İyileştirme gerekiyor', - performance: 'Performans', - play: 'Oynat', - poor: 'Kötü', - 'recorded-at': 'Kaydedildi', - replay: 'Tekrar oynatma', - 'replay-enabled': 'Tekrar oynatma etkin', - replays: 'Tekrar oynatmalar', - 'retention-days': 'Saklama günleri', - 'sample-rate': 'Örnekleme hızı', - 'sample-size': 'Örneklem boyutu', - 'select-component': 'Bileşen seçin', - }, - message: { - 'empty-dashboard': - "Gösterge paneliniz boş. İlk bileşeninizi eklemek için Düzenle'ye tıklayın.", - 'select-component-preview': 'Önizleme için bir bileşen seçin', - 'select-website-first': 'Önce bir web sitesi seçin', - }, - }, - 'uk-UA': { - label: { - 'block-selector': 'Вибір блоку', - duration: 'Тривалість', - good: 'Добре', - 'mask-level': 'Рівень маскування', - 'max-duration': 'Максимальна тривалість', - 'needs-improvement': 'Потребує покращення', - performance: 'Продуктивність', - play: 'Відтворити', - poor: 'Погано', - 'recorded-at': 'Записано о', - replay: 'Відтворення', - 'replay-enabled': 'Відтворення увімкнено', - replays: 'Відтворення', - 'retention-days': 'Дні зберігання', - 'sample-rate': 'Частота вибірки', - 'sample-size': 'Розмір вибірки', - 'select-component': 'Виберіть компонент', - }, - message: { - 'empty-dashboard': - 'Ваша панель інструментів порожня. Натисніть Редагувати, щоб додати перший компонент.', - 'select-component-preview': 'Виберіть компонент для попереднього перегляду', - 'select-website-first': 'Спочатку виберіть веб-сайт', - }, - }, - 'ur-PK': { - label: { - 'block-selector': 'بلاک منتخب کنندہ', - duration: 'مدت', - good: 'اچھا', - 'mask-level': 'ماسک کی سطح', - 'max-duration': 'زیادہ سے زیادہ مدت', - 'needs-improvement': 'بہتری کی ضرورت ہے', - performance: 'کارکردگی', - play: 'چلائیں', - poor: 'خراب', - 'recorded-at': 'ریکارڈ کیا گیا', - replay: 'دوبارہ چلائیں', - 'replay-enabled': 'دوبارہ چلانا فعال', - replays: 'دوبارہ چلانے', - 'retention-days': 'برقراری کے دن', - 'sample-rate': 'نمونہ کی شرح', - 'sample-size': 'نمونے کا حجم', - 'select-component': 'اجزاء منتخب کریں', - }, - message: { - 'empty-dashboard': - 'آپ کا ڈیش بورڈ خالی ہے۔ اپنا پہلا جزو شامل کرنے کے لیے ترمیم پر کلک کریں۔', - 'select-component-preview': 'پیش نظارہ کے لیے ایک جزو منتخب کریں', - 'select-website-first': 'پہلے ایک ویب سائٹ منتخب کریں', - }, - }, - 'uz-UZ': { - label: { - 'block-selector': 'Blok tanlash', - duration: 'Davomiylik', - good: 'Yaxshi', - 'mask-level': 'Niqob darajasi', - 'max-duration': 'Maksimal davomiylik', - 'needs-improvement': 'Yaxshilash kerak', - performance: 'Ishlash', - play: 'Ijro etish', - poor: 'Yomon', - 'recorded-at': 'Yozib olingan', - replay: 'Qayta ijro', - 'replay-enabled': 'Qayta ijro yoqilgan', - replays: 'Qayta ijrolar', - 'retention-days': 'Saqlash kunlari', - 'sample-rate': 'Namuna olish tezligi', - 'sample-size': 'Namuna hajmi', - 'select-component': 'Komponent tanlash', - }, - message: { - 'empty-dashboard': - "Sizning boshqaruv panelingiz bo'sh. Birinchi komponentni qo'shish uchun Tahrirlash tugmasini bosing.", - 'select-component-preview': "Ko'rib chiqish uchun komponent tanlang", - 'select-website-first': 'Avval veb-sayt tanlang', - }, - }, - 'vi-VN': { - label: { - 'block-selector': 'Bộ chọn khối', - duration: 'Thời lượng', - good: 'Tốt', - 'mask-level': 'Mức che', - 'max-duration': 'Thời lượng tối đa', - 'needs-improvement': 'Cần cải thiện', - performance: 'Hiệu suất', - play: 'Phát', - poor: 'Kém', - 'recorded-at': 'Được ghi vào', - replay: 'Phát lại', - 'replay-enabled': 'Phát lại được bật', - replays: 'Phát lại', - 'retention-days': 'Ngày lưu trữ', - 'sample-rate': 'Tỷ lệ mẫu', - 'sample-size': 'Kích thước mẫu', - 'select-component': 'Chọn thành phần', - }, - message: { - 'empty-dashboard': - 'Bảng điều khiển của bạn đang trống. Nhấp Chỉnh sửa để thêm thành phần đầu tiên.', - 'select-component-preview': 'Chọn một thành phần để xem trước', - 'select-website-first': 'Chọn một trang web trước', - }, - }, - 'zh-CN': { - label: { - 'block-selector': '块选择器', - duration: '持续时间', - good: '良好', - 'mask-level': '遮罩级别', - 'max-duration': '最大持续时间', - 'needs-improvement': '需要改进', - performance: '性能', - play: '播放', - poor: '较差', - 'recorded-at': '录制于', - replay: '回放', - 'replay-enabled': '回放已启用', - replays: '回放', - 'retention-days': '保留天数', - 'sample-rate': '采样率', - 'sample-size': '样本量', - 'select-component': '选择组件', - }, - message: { - 'empty-dashboard': '您的仪表板为空。点击编辑以添加您的第一个组件。', - 'select-component-preview': '选择一个组件进行预览', - 'select-website-first': '请先选择一个网站', - }, - }, - 'zh-TW': { - label: { - 'block-selector': '區塊選擇器', - duration: '持續時間', - good: '良好', - 'mask-level': '遮罩層級', - 'max-duration': '最大持續時間', - 'needs-improvement': '需要改善', - performance: '效能', - play: '播放', - poor: '較差', - 'recorded-at': '錄製於', - replay: '回放', - 'replay-enabled': '回放已啟用', - replays: '回放', - 'retention-days': '保留天數', - 'sample-rate': '取樣率', - 'sample-size': '樣本量', - 'select-component': '選擇元件', - }, - message: { - 'empty-dashboard': '您的儀表板為空。點擊編輯以新增您的第一個元件。', - 'select-component-preview': '選擇一個元件進行預覽', - 'select-website-first': '請先選擇一個網站', - }, - }, -}; - -function insertAlphabetically(obj, newEntries) { - const merged = { ...obj, ...newEntries }; - return Object.fromEntries(Object.entries(merged).sort(([a], [b]) => a.localeCompare(b))); -} - -const files = readdirSync(messagesDir).filter( - f => f.endsWith('.json') && f !== 'en-US.json', -); - -let updated = 0; - -for (const fname of files) { - const locale = fname.replace('.json', ''); - const filePath = join(messagesDir, fname); - const data = JSON.parse(readFileSync(filePath, 'utf8')); - - const localeTranslations = translations[locale] || {}; - - // Merge universal + locale-specific label entries - const newLabelEntries = { - ...universal.label, - ...(localeTranslations.label || {}), - }; - - // Merge message entries - const newMessageEntries = localeTranslations.message || {}; - - // Only add keys that are actually missing - const missingLabels = Object.fromEntries( - Object.entries(newLabelEntries).filter(([k]) => !(k in (data.label || {}))), - ); - const missingMessages = Object.fromEntries( - Object.entries(newMessageEntries).filter(([k]) => !(k in (data.message || {}))), - ); - - if (Object.keys(missingLabels).length === 0 && Object.keys(missingMessages).length === 0) { - continue; - } - - if (Object.keys(missingLabels).length > 0) { - data.label = insertAlphabetically(data.label || {}, missingLabels); - } - if (Object.keys(missingMessages).length > 0) { - data.message = insertAlphabetically(data.message || {}, missingMessages); - } - - writeFileSync(filePath, JSON.stringify(data, null, 2) + '\n', 'utf8'); - console.log(`✓ ${fname}: added ${Object.keys(missingLabels).length} labels, ${Object.keys(missingMessages).length} messages`); - updated++; -} - -console.log(`\nDone. Updated ${updated} files.`); diff --git a/src/app/api/websites/[websiteId]/segments/[segmentId]/route.ts b/src/app/api/websites/[websiteId]/segments/[segmentId]/route.ts index b51f783bf..045125550 100644 --- a/src/app/api/websites/[websiteId]/segments/[segmentId]/route.ts +++ b/src/app/api/websites/[websiteId]/segments/[segmentId]/route.ts @@ -3,7 +3,7 @@ import { parseRequest } from '@/lib/request'; import { json, notFound, ok, unauthorized } from '@/lib/response'; import { anyObjectParam, segmentTypeParam } from '@/lib/schema'; import { canDeleteWebsite, canUpdateWebsite, canViewWebsite } from '@/permissions'; -import { deleteSegment, getSegment, updateSegment } from '@/queries/prisma'; +import { deleteSegment, getWebsiteSegment, updateSegment } from '@/queries/prisma'; export async function GET( request: Request, @@ -17,12 +17,16 @@ export async function GET( const { websiteId, segmentId } = await params; - const segment = await getSegment(segmentId); - - if (websiteId && !(await canViewWebsite(auth, websiteId))) { + if (!(await canViewWebsite(auth, websiteId))) { return unauthorized(); } + const segment = await getWebsiteSegment(websiteId, segmentId); + + if (!segment) { + return notFound(); + } + return json(segment); } @@ -45,16 +49,16 @@ export async function POST( const { websiteId, segmentId } = await params; const { type, name, parameters } = body; - const segment = await getSegment(segmentId); + if (!(await canUpdateWebsite(auth, websiteId))) { + return unauthorized(); + } + + const segment = await getWebsiteSegment(websiteId, segmentId); if (!segment) { return notFound(); } - if (!(await canUpdateWebsite(auth, websiteId))) { - return unauthorized(); - } - const result = await updateSegment(segmentId, { type, name, @@ -76,16 +80,16 @@ export async function DELETE( const { websiteId, segmentId } = await params; - const segment = await getSegment(segmentId); + if (!(await canDeleteWebsite(auth, websiteId))) { + return unauthorized(); + } + + const segment = await getWebsiteSegment(websiteId, segmentId); if (!segment) { return notFound(); } - if (!(await canDeleteWebsite(auth, websiteId))) { - return unauthorized(); - } - await deleteSegment(segmentId); return ok();