mirror of
https://github.com/NodeBB/NodeBB.git
synced 2026-06-22 13:59:39 +02:00
Merge commit '2a00b0e973ca6f2d04482f037afda5bc7a22b6b3' into v1.13.x
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -67,3 +67,4 @@ test/files/normalise.jpg.png
|
||||
test/files/normalise-resized.jpg
|
||||
package-lock.json
|
||||
/package.json
|
||||
*.mongodb
|
||||
@@ -65,7 +65,7 @@
|
||||
"ipaddr.js": "^1.9.1",
|
||||
"jquery": "3.5.1",
|
||||
"jsesc": "3.0.1",
|
||||
"json-2-csv": "^3.6.2",
|
||||
"json2csv": "5.0.1",
|
||||
"jsonwebtoken": "^8.5.1",
|
||||
"less": "^3.11.1",
|
||||
"lodash": "^4.17.15",
|
||||
@@ -79,7 +79,7 @@
|
||||
"mousetrap": "^1.6.5",
|
||||
"@nodebb/mubsub": "^1.6.0",
|
||||
"nconf": "^0.10.0",
|
||||
"nodebb-plugin-composer-default": "6.3.28",
|
||||
"nodebb-plugin-composer-default": "6.3.29",
|
||||
"nodebb-plugin-dbsearch": "4.0.7",
|
||||
"nodebb-plugin-emoji": "^3.3.0",
|
||||
"nodebb-plugin-emoji-android": "2.0.0",
|
||||
@@ -98,7 +98,7 @@
|
||||
"passport-local": "1.0.0",
|
||||
"pg": "^8.0.2",
|
||||
"pg-cursor": "^2.1.9",
|
||||
"postcss": "7.0.27",
|
||||
"postcss": "7.0.30",
|
||||
"postcss-clean": "1.1.0",
|
||||
"promise-polyfill": "^8.1.3",
|
||||
"prompt": "^1.0.0",
|
||||
@@ -110,7 +110,7 @@
|
||||
"sanitize-html": "^1.23.0",
|
||||
"semver": "^7.2.1",
|
||||
"serve-favicon": "^2.5.0",
|
||||
"sharp": "0.25.2",
|
||||
"sharp": "0.25.3",
|
||||
"sitemap": "^6.1.0",
|
||||
"socket.io": "2.3.0",
|
||||
"socket.io-adapter-cluster": "^1.0.1",
|
||||
|
||||
@@ -170,7 +170,7 @@
|
||||
"consent.right_to_erasure_description": "At any time, you are able to revoke your consent to data collection and/or processing by deleting your account. Your individual profile can be deleted, although your posted content will remain. If you wish to delete both your account <strong>and</strong> your content, please contact the administrative team for this website.",
|
||||
"consent.right_to_data_portability": "You have the Right to Data Portability",
|
||||
"consent.right_to_data_portability_description": "You may request from us a machine-readable export of any collected data about you and your account. You can do so by clicking the appropriate button below.",
|
||||
"consent.export_profile": "Export Profile (.csv)",
|
||||
"consent.export_profile": "Export Profile (.json)",
|
||||
"consent.export_uploads": "Export Uploaded Content (.zip)",
|
||||
"consent.export_posts": "Export Posts (.csv)"
|
||||
}
|
||||
@@ -170,7 +170,7 @@
|
||||
"consent.right_to_erasure_description": "Във всеки един момент можете да оттеглите съгласието си за събиране и/или обработка на данни, като изтриете акаунта си. Вашият профил може да бъде изтрит, но публикуваното от Вас съдържание ще остане. Ако искате да изтриете както акаунта, така <strong>и</strong> съдържанието, публикувано от Вас, моля, свържете се с администрационния екип на уеб сайта.",
|
||||
"consent.right_to_data_portability": "Имате право на пренос на данни",
|
||||
"consent.right_to_data_portability_description": "Можете да изискате от нас всички събрани за Вас и акаунта Ви данни в машинен формат. Можете да направите това като натиснете съответния бутон по-долу.",
|
||||
"consent.export_profile": "Изнасяне на профила (.csv)",
|
||||
"consent.export_profile": "Изнасяне на профила (.json)",
|
||||
"consent.export_uploads": "Изнасяне на каченото съдържание (.zip)",
|
||||
"consent.export_posts": "Изнасяне на публикациите (.csv)"
|
||||
}
|
||||
@@ -170,7 +170,7 @@
|
||||
"consent.right_to_erasure_description": "At any time, you are able to revoke your consent to data collection and/or processing by deleting your account. Your individual profile can be deleted, although your posted content will remain. If you wish to delete both your account <strong>and</strong> your content, please contact the administrative team for this website.",
|
||||
"consent.right_to_data_portability": "You have the Right to Data Portability",
|
||||
"consent.right_to_data_portability_description": "You may request from us a machine-readable export of any collected data about you and your account. You can do so by clicking the appropriate button below.",
|
||||
"consent.export_profile": "Export Profile (.csv)",
|
||||
"consent.export_profile": "Export Profile (.json)",
|
||||
"consent.export_uploads": "Export Uploaded Content (.zip)",
|
||||
"consent.export_posts": "Export Posts (.csv)"
|
||||
}
|
||||
@@ -170,7 +170,7 @@
|
||||
"consent.right_to_erasure_description": "Kdykoliv můžete změnit svůj souhlas se shromažďováním dat a/nebo zpracování odstraněním vašeho účtu. Váš profil bude odstraněn, ačkoliv vaše příspěvky budou zachovány. Pokud si přejete odstranění <strong>jak účtu tak i obsahu</strong>, prosím kontaktujte správce této stránky.",
|
||||
"consent.right_to_data_portability": "Máte právo na přenositelnost dat",
|
||||
"consent.right_to_data_portability_description": "Můžete od nás požadovat strojně čitelné data, která byla sesbírána o Vás a vašem účtu. Učiníte tak kliknutím na tlačítka zobrazená níže.",
|
||||
"consent.export_profile": "Exportovat profil (*.csv)",
|
||||
"consent.export_profile": "Export Profile (.json)",
|
||||
"consent.export_uploads": "Exportovat nahraný obsah (*.zip)",
|
||||
"consent.export_posts": "Exportovat příspěvky (*.csv)"
|
||||
}
|
||||
@@ -170,7 +170,7 @@
|
||||
"consent.right_to_erasure_description": "At any time, you are able to revoke your consent to data collection and/or processing by deleting your account. Your individual profile can be deleted, although your posted content will remain. If you wish to delete both your account <strong>and</strong> your content, please contact the administrative team for this website.",
|
||||
"consent.right_to_data_portability": "You have the Right to Data Portability",
|
||||
"consent.right_to_data_portability_description": "You may request from us a machine-readable export of any collected data about you and your account. You can do so by clicking the appropriate button below.",
|
||||
"consent.export_profile": "Export Profile (.csv)",
|
||||
"consent.export_profile": "Export Profile (.json)",
|
||||
"consent.export_uploads": "Export Uploaded Content (.zip)",
|
||||
"consent.export_posts": "Export Posts (.csv)"
|
||||
}
|
||||
@@ -2,10 +2,10 @@
|
||||
"events": "Ereignisse",
|
||||
"no-events": "Es gibt keine Ereignisse",
|
||||
"control-panel": "Ereignis-Steuerung",
|
||||
"filters": "Filters",
|
||||
"filters-apply": "Apply Filters",
|
||||
"filter-type": "Event Type",
|
||||
"filter-start": "Start Date",
|
||||
"filter-end": "End Date",
|
||||
"filter-perPage": "Per Page"
|
||||
"filters": "Filter",
|
||||
"filters-apply": "Filter anwenden",
|
||||
"filter-type": "Ereignistyp",
|
||||
"filter-start": "Start-Datum",
|
||||
"filter-end": "End-Datum",
|
||||
"filter-perPage": "Pro Seite"
|
||||
}
|
||||
@@ -170,7 +170,7 @@
|
||||
"consent.right_to_erasure_description": "Du kannst deine Zustimmung zur Datensammlung und/oder Verarbeitung von Daten jederzeit widerrufen, indem du dein Konto löschst. Dein Individuelles Profil kann gelöscht werden, jedoch blieben deine Beiträge und sonstigen Inhalte. Wenn du sowohl dein Konto <strong>sowie auch</strong> deine Inhalten löschen willst, kontaktiere bitte die Administratoren dieser Seite.",
|
||||
"consent.right_to_data_portability": "Du hast das Recht auf Datenportabilität",
|
||||
"consent.right_to_data_portability_description": "Du kannst von uns eine Maschinen-Lesbare Datei von jeglichen gesammelten Daten von dir und deinem Konto anfordern, indem du unten auf den entsprechenden Knopf drückst. ",
|
||||
"consent.export_profile": "Profil exportieren (.csv)",
|
||||
"consent.export_profile": "Export Profile (.json)",
|
||||
"consent.export_uploads": "Hochgeladene Dateien exportieren (.zip)",
|
||||
"consent.export_posts": "Beiträge exportieren (.csv)"
|
||||
}
|
||||
@@ -170,7 +170,7 @@
|
||||
"consent.right_to_erasure_description": "At any time, you are able to revoke your consent to data collection and/or processing by deleting your account. Your individual profile can be deleted, although your posted content will remain. If you wish to delete both your account <strong>and</strong> your content, please contact the administrative team for this website.",
|
||||
"consent.right_to_data_portability": "You have the Right to Data Portability",
|
||||
"consent.right_to_data_portability_description": "You may request from us a machine-readable export of any collected data about you and your account. You can do so by clicking the appropriate button below.",
|
||||
"consent.export_profile": "Export Profile (.csv)",
|
||||
"consent.export_profile": "Export Profile (.json)",
|
||||
"consent.export_uploads": "Export Uploaded Content (.zip)",
|
||||
"consent.export_posts": "Export Posts (.csv)"
|
||||
}
|
||||
@@ -191,7 +191,7 @@
|
||||
"consent.right_to_data_portability": "You have the Right to Data Portability",
|
||||
"consent.right_to_data_portability_description": "You may request from us a machine-readable export of any collected data about you and your account. You can do so by clicking the appropriate button below.",
|
||||
|
||||
"consent.export_profile": "Export Profile (.csv)",
|
||||
"consent.export_profile": "Export Profile (.json)",
|
||||
"consent.export_uploads": "Export Uploaded Content (.zip)",
|
||||
"consent.export_posts": "Export Posts (.csv)"
|
||||
}
|
||||
|
||||
@@ -170,7 +170,7 @@
|
||||
"consent.right_to_erasure_description": "At any time, you are able to revoke your consent to data collection and/or processing by deleting your account. Your individual profile can be deleted, although your posted content will remain. If you wish to delete both your account <strong>and</strong> your content, please contact the administrative team for this website.",
|
||||
"consent.right_to_data_portability": "You have the Right to Data Portability",
|
||||
"consent.right_to_data_portability_description": "You may request from us a machine-readable export of any collected data about you and your account. You can do so by clicking the appropriate button below.",
|
||||
"consent.export_profile": "Export Profile (.csv)",
|
||||
"consent.export_profile": "Export Profile (.json)",
|
||||
"consent.export_uploads": "Export Uploaded Content (.zip)",
|
||||
"consent.export_posts": "Export Posts (.csv)"
|
||||
}
|
||||
@@ -170,7 +170,7 @@
|
||||
"consent.right_to_erasure_description": "At any time, you are able to revoke your consent to data collection and/or processing by deleting your account. Your individual profile can be deleted, although your posted content will remain. If you wish to delete both your account <strong>and</strong> your content, please contact the administrative team for this website.",
|
||||
"consent.right_to_data_portability": "You have the Right to Data Portability",
|
||||
"consent.right_to_data_portability_description": "You may request from us a machine-readable export of any collected data about you and your account. You can do so by clicking the appropriate button below.",
|
||||
"consent.export_profile": "Export Profile (.csv)",
|
||||
"consent.export_profile": "Export Profile (.json)",
|
||||
"consent.export_uploads": "Export Uploaded Content (.zip)",
|
||||
"consent.export_posts": "Export Posts (.csv)"
|
||||
}
|
||||
@@ -170,7 +170,7 @@
|
||||
"consent.right_to_erasure_description": "En cualquier momento, usted puede revocar su consentimiento a la recolección y/o procesado de datos mediante el borrado de su cuenta. Su perfil individual puede ser borrado, aunque sus respuestas y entradas permanecerán. Si desea borrar su cuenta <strong>y</strong> el contenido (entradas, temas, respuestas...), por favor contacte el equipo administrativo de este sitio web.",
|
||||
"consent.right_to_data_portability": "Usted tiene el Derecho a la Portabilidad de Datos",
|
||||
"consent.right_to_data_portability_description": "Puede pedir de nosotros una exportación legible por máquinas de cualquier dato recolectado sobre usted y su cuenta. Puede hacerlo haciendo click en el botón apropiado abajo.",
|
||||
"consent.export_profile": "Exportar Perfil (.csv)",
|
||||
"consent.export_profile": "Export Profile (.json)",
|
||||
"consent.export_uploads": "Exportar Contenido Subido (.zip)",
|
||||
"consent.export_posts": "Exportar Entradas y Respuestas (.csv)"
|
||||
}
|
||||
@@ -170,7 +170,7 @@
|
||||
"consent.right_to_erasure_description": "At any time, you are able to revoke your consent to data collection and/or processing by deleting your account. Your individual profile can be deleted, although your posted content will remain. If you wish to delete both your account <strong>and</strong> your content, please contact the administrative team for this website.",
|
||||
"consent.right_to_data_portability": "You have the Right to Data Portability",
|
||||
"consent.right_to_data_portability_description": "You may request from us a machine-readable export of any collected data about you and your account. You can do so by clicking the appropriate button below.",
|
||||
"consent.export_profile": "Export Profile (.csv)",
|
||||
"consent.export_profile": "Export Profile (.json)",
|
||||
"consent.export_uploads": "Export Uploaded Content (.zip)",
|
||||
"consent.export_posts": "Export Posts (.csv)"
|
||||
}
|
||||
@@ -170,7 +170,7 @@
|
||||
"consent.right_to_erasure_description": "At any time, you are able to revoke your consent to data collection and/or processing by deleting your account. Your individual profile can be deleted, although your posted content will remain. If you wish to delete both your account <strong>and</strong> your content, please contact the administrative team for this website.",
|
||||
"consent.right_to_data_portability": "You have the Right to Data Portability",
|
||||
"consent.right_to_data_portability_description": "You may request from us a machine-readable export of any collected data about you and your account. You can do so by clicking the appropriate button below.",
|
||||
"consent.export_profile": "صادر کردن مشخصات کاربری (.csv)",
|
||||
"consent.export_profile": "Export Profile (.json)",
|
||||
"consent.export_uploads": "Export Uploaded Content (.zip)",
|
||||
"consent.export_posts": "Export Posts (.csv)"
|
||||
}
|
||||
@@ -170,7 +170,7 @@
|
||||
"consent.right_to_erasure_description": "At any time, you are able to revoke your consent to data collection and/or processing by deleting your account. Your individual profile can be deleted, although your posted content will remain. If you wish to delete both your account <strong>and</strong> your content, please contact the administrative team for this website.",
|
||||
"consent.right_to_data_portability": "You have the Right to Data Portability",
|
||||
"consent.right_to_data_portability_description": "You may request from us a machine-readable export of any collected data about you and your account. You can do so by clicking the appropriate button below.",
|
||||
"consent.export_profile": "Export Profile (.csv)",
|
||||
"consent.export_profile": "Export Profile (.json)",
|
||||
"consent.export_uploads": "Export Uploaded Content (.zip)",
|
||||
"consent.export_posts": "Export Posts (.csv)"
|
||||
}
|
||||
@@ -35,7 +35,7 @@
|
||||
"user_posted_to_dual": "<strong>%1</strong> et <strong>%2</strong> ont posté une réponse à : <strong>%3</strong>",
|
||||
"user_posted_to_multiple": "<strong>%1</strong> et %2 autres ont posté une réponse à : <strong>%3</strong>",
|
||||
"user_posted_topic": "<strong>%1</strong> a posté un nouveau sujet: <strong>%2</strong>.",
|
||||
"user_edited_post": "<strong>%1</strong> has edited a post in <strong>%2</strong>",
|
||||
"user_edited_post": "<strong>%1</strong> a édité un message dans <strong>%2</strong>",
|
||||
"user_started_following_you": "<strong>%1</strong> vous suit.",
|
||||
"user_started_following_you_dual": "<strong>%1</strong> et <strong>%2</strong> se sont abonnés à votre compte.",
|
||||
"user_started_following_you_multiple": "<strong>%1</strong> et %2 autres se sont abonnés à votre compte.",
|
||||
@@ -54,7 +54,7 @@
|
||||
"notificationType_upvote": "Lorsque quelqu'un a voté pour un de vos messages",
|
||||
"notificationType_new-topic": "Lorsque quelqu'un que vous suivez publie un sujet",
|
||||
"notificationType_new-reply": "Lorsqu'une nouvelle réponse est ajoutée dans un sujet que vous suivez",
|
||||
"notificationType_post-edit": "When a post is edited in a topic you are watching",
|
||||
"notificationType_post-edit": "Lorsqu'un article est modifié dans un sujet que vous regardez",
|
||||
"notificationType_follow": "Lorsque quelqu'un commence à vous suivre",
|
||||
"notificationType_new-chat": "Lorsque vous recevez un message du chat ",
|
||||
"notificationType_group-invite": "Lorsque vous recevez une invitation d'un groupe",
|
||||
|
||||
@@ -170,7 +170,7 @@
|
||||
"consent.right_to_erasure_description": "Vous pouvez à tout moment révoquer votre accord à la collecte et/ou aux traitements de données en supprimant votre compte. Votre profil individuel peut être supprimé, bien que le contenu que vous avez publié restera affiché. Si vous souhaitez supprimer à la fois votre compte <strong>et</strong> votre contenu, veuillez contacter l'équipe administrative pour ce site.",
|
||||
"consent.right_to_data_portability": "Vous avez la possibilité de portabilité des données.",
|
||||
"consent.right_to_data_portability_description": "Vous pouvez exporter de toutes vos données collectées. Vous pouvez le faire en cliquant sur le bouton ci-dessous.",
|
||||
"consent.export_profile": "Exporter votre profile (.csv)",
|
||||
"consent.export_profile": "Exporter Profile (.json)",
|
||||
"consent.export_uploads": "Exporter le contenu de vos fichiers envoyés (.zip)",
|
||||
"consent.export_posts": "Exporter vos messages (.csv)"
|
||||
}
|
||||
@@ -170,7 +170,7 @@
|
||||
"consent.right_to_erasure_description": "At any time, you are able to revoke your consent to data collection and/or processing by deleting your account. Your individual profile can be deleted, although your posted content will remain. If you wish to delete both your account <strong>and</strong> your content, please contact the administrative team for this website.",
|
||||
"consent.right_to_data_portability": "You have the Right to Data Portability",
|
||||
"consent.right_to_data_portability_description": "You may request from us a machine-readable export of any collected data about you and your account. You can do so by clicking the appropriate button below.",
|
||||
"consent.export_profile": "Export Profile (.csv)",
|
||||
"consent.export_profile": "Export Profile (.json)",
|
||||
"consent.export_uploads": "Export Uploaded Content (.zip)",
|
||||
"consent.export_posts": "Export Posts (.csv)"
|
||||
}
|
||||
@@ -170,7 +170,7 @@
|
||||
"consent.right_to_erasure_description": "בכל עת תוכל לבטל את הסכמתך לאיסוף נתונים ו / או עיבודם על ידי מחיקת חשבונך. מחיקת הפרופיל שלך לא תגרום למחיקת התוכנים שפרסמת. על מנת למחוק את חשבונך <strong> ואת </strong> התוכן המקושר לו צור קשר עם צוות הניהול של האתר.",
|
||||
"consent.right_to_data_portability": "זכותך לניוד הנתונים",
|
||||
"consent.right_to_data_portability_description": "באפרותך לבקש ייצוא של כל הנתונים שנאספו מחשבונך אודותיך. תוכל לעשות זאת על ידי לחיצה על הלחצן המתאים מטה.",
|
||||
"consent.export_profile": "יצוא פרופיל (CVS.)",
|
||||
"consent.export_profile": "Export Profile (.json)",
|
||||
"consent.export_uploads": "יצוא תוכן שהועלה (ZIP.)",
|
||||
"consent.export_posts": "יצוא פוסטים (CVS.)"
|
||||
}
|
||||
@@ -170,7 +170,7 @@
|
||||
"consent.right_to_erasure_description": "At any time, you are able to revoke your consent to data collection and/or processing by deleting your account. Your individual profile can be deleted, although your posted content will remain. If you wish to delete both your account <strong>and</strong> your content, please contact the administrative team for this website.",
|
||||
"consent.right_to_data_portability": "You have the Right to Data Portability",
|
||||
"consent.right_to_data_portability_description": "You may request from us a machine-readable export of any collected data about you and your account. You can do so by clicking the appropriate button below.",
|
||||
"consent.export_profile": "Export Profile (.csv)",
|
||||
"consent.export_profile": "Export Profile (.json)",
|
||||
"consent.export_uploads": "Export Uploaded Content (.zip)",
|
||||
"consent.export_posts": "Export Posts (.csv)"
|
||||
}
|
||||
@@ -170,7 +170,7 @@
|
||||
"consent.right_to_erasure_description": "Az adatgyűjtésre és/vagy feldolgozásra adott jóváhagyásodat bármikor hatálytalaníthatod fiókod törlésével. Noha egyéni profilod törlésre ítélhető, közzétett tartalmaid megmaradnak. Ha törölni kívánod mind profilod <strong>és</strong> tartalmaid, kérlek lépj kapcsolatba az oldal adminisztratív csapatával.",
|
||||
"consent.right_to_data_portability": "Jogodban áll az adathordozhatóság",
|
||||
"consent.right_to_data_portability_description": "Kérelmezhetsz tőlünk egy gép által olvasható kivonatot bármilyen, a rólad és fiókodról gyűjtött adatról. Ezt alább a megfelelő gomb megnyomásával teheted meg.",
|
||||
"consent.export_profile": "Profil exportálása (.csv)",
|
||||
"consent.export_profile": "Export Profile (.json)",
|
||||
"consent.export_uploads": "Feltöltött tartalom exportálása (.zip)",
|
||||
"consent.export_posts": "Hozzászólások exportálása (.csv)"
|
||||
}
|
||||
@@ -170,7 +170,7 @@
|
||||
"consent.right_to_erasure_description": "At any time, you are able to revoke your consent to data collection and/or processing by deleting your account. Your individual profile can be deleted, although your posted content will remain. If you wish to delete both your account <strong>and</strong> your content, please contact the administrative team for this website.",
|
||||
"consent.right_to_data_portability": "You have the Right to Data Portability",
|
||||
"consent.right_to_data_portability_description": "You may request from us a machine-readable export of any collected data about you and your account. You can do so by clicking the appropriate button below.",
|
||||
"consent.export_profile": "Export Profile (.csv)",
|
||||
"consent.export_profile": "Export Profile (.json)",
|
||||
"consent.export_uploads": "Export Uploaded Content (.zip)",
|
||||
"consent.export_posts": "Export Posts (.csv)"
|
||||
}
|
||||
@@ -170,7 +170,7 @@
|
||||
"consent.right_to_erasure_description": "In qualsiasi momento, puoi revocare il tuo consenso alla raccolta e / o al trattamento dei dati eliminando il tuo account. Il tuo profilo individuale può essere eliminato, anche se i contenuti pubblicati rimarranno. Se desideri eliminare entrambi i tuoi account <strong>e</strong> i tuoi contenuti, contatta il team amministrativo per questo sito Web.",
|
||||
"consent.right_to_data_portability": "Hai i privilegi alla portabilità dei dati",
|
||||
"consent.right_to_data_portability_description": "Puoi richiedere da noi un'esportazione leggibile meccanicamente di tutti i dati raccolti su di te e sul tuo account. Puoi farlo facendo clic sul pulsante appropriato in basso.",
|
||||
"consent.export_profile": "Esporta i profili (.csv)",
|
||||
"consent.export_profile": "Export Profile (.json)",
|
||||
"consent.export_uploads": "Esporta i contenuti caricati (.zip)",
|
||||
"consent.export_posts": "Esporta i post (.csv)"
|
||||
}
|
||||
@@ -170,7 +170,7 @@
|
||||
"consent.right_to_erasure_description": "At any time, you are able to revoke your consent to data collection and/or processing by deleting your account. Your individual profile can be deleted, although your posted content will remain. If you wish to delete both your account <strong>and</strong> your content, please contact the administrative team for this website.",
|
||||
"consent.right_to_data_portability": "あなたはデータを移動する権利があります",
|
||||
"consent.right_to_data_portability_description": "あなたは私たちにあなたとあなたのアカウントに関して収集されたデータの機械読み取り可能なエクスポートを要求することができます。 下の適切なボタンをクリックしてそれを行うことができます。",
|
||||
"consent.export_profile": "プロファイルをエクスポート(.csv)",
|
||||
"consent.export_profile": "Export Profile (.json)",
|
||||
"consent.export_uploads": "アップデートしたコンテンツをエクスポート(.zip)",
|
||||
"consent.export_posts": "投稿をエクスポート (.csv)"
|
||||
}
|
||||
@@ -170,7 +170,7 @@
|
||||
"consent.right_to_erasure_description": "At any time, you are able to revoke your consent to data collection and/or processing by deleting your account. Your individual profile can be deleted, although your posted content will remain. If you wish to delete both your account <strong>and</strong> your content, please contact the administrative team for this website.",
|
||||
"consent.right_to_data_portability": "당신은 데이터 이동 권한이 있습니다.",
|
||||
"consent.right_to_data_portability_description": "당신은 우리가 수집한 당신과 당신의 계정에 대한 어떠한 수집 데이터라도 기계가 읽을 수 있는 형태로 출력본을 요청할 수 있습니다. 아래에 적절한 버튼을 클릭하여 해당 처리를 수행할 수 있습니다.",
|
||||
"consent.export_profile": "프로필 내보내기 (.csv)",
|
||||
"consent.export_profile": "Export Profile (.json)",
|
||||
"consent.export_uploads": "업로드한 콘텐츠 내보내기 (.zip)",
|
||||
"consent.export_posts": "포스트 내보내기 (.csv)"
|
||||
}
|
||||
@@ -170,7 +170,7 @@
|
||||
"consent.right_to_erasure_description": "At any time, you are able to revoke your consent to data collection and/or processing by deleting your account. Your individual profile can be deleted, although your posted content will remain. If you wish to delete both your account <strong>and</strong> your content, please contact the administrative team for this website.",
|
||||
"consent.right_to_data_portability": "Turite teisę į duomenų perkėlimą",
|
||||
"consent.right_to_data_portability_description": "You may request from us a machine-readable export of any collected data about you and your account. You can do so by clicking the appropriate button below.",
|
||||
"consent.export_profile": "Eksportuoti profilį (.csv)",
|
||||
"consent.export_profile": "Export Profile (.json)",
|
||||
"consent.export_uploads": "Export Uploaded Content (.zip)",
|
||||
"consent.export_posts": "Export Posts (.csv)"
|
||||
}
|
||||
@@ -170,7 +170,7 @@
|
||||
"consent.right_to_erasure_description": "At any time, you are able to revoke your consent to data collection and/or processing by deleting your account. Your individual profile can be deleted, although your posted content will remain. If you wish to delete both your account <strong>and</strong> your content, please contact the administrative team for this website.",
|
||||
"consent.right_to_data_portability": "Tev ir tiesības pārnest savus datus",
|
||||
"consent.right_to_data_portability_description": "You may request from us a machine-readable export of any collected data about you and your account. You can do so by clicking the appropriate button below.",
|
||||
"consent.export_profile": "Eksportēt profilu (.csv)",
|
||||
"consent.export_profile": "Export Profile (.json)",
|
||||
"consent.export_uploads": "Eksportēt augšupielādēto saturu (.zip)",
|
||||
"consent.export_posts": "Eksportēt rakstus (.csv)"
|
||||
}
|
||||
@@ -170,7 +170,7 @@
|
||||
"consent.right_to_erasure_description": "At any time, you are able to revoke your consent to data collection and/or processing by deleting your account. Your individual profile can be deleted, although your posted content will remain. If you wish to delete both your account <strong>and</strong> your content, please contact the administrative team for this website.",
|
||||
"consent.right_to_data_portability": "You have the Right to Data Portability",
|
||||
"consent.right_to_data_portability_description": "You may request from us a machine-readable export of any collected data about you and your account. You can do so by clicking the appropriate button below.",
|
||||
"consent.export_profile": "Export Profile (.csv)",
|
||||
"consent.export_profile": "Export Profile (.json)",
|
||||
"consent.export_uploads": "Export Uploaded Content (.zip)",
|
||||
"consent.export_posts": "Export Posts (.csv)"
|
||||
}
|
||||
@@ -170,7 +170,7 @@
|
||||
"consent.right_to_erasure_description": "At any time, you are able to revoke your consent to data collection and/or processing by deleting your account. Your individual profile can be deleted, although your posted content will remain. If you wish to delete both your account <strong>and</strong> your content, please contact the administrative team for this website.",
|
||||
"consent.right_to_data_portability": "You have the Right to Data Portability",
|
||||
"consent.right_to_data_portability_description": "You may request from us a machine-readable export of any collected data about you and your account. You can do so by clicking the appropriate button below.",
|
||||
"consent.export_profile": "Export Profile (.csv)",
|
||||
"consent.export_profile": "Export Profile (.json)",
|
||||
"consent.export_uploads": "Export Uploaded Content (.zip)",
|
||||
"consent.export_posts": "Export Posts (.csv)"
|
||||
}
|
||||
@@ -170,7 +170,7 @@
|
||||
"consent.right_to_erasure_description": "Uw toestemming om gegevens te verzamelen en te verwerken kunt u op ieder moment intrekken door uw account te verwijderen. Uw individuele profiel kan worden verwijderd hoewel uw berichten blijven staan. Als u zowel uw account <strong> en </strong> uw berichten wilt verwijderen, neem dan contact op met het administrator team van deze website.",
|
||||
"consent.right_to_data_portability": "U hebt Recht op Dataportabiliteit",
|
||||
"consent.right_to_data_portability_description": "U kan van ons machine-leesbare export opvragen van verzamelde gegevens van u en uw account. U kan dit doen door te klikken op de van toepassing zijnde knop hieronder.",
|
||||
"consent.export_profile": "Exporteer profiel (.csv)",
|
||||
"consent.export_profile": "Export Profile (.json)",
|
||||
"consent.export_uploads": "Exporteer geuploade inhoud (.zip)",
|
||||
"consent.export_posts": "Exporteer berichten (.csv)"
|
||||
}
|
||||
@@ -170,7 +170,7 @@
|
||||
"consent.right_to_erasure_description": "Możesz w każdej chwili cofnąć zgodę na gromadzenie lub przetwarzanie danych poprzez usunięcie konta. Twój profil zostanie usunięty, ale zamieszczone przez Ciebie treści pozostaną dostępne. Jeśli chcesz usunąć swoje konto <strong>oraz</strong> swoje treści, skontaktuj się z administratorami tej strony.",
|
||||
"consent.right_to_data_portability": "Masz prawo do przenoszenia danych",
|
||||
"consent.right_to_data_portability_description": "Możesz poprosić nas o eksport wszelkich danych gromadzonych na temat Ciebie i Twojego konta w formie do odczytu elektronicznego. W tym celu kliknij stosowny przycisk poniżej.",
|
||||
"consent.export_profile": "Eksportuj profil (csv)",
|
||||
"consent.export_profile": "Export Profile (.json)",
|
||||
"consent.export_uploads": "Eksportuj przesłane treści (zip)",
|
||||
"consent.export_posts": "Eksportuj wpisy (csv)"
|
||||
}
|
||||
@@ -170,7 +170,7 @@
|
||||
"consent.right_to_erasure_description": "A qualquer momento, você pode revogar o consentimento à coleta e/ou ao processamento de dados excluindo sua conta. Seu perfil individual pode ser excluído, no entanto, as suas postagens serão mantidas. Se você desejar deletar tanto a sua conta <strong>e</strong> as suas postagens, por favor, entre em contato com a equipe administrativa deste site.",
|
||||
"consent.right_to_data_portability": "Você tem o Direito de Portabilidade de Dados",
|
||||
"consent.right_to_data_portability_description": "Você pode solicitar de nós uma exportação legível por máquina de quaisquer dados coletados sobre você e sua conta. Você pode fazer isso clicando no botão apropriado abaixo.",
|
||||
"consent.export_profile": "Exportar Perfil (.csv)",
|
||||
"consent.export_profile": "Export Profile (.json)",
|
||||
"consent.export_uploads": "Exportar Arquivos Enviados (.zip)",
|
||||
"consent.export_posts": "Exportar Posts (.csv)"
|
||||
}
|
||||
@@ -170,7 +170,7 @@
|
||||
"consent.right_to_erasure_description": "At any time, you are able to revoke your consent to data collection and/or processing by deleting your account. Your individual profile can be deleted, although your posted content will remain. If you wish to delete both your account <strong>and</strong> your content, please contact the administrative team for this website.",
|
||||
"consent.right_to_data_portability": "You have the Right to Data Portability",
|
||||
"consent.right_to_data_portability_description": "You may request from us a machine-readable export of any collected data about you and your account. You can do so by clicking the appropriate button below.",
|
||||
"consent.export_profile": "Exportar Perfil (.csv)",
|
||||
"consent.export_profile": "Export Profile (.json)",
|
||||
"consent.export_uploads": "Exportar Arquivos Enviados (.zip)",
|
||||
"consent.export_posts": "Exportar Publicações (.csv)"
|
||||
}
|
||||
@@ -170,7 +170,7 @@
|
||||
"consent.right_to_erasure_description": "At any time, you are able to revoke your consent to data collection and/or processing by deleting your account. Your individual profile can be deleted, although your posted content will remain. If you wish to delete both your account <strong>and</strong> your content, please contact the administrative team for this website.",
|
||||
"consent.right_to_data_portability": "You have the Right to Data Portability",
|
||||
"consent.right_to_data_portability_description": "You may request from us a machine-readable export of any collected data about you and your account. You can do so by clicking the appropriate button below.",
|
||||
"consent.export_profile": "Export Profile (.csv)",
|
||||
"consent.export_profile": "Export Profile (.json)",
|
||||
"consent.export_uploads": "Export Uploaded Content (.zip)",
|
||||
"consent.export_posts": "Export Posts (.csv)"
|
||||
}
|
||||
@@ -170,7 +170,7 @@
|
||||
"consent.right_to_erasure_description": "В любое время вы можете отозвать свое согласие на сбор и/или обработку данных, удалив свою учётную запись. Ваш индивидуальный профиль можно удалить, хотя ваши сообщения останутся. Если вы хотите удалить как свою учётную запись, так <strong>и</strong> контент, пожалуйста, свяжитесь с администрацией сайта.",
|
||||
"consent.right_to_data_portability": "У вас есть право на перенос данных",
|
||||
"consent.right_to_data_portability_description": "Вы можете запросить у нас машиночитаемый экспорт любых собранных данных о вас и вашей учетной записи. Вы можете сделать это, нажав соответствующую кнопку ниже.",
|
||||
"consent.export_profile": "Экспорт профиля (.csv)",
|
||||
"consent.export_profile": "Export Profile (.json)",
|
||||
"consent.export_uploads": "Экспорт загруженного контента (.zip)",
|
||||
"consent.export_posts": "Экспорт сообщений (.csv)"
|
||||
}
|
||||
@@ -170,7 +170,7 @@
|
||||
"consent.right_to_erasure_description": "At any time, you are able to revoke your consent to data collection and/or processing by deleting your account. Your individual profile can be deleted, although your posted content will remain. If you wish to delete both your account <strong>and</strong> your content, please contact the administrative team for this website.",
|
||||
"consent.right_to_data_portability": "You have the Right to Data Portability",
|
||||
"consent.right_to_data_portability_description": "You may request from us a machine-readable export of any collected data about you and your account. You can do so by clicking the appropriate button below.",
|
||||
"consent.export_profile": "Export Profile (.csv)",
|
||||
"consent.export_profile": "Export Profile (.json)",
|
||||
"consent.export_uploads": "Export Uploaded Content (.zip)",
|
||||
"consent.export_posts": "Export Posts (.csv)"
|
||||
}
|
||||
@@ -170,7 +170,7 @@
|
||||
"consent.right_to_erasure_description": "At any time, you are able to revoke your consent to data collection and/or processing by deleting your account. Your individual profile can be deleted, although your posted content will remain. If you wish to delete both your account <strong>and</strong> your content, please contact the administrative team for this website.",
|
||||
"consent.right_to_data_portability": "You have the Right to Data Portability",
|
||||
"consent.right_to_data_portability_description": "You may request from us a machine-readable export of any collected data about you and your account. You can do so by clicking the appropriate button below.",
|
||||
"consent.export_profile": "Export Profile (.csv)",
|
||||
"consent.export_profile": "Export Profile (.json)",
|
||||
"consent.export_uploads": "Export Uploaded Content (.zip)",
|
||||
"consent.export_posts": "Export Posts (.csv)"
|
||||
}
|
||||
@@ -170,7 +170,7 @@
|
||||
"consent.right_to_erasure_description": "Kedykoľvek môžete zmeniť svoj súhlas so zhromažďovaním údajov a/alebo spracovaním odstránenia Vášho účtu. Váš profil bude odstránený, hoci Vaše príspevky budú zachované. Ak si prajete odstránenie <strong>ako účtu tak aj obsahu</strong>, prosím kontaktujte správcov tejto stránky.",
|
||||
"consent.right_to_data_portability": "Máte právo na prenositeľnosť údajov ",
|
||||
"consent.right_to_data_portability_description": "Môžete od nás požadovať strojovo čitateľné údaje, ktoré boli zozbierané o Vás a Vašom účte. Urobíte tak kliknutím na tlačidlá zobrazené nižšie.",
|
||||
"consent.export_profile": "Exportovať profil (*.csv)",
|
||||
"consent.export_profile": "Export Profile (.json)",
|
||||
"consent.export_uploads": "Exportovať nahraný obsah (*.zip)",
|
||||
"consent.export_posts": "Exportovať príspevky (*.csv)"
|
||||
}
|
||||
@@ -170,7 +170,7 @@
|
||||
"consent.right_to_erasure_description": "At any time, you are able to revoke your consent to data collection and/or processing by deleting your account. Your individual profile can be deleted, although your posted content will remain. If you wish to delete both your account <strong>and</strong> your content, please contact the administrative team for this website.",
|
||||
"consent.right_to_data_portability": "You have the Right to Data Portability",
|
||||
"consent.right_to_data_portability_description": "You may request from us a machine-readable export of any collected data about you and your account. You can do so by clicking the appropriate button below.",
|
||||
"consent.export_profile": "Export Profile (.csv)",
|
||||
"consent.export_profile": "Export Profile (.json)",
|
||||
"consent.export_uploads": "Export Uploaded Content (.zip)",
|
||||
"consent.export_posts": "Export Posts (.csv)"
|
||||
}
|
||||
@@ -35,7 +35,7 @@
|
||||
"user_posted_to_dual": "<strong>%1</strong> и <strong>%2</strong> су одговорили на: <strong>%3</strong>",
|
||||
"user_posted_to_multiple": "<strong>%1</strong> и %2 других су одговорили на: <strong>%3</strong>",
|
||||
"user_posted_topic": "<strong>%1</strong> је поставио нову тему: <strong>%2</strong>",
|
||||
"user_edited_post": "<strong>%1</strong> has edited a post in <strong>%2</strong>",
|
||||
"user_edited_post": "<strong>%1</strong> је уредио поруку у <strong>%2</strong>",
|
||||
"user_started_following_you": "<strong>%1</strong> је почео да вас прати.",
|
||||
"user_started_following_you_dual": "<strong>%1</strong> и <strong>%2</strong> су почели да вас прате.",
|
||||
"user_started_following_you_multiple": "<strong>%1</strong> и %2 других су почели да вас прате.",
|
||||
@@ -54,7 +54,7 @@
|
||||
"notificationType_upvote": "Када неко гласа за вашу поруку",
|
||||
"notificationType_new-topic": "Када неко кога пратите постави тему",
|
||||
"notificationType_new-reply": "Када је постављен нови одговор у теми коју надгледате",
|
||||
"notificationType_post-edit": "When a post is edited in a topic you are watching",
|
||||
"notificationType_post-edit": "Када је порука уређена у теми коју надгледате",
|
||||
"notificationType_follow": "Када неко почне да вас прати",
|
||||
"notificationType_new-chat": "Када примите поруку за ћаскање",
|
||||
"notificationType_group-invite": "Када примите позивницу за групу",
|
||||
|
||||
@@ -9,9 +9,9 @@
|
||||
"no_popular_topics": "Нема популарних тема.",
|
||||
"there-is-a-new-topic": "Постоји нова тема.",
|
||||
"there-is-a-new-topic-and-a-new-post": "Постоје нова тема и нова порука.",
|
||||
"there-is-a-new-topic-and-new-posts": "Постоји нова тема и нових порука: %1.",
|
||||
"there-is-a-new-topic-and-new-posts": "Постоји нова тема и укупно нових порука: %1.",
|
||||
"there-are-new-topics": "Број нових тема: %1.",
|
||||
"there-are-new-topics-and-a-new-post": "Постоји нова порука и нових тема: %1.",
|
||||
"there-are-new-topics-and-a-new-post": "Постоји нова порука и укупно нових тема: %1.",
|
||||
"there-are-new-topics-and-new-posts": "Број нових тема: %1 и нових порука: %2.",
|
||||
"there-is-a-new-post": "Постоји нова порука.",
|
||||
"there-are-new-posts": "Број нових порука: %1.",
|
||||
|
||||
@@ -170,7 +170,7 @@
|
||||
"consent.right_to_erasure_description": "У било које време, у могућности сте да опозовете вашу сагласност за прикупљање и/или обраду података брисањем вашег налога. Ваш појединачни профил може бити избрисан, иако ће ваш објављени садржај остати. Ако желите да избришете и свој налог <strong>и</strong> садржај, молимо контактирајте администрацију овог веб сајта.",
|
||||
"consent.right_to_data_portability": "Имате право на преносивост података",
|
||||
"consent.right_to_data_portability_description": "Можете тражити од нас машински читљив извоз прикупљених података о вама и вашем налогу. То можете урадити кликом на одговарајуће дугме испод.",
|
||||
"consent.export_profile": "Извези профил (.csv)",
|
||||
"consent.export_profile": "Export Profile (.json)",
|
||||
"consent.export_uploads": "Извези отпремљени садржај (.zip)",
|
||||
"consent.export_posts": "Извези поруке (.csv)"
|
||||
}
|
||||
@@ -170,7 +170,7 @@
|
||||
"consent.right_to_erasure_description": "Du kan när som helst ta tillbaka ditt medgivande till datainsamling och/eller behandling genom att radera ditt konto. Din individuella profil kan raderas, men innehåll du lagt upp kommer bestå. Om du vill radera både din profil<strong>och</strong> ditt innehåll, vänligen kontakta detta forums administrativa team.",
|
||||
"consent.right_to_data_portability": "Du har rätten till dataförflyttbarhet",
|
||||
"consent.right_to_data_portability_description": "Du kan hämta en maskinläslig export av all insamlad data om dig och ditt konto. Du kan göra det genom att klicka på passande knapp nedan.",
|
||||
"consent.export_profile": "Exportera profil (.csv)",
|
||||
"consent.export_profile": "Export Profile (.json)",
|
||||
"consent.export_uploads": "Exportera uppladdat innehåll (.zip)",
|
||||
"consent.export_posts": "Exportera poster (.csv)"
|
||||
}
|
||||
@@ -170,7 +170,7 @@
|
||||
"consent.right_to_erasure_description": "At any time, you are able to revoke your consent to data collection and/or processing by deleting your account. Your individual profile can be deleted, although your posted content will remain. If you wish to delete both your account <strong>and</strong> your content, please contact the administrative team for this website.",
|
||||
"consent.right_to_data_portability": "You have the Right to Data Portability",
|
||||
"consent.right_to_data_portability_description": "You may request from us a machine-readable export of any collected data about you and your account. You can do so by clicking the appropriate button below.",
|
||||
"consent.export_profile": "Export Profile (.csv)",
|
||||
"consent.export_profile": "Export Profile (.json)",
|
||||
"consent.export_uploads": "Export Uploaded Content (.zip)",
|
||||
"consent.export_posts": "Export Posts (.csv)"
|
||||
}
|
||||
@@ -170,7 +170,7 @@
|
||||
"consent.right_to_erasure_description": "Herhangi bir zamanda, hesabınızı silerek veri toplama ve / veya işlemeye onayınızı iptal edebilirsiniz. Gönderilen içeriğiniz kalsa da, bireysel profiliniz silinebilir. Hem hesabınızı hem de içeriğinizi silmek isterseniz, lütfen bu web sitesi için yönetim ekibine başvurun.",
|
||||
"consent.right_to_data_portability": "Veri taşıma hakkına sahipsiniz",
|
||||
"consent.right_to_data_portability_description": "Sizden ve hesabınız hakkında toplanan verilere makine tarafından okunabilir bir veri talep edebilirsiniz. Aşağıdaki uygun düğmeyi tıklayarak bunu yapabilirsiniz.",
|
||||
"consent.export_profile": "Profili Dışarı Çıkar (.csv)",
|
||||
"consent.export_profile": "Export Profile (.json)",
|
||||
"consent.export_uploads": "Karşıya Yüklenmiş İçeriği Dışarı Aktar (.zip)",
|
||||
"consent.export_posts": "Gönderileri Dışa Aktar (.csv)"
|
||||
}
|
||||
@@ -170,7 +170,7 @@
|
||||
"consent.right_to_erasure_description": "У будь-який час ви можете відкликати свою згоду на збір та/або обробку інформації шляхом видалення власного акаунту. Ваш особистий профіль можна видалити, але розміщений вами контент залишиться. Якщо ви хочете видалити ваш акаунт <strong>разом з контентом</strong>, будь-ласка зверніться до команди адміністраторів цього веб-сайту.",
|
||||
"consent.right_to_data_portability": "У вас є Право на Переносимість Даних",
|
||||
"consent.right_to_data_portability_description": "Ви можете отримати від нас експортовану копію машинно-читабельних даних, які були зібрані про вас і ваш акаунт. Ви можете це зробити, натиснувши на відповідну кнопку внизу.",
|
||||
"consent.export_profile": "Експортувати Профіль (.csv)",
|
||||
"consent.export_profile": "Export Profile (.json)",
|
||||
"consent.export_uploads": "Експортувати Завантажений Контент (.zip)",
|
||||
"consent.export_posts": "Експортувати Пости (.csv)"
|
||||
}
|
||||
@@ -170,7 +170,7 @@
|
||||
"consent.right_to_erasure_description": "Bất cứ lúc nào, bạn có thể thu hồi sự đồng ý của bạn để thu thập và / hoặc xử lý dữ liệu bằng cách xóa tài khoản của bạn. Hồ sơ cá nhân của bạn có thể bị xóa, mặc dù nội dung được đăng của bạn sẽ vẫn còn. Nếu bạn muốn xóa cả tài khoản <strong> và </strong> nội dung của mình, vui lòng liên hệ với nhóm quản trị cho trang web này.",
|
||||
"consent.right_to_data_portability": "Bạn có quyền di chuyển dữ liệu",
|
||||
"consent.right_to_data_portability_description": "Bạn có thể yêu cầu chúng tôi xuất khẩu có thể đọc được bằng máy đối với bất kỳ dữ liệu được thu thập nào về bạn và tài khoản của bạn. Bạn có thể làm như vậy bằng cách nhấp vào nút thích hợp bên dưới.",
|
||||
"consent.export_profile": "Xuất hồ sơ(.csv)",
|
||||
"consent.export_profile": "Export Profile (.json)",
|
||||
"consent.export_uploads": "Xuất nội dung đã tải lên (.zip)",
|
||||
"consent.export_posts": "Xuất bài viết (.csv)"
|
||||
}
|
||||
@@ -170,7 +170,7 @@
|
||||
"consent.right_to_erasure_description": "您随时都可以通过删除帐号,来撤销数据收集和处理的许可。您的个人资料可以被删除,但是您发表的内容仍然会保留。如果您想要同时删除您的帐号<strong>和</strong>内容,请联系此网站的管理团队。",
|
||||
"consent.right_to_data_portability": "您拥有数据转移权",
|
||||
"consent.right_to_data_portability_description": "您也许想导出有关您和您的账号的机器可读副本。您可以点击下方的按钮来获取它们。",
|
||||
"consent.export_profile": "导出个人资料 (.csv)",
|
||||
"consent.export_profile": "Export Profile (.json)",
|
||||
"consent.export_uploads": "导出上传文件 (.zip)",
|
||||
"consent.export_posts": "导出帖子 (.csv)"
|
||||
}
|
||||
@@ -170,7 +170,7 @@
|
||||
"consent.right_to_erasure_description": "您隨時都可以通過刪除帳戶,來撤銷資料收集和處理的許可。您的個人檔案可以被刪除,但是您發表的內容仍然會保留。如果您想要同時刪除您的帳戶<strong>和</strong>內容,請聯繫此網站的管理團隊。",
|
||||
"consent.right_to_data_portability": "您擁有資料轉移權",
|
||||
"consent.right_to_data_portability_description": "您也許想導出有關您和您的帳戶的機器可讀副本。您可以點擊下方的按鈕來獲取它們。",
|
||||
"consent.export_profile": "導出個人資料 (.csv)",
|
||||
"consent.export_profile": "Export Profile (.json)",
|
||||
"consent.export_uploads": "導出上傳檔案 (.zip)",
|
||||
"consent.export_posts": "導出貼文 (.csv)"
|
||||
}
|
||||
@@ -595,16 +595,16 @@ app.cacheBuster = null;
|
||||
};
|
||||
$(window).trigger('action:search.quick', { data: data });
|
||||
search.api(data, function (data) {
|
||||
if (!data.matchCount) {
|
||||
quickSearchResults.html('').addClass('hidden');
|
||||
return;
|
||||
}
|
||||
data.posts.forEach(function (p) {
|
||||
p.snippet = utils.escapeHTML($(p.content).text().slice(0, 80) + '...');
|
||||
});
|
||||
app.parseAndTranslate(template, data, function (html) {
|
||||
html.find('.timeago').timeago();
|
||||
quickSearchResults.html(html).removeClass('hidden').show();
|
||||
if (html.length) {
|
||||
html.find('.timeago').timeago();
|
||||
quickSearchResults.html(html).removeClass('hidden').show();
|
||||
} else {
|
||||
quickSearchResults.html('').addClass('hidden');
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -661,17 +661,21 @@
|
||||
|
||||
// get all the url params in a single key/value hash
|
||||
params: function (options) {
|
||||
var a;
|
||||
var hash = {};
|
||||
var params;
|
||||
|
||||
options = options || {};
|
||||
options.skipToType = options.skipToType || {};
|
||||
|
||||
if (options.url) {
|
||||
a = utils.urlToLocation(options.url);
|
||||
var searchStr = window.location.search;
|
||||
if (options.hasOwnProperty('url')) {
|
||||
if (options.url) {
|
||||
var a = utils.urlToLocation(options.url);
|
||||
searchStr = a ? a.search : '';
|
||||
} else {
|
||||
searchStr = '';
|
||||
}
|
||||
}
|
||||
params = (a ? a.search : window.location.search).substring(1).split('&');
|
||||
var params = searchStr.substring(1).split('&');
|
||||
|
||||
params.forEach(function (param) {
|
||||
var val = param.split('=');
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
'use strict';
|
||||
|
||||
const json2csv = require('json-2-csv').json2csv;
|
||||
const util = require('util');
|
||||
const json2csvAsync = require('json2csv').parseAsync;
|
||||
|
||||
const meta = require('../../meta');
|
||||
const analytics = require('../../analytics');
|
||||
@@ -17,12 +16,10 @@ errorsController.get = async function (req, res) {
|
||||
res.render('admin/advanced/errors', data);
|
||||
};
|
||||
|
||||
const json2csvAsync = util.promisify(function (data, callback) {
|
||||
json2csv(data, (err, output) => callback(err, output));
|
||||
});
|
||||
|
||||
errorsController.export = async function (req, res) {
|
||||
const data = await meta.errors.get(false);
|
||||
const csv = await json2csvAsync(data);
|
||||
const fields = data.length ? Object.keys(data[0]) : [];
|
||||
const opts = { fields };
|
||||
const csv = await json2csvAsync(data, opts);
|
||||
res.set('Content-Type', 'text/csv').set('Content-Disposition', 'attachment; filename="404.csv"').send(csv);
|
||||
};
|
||||
|
||||
@@ -350,10 +350,12 @@ authenticationController.onSuccessfulLogin = async function (req, uid) {
|
||||
});
|
||||
await Promise.all([
|
||||
user.auth.addSession(uid, req.sessionID),
|
||||
(uid > 0) ? db.setObjectField('uid:' + uid + ':sessionUUID:sessionId', uuid, req.sessionID) : null,
|
||||
user.updateLastOnlineTime(uid),
|
||||
user.updateOnlineUsers(uid),
|
||||
]);
|
||||
if (uid > 0) {
|
||||
await db.setObjectField('uid:' + uid + ':sessionUUID:sessionId', uuid, req.sessionID);
|
||||
}
|
||||
|
||||
// Force session check for all connected socket.io clients with the same session id
|
||||
sockets.in('sess_' + req.sessionID).emit('checkSession', uid);
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
'use strict';
|
||||
|
||||
const _ = require('lodash');
|
||||
const path = require('path');
|
||||
const fs = require('fs');
|
||||
const winston = require('winston');
|
||||
const converter = require('json-2-csv');
|
||||
const json2csvAsync = require('json2csv').parseAsync;
|
||||
const archiver = require('archiver');
|
||||
const util = require('util');
|
||||
|
||||
const db = require('../database');
|
||||
const user = require('../user');
|
||||
@@ -85,10 +85,6 @@ userController.getUserDataByUID = async function (callerUid, uid) {
|
||||
return userData;
|
||||
};
|
||||
|
||||
const json2csv = util.promisify(function (payload, options, callback) {
|
||||
converter.json2csv(payload, callback, options);
|
||||
});
|
||||
|
||||
userController.exportPosts = async function (req, res) {
|
||||
var payload = [];
|
||||
await batch.processSortedSet('uid:' + res.locals.uid + ':posts', async function (pids) {
|
||||
@@ -99,12 +95,14 @@ userController.exportPosts = async function (req, res) {
|
||||
return post;
|
||||
});
|
||||
payload = payload.concat(postData);
|
||||
}, {
|
||||
batch: 500,
|
||||
});
|
||||
const csv = await json2csv(payload, {
|
||||
checkSchemaDifferences: false,
|
||||
emptyFieldValue: '',
|
||||
});
|
||||
res.set('Content-Type', 'text/csv').set('Content-Disposition', 'attachment; filename="' + req.params.uid + '_posts.csv"').send(csv);
|
||||
|
||||
const fields = payload.length ? Object.keys(payload[0]) : [];
|
||||
const opts = { fields };
|
||||
const csv = await json2csvAsync(payload, opts);
|
||||
res.set('Content-Type', 'text/csv').set('Content-Disposition', 'attachment; filename="' + res.locals.uid + '_posts.csv"').send(csv);
|
||||
};
|
||||
|
||||
userController.exportUploads = function (req, res, next) {
|
||||
@@ -189,15 +187,71 @@ userController.exportUploads = function (req, res, next) {
|
||||
};
|
||||
|
||||
userController.exportProfile = async function (req, res) {
|
||||
const targetUid = res.locals.uid;
|
||||
const objects = await db.getObjects(['user:' + targetUid, 'user:' + targetUid + ':settings']);
|
||||
Object.assign(objects[0], objects[1]);
|
||||
delete objects[0].password;
|
||||
const targetUid = parseInt(res.locals.uid, 10);
|
||||
const [userData, userSettings, ips, sessions, usernames, emails, bookmarks, watchedTopics, upvoted, downvoted, following] = await Promise.all([
|
||||
db.getObject('user:' + targetUid),
|
||||
db.getObject('user:' + targetUid + ':settings'),
|
||||
user.getIPs(targetUid, 9),
|
||||
user.auth.getSessions(targetUid, req.sessionID),
|
||||
user.getHistory('user:' + targetUid + ':usernames'),
|
||||
user.getHistory('user:' + targetUid + ':emails'),
|
||||
getSetData('uid:' + targetUid + ':bookmarks', 'post:', targetUid),
|
||||
getSetData('uid:' + targetUid + ':followed_tids', 'topic:', targetUid),
|
||||
getSetData('uid:' + targetUid + ':upvote', 'post:', targetUid),
|
||||
getSetData('uid:' + targetUid + ':downvote', 'post:', targetUid),
|
||||
getSetData('following:' + targetUid, 'user:', targetUid),
|
||||
]);
|
||||
delete userData.password;
|
||||
const followingData = following.map(u => ({ username: u.username, uid: u.uid }));
|
||||
|
||||
const csv = await json2csv(objects[0], {});
|
||||
res.set('Content-Type', 'text/csv').set('Content-Disposition', 'attachment; filename="' + targetUid + '_profile.csv"').send(csv);
|
||||
let chatData = [];
|
||||
await batch.processSortedSet('uid:' + targetUid + ':chat:rooms', async (roomIds) => {
|
||||
var result = await Promise.all(roomIds.map(roomId => getRoomMessages(targetUid, roomId)));
|
||||
chatData = chatData.concat(_.flatten(result));
|
||||
}, { batch: 100 });
|
||||
|
||||
res.set('Content-Type', 'application/json')
|
||||
.set('Content-Disposition', 'attachment; filename="' + targetUid + '_profile.json"')
|
||||
.send({
|
||||
user: userData,
|
||||
settings: userSettings,
|
||||
ips: ips,
|
||||
sessions: sessions,
|
||||
usernames: usernames,
|
||||
emails: emails,
|
||||
messages: chatData,
|
||||
bookmarks: bookmarks,
|
||||
watchedTopics: watchedTopics,
|
||||
upvoted: upvoted,
|
||||
downvoted: downvoted,
|
||||
following: followingData,
|
||||
});
|
||||
};
|
||||
|
||||
async function getRoomMessages(uid, roomId) {
|
||||
let data = [];
|
||||
await batch.processSortedSet('uid:' + uid + ':chat:room:' + roomId + ':mids', async (mids) => {
|
||||
const messageData = await db.getObjects(mids.map(mid => 'message:' + mid));
|
||||
data = data.concat(messageData.filter(m => m && m.fromuid === uid && !m.system)
|
||||
.map(m => ({ content: m.content, timestamp: m.timestamp }))
|
||||
);
|
||||
}, { batch: 500 });
|
||||
return data;
|
||||
}
|
||||
|
||||
async function getSetData(set, keyPrefix, uid) {
|
||||
let data = [];
|
||||
await batch.processSortedSet(set, async (ids) => {
|
||||
if (keyPrefix === 'post:') {
|
||||
ids = await privileges.posts.filter('topics:read', ids, uid);
|
||||
} else if (keyPrefix === 'topic:') {
|
||||
ids = await privileges.topics.filterTids('topics:read', ids, uid);
|
||||
}
|
||||
data = data.concat(await db.getObjects(ids.map(id => keyPrefix + id)));
|
||||
}, { batch: 500 });
|
||||
return data;
|
||||
}
|
||||
|
||||
require('../promisify')(userController, [
|
||||
'getCurrentUser', 'getUserByUID', 'getUserByUsername', 'getUserByEmail',
|
||||
'exportPosts', 'exportUploads', 'exportProfile',
|
||||
|
||||
@@ -235,24 +235,25 @@ module.exports = function (module) {
|
||||
}
|
||||
|
||||
module.sortedSetRanks = async function (key, values) {
|
||||
return await sortedSetRanks(module.getSortedSetRange, key, values);
|
||||
return await sortedSetRanks(false, key, values);
|
||||
};
|
||||
|
||||
module.sortedSetRevRanks = async function (key, values) {
|
||||
return await sortedSetRanks(module.getSortedSetRevRange, key, values);
|
||||
return await sortedSetRanks(true, key, values);
|
||||
};
|
||||
|
||||
async function sortedSetRanks(method, key, values) {
|
||||
const sortedSet = await method(key, 0, -1);
|
||||
|
||||
var result = values.map(function (value) {
|
||||
async function sortedSetRanks(reverse, key, values) {
|
||||
if (values.length === 1) {
|
||||
return [await getSortedSetRank(reverse, key, values[0])];
|
||||
}
|
||||
const sortedSet = await module[reverse ? 'getSortedSetRevRange' : 'getSortedSetRange'](key, 0, -1);
|
||||
return values.map(function (value) {
|
||||
if (!value) {
|
||||
return null;
|
||||
}
|
||||
var index = sortedSet.indexOf(value.toString());
|
||||
const index = sortedSet.indexOf(value.toString());
|
||||
return index !== -1 ? index : null;
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
module.sortedSetScore = async function (key, value) {
|
||||
@@ -305,7 +306,11 @@ module.exports = function (module) {
|
||||
return;
|
||||
}
|
||||
value = helpers.valueToString(value);
|
||||
const result = await module.client.collection('objects').findOne({ _key: key, value: value }, { projection: { _id: 0, _key: 0, score: 0 } });
|
||||
const result = await module.client.collection('objects').findOne({
|
||||
_key: key, value: value,
|
||||
}, {
|
||||
projection: { _id: 0, value: 1 },
|
||||
});
|
||||
return !!result;
|
||||
};
|
||||
|
||||
@@ -314,7 +319,11 @@ module.exports = function (module) {
|
||||
return;
|
||||
}
|
||||
values = values.map(helpers.valueToString);
|
||||
const results = await module.client.collection('objects').find({ _key: key, value: { $in: values } }, { projection: { _id: 0, _key: 0, score: 0 } }).toArray();
|
||||
const results = await module.client.collection('objects').find({
|
||||
_key: key, value: { $in: values },
|
||||
}, {
|
||||
projection: { _id: 0, value: 1 },
|
||||
}).toArray();
|
||||
|
||||
var isMember = {};
|
||||
results.forEach(function (item) {
|
||||
@@ -331,7 +340,11 @@ module.exports = function (module) {
|
||||
return [];
|
||||
}
|
||||
value = helpers.valueToString(value);
|
||||
const results = await module.client.collection('objects').find({ _key: { $in: keys }, value: value }, { projection: { _id: 0, score: 0 } }).toArray();
|
||||
const results = await module.client.collection('objects').find({
|
||||
_key: { $in: keys }, value: value,
|
||||
}, {
|
||||
projection: { _id: 0, _key: 1, value: 1 },
|
||||
}).toArray();
|
||||
|
||||
var isMember = {};
|
||||
results.forEach(function (item) {
|
||||
@@ -350,7 +363,7 @@ module.exports = function (module) {
|
||||
|
||||
const data = await module.client.collection('objects').find({
|
||||
_key: keys.length === 1 ? keys[0] : { $in: keys },
|
||||
}, { projection: { _id: 0, score: 0 } }).sort({ score: 1 }).toArray();
|
||||
}, { projection: { _id: 0, _key: 1, value: 1 } }).toArray();
|
||||
|
||||
var sets = {};
|
||||
data.forEach(function (set) {
|
||||
|
||||
@@ -10,7 +10,6 @@ module.exports = function (module) {
|
||||
{ $match: { _key: { $in: keys } } },
|
||||
{ $group: { _id: { value: '$value' } } },
|
||||
{ $group: { _id: null, count: { $sum: 1 } } },
|
||||
{ $project: { _id: 0, count: '$count' } },
|
||||
]).toArray();
|
||||
return Array.isArray(data) && data.length ? data[0].count : 0;
|
||||
};
|
||||
|
||||
@@ -154,6 +154,9 @@ module.exports = function (module) {
|
||||
};
|
||||
|
||||
module.deleteObjectFields = async function (key, fields) {
|
||||
if (!Array.isArray(fields) || !fields.length) {
|
||||
return;
|
||||
}
|
||||
await module.client.async.hdel(key, fields);
|
||||
cache.delObjectCache(key);
|
||||
};
|
||||
|
||||
@@ -164,6 +164,9 @@ Configs.cookie = {
|
||||
cookie.path = relativePath;
|
||||
}
|
||||
|
||||
// Ideally configurable from ACP, but cannot be "Strict" as then top-level access will treat it as guest.
|
||||
cookie.sameSite = 'Lax';
|
||||
|
||||
return cookie;
|
||||
},
|
||||
};
|
||||
|
||||
@@ -56,8 +56,9 @@ module.exports = function (middleware) {
|
||||
}
|
||||
|
||||
// Ensure that the session is valid. This block guards against edge-cases where the server-side session has
|
||||
// been deleted (but client-side cookie still exists)
|
||||
if (req.uid > 0 && !req.session.meta && !res.get('Set-Cookie')) {
|
||||
// been deleted (but client-side cookie still exists).
|
||||
// req.session.flash is present if you visit register/login, so all logged-in users have it, but it is missing if your server-side session got destroyed.
|
||||
if (!req.session.flash && !req.session.meta && !res.get('Set-Cookie')) {
|
||||
res.clearCookie(nconf.get('sessionKey'), meta.configs.cookie.get());
|
||||
}
|
||||
|
||||
@@ -72,11 +73,11 @@ module.exports = function (middleware) {
|
||||
|
||||
let langs = [];
|
||||
middleware.autoLocale = function autoLocale(req, res, next) {
|
||||
if (parseInt(req.uid, 10) > 0 || !meta.config.autoDetectLang) {
|
||||
if (parseInt(req.uid, 10) > 0 || !meta.config.autoDetectLang || req.query.lang) {
|
||||
return next();
|
||||
}
|
||||
|
||||
var lang = req.acceptsLanguages(langs);
|
||||
const lang = req.acceptsLanguages(langs);
|
||||
if (!lang) {
|
||||
return next();
|
||||
}
|
||||
|
||||
@@ -52,6 +52,14 @@ module.exports = function (Topics) {
|
||||
|
||||
await Topics.updateLastPostTime(tid, Date.now());
|
||||
|
||||
await Promise.all([
|
||||
Topics.setTopicFields(tid, {
|
||||
upvotes: postData.upvotes,
|
||||
downvotes: postData.downvotes,
|
||||
}),
|
||||
db.sortedSetsAdd(['topics:votes', 'cid:' + cid + ':tids:votes'], postData.votes, tid),
|
||||
]);
|
||||
|
||||
plugins.fireHook('action:topic.fork', { tid: tid, fromTid: fromTid, uid: uid });
|
||||
|
||||
return await Topics.getTopicData(tid);
|
||||
|
||||
@@ -66,43 +66,47 @@ module.exports = function (User) {
|
||||
const sessionStoreDestroy = util.promisify((sid, callback) => db.sessionStore.destroy(sid, err => callback(err)));
|
||||
|
||||
User.auth.getSessions = async function (uid, curSessionId) {
|
||||
await cleanExpiredSessions(uid);
|
||||
const sids = await db.getSortedSetRevRange('uid:' + uid + ':sessions', 0, 19);
|
||||
let sessions = await Promise.all(sids.map(sid => getSessionFromStore(sid)));
|
||||
sessions.forEach(function (sessionObj, idx) {
|
||||
if (sessionObj && sessionObj.meta) {
|
||||
sessionObj.meta.current = curSessionId === sids[idx];
|
||||
}
|
||||
});
|
||||
|
||||
// Revoke any sessions that have expired, return filtered list
|
||||
const expiredSids = [];
|
||||
sessions = sessions.filter(function (sessionObj, idx) {
|
||||
const expired = !sessionObj || !sessionObj.hasOwnProperty('passport') ||
|
||||
!sessionObj.passport.hasOwnProperty('user') ||
|
||||
parseInt(sessionObj.passport.user, 10) !== parseInt(uid, 10);
|
||||
|
||||
if (expired) {
|
||||
expiredSids.push(sids[idx]);
|
||||
}
|
||||
|
||||
return !expired;
|
||||
});
|
||||
await Promise.all(expiredSids.map(s => User.auth.revokeSession(s, uid)));
|
||||
|
||||
sessions = sessions.map(function (sessObj) {
|
||||
if (sessObj.meta) {
|
||||
sessions = sessions.map(function (sessObj, idx) {
|
||||
if (sessObj && sessObj.meta) {
|
||||
sessObj.meta.current = curSessionId === sids[idx];
|
||||
sessObj.meta.datetimeISO = new Date(sessObj.meta.datetime).toISOString();
|
||||
sessObj.meta.ip = validator.escape(String(sessObj.meta.ip));
|
||||
}
|
||||
return sessObj.meta;
|
||||
return sessObj && sessObj.meta;
|
||||
}).filter(Boolean);
|
||||
return sessions;
|
||||
};
|
||||
|
||||
async function cleanExpiredSessions(uid) {
|
||||
const uuidMapping = await db.getObject('uid:' + uid + ':sessionUUID:sessionId');
|
||||
if (!uuidMapping) {
|
||||
return;
|
||||
}
|
||||
const expiredUUIDs = [];
|
||||
const expiredSids = [];
|
||||
await Promise.all(Object.keys(uuidMapping).map(async (uuid) => {
|
||||
const sid = uuidMapping[uuid];
|
||||
const sessionObj = await getSessionFromStore(sid);
|
||||
const expired = !sessionObj || !sessionObj.hasOwnProperty('passport') ||
|
||||
!sessionObj.passport.hasOwnProperty('user') ||
|
||||
parseInt(sessionObj.passport.user, 10) !== parseInt(uid, 10);
|
||||
if (expired) {
|
||||
expiredUUIDs.push(uuid);
|
||||
expiredSids.push(sid);
|
||||
}
|
||||
}));
|
||||
await db.deleteObjectFields('uid:' + uid + ':sessionUUID:sessionId', expiredUUIDs);
|
||||
await db.sortedSetRemove('uid:' + uid + ':sessions', expiredSids);
|
||||
}
|
||||
|
||||
User.auth.addSession = async function (uid, sessionId) {
|
||||
if (!(parseInt(uid, 10) > 0)) {
|
||||
return;
|
||||
}
|
||||
await cleanExpiredSessions(uid);
|
||||
await db.sortedSetAdd('uid:' + uid + ':sessions', Date.now(), sessionId);
|
||||
};
|
||||
|
||||
|
||||
@@ -16,7 +16,9 @@ module.exports = function (User) {
|
||||
'username', 'email', 'fullname', 'website', 'location',
|
||||
'groupTitle', 'birthday', 'signature', 'aboutme',
|
||||
];
|
||||
|
||||
if (!data.uid) {
|
||||
throw new Error('[[error:invalid-update-uid]]');
|
||||
}
|
||||
const updateUid = data.uid;
|
||||
|
||||
const result = await plugins.fireHook('filter:user.updateProfile', { uid: uid, data: data, fields: fields });
|
||||
|
||||
@@ -395,7 +395,7 @@ describe('Admin Controllers', function () {
|
||||
request(nconf.get('url') + '/api/admin/advanced/errors/export', { jar: jar }, function (err, res, body) {
|
||||
assert.ifError(err);
|
||||
assert.equal(res.statusCode, 200);
|
||||
assert(body);
|
||||
assert.strictEqual(body, '');
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -410,6 +410,10 @@ describe('Hash methods', function () {
|
||||
});
|
||||
});
|
||||
|
||||
it('should not error if fields is empty array', async () => {
|
||||
await db.deleteObjectFields('someKey', []);
|
||||
});
|
||||
|
||||
it('should not error if key is undefined', function (done) {
|
||||
db.deleteObjectField(undefined, 'someField', function (err) {
|
||||
assert.ifError(err);
|
||||
|
||||
@@ -992,21 +992,12 @@ describe('Sorted Set methods', function () {
|
||||
});
|
||||
});
|
||||
|
||||
it('should remove value from multiple keys', function (done) {
|
||||
db.sortedSetAdd('multiTest3', [1, 2, 3, 4], ['one', 'two', 'three', 'four'], function (err) {
|
||||
assert.ifError(err);
|
||||
db.sortedSetAdd('multiTest4', [3, 4, 5, 6], ['three', 'four', 'five', 'six'], function (err) {
|
||||
assert.ifError(err);
|
||||
db.sortedSetRemove(['multiTest3', 'multiTest4'], 'three', function (err) {
|
||||
assert.ifError(err);
|
||||
db.getSortedSetsMembers(['multiTest3', 'multiTest4'], function (err, members) {
|
||||
assert.ifError(err);
|
||||
assert.deepEqual(members, [['one', 'two', 'four'], ['four', 'five', 'six']]);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
it('should remove value from multiple keys', async function () {
|
||||
await db.sortedSetAdd('multiTest3', [1, 2, 3, 4], ['one', 'two', 'three', 'four']);
|
||||
await db.sortedSetAdd('multiTest4', [3, 4, 5, 6], ['three', 'four', 'five', 'six']);
|
||||
await db.sortedSetRemove(['multiTest3', 'multiTest4'], 'three');
|
||||
assert.deepStrictEqual(await db.getSortedSetRange('multiTest3', 0, -1), ['one', 'two', 'four']);
|
||||
assert.deepStrictEqual(await db.getSortedSetRange('multiTest4', 0, -1), ['four', 'five', 'six']);
|
||||
});
|
||||
|
||||
it('should remove multiple values from multiple keys', function (done) {
|
||||
|
||||
@@ -906,6 +906,22 @@ describe('Topic\'s', function () {
|
||||
},
|
||||
], done);
|
||||
});
|
||||
|
||||
it('should properly update topic vote count after forking', async () => {
|
||||
const result = await topics.post({ uid: fooUid, cid: categoryObj.cid, title: 'fork vote test', content: 'main post' });
|
||||
const reply1 = await topics.reply({ tid: result.topicData.tid, uid: fooUid, content: 'test reply 1' });
|
||||
const reply2 = await topics.reply({ tid: result.topicData.tid, uid: fooUid, content: 'test reply 2' });
|
||||
const reply3 = await topics.reply({ tid: result.topicData.tid, uid: fooUid, content: 'test reply 3' });
|
||||
await posts.upvote(result.postData.pid, adminUid);
|
||||
await posts.upvote(reply1.pid, adminUid);
|
||||
assert.strictEqual(await db.sortedSetScore('topics:votes', result.topicData.tid), 1);
|
||||
assert.strictEqual(await db.sortedSetScore('cid:' + categoryObj.cid + ':tids:votes', result.topicData.tid), 1);
|
||||
const newTopic = await topics.createTopicFromPosts(adminUid, 'Fork test, vote update', [reply1.pid, reply2.pid], result.topicData.tid);
|
||||
|
||||
assert.strictEqual(await db.sortedSetScore('topics:votes', newTopic.tid), 1);
|
||||
assert.strictEqual(await db.sortedSetScore('cid:' + categoryObj.cid + ':tids:votes', newTopic.tid), 1);
|
||||
assert.strictEqual(await topics.getTopicField(newTopic.tid, 'upvotes'), 1);
|
||||
});
|
||||
});
|
||||
|
||||
describe('controller', function () {
|
||||
|
||||
Reference in New Issue
Block a user