diff --git a/package.json b/package.json index 827b66ea49..c6319454ae 100644 --- a/package.json +++ b/package.json @@ -51,14 +51,14 @@ "nodebb-plugin-dbsearch": "1.0.1", "nodebb-plugin-emoji-one": "1.1.3", "nodebb-plugin-emoji-extended": "1.1.0", - "nodebb-plugin-markdown": "5.1.4", - "nodebb-plugin-mentions": "1.0.24", + "nodebb-plugin-markdown": "5.1.5", + "nodebb-plugin-mentions": "1.1.0", "nodebb-plugin-soundpack-default": "0.1.6", "nodebb-plugin-spam-be-gone": "0.4.6", "nodebb-rewards-essentials": "0.0.8", "nodebb-theme-lavender": "3.0.10", - "nodebb-theme-persona": "4.0.132", - "nodebb-theme-vanilla": "5.0.71", + "nodebb-theme-persona": "4.0.138", + "nodebb-theme-vanilla": "5.0.75", "nodebb-widget-essentials": "2.0.9", "nodemailer": "2.0.0", "nodemailer-sendmail-transport": "1.0.0", @@ -117,4 +117,4 @@ "url": "https://github.com/barisusakli" } ] -} \ No newline at end of file +} diff --git a/public/language/ar/error.json b/public/language/ar/error.json index 73e9b24094..a7812cddb0 100644 --- a/public/language/ar/error.json +++ b/public/language/ar/error.json @@ -22,6 +22,7 @@ "no-email-to-confirm": "هذا المنتدى يستلزم تفعيل بريدك الإلكتروني، انقر هنا من فضلك لإدخاله.", "email-confirm-failed": "لم نستطع تفعيل بريدك الإلكتروني، المرجو المحاولة لاحقًا.", "confirm-email-already-sent": "لقد تم ارسال بريد التأكيد، الرجاء اﻹنتظار 1% دقائق لإعادة اﻹرسال", + "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", "username-too-short": "اسم المستخدم قصير.", "username-too-long": "اسم المستخدم طويل", "password-too-long": "Password too long", diff --git a/public/language/ar/login.json b/public/language/ar/login.json index 29d256203f..c6007a15ff 100644 --- a/public/language/ar/login.json +++ b/public/language/ar/login.json @@ -5,7 +5,7 @@ "remember_me": "تذكرني؟", "forgot_password": "نسيت كلمة المرور؟", "alternative_logins": "تسجيلات الدخول البديلة", - "failed_login_attempt": "فشلت محاولة تسجيل الدخول، يرجى المحاولة مرة أخرى.", + "failed_login_attempt": "Login Unsuccessful", "login_successful": "قمت بتسجيل الدخول بنجاح!", "dont_have_account": "لا تملك حساب؟" } \ No newline at end of file diff --git a/public/language/ar/modules.json b/public/language/ar/modules.json index a92c2d6953..c753143075 100644 --- a/public/language/ar/modules.json +++ b/public/language/ar/modules.json @@ -29,6 +29,14 @@ "composer.submit_and_lock": "Submit and Lock", "composer.toggle_dropdown": "Toggle Dropdown", "composer.uploading": "Uploading %1", + "composer.formatting.bold": "Bold", + "composer.formatting.italic": "Italic", + "composer.formatting.list": "List", + "composer.formatting.strikethrough": "Strikethrough", + "composer.formatting.link": "Link", + "composer.formatting.picture": "Picture", + "composer.upload-picture": "Upload Image", + "composer.upload-file": "Upload File", "bootbox.ok": "OK", "bootbox.cancel": "إلغاء", "bootbox.confirm": "تأكيد", diff --git a/public/language/bg/error.json b/public/language/bg/error.json index 5a1e1a5e75..3086ffa309 100644 --- a/public/language/bg/error.json +++ b/public/language/bg/error.json @@ -22,6 +22,7 @@ "no-email-to-confirm": "Този форум изисква потвърдена е-поща. Моля, натиснете тук, за да въведете е-поща", "email-confirm-failed": "Не успяхме да потвърдим е-пощата Ви. Моля, опитайте отново по-късно.", "confirm-email-already-sent": "Е-писмото за потвърждение вече е изпратено. Моля, почакайте още %1 минута/и, преди да изпратите ново.", + "sendmail-not-found": "Изпълнимият файл на „sendmail“ не може да бъде намерен. Моля, уверете се, че е инсталиран и изпълним за потребителя, чрез който е пуснат NodeBB.", "username-too-short": "Потребителското име е твърде кратко", "username-too-long": "Потребителското име е твърде дълго", "password-too-long": "Паролата е твърде дълга", diff --git a/public/language/bg/login.json b/public/language/bg/login.json index f8340495af..4091422daa 100644 --- a/public/language/bg/login.json +++ b/public/language/bg/login.json @@ -5,7 +5,7 @@ "remember_me": "Запомнете ме?", "forgot_password": "Забравена парола?", "alternative_logins": "Други начини за влизане", - "failed_login_attempt": "Неуспешно влизане. Моля, опитайте отново.", + "failed_login_attempt": "Влизането беше неуспешно", "login_successful": "Вие влязохте успешно!", "dont_have_account": "Нямате акаунт?" } \ No newline at end of file diff --git a/public/language/bg/modules.json b/public/language/bg/modules.json index f3afdaaa4a..441f89ea42 100644 --- a/public/language/bg/modules.json +++ b/public/language/bg/modules.json @@ -29,6 +29,14 @@ "composer.submit_and_lock": "Публикуване и заключване", "composer.toggle_dropdown": "Превключване на падащото меню", "composer.uploading": "Качване на %1", + "composer.formatting.bold": "Получер", + "composer.formatting.italic": "Курсив", + "composer.formatting.list": "Списък", + "composer.formatting.strikethrough": "Зачертан", + "composer.formatting.link": "Връзка", + "composer.formatting.picture": "Снимка", + "composer.upload-picture": "Качване на изображение", + "composer.upload-file": "Качване на файл", "bootbox.ok": "Добре", "bootbox.cancel": "Отказ", "bootbox.confirm": "Потвърждаване", diff --git a/public/language/bn/error.json b/public/language/bn/error.json index b95faf8f70..76929fd53b 100644 --- a/public/language/bn/error.json +++ b/public/language/bn/error.json @@ -22,6 +22,7 @@ "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", "email-confirm-failed": "We could not confirm your email, please try again later.", "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", + "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", "username-too-short": "খুব ছোট ইউজারনেম", "username-too-long": "ইউজারনেম বড় হয়ে গিয়েছে", "password-too-long": "Password too long", diff --git a/public/language/bn/login.json b/public/language/bn/login.json index 7ecec47587..0fea8218ba 100644 --- a/public/language/bn/login.json +++ b/public/language/bn/login.json @@ -5,7 +5,7 @@ "remember_me": "মনে রাখুন", "forgot_password": "পাসওয়ার্ড ভুলে গিয়েছেন?", "alternative_logins": "বিকল্প প্রবেশ", - "failed_login_attempt": "প্রবেশ সফল হয় নি, আবার চেষ্টা করুন।", + "failed_login_attempt": "Login Unsuccessful", "login_successful": "আপনি সফলভাবে প্রবেশ করেছেন!", "dont_have_account": "কোন একাউন্ট নেই?" } \ No newline at end of file diff --git a/public/language/bn/modules.json b/public/language/bn/modules.json index 51c65a2a6a..567a648df0 100644 --- a/public/language/bn/modules.json +++ b/public/language/bn/modules.json @@ -29,6 +29,14 @@ "composer.submit_and_lock": "Submit and Lock", "composer.toggle_dropdown": "Toggle Dropdown", "composer.uploading": "Uploading %1", + "composer.formatting.bold": "Bold", + "composer.formatting.italic": "Italic", + "composer.formatting.list": "List", + "composer.formatting.strikethrough": "Strikethrough", + "composer.formatting.link": "Link", + "composer.formatting.picture": "Picture", + "composer.upload-picture": "Upload Image", + "composer.upload-file": "Upload File", "bootbox.ok": "OK", "bootbox.cancel": "Cancel", "bootbox.confirm": "Confirm", diff --git a/public/language/cs/category.json b/public/language/cs/category.json index d91e9ebda0..223da66ff3 100644 --- a/public/language/cs/category.json +++ b/public/language/cs/category.json @@ -1,16 +1,16 @@ { - "category": "Category", - "subcategories": "Subcategories", + "category": "Kategorie", + "subcategories": "Podkategorie", "new_topic_button": "Nové téma", - "guest-login-post": "Log in to post", + "guest-login-post": "Přihlásit se pro přidání", "no_topics": "V této kategorii zatím nejsou žádné příspěvky.
Můžeš být první!", "browsing": "prohlíží", "no_replies": "Nikdo ještě neodpověděl", - "no_new_posts": "No new posts.", + "no_new_posts": "Žádné nové příspěvky", "share_this_category": "Share this category", - "watch": "Watch", + "watch": "Sledovat", "ignore": "Ignorovat", - "watch.message": "You are now watching updates from this category", - "ignore.message": "You are now ignoring updates from this category", - "watched-categories": "Watched categories" + "watch.message": "Nyní sledujete aktualizace ve skupině", + "ignore.message": "Nyní ignorujete aktualizace ve skupině ", + "watched-categories": "Sledované kategorie" } \ No newline at end of file diff --git a/public/language/cs/email.json b/public/language/cs/email.json index b31b6dea73..cec1b4ac52 100644 --- a/public/language/cs/email.json +++ b/public/language/cs/email.json @@ -1,35 +1,35 @@ { "password-reset-requested": "Požadována obnova hesla - %1!", "welcome-to": "Vítejte v %1", - "invite": "Invitation from %1", + "invite": "Pozvánka od %1", "greeting_no_name": "Dobrý den", "greeting_with_name": "Dobrý den %1", "welcome.text1": "Děkujeme vám za registraci s %1!", "welcome.text2": "Pro úplnou aktivaci vašeho účtu potřebujeme ověřit vaší emailovou adresu.", - "welcome.text3": "An administrator has accepted your registration application. You can login with your username/password now.", + "welcome.text3": "Administrátor právě potvrdil vaší registraci. Nyní se můžete přihlásit jménem a heslem.", "welcome.cta": "Klikněte zde pro potvrzení vaší emailové adresy", - "invitation.text1": "%1 has invited you to join %2", - "invitation.ctr": "Click here to create your account.", + "invitation.text1": "%1 Vás pozval abyste se připojil k %2", + "invitation.ctr": "Klikněte zde pro vytvoření vašeho účtu", "reset.text1": "Obdrželi jsme požadavek na obnovu hesla, pravděpodobně kvůli tomu, že jste ho zapomněli. Pokud to není tento případ, ignorujte, prosím, tento email.", "reset.text2": "Přejete-li si pokračovat v obnově vašeho hesla, klikněte, prosím, na následující odkaz:", "reset.cta": "Klikněte zde, chcete-li obnovit vaše heslo", - "reset.notify.subject": "Password successfully changed", - "reset.notify.text1": "We are notifying you that on %1, your password was changed successfully.", - "reset.notify.text2": "If you did not authorise this, please notify an administrator immediately.", + "reset.notify.subject": "Heslo úspěšně změněno", + "reset.notify.text1": "Informujeme Vás, že na %1 vaše heslo bylo úspěšně změněno.", + "reset.notify.text2": "Pokud jste to neschválil, prosíme neprodleně kontaktujte správce.", "digest.notifications": "Máte tu nepřečtená oznámení od %1:", "digest.latest_topics": "Nejnovější témata od %1", "digest.cta": "Kliknutím zde navštívíte %1", "digest.unsub.info": "Tento výtah vám byl odeslán, protože jste si to nastavili ve vašich odběrech.", "digest.no_topics": "Dosud tu nebyly žádné aktivní témata %1", - "digest.day": "day", - "digest.week": "week", - "digest.month": "month", - "digest.subject": "Digest for %1", + "digest.day": "den", + "digest.week": "týden", + "digest.month": "měsíc", + "digest.subject": "Výběr pro %1", "notif.chat.subject": "Nová zpráva z chatu od %1", "notif.chat.cta": "Chcete-li pokračovat v konverzaci, klikněte zde.", "notif.chat.unsub.info": "Toto oznámení z chatu vám bylo zasláno, protože jste si to nastavili ve vašich odběrech.", - "notif.post.cta": "Click here to read the full topic", - "notif.post.unsub.info": "This post notification was sent to you due to your subscription settings.", + "notif.post.cta": "Klikněte zde pro přečtené celého tématu", + "notif.post.unsub.info": "Toto oznámení Vám bylo odesláno na základě vašeho nastavení odběru.", "test.text1": "Tento testovací email slouží k ověření, že mailer je správně nastaven. NodeBB.", "unsub.cta": "Chcete-li změnit tyto nastavení, klikněte zde.", "closing": "Díky!" diff --git a/public/language/cs/error.json b/public/language/cs/error.json index 7dae341dc3..001ed0998f 100644 --- a/public/language/cs/error.json +++ b/public/language/cs/error.json @@ -22,6 +22,7 @@ "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", "email-confirm-failed": "We could not confirm your email, please try again later.", "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", + "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", "username-too-short": "Uživatelské jméno je příliš krátké", "username-too-long": "Uživatelské jméno je příliš dlouhé", "password-too-long": "Password too long", @@ -94,11 +95,11 @@ "reload-failed": "NodeBB encountered a problem while reloading: \"%1\". NodeBB will continue to serve the existing client-side assets, although you should undo what you did just prior to reloading.", "registration-error": "Chyba při registraci", "parse-error": "Something went wrong while parsing server response", - "wrong-login-type-email": "Please use your email to login", - "wrong-login-type-username": "Please use your username to login", - "invite-maximum-met": "You have invited the maximum amount of people (%1 out of %2).", + "wrong-login-type-email": "Použijte prosím Váš e-mail pro přihlášení", + "wrong-login-type-username": "Použijte prosím Váše přihlašovací jméno pro přihlášení", + "invite-maximum-met": "Již jste pozval/a maximálně možný počet lidí (%1 z %2).", "no-session-found": "No login session found!", "not-in-room": "User not in room", "no-users-in-room": "No users in this room", - "cant-kick-self": "You can't kick yourself from the group" + "cant-kick-self": "Nemůžete vyhodit sami sebe ze kupiny" } \ No newline at end of file diff --git a/public/language/cs/global.json b/public/language/cs/global.json index 1f1900a0f6..6fe0e8d32c 100644 --- a/public/language/cs/global.json +++ b/public/language/cs/global.json @@ -3,10 +3,10 @@ "search": "Hledat", "buttons.close": "Zavřít", "403.title": "Přístup odepřen", - "403.message": "You seem to have stumbled upon a page that you do not have access to.", - "403.login": "Perhaps you should try logging in?", + "403.message": "Zdá se, že jste narazil/a na stránky na které nemáte přístup.", + "403.login": "Možná byste měli se zkusit přihlásit?", "404.title": "Stránka nenalezena", - "404.message": "You seem to have stumbled upon a page that does not exist. Return to the home page.", + "404.message": "Zdá se, že jste narazil/a na stránku která neexistuje. Vrátit se zpět na domovskou stránku.", "500.title": "Neznámá chyba", "500.message": "Jejda, vypadá to, že se něco pokazilo.", "register": "Registrovat", @@ -22,40 +22,40 @@ "pagination.out_of": "%1 z %2", "pagination.enter_index": "Enter index", "header.admin": "Administrace", - "header.categories": "Categories", + "header.categories": "Kategorie", "header.recent": "Aktuality", "header.unread": "Nepřečtené", "header.tags": "Tagy", "header.popular": "Populární", "header.users": "Uživatelé", - "header.groups": "Groups", + "header.groups": "Skupiny", "header.chats": "Chats", "header.notifications": "Oznámení", "header.search": "Hledat", "header.profile": "Můj profil", - "header.navigation": "Navigation", + "header.navigation": "Navigace", "notifications.loading": "Načítání upozornění", "chats.loading": "Načítání grafů", "motd.welcome": "Vítejte na NodeBB, diskusní platforma buducnosti.", "previouspage": "Předchozí stránka", "nextpage": "Další stránka", - "alert.success": "Success", + "alert.success": "Úspěch", "alert.error": "Chyba", "alert.banned": "Banned", "alert.banned.message": "You have just been banned, you will now be logged out.", - "alert.unfollow": "You are no longer following %1!", - "alert.follow": "You are now following %1!", + "alert.unfollow": "Již nesledujete %1!", + "alert.follow": "Nyní sledujete %1!", "online": "Online", "users": "Uživatelé", "topics": "Témata", "posts": "Příspěvky", - "best": "Best", + "best": "Nejlepší", "upvoted": "Upvoted", "downvoted": "Downvoted", "views": "Zobrazení", - "reputation": "Reputation", - "read_more": "read more", - "more": "More", + "reputation": "Reputace", + "read_more": "čtěte více", + "more": "Více", "posted_ago_by_guest": "posted %1 by Guest", "posted_ago_by": "posted %1 by %2", "posted_ago": "posted %1", @@ -69,9 +69,9 @@ "norecentposts": "Žádné nedávné příspěvky", "norecenttopics": "Žádné nedávné témata", "recentposts": "Nedávné příspěvky", - "recentips": "Recently Logged In IPs", + "recentips": "Naposledy zaznamenané IP adresy", "away": "Pryč", - "dnd": "Do not disturb", + "dnd": "Nevyrušovat", "invisible": "Neviditelný", "offline": "Offline", "email": "Email", @@ -80,15 +80,15 @@ "guests": "Hosté", "updated.title": "Fórum zaktualizováno", "updated.message": "Toto fórum bylo právě aktualizováno na poslední verzi. Klikněte zde a obnovte tuto stránku.", - "privacy": "Privacy", - "follow": "Follow", - "unfollow": "Unfollow", + "privacy": "Soukromí", + "follow": "Sledovat", + "unfollow": "Prestat sledovat", "delete_all": "Vymazat vše", - "map": "Map", + "map": "Mapa", "sessions": "Login Sessions", - "ip_address": "IP Address", - "enter_page_number": "Enter page number", - "upload_file": "Upload file", - "upload": "Upload", - "allowed-file-types": "Allowed file types are %1" + "ip_address": "IP adresa", + "enter_page_number": "Zadejte číslo stránky", + "upload_file": "Nahrár soubor", + "upload": "Nahrát", + "allowed-file-types": "Povolené typy souborů jsou %1" } \ No newline at end of file diff --git a/public/language/cs/groups.json b/public/language/cs/groups.json index 5bfd7ed3ec..c1684ee4f0 100644 --- a/public/language/cs/groups.json +++ b/public/language/cs/groups.json @@ -1,54 +1,54 @@ { "groups": "Skupiny", "view_group": "Prohlédnout skupinu", - "owner": "Group Owner", - "new_group": "Create New Group", - "no_groups_found": "There are no groups to see", - "pending.accept": "Accept", - "pending.reject": "Reject", - "pending.accept_all": "Accept All", - "pending.reject_all": "Reject All", - "pending.none": "There are no pending members at this time", - "invited.none": "There are no invited members at this time", - "invited.uninvite": "Rescind Invitation", - "invited.search": "Search for a user to invite to this group", - "invited.notification_title": "You have been invited to join %1", - "request.notification_title": "Group Membership Request from %1", - "request.notification_text": "%1 has requested to become a member of %2", - "cover-save": "Save", - "cover-saving": "Saving", - "details.title": "podrobnosti skupiny", + "owner": "Vlastník skupiny", + "new_group": "Vytvořit novou skupinu", + "no_groups_found": "Žádné skupiny k prohlížení", + "pending.accept": "Přijmout", + "pending.reject": "Odmítnout", + "pending.accept_all": "Přijmout vše", + "pending.reject_all": "Odmítnout vše", + "pending.none": "Žádní čekající členové v tuto chvíli", + "invited.none": "Žádní pozvaní členové v tuto chvíli", + "invited.uninvite": "Zrušit pozvánku", + "invited.search": "Hledat uživatele k pozvání do této skupiny", + "invited.notification_title": "Byl jste pozván abyste se připojil/a k %1", + "request.notification_title": "Požadavek na členství ve skupině od %1", + "request.notification_text": "%1 požádál o členství v %2", + "cover-save": "Uložit", + "cover-saving": "Ukládám", + "details.title": "Podrobnosti skupiny", "details.members": "Seznam členů", - "details.pending": "Pending Members", - "details.invited": "Invited Members", + "details.pending": "Čekající členové", + "details.invited": "Pozvaní členové", "details.has_no_posts": "Členové této skupiny dosud neodeslali ani jeden příspěvek.", "details.latest_posts": "Nejnovější příspěvky", - "details.private": "Private", - "details.disableJoinRequests": "Disable join requests", - "details.grant": "Grant/Rescind Ownership", - "details.kick": "Kick", - "details.owner_options": "Group Administration", - "details.group_name": "Group Name", - "details.member_count": "Member Count", - "details.creation_date": "Creation Date", - "details.description": "Description", - "details.badge_preview": "Badge Preview", - "details.change_icon": "Change Icon", - "details.change_colour": "Change Colour", - "details.badge_text": "Badge Text", - "details.userTitleEnabled": "Show Badge", - "details.private_help": "If enabled, joining of groups requires approval from a group owner", - "details.hidden": "Hidden", - "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually", - "details.delete_group": "Delete Group", - "details.private_system_help": "Private groups is disabled at system level, this option does not do anything", - "event.updated": "Group details have been updated", - "event.deleted": "The group \"%1\" has been deleted", - "membership.accept-invitation": "Accept Invitation", - "membership.invitation-pending": "Invitation Pending", - "membership.join-group": "Join Group", - "membership.leave-group": "Leave Group", - "membership.reject": "Reject", - "new-group.group_name": "Group Name:", - "upload-group-cover": "Upload group cover" + "details.private": "Soukromé", + "details.disableJoinRequests": "Zakázat žádosti o připojení", + "details.grant": "Přidat/Zrušit vlastnictví", + "details.kick": "Vyhodit", + "details.owner_options": "Administrátor skupiny", + "details.group_name": "Název skupiny", + "details.member_count": "Počet členů", + "details.creation_date": "Datum vytvoření", + "details.description": "Popis", + "details.badge_preview": "Náhled odznaku", + "details.change_icon": "Změnit ikonu", + "details.change_colour": "Změnit barvu", + "details.badge_text": "Text odznaku", + "details.userTitleEnabled": "Zobrazit odznak", + "details.private_help": "Pokud je povoleno, připojování do skupin vyžaduje schválení od vlastníka skupiny", + "details.hidden": "Skrytý", + "details.hidden_help": "Pokud je povoleno, tato skupina nebude zobrazena v seznamu skupin, uživatelé budou muset být pozváni manuálně", + "details.delete_group": "Odstranit skupinu", + "details.private_system_help": "Soukromé skupiny jsou zakázáné na systémové úrovni, tato možnost nic nedělá", + "event.updated": "Podrobnosti skupiny byly aktualizovány", + "event.deleted": "Skupina \"%1\" byla odstraněna", + "membership.accept-invitation": "Přijmout pozvání", + "membership.invitation-pending": "Čekající pozvání", + "membership.join-group": "Vstoupit do skupiny", + "membership.leave-group": "Opustit skupinu", + "membership.reject": "Odmítnout", + "new-group.group_name": "Název skupiny:", + "upload-group-cover": "Nahrát titulní obrázek skupiny" } \ No newline at end of file diff --git a/public/language/cs/login.json b/public/language/cs/login.json index 3308fbdde6..c6699ab6ae 100644 --- a/public/language/cs/login.json +++ b/public/language/cs/login.json @@ -5,7 +5,7 @@ "remember_me": "Zapamatovat si mě?", "forgot_password": "Zapomněli jste heslo?", "alternative_logins": "Další způsoby přihlášení", - "failed_login_attempt": "Přihlášení se nezdařilo, zkuste to prosím znovu.", + "failed_login_attempt": "Přihlášení neúspěšné", "login_successful": "Přihlášení proběhlo úspěšně!", "dont_have_account": "Nemáte účet?" } \ No newline at end of file diff --git a/public/language/cs/modules.json b/public/language/cs/modules.json index cb37aa7539..61bae78b68 100644 --- a/public/language/cs/modules.json +++ b/public/language/cs/modules.json @@ -17,7 +17,7 @@ "chat.seven_days": "7 dní", "chat.thirty_days": "30 dní", "chat.three_months": "3 měsíce", - "chat.delete_message_confirm": "Are you sure you wish to delete this message?", + "chat.delete_message_confirm": "Jste si jisti že chcete odstranit tuto zprávu?", "chat.roomname": "Chat Room %1", "chat.add-users-to-room": "Add users to room", "composer.compose": "Compose", @@ -29,9 +29,17 @@ "composer.submit_and_lock": "Submit and Lock", "composer.toggle_dropdown": "Toggle Dropdown", "composer.uploading": "Uploading %1", + "composer.formatting.bold": "Bold", + "composer.formatting.italic": "Italic", + "composer.formatting.list": "List", + "composer.formatting.strikethrough": "Strikethrough", + "composer.formatting.link": "Odkaz", + "composer.formatting.picture": "Obrázek", + "composer.upload-picture": "Nahrát obrázek", + "composer.upload-file": "Nahrát soubor", "bootbox.ok": "OK", "bootbox.cancel": "Cancel", - "bootbox.confirm": "Confirm", + "bootbox.confirm": "Potvrdit", "cover.dragging_title": "Cover Photo Positioning", "cover.dragging_message": "Drag the cover photo to the desired position and click \"Save\"", "cover.saved": "Cover photo image and position saved" diff --git a/public/language/cs/pages.json b/public/language/cs/pages.json index 285aa30017..b2dad21ab9 100644 --- a/public/language/cs/pages.json +++ b/public/language/cs/pages.json @@ -1,27 +1,27 @@ { "home": "Home", "unread": "Unread Topics", - "popular-day": "Popular topics today", - "popular-week": "Popular topics this week", - "popular-month": "Popular topics this month", - "popular-alltime": "All time popular topics", + "popular-day": "Dnešní oblíbená témata", + "popular-week": "Oblíbená témata pro tento týden", + "popular-month": "Oblíbená témata pro tento měsíc", + "popular-alltime": "Oblíbená témata za celou dobu", "recent": "Recent Topics", - "flagged-posts": "Flagged Posts", - "users/online": "Online Users", - "users/latest": "Latest Users", - "users/sort-posts": "Users with the most posts", - "users/sort-reputation": "Users with the most reputation", + "flagged-posts": "Označené příspěvky", + "users/online": "Uživatelé online", + "users/latest": "Nejnovější uživatelé", + "users/sort-posts": "Uživatelé s nejvíce příspěvky", + "users/sort-reputation": "Uživatelé s nejlepší reputací", "users/banned": "Banned Users", - "users/search": "User Search", + "users/search": "Hledání uživatele", "notifications": "Notifications", - "tags": "Tags", - "tag": "Topics tagged under \"%1\"", - "register": "Register an account", - "login": "Login to your account", - "reset": "Reset your account password", - "categories": "Categories", - "groups": "Groups", - "group": "%1 group", + "tags": "Tagy", + "tag": "Téma označeno pod \"%1\"", + "register": "Zaregistrovat účet", + "login": "Přihlásit se ke svému účtu", + "reset": "Obnovit heslo k účtu", + "categories": "Kategorie", + "groups": "Skupiny", + "group": "%1 skupina", "chats": "Chats", "chat": "Chatting with %1", "account/edit": "Editing \"%1\"", @@ -29,18 +29,18 @@ "account/edit/username": "Editing username of \"%1\"", "account/edit/email": "Editing email of \"%1\"", "account/following": "People %1 follows", - "account/followers": "People who follow %1", - "account/posts": "Posts made by %1", - "account/topics": "Topics created by %1", - "account/groups": "%1's Groups", + "account/followers": "Lidé kteří sledují %1", + "account/posts": "Příspěvky od %1", + "account/topics": "Příspěvky vytvořeny uživatelem %1", + "account/groups": "%1's skupiny", "account/favourites": "%1's Bookmarked Posts", - "account/settings": "User Settings", + "account/settings": "Uživatelské nastavení", "account/watched": "Topics watched by %1", "account/upvoted": "Posts upvoted by %1", "account/downvoted": "Posts downvoted by %1", - "account/best": "Best posts made by %1", - "confirm": "Email Confirmed", + "account/best": "Nejlepší příspěvky od %1", + "confirm": "Email potvrzen", "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", "maintenance.messageIntro": "Additionally, the administrator has left this message:", - "throttled.text": "%1 is currently unavailable due to excessive load. Please come back another time." + "throttled.text": "%1 je v současnou chvíli nedostupný pro velkou zátěž. Prosíme zkuste to za chvíli." } \ No newline at end of file diff --git a/public/language/cs/recent.json b/public/language/cs/recent.json index 13e8b2284e..68867fe0a5 100644 --- a/public/language/cs/recent.json +++ b/public/language/cs/recent.json @@ -3,17 +3,17 @@ "day": "Den", "week": "Týden", "month": "Měsíc", - "year": "Year", - "alltime": "All Time", - "no_recent_topics": "There are no recent topics.", - "no_popular_topics": "There are no popular topics.", - "there-is-a-new-topic": "There is a new topic.", - "there-is-a-new-topic-and-a-new-post": "There is a new topic and a new post.", - "there-is-a-new-topic-and-new-posts": "There is a new topic and %1 new posts.", - "there-are-new-topics": "There are %1 new topics.", - "there-are-new-topics-and-a-new-post": "There are %1 new topics and a new post.", - "there-are-new-topics-and-new-posts": "There are %1 new topics and %2 new posts.", - "there-is-a-new-post": "There is a new post.", - "there-are-new-posts": "There are %1 new posts.", - "click-here-to-reload": "Click here to reload." + "year": "Rok", + "alltime": "Pořád", + "no_recent_topics": "Nebyly nalezeny žádné nové téma.", + "no_popular_topics": "Žádná oblíbená téma.", + "there-is-a-new-topic": "K dispozici je nová téma.", + "there-is-a-new-topic-and-a-new-post": "K dispozici je nové téma a nový příspěvěk.", + "there-is-a-new-topic-and-new-posts": "K dispozici je nové téma a %1 nových příspěvků.", + "there-are-new-topics": "K dispozici je %1 nových témat.", + "there-are-new-topics-and-a-new-post": "K dispozici je %1 nových témat a jeden nový příspěvek.", + "there-are-new-topics-and-new-posts": "K dispozici je %1 nových témat a %2 nových příspěvků.", + "there-is-a-new-post": "K dispozici je nový příspěvek.", + "there-are-new-posts": "K dispozici je %1 nových příspěvků.", + "click-here-to-reload": "Kliknutím sem znovu načtete." } \ No newline at end of file diff --git a/public/language/cs/register.json b/public/language/cs/register.json index db7a689039..c6d339688a 100644 --- a/public/language/cs/register.json +++ b/public/language/cs/register.json @@ -15,5 +15,5 @@ "alternative_registration": "Jiný způsob registrace", "terms_of_use": "Podmínky", "agree_to_terms_of_use": "Souhlasím s Podmínkami", - "registration-added-to-queue": "Your registration has been added to the approval queue. You will receive an email when it is accepted by an administrator." + "registration-added-to-queue": "Vaše registrace byla přidána do fronty. Obdržíte e-mail až ji správce schválí." } \ No newline at end of file diff --git a/public/language/cs/search.json b/public/language/cs/search.json index 277c0a32bc..93fae4f92d 100644 --- a/public/language/cs/search.json +++ b/public/language/cs/search.json @@ -1,7 +1,7 @@ { "results_matching": "%1 result(s) matching \"%2\", (%3 seconds)", "no-matches": "No matches found", - "advanced-search": "Advanced Search", + "advanced-search": "Pokročilé hledání", "in": "In", "titles": "Titles", "titles-posts": "Titles and Posts", @@ -12,28 +12,28 @@ "at-least": "At least", "at-most": "At most", "post-time": "Post time", - "newer-than": "Newer than", - "older-than": "Older than", + "newer-than": "Novější než", + "older-than": "Starší než", "any-date": "Any date", - "yesterday": "Yesterday", - "one-week": "One week", - "two-weeks": "Two weeks", - "one-month": "One month", + "yesterday": "Včera", + "one-week": "Jeden týden", + "two-weeks": "Dva týdny", + "one-month": "Jeden měsíc", "three-months": "Three months", - "six-months": "Six months", - "one-year": "One year", - "sort-by": "Sort by", + "six-months": "Šest měsíců", + "one-year": "Jeden rok", + "sort-by": "Řadit dle", "last-reply-time": "Last reply time", "topic-title": "Topic title", "number-of-replies": "Number of replies", "number-of-views": "Number of views", "topic-start-date": "Topic start date", - "username": "Username", - "category": "Category", + "username": "Uživatelské jméno", + "category": "Kategorie", "descending": "In descending order", "ascending": "In ascending order", - "save-preferences": "Save preferences", - "clear-preferences": "Clear preferences", + "save-preferences": "Uložit nastavení", + "clear-preferences": "Vymazat nastavení", "search-preferences-saved": "Search preferences saved", "search-preferences-cleared": "Search preferences cleared", "show-results-as": "Show results as" diff --git a/public/language/cs/success.json b/public/language/cs/success.json index fde8a77044..e9dec2704e 100644 --- a/public/language/cs/success.json +++ b/public/language/cs/success.json @@ -1,6 +1,6 @@ { - "success": "Success", - "topic-post": "You have successfully posted.", - "authentication-successful": "Authentication Successful", - "settings-saved": "Settings saved!" + "success": "Úspěch", + "topic-post": "Úspěšně umístěno.", + "authentication-successful": "Úspěšné přihlášení", + "settings-saved": "Nastavení byla uložena!" } \ No newline at end of file diff --git a/public/language/cs/topic.json b/public/language/cs/topic.json index 8bdef36acc..2525cff40a 100644 --- a/public/language/cs/topic.json +++ b/public/language/cs/topic.json @@ -5,27 +5,27 @@ "no_topics_found": "Nebyla nalezena žádná témata!", "no_posts_found": "Nebyly nalezeny žádné příspěvky!", "post_is_deleted": "Tento příspěvek je vymazán!", - "topic_is_deleted": "This topic is deleted!", + "topic_is_deleted": "Toto téma je smazané!", "profile": "Profil", - "posted_by": "Posted by %1", - "posted_by_guest": "Posted by Guest", + "posted_by": "Přidal %1", + "posted_by_guest": "Přidal Host", "chat": "Chat", "notify_me": "Sledovat toto téma", "quote": "Citovat", "reply": "Odpovědět", - "reply-as-topic": "Reply as topic", - "guest-login-reply": "Log in to reply", + "reply-as-topic": "Odpovědět jako Téma", + "guest-login-reply": "Přihlásit se pro odpověď", "edit": "Upravit", "delete": "Smazat", - "purge": "Purge", - "restore": "Restore", + "purge": "Vypráznit", + "restore": "Obnovit", "move": "Přesunout", "fork": "Rozdělit", "link": "Odkaz", "share": "Sdílet", "tools": "Nástroje", "flag": "Flag", - "locked": "Locked", + "locked": "Uzamčeno", "bookmark_instructions": "Click here to return to the last read post in this thread.", "flag_title": "Flag this post for moderation", "flag_success": "This post has been flagged for moderation.", @@ -36,24 +36,24 @@ "markAsUnreadForAll.success": "Topic marked as unread for all.", "mark_unread": "Mark unread", "mark_unread.success": "Topic marked as unread.", - "watch": "Watch", + "watch": "Sledovat", "unwatch": "Unwatch", "watch.title": "Be notified of new replies in this topic", "unwatch.title": "Stop watching this topic", - "share_this_post": "Share this Post", + "share_this_post": "Sdílet toto téma", "thread_tools.title": "Topic Tools", "thread_tools.markAsUnreadForAll": "Označit jako nepřečtené", "thread_tools.pin": "Pin Topic", "thread_tools.unpin": "Unpin Topic", "thread_tools.lock": "Lock Topic", - "thread_tools.unlock": "Unlock Topic", - "thread_tools.move": "Move Topic", - "thread_tools.move_all": "Move All", + "thread_tools.unlock": "Odemknout téma", + "thread_tools.move": "Přesunout téma", + "thread_tools.move_all": "Přesunout vše", "thread_tools.fork": "Fork Topic", - "thread_tools.delete": "Delete Topic", - "thread_tools.delete-posts": "Delete Posts", + "thread_tools.delete": "Odstranit téma", + "thread_tools.delete-posts": "Odstranit přispěvky", "thread_tools.delete_confirm": "Are you sure you want to delete this topic?", - "thread_tools.restore": "Restore Topic", + "thread_tools.restore": "Obnovit téma", "thread_tools.restore_confirm": "Are you sure you want to restore this topic?", "thread_tools.purge": "Purge Topic", "thread_tools.purge_confirm": "Are you sure you want to purge this topic?", @@ -65,41 +65,41 @@ "disabled_categories_note": "Vypnuté (disabled) kategorie jsou šedé.", "confirm_move": "Přesunout", "confirm_fork": "Rozdělit", - "favourite": "Bookmark", - "favourites": "Bookmarks", + "favourite": "Záložka", + "favourites": "Záložky", "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", "loading_more_posts": "Načítání více příspěvků", "move_topic": "Přesunout téma", - "move_topics": "Move Topics", + "move_topics": "Přesunout témata", "move_post": "Přesunout příspěvek", - "post_moved": "Post moved!", + "post_moved": "Příspěvek přesunut!", "fork_topic": "Rozdělit příspěvek", "topic_will_be_moved_to": "Toto téma bude přesunuto do kategorie", "fork_topic_instruction": "Vyber příspěvky, které chceš oddělit", "fork_no_pids": "Žádné příspěvky nebyly vybrány!", "fork_success": "Successfully forked topic! Click here to go to the forked topic.", "delete_posts_instruction": "Click the posts you want to delete/purge", - "composer.title_placeholder": "Enter your topic title here...", - "composer.handle_placeholder": "Name", + "composer.title_placeholder": "Zadejte název tématu...", + "composer.handle_placeholder": "Jméno", "composer.discard": "Discard", - "composer.submit": "Submit", + "composer.submit": "Odeslat", "composer.replying_to": "Replying to %1", - "composer.new_topic": "New Topic", - "composer.uploading": "uploading...", + "composer.new_topic": "Nové téma", + "composer.uploading": "nahrávání...", "composer.thumb_url_label": "Paste a topic thumbnail URL", "composer.thumb_title": "Add a thumbnail to this topic", "composer.thumb_url_placeholder": "http://example.com/thumb.png", - "composer.thumb_file_label": "Or upload a file", + "composer.thumb_file_label": "Nebo nahrajte soubor", "composer.thumb_remove": "Clear fields", "composer.drag_and_drop_images": "Drag and Drop Images Here", "more_users_and_guests": "%1 more user(s) and %2 guest(s)", "more_users": "%1 more user(s)", "more_guests": "%1 more guest(s)", "users_and_others": "%1 and %2 others", - "sort_by": "Sort by", - "oldest_to_newest": "Oldest to Newest", - "newest_to_oldest": "Newest to Oldest", - "most_votes": "Most votes", + "sort_by": "Řadit dle", + "oldest_to_newest": "Od nejstarších po nejnovější", + "newest_to_oldest": "Od nejnovějších po nejstarší", + "most_votes": "Nejvíce hlasů", "most_posts": "Most posts", "stale.title": "Create new topic instead?", "stale.warning": "The topic you are replying to is quite old. Would you like to create a new topic instead, and reference this one in your reply?", diff --git a/public/language/cs/unread.json b/public/language/cs/unread.json index 1a12bc4fbe..6380aebc5d 100644 --- a/public/language/cs/unread.json +++ b/public/language/cs/unread.json @@ -7,7 +7,7 @@ "all": "Vše", "all_categories": "All categories", "topics_marked_as_read.success": "Téma bylo označeno jako přečtené!", - "all-topics": "All Topics", - "new-topics": "New Topics", - "watched-topics": "Watched Topics" + "all-topics": "Všechna témata", + "new-topics": "Nová témata", + "watched-topics": "Sledovaná témata" } \ No newline at end of file diff --git a/public/language/cs/uploads.json b/public/language/cs/uploads.json index 1622cb5693..0adbf0d9f0 100644 --- a/public/language/cs/uploads.json +++ b/public/language/cs/uploads.json @@ -1,6 +1,6 @@ { - "uploading-file": "Uploading the file...", - "select-file-to-upload": "Select a file to upload!", - "upload-success": "File uploaded successfully!", + "uploading-file": "Nahrávání souboru...", + "select-file-to-upload": "Vyberte soubor pro nahrání!", + "upload-success": "Soubor byl úspěšně nahrán!", "maximum-file-size": "Maximum %1 kb" } \ No newline at end of file diff --git a/public/language/cs/user.json b/public/language/cs/user.json index e380634dfc..fb65c1ee4b 100644 --- a/public/language/cs/user.json +++ b/public/language/cs/user.json @@ -11,8 +11,8 @@ "unban_account": "Odblokovat účet", "delete_account": "Vymazat účet", "delete_account_confirm": "Opravdu chcete smazat váš účet?
Tato akce je nevratná a nebude možné obnovit žádné vaše data.

Pro potvrzení smazání účtu napište vaše uživatelské jméno.", - "delete_this_account_confirm": "Are you sure you want to delete this account?
This action is irreversible and you will not be able to recover any data

", - "account-deleted": "Account deleted", + "delete_this_account_confirm": "Skutečně chcete zrušit tento účet?
Tato akce je nevratná a již nebude žádná možnost obnovení vašich dat

", + "account-deleted": "Účet smazán", "fullname": "Jméno a příjmení", "website": "Webové stránky", "location": "Poloha", @@ -22,7 +22,7 @@ "profile": "Profil", "profile_views": "Zobrazení profilu", "reputation": "Reputace", - "favourites": "Bookmarks", + "favourites": "Záložky", "watched": "Sledován", "followers": "Sledují ho", "following": "Sleduje", @@ -36,11 +36,11 @@ "more": "Více", "profile_update_success": "Profil byl úspěšně aktualizován!", "change_picture": "Změnit obrázek", - "change_username": "Change Username", - "change_email": "Change Email", + "change_username": "Změnit uživatelské jméno", + "change_email": "Změnit email", "edit": "Upravit", - "edit-profile": "Edit Profile", - "default_picture": "Default Icon", + "edit-profile": "Editovat profil", + "default_picture": "Výchozí ikonka", "uploaded_picture": "Nahraný obrázek", "upload_new_picture": "Nahrát nový obrázek", "upload_new_picture_from_url": "Nahrát nový obrázek z URL", @@ -54,23 +54,23 @@ "change_password_success": "Heslo je aktualizované!", "confirm_password": "Potvrzení hesla", "password": "Heslo", - "username_taken_workaround": "The username you requested was already taken, so we have altered it slightly. You are now known as %1", - "password_same_as_username": "Your password is the same as your username, please select another password.", - "password_same_as_email": "Your password is the same as your email, please select another password.", + "username_taken_workaround": "Zvolené uživatelské jméno je již zabrané, takže jsme ho trochu upravili. Nyní jste znám jako %1", + "password_same_as_username": "Vaše heslo je stejné jako vaše přihlašovací jméno. Zvolte si prosím jiné heslo.", + "password_same_as_email": "Vaše heslo je stejné jako email. Vyberte si prosím jiné heslo.", "upload_picture": "Nahrát obrázek", "upload_a_picture": "Nahrát obrázek", - "remove_uploaded_picture": "Remove Uploaded Picture", - "upload_cover_picture": "Upload cover picture", + "remove_uploaded_picture": "Odstranit nahraný obrázek", + "upload_cover_picture": "Náhrát titulní obrázek", "settings": "Nastavení", "show_email": "Zobrazovat můj email v profilu", "show_fullname": "Zobrazovat celé jméno", "restrict_chats": "Only allow chat messages from users I follow", - "digest_label": "Subscribe to Digest", + "digest_label": "Odebírat přehled", "digest_description": "Subscribe to email updates for this forum (new notifications and topics) according to a set schedule", - "digest_off": "Off", - "digest_daily": "Daily", - "digest_weekly": "Weekly", - "digest_monthly": "Monthly", + "digest_off": "Vypnuto", + "digest_daily": "Denně", + "digest_weekly": "Týdně", + "digest_monthly": "Měsíčně", "send_chat_notifications": "Send an email if a new chat message arrives and I am not online", "send_post_notifications": "Send an email when replies are made to topics I am subscribed to", "settings-require-reload": "Some setting changes require a reload. Click here to reload the page.", @@ -85,9 +85,9 @@ "email_hidden": "Skrytý email", "hidden": "skrytý", "paginate_description": "Paginate topics and posts instead of using infinite scroll", - "topics_per_page": "Topics per Page", - "posts_per_page": "Posts per Page", - "notification_sounds": "Play a sound when you receive a notification", + "topics_per_page": "Témat na stránce", + "posts_per_page": "Příspěvků na stránce", + "notification_sounds": "Přehrát zvuk když dostanete notifikaci", "browsing": "Browsing Settings", "open_links_in_new_tab": "Open outgoing links in new tab", "enable_topic_searching": "Enable In-Topic Searching", @@ -97,11 +97,11 @@ "scroll_to_my_post": "After posting a reply, show the new post", "follow_topics_you_reply_to": "Follow topics that you reply to", "follow_topics_you_create": "Follow topics you create", - "grouptitle": "Group Title", - "no-group-title": "No group title", - "select-skin": "Select a Skin", - "select-homepage": "Select a Homepage", - "homepage": "Homepage", + "grouptitle": "Nadpis skupiny", + "no-group-title": "Žádný nadpis skupiny", + "select-skin": "Vybrat skin", + "select-homepage": "Vybrat domovskou stránku", + "homepage": "Domovská stránka", "homepage_description": "Select a page to use as the forum homepage or 'None' to use the default homepage.", "custom_route": "Custom Homepage Route", "custom_route_help": "Enter a route name here, without any preceding slash (e.g. \"recent\", or \"popular\")", diff --git a/public/language/cs/users.json b/public/language/cs/users.json index 6145c20f2a..d1a3af5416 100644 --- a/public/language/cs/users.json +++ b/public/language/cs/users.json @@ -6,15 +6,15 @@ "enter_username": "Zadej uživatelské jméno k hledání", "load_more": "Načíst další", "users-found-search-took": "%1 user(s) found! Search took %2 seconds.", - "filter-by": "Filter By", - "online-only": "Online only", - "invite": "Invite", - "invitation-email-sent": "An invitation email has been sent to %1", - "user_list": "User List", - "recent_topics": "Recent Topics", - "popular_topics": "Popular Topics", - "unread_topics": "Unread Topics", - "categories": "Categories", - "tags": "Tags", - "no-users-found": "No users found!" + "filter-by": "Filtrovat dle", + "online-only": "Pouze online", + "invite": "Pozvat", + "invitation-email-sent": "E-mailová pozvánka byla odeslána na adresu %1", + "user_list": "Seznam uživatelů", + "recent_topics": "Poslední témata", + "popular_topics": "Oblíbená témata", + "unread_topics": "Nepřečtená témata", + "categories": "Kategorie", + "tags": "Tagy", + "no-users-found": "Nebyly nalezeny žádní uživatelé!" } \ No newline at end of file diff --git a/public/language/da/error.json b/public/language/da/error.json index 70ac398753..6f59d6352c 100644 --- a/public/language/da/error.json +++ b/public/language/da/error.json @@ -22,6 +22,7 @@ "no-email-to-confirm": "Dette forum kræver bekræftelse af din email, klik her for at indtaste en email", "email-confirm-failed": "Vi kunne ikke bekræfte din email, prøv igen senere.", "confirm-email-already-sent": "Bekræftelses email er allerede afsendt, vent venligt %1 minut(ter) for at sende endnu en.", + "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", "username-too-short": "Brugernavn er for kort", "username-too-long": "Brugernavn er for langt", "password-too-long": "Kodeord er for langt", diff --git a/public/language/da/login.json b/public/language/da/login.json index 1aabf6ec75..2196a937ee 100644 --- a/public/language/da/login.json +++ b/public/language/da/login.json @@ -5,7 +5,7 @@ "remember_me": "Husk mig?", "forgot_password": "Glemt kodeord?", "alternative_logins": "alternative logins", - "failed_login_attempt": "Login mislykkedes, venligt prøv igen.", + "failed_login_attempt": "Login Unsuccessful", "login_successful": "Du har successfuldt logged in!", "dont_have_account": "Har du ikke en konto?" } \ No newline at end of file diff --git a/public/language/da/modules.json b/public/language/da/modules.json index 31ea913abe..d54ad1ec52 100644 --- a/public/language/da/modules.json +++ b/public/language/da/modules.json @@ -29,6 +29,14 @@ "composer.submit_and_lock": "Send og lås", "composer.toggle_dropdown": "Skift mellem dropdown", "composer.uploading": "Uploader %1", + "composer.formatting.bold": "Bold", + "composer.formatting.italic": "Italic", + "composer.formatting.list": "List", + "composer.formatting.strikethrough": "Strikethrough", + "composer.formatting.link": "Link", + "composer.formatting.picture": "Picture", + "composer.upload-picture": "Upload Image", + "composer.upload-file": "Upload File", "bootbox.ok": "OK", "bootbox.cancel": "Annuller", "bootbox.confirm": "Bekræft", diff --git a/public/language/de/error.json b/public/language/de/error.json index 52009800ba..9e8b5f46e1 100644 --- a/public/language/de/error.json +++ b/public/language/de/error.json @@ -22,6 +22,7 @@ "no-email-to-confirm": "Dieses Forum setzt eine E-Mail-Bestätigung voraus, bitte klicke hier um eine E-Mail-Adresse einzugeben.", "email-confirm-failed": "Wir konnten deine E-Mail-Adresse nicht bestätigen, bitte versuch es später noch einmal", "confirm-email-already-sent": "Die Bestätigungsmail wurde verschickt, bitte warte %1 Minute(n) um eine Weitere zu verschicken.", + "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", "username-too-short": "Benutzername ist zu kurz", "username-too-long": "Benutzername ist zu lang", "password-too-long": "Passwort ist zu lang", diff --git a/public/language/de/login.json b/public/language/de/login.json index 8551266044..2c2d8267c1 100644 --- a/public/language/de/login.json +++ b/public/language/de/login.json @@ -5,7 +5,7 @@ "remember_me": "Eingeloggt bleiben?", "forgot_password": "Passwort vergessen?", "alternative_logins": "Alternative Logins", - "failed_login_attempt": " Anmeldeversuch fehlgeschlagen, versuche es erneut.", + "failed_login_attempt": "Login Unsuccessful", "login_successful": "Du hast dich erfolgreich eingeloggt!", "dont_have_account": "Du hast noch kein Konto?" } \ No newline at end of file diff --git a/public/language/de/modules.json b/public/language/de/modules.json index 2210c035fd..d4d5d5f6f4 100644 --- a/public/language/de/modules.json +++ b/public/language/de/modules.json @@ -29,6 +29,14 @@ "composer.submit_and_lock": "Einreichen und Sperren", "composer.toggle_dropdown": "Menu aus-/einblenden", "composer.uploading": "Lade %1 hoch", + "composer.formatting.bold": "Bold", + "composer.formatting.italic": "Italic", + "composer.formatting.list": "List", + "composer.formatting.strikethrough": "Strikethrough", + "composer.formatting.link": "Link", + "composer.formatting.picture": "Picture", + "composer.upload-picture": "Upload Image", + "composer.upload-file": "Upload File", "bootbox.ok": "OK", "bootbox.cancel": "Abbrechen", "bootbox.confirm": "Bestätigen", diff --git a/public/language/el/error.json b/public/language/el/error.json index 030e5497f1..a6ae7a4c8d 100644 --- a/public/language/el/error.json +++ b/public/language/el/error.json @@ -22,6 +22,7 @@ "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", "email-confirm-failed": "We could not confirm your email, please try again later.", "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", + "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", "username-too-short": "Το όνομα χρήστη είναι πολύ μικρό", "username-too-long": "Το όνομα χρήστη είναι πολύ μεγάλο", "password-too-long": "Password too long", diff --git a/public/language/el/login.json b/public/language/el/login.json index 6c10fb3de8..c46d2220f5 100644 --- a/public/language/el/login.json +++ b/public/language/el/login.json @@ -5,7 +5,7 @@ "remember_me": "Απομνημόνευση;", "forgot_password": "Ξέχασες τον κωδικό σου;", "alternative_logins": "Εναλλακτικά Login", - "failed_login_attempt": "Η προσπάθεια σύνδεσης απέτυχε, παρακαλώ προσπάθησε ξανά.", + "failed_login_attempt": "Login Unsuccessful", "login_successful": "Συνδέθηκες επιτυχώς!", "dont_have_account": "Δεν έχεις λογαριασμό;" } \ No newline at end of file diff --git a/public/language/el/modules.json b/public/language/el/modules.json index 4b1dc9e48a..af0d74e3cd 100644 --- a/public/language/el/modules.json +++ b/public/language/el/modules.json @@ -29,6 +29,14 @@ "composer.submit_and_lock": "Submit and Lock", "composer.toggle_dropdown": "Toggle Dropdown", "composer.uploading": "Uploading %1", + "composer.formatting.bold": "Bold", + "composer.formatting.italic": "Italic", + "composer.formatting.list": "List", + "composer.formatting.strikethrough": "Strikethrough", + "composer.formatting.link": "Link", + "composer.formatting.picture": "Picture", + "composer.upload-picture": "Upload Image", + "composer.upload-file": "Upload File", "bootbox.ok": "OK", "bootbox.cancel": "Cancel", "bootbox.confirm": "Confirm", diff --git a/public/language/en@pirate/category.json b/public/language/en@pirate/category.json index 631d322e1a..77f9fdcb92 100644 --- a/public/language/en@pirate/category.json +++ b/public/language/en@pirate/category.json @@ -7,10 +7,10 @@ "browsing": "browsin'", "no_replies": "No one has replied to ye message", "no_new_posts": "Thar be no new posts.", - "share_this_category": "Share this category", - "watch": "Watch", - "ignore": "Ignore", + "share_this_category": "Share 'tis category", + "watch": "Be watchin'", + "ignore": "Be ignorin'", "watch.message": "Ye now be watchin' updates from 'tis category", "ignore.message": "Ye now be ignorin' updates from 'tis category", - "watched-categories": "Watched categories" + "watched-categories": "Categories ye be watchin'" } \ No newline at end of file diff --git a/public/language/en@pirate/email.json b/public/language/en@pirate/email.json index 691e6309a2..1ffc2ef7a7 100644 --- a/public/language/en@pirate/email.json +++ b/public/language/en@pirate/email.json @@ -1,14 +1,14 @@ { "password-reset-requested": "Password Reset Requested - %1!", - "welcome-to": "Welcome to %1", - "invite": "Invitation from %1", + "welcome-to": "Ahoy thar %1!", + "invite": "Ye be invited by %1", "greeting_no_name": "Hello", "greeting_with_name": "Hello %1", "welcome.text1": "Thank you for registering with %1!", "welcome.text2": "To fully activate your account, we need to verify that you own the email address you registered with.", "welcome.text3": "An administrator has accepted your registration application. You can login with your username/password now.", "welcome.cta": "Click here to confirm your email address", - "invitation.text1": "%1 has invited you to join %2", + "invitation.text1": "%1 be invitin' ye to join %2", "invitation.ctr": "Click here to create your account.", "reset.text1": "We received a request to reset your password, possibly because you have forgotten it. If this is not the case, please ignore this email.", "reset.text2": "To continue with the password reset, please click on the following link:", diff --git a/public/language/en@pirate/error.json b/public/language/en@pirate/error.json index 56a5530e02..08c7c49be2 100644 --- a/public/language/en@pirate/error.json +++ b/public/language/en@pirate/error.json @@ -22,6 +22,7 @@ "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", "email-confirm-failed": "We could not confirm your email, please try again later.", "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", + "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", "username-too-short": "Username too short", "username-too-long": "Username too long", "password-too-long": "Password too long", diff --git a/public/language/en@pirate/login.json b/public/language/en@pirate/login.json index 6e7b7a36c0..a27ed4d761 100644 --- a/public/language/en@pirate/login.json +++ b/public/language/en@pirate/login.json @@ -5,7 +5,7 @@ "remember_me": "Remember Me?", "forgot_password": "My mind be a scatt'rbrain, help a matey out!", "alternative_logins": "Oth'r gangplanks", - "failed_login_attempt": "Failed login attempt, please give it a go' again.", + "failed_login_attempt": "Ye be refused boardin'", "login_successful": "Welcome on board, matey!", "dont_have_account": "Don't have an account?" } \ No newline at end of file diff --git a/public/language/en@pirate/modules.json b/public/language/en@pirate/modules.json index 0ae551df59..974cdf1b43 100644 --- a/public/language/en@pirate/modules.json +++ b/public/language/en@pirate/modules.json @@ -29,6 +29,14 @@ "composer.submit_and_lock": "Submit and Lock", "composer.toggle_dropdown": "Toggle Dropdown", "composer.uploading": "Uploading %1", + "composer.formatting.bold": "Bold", + "composer.formatting.italic": "Italic", + "composer.formatting.list": "List", + "composer.formatting.strikethrough": "Strikethrough", + "composer.formatting.link": "Link", + "composer.formatting.picture": "Picture", + "composer.upload-picture": "Upload Image", + "composer.upload-file": "Upload File", "bootbox.ok": "OK", "bootbox.cancel": "Cancel", "bootbox.confirm": "Confirm", diff --git a/public/language/en@pirate/uploads.json b/public/language/en@pirate/uploads.json index 1622cb5693..f124670d4e 100644 --- a/public/language/en@pirate/uploads.json +++ b/public/language/en@pirate/uploads.json @@ -1,6 +1,6 @@ { "uploading-file": "Uploading the file...", "select-file-to-upload": "Select a file to upload!", - "upload-success": "File uploaded successfully!", + "upload-success": "Ye file be uploaded!", "maximum-file-size": "Maximum %1 kb" } \ No newline at end of file diff --git a/public/language/en_US/error.json b/public/language/en_US/error.json index 56a5530e02..08c7c49be2 100644 --- a/public/language/en_US/error.json +++ b/public/language/en_US/error.json @@ -22,6 +22,7 @@ "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", "email-confirm-failed": "We could not confirm your email, please try again later.", "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", + "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", "username-too-short": "Username too short", "username-too-long": "Username too long", "password-too-long": "Password too long", diff --git a/public/language/en_US/login.json b/public/language/en_US/login.json index 70b7b98dd5..17c53b6628 100644 --- a/public/language/en_US/login.json +++ b/public/language/en_US/login.json @@ -5,7 +5,7 @@ "remember_me": "Remember Me?", "forgot_password": "Forgot Password?", "alternative_logins": "Alternative Logins", - "failed_login_attempt": "Failed login attempt, please try again.", + "failed_login_attempt": "Login Unsuccessful", "login_successful": "You have successfully logged in!", "dont_have_account": "Don't have an account?" } \ No newline at end of file diff --git a/public/language/en_US/modules.json b/public/language/en_US/modules.json index eb5e513640..b3775ab68f 100644 --- a/public/language/en_US/modules.json +++ b/public/language/en_US/modules.json @@ -29,6 +29,14 @@ "composer.submit_and_lock": "Submit and Lock", "composer.toggle_dropdown": "Toggle Dropdown", "composer.uploading": "Uploading %1", + "composer.formatting.bold": "Bold", + "composer.formatting.italic": "Italic", + "composer.formatting.list": "List", + "composer.formatting.strikethrough": "Strikethrough", + "composer.formatting.link": "Link", + "composer.formatting.picture": "Picture", + "composer.upload-picture": "Upload Image", + "composer.upload-file": "Upload File", "bootbox.ok": "OK", "bootbox.cancel": "Cancel", "bootbox.confirm": "Confirm", diff --git a/public/language/es/error.json b/public/language/es/error.json index 527c0cbfd2..eb6a1097a8 100644 --- a/public/language/es/error.json +++ b/public/language/es/error.json @@ -22,6 +22,7 @@ "no-email-to-confirm": "Este foro requiere confirmación de su email, por favor pulse aquí para introducir un email", "email-confirm-failed": "No se ha podido confirmar su email, por favor inténtelo de nuevo más tarde.", "confirm-email-already-sent": "El email de confirmación ya ha sido enviado, por favor espera %1 minuto(s) para enviar otro.", + "sendmail-not-found": "El ejecutable \"sendmail\" no ha sido encontrado, por favor asegúrate de que esta instalado en tu sistema y es accesible por el usuario que ejecuta NodeBB. ", "username-too-short": "Nombre de usuario es demasiado corto", "username-too-long": "Nombre de usuario demasiado largo", "password-too-long": "Contraseña muy corta", diff --git a/public/language/es/global.json b/public/language/es/global.json index d81c10ca88..f962a4fa80 100644 --- a/public/language/es/global.json +++ b/public/language/es/global.json @@ -36,7 +36,7 @@ "header.navigation": "Navegación", "notifications.loading": "Cargando notificaciones", "chats.loading": "Cargando chats", - "motd.welcome": "Bienvenido a NodeBB, la plataforma de debate del el futuro.", + "motd.welcome": "Bienvenido a NodeBB, la plataforma de debate del futuro.", "previouspage": "Página anterior", "nextpage": "Página siguiente", "alert.success": "¡Éxito!", diff --git a/public/language/es/login.json b/public/language/es/login.json index 448ce31f43..d6e357016e 100644 --- a/public/language/es/login.json +++ b/public/language/es/login.json @@ -4,8 +4,8 @@ "email": "Correo Electrónico", "remember_me": "¿Recordarme?", "forgot_password": "¿Olvidaste tu contraseña?", - "alternative_logins": "Métodos alternativos", - "failed_login_attempt": "Error al iniciar sesión, inténtalo otra vez.", + "alternative_logins": "Accesos alternativos", + "failed_login_attempt": "Error al iniciar sesión", "login_successful": "¡Identificado satisfactoriamente!", "dont_have_account": "¿Aún no tienes cuenta?" } \ No newline at end of file diff --git a/public/language/es/modules.json b/public/language/es/modules.json index f0e34b04a1..87cc59c2fb 100644 --- a/public/language/es/modules.json +++ b/public/language/es/modules.json @@ -29,6 +29,14 @@ "composer.submit_and_lock": "Enviar y Bloquear", "composer.toggle_dropdown": "Alternar desplegable", "composer.uploading": "Subiendo %1", + "composer.formatting.bold": "Negrita", + "composer.formatting.italic": "Itálica", + "composer.formatting.list": "Lista", + "composer.formatting.strikethrough": "Tachado", + "composer.formatting.link": "Enlace", + "composer.formatting.picture": "Foto", + "composer.upload-picture": "Subir foto", + "composer.upload-file": "Subir archivo", "bootbox.ok": "OK", "bootbox.cancel": "Cancelar", "bootbox.confirm": "Confirmar", diff --git a/public/language/es/recent.json b/public/language/es/recent.json index fbfb6238c0..8c959ca0d5 100644 --- a/public/language/es/recent.json +++ b/public/language/es/recent.json @@ -6,7 +6,7 @@ "year": "Año", "alltime": "Siempre", "no_recent_topics": "No hay publicaciones recientes.", - "no_popular_topics": "No hay tópicos populares", + "no_popular_topics": "No hay publicaciones populares", "there-is-a-new-topic": "Hay una nueva publicación.", "there-is-a-new-topic-and-a-new-post": "hay una nueva publicación y un nuevo mensaje.", "there-is-a-new-topic-and-new-posts": "Hay una nueva publicación y %1 nuevos mensajes.", @@ -15,5 +15,5 @@ "there-are-new-topics-and-new-posts": "Hay %1 nuevas publicaciones y %2 nuevos mensajes.", "there-is-a-new-post": "Hay un nuevo mensaje.", "there-are-new-posts": "Hay %1 nuevos mensajes.", - "click-here-to-reload": "Cliquea aquí para recargar." + "click-here-to-reload": "Click para recargar." } \ No newline at end of file diff --git a/public/language/et/error.json b/public/language/et/error.json index 05682e9068..334979ae0d 100644 --- a/public/language/et/error.json +++ b/public/language/et/error.json @@ -22,6 +22,7 @@ "no-email-to-confirm": "See foorum nõuab emaili kinnitust, palun vajuta siia, et sisestada email", "email-confirm-failed": "Meil ei õnnestunud sinu emaili kinnitada, proovi hiljem uuesti.", "confirm-email-already-sent": "Kinnituskiri on juba saadetud, palun oota %1 minut(it) uue kirja saatmiseks.", + "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", "username-too-short": "Kasutajanimi on liiga lühike", "username-too-long": "Kasutajanimi on liiga pikk", "password-too-long": "Parool liiga pikk", diff --git a/public/language/et/login.json b/public/language/et/login.json index 6c283a8b83..09a875ef4a 100644 --- a/public/language/et/login.json +++ b/public/language/et/login.json @@ -5,7 +5,7 @@ "remember_me": "Mäleta mind?", "forgot_password": "Unustasid parooli?", "alternative_logins": "Alternatiivsed sisse logimise võimalused", - "failed_login_attempt": "Sisse logimine ebaõnnestus, palun proovi uuesti.", + "failed_login_attempt": "Login Unsuccessful", "login_successful": "Edukalt sisse logitud!", "dont_have_account": "Pole veel kasutajat?" } \ No newline at end of file diff --git a/public/language/et/modules.json b/public/language/et/modules.json index ec23804489..0df09f3b63 100644 --- a/public/language/et/modules.json +++ b/public/language/et/modules.json @@ -29,6 +29,14 @@ "composer.submit_and_lock": "Kinnita ja Lukusta", "composer.toggle_dropdown": "Aktiveeri rippmenüü", "composer.uploading": "%1 Üleslaadimine", + "composer.formatting.bold": "Bold", + "composer.formatting.italic": "Italic", + "composer.formatting.list": "List", + "composer.formatting.strikethrough": "Strikethrough", + "composer.formatting.link": "Link", + "composer.formatting.picture": "Picture", + "composer.upload-picture": "Upload Image", + "composer.upload-file": "Upload File", "bootbox.ok": "Olgu", "bootbox.cancel": "Katkesta", "bootbox.confirm": "Kinnita", diff --git a/public/language/fa_IR/error.json b/public/language/fa_IR/error.json index 44dc7935e0..4b4a8095e9 100644 --- a/public/language/fa_IR/error.json +++ b/public/language/fa_IR/error.json @@ -22,6 +22,7 @@ "no-email-to-confirm": "ایمیل شما تایید نشده است ، لطفا برای وارد کردن ایمیل اینجا کلیک کنید", "email-confirm-failed": "سیستم موفق به تایید ایمیل شما نشد، لطفا بعدا دوباره سعی کنید", "confirm-email-already-sent": "ایمیل فعال‌سازی قبلا فرستاده شده، لطفا %1 دقیقه صبر کنید تا ایمیل دیگری بفرستید.", + "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", "username-too-short": "نام کاربری خیلی کوتاه است.", "username-too-long": "نام کاربری بسیار طولانیست", "password-too-long": "کلمه عبور بسیار طولانیست", diff --git a/public/language/fa_IR/login.json b/public/language/fa_IR/login.json index 578071109d..ea5e13bce4 100644 --- a/public/language/fa_IR/login.json +++ b/public/language/fa_IR/login.json @@ -5,7 +5,7 @@ "remember_me": "مرا به یاد بسپار؟", "forgot_password": "گذرواژه را فراموش کرده‌اید؟", "alternative_logins": "روش‌های درون آمدن جایگزین", - "failed_login_attempt": "شکست در درون آمدن، لطفا دوباره تلاش کنید.", + "failed_login_attempt": "Login Unsuccessful", "login_successful": "شما با موفقیت به درون آمده‌اید!", "dont_have_account": "حساب کاربری ندارید؟" } \ No newline at end of file diff --git a/public/language/fa_IR/modules.json b/public/language/fa_IR/modules.json index cae06f83b0..c60817f334 100644 --- a/public/language/fa_IR/modules.json +++ b/public/language/fa_IR/modules.json @@ -29,6 +29,14 @@ "composer.submit_and_lock": "ارسال و قفل", "composer.toggle_dropdown": "باز و بسته کردن کرکره", "composer.uploading": "در حال بارگذاری %1", + "composer.formatting.bold": "Bold", + "composer.formatting.italic": "Italic", + "composer.formatting.list": "List", + "composer.formatting.strikethrough": "Strikethrough", + "composer.formatting.link": "Link", + "composer.formatting.picture": "Picture", + "composer.upload-picture": "Upload Image", + "composer.upload-file": "Upload File", "bootbox.ok": "باشه", "bootbox.cancel": "لغو", "bootbox.confirm": "تایید", diff --git a/public/language/fi/error.json b/public/language/fi/error.json index 701277e694..35296e7776 100644 --- a/public/language/fi/error.json +++ b/public/language/fi/error.json @@ -22,6 +22,7 @@ "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", "email-confirm-failed": "We could not confirm your email, please try again later.", "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", + "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", "username-too-short": "Käyttäjänimi on liian lyhyt", "username-too-long": "Käyttäjänimi on liian pitkä", "password-too-long": "Password too long", diff --git a/public/language/fi/login.json b/public/language/fi/login.json index 3dc14792ee..a9c69851b2 100644 --- a/public/language/fi/login.json +++ b/public/language/fi/login.json @@ -5,7 +5,7 @@ "remember_me": "Muista minut?", "forgot_password": "Unohditko salasanasi?", "alternative_logins": "Vaihtoehtoiset kirjautumistavat", - "failed_login_attempt": "Kirjautumisyritys epäonnistui, ole hyvä ja yritä uudestaan.", + "failed_login_attempt": "Login Unsuccessful", "login_successful": "Olet onnistuneesti kirjautunut sisään!", "dont_have_account": "Ei käyttäjätunnusta?" } \ No newline at end of file diff --git a/public/language/fi/modules.json b/public/language/fi/modules.json index 978d306170..77fff03fd5 100644 --- a/public/language/fi/modules.json +++ b/public/language/fi/modules.json @@ -29,6 +29,14 @@ "composer.submit_and_lock": "Submit and Lock", "composer.toggle_dropdown": "Toggle Dropdown", "composer.uploading": "Uploading %1", + "composer.formatting.bold": "Bold", + "composer.formatting.italic": "Italic", + "composer.formatting.list": "List", + "composer.formatting.strikethrough": "Strikethrough", + "composer.formatting.link": "Link", + "composer.formatting.picture": "Picture", + "composer.upload-picture": "Upload Image", + "composer.upload-file": "Upload File", "bootbox.ok": "OK", "bootbox.cancel": "Cancel", "bootbox.confirm": "Confirm", diff --git a/public/language/fr/error.json b/public/language/fr/error.json index 6dddeafd53..e19debf3ad 100644 --- a/public/language/fr/error.json +++ b/public/language/fr/error.json @@ -22,6 +22,7 @@ "no-email-to-confirm": "Ce forum requiert une vérification de votre adresse email. Veuillez cliquer ici pour entrer une adresse.", "email-confirm-failed": "Votre adresse email n'a pas pu être vérifiée. Veuillez ré-essayer plus tard.", "confirm-email-already-sent": "L'email de confirmation a déjà été envoyé. Veuillez attendre %1 minute(s) avant de redemander un nouvel envoi.", + "sendmail-not-found": "L'application d'envoi de mail est introuvable, assurez-vous qu'elle est installée et que l'utilisateur servant à démarrer NodeBB ait des droits suffisants.", "username-too-short": "Nom d'utilisateur trop court", "username-too-long": "Nom d'utilisateur trop long", "password-too-long": "Mot de passe trop long", diff --git a/public/language/fr/login.json b/public/language/fr/login.json index 6470717691..41150728c6 100644 --- a/public/language/fr/login.json +++ b/public/language/fr/login.json @@ -5,7 +5,7 @@ "remember_me": "Se souvenir de moi ?", "forgot_password": "Mot de passe oublié ?", "alternative_logins": "Autres méthodes de connexion", - "failed_login_attempt": "Echèc d'authentification, veuillez réessayer.", + "failed_login_attempt": "Identification échouée", "login_successful": "Vous êtes maintenant connecté !", "dont_have_account": "Vous n'avez pas de compte ?" } \ No newline at end of file diff --git a/public/language/fr/modules.json b/public/language/fr/modules.json index 33fd5fe494..bc05644724 100644 --- a/public/language/fr/modules.json +++ b/public/language/fr/modules.json @@ -29,6 +29,14 @@ "composer.submit_and_lock": "Envoyer et verrouiller", "composer.toggle_dropdown": "Afficher/masquer le menu", "composer.uploading": "Envoi en cours %1", + "composer.formatting.bold": "Gras", + "composer.formatting.italic": "Italique", + "composer.formatting.list": "Liste", + "composer.formatting.strikethrough": "Barré", + "composer.formatting.link": "Lien", + "composer.formatting.picture": "Image", + "composer.upload-picture": "Envoyer une image", + "composer.upload-file": "Envoyer un fichier", "bootbox.ok": "OK", "bootbox.cancel": "Annuler", "bootbox.confirm": "Confirmer", diff --git a/public/language/gl/email.json b/public/language/gl/email.json index 6f0be26023..9d13746d08 100644 --- a/public/language/gl/email.json +++ b/public/language/gl/email.json @@ -24,7 +24,7 @@ "digest.day": "día", "digest.week": "semana", "digest.month": "mes", - "digest.subject": "Digest for %1", + "digest.subject": "Resumo de 1%", "notif.chat.subject": "Nova charla recibida de %1", "notif.chat.cta": "Pica aquí para continuar a conversación", "notif.chat.unsub.info": "Esta notificación de charla foiche enviada polas túas opcións de subscrición.", diff --git a/public/language/gl/error.json b/public/language/gl/error.json index 862bdbcda3..1fd85fdab3 100644 --- a/public/language/gl/error.json +++ b/public/language/gl/error.json @@ -22,12 +22,13 @@ "no-email-to-confirm": "Este foro require confirmación de correo, por favor pica aquí para introducir un correo.", "email-confirm-failed": "Non podemos confirmar o teu correo, por favor téntao de novo máis tarde.", "confirm-email-already-sent": "O correo de confirmación foi enviado, agarda %1 minute(s) para enviar outro.", + "sendmail-not-found": "Non se atopa o executable \"sendmail\", por favor, asegúrate de que está instalado no teu sistema e que é accesible polo usuario que executa NodeBB. ", "username-too-short": "Nome de usuario demasiado curto", "username-too-long": "Nome de usuario demasiado longo.", "password-too-long": "Contrasinal moi longa", "user-banned": "Usuario expulsado", "user-too-new": "Desculpa, agarda %1 second(s) antes de facer a túa primeira publicación.", - "blacklisted-ip": "Sorry, your IP address has been banned from this community. If you feel this is in error, please contact an administrator.", + "blacklisted-ip": "Sentímolo, o teu enderezo IP foi baneado desta comunidade. Se crees que se debe a un erro, por favor, contacte cun administrador.", "no-category": "A categoría non existe", "no-topic": "O tema non existe", "no-post": "A publicación non existe", @@ -51,8 +52,8 @@ "still-uploading": "Por favor, agarda a que remate a subida.", "file-too-big": "O tamaño máximo permitido é %1 kB - por favor, sube un arquivo máis pequeno", "guest-upload-disabled": "As subidas están deshabilitadas para os convidados", - "already-favourited": "You have already bookmarked this post", - "already-unfavourited": "You have already unbookmarked this post", + "already-favourited": "Xa gardaras esta publicación.", + "already-unfavourited": "Xa desgardaras esta publicación.", "cant-ban-other-admins": "Non podes botar outros administradores!", "cant-remove-last-admin": "Eres o único administrador. Engade outros administradores antes de quitarte a ti mesmo como administrador.", "invalid-image-type": "Tipo de imaxe inválida. Tipos admitidos: %1", @@ -85,7 +86,7 @@ "cant-edit-chat-message": "Non tes permitido editar esta mensaxe.", "cant-remove-last-user": "Non podes quitar o último usuario", "cant-delete-chat-message": "Non tes permitido borrar esta mensaxe.", - "already-voting-for-this-post": "You have already voted for this post.", + "already-voting-for-this-post": "Xa votache esta mensaxe.", "reputation-system-disabled": "O sistema de reputación está deshabilitado", "downvoting-disabled": "Os votos negativos están deshabilitados", "not-enough-reputation-to-downvote": "Non tes reputación dabonda para esta acción", @@ -99,6 +100,6 @@ "invite-maximum-met": "Convidaches á cantidade máxima de persoas (%1 de %2).", "no-session-found": "Non se atopa ningún inicio de sesión!", "not-in-room": "O usuario non se encontra nesta sala", - "no-users-in-room": "No users in this room", - "cant-kick-self": "You can't kick yourself from the group" + "no-users-in-room": "Non hai usuarios nesta sala", + "cant-kick-self": "Non te podes expulsar a ti mesmo do grupo" } \ No newline at end of file diff --git a/public/language/gl/global.json b/public/language/gl/global.json index 6ff44536a7..f2398c524c 100644 --- a/public/language/gl/global.json +++ b/public/language/gl/global.json @@ -87,8 +87,8 @@ "map": "Mapa", "sessions": "Inicios de sesión", "ip_address": "Enderezo IP", - "enter_page_number": "Enter page number", - "upload_file": "Upload file", - "upload": "Upload", - "allowed-file-types": "Allowed file types are %1" + "enter_page_number": "Escribe o número da páxina", + "upload_file": "Subir arquivo ", + "upload": "Subir", + "allowed-file-types": "Os tipos de arquivos permitidos son: %1" } \ No newline at end of file diff --git a/public/language/gl/groups.json b/public/language/gl/groups.json index d9b33b659d..f0f16871e4 100644 --- a/public/language/gl/groups.json +++ b/public/language/gl/groups.json @@ -41,7 +41,7 @@ "details.hidden": "Oculto", "details.hidden_help": "Se está habilitado, este grupo non se poderá atopar na listaxe de grupos e os usuarios deberán ser convidados manualmente.", "details.delete_group": "Eliminar Grupo", - "details.private_system_help": "Private groups is disabled at system level, this option does not do anything", + "details.private_system_help": "Os grupos privados están desactivados ao nivel do sistema, esta opción non trocará nada.", "event.updated": "Os detalles do grupo foron actualizados", "event.deleted": "O grupo \"%1\" foi borrado.", "membership.accept-invitation": "Aceptar ", @@ -50,5 +50,5 @@ "membership.leave-group": "Marchar do grupo", "membership.reject": "Rexeitar", "new-group.group_name": "Nome do grupo:", - "upload-group-cover": "Upload group cover" + "upload-group-cover": "Cargar foto para o grupo" } \ No newline at end of file diff --git a/public/language/gl/login.json b/public/language/gl/login.json index 34e3a89ecb..d2fc82f95b 100644 --- a/public/language/gl/login.json +++ b/public/language/gl/login.json @@ -5,7 +5,7 @@ "remember_me": "Lembrarme?", "forgot_password": "Esqueciches o teu contrasinal?", "alternative_logins": "Métodos alternativos", - "failed_login_attempt": "Erro ao iniciar sesión, téntao de novo.", + "failed_login_attempt": "Erro ao iniciar sesión", "login_successful": "Sesión iniciada con éxito!", "dont_have_account": "Aínda non tes conta?" } \ No newline at end of file diff --git a/public/language/gl/modules.json b/public/language/gl/modules.json index a50f0a5a03..d097d97686 100644 --- a/public/language/gl/modules.json +++ b/public/language/gl/modules.json @@ -6,7 +6,7 @@ "chat.user_typing": "%1 está a escribir...", "chat.user_has_messaged_you": "%1 enviouche unha mensaxe.", "chat.see_all": "Ver tódalas chamadas", - "chat.mark_all_read": "Mark all chats read", + "chat.mark_all_read": "Marcar tódolos chats como lidos ", "chat.no-messages": "Por favor, seleccione un destinatario para ver o historial das mensaxes ", "chat.no-users-in-room": "Non hai usuarios nesta sala", "chat.recent-chats": "Charlas Recentes", @@ -29,6 +29,14 @@ "composer.submit_and_lock": "Enviar e bloquear", "composer.toggle_dropdown": "Alternar despregable", "composer.uploading": "Subindo %1", + "composer.formatting.bold": "Negriña", + "composer.formatting.italic": "Itálica", + "composer.formatting.list": "Lista", + "composer.formatting.strikethrough": "Tachado", + "composer.formatting.link": "Ligazón", + "composer.formatting.picture": "Foto", + "composer.upload-picture": "Subir foto", + "composer.upload-file": "Subir arquivo", "bootbox.ok": "De acordo", "bootbox.cancel": "Cancelar", "bootbox.confirm": "Confirmar", diff --git a/public/language/gl/notifications.json b/public/language/gl/notifications.json index 2796d782a0..c13bca0593 100644 --- a/public/language/gl/notifications.json +++ b/public/language/gl/notifications.json @@ -16,9 +16,9 @@ "upvoted_your_post_in_multiple": "%1 e %2 máis votaron positivamente a túa mensaxe en %3.", "moved_your_post": "%1 moveu a túa publicación a%2", "moved_your_topic": "%1 foi movido %2", - "favourited_your_post_in": "%1 has bookmarked your post in %2.", - "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", - "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", + "favourited_your_post_in": "%1 gardouse a súa publicación en%2.", + "favourited_your_post_in_dual": "%1 y %2 gardaron a súa publicación en%3.", + "favourited_your_post_in_multiple": "%1 e outros %2 usuarios gardaron a súa publicación en %3.", "user_flagged_post_in": "%1 reportou unha mensaxe en %2", "user_flagged_post_in_dual": "%1 e %2 reportaron a túa mensaxe en %3", "user_flagged_post_in_multiple": "%1 e outras %2 persoas reportaron unha mensaxe en %3", @@ -30,7 +30,7 @@ "user_started_following_you_dual": "%1 e %2 comezaron a seguirte.", "user_started_following_you_multiple": "%1 e %2 máis comezaron a seguirte.", "new_register": "%1 enviou unha petición de rexistro.", - "new_register_multiple": "There are %1 registration requests awaiting review.", + "new_register_multiple": "Hai %1 peticións de rexistros pendentes de revisión", "email-confirmed": "Correo confirmado", "email-confirmed-message": "Grazas por validar o teu correo. A túa conta agora está activada.", "email-confirm-error-message": "Houbo un problema validando o teu correo. Poida que o código fose inválido ou expirase. ", diff --git a/public/language/gl/pages.json b/public/language/gl/pages.json index b0a97d55cd..1e79b68418 100644 --- a/public/language/gl/pages.json +++ b/public/language/gl/pages.json @@ -33,13 +33,13 @@ "account/posts": "Publicación de %1", "account/topics": "Temas de %1", "account/groups": "%1's Grupos", - "account/favourites": "%1's Bookmarked Posts", + "account/favourites": "Publicacións favoritas de %1 ", "account/settings": "Opcións de Usuario", "account/watched": "Temas vistos por %1", "account/upvoted": "Mensaxes votadas positivamente por %1", "account/downvoted": "Mensaxes votadas negativamente por %1", "account/best": "Mellores mensaxes escritas por %1", - "confirm": "Email Confirmed", + "confirm": "Enderezo electrónico confirmado", "maintenance.text": "%1 está baixo mantemento. Por favor, volve máis tarde.", "maintenance.messageIntro": "A máis, o administrador deixou esta mensaxe: ", "throttled.text": "&1 non está dispoñible debido a unha carga excesiva. Por favor, volva noutro momento" diff --git a/public/language/gl/topic.json b/public/language/gl/topic.json index 0e92d43b08..c1771dd834 100644 --- a/public/language/gl/topic.json +++ b/public/language/gl/topic.json @@ -26,7 +26,7 @@ "tools": "Ferramentas", "flag": "Reportar", "locked": "Pechado", - "bookmark_instructions": "Click here to return to the last read post in this thread.", + "bookmark_instructions": "Pica aquí para volver á última mensaxe lida neste tema ", "flag_title": "Reportar esta mensaxe", "flag_success": "Esta mensaxe foi reportada para moderación.", "deleted_message": "Este tema foi borrado. Só os usuarios con privilexios administrativos poden velo.", @@ -65,9 +65,9 @@ "disabled_categories_note": "As categorías deshabilitadas están en gris", "confirm_move": "Mover", "confirm_fork": "Dividir", - "favourite": "Bookmark", - "favourites": "Bookmarks", - "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", + "favourite": "Marcador", + "favourites": "Marcadores", + "favourites.has_no_favourites": "Aínda non marcache ningún tema. ", "loading_more_posts": "Cargando máis publicacións", "move_topic": "Mover Tema", "move_topics": "Mover Temas", diff --git a/public/language/gl/unread.json b/public/language/gl/unread.json index 5581208821..bb0975ec26 100644 --- a/public/language/gl/unread.json +++ b/public/language/gl/unread.json @@ -7,7 +7,7 @@ "all": "Todos", "all_categories": "Tódalas categorías", "topics_marked_as_read.success": "Temas marcados como lidos", - "all-topics": "All Topics", - "new-topics": "New Topics", - "watched-topics": "Watched Topics" + "all-topics": "Tódolos Temas", + "new-topics": "Temas Novos", + "watched-topics": "Temas Suscritos" } \ No newline at end of file diff --git a/public/language/gl/uploads.json b/public/language/gl/uploads.json index 1622cb5693..223d022e87 100644 --- a/public/language/gl/uploads.json +++ b/public/language/gl/uploads.json @@ -1,6 +1,6 @@ { - "uploading-file": "Uploading the file...", - "select-file-to-upload": "Select a file to upload!", - "upload-success": "File uploaded successfully!", - "maximum-file-size": "Maximum %1 kb" + "uploading-file": "Subindo o arquivo...", + "select-file-to-upload": "Selecciona un arquivo para subir!", + "upload-success": "Arquivo subido correctamente!", + "maximum-file-size": "Máximo %1 kb" } \ No newline at end of file diff --git a/public/language/gl/user.json b/public/language/gl/user.json index ce8498bb1a..59e0d1a9c6 100644 --- a/public/language/gl/user.json +++ b/public/language/gl/user.json @@ -22,7 +22,7 @@ "profile": "Perfil", "profile_views": "Visitas ao perfil:", "reputation": "Reputación", - "favourites": "Bookmarks", + "favourites": "Marcadores", "watched": "Visto", "followers": "Seguidores", "following": "Seguindo", @@ -39,7 +39,7 @@ "change_username": "Cambia-lo nome de usuario", "change_email": "Cambia-lo correo", "edit": "Editar", - "edit-profile": "Edit Profile", + "edit-profile": "Editar Perfil", "default_picture": "Icona por defecto.", "uploaded_picture": "Foto subida", "upload_new_picture": "Subir unha nova foto", @@ -56,11 +56,11 @@ "password": "Contrasinal", "username_taken_workaround": "Ese nome de usuario xa estaba collido, así que o modificamos lixeiramente. Agora o teu nome é %1 ", "password_same_as_username": "O teu contrasinal e o teu nome de usuario son os mesmos, por favor, escolle outro contrasinal.", - "password_same_as_email": "Your password is the same as your email, please select another password.", + "password_same_as_email": "O teu contrasinal é igual que o teu enderezo electrónico, por favor, escolle outro contrasinal.", "upload_picture": "Subir foto", "upload_a_picture": "Subir unha foto", "remove_uploaded_picture": "Borrar unha foto subida", - "upload_cover_picture": "Upload cover picture", + "upload_cover_picture": "Subir imaxen de portada", "settings": "Opcións", "show_email": "Amosa-lo meu Email", "show_fullname": "Amosa-lo meu Nome Completo", @@ -92,12 +92,12 @@ "open_links_in_new_tab": "Abrir ligazóns externos nunca nova pestaña", "enable_topic_searching": "Permitir buscar dentro dun tema", "topic_search_help": "Se se activa, o buscador do NodeBB superporase ao propio do navegador dentro de cada tema, permitindo buscar en todo o tema e non só naquilo que se presenta na pantalla.", - "delay_image_loading": "Delay Image Loading", - "image_load_delay_help": "If enabled, images in topics will not load until they are scrolled into view", - "scroll_to_my_post": "After posting a reply, show the new post", + "delay_image_loading": "Retrasar a carga de imaxes", + "image_load_delay_help": "Se se habilita, as imaxes non cargarán hasta que sexan visibles na pantalla", + "scroll_to_my_post": "Logo de enviar unha resposta, mostrar a nova mensaxe", "follow_topics_you_reply_to": "Segui-los temas nos que respostas", "follow_topics_you_create": "Segui-los temas que ti fas", - "grouptitle": "Group Title", + "grouptitle": "Título do Grupo", "no-group-title": "Sen titulo de grupo", "select-skin": "Seleccionar apariencia", "select-homepage": "Escolla unha páxina de inicio", diff --git a/public/language/he/error.json b/public/language/he/error.json index 3386b8a054..5592b1d9cb 100644 --- a/public/language/he/error.json +++ b/public/language/he/error.json @@ -22,6 +22,7 @@ "no-email-to-confirm": "פורום זה דורש אישור בדוא\"ל, אנא לחץ כאן כדי להכניס לדואר אלקטרוני", "email-confirm-failed": "לא הצלחנו לאשר את הדוא\"ל שלך, תנסה שוב אחר כך", "confirm-email-already-sent": "מייל האישור כבר נשלח, אנא המתן %1 דקות כדי לשלוח מייל נוסף.", + "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", "username-too-short": "שם משתמש קצר מדי", "username-too-long": "שם משתמש ארוך מדי", "password-too-long": "הסיסמה ארוכה מדי", diff --git a/public/language/he/login.json b/public/language/he/login.json index 6142a8a045..c0c679e0cd 100644 --- a/public/language/he/login.json +++ b/public/language/he/login.json @@ -5,7 +5,7 @@ "remember_me": "זכור אותי?", "forgot_password": "שכחת סיסמתך?", "alternative_logins": "התחבר באמצעות...", - "failed_login_attempt": "נסיון התחברות נכשל, נסה שוב.", + "failed_login_attempt": "Login Unsuccessful", "login_successful": "התחברת בהצלחה!", "dont_have_account": "אין לך חשבון עדיין?" } \ No newline at end of file diff --git a/public/language/he/modules.json b/public/language/he/modules.json index 6b6f8c40f3..3664bac5b3 100644 --- a/public/language/he/modules.json +++ b/public/language/he/modules.json @@ -29,6 +29,14 @@ "composer.submit_and_lock": "אשר ונעל", "composer.toggle_dropdown": "הדלק/כבה את התפריט הנפתח", "composer.uploading": "העלאה %1", + "composer.formatting.bold": "Bold", + "composer.formatting.italic": "Italic", + "composer.formatting.list": "List", + "composer.formatting.strikethrough": "Strikethrough", + "composer.formatting.link": "Link", + "composer.formatting.picture": "Picture", + "composer.upload-picture": "Upload Image", + "composer.upload-file": "Upload File", "bootbox.ok": "בסדר", "bootbox.cancel": "בטל", "bootbox.confirm": "אשר", diff --git a/public/language/hu/error.json b/public/language/hu/error.json index db1c8cd322..fc1fbd3fed 100644 --- a/public/language/hu/error.json +++ b/public/language/hu/error.json @@ -22,6 +22,7 @@ "no-email-to-confirm": "Ez a fórum e-mail megerősítést kíván, kérlek kattints ide egy cím beírásához", "email-confirm-failed": "Nem tudtuk ellenőrizni az e-mail címedet, kérlek próbálkozz később.", "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", + "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", "username-too-short": "Túl rövid felhasználónév", "username-too-long": "Túl hosszú felhasználónév", "password-too-long": "Password too long", diff --git a/public/language/hu/login.json b/public/language/hu/login.json index 14be774171..4323321c44 100644 --- a/public/language/hu/login.json +++ b/public/language/hu/login.json @@ -5,7 +5,7 @@ "remember_me": "Megjegyzés", "forgot_password": "Elfelejtett Jelszó?", "alternative_logins": "Alternatív belépés", - "failed_login_attempt": "Sikertelen belépési kísérlet, kérlek próbálkozzunk újra.", + "failed_login_attempt": "Login Unsuccessful", "login_successful": "Sikeres belépés", "dont_have_account": "Nincs még fiók?" } \ No newline at end of file diff --git a/public/language/hu/modules.json b/public/language/hu/modules.json index 65142c04d3..e7262c7dff 100644 --- a/public/language/hu/modules.json +++ b/public/language/hu/modules.json @@ -29,6 +29,14 @@ "composer.submit_and_lock": "Submit and Lock", "composer.toggle_dropdown": "Toggle Dropdown", "composer.uploading": "Uploading %1", + "composer.formatting.bold": "Bold", + "composer.formatting.italic": "Italic", + "composer.formatting.list": "List", + "composer.formatting.strikethrough": "Strikethrough", + "composer.formatting.link": "Link", + "composer.formatting.picture": "Picture", + "composer.upload-picture": "Upload Image", + "composer.upload-file": "Upload File", "bootbox.ok": "OK", "bootbox.cancel": "Cancel", "bootbox.confirm": "Confirm", diff --git a/public/language/id/error.json b/public/language/id/error.json index d3cc609cfe..d308c417b5 100644 --- a/public/language/id/error.json +++ b/public/language/id/error.json @@ -22,6 +22,7 @@ "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", "email-confirm-failed": "We could not confirm your email, please try again later.", "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", + "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", "username-too-short": "Username terlalu pendek", "username-too-long": "Username terlalu panjang", "password-too-long": "Password too long", diff --git a/public/language/id/login.json b/public/language/id/login.json index 7a1c52fe71..48aa87589d 100644 --- a/public/language/id/login.json +++ b/public/language/id/login.json @@ -5,7 +5,7 @@ "remember_me": "Ingin Diingat?", "forgot_password": "Lupa Password?", "alternative_logins": "Login Alternatif", - "failed_login_attempt": "Percobaan login gagal, cobalah kembali.", + "failed_login_attempt": "Login Unsuccessful", "login_successful": "Kamu telah berhasil login!", "dont_have_account": "Belum memiliki akun?" } \ No newline at end of file diff --git a/public/language/id/modules.json b/public/language/id/modules.json index 7ddec19b96..bd2946c9d7 100644 --- a/public/language/id/modules.json +++ b/public/language/id/modules.json @@ -29,6 +29,14 @@ "composer.submit_and_lock": "Submit and Lock", "composer.toggle_dropdown": "Toggle Dropdown", "composer.uploading": "Uploading %1", + "composer.formatting.bold": "Bold", + "composer.formatting.italic": "Italic", + "composer.formatting.list": "List", + "composer.formatting.strikethrough": "Strikethrough", + "composer.formatting.link": "Link", + "composer.formatting.picture": "Picture", + "composer.upload-picture": "Upload Image", + "composer.upload-file": "Upload File", "bootbox.ok": "OK", "bootbox.cancel": "Cancel", "bootbox.confirm": "Confirm", diff --git a/public/language/it/error.json b/public/language/it/error.json index ec1f8d0e9b..d0ddddf45a 100644 --- a/public/language/it/error.json +++ b/public/language/it/error.json @@ -22,6 +22,7 @@ "no-email-to-confirm": "Questo forum richiede la conferma dell'indirizzo email, per favore clicca qui per inserirne uno", "email-confirm-failed": "Non possiamo confermare la tua email, per favore prova ancora più tardi.", "confirm-email-already-sent": "Email di conferma già inviata, per favore attendere %1 minuti per richiederne un'altra.", + "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", "username-too-short": "Nome utente troppo corto", "username-too-long": "Nome utente troppo lungo", "password-too-long": "Password troppo lunga", diff --git a/public/language/it/login.json b/public/language/it/login.json index f04d6cdfb4..cdfa00c223 100644 --- a/public/language/it/login.json +++ b/public/language/it/login.json @@ -5,7 +5,7 @@ "remember_me": "Ricordami?", "forgot_password": "Password dimenticata?", "alternative_logins": "Accessi Alternativi", - "failed_login_attempt": "Tentativo di accesso fallito, prova ancora.", + "failed_login_attempt": "Login Unsuccessful", "login_successful": "Sei entrato con successo!", "dont_have_account": "Non hai un account?" } \ No newline at end of file diff --git a/public/language/it/modules.json b/public/language/it/modules.json index fd58d80dd1..1d39879d23 100644 --- a/public/language/it/modules.json +++ b/public/language/it/modules.json @@ -29,6 +29,14 @@ "composer.submit_and_lock": "Invia e Blocca", "composer.toggle_dropdown": "Mostra/Nascondi menu a discesa", "composer.uploading": "Uploading %1", + "composer.formatting.bold": "Bold", + "composer.formatting.italic": "Italic", + "composer.formatting.list": "List", + "composer.formatting.strikethrough": "Strikethrough", + "composer.formatting.link": "Link", + "composer.formatting.picture": "Picture", + "composer.upload-picture": "Upload Image", + "composer.upload-file": "Upload File", "bootbox.ok": "OK", "bootbox.cancel": "Annulla", "bootbox.confirm": "Conferma", diff --git a/public/language/ja/error.json b/public/language/ja/error.json index a6147ee989..c84f8c161e 100644 --- a/public/language/ja/error.json +++ b/public/language/ja/error.json @@ -22,6 +22,7 @@ "no-email-to-confirm": "このフォーラムを利用するにはメールアドレスの確認を行う必要があります。メールアドレスを確認するためにはここをクリックしてください。", "email-confirm-failed": "メールアドレスの確認が出来ませんでした。再度お試しください。", "confirm-email-already-sent": "確認のメールは既に送信されています。再度送信するには、%1分後に再度お試しください。", + "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", "username-too-short": "ユーザー名が短すぎます", "username-too-long": "ユーザー名が長すぎます", "password-too-long": "パスワードが長すぎます", diff --git a/public/language/ja/login.json b/public/language/ja/login.json index 916593a30d..59c72797e6 100644 --- a/public/language/ja/login.json +++ b/public/language/ja/login.json @@ -5,7 +5,7 @@ "remember_me": "ログイン情報を記憶", "forgot_password": "パスワードを忘れましたか?", "alternative_logins": "ほかのログイン方法", - "failed_login_attempt": "ログインに失敗しました.ユーザー名やパスワードをご確認ください。", + "failed_login_attempt": "Login Unsuccessful", "login_successful": "ログインしました!", "dont_have_account": "アカウントをもっていませんか?" } \ No newline at end of file diff --git a/public/language/ja/modules.json b/public/language/ja/modules.json index 204c392bbb..bc661721f9 100644 --- a/public/language/ja/modules.json +++ b/public/language/ja/modules.json @@ -29,6 +29,14 @@ "composer.submit_and_lock": "Submit and Lock", "composer.toggle_dropdown": "Toggle Dropdown", "composer.uploading": "Uploading %1", + "composer.formatting.bold": "Bold", + "composer.formatting.italic": "Italic", + "composer.formatting.list": "List", + "composer.formatting.strikethrough": "Strikethrough", + "composer.formatting.link": "Link", + "composer.formatting.picture": "Picture", + "composer.upload-picture": "Upload Image", + "composer.upload-file": "Upload File", "bootbox.ok": "OK", "bootbox.cancel": "Cancel", "bootbox.confirm": "Confirm", diff --git a/public/language/ko/error.json b/public/language/ko/error.json index 01e81ea804..fb0eedc042 100644 --- a/public/language/ko/error.json +++ b/public/language/ko/error.json @@ -22,6 +22,7 @@ "no-email-to-confirm": "이메일 인증이 필요합니다. 이곳을 클릭하여 이메일 입력하세요.", "email-confirm-failed": "이메일 인증이 실패하였습니다. 잠시 후에 다시 시도하세요.", "confirm-email-already-sent": "인증 메일이 이미 발송되었습니다. %1 분 이후에 재 발송이 가능합니다.", + "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", "username-too-short": "사용자 이름이 너무 짧습니다.", "username-too-long": "사용자 이름이 너무 깁니다.", "password-too-long": "패스워드가 너무 깁니다.", diff --git a/public/language/ko/login.json b/public/language/ko/login.json index 61413fcb8a..d71e824596 100644 --- a/public/language/ko/login.json +++ b/public/language/ko/login.json @@ -5,7 +5,7 @@ "remember_me": "로그인 유지", "forgot_password": "비밀번호 초기화", "alternative_logins": "다른 방법으로 로그인", - "failed_login_attempt": "로그인에 실패했습니다.", + "failed_login_attempt": "Login Unsuccessful", "login_successful": "성공적으로 로그인했습니다.", "dont_have_account": "계정이 없으신가요?" } \ No newline at end of file diff --git a/public/language/ko/modules.json b/public/language/ko/modules.json index 99aea82699..3d7b19c6a1 100644 --- a/public/language/ko/modules.json +++ b/public/language/ko/modules.json @@ -29,6 +29,14 @@ "composer.submit_and_lock": "잠금 상태로 작성 완료", "composer.toggle_dropdown": "내려서 확인하기", "composer.uploading": "%1 업로드 중", + "composer.formatting.bold": "Bold", + "composer.formatting.italic": "Italic", + "composer.formatting.list": "List", + "composer.formatting.strikethrough": "Strikethrough", + "composer.formatting.link": "Link", + "composer.formatting.picture": "Picture", + "composer.upload-picture": "Upload Image", + "composer.upload-file": "Upload File", "bootbox.ok": "확인", "bootbox.cancel": "취소", "bootbox.confirm": "확인", diff --git a/public/language/lt/error.json b/public/language/lt/error.json index fa04fa5803..7e087906d9 100644 --- a/public/language/lt/error.json +++ b/public/language/lt/error.json @@ -22,6 +22,7 @@ "no-email-to-confirm": "Šis forumas reikalauja patvirtinimo el. paštu prašome spausti čia el. adreso įrašymui", "email-confirm-failed": "Negalime patvirtinti jūsų el. adreso, prašom bandyti vėliau.", "confirm-email-already-sent": "Patvirtinimo laiškas išsiųstas, prašome palaukti %1 minute(s) kad išsiųstume kita", + "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", "username-too-short": "Slapyvardis per trumpas", "username-too-long": "Vartotojo vardas per ilgas", "password-too-long": "Password too long", diff --git a/public/language/lt/login.json b/public/language/lt/login.json index dd18d2949c..09d9b42d62 100644 --- a/public/language/lt/login.json +++ b/public/language/lt/login.json @@ -5,7 +5,7 @@ "remember_me": "Prisiminti?", "forgot_password": "Užmiršote slaptažodį?", "alternative_logins": "Alternatyvūs prisijungimo būdai", - "failed_login_attempt": "Prisijungti nepavyko, bandykite dar kartą.", + "failed_login_attempt": "Login Unsuccessful", "login_successful": "Jūs sėkmingai prisijungėte!", "dont_have_account": "Neturite paskyros?" } \ No newline at end of file diff --git a/public/language/lt/modules.json b/public/language/lt/modules.json index 252dd3bfa3..a490086245 100644 --- a/public/language/lt/modules.json +++ b/public/language/lt/modules.json @@ -29,6 +29,14 @@ "composer.submit_and_lock": "Pateikti ir užrakinti", "composer.toggle_dropdown": "Perjungti Nukritimą", "composer.uploading": "Uploading %1", + "composer.formatting.bold": "Bold", + "composer.formatting.italic": "Italic", + "composer.formatting.list": "List", + "composer.formatting.strikethrough": "Strikethrough", + "composer.formatting.link": "Link", + "composer.formatting.picture": "Picture", + "composer.upload-picture": "Upload Image", + "composer.upload-file": "Upload File", "bootbox.ok": "OK", "bootbox.cancel": "Cancel", "bootbox.confirm": "Confirm", diff --git a/public/language/ms/error.json b/public/language/ms/error.json index 8466ee6bbe..3930f53059 100644 --- a/public/language/ms/error.json +++ b/public/language/ms/error.json @@ -22,6 +22,7 @@ "no-email-to-confirm": "Forum ini memerlukan pengesahan emel, sila klik sini untuk memasukkan emel", "email-confirm-failed": "Kami tidak dapat memastikan emel anda, sila cuba lagi nanti", "confirm-email-already-sent": "Pengesahan emel telah dihantar, sila tunggu %1 minit() untuk menghantar yang baru.", + "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", "username-too-short": "Nama pengunna terlalu pendek", "username-too-long": "Nama pengunna terlalu panjang", "password-too-long": "Kata laluan terlalu panjang", diff --git a/public/language/ms/login.json b/public/language/ms/login.json index 7536a7c973..3c3a1fd1d1 100644 --- a/public/language/ms/login.json +++ b/public/language/ms/login.json @@ -5,7 +5,7 @@ "remember_me": "Ingatkan Saya", "forgot_password": "Lupa Kata Laluan?", "alternative_logins": "Log Masuk Alternatif", - "failed_login_attempt": "Log masuk gagal, sila cuba lagi.", + "failed_login_attempt": "Login Unsuccessful", "login_successful": "Anda berjaya log masuk!", "dont_have_account": "Tiada akaun?" } \ No newline at end of file diff --git a/public/language/ms/modules.json b/public/language/ms/modules.json index 996443d174..774d674123 100644 --- a/public/language/ms/modules.json +++ b/public/language/ms/modules.json @@ -29,6 +29,14 @@ "composer.submit_and_lock": "Hantar dan Kunci", "composer.toggle_dropdown": "Togol Kebawah", "composer.uploading": "Memuat naik %1", + "composer.formatting.bold": "Bold", + "composer.formatting.italic": "Italic", + "composer.formatting.list": "List", + "composer.formatting.strikethrough": "Strikethrough", + "composer.formatting.link": "Link", + "composer.formatting.picture": "Picture", + "composer.upload-picture": "Upload Image", + "composer.upload-file": "Upload File", "bootbox.ok": "Ok", "bootbox.cancel": "Batal", "bootbox.confirm": "Pasti", diff --git a/public/language/nb/error.json b/public/language/nb/error.json index ab24f7cf2b..ff6dbda377 100644 --- a/public/language/nb/error.json +++ b/public/language/nb/error.json @@ -22,6 +22,7 @@ "no-email-to-confirm": "Dette forumet krever e-postbekreftelse, vennligst klikk her for å skrive inn en e-post", "email-confirm-failed": "Vi kunne ikke bekrefte e-posten din, vennligst prøv igjen senere.", "confirm-email-already-sent": "E-post for bekreftelse er allerede sendt, vennligst vent %1 minutt(er) for å sende en til.", + "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", "username-too-short": "Brukernavnet er for kort", "username-too-long": "Brukernavnet er for langt", "password-too-long": "Password too long", diff --git a/public/language/nb/login.json b/public/language/nb/login.json index 785a7defc4..cdf5766265 100644 --- a/public/language/nb/login.json +++ b/public/language/nb/login.json @@ -5,7 +5,7 @@ "remember_me": "Husk meg?", "forgot_password": "Glemt passord?", "alternative_logins": "Alternativ innlogging", - "failed_login_attempt": "Mislykket innloggingsforsøk, vennligst prøv igjen.", + "failed_login_attempt": "Login Unsuccessful", "login_successful": "Du har blitt logget inn!", "dont_have_account": "Har du ikke en konto?" } \ No newline at end of file diff --git a/public/language/nb/modules.json b/public/language/nb/modules.json index a25a971028..6b3309287d 100644 --- a/public/language/nb/modules.json +++ b/public/language/nb/modules.json @@ -29,6 +29,14 @@ "composer.submit_and_lock": "Send og lås", "composer.toggle_dropdown": "Veksle nedtrekksfelt", "composer.uploading": "Uploading %1", + "composer.formatting.bold": "Bold", + "composer.formatting.italic": "Italic", + "composer.formatting.list": "List", + "composer.formatting.strikethrough": "Strikethrough", + "composer.formatting.link": "Link", + "composer.formatting.picture": "Picture", + "composer.upload-picture": "Upload Image", + "composer.upload-file": "Upload File", "bootbox.ok": "OK", "bootbox.cancel": "Avbryt", "bootbox.confirm": "Bekreft", diff --git a/public/language/nl/error.json b/public/language/nl/error.json index 6b042d72e0..02030890f9 100644 --- a/public/language/nl/error.json +++ b/public/language/nl/error.json @@ -22,6 +22,7 @@ "no-email-to-confirm": "Dit berichtenforum vereist bevestiging per e-mail, klik hier om een e-mailadres te registreren", "email-confirm-failed": "Helaas kon het e-mailadres niet bevestigd worden, probeer het later nog eens.", "confirm-email-already-sent": "Bevestigingsmail is zojuist al verzonden, wacht alsjeblieft %1 minuut (minuten) voordat je opnieuw een bevestigingsmail aanvraagt.", + "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", "username-too-short": "Gebruikersnaam is te kort", "username-too-long": "Gebruikersnaam is te lang", "password-too-long": "Wachtwoord is te lang", diff --git a/public/language/nl/login.json b/public/language/nl/login.json index 9b84acdc8a..d03d51ffde 100644 --- a/public/language/nl/login.json +++ b/public/language/nl/login.json @@ -5,7 +5,7 @@ "remember_me": "Aangemeld blijven?", "forgot_password": "Wachtwoord vergeten?", "alternative_logins": "Andere manieren van aanmelden", - "failed_login_attempt": "Aanmelden niet geslaagd. Probeer het nog eens.", + "failed_login_attempt": "Login Unsuccessful", "login_successful": "Je bent succesvol ingelogd!", "dont_have_account": "Geen gebruikersaccount?" } \ No newline at end of file diff --git a/public/language/nl/modules.json b/public/language/nl/modules.json index dd7de3cc62..dcb755bc64 100644 --- a/public/language/nl/modules.json +++ b/public/language/nl/modules.json @@ -29,6 +29,14 @@ "composer.submit_and_lock": "Bericht plaatsen en sluiten", "composer.toggle_dropdown": "Keuzelijst schakelen", "composer.uploading": "Uploaden van %1", + "composer.formatting.bold": "Bold", + "composer.formatting.italic": "Italic", + "composer.formatting.list": "List", + "composer.formatting.strikethrough": "Strikethrough", + "composer.formatting.link": "Link", + "composer.formatting.picture": "Picture", + "composer.upload-picture": "Upload Image", + "composer.upload-file": "Upload File", "bootbox.ok": "OK", "bootbox.cancel": "Annuleren", "bootbox.confirm": "Bevestig", diff --git a/public/language/pl/error.json b/public/language/pl/error.json index f36ce1a124..24516197a6 100644 --- a/public/language/pl/error.json +++ b/public/language/pl/error.json @@ -22,6 +22,7 @@ "no-email-to-confirm": "To forum wymaga weryfikacji przez email. Proszę kliknąć tutaj, aby wprowadzić adres.", "email-confirm-failed": "Nie byliśmy w stanie potwierdzić twojego email-a. Proszę spróbować później.", "confirm-email-already-sent": "Email potwierdzający został już wysłany, proszę odczekaj jeszcze %1 minut(y), aby wysłać kolejny.", + "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", "username-too-short": "Nazwa użytkownika za krótka", "username-too-long": "Zbyt długa nazwa użytkownika", "password-too-long": "Hasło jest za długie", diff --git a/public/language/pl/login.json b/public/language/pl/login.json index 1133f6afba..4c02c73c6d 100644 --- a/public/language/pl/login.json +++ b/public/language/pl/login.json @@ -5,7 +5,7 @@ "remember_me": "Zapamiętaj mnie", "forgot_password": "Zapomniałeś hasło?", "alternative_logins": "Alternatywne logowanie", - "failed_login_attempt": "Nie udało się zalogować. Spróbuj ponownie.", + "failed_login_attempt": "Login Unsuccessful", "login_successful": "Zostałeś pomyślnie zalogowany.", "dont_have_account": "Nie masz konta?" } \ No newline at end of file diff --git a/public/language/pl/modules.json b/public/language/pl/modules.json index 4ae07a0b74..2fa29ed5ae 100644 --- a/public/language/pl/modules.json +++ b/public/language/pl/modules.json @@ -29,6 +29,14 @@ "composer.submit_and_lock": "Prześlij i Zablokuj", "composer.toggle_dropdown": "Przełącz Listę Rozwijaną", "composer.uploading": "Wysyłanie %1", + "composer.formatting.bold": "Bold", + "composer.formatting.italic": "Italic", + "composer.formatting.list": "List", + "composer.formatting.strikethrough": "Strikethrough", + "composer.formatting.link": "Link", + "composer.formatting.picture": "Picture", + "composer.upload-picture": "Upload Image", + "composer.upload-file": "Upload File", "bootbox.ok": "OK", "bootbox.cancel": "Anuluj", "bootbox.confirm": "Potwierdź", diff --git a/public/language/pt_BR/error.json b/public/language/pt_BR/error.json index 8e91a585e8..d7e9f197c5 100644 --- a/public/language/pt_BR/error.json +++ b/public/language/pt_BR/error.json @@ -22,6 +22,7 @@ "no-email-to-confirm": "Este fórum exige confirmação de email, por gentileza clique aqui para digitar um email", "email-confirm-failed": "Nós não pudemos confirmar seu email, por gentileza tente novamente mais tarde.", "confirm-email-already-sent": "O email de confirmação já foi enviado, por favor aguarde %1 minuto(s) para enviar outro.", + "sendmail-not-found": "O executável do sendmail não pôde ser encontrado, por favor se certifique de que ele está instalado e é executável pelo usuário que roda o NodeBB.", "username-too-short": "Nome de usuário muito curto", "username-too-long": "Nome de usuário muito longo", "password-too-long": "A senha é muito grande", diff --git a/public/language/pt_BR/login.json b/public/language/pt_BR/login.json index 7b8299af75..eaccc74fac 100644 --- a/public/language/pt_BR/login.json +++ b/public/language/pt_BR/login.json @@ -5,7 +5,7 @@ "remember_me": "Lembrar de Mim?", "forgot_password": "Esqueceu a Senha?", "alternative_logins": "Logins Alternativos", - "failed_login_attempt": "Falha no login, por favor tente novamente.", + "failed_login_attempt": "Falha no Login", "login_successful": "Você logou com sucesso!", "dont_have_account": "Não tem uma conta?" } \ No newline at end of file diff --git a/public/language/pt_BR/modules.json b/public/language/pt_BR/modules.json index 597e750246..20d1fe1805 100644 --- a/public/language/pt_BR/modules.json +++ b/public/language/pt_BR/modules.json @@ -29,6 +29,14 @@ "composer.submit_and_lock": "Enviar e Trancar", "composer.toggle_dropdown": "Alternar Dropdown", "composer.uploading": "Enviando %1", + "composer.formatting.bold": "Negrito", + "composer.formatting.italic": "Itálico", + "composer.formatting.list": "Lista", + "composer.formatting.strikethrough": "Riscado", + "composer.formatting.link": "Link", + "composer.formatting.picture": "Imagem", + "composer.upload-picture": "Fazer upload de Imagem", + "composer.upload-file": "Fazer upload de Arquivo", "bootbox.ok": "OK", "bootbox.cancel": "Cancelar", "bootbox.confirm": "Confirmar", diff --git a/public/language/ro/error.json b/public/language/ro/error.json index ba8d12b53d..d185a27d6f 100644 --- a/public/language/ro/error.json +++ b/public/language/ro/error.json @@ -22,6 +22,7 @@ "no-email-to-confirm": "Ca sa accesezi forumul trebuie sa iti confirmi email-ul, click aici ca sa intri in mail.", "email-confirm-failed": "Mail-ul tau nu a putut fi confirmat, te rog incearca mai tarziu.", "confirm-email-already-sent": "Email-ul de confirmare ti-a fost trimis, asteapta te rog %1 minut(e) ca sa trimiti inca unul.", + "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", "username-too-short": "Numele de utilizator este prea scurt", "username-too-long": "Numele de utilizator este prea lung", "password-too-long": "Parola prea lunga.", diff --git a/public/language/ro/login.json b/public/language/ro/login.json index 479e3a83be..56396705d2 100644 --- a/public/language/ro/login.json +++ b/public/language/ro/login.json @@ -5,7 +5,7 @@ "remember_me": "Autentifică-mă automat la fiecare vizită", "forgot_password": "Ai uitat parola?", "alternative_logins": "Autentificare Alternativă", - "failed_login_attempt": "Încercare de autentificare eșuată, te rugăm să încerci dinou.", + "failed_login_attempt": "Login Unsuccessful", "login_successful": "Te-ai autentificat cu succes!", "dont_have_account": "Nu ai un cont?" } \ No newline at end of file diff --git a/public/language/ro/modules.json b/public/language/ro/modules.json index f1f0bdf9d6..7382e34154 100644 --- a/public/language/ro/modules.json +++ b/public/language/ro/modules.json @@ -29,6 +29,14 @@ "composer.submit_and_lock": "Submit and Lock", "composer.toggle_dropdown": "Toggle Dropdown", "composer.uploading": "Uploading %1", + "composer.formatting.bold": "Bold", + "composer.formatting.italic": "Italic", + "composer.formatting.list": "List", + "composer.formatting.strikethrough": "Strikethrough", + "composer.formatting.link": "Link", + "composer.formatting.picture": "Picture", + "composer.upload-picture": "Upload Image", + "composer.upload-file": "Upload File", "bootbox.ok": "OK", "bootbox.cancel": "Cancel", "bootbox.confirm": "Confirm", diff --git a/public/language/ru/error.json b/public/language/ru/error.json index 5877e5be07..319bea7abe 100644 --- a/public/language/ru/error.json +++ b/public/language/ru/error.json @@ -22,6 +22,7 @@ "no-email-to-confirm": "Этот форум требует подтверждения по E-mail. Нажмите здесь для ввода E-mail.", "email-confirm-failed": "Мы не можем подтвердить Ваш E-mail, попробуйте позже.", "confirm-email-already-sent": "Сообщение для подтверждения уже выслано на E-mail. Повторная отправка возможна через %1 мин.", + "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", "username-too-short": "Слишком короткое имя пользователя", "username-too-long": "Имя пользователя слишком длинное", "password-too-long": "Пароль слишком длинный", diff --git a/public/language/ru/login.json b/public/language/ru/login.json index b0a5793412..43764ef23b 100644 --- a/public/language/ru/login.json +++ b/public/language/ru/login.json @@ -5,7 +5,7 @@ "remember_me": "Запомнить меня", "forgot_password": "Забыли пароль?", "alternative_logins": "Войти через", - "failed_login_attempt": "Не удалось войти, попробуйте еще раз.", + "failed_login_attempt": "Login Unsuccessful", "login_successful": "Вы успешно вошли!", "dont_have_account": "Нет акканута?" } \ No newline at end of file diff --git a/public/language/ru/modules.json b/public/language/ru/modules.json index 07ecb488c8..ef7ef72724 100644 --- a/public/language/ru/modules.json +++ b/public/language/ru/modules.json @@ -29,6 +29,14 @@ "composer.submit_and_lock": "Отправить и закрыть", "composer.toggle_dropdown": "Показать выпадающий список", "composer.uploading": "Загрузка %1", + "composer.formatting.bold": "Bold", + "composer.formatting.italic": "Italic", + "composer.formatting.list": "List", + "composer.formatting.strikethrough": "Strikethrough", + "composer.formatting.link": "Link", + "composer.formatting.picture": "Picture", + "composer.upload-picture": "Upload Image", + "composer.upload-file": "Upload File", "bootbox.ok": "ОК", "bootbox.cancel": "Отмена", "bootbox.confirm": "Подтвердить", diff --git a/public/language/rw/error.json b/public/language/rw/error.json index 3dfb30b539..edf874c96d 100644 --- a/public/language/rw/error.json +++ b/public/language/rw/error.json @@ -22,6 +22,7 @@ "no-email-to-confirm": "Uru rubuga rusaba ko wemeza ko utunze email. Kanda hano kugirango utange email yawe", "email-confirm-failed": "Ntabwo email yawe yabashije kwemezwa. Ongera ugerageze mu bundi buryo. ", "confirm-email-already-sent": "Email yo kwemeza yamaze koherezwa. Tegereza iminota (umunota) %1 mbere yo kohereza indi. ", + "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", "username-too-short": "Izina ni rigufi cyane", "username-too-long": "Izina ni rirerire cyane", "password-too-long": "Password too long", diff --git a/public/language/rw/login.json b/public/language/rw/login.json index 72ae32e57c..5bdb99dc21 100644 --- a/public/language/rw/login.json +++ b/public/language/rw/login.json @@ -5,7 +5,7 @@ "remember_me": "Wibukwe?", "forgot_password": "Wibagiwe ijambobanga?", "alternative_logins": "Ukundi Wakwinjiramo", - "failed_login_attempt": "Ntiwinjiyemo. Ongera ugerageze. ", + "failed_login_attempt": "Login Unsuccessful", "login_successful": "Winjiyemo nta ngorane!", "dont_have_account": "Nta konte ufite?" } \ No newline at end of file diff --git a/public/language/rw/modules.json b/public/language/rw/modules.json index e0aff84e80..15d1ea25eb 100644 --- a/public/language/rw/modules.json +++ b/public/language/rw/modules.json @@ -29,6 +29,14 @@ "composer.submit_and_lock": "Shyiraho kandi Unafungirane", "composer.toggle_dropdown": "Hindura Icyerekezo", "composer.uploading": "Ugupakira %1", + "composer.formatting.bold": "Bold", + "composer.formatting.italic": "Italic", + "composer.formatting.list": "List", + "composer.formatting.strikethrough": "Strikethrough", + "composer.formatting.link": "Link", + "composer.formatting.picture": "Picture", + "composer.upload-picture": "Upload Image", + "composer.upload-file": "Upload File", "bootbox.ok": "Sawa", "bootbox.cancel": "Isubire", "bootbox.confirm": "Emeza", diff --git a/public/language/sc/error.json b/public/language/sc/error.json index 56a5530e02..08c7c49be2 100644 --- a/public/language/sc/error.json +++ b/public/language/sc/error.json @@ -22,6 +22,7 @@ "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", "email-confirm-failed": "We could not confirm your email, please try again later.", "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", + "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", "username-too-short": "Username too short", "username-too-long": "Username too long", "password-too-long": "Password too long", diff --git a/public/language/sc/login.json b/public/language/sc/login.json index 83a84e0ad1..ee7f253df5 100644 --- a/public/language/sc/login.json +++ b/public/language/sc/login.json @@ -5,7 +5,7 @@ "remember_me": "Regorda·mi?", "forgot_password": "Password Iscarèssida?", "alternative_logins": "Intradas Alternativas", - "failed_login_attempt": "Intrada isballiada, pro praghere torra a provare.", + "failed_login_attempt": "Login Unsuccessful", "login_successful": "Ses intradu!", "dont_have_account": "Don't have an account?" } \ No newline at end of file diff --git a/public/language/sc/modules.json b/public/language/sc/modules.json index 89b779d53e..93c5b11202 100644 --- a/public/language/sc/modules.json +++ b/public/language/sc/modules.json @@ -29,6 +29,14 @@ "composer.submit_and_lock": "Submit and Lock", "composer.toggle_dropdown": "Toggle Dropdown", "composer.uploading": "Uploading %1", + "composer.formatting.bold": "Bold", + "composer.formatting.italic": "Italic", + "composer.formatting.list": "List", + "composer.formatting.strikethrough": "Strikethrough", + "composer.formatting.link": "Link", + "composer.formatting.picture": "Picture", + "composer.upload-picture": "Upload Image", + "composer.upload-file": "Upload File", "bootbox.ok": "OK", "bootbox.cancel": "Cancel", "bootbox.confirm": "Confirm", diff --git a/public/language/sk/error.json b/public/language/sk/error.json index a8b3ba06a7..bdd340532b 100644 --- a/public/language/sk/error.json +++ b/public/language/sk/error.json @@ -22,6 +22,7 @@ "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", "email-confirm-failed": "We could not confirm your email, please try again later.", "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", + "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", "username-too-short": "Username too short", "username-too-long": "Username too long", "password-too-long": "Password too long", diff --git a/public/language/sk/login.json b/public/language/sk/login.json index bc2f675ff2..0736ab4faa 100644 --- a/public/language/sk/login.json +++ b/public/language/sk/login.json @@ -5,7 +5,7 @@ "remember_me": "Zapamätať si ma?", "forgot_password": "Zabudol si heslo?", "alternative_logins": "Ďalšie spôsoby prihlásenia", - "failed_login_attempt": "Prihlásenie sa nepodarilo, skús to znovu.", + "failed_login_attempt": "Login Unsuccessful", "login_successful": "Prihlásenie prebehlo úspešne!", "dont_have_account": "Nemáš účet?" } \ No newline at end of file diff --git a/public/language/sk/modules.json b/public/language/sk/modules.json index b9be2fb6c3..0268001e7f 100644 --- a/public/language/sk/modules.json +++ b/public/language/sk/modules.json @@ -29,6 +29,14 @@ "composer.submit_and_lock": "Submit and Lock", "composer.toggle_dropdown": "Toggle Dropdown", "composer.uploading": "Uploading %1", + "composer.formatting.bold": "Bold", + "composer.formatting.italic": "Italic", + "composer.formatting.list": "List", + "composer.formatting.strikethrough": "Strikethrough", + "composer.formatting.link": "Link", + "composer.formatting.picture": "Picture", + "composer.upload-picture": "Upload Image", + "composer.upload-file": "Upload File", "bootbox.ok": "OK", "bootbox.cancel": "Cancel", "bootbox.confirm": "Confirm", diff --git a/public/language/sl/error.json b/public/language/sl/error.json index d9df817190..33d0da5f79 100644 --- a/public/language/sl/error.json +++ b/public/language/sl/error.json @@ -22,6 +22,7 @@ "no-email-to-confirm": "Ta forum zahteva potrjen e-mail naslov. Prosim kliknite tu za vnos e-mail naslova.", "email-confirm-failed": "Nismo mogli potrditi vašega e-mail naslova. Prosimo poskusite ponovno.", "confirm-email-already-sent": "Potrditveni e-mail naslov je že poslan. Prosimo počakajte %1 minut(o) za ponovno pošiljanje.", + "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", "username-too-short": "Uporabniško ime je prekratko", "username-too-long": "Uporabniško ime je predolgo", "password-too-long": "Password too long", diff --git a/public/language/sl/login.json b/public/language/sl/login.json index 6955d274bd..7f3d80e3cb 100644 --- a/public/language/sl/login.json +++ b/public/language/sl/login.json @@ -5,7 +5,7 @@ "remember_me": "Spomni me?", "forgot_password": "Pozabljeno geslo?", "alternative_logins": "Prijava z drugim računom", - "failed_login_attempt": "Napačna prijava, prosim poskusi ponovno.", + "failed_login_attempt": "Login Unsuccessful", "login_successful": "Prijava je uspešna.", "dont_have_account": "Ali še nimaš uporabniškega računa?" } \ No newline at end of file diff --git a/public/language/sl/modules.json b/public/language/sl/modules.json index 911a9f1588..a9b88e3019 100644 --- a/public/language/sl/modules.json +++ b/public/language/sl/modules.json @@ -29,6 +29,14 @@ "composer.submit_and_lock": "Pošlji in zakleni", "composer.toggle_dropdown": "Preklopi spustni meni", "composer.uploading": "Uploading %1", + "composer.formatting.bold": "Bold", + "composer.formatting.italic": "Italic", + "composer.formatting.list": "List", + "composer.formatting.strikethrough": "Strikethrough", + "composer.formatting.link": "Link", + "composer.formatting.picture": "Picture", + "composer.upload-picture": "Upload Image", + "composer.upload-file": "Upload File", "bootbox.ok": "Vredu", "bootbox.cancel": "Prekliči", "bootbox.confirm": "Potrdi", diff --git a/public/language/sr/error.json b/public/language/sr/error.json index 5c66e812ac..2a22dd111e 100644 --- a/public/language/sr/error.json +++ b/public/language/sr/error.json @@ -22,6 +22,7 @@ "no-email-to-confirm": "Форум захтева потврду е-поште, кликните овде да бисте отворили е-пошту", "email-confirm-failed": "Потврда е-поште није успела, молимо вас да покушате касније.", "confirm-email-already-sent": "Конфирмациони имејл је већ послат, молимо вас да сачекате %1 минут(а) да бисте послали други.", + "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", "username-too-short": "Корисничко име је прекратко", "username-too-long": "Корисничко име је предуго", "password-too-long": "Шифра је предугачка.", diff --git a/public/language/sr/login.json b/public/language/sr/login.json index 8fefdb9068..abcf584db7 100644 --- a/public/language/sr/login.json +++ b/public/language/sr/login.json @@ -5,7 +5,7 @@ "remember_me": "Памти ме?", "forgot_password": "Заборављена лозинка?", "alternative_logins": "Алтернативно пријављивање", - "failed_login_attempt": "Неуспело пријављивање, покушајте поново.", + "failed_login_attempt": "Login Unsuccessful", "login_successful": "Успешно сте се пријавили!", "dont_have_account": "Немате налог?" } \ No newline at end of file diff --git a/public/language/sr/modules.json b/public/language/sr/modules.json index c4f4c3314a..24d2e521f9 100644 --- a/public/language/sr/modules.json +++ b/public/language/sr/modules.json @@ -29,6 +29,14 @@ "composer.submit_and_lock": "Пошаљи и закључај", "composer.toggle_dropdown": "Подесите \"Dropdown\"", "composer.uploading": "Убацивање %1", + "composer.formatting.bold": "Bold", + "composer.formatting.italic": "Italic", + "composer.formatting.list": "List", + "composer.formatting.strikethrough": "Strikethrough", + "composer.formatting.link": "Link", + "composer.formatting.picture": "Picture", + "composer.upload-picture": "Upload Image", + "composer.upload-file": "Upload File", "bootbox.ok": "ОК", "bootbox.cancel": "Откажи", "bootbox.confirm": "Потврди", diff --git a/public/language/sv/error.json b/public/language/sv/error.json index 64b1436f5e..84e3bfa3a3 100644 --- a/public/language/sv/error.json +++ b/public/language/sv/error.json @@ -22,6 +22,7 @@ "no-email-to-confirm": "Detta forum kräver bekräftning av epostadresser, var god klicka här för att fylla i en epostadress", "email-confirm-failed": "Vi kunde ej bekräfta din epostadress, var god försök igen senare.", "confirm-email-already-sent": "Bekräftningsbrev redan skickat, var god vänta %1 minut(er) innan du skickar ett nytt.", + "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", "username-too-short": "Användarnamnet är för kort", "username-too-long": "Användarnamnet är för långt", "password-too-long": "Lösenordet är för långt", diff --git a/public/language/sv/login.json b/public/language/sv/login.json index 67478a02ca..a3d66ea4bc 100644 --- a/public/language/sv/login.json +++ b/public/language/sv/login.json @@ -5,7 +5,7 @@ "remember_me": "Kom ihåg mig?", "forgot_password": "Glömt lösenord?", "alternative_logins": "Alternativa inloggningssätt", - "failed_login_attempt": "Inloggningen misslyckades, var god försök igen.", + "failed_login_attempt": "Login Unsuccessful", "login_successful": "Du är nu inloggad!", "dont_have_account": "Har du inget konto?" } \ No newline at end of file diff --git a/public/language/sv/modules.json b/public/language/sv/modules.json index 25349f9baa..61938266dc 100644 --- a/public/language/sv/modules.json +++ b/public/language/sv/modules.json @@ -29,6 +29,14 @@ "composer.submit_and_lock": "Skicka och lås", "composer.toggle_dropdown": "Visa/Dölj dropdown", "composer.uploading": "Laddar upp %1", + "composer.formatting.bold": "Bold", + "composer.formatting.italic": "Italic", + "composer.formatting.list": "List", + "composer.formatting.strikethrough": "Strikethrough", + "composer.formatting.link": "Link", + "composer.formatting.picture": "Picture", + "composer.upload-picture": "Upload Image", + "composer.upload-file": "Upload File", "bootbox.ok": "OK", "bootbox.cancel": "Avbryt", "bootbox.confirm": "Bekräfta", diff --git a/public/language/th/error.json b/public/language/th/error.json index 44cef957ae..033d5d50d3 100644 --- a/public/language/th/error.json +++ b/public/language/th/error.json @@ -22,6 +22,7 @@ "no-email-to-confirm": "Forum นี้ต้องการการยืนยันอีเมล กรุณากดที่นี่เพื่อระบุอีเมล", "email-confirm-failed": "เราไม่สามารถยืนยันอีเมลของคุณ ณ ขณะนี้ กรุณาลองใหม่อีกครั้งภายหลัง", "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", + "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", "username-too-short": "ชื่อบัญชีผู้ใช้ สั้นเกินไป", "username-too-long": "ชื่อบัญชีผู้ใช้ ยาวเกินไป", "password-too-long": "Password too long", diff --git a/public/language/th/login.json b/public/language/th/login.json index 5eba336a39..c9e8a589eb 100644 --- a/public/language/th/login.json +++ b/public/language/th/login.json @@ -5,7 +5,7 @@ "remember_me": "จำไว้ในระบบ?", "forgot_password": "ลืมรหัสผ่าน?", "alternative_logins": "เข้าสู่ระบบโดยทางอื่น", - "failed_login_attempt": "เข้าสู่ระบบล้มเหลว โปรดลองอีกครั้ง", + "failed_login_attempt": "Login Unsuccessful", "login_successful": "คุณเข้าสู่ระบบเรียบร้อยแล้ว", "dont_have_account": "คุณยังไม่มีบัญชีเข้าระบบ?" } \ No newline at end of file diff --git a/public/language/th/modules.json b/public/language/th/modules.json index 15a7bb1fa5..51c6065cd8 100644 --- a/public/language/th/modules.json +++ b/public/language/th/modules.json @@ -29,6 +29,14 @@ "composer.submit_and_lock": "Submit and Lock", "composer.toggle_dropdown": "Toggle Dropdown", "composer.uploading": "Uploading %1", + "composer.formatting.bold": "Bold", + "composer.formatting.italic": "Italic", + "composer.formatting.list": "List", + "composer.formatting.strikethrough": "Strikethrough", + "composer.formatting.link": "Link", + "composer.formatting.picture": "Picture", + "composer.upload-picture": "Upload Image", + "composer.upload-file": "Upload File", "bootbox.ok": "OK", "bootbox.cancel": "Cancel", "bootbox.confirm": "Confirm", diff --git a/public/language/tr/error.json b/public/language/tr/error.json index fedcf00bba..61a8cf34dd 100644 --- a/public/language/tr/error.json +++ b/public/language/tr/error.json @@ -22,6 +22,7 @@ "no-email-to-confirm": "Bu forum e-posta doğrulaması gerektirir, lütfen buraya bir e-posta adresi girin", "email-confirm-failed": "E-posta adresinizi doğrulayamıyoruz. Lütfen daha sonra tekrar deneyin.", "confirm-email-already-sent": "E-mail onayı zaten gönderilmiş, yeni bir onay göndermek için lütfen 1 dakika bekleyin.", + "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", "username-too-short": "Kullanıcı ismi çok kısa", "username-too-long": "Kullanıcı ismi çok uzun.", "password-too-long": "Parola çok uzun", diff --git a/public/language/tr/login.json b/public/language/tr/login.json index bd13e81d46..e28dda2797 100644 --- a/public/language/tr/login.json +++ b/public/language/tr/login.json @@ -5,7 +5,7 @@ "remember_me": "Beni Hatırla!", "forgot_password": "Şifrenizi mi unuttunuz?", "alternative_logins": "Alternatif Girişler", - "failed_login_attempt": "Oturum açma girişimi başarısız, lütfen tekrar deneyin.", + "failed_login_attempt": "Giriş Başarısız", "login_successful": "Başarıyla giriş yaptınız!", "dont_have_account": "Hesabınız yok mu?" } \ No newline at end of file diff --git a/public/language/tr/modules.json b/public/language/tr/modules.json index b896b442a0..06e5876c68 100644 --- a/public/language/tr/modules.json +++ b/public/language/tr/modules.json @@ -29,6 +29,14 @@ "composer.submit_and_lock": "Gönder ve Kitle", "composer.toggle_dropdown": "Menü aç", "composer.uploading": "Yükleniyor %1", + "composer.formatting.bold": "Kalın", + "composer.formatting.italic": "İtalik", + "composer.formatting.list": "Liste", + "composer.formatting.strikethrough": "Üstüçizili", + "composer.formatting.link": "Bağlantı", + "composer.formatting.picture": "Görsel", + "composer.upload-picture": "Görsel Yükle", + "composer.upload-file": "Dosya Yükle", "bootbox.ok": "Tamam", "bootbox.cancel": "İptal", "bootbox.confirm": "Onayla", diff --git a/public/language/vi/error.json b/public/language/vi/error.json index b6c0c79455..69c9b989bd 100644 --- a/public/language/vi/error.json +++ b/public/language/vi/error.json @@ -22,6 +22,7 @@ "no-email-to-confirm": "Diễn đàn này yêu cầu xác nhận email, vui lòng nhấn vào đây để nhập email.", "email-confirm-failed": "Chúng tôi không thể xác nhận email của bạn, vui lòng thử lại sau.", "confirm-email-already-sent": "Email xác nhận đã được gửi, vui lòng chờ %1 phút để yêu cầu gửi lại.", + "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", "username-too-short": "Tên đăng nhập quá ngắn", "username-too-long": "Tên đăng nhập quá dài", "password-too-long": "Mật khẩu quá dài", diff --git a/public/language/vi/login.json b/public/language/vi/login.json index 01b7f2dc96..5fe1cdf892 100644 --- a/public/language/vi/login.json +++ b/public/language/vi/login.json @@ -5,7 +5,7 @@ "remember_me": "Ghi nhớ?", "forgot_password": "Quên mật khẩu?", "alternative_logins": "Đăng nhập bằng tài khoản khác", - "failed_login_attempt": "Đăng nhập thất bại, xin hãy thử lại", + "failed_login_attempt": "Login Unsuccessful", "login_successful": "Bạn đã đăng nhập thành công!", "dont_have_account": "Chưa có tài khoản?" } \ No newline at end of file diff --git a/public/language/vi/modules.json b/public/language/vi/modules.json index 0f5ba2fe46..1c81e64ed6 100644 --- a/public/language/vi/modules.json +++ b/public/language/vi/modules.json @@ -29,6 +29,14 @@ "composer.submit_and_lock": "Đăng và Khoá", "composer.toggle_dropdown": "Đóng/mở dropdown", "composer.uploading": "Đang tải lên %1", + "composer.formatting.bold": "Bold", + "composer.formatting.italic": "Italic", + "composer.formatting.list": "List", + "composer.formatting.strikethrough": "Strikethrough", + "composer.formatting.link": "Link", + "composer.formatting.picture": "Picture", + "composer.upload-picture": "Upload Image", + "composer.upload-file": "Upload File", "bootbox.ok": "OK", "bootbox.cancel": "Huỷ bỏ", "bootbox.confirm": "Xác nhận", diff --git a/public/language/zh_CN/error.json b/public/language/zh_CN/error.json index af0a03bc4a..c5d4846358 100644 --- a/public/language/zh_CN/error.json +++ b/public/language/zh_CN/error.json @@ -22,6 +22,7 @@ "no-email-to-confirm": "本论坛需要电子邮箱确认,请点击这里输入电子邮箱地址", "email-confirm-failed": "我们无法确认您的电子邮箱,请重试", "confirm-email-already-sent": "确认邮件已发出,如需重新发送请等待 %1 分钟后再试。", + "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", "username-too-short": "用户名太短", "username-too-long": "用户名太长", "password-too-long": "密码太长", diff --git a/public/language/zh_CN/login.json b/public/language/zh_CN/login.json index 9cf15f0e15..cda3446936 100644 --- a/public/language/zh_CN/login.json +++ b/public/language/zh_CN/login.json @@ -5,7 +5,7 @@ "remember_me": "记住我?", "forgot_password": "忘记密码?", "alternative_logins": "使用合作网站帐号登录", - "failed_login_attempt": "登录失败,请重试。", + "failed_login_attempt": "Login Unsuccessful", "login_successful": "您已经成功登录!", "dont_have_account": "没有帐号?" } \ No newline at end of file diff --git a/public/language/zh_CN/modules.json b/public/language/zh_CN/modules.json index bf50d3f496..4add0374c7 100644 --- a/public/language/zh_CN/modules.json +++ b/public/language/zh_CN/modules.json @@ -29,6 +29,14 @@ "composer.submit_and_lock": "提交并锁定", "composer.toggle_dropdown": "标为 Dropdown", "composer.uploading": "正在上传 %1", + "composer.formatting.bold": "Bold", + "composer.formatting.italic": "Italic", + "composer.formatting.list": "List", + "composer.formatting.strikethrough": "Strikethrough", + "composer.formatting.link": "Link", + "composer.formatting.picture": "Picture", + "composer.upload-picture": "Upload Image", + "composer.upload-file": "Upload File", "bootbox.ok": "确认", "bootbox.cancel": "取消", "bootbox.confirm": "确认", diff --git a/public/language/zh_TW/error.json b/public/language/zh_TW/error.json index 0376a3c3de..efbbce6214 100644 --- a/public/language/zh_TW/error.json +++ b/public/language/zh_TW/error.json @@ -18,16 +18,17 @@ "username-taken": "該使用者名稱已被使用", "email-taken": "該信箱已被使用", "email-not-confirmed": "您的電郵尚未得到確認,請點擊此處確認您的電子郵件。", - "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", - "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", + "email-not-confirmed-chat": "你需要先確認電子郵件後才能進行聊天,請點擊這裡來確認你的電子郵件。", + "no-email-to-confirm": "討論區要求電子郵件確認,請點擊這裡輸入一個電子郵件。", "email-confirm-failed": "我們無法確認你的Email,請之後再重試。", - "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", + "confirm-email-already-sent": "確認電子郵件已經寄送,請等待 %1 分鐘才能再寄送另一封。", + "sendmail-not-found": "沒有找到sendmail可執行程序,請確認它是不是已經被安裝與可讓執行NodeBB的使用者執行的", "username-too-short": "帳號太短", "username-too-long": "帳號太長", "password-too-long": "密碼太長", "user-banned": "該使用者已被停用", "user-too-new": "抱歉,發表您第一篇文章須要等待 %1 秒", - "blacklisted-ip": "Sorry, your IP address has been banned from this community. If you feel this is in error, please contact an administrator.", + "blacklisted-ip": "抱歉,你的IP位置已經被這個社群禁用了。如果你覺得這是一個失誤,請連絡管理員。", "no-category": "類別並不存在", "no-topic": "主題並不存在", "no-post": "文章並不存在", @@ -37,24 +38,24 @@ "no-privileges": "您似乎沒有執行這個行為的權限!", "category-disabled": "該類別已被關閉", "topic-locked": "該主題已被鎖定", - "post-edit-duration-expired": "You are only allowed to edit posts for %1 second(s) after posting", - "content-too-short": "Please enter a longer post. Posts should contain at least %1 character(s).", - "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 character(s).", - "title-too-short": "Please enter a longer title. Titles should contain at least %1 character(s).", - "title-too-long": "Please enter a shorter title. Titles can't be longer than %1 character(s).", - "too-many-posts": "You can only post once every %1 second(s) - please wait before posting again", - "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again", - "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)", - "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)", - "not-enough-tags": "Not enough tags. Topics must have at least %1 tag(s)", - "too-many-tags": "Too many tags. Topics can't have more than %1 tag(s)", + "post-edit-duration-expired": "在張貼 %1 秒後,你才能編輯張貼文章", + "content-too-short": "請輸入一個長一點的張貼內容。張貼內容長度不能少於 %1 字元。", + "content-too-long": "請輸入一個短一點的張貼內容。張貼內容長度不能超過 %1 字元。", + "title-too-short": "請輸入一個長一點的標題。標題長度不能少於 %1 字元。", + "title-too-long": "請輸入一個短一點的標題。標題長度不能超過 %1 字元。", + "too-many-posts": "在張貼 %1 秒後,你才能再張貼文章 - 請在重新張貼前等待這個時間。", + "too-many-posts-newbie": "新使用者需要直到獲得 %2 聲譽後,才能在每 %1 秒後進行張貼一篇文章 - 請在重新張貼前等待這個時間。", + "tag-too-short": "請輸入一個長一點的標籤。標籤長度不能少於 %1 字元。", + "tag-too-long": "請輸入一個短一點的標籤。標籤長度不能超過 %1 字元。", + "not-enough-tags": "標籤數量不足夠。主題需要至少 %1 標籤。", + "too-many-tags": "過多標籤數量。主題無法擁有超過 %1 個標籤。", "still-uploading": "請等待上傳完成。", - "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", + "file-too-big": "最大允許的檔案大小是 %1 kB - 請上傳一個小於這個數值的檔案。", "guest-upload-disabled": "訪客上傳是被禁止的", "already-favourited": "你已經將這篇張貼加入書籤", "already-unfavourited": "你已經將這篇張貼移除書籤", "cant-ban-other-admins": "您無法禁止其他的管理員!", - "cant-remove-last-admin": "You are the only administrator. Add another user as an administrator before removing yourself as admin", + "cant-remove-last-admin": "你是唯一的管理員。在你移除自己為管理員前,需要新增另一個使用者為管理員。", "invalid-image-type": "無效的圖像類型。允許的類型:%1", "invalid-image-extension": "無效的圖像擴充元件", "invalid-file-type": "無效的檔案類型。允許的類型:%1", @@ -70,16 +71,16 @@ "post-already-restored": "此文章已還原", "topic-already-deleted": "此主題已經被刪除", "topic-already-restored": "此主題已還原", - "cant-purge-main-post": "You can't purge the main post, please delete the topic instead", + "cant-purge-main-post": "你無法清除主要的張貼文,請改為刪除這個張貼文。", "topic-thumbnails-are-disabled": "禁用主題縮圖", "invalid-file": "無效的檔案", "uploads-are-disabled": "上傳功能被停用", - "signature-too-long": "Sorry, your signature cannot be longer than %1 character(s).", - "about-me-too-long": "Sorry, your about me cannot be longer than %1 character(s).", + "signature-too-long": "抱歉,你的簽名長度不能超過 %1 字元。", + "about-me-too-long": "抱歉,關於我長度不能超過 %1 字元。", "cant-chat-with-yourself": "你不能與自己聊天!", "chat-restricted": "此用戶已限制了他的聊天功能。你要在他關注你之後,才能跟他聊天", "chat-disabled": "聊天系統被禁止", - "too-many-messages": "You have sent too many messages, please wait awhile.", + "too-many-messages": "你已經送出過多的訊息,請稍等一下。", "invalid-chat-message": "無效的聊天訊息", "chat-message-too-long": "聊天訊息太長", "cant-edit-chat-message": "你不被允許編輯這條訊息", @@ -96,7 +97,7 @@ "parse-error": "當剖析伺服器回應時發生了某個錯誤", "wrong-login-type-email": "請使用您的電子郵件進行登錄", "wrong-login-type-username": "請使用您的使用者名稱進行登錄", - "invite-maximum-met": "You have invited the maximum amount of people (%1 out of %2).", + "invite-maximum-met": "你已經邀請最多可邀請的人數限制 (%1 於 %2)。", "no-session-found": "沒有找到登入的連線階段!", "not-in-room": "使用者沒有在聊天室中", "no-users-in-room": "沒有使用者在聊天室中", diff --git a/public/language/zh_TW/login.json b/public/language/zh_TW/login.json index 4ffc8773e6..de5b637a5e 100644 --- a/public/language/zh_TW/login.json +++ b/public/language/zh_TW/login.json @@ -1,11 +1,11 @@ { - "username-email": "用戶名稱 / 電子郵件", - "username": "用戶名稱", + "username-email": "帳號 / 電子郵件", + "username": "帳號", "email": "電子郵件", "remember_me": "記住我?", "forgot_password": "忘記密碼?", - "alternative_logins": "其他登錄方式", - "failed_login_attempt": "登錄失敗,請再嘗試。", - "login_successful": "你已成功登錄!", - "dont_have_account": "還沒有賬號?" + "alternative_logins": "其他登入方式", + "failed_login_attempt": "登入失敗", + "login_successful": "你已成功登入!", + "dont_have_account": "還沒有帳號?" } \ No newline at end of file diff --git a/public/language/zh_TW/modules.json b/public/language/zh_TW/modules.json index 109139f9c2..2c54a62a1e 100644 --- a/public/language/zh_TW/modules.json +++ b/public/language/zh_TW/modules.json @@ -29,6 +29,14 @@ "composer.submit_and_lock": "提交然後鎖定", "composer.toggle_dropdown": "切換下拉選單", "composer.uploading": "上傳中 %1", + "composer.formatting.bold": "粗體", + "composer.formatting.italic": "斜體", + "composer.formatting.list": "列表項目", + "composer.formatting.strikethrough": "刪除線", + "composer.formatting.link": "連結", + "composer.formatting.picture": "圖片", + "composer.upload-picture": "上傳圖片", + "composer.upload-file": "上傳檔案", "bootbox.ok": "好", "bootbox.cancel": "取消", "bootbox.confirm": "確認", diff --git a/public/language/zh_TW/notifications.json b/public/language/zh_TW/notifications.json index 3174feb38e..5f7ed6c29b 100644 --- a/public/language/zh_TW/notifications.json +++ b/public/language/zh_TW/notifications.json @@ -1,36 +1,36 @@ { "title": "通知", "no_notifs": "沒有新消息", - "see_all": "See all notifications", + "see_all": "觀看所有通知", "mark_all_read": "所有訊息設為已讀", "back_to_home": "返回%1", "outgoing_link": "站外連結", - "outgoing_link_message": "You are now leaving %1", + "outgoing_link_message": "你現在離開了 %1", "continue_to": "繼續前往 %1", "return_to": "返回%1", "new_notification": "新訊息通知", "you_have_unread_notifications": "您有未讀的訊息!", "new_message_from": "來自 %1 的新訊息", "upvoted_your_post_in": "%1 upvote了您在 %2的post。", - "upvoted_your_post_in_dual": "%1 and %2 have upvoted your post in %3.", - "upvoted_your_post_in_multiple": "%1 and %2 others have upvoted your post in %3.", - "moved_your_post": "%1 has moved your post to %2", - "moved_your_topic": "%1 has moved %2", - "favourited_your_post_in": "%1 has bookmarked your post in %2.", - "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", - "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", + "upvoted_your_post_in_dual": "%1%2 已經對你在%3的張貼作正向投票。", + "upvoted_your_post_in_multiple": "%1 與 %2 其他人已經對你在%3正向投票。", + "moved_your_post": "%1 已經移動你的張貼到 %2", + "moved_your_topic": "%1 已經移動到 %2", + "favourited_your_post_in": "%1 已經把你在 %2 的張貼加入書籤。", + "favourited_your_post_in_dual": "%1%2 已經把你在%3的張貼加入書籤。", + "favourited_your_post_in_multiple": "%1 與 %2 其他人已經把你在 %3 的張貼加入書籤。", "user_flagged_post_in": "%1 舉報了 %2裡的一個post。", - "user_flagged_post_in_dual": "%1 and %2 flagged a post in %3", - "user_flagged_post_in_multiple": "%1 and %2 others flagged a post in %3", + "user_flagged_post_in_dual": "%1%2 標記一個張貼在 %3", + "user_flagged_post_in_multiple": "%1 與 %2 其他人標記一個張貼在 %3", "user_posted_to": "%1 發布一個回覆給: %2", - "user_posted_to_dual": "%1 and %2 have posted replies to: %3", - "user_posted_to_multiple": "%1 and %2 others have posted replies to: %3", + "user_posted_to_dual": "%1%2 已經張貼回覆到: %3", + "user_posted_to_multiple": "%1 與 %2 其他人已經張貼回覆到: %3", "user_posted_topic": "%1 發布了一個新的主題: %2", "user_started_following_you": "%1 開始關注你。", - "user_started_following_you_dual": "%1 and %2 started following you.", - "user_started_following_you_multiple": "%1 and %2 others started following you.", - "new_register": "%1 sent a registration request.", - "new_register_multiple": "There are %1 registration requests awaiting review.", + "user_started_following_you_dual": "%1%2 開始跟隨你。", + "user_started_following_you_multiple": "%1 與 %2 其他的開始跟隨你。", + "new_register": "%1傳送了註冊要求。", + "new_register_multiple": "目前有 %1 個註冊要求等待審核中。", "email-confirmed": "已確認電郵", "email-confirmed-message": "感謝您驗證您的電郵。您的帳戶現已全面啟用。", "email-confirm-error-message": "驗證您的電郵地址時出現問題。也許啟動碼無效或已過期。", diff --git a/public/language/zh_TW/pages.json b/public/language/zh_TW/pages.json index 431b71a11d..08dabadd1b 100644 --- a/public/language/zh_TW/pages.json +++ b/public/language/zh_TW/pages.json @@ -9,38 +9,38 @@ "flagged-posts": "標記的張貼", "users/online": "線上用戶", "users/latest": "最近用戶", - "users/sort-posts": "Users with the most posts", - "users/sort-reputation": "Users with the most reputation", + "users/sort-posts": "最多張貼的使用者", + "users/sort-reputation": "最多聲譽的使用者", "users/banned": "已封鎖用戶", "users/search": "用戶搜尋", "notifications": "新訊息通知", "tags": "標籤", - "tag": "Topics tagged under \"%1\"", + "tag": "有\"%1\"標籤的主題", "register": "註冊帳號", "login": "登入帳號", - "reset": "Reset your account password", + "reset": "重設你的帳號密碼", "categories": "類別", "groups": "群組", "group": "%1 群組", "chats": "聊天", "chat": "與 %1 聊天", "account/edit": "編輯 \"%1\"", - "account/edit/password": "Editing password of \"%1\"", - "account/edit/username": "Editing username of \"%1\"", - "account/edit/email": "Editing email of \"%1\"", - "account/following": "People %1 follows", - "account/followers": "People who follow %1", - "account/posts": "Posts made by %1", - "account/topics": "Topics created by %1", + "account/edit/password": "編輯\"%1\"的密碼", + "account/edit/username": "編輯\"%1\"的帳號", + "account/edit/email": "編輯\"%1\"的電子郵件", + "account/following": "使用者 %1 跟隨", + "account/followers": "跟隨 %1 的使用者", + "account/posts": "由 %1 發表的張貼", + "account/topics": "由 %1 建立的主題", "account/groups": "%1 的群組", - "account/favourites": "%1's Bookmarked Posts", + "account/favourites": "%1 所加入書籤的張貼", "account/settings": "用戶設定", - "account/watched": "Topics watched by %1", - "account/upvoted": "Posts upvoted by %1", - "account/downvoted": "Posts downvoted by %1", - "account/best": "Best posts made by %1", + "account/watched": "%1 所觀看的主題", + "account/upvoted": "%1 所正向投票的張貼", + "account/downvoted": "%1 所負向投票的張貼", + "account/best": "由 %1 建立的最佳張貼文", "confirm": "已確認電子郵件", "maintenance.text": "目前 %1 正在進行維修。請稍後再來。", "maintenance.messageIntro": "此外,管理員有以下訊息:", - "throttled.text": "%1 is currently unavailable due to excessive load. Please come back another time." + "throttled.text": "%1 目前無法提供,是因為使用量過度。請之後再回來操作。" } \ No newline at end of file diff --git a/public/language/zh_TW/user.json b/public/language/zh_TW/user.json index 1228565dff..a536503ff7 100644 --- a/public/language/zh_TW/user.json +++ b/public/language/zh_TW/user.json @@ -6,13 +6,13 @@ "postcount": "文章數量", "email": "電子郵件", "confirm_email": "確認電郵", - "ban_account": "Ban Account", - "ban_account_confirm": "Do you really want to ban this user?", - "unban_account": "Unban Account", + "ban_account": "禁用帳號", + "ban_account_confirm": "你確定要禁用這個使用者?", + "unban_account": "取消禁用帳號", "delete_account": "刪除帳戶", "delete_account_confirm": "你確定要刪除自己的帳戶?
此操作不能復原,您將無法恢復任何數據

輸入您的使用者名稱,以確認您希望刪除這個帳戶。", - "delete_this_account_confirm": "Are you sure you want to delete this account?
This action is irreversible and you will not be able to recover any data

", - "account-deleted": "Account deleted", + "delete_this_account_confirm": "你確定要刪除這個帳戶?
此操作是不能還原的,你將無法回復任何資料
", + "account-deleted": "帳號已刪除", "fullname": "全名", "website": "網站", "location": "地址", @@ -22,25 +22,25 @@ "profile": "個人資料", "profile_views": "資料被查看", "reputation": "聲譽", - "favourites": "Bookmarks", + "favourites": "書籤", "watched": "觀看者", "followers": "跟隨者", "following": "正在關注", - "aboutme": "About me", + "aboutme": "關於我", "signature": "簽名", "birthday": "生日", "chat": "聊天", - "chat_with": "Chat with %1", + "chat_with": "與 %1 聊天", "follow": "跟隨", "unfollow": "取消跟隨", "more": "更多", "profile_update_success": "您的個人資料已更新成功!", "change_picture": "改變頭像", - "change_username": "Change Username", - "change_email": "Change Email", + "change_username": "更改帳號", + "change_email": "更改電子郵件", "edit": "編輯", - "edit-profile": "Edit Profile", - "default_picture": "Default Icon", + "edit-profile": "編輯個人資料", + "default_picture": "預設圖示", "uploaded_picture": "已有頭像", "upload_new_picture": "上傳新頭像", "upload_new_picture_from_url": "上傳新頭像(URL)", @@ -55,12 +55,12 @@ "confirm_password": "確認密碼", "password": "密碼", "username_taken_workaround": "您所註冊的使用者名稱已經被使用了,所以我們將它略微改變。你現在改稱 %1", - "password_same_as_username": "Your password is the same as your username, please select another password.", - "password_same_as_email": "Your password is the same as your email, please select another password.", + "password_same_as_username": "你的密碼和帳號是一樣的,請選擇另一組密碼。", + "password_same_as_email": "你的密碼和電子郵件是一樣的,請選擇另一組密碼。", "upload_picture": "上傳頭像", "upload_a_picture": "上傳一張照片", - "remove_uploaded_picture": "Remove Uploaded Picture", - "upload_cover_picture": "Upload cover picture", + "remove_uploaded_picture": "移除上傳的圖片", + "upload_cover_picture": "上傳封面圖片", "settings": "設定", "show_email": "顯示我的郵箱", "show_fullname": "顯示我的全名", @@ -73,39 +73,39 @@ "digest_monthly": "每月", "send_chat_notifications": "如果有新的聊天消息而我不在線,發送郵件給我", "send_post_notifications": "Send an email when replies are made to topics I am subscribed to", - "settings-require-reload": "Some setting changes require a reload. Click here to reload the page.", + "settings-require-reload": "有些設定的更動是需要重新整理。點擊這裡來重新整理頁面。", "has_no_follower": "該用戶還沒有被任何人關注。", "follows_no_one": "該用戶還沒有關注過任何人。", - "has_no_posts": "This user hasn't posted anything yet.", - "has_no_topics": "This user hasn't posted any topics yet.", - "has_no_watched_topics": "This user hasn't watched any topics yet.", - "has_no_upvoted_posts": "This user hasn't upvoted any posts yet.", - "has_no_downvoted_posts": "This user hasn't downvoted any posts yet.", - "has_no_voted_posts": "This user has no voted posts", + "has_no_posts": "使用者還沒有發表任何張貼", + "has_no_topics": "使用者還沒有發表任何主題", + "has_no_watched_topics": "使用者還沒有觀看任何主題", + "has_no_upvoted_posts": "使用者還沒有對任何主題投正向票", + "has_no_downvoted_posts": "使用者還沒有對任何主題投負向票", + "has_no_voted_posts": "這個使用者沒有投票的張貼", "email_hidden": "郵箱被隱藏", "hidden": "隱藏", - "paginate_description": "Paginate topics and posts instead of using infinite scroll", + "paginate_description": "將主題與張貼用分頁來顯示,取代使用無盡的捲動方式。", "topics_per_page": "每頁的主題數", "posts_per_page": "每頁的文章數", - "notification_sounds": "Play a sound when you receive a notification", + "notification_sounds": "當你接收到通知時撥放音效", "browsing": "瀏覽設定", - "open_links_in_new_tab": "Open outgoing links in new tab", - "enable_topic_searching": "Enable In-Topic Searching", - "topic_search_help": "If enabled, in-topic searching will override the browser's default page search behaviour and allow you to search through the entire topic, instead of what is only shown on screen", - "delay_image_loading": "Delay Image Loading", - "image_load_delay_help": "If enabled, images in topics will not load until they are scrolled into view", - "scroll_to_my_post": "After posting a reply, show the new post", - "follow_topics_you_reply_to": "Follow topics that you reply to", - "follow_topics_you_create": "Follow topics you create", - "grouptitle": "Group Title", + "open_links_in_new_tab": "在新的資料標籤裡打開外部的連結", + "enable_topic_searching": "啟用在主題中的搜尋", + "topic_search_help": "如果啟用的話,在主題中搜尋將會覆蓋瀏覽器預設網頁搜尋的行為,這會允許你搜尋整篇的主題,而不只是顯示出來在畫面上的而已。", + "delay_image_loading": "延遲圖片載入", + "image_load_delay_help": "如果啟用的話,在主題中的圖片直到它們被捲到到可視範圍時才會載入。", + "scroll_to_my_post": "在張貼回覆後,顯示新的張貼", + "follow_topics_you_reply_to": "跟隨你回覆的主題", + "follow_topics_you_create": "跟隨你建立的主題", + "grouptitle": "群組標題", "no-group-title": "無此群組標題", - "select-skin": "Select a Skin", - "select-homepage": "Select a Homepage", - "homepage": "Homepage", - "homepage_description": "Select a page to use as the forum homepage or 'None' to use the default homepage.", - "custom_route": "Custom Homepage Route", - "custom_route_help": "Enter a route name here, without any preceding slash (e.g. \"recent\", or \"popular\")", - "sso.title": "Single Sign-on Services", - "sso.associated": "Associated with", - "sso.not-associated": "Click here to associate with" + "select-skin": "選擇外觀", + "select-homepage": "選擇首頁", + "homepage": "首頁", + "homepage_description": "選擇一個要用來當作討論區的首頁的頁面,或是選'None'來使用預設的首頁。", + "custom_route": "自訂首頁路由", + "custom_route_help": "在這裡輸入路由名稱,不需要在前面的斜線(例如\"recent\"或\"popular\")", + "sso.title": "單一簽入(SSO)服務", + "sso.associated": "關連於", + "sso.not-associated": "點擊這裡進行關連於" } \ No newline at end of file diff --git a/public/src/admin/settings/general.js b/public/src/admin/settings/general.js index 83ecff7907..0c36db401c 100644 --- a/public/src/admin/settings/general.js +++ b/public/src/admin/settings/general.js @@ -14,6 +14,9 @@ define('admin/settings/general', ['admin/settings'], function(Settings) { $('button[data-action="removeTouchIcon"]').on('click', function() { $('input[data-field="brand:touchIcon"]').val(''); }); + $('button[data-action="removeOgImage"]').on('click', function() { + $('input[data-field="removeOgImage"]').val(''); + }); }; return Module; diff --git a/public/src/ajaxify.js b/public/src/ajaxify.js index 993e45eb81..4f452f7b08 100644 --- a/public/src/ajaxify.js +++ b/public/src/ajaxify.js @@ -140,7 +140,7 @@ $(document).ready(function() { window.location.href = config.relative_path + '/login'; return; } else if (status === 302 || status === 308) { - if (data.responseJSON.external) { + if (data.responseJSON && data.responseJSON.external) { window.location.href = data.responseJSON.external; } else if (typeof data.responseJSON === 'string') { ajaxify.go(data.responseJSON.slice(1), callback, quiet); diff --git a/public/src/app.js b/public/src/app.js index a4acd0468b..2f61be6994 100644 --- a/public/src/app.js +++ b/public/src/app.js @@ -133,13 +133,16 @@ app.cacheBuster = null; app.enterRoom = function (room, callback) { callback = callback || function() {}; if (socket && app.user.uid && app.currentRoom !== room) { + var previousRoom = app.currentRoom; + app.currentRoom = room; socket.emit('meta.rooms.enter', { enter: room }, function(err) { if (err) { + app.currentRoom = previousRoom; return app.alertError(err.message); } - app.currentRoom = room; + callback(); }); } diff --git a/public/src/client/login.js b/public/src/client/login.js index eda34c8add..ace40db68d 100644 --- a/public/src/client/login.js +++ b/public/src/client/login.js @@ -31,7 +31,7 @@ define('forum/login', ['csrf', 'translator'], function(csrf, translator) { window.location.href = data + '?loggedin'; }, error: function(data, status) { - if (data.status === 403 && data.statusText === 'Forbidden') { + if (data.status === 403 && data.responseText === 'Forbidden') { window.location.href = config.relative_path + '/login?error=csrf-invalid'; } else { errorEl.find('p').translateText(data.responseText); @@ -50,7 +50,7 @@ define('forum/login', ['csrf', 'translator'], function(csrf, translator) { }); if ($('#content #username').attr('readonly')) { - $('#content #password').focus(); + $('#content #password').val('').focus(); } else { $('#content #username').focus(); } diff --git a/public/src/client/recent.js b/public/src/client/recent.js index e4223d519a..938453894e 100644 --- a/public/src/client/recent.js +++ b/public/src/client/recent.js @@ -1,6 +1,6 @@ 'use strict'; -/* globals define, app, socket, utils */ +/* globals define, app, socket, utils, ajaxify, config */ define('forum/recent', ['forum/infinitescroll', 'components'], function(infinitescroll, components) { var Recent = {}; @@ -23,7 +23,9 @@ define('forum/recent', ['forum/infinitescroll', 'components'], function(infinite $(this).addClass('hide'); }); - infinitescroll.init(Recent.loadMoreTopics); + if (!config.usePagination) { + infinitescroll.init(Recent.loadMoreTopics); + } }; Recent.watchForNewPosts = function () { @@ -35,13 +37,53 @@ define('forum/recent', ['forum/infinitescroll', 'components'], function(infinite }; function onNewTopic(data) { + if (ajaxify.data.selectedCategory && parseInt(ajaxify.data.selectedCategory.cid, 10) !== parseInt(data.cid, 10)) { + return; + } + + if (ajaxify.data.selectedFilter && ajaxify.data.selectedFilter.url === 'unread/watched') { + return; + } + ++newTopicCount; Recent.updateAlertText(); } function onNewPost(data) { - ++newPostCount; - Recent.updateAlertText(); + function showAlert() { + ++newPostCount; + Recent.updateAlertText(); + } + + var post = data.posts[0]; + if (!post || !post.topic) { + return; + } + if (parseInt(post.topic.mainPid, 10) === parseInt(post.pid, 10)) { + return; + } + + if (ajaxify.data.selectedCategory && parseInt(ajaxify.data.selectedCategory.cid, 10) !== parseInt(post.topic.cid, 10)) { + return; + } + + if (ajaxify.data.selectedFilter && ajaxify.data.selectedFilter.url === 'unread/new') { + return; + } + + if (ajaxify.data.selectedFilter && ajaxify.data.selectedFilter.url === 'unread/watched') { + socket.emit('topics.isFollowed', post.tid, function(err, isFollowed) { + if (err) { + app.alertError(err.message); + } + if (isFollowed) { + showAlert(); + } + }); + return; + } + + showAlert(); } Recent.removeListeners = function() { diff --git a/public/src/client/register.js b/public/src/client/register.js index fdf4b3ab7e..306ef367fd 100644 --- a/public/src/client/register.js +++ b/public/src/client/register.js @@ -99,7 +99,7 @@ define('forum/register', ['csrf', 'translator'], function(csrf, translator) { }, error: function(data) { translator.translate(data.responseText, config.defaultLang, function(translated) { - if (data.status === 403 && data.statusText === 'Forbidden') { + if (data.status === 403 && data.responseText === 'Forbidden') { window.location.href = config.relative_path + '/register?error=csrf-invalid'; } else { errorEl.find('p').text(translated); diff --git a/public/src/client/tag.js b/public/src/client/tag.js index 1758539b61..b475c7406b 100644 --- a/public/src/client/tag.js +++ b/public/src/client/tag.js @@ -16,7 +16,9 @@ define('forum/tag', ['forum/recent', 'forum/infinitescroll'], function(recent, i loadMoreTopics(); }); - infinitescroll.init(loadMoreTopics); + if (!config.usePagination) { + infinitescroll.init(loadMoreTopics); + } function loadMoreTopics(direction) { if(direction < 0 || !$('[component="category"]').length) { diff --git a/public/src/client/topic.js b/public/src/client/topic.js index fd6fd7dbfa..6d9daad827 100644 --- a/public/src/client/topic.js +++ b/public/src/client/topic.js @@ -71,7 +71,7 @@ define('forum/topic', [ handleTopicSearch(); - $(window).trigger('action:topic.loaded'); + $(window).trigger('action:topic.loaded', ajaxify.data); }; function handleKeys() { diff --git a/public/src/client/topic/posts.js b/public/src/client/topic/posts.js index 88d80a3872..db22a215a4 100644 --- a/public/src/client/topic/posts.js +++ b/public/src/client/topic/posts.js @@ -32,6 +32,7 @@ define('forum/topic/posts', [ }); updatePostCounts(data.posts); + ajaxify.data.postcount ++; postTools.updatePostCount(ajaxify.data.postcount); @@ -60,15 +61,26 @@ define('forum/topic/posts', [ ajaxify.data.pagination.pageCount = Math.max(1, Math.ceil((posts[0].topic.postcount - 1) / config.postsPerPage)); var direction = config.topicPostSort === 'oldest_to_newest' || config.topicPostSort === 'most_votes' ? 1 : -1; - var isPostVisible = (ajaxify.data.pagination.currentPage === ajaxify.data.pagination.pageCount && direction === 1) || (ajaxify.data.pagination.currentPage === 1 && direction === -1); + var isPostVisible = (ajaxify.data.pagination.currentPage === ajaxify.data.pagination.pageCount && direction === 1) || + (ajaxify.data.pagination.currentPage === 1 && direction === -1); if (isPostVisible) { createNewPosts(data, components.get('post').not('[data-index=0]'), direction, scrollToPost); } else if (ajaxify.data.scrollToMyPost && parseInt(posts[0].uid, 10) === parseInt(app.user.uid, 10)) { pagination.loadPage(ajaxify.data.pagination.pageCount, scrollToPost); + } else { + updatePagination(); } } + function updatePagination() { + $.get(config.relative_path + '/api/topic/pagination/' + ajaxify.data.tid, {page: ajaxify.data.pagination.currentPage}, function(paginationData) { + app.parseAndTranslate('partials/paginator', {pagination: paginationData}, function(html) { + $('[component="pagination"]').after(html).remove(); + }); + }); + } + function onNewPostInfiniteScroll(data) { var direction = config.topicPostSort === 'oldest_to_newest' || config.topicPostSort === 'most_votes' ? 1 : -1; diff --git a/public/src/client/unread.js b/public/src/client/unread.js index 47b96e54ad..5a3ec3543c 100644 --- a/public/src/client/unread.js +++ b/public/src/client/unread.js @@ -78,7 +78,9 @@ define('forum/unread', ['forum/recent', 'topicSelect', 'forum/infinitescroll', ' loadMoreTopics(); }); - infinitescroll.init(loadMoreTopics); + if (!config.usePagination) { + infinitescroll.init(loadMoreTopics); + } function loadMoreTopics(direction) { if(direction < 0 || !$('[component="category"]').length) { @@ -88,7 +90,8 @@ define('forum/unread', ['forum/recent', 'topicSelect', 'forum/infinitescroll', ' var cid = params.cid; infinitescroll.loadMore('topics.loadMoreUnreadTopics', { after: $('[component="category"]').attr('data-nextstart'), - cid: cid + cid: cid, + filter: ajaxify.data.selectedFilter.filter }, function(data, done) { if (data.topics && data.topics.length) { recent.onTopicsLoaded('unread', data.topics, true, done); diff --git a/public/src/modules/translator.js b/public/src/modules/translator.js index b208a0af48..9e2417795c 100644 --- a/public/src/modules/translator.js +++ b/public/src/modules/translator.js @@ -72,10 +72,6 @@ languageCode = 'en'; break; - case 'cs': - languageCode = 'cz'; - break; - case 'fa_IR': languageCode = 'fa'; break; @@ -109,17 +105,6 @@ $.getScript(RELATIVE_PATH + '/vendor/jquery/timeago/locales/jquery.timeago.' + languageCode + '-short.js').success(function() { // Switch back to long-form translator.toggleTimeagoShorthand(); - }).fail(function() { - $.getScript(RELATIVE_PATH + '/vendor/jquery/timeago/locales/jquery.timeago.en-short.js').success(function() { - // Switch back to long-form - translator.toggleTimeagoShorthand(); - }); - }); - }).fail(function() { - $.getScript(RELATIVE_PATH + '/vendor/jquery/timeago/locales/jquery.timeago.en-short.js').success(function() { - // Switch back to long-form - translator.toggleTimeagoShorthand(); - $.getScript(RELATIVE_PATH + '/vendor/jquery/timeago/locales/jquery.timeago.en.js'); }); }); diff --git a/src/controllers/accounts/settings.js b/src/controllers/accounts/settings.js index ba7cc4dcaf..af746a07b6 100644 --- a/src/controllers/accounts/settings.js +++ b/src/controllers/accounts/settings.js @@ -125,6 +125,8 @@ settingsController.get = function(req, res, callback) { userData.disableCustomUserSkins = parseInt(meta.config.disableCustomUserSkins, 10) === 1; userData.allowUserHomePage = parseInt(meta.config.allowUserHomePage, 10) === 1; + + userData.inTopicSearchAvailable = plugins.hasListeners('filter:topic.search'); userData.title = '[[pages:account/settings]]'; userData.breadcrumbs = helpers.buildBreadcrumbs([{text: userData.username, url: '/user/' + userData.userslug}, {text: '[[user:settings]]'}]); diff --git a/src/controllers/admin/uploads.js b/src/controllers/admin/uploads.js index 0affec8f6b..90dae8a243 100644 --- a/src/controllers/admin/uploads.js +++ b/src/controllers/admin/uploads.js @@ -1,13 +1,13 @@ "use strict"; -var fs = require('fs'), - path = require('path'), - async = require('async'), - nconf = require('nconf'), - winston = require('winston'), - file = require('../../file'), - image = require('../../image'), - plugins = require('../../plugins'); +var fs = require('fs'); +var path = require('path'); +var async = require('async'); +var nconf = require('nconf'); +var winston = require('winston'); +var file = require('../../file'); +var image = require('../../image'); +var plugins = require('../../plugins'); var allowedImageTypes = ['image/png', 'image/jpeg', 'image/pjpeg', 'image/jpg', 'image/gif', 'image/svg+xml']; @@ -124,6 +124,10 @@ uploadsController.uploadDefaultAvatar = function(req, res, next) { upload('avatar-default', req, res, next); }; +uploadsController.uploadOgImage = function(req, res, next) { + upload('og:image', req, res, next); +}; + function upload(name, req, res, next) { var uploadedFile = req.files.files[0]; diff --git a/src/controllers/categories.js b/src/controllers/categories.js index 7e3e4b0efe..642467c6b0 100644 --- a/src/controllers/categories.js +++ b/src/controllers/categories.js @@ -25,14 +25,14 @@ categoriesController.list = function(req, res, next) { content: 'website' }]; - if (meta.config['brand:logo']) { - var brandLogo = meta.config['brand:logo']; - if (!brandLogo.startsWith('http')) { - brandLogo = nconf.get('url') + brandLogo; + var ogImage = meta.config['og:image'] || meta.config['brand:logo'] || ''; + if (ogImage) { + if (!ogImage.startsWith('http')) { + ogImage = nconf.get('url') + ogImage; } res.locals.metaTags.push({ property: 'og:image', - content: brandLogo + content: ogImage }); } diff --git a/src/controllers/index.js b/src/controllers/index.js index f0a6e8d023..09f156b19d 100644 --- a/src/controllers/index.js +++ b/src/controllers/index.js @@ -3,6 +3,7 @@ var async = require('async'); var nconf = require('nconf'); var validator = require('validator'); +var winston = require('winston'); var meta = require('../meta'); var user = require('../user'); @@ -127,6 +128,7 @@ Controllers.login = function(req, res, next) { return next(err); } data.username = allowLoginWith === 'email' ? user.email : user.username; + data.alternate_logins = []; res.render('login', data); }); } else { @@ -205,7 +207,7 @@ Controllers.compose = function(req, res, next) { }); }; -Controllers.confirmEmail = function(req, res, next) { +Controllers.confirmEmail = function(req, res) { user.email.confirm(req.params.code, function (err) { res.render('confirm', { error: err ? err.message : '', @@ -217,6 +219,10 @@ Controllers.confirmEmail = function(req, res, next) { Controllers.sitemap = {}; Controllers.sitemap.render = function(req, res, next) { sitemap.render(function(err, tplData) { + if (err) { + return next(err); + } + Controllers.render('sitemap', tplData, function(err, xml) { res.header('Content-Type', 'application/xml'); res.send(xml); @@ -327,7 +333,7 @@ Controllers.manifest = function(req, res) { res.status(200).json(manifest); }; -Controllers.outgoing = function(req, res, next) { +Controllers.outgoing = function(req, res) { var url = req.query.url; var data = { url: validator.escape(String(url)), @@ -349,4 +355,68 @@ Controllers.termsOfUse = function(req, res, next) { res.render('tos', {termsOfUse: meta.config.termsOfUse}); }; +Controllers.handle404 = function(req, res) { + var relativePath = nconf.get('relative_path'); + var isLanguage = new RegExp('^' + relativePath + '/language/.*/.*.json'); + var isClientScript = new RegExp('^' + relativePath + '\\/src\\/.+\\.js'); + + if (plugins.hasListeners('action:meta.override404')) { + return plugins.fireHook('action:meta.override404', { + req: req, + res: res, + error: {} + }); + } + + if (isClientScript.test(req.url)) { + res.type('text/javascript').status(200).send(''); + } else if (isLanguage.test(req.url)) { + res.status(200).json({}); + } else if (req.path.startsWith(relativePath + '/uploads') || (req.get('accept') && req.get('accept').indexOf('text/html') === -1) || req.path === '/favicon.ico') { + res.sendStatus(404); + } else if (req.accepts('html')) { + if (process.env.NODE_ENV === 'development') { + winston.warn('Route requested but not found: ' + req.url); + } + + res.status(404); + + if (res.locals.isAPI) { + return res.json({path: validator.escape(req.path.replace(/^\/api/, '') || ''), title: '[[global:404.title]]'}); + } + + req.app.locals.middleware.buildHeader(req, res, function() { + res.render('404', {path: validator.escape(req.path || ''), title: '[[global:404.title]]'}); + }); + } else { + res.status(404).type('txt').send('Not found'); + } +}; + +Controllers.handleErrors = function(err, req, res, next) { + switch (err.code) { + case 'EBADCSRFTOKEN': + winston.error(req.path + '\n', err.message); + return res.sendStatus(403); + case 'blacklisted-ip': + return res.status(403).type('text/plain').send(err.message); + } + + if (parseInt(err.status, 10) === 302 && err.path) { + return res.locals.isAPI ? res.status(302).json(err.path) : res.redirect(err.path); + } + + winston.error(req.path + '\n', err.stack); + + res.status(err.status || 500); + + if (res.locals.isAPI) { + res.json({path: validator.escape(req.path || ''), error: err.message}); + } else { + req.app.locals.middleware.buildHeader(req, res, function() { + res.render('500', {path: validator.escape(String(req.path || '')), error: validator.escape(err.message)}); + }); + } +}; + module.exports = Controllers; diff --git a/src/controllers/posts.js b/src/controllers/posts.js index c8b490f65b..be96fa7e43 100644 --- a/src/controllers/posts.js +++ b/src/controllers/posts.js @@ -12,7 +12,7 @@ postsController.redirectToPost = function(req, res, callback) { } posts.generatePostPath(pid, req.uid, function(err, path) { - if (err) { + if (err || !path) { return callback(err); } diff --git a/src/controllers/recent.js b/src/controllers/recent.js index 6883929be4..fe9355c533 100644 --- a/src/controllers/recent.js +++ b/src/controllers/recent.js @@ -1,26 +1,63 @@ 'use strict'; +var async = require('async'); var nconf = require('nconf'); +var db = require('../database'); +var privileges = require('../privileges'); +var user = require('../user'); var topics = require('../topics'); var meta = require('../meta'); var helpers = require('./helpers'); +var pagination = require('../pagination'); var recentController = {}; recentController.get = function(req, res, next) { + var page = parseInt(req.query.page, 10) || 1; + var pageCount = 1; + var stop = 0; + var topicCount = 0; + var settings; - var stop = (parseInt(meta.config.topicsPerList, 10) || 20) - 1; + async.waterfall([ + function (next) { + async.parallel({ + settings: function(next) { + user.getSettings(req.uid, next); + }, + tids: function (next) { + db.getSortedSetRevRange('topics:recent', 0, 199, next); + } + }, next); + }, + function (results, next) { + settings = results.settings; + privileges.topics.filterTids('read', results.tids, req.uid, next); + }, + function (tids, next) { + var start = Math.max(0, (page - 1) * settings.topicsPerPage); + stop = start + settings.topicsPerPage - 1; - topics.getTopicsFromSet('topics:recent', req.uid, 0, stop, function(err, data) { + topicCount = tids.length; + pageCount = Math.max(1, Math.ceil(topicCount / settings.topicsPerPage)); + tids = tids.slice(start, stop + 1); + + topics.getTopicsByTids(tids, req.uid, next); + } + ], function(err, topics) { if (err) { return next(err); } + var data = {}; + data.topics = topics; + data.nextStart = stop + 1; data['feeds:disableRSS'] = parseInt(meta.config['feeds:disableRSS'], 10) === 1; data.rssFeedUrl = nconf.get('relative_path') + '/recent.rss'; data.title = '[[pages:recent]]'; + data.pagination = pagination.create(page, pageCount); if (req.path.startsWith('/api/recent') || req.path.startsWith('/recent')) { data.breadcrumbs = helpers.buildBreadcrumbs([{text: '[[recent:title]]'}]); } diff --git a/src/controllers/tags.js b/src/controllers/tags.js index af8f6058c0..45ab3424aa 100644 --- a/src/controllers/tags.js +++ b/src/controllers/tags.js @@ -5,15 +5,16 @@ var async = require('async'); var nconf = require('nconf'); var validator = require('validator'); -var meta = require('../meta'); +var user = require('../user'); var topics = require('../topics'); +var pagination = require('../pagination'); var helpers = require('./helpers'); var tagsController = {}; tagsController.getTag = function(req, res, next) { var tag = validator.escape(req.params.tag); - var stop = (parseInt(meta.config.topicsPerList, 10) || 20) - 1; + var page = parseInt(req.query.page, 10) || 1; var templateData = { topics: [], @@ -21,18 +22,33 @@ tagsController.getTag = function(req, res, next) { breadcrumbs: helpers.buildBreadcrumbs([{text: '[[tags:tags]]', url: '/tags'}, {text: tag}]), title: '[[pages:tag, ' + tag + ']]' }; - + var settings; + var topicCount = 0; async.waterfall([ function (next) { - topics.getTagTids(req.params.tag, 0, stop, next); + user.getSettings(req.uid, next); }, - function (tids, next) { - if (Array.isArray(tids) && !tids.length) { + function (_settings, next) { + settings = _settings; + var start = Math.max(0, (page - 1) * settings.topicsPerPage); + var stop = start + settings.topicsPerPage - 1; + templateData.nextStart = stop + 1; + async.parallel({ + topicCount: function(next) { + topics.getTagTopicCount(tag, next); + }, + tids: function(next) { + topics.getTagTids(req.params.tag, start, stop, next); + } + }, next); + }, + function (results, next) { + if (Array.isArray(results.tids) && !results.tids.length) { topics.deleteTag(req.params.tag); return res.render('tag', templateData); } - - topics.getTopics(tids, req.uid, next); + topicCount = results.topicCount; + topics.getTopics(results.tids, req.uid, next); } ], function(err, topics) { if (err) { @@ -54,7 +70,9 @@ tagsController.getTag = function(req, res, next) { } ]; templateData.topics = topics; - templateData.nextStart = stop + 1; + + var pageCount = Math.max(1, Math.ceil(topicCount / settings.topicsPerPage)); + templateData.pagination = pagination.create(page, pageCount); res.render('tag', templateData); }); diff --git a/src/controllers/topics.js b/src/controllers/topics.js index 6b7793f58c..74604c0085 100644 --- a/src/controllers/topics.js +++ b/src/controllers/topics.js @@ -170,8 +170,10 @@ topicsController.get = function(req, res, callback) { var ogImageUrl = ''; if (topicData.thumb) { ogImageUrl = topicData.thumb; - } else if (postAtIndex && postAtIndex.user && postAtIndex.user.picture){ + } else if (postAtIndex && postAtIndex.user && postAtIndex.user.picture) { ogImageUrl = postAtIndex.user.picture; + } else if (meta.config['og:image']) { + ogImageUrl = meta.config['og:image']; } else if (meta.config['brand:logo']) { ogImageUrl = meta.config['brand:logo']; } else { @@ -327,5 +329,37 @@ topicsController.teaser = function(req, res, next) { }); }; +topicsController.pagination = function(req, res, callback) { + var tid = req.params.topic_id; + var currentPage = parseInt(req.query.page, 10) || 1; + + if (!utils.isNumber(tid)) { + return callback(); + } + + async.parallel({ + privileges: async.apply(privileges.topics.get, tid, req.uid), + settings: async.apply(user.getSettings, req.uid), + topic: async.apply(topics.getTopicData, tid) + }, function (err, results) { + if (err || !results.topic) { + return callback(err); + } + + if (!results.privileges.read || (parseInt(results.topic.deleted, 10) && !results.privileges.view_deleted)) { + return helpers.notAllowed(req, res); + } + + var postCount = parseInt(results.topic.postcount, 10); + var pageCount = Math.max(1, Math.ceil((postCount - 1) / results.settings.postsPerPage)); + + var paginationData = pagination.create(currentPage, pageCount); + paginationData.rel.forEach(function(rel) { + rel.href = nconf.get('url') + '/topic/' + results.topic.slug + rel.href; + }); + + res.json(paginationData); + }); +}; module.exports = topicsController; diff --git a/src/controllers/unread.js b/src/controllers/unread.js index 1d80774fb0..0fc32c390c 100644 --- a/src/controllers/unread.js +++ b/src/controllers/unread.js @@ -2,9 +2,10 @@ 'use strict'; var async = require('async'); -var meta = require('../meta'); + var categories = require('../categories'); var privileges = require('../privileges'); +var pagination = require('../pagination'); var user = require('../user'); var topics = require('../topics'); var helpers = require('./helpers'); @@ -14,7 +15,7 @@ var unreadController = {}; var validFilter = {'': true, 'new': true, 'watched': true}; unreadController.get = function(req, res, next) { - var stop = (parseInt(meta.config.topicsPerList, 10) || 20) - 1; + var page = parseInt(req.query.page, 10) || 1; var results; var cid = req.query.cid; var filter = req.params.filter || ''; @@ -22,66 +23,92 @@ unreadController.get = function(req, res, next) { if (!validFilter[filter]) { return next(); } - + var settings; async.waterfall([ function(next) { async.parallel({ watchedCategories: function(next) { - user.getWatchedCategories(req.uid, next); + getWatchedCategories(req.uid, cid, next); }, - unreadTopics: function(next) { - topics.getUnreadTopics(cid, req.uid, 0, stop, filter, next); + settings: function(next) { + user.getSettings(req.uid, next); } }, next); }, function(_results, next) { results = _results; - - privileges.categories.filterCids('read', results.watchedCategories, req.uid, next); - }, - function(cids, next) { - categories.getCategoriesFields(cids, ['cid', 'name', 'slug', 'icon', 'link', 'color', 'bgColor'], next); + settings = results.settings; + var start = Math.max(0, (page - 1) * settings.topicsPerPage); + var stop = start + settings.topicsPerPage - 1; + topics.getUnreadTopics(cid, req.uid, start, stop, filter, next); } - ], function(err, categories) { + ], function(err, data) { if (err) { return next(err); } - categories = categories.filter(function(category) { - return category && !category.link; - }); - categories.forEach(function(category) { - category.selected = parseInt(category.cid, 10) === parseInt(cid, 10); - if (category.selected) { - results.unreadTopics.selectedCategory = category; - } - }); - results.unreadTopics.categories = categories; + data.categories = results.watchedCategories.categories; + data.selectedCategory = results.watchedCategories.selectedCategory; - results.unreadTopics.breadcrumbs = helpers.buildBreadcrumbs([{text: '[[unread:title]]'}]); - results.unreadTopics.title = '[[pages:unread]]'; - results.unreadTopics.filters = [{ + data.breadcrumbs = helpers.buildBreadcrumbs([{text: '[[unread:title]]'}]); + data.title = '[[pages:unread]]'; + data.filters = [{ name: '[[unread:all-topics]]', url: 'unread', - selected: filter === '' + selected: filter === '', + filter: '' }, { name: '[[unread:new-topics]]', url: 'unread/new', - selected: filter === 'new' + selected: filter === 'new', + filter: 'new' }, { name: '[[unread:watched-topics]]', url: 'unread/watched', - selected: filter === 'watched' + selected: filter === 'watched', + filter: 'watched' }]; - results.unreadTopics.selectedFilter = results.unreadTopics.filters.filter(function(filter) { + data.selectedFilter = data.filters.filter(function(filter) { return filter && filter.selected; })[0]; - res.render('unread', results.unreadTopics); + data.querystring = req.query.cid ? ('?cid=' + req.query.cid) : ''; + + data.pageCount = Math.max(1, Math.ceil(data.topicCount / settings.topicsPerPage)); + data.pagination = pagination.create(page, data.pageCount, req.query); + + res.render('unread', data); }); }; +function getWatchedCategories(uid, selectedCid, callback) { + async.waterfall([ + function (next) { + user.getWatchedCategories(uid, next); + }, + function (cids, next) { + privileges.categories.filterCids('read', cids, uid, next); + }, + function (cids, next) { + categories.getCategoriesFields(cids, ['cid', 'name', 'slug', 'icon', 'link', 'color', 'bgColor'], next); + }, + function (categoryData, next) { + categoryData = categoryData.filter(function(category) { + return category && !category.link; + }); + var selectedCategory; + categoryData.forEach(function(category) { + category.selected = parseInt(category.cid, 10) === parseInt(selectedCid, 10); + if (category.selected) { + selectedCategory = category; + } + }); + next(null, {categories: categoryData, selectedCategory: selectedCategory}); + } + ], callback); +} + unreadController.unreadTotal = function(req, res, next) { var filter = req.params.filter || ''; diff --git a/src/controllers/uploads.js b/src/controllers/uploads.js index 087889d340..16bc3b7c31 100644 --- a/src/controllers/uploads.js +++ b/src/controllers/uploads.js @@ -198,7 +198,7 @@ function uploadFile(uid, uploadedFile, callback) { function saveFileToLocal(uploadedFile, callback) { var extension = path.extname(uploadedFile.name); - if (!extension) { + if (!extension && uploadedFile.type) { extension = '.' + mime.extension(uploadedFile.type); } diff --git a/src/groups/cover.js b/src/groups/cover.js index 89ef97df94..99f2791a2e 100644 --- a/src/groups/cover.js +++ b/src/groups/cover.js @@ -6,6 +6,7 @@ var path = require('path'); var fs = require('fs'); var crypto = require('crypto'); var Jimp = require('jimp'); +var mime = require('mime'); var db = require('../database'); var file = require('../file'); @@ -29,6 +30,7 @@ module.exports = function(Groups) { var tempPath = data.file ? data.file : ''; var url; + var type = data.file ? mime.lookup(data.file) : 'image/png'; async.waterfall([ function (next) { @@ -41,7 +43,8 @@ module.exports = function(Groups) { tempPath = _tempPath; uploadsController.uploadGroupCover(uid, { name: 'groupCover', - path: tempPath + path: tempPath, + type: type }, next); }, function (uploadData, next) { @@ -54,7 +57,8 @@ module.exports = function(Groups) { function (next) { uploadsController.uploadGroupCover(uid, { name: 'groupCoverThumb', - path: tempPath + path: tempPath, + type: type }, next); }, function (uploadData, next) { @@ -104,7 +108,7 @@ module.exports = function(Groups) { md5sum = md5sum.digest('hex'); // Save image - var tempPath = path.join(nconf.get('base_dir'), nconf.get('upload_path'), md5sum); + var tempPath = path.join(nconf.get('base_dir'), nconf.get('upload_path'), md5sum) + '.png'; var buffer = new Buffer(imageData.slice(imageData.indexOf('base64') + 7), 'base64'); fs.writeFile(tempPath, buffer, { diff --git a/src/languages.js b/src/languages.js index de1d82bcff..2ad64fd588 100644 --- a/src/languages.js +++ b/src/languages.js @@ -3,8 +3,48 @@ var fs = require('fs'), path = require('path'), async = require('async'), + LRU = require('lru-cache'), + _ = require('underscore'); - Languages = {}; +var plugins = require('./plugins'); + +var Languages = {}; + +Languages.init = function(next) { + if (Languages.hasOwnProperty('_cache')) { + Languages._cache.reset(); + } else { + Languages._cache = LRU(100); + } + + next(); +}; + +Languages.get = function(code, key, callback) { + var combined = [code, key].join('/'); + + if (Languages._cache.has(combined)) { + return callback(null, Languages._cache.get(combined)); + } + + var languageData; + + fs.readFile(path.join(__dirname, '../public/language/', code, key), { encoding: 'utf-8' }, function(err, data) { + // If language file in core cannot be read, then no language file present + try { + languageData = JSON.parse(data) || {}; + } catch (e) { + languageData = {}; + } + + if (plugins.customLanguages.hasOwnProperty(combined)) { + _.extendOwn(languageData, plugins.customLanguages[combined]); + } + + Languages._cache.set(combined, languageData); + callback(null, languageData); + }); +}; Languages.list = function(callback) { var languagesPath = path.join(__dirname, '../public/language'), diff --git a/src/meta.js b/src/meta.js index ffc85c98bf..eb5816fdaf 100644 --- a/src/meta.js +++ b/src/meta.js @@ -8,6 +8,7 @@ var async = require('async'), user = require('./user'), groups = require('./groups'), + languages = require('./languages'), emitter = require('./emitter'), pubsub = require('./pubsub'), auth = require('./routes/authentication'), @@ -65,6 +66,7 @@ var async = require('async'), async.apply(Meta.js.minify, 'nodebb.min.js'), async.apply(Meta.js.minify, 'acp.min.js'), async.apply(Meta.sounds.init), + async.apply(languages.init), async.apply(Meta.templates.compile), async.apply(auth.reloadRoutes), function(next) { diff --git a/src/meta/js.js b/src/meta/js.js index 6f591cc9fd..b7585bbee8 100644 --- a/src/meta/js.js +++ b/src/meta/js.js @@ -92,7 +92,9 @@ module.exports = function(Meta) { // Add routes for AMD-type modules to serve those files var numBridged = 0, addRoute = function(relPath) { - app.get('/src/modules/' + relPath, function(req, res) { + var relativePath = nconf.get('relative_path'); + + app.get(relativePath + '/src/modules/' + relPath, function(req, res) { return res.sendFile(path.join(__dirname, '../../', Meta.js.scripts.modules[relPath]), { maxAge: app.enabled('cache') ? 5184000000 : 0 }); diff --git a/src/middleware/middleware.js b/src/middleware/middleware.js index bc07719ade..342ecdc38f 100644 --- a/src/middleware/middleware.js +++ b/src/middleware/middleware.js @@ -5,6 +5,7 @@ var app, admin: {} }, async = require('async'), + fs = require('fs'), path = require('path'), csrf = require('csurf'), _ = require('underscore'), @@ -15,6 +16,7 @@ var app, toobusy = require('toobusy-js'), plugins = require('../plugins'), + languages = require('../languages'), meta = require('../meta'), user = require('../user'), groups = require('../groups'), @@ -193,18 +195,28 @@ middleware.isAdmin = function(req, res, next) { } if (isAdmin) { - var loginTime = req.session.meta ? req.session.meta.datetime : 0; - if (loginTime && parseInt(loginTime, 10) > Date.now() - 3600000) { - return next(); - } + user.hasPassword(req.uid, function(err, hasPassword) { + if (err) { + return next(err); + } - req.session.returnTo = nconf.get('relative_path') + req.path.replace(/^\/api/, ''); - req.session.forceLogin = 1; - if (res.locals.isAPI) { - res.status(401).json({}); - } else { - res.redirect('/login'); - } + if (!hasPassword) { + return next(); + } + + var loginTime = req.session.meta ? req.session.meta.datetime : 0; + if (loginTime && parseInt(loginTime, 10) > Date.now() - 3600000) { + return next(); + } + + req.session.returnTo = nconf.get('relative_path') + req.path.replace(/^\/api/, ''); + req.session.forceLogin = 1; + if (res.locals.isAPI) { + res.status(401).json({}); + } else { + res.redirect('/login'); + } + }); return; } @@ -302,6 +314,41 @@ middleware.applyBlacklist = function(req, res, next) { }); }; +middleware.processLanguages = function(req, res, next) { + var code = req.params.code; + var key = req.path.match(/[\w]+\.json/); + + if (code && key) { + languages.get(code, key[0], function(err, language) { + res.status(200).json(language); + }) + } else { + res.status(404).json('{}'); + } +}; + +middleware.processTimeagoLocales = function(req, res, next) { + var fallback = req.path.indexOf('-short') === -1 ? 'jquery.timeago.en.js' : 'jquery.timeago.en-short.js', + localPath = path.join(__dirname, '../../public/vendor/jquery/timeago/locales', req.path), + exists; + + try { + exists = fs.accessSync(localPath, fs.F_OK | fs.R_OK); + } catch(e) { + exists = false; + } + + if (exists) { + res.status(200).sendFile(localPath, { + maxAge: app.enabled('cache') ? 5184000000 : 0 + }); + } else { + res.status(200).sendFile(path.join(__dirname, '../../public/vendor/jquery/timeago/locales', fallback), { + maxAge: app.enabled('cache') ? 5184000000 : 0 + }); + } +}; + module.exports = function(webserver) { app = webserver; middleware.admin = require('./admin')(webserver); diff --git a/src/plugins.js b/src/plugins.js index 853c6f44f2..da7f25eefe 100644 --- a/src/plugins.js +++ b/src/plugins.js @@ -31,7 +31,7 @@ var middleware; Plugins.lessFiles = []; Plugins.clientScripts = []; Plugins.acpScripts = []; - Plugins.customLanguages = []; + Plugins.customLanguages = {}; Plugins.customLanguageFallbacks = {}; Plugins.libraryPaths = []; Plugins.versionWarning = []; @@ -85,12 +85,22 @@ var middleware; Plugins.acpScripts.length = 0; Plugins.libraryPaths.length = 0; - Plugins.registerHook('core', { - hook: 'static:app.load', - method: addLanguages - }); + // Plugins.registerHook('core', { + // hook: 'static:app.load', + // method: addLanguages + // }); async.waterfall([ + function(next) { + // Build language code list + fs.readdir(path.join(__dirname, '../public/language'), function(err, directories) { + Plugins.languageCodes = directories.filter(function(code) { + return code !== 'TODO'; + }); + + next(); + }); + }, function(next) { db.getSortedSetRange('plugins:active', 0, -1, next); }, @@ -415,27 +425,28 @@ var middleware; ], next); }; - function addLanguages(params, callback) { - Plugins.customLanguages.forEach(function(lang) { - params.router.get('/language' + lang.route, function(req, res, next) { - res.json(lang.file); - }); + // function addLanguages(params, callback) { + // Plugins.customLanguages.forEach(function(lang) { + // console.log('route for', '/language/' + lang.route); + // params.router.get('/language' + lang.route, function(req, res, next) { + // res.json(lang.file); + // }); - var components = lang.route.split('/'), - language = components[1], - filename = components[2].replace('.json', ''); + // var components = lang.route.split('/'), + // language = components[1], + // filename = components[2].replace('.json', ''); - translator.addTranslation(language, filename, lang.file); - }); + // translator.addTranslation(language, filename, lang.file); + // }); - for(var resource in Plugins.customLanguageFallbacks) { - params.router.get('/language/:lang/' + resource + '.json', function(req, res, next) { - winston.verbose('[translator] No resource file found for ' + req.params.lang + '/' + path.basename(req.path, '.json') + ', using provided fallback language file'); - res.sendFile(Plugins.customLanguageFallbacks[path.basename(req.path, '.json')]); - }); - } + // for(var resource in Plugins.customLanguageFallbacks) { + // params.router.get('/language/:lang/' + resource + '.json', function(req, res, next) { + // winston.verbose('[translator] No resource file found for ' + req.params.lang + '/' + path.basename(req.path, '.json') + ', using provided fallback language file'); + // res.sendFile(Plugins.customLanguageFallbacks[path.basename(req.path, '.json')]); + // }); + // } - callback(null); - } + // callback(null); + // } }(exports)); diff --git a/src/plugins/load.js b/src/plugins/load.js index 48bbdb0390..a70fce41ab 100644 --- a/src/plugins/load.js +++ b/src/plugins/load.js @@ -219,28 +219,34 @@ module.exports = function(Plugins) { fallbackMap = {}; utils.walk(pathToFolder, function(err, languages) { - var arr = []; - async.each(languages, function(pathToLang, next) { fs.readFile(pathToLang, function(err, file) { if (err) { return next(err); } - var json; + var data; + var route = pathToLang.replace(pathToFolder + '/', ''); try { - json = JSON.parse(file.toString()); + data = JSON.parse(file.toString()); } catch (err) { winston.error('[plugins] Unable to parse custom language file: ' + pathToLang + '\r\n' + err.stack); return next(err); } - arr.push({ - file: json, - route: pathToLang.replace(pathToFolder, '') - }); + Plugins.customLanguages[route] = Plugins.customLanguages[route] || {}; + _.extendOwn(Plugins.customLanguages[route], data); if (pluginData.defaultLang && pathToLang.endsWith(pluginData.defaultLang + '/' + path.basename(pathToLang))) { + Plugins.languageCodes.map(function(code) { + if (pluginData.defaultLang !== code) { + return code + '/' + path.basename(pathToLang); + } else { + return null; + } + }).filter(Boolean).forEach(function(key) { + Plugins.customLanguages[key] = _.defaults(Plugins.customLanguages[key] || {}, data); + }); fallbackMap[path.basename(pathToLang, '.json')] = path.join(pathToFolder, pluginData.defaultLang, path.basename(pathToLang)); } @@ -251,7 +257,7 @@ module.exports = function(Plugins) { return callback(err); } - Plugins.customLanguages = Plugins.customLanguages.concat(arr); + // do I need this either? _.extendOwn(Plugins.customLanguageFallbacks, fallbackMap); callback(); diff --git a/src/posts/delete.js b/src/posts/delete.js index 40b6554b6f..e28f3f8e36 100644 --- a/src/posts/delete.js +++ b/src/posts/delete.js @@ -24,15 +24,15 @@ module.exports = function(Posts) { }, function (_post, next) { postData = _post; - topics.getTopicField(_post.tid, 'cid', next); + topics.getTopicFields(_post.tid, ['tid', 'cid', 'pinned'], next); }, - function (cid, next) { + function (topicData, next) { async.parallel([ function(next) { - updateTopicTimestamp(postData.tid, next); + updateTopicTimestamp(topicData, next); }, function(next) { - db.sortedSetRemove('cid:' + cid + ':pids', pid, next); + db.sortedSetRemove('cid:' + topicData.cid + ':pids', pid, next); }, function(next) { Posts.dismissFlag(pid, next); @@ -40,10 +40,11 @@ module.exports = function(Posts) { function(next) { topics.updateTeaser(postData.tid, next); } - ], function(err) { - plugins.fireHook('action:post.delete', pid); - next(err, postData); - }); + ], next); + }, + function (results, next) { + plugins.fireHook('action:post.delete', pid); + next(null, postData); } ], callback); }; @@ -62,45 +63,56 @@ module.exports = function(Posts) { }, function (_post, next) { postData = _post; - topics.getTopicField(_post.tid, 'cid', next); + topics.getTopicFields(_post.tid, ['tid', 'cid', 'pinned'], next); }, - function (cid, next) { - postData.cid = cid; + function (topicData, next) { + postData.cid = topicData.cid; async.parallel([ function(next) { - updateTopicTimestamp(postData.tid, next); + updateTopicTimestamp(topicData, next); }, function(next) { - db.sortedSetAdd('cid:' + cid + ':pids', postData.timestamp, pid, next); + db.sortedSetAdd('cid:' + topicData.cid + ':pids', postData.timestamp, pid, next); }, function(next) { topics.updateTeaser(postData.tid, next); } - ], function(err) { - plugins.fireHook('action:post.restore', _.clone(postData)); - next(err, postData); - }); + ], next); + }, + function (results, next) { + plugins.fireHook('action:post.restore', _.clone(postData)); + next(null, postData); } ], callback); }; - function updateTopicTimestamp(tid, callback) { - topics.getLatestUndeletedPid(tid, function(err, pid) { - if(err || !pid) { - return callback(err); + function updateTopicTimestamp(topicData, callback) { + var timestamp; + async.waterfall([ + function (next) { + topics.getLatestUndeletedPid(topicData.tid, next); + }, + function (pid, next) { + if (!parseInt(pid, 10)) { + return callback(); + } + Posts.getPostField(pid, 'timestamp', next); + }, + function (_timestamp, next) { + timestamp = _timestamp; + if (!parseInt(timestamp, 10)) { + return callback(); + } + topics.updateTimestamp(topicData.tid, timestamp, next); + }, + function (next) { + if (parseInt(topicData.pinned, 10) !== 1) { + db.sortedSetAdd('cid:' + topicData.cid + ':tids', timestamp, topicData.tid, next); + } else { + next(); + } } - - Posts.getPostField(pid, 'timestamp', function(err, timestamp) { - if (err) { - return callback(err); - } - - if (timestamp) { - return topics.updateTimestamp(tid, timestamp, callback); - } - callback(); - }); - }); + ], callback); } Posts.purge = function(pid, uid, callback) { @@ -160,7 +172,7 @@ module.exports = function(Posts) { return callback(err); } - topics.getTopicFields(postData.tid, ['cid'], function(err, topicData) { + topics.getTopicFields(postData.tid, ['tid', 'cid', 'pinned'], function(err, topicData) { if (err) { return callback(err); } @@ -178,6 +190,9 @@ module.exports = function(Posts) { function(next) { topics.updateTeaser(postData.tid, next); }, + function (next) { + updateTopicTimestamp(topicData, next); + }, function(next) { db.sortedSetIncrBy('cid:' + topicData.cid + ':tids:posts', -1, postData.tid, next); }, diff --git a/src/posts/parse.js b/src/posts/parse.js index 1af374305d..6381e066ed 100644 --- a/src/posts/parse.js +++ b/src/posts/parse.js @@ -1,10 +1,14 @@ - 'use strict'; +var nconf = require('nconf'), + url = require('url'); + var cache = require('./cache'); var plugins = require('../plugins'); var translator = require('../../public/src/modules/translator'); +var urlRegex = /href="([^"]+)"/g; + module.exports = function(Posts) { Posts.parsePost = function(postData, callback) { @@ -26,6 +30,7 @@ module.exports = function(Posts) { } data.postData.content = translator.escape(data.postData.content); + data.postData.content = Posts.relativeToAbsolute(data.postData.content); if (global.env === 'production' && data.postData.pid) { cache.set(data.postData.pid, data.postData.content); @@ -40,4 +45,29 @@ module.exports = function(Posts) { plugins.fireHook('filter:parse.signature', {userData: userData, uid: uid}, callback); }; + + Posts.relativeToAbsolute = function(content) { + // Turns relative links in post body to absolute urls + var parsed, current, absolute; + + while ((current=urlRegex.exec(content)) !== null) { + if (current[1]) { + parsed = url.parse(current[1]); + + if (!parsed.protocol) { + if (current[1].startsWith('/')) { + // Internal link + absolute = nconf.get('url') + current[1]; + } else { + // External link + absolute = '//' + current[1]; + } + + content = content.slice(0, current.index + 6) + absolute + content.slice(current.index + 6 + current[1].length); + } + } + } + + return content; + }; }; diff --git a/src/privileges/topics.js b/src/privileges/topics.js index 8bb1f313c2..8a02800544 100644 --- a/src/privileges/topics.js +++ b/src/privileges/topics.js @@ -23,7 +23,7 @@ module.exports = function(privileges) { 'topics:reply': async.apply(helpers.isUserAllowedTo, 'topics:reply', uid, [topic.cid]), read: async.apply(helpers.isUserAllowedTo, 'read', uid, [topic.cid]), isOwner: function(next) { - next(null, parseInt(uid, 10) === parseInt(topic.uid, 10)); + next(null, !!parseInt(uid, 10) && parseInt(uid, 10) === parseInt(topic.uid, 10)); }, isAdministrator: async.apply(user.isAdministrator, uid), isModerator: async.apply(user.isModerator, uid, topic.cid), diff --git a/src/routes/admin.js b/src/routes/admin.js index 6ce4fb5f48..66391053a7 100644 --- a/src/routes/admin.js +++ b/src/routes/admin.js @@ -15,6 +15,7 @@ function apiRoutes(router, middleware, controllers) { router.post('/uploadfavicon', middlewares, controllers.admin.uploads.uploadFavicon); router.post('/uploadTouchIcon', middlewares, controllers.admin.uploads.uploadTouchIcon); router.post('/uploadlogo', middlewares, controllers.admin.uploads.uploadLogo); + router.post('/uploadOgImage', middlewares, controllers.admin.uploads.uploadOgImage); router.post('/upload/sound', middlewares, controllers.admin.uploads.uploadSound); router.post('/uploadDefaultAvatar', middlewares, controllers.admin.uploads.uploadDefaultAvatar); } diff --git a/src/routes/api.js b/src/routes/api.js index 4806663460..1a84f59c3a 100644 --- a/src/routes/api.js +++ b/src/routes/api.js @@ -24,6 +24,7 @@ module.exports = function(app, middleware, controllers) { router.get('/recent/posts/:term?', controllers.api.getRecentPosts); router.get('/unread/:filter?/total', middleware.authenticate, controllers.unread.unreadTotal); router.get('/topic/teaser/:topic_id', controllers.topics.teaser); + router.get('/topic/pagination/:topic_id', controllers.topics.pagination); var multipart = require('connect-multiparty'); var multipartMiddleware = multipart(); diff --git a/src/routes/index.js b/src/routes/index.js index 86198b56dd..626b480db1 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -144,14 +144,13 @@ module.exports = function(app, middleware, hotswapIds) { } app.use(middleware.privateUploads); - + app.use('/language/:code', middleware.processLanguages); app.use(relativePath, express.static(path.join(__dirname, '../../', 'public'), { maxAge: app.enabled('cache') ? 5184000000 : 0 })); - - handle404(app, middleware); - handleErrors(app, middleware); - + app.use('/vendor/jquery/timeago/locales', middleware.processTimeagoLocales); + app.use(controllers.handle404); + app.use(controllers.handleErrors); // Add plugin routes async.series([ @@ -159,72 +158,3 @@ module.exports = function(app, middleware, hotswapIds) { async.apply(authRoutes.reloadRoutes) ]); }; - -function handle404(app, middleware) { - var relativePath = nconf.get('relative_path'); - var isLanguage = new RegExp('^' + relativePath + '/language/.*/.*.json'); - var isClientScript = new RegExp('^' + relativePath + '\\/src\\/.+\\.js'); - - app.use(function(req, res) { - if (plugins.hasListeners('action:meta.override404')) { - return plugins.fireHook('action:meta.override404', { - req: req, - res: res, - error: {} - }); - } - - if (isClientScript.test(req.url)) { - res.type('text/javascript').status(200).send(''); - } else if (isLanguage.test(req.url)) { - res.status(200).json({}); - } else if (req.path.startsWith(relativePath + '/uploads') || (req.get('accept') && req.get('accept').indexOf('text/html') === -1) || req.path === '/favicon.ico') { - res.sendStatus(404); - } else if (req.accepts('html')) { - if (process.env.NODE_ENV === 'development') { - winston.warn('Route requested but not found: ' + req.url); - } - - res.status(404); - - if (res.locals.isAPI) { - return res.json({path: validator.escape(req.path.replace(/^\/api/, '') || ''), title: '[[global:404.title]]'}); - } - - middleware.buildHeader(req, res, function() { - res.render('404', {path: validator.escape(req.path || ''), title: '[[global:404.title]]'}); - }); - } else { - res.status(404).type('txt').send('Not found'); - } - }); -} - -function handleErrors(app, middleware) { - app.use(function(err, req, res, next) { - switch (err.code) { - case 'EBADCSRFTOKEN': - winston.error(req.path + '\n', err.message); - return res.sendStatus(403); - case 'blacklisted-ip': - return res.status(403).type('text/plain').send(err.message); - } - - if (parseInt(err.status, 10) === 302 && err.path) { - return res.locals.isAPI ? res.status(302).json(err.path) : res.redirect(err.path); - } - - winston.error(req.path + '\n', err.stack); - - res.status(err.status || 500); - - if (res.locals.isAPI) { - res.json({path: validator.escape(req.path || ''), error: err.message}); - } else { - middleware.buildHeader(req, res, function() { - res.render('500', {path: validator.escape(String(req.path || '')), error: validator.escape(err.message)}); - }); - } - }); -} - diff --git a/src/sitemap.js b/src/sitemap.js index 00bb195809..812ba9fe53 100644 --- a/src/sitemap.js +++ b/src/sitemap.js @@ -45,28 +45,11 @@ sitemap.render = function(callback) { }); }; -sitemap.getStaticUrls = function(callback) { - callback(null, [{ - url: '', - changefreq: 'weekly', - priority: '0.6' - }, { - url: '/recent', - changefreq: 'daily', - priority: '0.4' - }, { - url: '/users', - changefreq: 'daily', - priority: '0.4' - }, { - url: '/groups', - changefreq: 'daily', - priority: '0.4' - }]); -}; - sitemap.getPages = function(callback) { - if (sitemap.maps.pages && sitemap.maps.pages.cache.length) { + if ( + sitemap.maps.pages && + Date.now() < parseInt(sitemap.maps.pages.cacheSetTimestamp, 10) + parseInt(sitemap.maps.pages.cacheResetPeriod, 10) + ) { return sitemap.maps.pages.toXML(callback); } @@ -98,7 +81,10 @@ sitemap.getPages = function(callback) { }; sitemap.getCategories = function(callback) { - if (sitemap.maps.categories && sitemap.maps.categories.cache.length) { + if ( + sitemap.maps.categories && + Date.now() < parseInt(sitemap.maps.categories.cacheSetTimestamp, 10) + parseInt(sitemap.maps.categories.cacheResetPeriod, 10) + ) { return sitemap.maps.categories.toXML(callback); } @@ -137,7 +123,10 @@ sitemap.getTopicPage = function(page, callback) { var min = (parseInt(page, 10) - 1) * numTopics; var max = min + numTopics; - if (sitemap.maps.topics[page-1] && sitemap.maps.topics[page-1].cache.length) { + if ( + sitemap.maps.topics[page-1] && + Date.now() < parseInt(sitemap.maps.topics[page-1].cacheSetTimestamp, 10) + parseInt(sitemap.maps.topics[page-1].cacheResetPeriod, 10) + ) { return sitemap.maps.topics[page-1].toXML(callback); } diff --git a/src/socket.io/topics.js b/src/socket.io/topics.js index 6f5ab296d9..18cad2d980 100644 --- a/src/socket.io/topics.js +++ b/src/socket.io/topics.js @@ -88,6 +88,12 @@ function followCommand(method, socket, tid, callback) { method(tid, socket.uid, callback); } +SocketTopics.isFollowed = function(socket, tid, callback) { + topics.isFollowing([tid], socket.uid, function(err, isFollowing) { + callback(err, Array.isArray(isFollowing) && isFollowing.length ? isFollowing[0] : false); + }); +}; + SocketTopics.search = function(socket, data, callback) { topics.search(data.tid, data.term, callback); }; diff --git a/src/socket.io/topics/infinitescroll.js b/src/socket.io/topics/infinitescroll.js index 5c45c6e4fb..5f089bd52e 100644 --- a/src/socket.io/topics/infinitescroll.js +++ b/src/socket.io/topics/infinitescroll.js @@ -96,10 +96,10 @@ module.exports = function(SocketTopics) { return callback(new Error('[[error:invalid-data]]')); } - var start = parseInt(data.after, 10), - stop = start + 9; + var start = parseInt(data.after, 10); + var stop = start + 9; - topics.getUnreadTopics(data.cid, socket.uid, start, stop, callback); + topics.getUnreadTopics(data.cid, socket.uid, start, stop, data.filter, callback); }; SocketTopics.loadMoreFromSet = function(socket, data, callback) { diff --git a/src/socket.io/topics/unread.js b/src/socket.io/topics/unread.js index 056b80b041..a5582d6892 100644 --- a/src/socket.io/topics/unread.js +++ b/src/socket.io/topics/unread.js @@ -46,7 +46,7 @@ module.exports = function(SocketTopics) { }; SocketTopics.markCategoryTopicsRead = function(socket, cid, callback) { - topics.getUnreadTids(cid, socket.uid, 0, -1, function(err, tids) { + topics.getUnreadTids(cid, socket.uid, '', function(err, tids) { if (err) { return callback(err); } diff --git a/src/topics/create.js b/src/topics/create.js index dea303709c..01a8ea5f5f 100644 --- a/src/topics/create.js +++ b/src/topics/create.js @@ -274,7 +274,7 @@ module.exports = function(Topics) { posts.getUserInfoForPosts([postData.uid], uid, next); }, topicInfo: function(next) { - Topics.getTopicFields(tid, ['tid', 'title', 'slug', 'cid', 'postcount'], next); + Topics.getTopicFields(tid, ['tid', 'title', 'slug', 'cid', 'postcount', 'mainPid'], next); }, parents: function(next) { Topics.addParentPosts([postData], next); diff --git a/src/topics/follow.js b/src/topics/follow.js index 90708ba50a..209151d8e5 100644 --- a/src/topics/follow.js +++ b/src/topics/follow.js @@ -171,7 +171,7 @@ module.exports = function(Topics) { pid: postData.pid, subject: '[' + (meta.config.title || 'NodeBB') + '] ' + title, intro: '[[notifications:user_posted_to, ' + postData.user.username + ', ' + titleEscaped + ']]', - postBody: postData.content.replace(/"\/\//g, '"http://'), + postBody: postData.content.replace(/"\/\//g, '"https://'), site_title: meta.config.title || 'NodeBB', username: data.userData.username, userslug: data.userData.userslug, diff --git a/src/topics/unread.js b/src/topics/unread.js index ac2e6d63a3..9dcfd8bdd9 100644 --- a/src/topics/unread.js +++ b/src/topics/unread.js @@ -19,17 +19,13 @@ module.exports = function(Topics) { callback = filter; filter = ''; } - - Topics.getUnreadTids(0, uid, 0, 99, filter, function(err, tids) { - callback(err, tids ? tids.length : 0); + Topics.getUnreadTids(0, uid, filter, function(err, tids) { + callback(err, Array.isArray(tids) ? tids.length : 0); }); }; + Topics.getUnreadTopics = function(cid, uid, start, stop, filter, callback) { - if (!callback) { - callback = filter; - filter = ''; - } var unreadTopics = { showSelect: true, @@ -39,12 +35,21 @@ module.exports = function(Topics) { async.waterfall([ function(next) { - Topics.getUnreadTids(cid, uid, start, stop, filter, next); + Topics.getUnreadTids(cid, uid, filter, next); }, function(tids, next) { + unreadTopics.topicCount = tids.length; + if (!tids.length) { return next(null, []); } + + if (stop === -1) { + tids = tids.slice(start); + } else { + tids = tids.slice(start, stop + 1); + } + Topics.getTopicsByTids(tids, uid, next); }, function(topicData, next) { @@ -63,12 +68,7 @@ module.exports = function(Topics) { return Date.now() - (parseInt(meta.config.unreadCutoff, 10) || 2) * 86400000; }; - Topics.getUnreadTids = function(cid, uid, start, stop, filter, callback) { - if (!callback) { - callback = filter; - filter = ''; - } - + Topics.getUnreadTids = function(cid, uid, filter, callback) { uid = parseInt(uid, 10); if (uid === 0) { return callback(null, []); @@ -136,19 +136,9 @@ module.exports = function(Topics) { }, function (tids, next) { - tids = tids.slice(0, 100); + tids = tids.slice(0, 200); filterTopics(uid, tids, cid, ignoredCids, next); - }, - function (tids, next) { - - if (stop === -1) { - tids = tids.slice(start); - } else { - tids = tids.slice(start, stop + 1); - } - - next(null, tids); } ], callback); }; diff --git a/src/user/delete.js b/src/user/delete.js index 011ed0aa12..99119c7ffb 100644 --- a/src/user/delete.js +++ b/src/user/delete.js @@ -30,7 +30,7 @@ module.exports = function(User) { function deletePosts(callerUid, uid, callback) { batch.processSortedSet('uid:' + uid + ':posts', function(ids, next) { - async.eachSeries(ids, function(pid, netx) { + async.eachSeries(ids, function(pid, next) { posts.purge(pid, callerUid, next); }, next); }, {alwaysStartAt: 0}, callback); diff --git a/src/views/admin/settings/general.tpl b/src/views/admin/settings/general.tpl index fa41b38f61..79cba3caf7 100644 --- a/src/views/admin/settings/general.tpl +++ b/src/views/admin/settings/general.tpl @@ -50,6 +50,7 @@ +
@@ -61,6 +62,17 @@
+ +
+ +
+ + + + + +
+
diff --git a/src/webserver.js b/src/webserver.js index 28b0197dec..48d8167d3b 100644 --- a/src/webserver.js +++ b/src/webserver.js @@ -12,6 +12,7 @@ var path = require('path'), emailer = require('./emailer'), meta = require('./meta'), + languages = require('./languages'), logger = require('./logger'), plugins = require('./plugins'), middleware = require('./middleware'), @@ -45,7 +46,7 @@ server.on('error', function(err) { module.exports.listen = function() { emailer.registerApp(app); - middleware = middleware(app); + app.locals.middleware = middleware = middleware(app); helpers.register(); @@ -92,6 +93,7 @@ function initializeNodeBB(callback) { async.apply(!skipJS ? meta.js.minify : meta.js.getFromFile, 'acp.min.js'), async.apply(meta.css.minify), async.apply(meta.sounds.init), + async.apply(languages.init), async.apply(meta.blacklist.load) ], next); },