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 @@
+