Merge branch 'master' of github.com:NodeBB/NodeBB

v1.18.x
Julian Lam
commit 7563873bd4

@ -22,7 +22,6 @@
var nconf = require('nconf');
nconf.argv().env('__');
require('continuation-local-storage');
var url = require('url'),
async = require('async'),
@ -52,7 +51,7 @@ if (nconf.get('config')) {
configFile = path.resolve(__dirname, nconf.get('config'));
}
var configExists = file.existsSync(configFile);
var configExists = file.existsSync(configFile) || (nconf.get('url') && nconf.get('secret') && nconf.get('database'));
loadConfig();
@ -184,6 +183,7 @@ function start() {
if (nconf.get('dep-check') === undefined || nconf.get('dep-check') !== false) {
require('./src/meta').dependencies.check(next);
} else {
winston.warn('[init] Dependency checking skipped!');
setImmediate(next);
}
},

@ -26,7 +26,6 @@
"connect-mongo": "~1.1.0",
"connect-multiparty": "^2.0.0",
"connect-redis": "~3.0.2",
"continuation-local-storage": "^3.1.6",
"cookie-parser": "^1.3.3",
"cron": "^1.0.5",
"csurf": "^1.6.1",
@ -48,18 +47,18 @@
"morgan": "^1.3.2",
"mousetrap": "^1.5.3",
"nconf": "~0.8.2",
"nodebb-plugin-composer-default": "4.0.4",
"nodebb-plugin-composer-default": "4.0.5",
"nodebb-plugin-dbsearch": "1.0.2",
"nodebb-plugin-emoji-extended": "1.1.0",
"nodebb-plugin-emoji-one": "1.1.5",
"nodebb-plugin-markdown": "6.0.0",
"nodebb-plugin-mentions": "1.1.2",
"nodebb-plugin-soundpack-default": "0.1.6",
"nodebb-plugin-spam-be-gone": "0.4.6",
"nodebb-plugin-spam-be-gone": "0.4.9",
"nodebb-rewards-essentials": "0.0.8",
"nodebb-theme-lavender": "3.0.13",
"nodebb-theme-persona": "4.1.3",
"nodebb-theme-vanilla": "5.1.0",
"nodebb-theme-persona": "4.1.5",
"nodebb-theme-vanilla": "5.1.2",
"nodebb-widget-essentials": "2.0.9",
"nodemailer": "2.0.0",
"nodemailer-sendmail-transport": "1.0.0",

@ -30,6 +30,7 @@
"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.",
"ban-expiry-missing": "Please provide an end date for this ban",
"no-category": "قائمة غير موجودة",
"no-topic": "موضوع غير موجود",
"no-post": "رد غير موجود",
@ -46,6 +47,13 @@
"post-edit-duration-expired-hours-minutes": "You are only allowed to edit posts for %1 hour(s) %2 minute(s) after posting",
"post-edit-duration-expired-days": "You are only allowed to edit posts for %1 day(s) after posting",
"post-edit-duration-expired-days-hours": "You are only allowed to edit posts for %1 day(s) %2 hour(s) after posting",
"post-delete-duration-expired": "You are only allowed to delete posts for %1 second(s) after posting",
"post-delete-duration-expired-minutes": "You are only allowed to delete posts for %1 minute(s) after posting",
"post-delete-duration-expired-minutes-seconds": "You are only allowed to delete posts for %1 minute(s) %2 second(s) after posting",
"post-delete-duration-expired-hours": "You are only allowed to delete posts for %1 hour(s) after posting",
"post-delete-duration-expired-hours-minutes": "You are only allowed to delete posts for %1 hour(s) %2 minute(s) after posting",
"post-delete-duration-expired-days": "You are only allowed to delete posts for %1 day(s) after posting",
"post-delete-duration-expired-days-hours": "You are only allowed to delete posts for %1 day(s) %2 hour(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).",
@ -68,6 +76,7 @@
"invalid-image-extension": "Invalid image extension",
"invalid-file-type": "Invalid file type. Allowed types are: %1",
"group-name-too-short": "اسم المجموعة قصير",
"group-name-too-long": "Group name too long",
"group-already-exists": "المجموعة موجودة مسبقا",
"group-name-change-not-allowed": "لايسمح بتغيير أسماء المجموعات",
"group-already-member": "Already part of this group",

@ -30,6 +30,7 @@
"user-banned": "Потребителят е блокиран",
"user-too-new": "Съжаляваме, но трябва да изчакате поне %1 секунда/и, преди да направите първата си публикация",
"blacklisted-ip": "Съжаляваме, но Вашият IP адрес е забранен за ползване в тази общност. Ако смятате, че това е грешка, моля, свържете се с администратор.",
"ban-expiry-missing": "Моля, задайте крайна дата за това блокиране",
"no-category": "Категорията не съществува",
"no-topic": "Темата не съществува",
"no-post": "Публикацията не съществува",
@ -46,6 +47,13 @@
"post-edit-duration-expired-hours-minutes": "Можете да редактирате публикациите си до %1 час(а) и %2 минута/и, след като ги пуснете",
"post-edit-duration-expired-days": "Можете да редактирате публикациите си до %1 ден(а), след като ги пуснете",
"post-edit-duration-expired-days-hours": "Можете да редактирате публикациите си до %1 ден(а) и %2 час(а), след като ги пуснете",
"post-delete-duration-expired": "Можете да изтривате публикациите си до %1 секунда/и, след като ги пуснете",
"post-delete-duration-expired-minutes": "Можете да изтривате публикациите си до %1 минута/и, след като ги пуснете",
"post-delete-duration-expired-minutes-seconds": "Можете да изтривате публикациите си до %1 минута/и и %2 секунда/и, след като ги пуснете",
"post-delete-duration-expired-hours": "Можете да изтривате публикациите си до %1 час(а), след като ги пуснете",
"post-delete-duration-expired-hours-minutes": "Можете да изтривате публикациите си до %1 час(а) и %2 минута/и, след като ги пуснете",
"post-delete-duration-expired-days": "Можете да изтривате публикациите си до %1 ден(а), след като ги пуснете",
"post-delete-duration-expired-days-hours": "Можете да изтривате публикациите си до %1 ден(а) и %2 час(а), след като ги пуснете",
"content-too-short": "Моля, въведете по-дълъг текст на публикацията. Публикациите трябва да съдържат поне %1 символ(а).",
"content-too-long": "Моля, въведете по-кратък текст на публикацията. Публикациите трябва да съдържат не повече от %1 символ(а).",
"title-too-short": "Моля, въведете по-дълго заглавие. Заглавията трябва да съдържат поне %1 символ(а).",
@ -68,6 +76,7 @@
"invalid-image-extension": "Грешно разширение на изображението",
"invalid-file-type": "Грешен тип на файл. Позволените типове са: %1",
"group-name-too-short": "Името на групата е твърде кратко",
"group-name-too-long": "Името на групата е твърде дълго",
"group-already-exists": "Вече съществува такава група",
"group-name-change-not-allowed": "Промяната на името на групата не е разрешено",
"group-already-member": "Потребителят вече членува в тази група",

@ -30,6 +30,7 @@
"user-banned": "ব্যবহারকারী নিষিদ্ধ",
"user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post",
"blacklisted-ip": "Sorry, your IP address has been banned from this community. If you feel this is in error, please contact an administrator.",
"ban-expiry-missing": "Please provide an end date for this ban",
"no-category": "বিভাগটি খুজে পাওয়া যায় নি",
"no-topic": "এই টপিক নেই",
"no-post": "এই পোষ্ট নেই",
@ -46,6 +47,13 @@
"post-edit-duration-expired-hours-minutes": "You are only allowed to edit posts for %1 hour(s) %2 minute(s) after posting",
"post-edit-duration-expired-days": "You are only allowed to edit posts for %1 day(s) after posting",
"post-edit-duration-expired-days-hours": "You are only allowed to edit posts for %1 day(s) %2 hour(s) after posting",
"post-delete-duration-expired": "You are only allowed to delete posts for %1 second(s) after posting",
"post-delete-duration-expired-minutes": "You are only allowed to delete posts for %1 minute(s) after posting",
"post-delete-duration-expired-minutes-seconds": "You are only allowed to delete posts for %1 minute(s) %2 second(s) after posting",
"post-delete-duration-expired-hours": "You are only allowed to delete posts for %1 hour(s) after posting",
"post-delete-duration-expired-hours-minutes": "You are only allowed to delete posts for %1 hour(s) %2 minute(s) after posting",
"post-delete-duration-expired-days": "You are only allowed to delete posts for %1 day(s) after posting",
"post-delete-duration-expired-days-hours": "You are only allowed to delete posts for %1 day(s) %2 hour(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).",
@ -68,6 +76,7 @@
"invalid-image-extension": "Invalid image extension",
"invalid-file-type": "Invalid file type. Allowed types are: %1",
"group-name-too-short": "গ্রুপের নাম খুব ছোট",
"group-name-too-long": "Group name too long",
"group-already-exists": "গ্রুপ ইতিমধ্যেই বিদ্যমান",
"group-name-change-not-allowed": "গ্রুপের নাম পরিবর্তনের অনুমতি নেই",
"group-already-member": "Already part of this group",

@ -4,7 +4,7 @@
"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.text1": "Děkujeme vám za registraci na %1!",
"welcome.text2": "Pro úplnou aktivaci vašeho účtu potřebujeme ověřit vaší emailovou adresu.",
"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",

@ -30,6 +30,7 @@
"user-banned": "Uživatel byl zakázán",
"user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post",
"blacklisted-ip": "Sorry, your IP address has been banned from this community. If you feel this is in error, please contact an administrator.",
"ban-expiry-missing": "Please provide an end date for this ban",
"no-category": "Kategorie neexistuje",
"no-topic": "Téma neexistuje",
"no-post": "Příspěvek neexistuje",
@ -46,6 +47,13 @@
"post-edit-duration-expired-hours-minutes": "You are only allowed to edit posts for %1 hour(s) %2 minute(s) after posting",
"post-edit-duration-expired-days": "You are only allowed to edit posts for %1 day(s) after posting",
"post-edit-duration-expired-days-hours": "You are only allowed to edit posts for %1 day(s) %2 hour(s) after posting",
"post-delete-duration-expired": "You are only allowed to delete posts for %1 second(s) after posting",
"post-delete-duration-expired-minutes": "You are only allowed to delete posts for %1 minute(s) after posting",
"post-delete-duration-expired-minutes-seconds": "You are only allowed to delete posts for %1 minute(s) %2 second(s) after posting",
"post-delete-duration-expired-hours": "You are only allowed to delete posts for %1 hour(s) after posting",
"post-delete-duration-expired-hours-minutes": "You are only allowed to delete posts for %1 hour(s) %2 minute(s) after posting",
"post-delete-duration-expired-days": "You are only allowed to delete posts for %1 day(s) after posting",
"post-delete-duration-expired-days-hours": "You are only allowed to delete posts for %1 day(s) %2 hour(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).",
@ -68,6 +76,7 @@
"invalid-image-extension": "Invalid image extension",
"invalid-file-type": "Invalid file type. Allowed types are: %1",
"group-name-too-short": "Název skupiny je příliš krátký",
"group-name-too-long": "Group name too long",
"group-already-exists": "Skupina už exstuje",
"group-name-change-not-allowed": "Změna názvu skupiny není povolena",
"group-already-member": "Already part of this group",

@ -23,19 +23,19 @@
"pagination.enter_index": "Enter index",
"header.admin": "Administrace",
"header.categories": "Kategorie",
"header.recent": "Aktuality",
"header.recent": "Nejnovější",
"header.unread": "Nepřečtené",
"header.tags": "Tagy",
"header.popular": "Populární",
"header.users": "Uživatelé",
"header.groups": "Skupiny",
"header.chats": "Chats",
"header.chats": "Chaty",
"header.notifications": "Oznámení",
"header.search": "Hledat",
"header.profile": "Můj profil",
"header.navigation": "Navigace",
"notifications.loading": "Načítání upozornění",
"chats.loading": "Načítání grafů",
"chats.loading": "Načítání chatů",
"motd.welcome": "Vítejte na NodeBB, diskusní platforma buducnosti.",
"previouspage": "Předchozí stránka",
"nextpage": "Další stránka",

@ -1,6 +1,6 @@
{
"username-email": "Username / Email",
"username": "Username",
"username-email": "Uživatel / Email",
"username": "Uživatel",
"email": "Email",
"remember_me": "Zapamatovat si mě?",
"forgot_password": "Zapomněli jste heslo?",

@ -4,41 +4,41 @@
"chat.send": "Odeslat",
"chat.no_active": "Nemáte žádné aktivní konverzace.",
"chat.user_typing": "%1 píše ...",
"chat.user_has_messaged_you": "%1 has messaged you.",
"chat.see_all": "See all chats",
"chat.mark_all_read": "Mark all chats read",
"chat.no-messages": "Please select a recipient to view chat message history",
"chat.no-users-in-room": "No users in this room",
"chat.recent-chats": "Recent Chats",
"chat.user_has_messaged_you": "%1 Vám napsal.",
"chat.see_all": "Prohlédnout všechny chaty",
"chat.mark_all_read": "Označit vše jako přečtené",
"chat.no-messages": "Prosím vyberte příjemce k prohlédnutí historie zpráv.",
"chat.no-users-in-room": "Žádní uživatelé v místnosti.",
"chat.recent-chats": "Aktuální chaty",
"chat.contacts": "Kontakty",
"chat.message-history": "Historie zpráv",
"chat.pop-out": "Pop out chat",
"chat.pop-out": "Skrýt chat",
"chat.maximize": "Maximalizovat",
"chat.seven_days": "7 dní",
"chat.thirty_days": "30 dní",
"chat.three_months": "3 měsíce",
"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",
"composer.show_preview": "Show Preview",
"composer.hide_preview": "Hide Preview",
"composer.user_said_in": "%1 said in %2:",
"composer.user_said": "%1 said:",
"composer.discard": "Are you sure you wish to discard this post?",
"composer.submit_and_lock": "Submit and Lock",
"chat.roomname": "Místnost %1",
"chat.add-users-to-room": "Přidat uživatele do místnosti",
"composer.compose": "Napsat",
"composer.show_preview": "Ukázat náhled",
"composer.hide_preview": "Skrýt náhled",
"composer.user_said_in": "%1 řekl v %2:",
"composer.user_said": "%1 řekl:",
"composer.discard": "Jste si jisti, že chcete zrušit tento příspěvek?",
"composer.submit_and_lock": "Potvrdit a uzamknout",
"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.uploading": "Odesílám %1",
"composer.formatting.bold": "Tučné",
"composer.formatting.italic": "Kurzíva",
"composer.formatting.list": "Seznam",
"composer.formatting.strikethrough": "Přeškrtnutí",
"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.cancel": "Zrušit",
"bootbox.confirm": "Potvrdit",
"cover.dragging_title": "Cover Photo Positioning",
"cover.dragging_message": "Drag the cover photo to the desired position and click \"Save\"",

@ -1,16 +1,16 @@
{
"title": "Upozornění",
"no_notifs": "You have no new notifications",
"see_all": "See all notifications",
"mark_all_read": "Mark all notifications read",
"back_to_home": "Back to %1",
"no_notifs": "Nemáte žádná nová upozornění.",
"see_all": "Zobrazit všechna upozornění",
"mark_all_read": "Označit všechna upozornění jako přečtená",
"back_to_home": "Zpět na %1",
"outgoing_link": "Odkaz mimo fórum",
"outgoing_link_message": "You are now leaving %1",
"continue_to": "Continue to %1",
"return_to": "Return to %1",
"new_notification": "New Notification",
"you_have_unread_notifications": "You have unread notifications.",
"new_message_from": "New message from <strong>%1</strong>",
"outgoing_link_message": "Opouštíte %1",
"continue_to": "Pokračovat na %1",
"return_to": "Vrátit na %1",
"new_notification": "Nové upozornění",
"you_have_unread_notifications": "Máte nepřečtená upozornění.",
"new_message_from": "Nová zpráva od <strong>%1</strong>",
"upvoted_your_post_in": "<strong>%1</strong> has upvoted your post in <strong>%2</strong>.",
"upvoted_your_post_in_dual": "<strong>%1</strong> and <strong>%2</strong> have upvoted your post in <strong>%3</strong>.",
"upvoted_your_post_in_multiple": "<strong>%1</strong> and %2 others have upvoted your post in <strong>%3</strong>.",
@ -31,8 +31,8 @@
"user_started_following_you_multiple": "<strong>%1</strong> and %2 others started following you.",
"new_register": "<strong>%1</strong> sent a registration request.",
"new_register_multiple": "There are <strong>%1</strong> registration requests awaiting review.",
"email-confirmed": "Email Confirmed",
"email-confirmed-message": "Thank you for validating your email. Your account is now fully activated.",
"email-confirm-error-message": "There was a problem validating your email address. Perhaps the code was invalid or has expired.",
"email-confirm-sent": "Confirmation email sent."
"email-confirmed": "Email potvrzen",
"email-confirmed-message": "Děkujeme za ověření Vaší emailové adresy. Váš účet je nyní aktivován.",
"email-confirm-error-message": "Nastal problém s ověřením Vaší emailové adresy. Pravděpodobně neplatný nebo expirovaný kód.",
"email-confirm-sent": "Ověřovací email odeslán."
}

@ -1,19 +1,19 @@
{
"home": "Home",
"unread": "Unread Topics",
"home": "Domů",
"unread": "Nepřečtená témata",
"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",
"recent": "Aktuální témata",
"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/banned": "Zabanovaní uživatelé",
"users/search": "Hledání uživatele",
"notifications": "Notifications",
"notifications": "Oznámení",
"tags": "Tagy",
"tag": "Téma označeno pod \"%1\"",
"register": "Zaregistrovat účet",
@ -22,8 +22,8 @@
"categories": "Kategorie",
"groups": "Skupiny",
"group": "%1 skupina",
"chats": "Chats",
"chat": "Chatting with %1",
"chats": "Chaty",
"chat": "Chatovat s %1",
"account/edit": "Editing \"%1\"",
"account/edit/password": "Editing password of \"%1\"",
"account/edit/username": "Editing username of \"%1\"",

@ -11,7 +11,7 @@
"enter_email_address": "Zadejte emailovou adresu",
"password_reset_sent": "Obnova hesla odeslána",
"invalid_email": "Špatný email / Email neexistuje!",
"password_too_short": "The password entered is too short, please pick a different password.",
"passwords_do_not_match": "The two passwords you've entered do not match.",
"password_expired": "Your password has expired, please choose a new password"
"password_too_short": "Zadané heslo je příliš krátké, zvolte si prosím jiné.",
"passwords_do_not_match": "Vámi zadaná hesla se neshodují.",
"password_expired": "Platnost Vašeho hesla vypršela, zvolte si prosím nové."
}

@ -1,7 +1,7 @@
{
"no_tag_topics": "Není zde žádné téma s tímto tagem.",
"tags": "Tagy",
"enter_tags_here": "Enter tags here, between %1 and %2 characters each.",
"enter_tags_here": "Zde vložte tagy, každý o délce %1 až %2 znaků.",
"enter_tags_here_short": "Vložte tagy ...",
"no_tags": "Zatím tu není žádný tag."
}

@ -35,8 +35,8 @@
"ignoring_topic.message": "You will no longer see this topic in the unread topics list. You will be notified when you are mentioned or your post is up voted.",
"login_to_subscribe": "Please register or log in in order to subscribe to this topic.",
"markAsUnreadForAll.success": "Topic marked as unread for all.",
"mark_unread": "Mark unread",
"mark_unread.success": "Topic marked as unread.",
"mark_unread": "Označ za nepřečtené",
"mark_unread.success": "Téma označeno jako nepřečtené",
"watch": "Sledovat",
"unwatch": "Unwatch",
"watch.title": "Be notified of new replies in this topic",
@ -48,18 +48,18 @@
"watching.description": "Notify me of new replies.<br/>Show topic in unread.",
"not-watching.description": "Do not notify me of new replies.<br/>Show topic in unread if category is not ignored.",
"ignoring.description": "Do not notify me of new replies.<br/>Do not show topic in unread.",
"thread_tools.title": "Topic Tools",
"thread_tools.title": "Správa tématu",
"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.pin": "Připnout téma",
"thread_tools.unpin": "Odepnout téma",
"thread_tools.lock": "Zamknout téma",
"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.fork": "Větvit téma",
"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.delete_confirm": "Opravdu chcete smazat toto téma.",
"thread_tools.restore": "Obnovit téma",
"thread_tools.restore_confirm": "Are you sure you want to restore this topic?",
"thread_tools.purge": "Purge Topic",
@ -74,7 +74,7 @@
"confirm_fork": "Rozdělit",
"favourite": "Záložka",
"favourites": "Záložky",
"favourites.has_no_favourites": "You haven't bookmarked any posts yet.",
"favourites.has_no_favourites": "Zatím jste do záložek nepřidal žádné příspěvky.",
"loading_more_posts": "Načítání více příspěvků",
"move_topic": "Přesunout téma",
"move_topics": "Přesunout témata",
@ -88,16 +88,16 @@
"delete_posts_instruction": "Click the posts you want to delete/purge",
"composer.title_placeholder": "Zadejte název tématu...",
"composer.handle_placeholder": "Jméno",
"composer.discard": "Discard",
"composer.discard": "Zrušit",
"composer.submit": "Odeslat",
"composer.replying_to": "Replying to %1",
"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_label": "Vložit URL náhled tématu",
"composer.thumb_title": "Přidat k tématu náhled",
"composer.thumb_url_placeholder": "http://example.com/thumb.png",
"composer.thumb_file_label": "Nebo nahrajte soubor",
"composer.thumb_remove": "Clear fields",
"composer.thumb_remove": "Vymazat pole",
"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)",
@ -107,13 +107,13 @@
"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?",
"stale.create": "Create a new topic",
"stale.reply_anyway": "Reply to this topic anyway",
"most_posts": "Nejvíce příspěvků",
"stale.title": "Přesto vytvořit nové téma",
"stale.warning": "Reagujete na starší téma. Nechcete raději vytvořit téma nové a na původní v něm odkázat?",
"stale.create": "Vytvořit nové téma",
"stale.reply_anyway": "Přesto reagovat na toto téma",
"link_back": "Re: [%1](%2)",
"spam": "Spam",
"offensive": "Offensive",
"custom-flag-reason": "Enter a flagging reason"
"offensive": "Urážlivé",
"custom-flag-reason": "Vložte důvod oznámení"
}

@ -2,10 +2,10 @@
"title": "Nepřečtené",
"no_unread_topics": "Nejsou zde žádné nepřečtené témata.",
"load_more": "Načíst další",
"mark_as_read": "Označit jako přeštené",
"mark_as_read": "Označit jako přečtené",
"selected": "Vybrané",
"all": "Vše",
"all_categories": "All categories",
"all_categories": "Všechny kategorie",
"topics_marked_as_read.success": "Téma bylo označeno jako přečtené!",
"all-topics": "Všechna témata",
"new-topics": "Nová témata",

@ -30,7 +30,7 @@
"signature": "Podpis",
"birthday": "Datum narození",
"chat": "Chat",
"chat_with": "Chat with %1",
"chat_with": "Chatovat s %1",
"follow": "Sledovat",
"unfollow": "Nesledovat",
"more": "Více",
@ -64,7 +64,7 @@
"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",
"restrict_chats": "Povolit chatovací zprávy pouze od uživatelů, které sleduji.",
"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": "Vypnuto",

@ -5,7 +5,7 @@
"search": "Vyhledávat",
"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.",
"users-found-search-took": "Nalezeno %1 uživatel(ů) za %2 vteřiny.",
"filter-by": "Filtrovat dle",
"online-only": "Pouze online",
"invite": "Pozvat",

@ -30,6 +30,7 @@
"user-banned": "Bruger er bortvist",
"user-too-new": "Beklager, du er nødt til at vente %1 sekund(er) før du opretter dit indlæg",
"blacklisted-ip": "Sorry, your IP address has been banned from this community. If you feel this is in error, please contact an administrator.",
"ban-expiry-missing": "Please provide an end date for this ban",
"no-category": "Kategorien eksisterer ikke",
"no-topic": "Tråden eksisterer ikke",
"no-post": "Indlægget eksisterer ikke",
@ -46,6 +47,13 @@
"post-edit-duration-expired-hours-minutes": "You are only allowed to edit posts for %1 hour(s) %2 minute(s) after posting",
"post-edit-duration-expired-days": "You are only allowed to edit posts for %1 day(s) after posting",
"post-edit-duration-expired-days-hours": "You are only allowed to edit posts for %1 day(s) %2 hour(s) after posting",
"post-delete-duration-expired": "You are only allowed to delete posts for %1 second(s) after posting",
"post-delete-duration-expired-minutes": "You are only allowed to delete posts for %1 minute(s) after posting",
"post-delete-duration-expired-minutes-seconds": "You are only allowed to delete posts for %1 minute(s) %2 second(s) after posting",
"post-delete-duration-expired-hours": "You are only allowed to delete posts for %1 hour(s) after posting",
"post-delete-duration-expired-hours-minutes": "You are only allowed to delete posts for %1 hour(s) %2 minute(s) after posting",
"post-delete-duration-expired-days": "You are only allowed to delete posts for %1 day(s) after posting",
"post-delete-duration-expired-days-hours": "You are only allowed to delete posts for %1 day(s) %2 hour(s) after posting",
"content-too-short": "Venligst indtast et længere indlæg. Indlægget skal mindst indeholde %1 karakter(er).",
"content-too-long": "Venligt indtast et kortere indlæg. Indlæg kan ikke være længere end %1 karakter(er).",
"title-too-short": "Venligst indtast en længere titel. Titlen skal mindst indeholde %1 karakter(er).",
@ -68,6 +76,7 @@
"invalid-image-extension": "Forkert billede filnavnsendelse",
"invalid-file-type": "Invalid fil type. Tilladte typer er: %1",
"group-name-too-short": "Gruppe navn for kort",
"group-name-too-long": "Group name too long",
"group-already-exists": "Gruppen eksisterer allerede",
"group-name-change-not-allowed": "Ændring af gruppe navn er ikke tilladt",
"group-already-member": "Allerede medlem af denne gruppe",

@ -30,6 +30,7 @@
"user-banned": "Benutzer ist gesperrt",
"user-too-new": "Entschuldigung, du musst %1 Sekunde(n) warten, bevor du deinen ersten Beitrag schreiben kannst.",
"blacklisted-ip": "Deine IP-Adresse ist für diese Plattform gesperrt. Sollte dies ein Irrtum sein, dann kontaktiere bitte einen Administrator.",
"ban-expiry-missing": "Please provide an end date for this ban",
"no-category": "Die Kategorie existiert nicht",
"no-topic": "Das Thema existiert nicht",
"no-post": "Der Beitrag existiert nicht",
@ -46,6 +47,13 @@
"post-edit-duration-expired-hours-minutes": "Du darfst Beiträge lediglich innerhalb von %1 Stunde/n und %2 Minute/n nach dem Erstellen editieren",
"post-edit-duration-expired-days": "Du darfst Beiträge lediglich innerhalb von %1 Tag/en nach dem Erstellen editieren",
"post-edit-duration-expired-days-hours": "Du darfst Beiträge lediglich innerhalb von %1 Tag/en und %2 Stunde/n nach dem Erstellen editieren",
"post-delete-duration-expired": "You are only allowed to delete posts for %1 second(s) after posting",
"post-delete-duration-expired-minutes": "You are only allowed to delete posts for %1 minute(s) after posting",
"post-delete-duration-expired-minutes-seconds": "You are only allowed to delete posts for %1 minute(s) %2 second(s) after posting",
"post-delete-duration-expired-hours": "You are only allowed to delete posts for %1 hour(s) after posting",
"post-delete-duration-expired-hours-minutes": "You are only allowed to delete posts for %1 hour(s) %2 minute(s) after posting",
"post-delete-duration-expired-days": "You are only allowed to delete posts for %1 day(s) after posting",
"post-delete-duration-expired-days-hours": "You are only allowed to delete posts for %1 day(s) %2 hour(s) after posting",
"content-too-short": "Bitte schreibe einen längeren Beitrag. Beiträge sollten mindestens %1 Zeichen enthalten.",
"content-too-long": "Bitte schreibe einen kürzeren Beitrag. Beiträge können nicht länger als %1 Zeichen sein.",
"title-too-short": "Bitte gebe einen längeren Titel ein. Ein Titel muss mindestens %1 Zeichen enthalten.",
@ -68,6 +76,7 @@
"invalid-image-extension": "Ungültige Dateinamenerweiterung",
"invalid-file-type": "Ungültiger Dateityp. Erlaubte Typen sind: %1",
"group-name-too-short": "Gruppenname zu kurz",
"group-name-too-long": "Group name too long",
"group-already-exists": "Gruppe existiert bereits",
"group-name-change-not-allowed": "Du kannst den Namen der Gruppe nicht ändern",
"group-already-member": "Bereits Teil dieser Gruppe",

@ -30,6 +30,7 @@
"user-banned": "Ο Χρήστης είναι αποκλεισμένος/η",
"user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post",
"blacklisted-ip": "Sorry, your IP address has been banned from this community. If you feel this is in error, please contact an administrator.",
"ban-expiry-missing": "Please provide an end date for this ban",
"no-category": "Category does not exist",
"no-topic": "Topic does not exist",
"no-post": "Post does not exist",
@ -46,6 +47,13 @@
"post-edit-duration-expired-hours-minutes": "You are only allowed to edit posts for %1 hour(s) %2 minute(s) after posting",
"post-edit-duration-expired-days": "You are only allowed to edit posts for %1 day(s) after posting",
"post-edit-duration-expired-days-hours": "You are only allowed to edit posts for %1 day(s) %2 hour(s) after posting",
"post-delete-duration-expired": "You are only allowed to delete posts for %1 second(s) after posting",
"post-delete-duration-expired-minutes": "You are only allowed to delete posts for %1 minute(s) after posting",
"post-delete-duration-expired-minutes-seconds": "You are only allowed to delete posts for %1 minute(s) %2 second(s) after posting",
"post-delete-duration-expired-hours": "You are only allowed to delete posts for %1 hour(s) after posting",
"post-delete-duration-expired-hours-minutes": "You are only allowed to delete posts for %1 hour(s) %2 minute(s) after posting",
"post-delete-duration-expired-days": "You are only allowed to delete posts for %1 day(s) after posting",
"post-delete-duration-expired-days-hours": "You are only allowed to delete posts for %1 day(s) %2 hour(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).",
@ -68,6 +76,7 @@
"invalid-image-extension": "Invalid image extension",
"invalid-file-type": "Invalid file type. Allowed types are: %1",
"group-name-too-short": "Το όνομα της ομάδας είναι πολύ μικρό",
"group-name-too-long": "Group name too long",
"group-already-exists": "Το όνομα της ομάδας υπάρχει ήδη",
"group-name-change-not-allowed": "Αλλαγή του ονόματος της ομάδας δεν επιτρέπεται",
"group-already-member": "Already part of this group",

@ -30,6 +30,7 @@
"user-banned": "User banned",
"user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post",
"blacklisted-ip": "Sorry, your IP address has been banned from this community. If you feel this is in error, please contact an administrator.",
"ban-expiry-missing": "Please provide an end date for this ban",
"no-category": "Category does not exist",
"no-topic": "Topic does not exist",
"no-post": "Post does not exist",
@ -46,6 +47,13 @@
"post-edit-duration-expired-hours-minutes": "You are only allowed to edit posts for %1 hour(s) %2 minute(s) after posting",
"post-edit-duration-expired-days": "You are only allowed to edit posts for %1 day(s) after posting",
"post-edit-duration-expired-days-hours": "You are only allowed to edit posts for %1 day(s) %2 hour(s) after posting",
"post-delete-duration-expired": "You are only allowed to delete posts for %1 second(s) after posting",
"post-delete-duration-expired-minutes": "You are only allowed to delete posts for %1 minute(s) after posting",
"post-delete-duration-expired-minutes-seconds": "You are only allowed to delete posts for %1 minute(s) %2 second(s) after posting",
"post-delete-duration-expired-hours": "You are only allowed to delete posts for %1 hour(s) after posting",
"post-delete-duration-expired-hours-minutes": "You are only allowed to delete posts for %1 hour(s) %2 minute(s) after posting",
"post-delete-duration-expired-days": "You are only allowed to delete posts for %1 day(s) after posting",
"post-delete-duration-expired-days-hours": "You are only allowed to delete posts for %1 day(s) %2 hour(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).",
@ -68,6 +76,7 @@
"invalid-image-extension": "Invalid image extension",
"invalid-file-type": "Invalid file type. Allowed types are: %1",
"group-name-too-short": "Group name too short",
"group-name-too-long": "Group name too long",
"group-already-exists": "Group already exists",
"group-name-change-not-allowed": "Group name change not allowed",
"group-already-member": "Already part of this group",

@ -37,6 +37,7 @@
"user-banned": "User banned",
"user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post",
"blacklisted-ip": "Sorry, your IP address has been banned from this community. If you feel this is in error, please contact an administrator.",
"ban-expiry-missing": "Please provide an end date for this ban",
"no-category": "Category does not exist",
"no-topic": "Topic does not exist",
@ -57,6 +58,13 @@
"post-edit-duration-expired-days": "You are only allowed to edit posts for %1 day(s) after posting",
"post-edit-duration-expired-days-hours": "You are only allowed to edit posts for %1 day(s) %2 hour(s) after posting",
"post-delete-duration-expired": "You are only allowed to delete posts for %1 second(s) after posting",
"post-delete-duration-expired-minutes": "You are only allowed to delete posts for %1 minute(s) after posting",
"post-delete-duration-expired-minutes-seconds": "You are only allowed to delete posts for %1 minute(s) %2 second(s) after posting",
"post-delete-duration-expired-hours": "You are only allowed to delete posts for %1 hour(s) after posting",
"post-delete-duration-expired-hours-minutes": "You are only allowed to delete posts for %1 hour(s) %2 minute(s) after posting",
"post-delete-duration-expired-days": "You are only allowed to delete posts for %1 day(s) after posting",
"post-delete-duration-expired-days-hours": "You are only allowed to delete posts for %1 day(s) %2 hour(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).",
@ -139,5 +147,6 @@
"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": "You can't kick yourself from the group",
"no-users-selected": "No user(s) selected"
}

@ -13,6 +13,7 @@
"users/sort-posts": "Users with the most posts",
"users/sort-reputation": "Users with the most reputation",
"users/banned": "Banned Users",
"users/most-flags": "Most flagged users",
"users/search": "User Search",
"notifications": "Notifications",

@ -2,6 +2,7 @@
"latest_users": "Latest Users",
"top_posters": "Top Posters",
"most_reputation": "Most Reputation",
"most_flags": "Most Flags",
"search": "Search",
"enter_username": "Enter a username to search",
"load_more": "Load More",

@ -30,6 +30,7 @@
"user-banned": "User banned",
"user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post",
"blacklisted-ip": "Sorry, your IP address has been banned from this community. If you feel this is in error, please contact an administrator.",
"ban-expiry-missing": "Please provide an end date for this ban",
"no-category": "Category does not exist",
"no-topic": "Topic does not exist",
"no-post": "Post does not exist",
@ -46,6 +47,13 @@
"post-edit-duration-expired-hours-minutes": "You are only allowed to edit posts for %1 hour(s) %2 minute(s) after posting",
"post-edit-duration-expired-days": "You are only allowed to edit posts for %1 day(s) after posting",
"post-edit-duration-expired-days-hours": "You are only allowed to edit posts for %1 day(s) %2 hour(s) after posting",
"post-delete-duration-expired": "You are only allowed to delete posts for %1 second(s) after posting",
"post-delete-duration-expired-minutes": "You are only allowed to delete posts for %1 minute(s) after posting",
"post-delete-duration-expired-minutes-seconds": "You are only allowed to delete posts for %1 minute(s) %2 second(s) after posting",
"post-delete-duration-expired-hours": "You are only allowed to delete posts for %1 hour(s) after posting",
"post-delete-duration-expired-hours-minutes": "You are only allowed to delete posts for %1 hour(s) %2 minute(s) after posting",
"post-delete-duration-expired-days": "You are only allowed to delete posts for %1 day(s) after posting",
"post-delete-duration-expired-days-hours": "You are only allowed to delete posts for %1 day(s) %2 hour(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).",
@ -68,6 +76,7 @@
"invalid-image-extension": "Invalid image extension",
"invalid-file-type": "Invalid file type. Allowed types are: %1",
"group-name-too-short": "Group name too short",
"group-name-too-long": "Group name too long",
"group-already-exists": "Group already exists",
"group-name-change-not-allowed": "Group name change not allowed",
"group-already-member": "Already part of this group",

@ -30,6 +30,7 @@
"user-banned": "Usuario baneado",
"user-too-new": "Lo sentimos, es necesario que esperes %1 segundo(s) antes poder hacer tu primera publicación",
"blacklisted-ip": "Lo sentimos, tu dirección IP ha sido baneada de esta comunidad. Si crees que debe de haber un error, por favor contacte con un administrador.",
"ban-expiry-missing": "Please provide an end date for this ban",
"no-category": "La categoría no existe",
"no-topic": "El tema no existe",
"no-post": "La publicación no existe",
@ -46,6 +47,13 @@
"post-edit-duration-expired-hours-minutes": "You are only allowed to edit posts for %1 hour(s) %2 minute(s) after posting",
"post-edit-duration-expired-days": "You are only allowed to edit posts for %1 day(s) after posting",
"post-edit-duration-expired-days-hours": "You are only allowed to edit posts for %1 day(s) %2 hour(s) after posting",
"post-delete-duration-expired": "You are only allowed to delete posts for %1 second(s) after posting",
"post-delete-duration-expired-minutes": "You are only allowed to delete posts for %1 minute(s) after posting",
"post-delete-duration-expired-minutes-seconds": "You are only allowed to delete posts for %1 minute(s) %2 second(s) after posting",
"post-delete-duration-expired-hours": "You are only allowed to delete posts for %1 hour(s) after posting",
"post-delete-duration-expired-hours-minutes": "You are only allowed to delete posts for %1 hour(s) %2 minute(s) after posting",
"post-delete-duration-expired-days": "You are only allowed to delete posts for %1 day(s) after posting",
"post-delete-duration-expired-days-hours": "You are only allowed to delete posts for %1 day(s) %2 hour(s) after posting",
"content-too-short": "Por favor introduzca una publicación más larga. Las publicaciones deben contener al menos %1 caractere(s).",
"content-too-long": "Por favor introduzca un mensaje más corto. Los mensajes no pueden exceder los %1 caractere(s).",
"title-too-short": "Por favor introduzca un título más largo. Los títulos deben contener al menos %1 caractere(s).",
@ -68,6 +76,7 @@
"invalid-image-extension": "Extensión de imagen inválida",
"invalid-file-type": "Tipo de fichero inválido. Los tipos permitidos son: %1",
"group-name-too-short": "Nombre del grupo es demasiado corto.",
"group-name-too-long": "Group name too long",
"group-already-exists": "El grupo ya existe.",
"group-name-change-not-allowed": "El nombre del grupo deseado no está permitido.",
"group-already-member": "Ya eres miembro de este grupo",

@ -30,6 +30,7 @@
"user-banned": "Kasutaja bannitud",
"user-too-new": "Vabandust, te peate ootama %1 sekund(it) enne esimese postituse loomist.",
"blacklisted-ip": "Vabandust! Sinu IP-aadress on siin kogukonnas keelatud. Kui arvad, et see on eksitus, palun leia kontakti administraatoriga.",
"ban-expiry-missing": "Please provide an end date for this ban",
"no-category": "Kategooriat ei eksisteeri",
"no-topic": "Teemat ei eksisteeri",
"no-post": "Postitust ei eksisteeri",
@ -46,6 +47,13 @@
"post-edit-duration-expired-hours-minutes": "Teil on lubatud muuta oma postitusi vaid %1 tunni %2 minuti jooksul peale postitamist",
"post-edit-duration-expired-days": "Teil on lubatud muuta oma postitusi vaid %1 päeva jooksul peale postitamist",
"post-edit-duration-expired-days-hours": "Teil on lubatud muuta oma postitusi vaid %1 päeva %2 tunni jooksul peale postitamist",
"post-delete-duration-expired": "You are only allowed to delete posts for %1 second(s) after posting",
"post-delete-duration-expired-minutes": "You are only allowed to delete posts for %1 minute(s) after posting",
"post-delete-duration-expired-minutes-seconds": "You are only allowed to delete posts for %1 minute(s) %2 second(s) after posting",
"post-delete-duration-expired-hours": "You are only allowed to delete posts for %1 hour(s) after posting",
"post-delete-duration-expired-hours-minutes": "You are only allowed to delete posts for %1 hour(s) %2 minute(s) after posting",
"post-delete-duration-expired-days": "You are only allowed to delete posts for %1 day(s) after posting",
"post-delete-duration-expired-days-hours": "You are only allowed to delete posts for %1 day(s) %2 hour(s) after posting",
"content-too-short": "Palun tehke pikem postitus. Postituse pikkus peab olema vähemalt %1 tähemärk(i).",
"content-too-long": "Palun tehke lühem postitus. Postituse pikkus peab olema vähem kui %1 tähemärk(i).",
"title-too-short": "Palun sisesta pikem pealkiri. Pealkirjad ei saa olla lühemad kui %1 tähemärk(i).",
@ -68,6 +76,7 @@
"invalid-image-extension": "Vigane pildi formaat",
"invalid-file-type": "Vigane faili formaat. Lubatud formaadid on: %1",
"group-name-too-short": "Grupi nimi liiga lühike",
"group-name-too-long": "Group name too long",
"group-already-exists": "Grupp juba eksisteerib",
"group-name-change-not-allowed": "Grupi nimevahetus ei ole lubatud",
"group-already-member": "Oled juba selles grupis",

@ -24,7 +24,7 @@
"digest.day": "روز",
"digest.week": "هفته",
"digest.month": "ماه",
"digest.subject": "Digest for %1",
"digest.subject": "خلاصه برای %1",
"notif.chat.subject": "پیام چتی جدیدی از %1 دریافت شد",
"notif.chat.cta": "برای ادامه‌ی چت اینجا کلیک کنید",
"notif.chat.unsub.info": "این اطلاعیه ی چتیی که برای شما فرستاده شده به علت تنظیمات اشترک شماست.",

@ -30,6 +30,7 @@
"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.",
"ban-expiry-missing": "Please provide an end date for this ban",
"no-category": "دسته بندی وجود ندارد",
"no-topic": "موضوع وجود ندارد.",
"no-post": "پست وجود ندارد",
@ -46,6 +47,13 @@
"post-edit-duration-expired-hours-minutes": "You are only allowed to edit posts for %1 hour(s) %2 minute(s) after posting",
"post-edit-duration-expired-days": "You are only allowed to edit posts for %1 day(s) after posting",
"post-edit-duration-expired-days-hours": "You are only allowed to edit posts for %1 day(s) %2 hour(s) after posting",
"post-delete-duration-expired": "You are only allowed to delete posts for %1 second(s) after posting",
"post-delete-duration-expired-minutes": "You are only allowed to delete posts for %1 minute(s) after posting",
"post-delete-duration-expired-minutes-seconds": "You are only allowed to delete posts for %1 minute(s) %2 second(s) after posting",
"post-delete-duration-expired-hours": "You are only allowed to delete posts for %1 hour(s) after posting",
"post-delete-duration-expired-hours-minutes": "You are only allowed to delete posts for %1 hour(s) %2 minute(s) after posting",
"post-delete-duration-expired-days": "You are only allowed to delete posts for %1 day(s) after posting",
"post-delete-duration-expired-days-hours": "You are only allowed to delete posts for %1 day(s) %2 hour(s) after posting",
"content-too-short": "خواهشمندیم پست بلندتری بنویسید. پست‌ها دست‌کم باید %1 کاراکتر داشته باشند.",
"content-too-long": "لطفا طول مطلب را کوتاه تر کنید. طول پست نمیتواند بیشتر از %1 کاراکتر باشد.",
"title-too-short": "لطفا یک عنوان بلندتر وارد کنید. عنوان باید حداقل %1 کاراکتر داشته باشد.",
@ -58,9 +66,9 @@
"too-many-tags": "تعداد برچسب ها بیشتر از حد مجاز است. موضوع ها نمی توانند بیشتر از %1 برچسب داشته باشند",
"still-uploading": "خواهشمندیم تا پایان بارگذاری‌ها شکیبا باشید.",
"file-too-big": "حداکثر مجاز حجم فایل %1 کیلوبایت می باشد - لطفا فایلی با حجم کمتر بارگذاری کنید",
"guest-upload-disabled": "Guest uploading has been disabled",
"already-favourited": "You have already bookmarked this post",
"already-unfavourited": "You have already unbookmarked this post",
"guest-upload-disabled": "بارگذاری برای مهمانان غیر فعال شده است",
"already-favourited": "شما در حال حاضر این پست را به علاقمندی های خود اضافه کرده ایید",
"already-unfavourited": "شما در حال حاضر این پست را از لیست علاقمندی خود خارج کردید",
"cant-ban-other-admins": "شما نمی‌توانید دیگر مدیران را محروم کنید!",
"cant-remove-last-admin": "شما تنها مدیر می باشید . شما باید قبل از عزل خود از مدیریت یک کاربر دیگر را مدیر کنید",
"cant-delete-admin": "Remove administrator privileges from this account before attempting to delete it.",
@ -68,6 +76,7 @@
"invalid-image-extension": "پسوند عکس نامعتبر است",
"invalid-file-type": "نوع پرونده نامعتبر است. نوعهای قابل قبول اینها هستند: %1",
"group-name-too-short": "نام گروه خیلی کوتاه است.",
"group-name-too-long": "Group name too long",
"group-already-exists": "این گروه از پیش وجود دارد.",
"group-name-change-not-allowed": "تغیر نام گروه نیاز به دسترسی دارد.",
"group-already-member": "شما عضوی از این گروه می باشید",
@ -87,14 +96,14 @@
"about-me-too-long": "با عرض پوزش محتوای 'درباره ی من' نمی تواند طولانی تر از %1 کاراکتر باشد",
"cant-chat-with-yourself": "شما نمی‌توانید با خودتان چت کنید!",
"chat-restricted": "این کاربر پیام های چتی خود را محدود کرده است . آنها بایدشما را دنبال کنند تا اینکه شما بتوانید به آنها پیامی بفرستید",
"chat-disabled": "Chat system disabled",
"chat-disabled": "سیستم گفتمان غیرفعال شده است",
"too-many-messages": "شما پیامهای خیلی زیادی فرستاده اید، لطفا مدتی صبر نمایید",
"invalid-chat-message": "پیام نامعتبر",
"chat-message-too-long": "پیام طولانی تر از حد مجاز است",
"cant-edit-chat-message": "شما اجازه ی ویرایش این پیام را ندارید",
"cant-remove-last-user": "You can't remove the last user",
"cant-delete-chat-message": "You are not allowed to delete this message",
"already-voting-for-this-post": "You have already voted for this post.",
"cant-remove-last-user": "شما نمی توانید آخرین کاربر را حذف کنید",
"cant-delete-chat-message": "شما اجازه حذف این پیام را ندارید.",
"already-voting-for-this-post": "شما قبلا به این پست رای داده اید.",
"reputation-system-disabled": "سیستم اعتبار غیر فعال شده است",
"downvoting-disabled": "رأی منفی غیر فعال شده است",
"not-enough-reputation-to-downvote": "شما اعتبار کافی برای دادن رأی منفی به این پست را ندارید.",
@ -106,8 +115,8 @@
"wrong-login-type-email": "لطفا از ایمیل خود برای ورود استفاده کنید",
"wrong-login-type-username": "لطفا از نام کاربری خود برای ورود استفاده کنید",
"invite-maximum-met": "You have invited the maximum amount of people (%1 out of %2).",
"no-session-found": "No login session found!",
"not-in-room": "User not in room",
"no-session-found": "هیچ سشن ورودی یافت نشد!",
"not-in-room": "هیچ کاربری در این گفتگو نیست",
"no-users-in-room": "هیچ کاربری در این گفتگو نیست",
"cant-kick-self": "You can't kick yourself from the group"
"cant-kick-self": "شما نمی توانید خودتان را از گروه کیک کنید"
}

@ -49,9 +49,9 @@
"users": "کاربران",
"topics": "موضوع ها",
"posts": "دیدگاه‌ها",
"best": "Best",
"upvoted": "Upvoted",
"downvoted": "Downvoted",
"best": "بهترین",
"upvoted": "رای مثبت",
"downvoted": "رای منفی",
"views": "بازدیدها",
"reputation": "اعتبار",
"read_more": "بیشتر بخوانید",
@ -65,7 +65,7 @@
"posted_in_ago_by": "ارسال شده در %1 %2 توسط %3",
"user_posted_ago": "%1 در %2 ارسال کرده است",
"guest_posted_ago": "مهمان در %1 ارسال کرده است",
"last_edited_by": "last edited by %1",
"last_edited_by": "آخرین ویرایش توسط %1 انجام شده",
"norecentposts": "هیچ دیدگاه تازه‌ای نیست",
"norecenttopics": "هیچ جستار تازه‌ای نیست",
"recentposts": "دیدگاه‌های تازه",
@ -85,10 +85,10 @@
"unfollow": "دنبال نکن",
"delete_all": "حذف همه",
"map": "نقشه",
"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"
"sessions": "Session های ورود",
"ip_address": "آدرس آی پی",
"enter_page_number": "شماره صفحه را وارد کنید",
"upload_file": "بارگذاری فایل",
"upload": "بارگذاری",
"allowed-file-types": "فایل قابل قبول اینها هستند %1"
}

@ -41,7 +41,7 @@
"details.hidden": "پنهان",
"details.hidden_help": "اگر فعال باشد، این گروه در فهرست گروه‌ها پیدا نمی‌شود و کاربران باید دستی فراخوانده شوند",
"details.delete_group": "حذف گروه",
"details.private_system_help": "Private groups is disabled at system level, this option does not do anything",
"details.private_system_help": "گروه های خصوصی در این سطح سیستم غیر فعال هستند، این گزینه هیچ کاری انجام نمی دهد",
"event.updated": "جزییات گروه با موفقیت به روز شد",
"event.deleted": "گروه \"%1\" حدف شد",
"membership.accept-invitation": "دعوت را قبول میکنم",

@ -5,7 +5,7 @@
"remember_me": "مرا به یاد بسپار؟",
"forgot_password": "گذرواژه را فراموش کرده‌اید؟",
"alternative_logins": "روش‌های درون آمدن جایگزین",
"failed_login_attempt": "Login Unsuccessful",
"failed_login_attempt": "ورود ناموفق",
"login_successful": "شما با موفقیت به درون آمده‌اید!",
"dont_have_account": "حساب کاربری ندارید؟"
}

@ -6,7 +6,7 @@
"chat.user_typing": "%1 در حال نوشتن است...",
"chat.user_has_messaged_you": "%1 به شما پیام داده است.",
"chat.see_all": "دیدن همه ی چت ها",
"chat.mark_all_read": "Mark all chats read",
"chat.mark_all_read": "علامت گذاری شده به عنوان تمام چت ها را خوانده",
"chat.no-messages": "مشخص کنید تاریخچه چتهایتان با چه کاربری را می‌خواهید ببینید",
"chat.no-users-in-room": "هیچ کاربری در این گفتگو نیست",
"chat.recent-chats": "چتهای اخیر",
@ -18,8 +18,8 @@
"chat.thirty_days": "30 روز",
"chat.three_months": "3 ماه",
"chat.delete_message_confirm": "آیا مطمئن هستید که می خواهید این پیام را حذف کنید؟",
"chat.roomname": "Chat Room %1",
"chat.add-users-to-room": "Add users to room",
"chat.roomname": "اتاق گفتگو %1",
"chat.add-users-to-room": "اضافه کردن کاربر به این گفتگو",
"composer.compose": "ارسال",
"composer.show_preview": "نمایش پیش‌نمایش",
"composer.hide_preview": "مخفی کردن پیش‌نمایش",
@ -29,14 +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",
"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": "تایید",

@ -5,15 +5,15 @@
"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": "پیام تازه از <strong>%1</strong>",
"upvoted_your_post_in": "<strong>%1</strong> امتیاز مثبت به پست شما در <strong>%2</strong> داده",
"upvoted_your_post_in_dual": "<strong>%1</strong> and <strong>%2</strong> have upvoted your post in <strong>%3</strong>.",
"upvoted_your_post_in_multiple": "<strong>%1</strong> and %2 others have upvoted your post in <strong>%3</strong>.",
"upvoted_your_post_in_dual": "<strong>%1</strong> و <strong>%2</strong> رای مثبت به پست شما در\n <strong>%3</strong>.",
"upvoted_your_post_in_multiple": "<strong>%1</strong>و %2 دیگران به پست شما رای مثبت دادن در <strong>%3</strong>.",
"moved_your_post": "<strong>%1</strong> پست شما را به <strong>%2</strong> انتقال داده است",
"moved_your_topic": "<strong>%2</strong> <strong>%1</strong> را منتقل کرده است",
"favourited_your_post_in": "<strong>%1</strong> has bookmarked your post in <strong>%2</strong>.",

@ -6,12 +6,12 @@
"popular-month": "موضوعات پربازدید این ماه",
"popular-alltime": "پربازدیدترین موضوعات",
"recent": "جستارهای تازه",
"flagged-posts": "Flagged Posts",
"flagged-posts": "پست نشانه گذاری شده",
"users/online": "کاربران آنلاین",
"users/latest": "آخرین کاربران",
"users/sort-posts": "کاربران با بیش‌ترین پست",
"users/sort-reputation": "کاربران دارای بیشترین اعتبار",
"users/banned": "Banned Users",
"users/banned": "کاربران اخراج شده",
"users/search": "جستجوی کاربر",
"notifications": "آگاه‌سازی‌ها",
"tags": "برچسب‌ها",
@ -33,13 +33,13 @@
"account/posts": "پست‌های %1",
"account/topics": "موضوع های %1",
"account/groups": "گروه‌های %1",
"account/favourites": "%1's Bookmarked Posts",
"account/favourites": "%1 پست های به علاقمندی اضافه شدن",
"account/settings": "تنظیمات کاربر",
"account/watched": "موضوع های دیده شده توسط \"%1\"",
"account/upvoted": "Posts upvoted by %1",
"account/downvoted": "Posts downvoted by %1",
"account/best": "Best posts made by %1",
"confirm": "Email Confirmed",
"account/upvoted": "رای مثبت داده شده به پست ها توسط %1",
"account/downvoted": "رای منفی داده شده به پست ها توسط %1",
"account/best": "بهترین پست های ارسال شده توسط %1",
"confirm": "ایمیل تایید شد",
"maintenance.text": "%1 در حال حاضر تحت تعمیر و نگهدارییست. لطفا زمان دیگری مراجعه کنید.",
"maintenance.messageIntro": "علاوه بر این، مدیر این پیام را گذاشته است:",
"throttled.text": "%1 به دلیل بارگذاری بیش از حد ، قابل دسترس نمی باشد. لطفا در زمان دیگری دوباره امتحان کنید"

@ -13,7 +13,7 @@
"notify_me": "از پاسخ‌های تازه در موضوع آگاه شوید",
"quote": "نقل قول",
"reply": "پاسخ",
"reply-as-topic": "Reply as topic",
"reply-as-topic": "پاسخ به موضوع",
"guest-login-reply": "وارد شوید تا پست بفرستید",
"edit": "ویرایش",
"delete": "حذف",
@ -26,28 +26,28 @@
"tools": "ابزارها",
"flag": "پرچم",
"locked": "قفل شده است",
"bookmark_instructions": "Click here to return to the last read post in this thread.",
"bookmark_instructions": "برای بازگشت به آخرین پست در این موضوع اینجا را کلیک کنید.",
"flag_title": "پرچم‌گذاری این موضوع برای بررسی ناظران",
"flag_success": "این موضوع برای بررسی ناظران پرچم گذاشته شد.",
"deleted_message": "این موضوع پاک شده است. تنها کاربرانِ با حق مدیریت موضوع می‌توانند آن را ببینند.",
"following_topic.message": "از این پس اگر کسی در این موضوع پست بگذارد، شما آگاه خواهید شد.",
"not_following_topic.message": "شما دیگر اطلاعیه های این موضوع را دریافت نخواهید کرد.",
"ignoring_topic.message": "You will no longer see this topic in the unread topics list. You will be notified when you are mentioned or your post is up voted.",
"ignoring_topic.message": "شما دیگر نمی خواهید این تاپیک را در فهرست عنوان های خوانده نشده ببینید. به شما اطلاع داده خواهد شد زمانی که به پست شما کسی رای بدهد.",
"login_to_subscribe": "برای دنبال کردن این موضوع، لطفا ثبت نام کنید و یا با نام کاربری خود وارد شوید",
"markAsUnreadForAll.success": "موضوع برای همگان نخوانده در نظر گرفته شد.",
"mark_unread": "Mark unread",
"mark_unread.success": "Topic marked as unread.",
"mark_unread": "علامت بزن به عنوان خوانده نشده",
"mark_unread.success": "تاپیک را علامت بزن به عنوان خوانده نشده",
"watch": "پیگیری",
"unwatch": "عدم پیگیری",
"watch.title": "از پاسخ‌های تازه به این موضوع آگاه شوید.",
"unwatch.title": "توقف پیگیری این موضوع",
"share_this_post": "به اشتراک‌گذاری این موضوع",
"watching": "Watching",
"not-watching": "Not Watching",
"ignoring": "Ignoring",
"watching.description": "Notify me of new replies.<br/>Show topic in unread.",
"not-watching.description": "Do not notify me of new replies.<br/>Show topic in unread if category is not ignored.",
"ignoring.description": "Do not notify me of new replies.<br/>Do not show topic in unread.",
"watching": "درحال پیگیری",
"not-watching": "درحال پیگیری نیستید",
"ignoring": "نادیده گرفتن",
"watching.description": "به من اطلاع بده برای پاسخ های جدید.<br/>نشان بده تاپیک های خوانده نشده را.",
"not-watching.description": "به من پس از ارسال هر پاسخی جدیدی اطلاع نده.<br/>تاپیک به صورت خوانده نشده قرار بگیرد ولی نادیده گرفته نشود.",
"ignoring.description": "به من پس از ارسال هر پاسخی جدیدی اطلاع نده.<br/>دیگر تاپیک را به صورت خوانده نشده نشان نده.",
"thread_tools.title": "ابزارهای موضوع",
"thread_tools.markAsUnreadForAll": "نخوانده بگیر",
"thread_tools.pin": "سنجاق زدن موضوع",
@ -58,7 +58,7 @@
"thread_tools.move_all": "جابجایی همه",
"thread_tools.fork": "شاخه ساختن از موضوع",
"thread_tools.delete": "پاک کردن موضوع",
"thread_tools.delete-posts": "Delete Posts",
"thread_tools.delete-posts": "حذف پست ها",
"thread_tools.delete_confirm": "آیا مطمئنید می خواهید این موضوع را حذف کنید؟",
"thread_tools.restore": "برگرداندن موضوع",
"thread_tools.restore_confirm": "آیا مطمئنید که می خواهید این موضوع را بازگردانی کنید؟",
@ -72,9 +72,9 @@
"disabled_categories_note": "دسته‌های از کار افتاده به رنگ خاکستری در می‌آیند",
"confirm_move": "جابه‌جا کردن",
"confirm_fork": "شاخه ساختن",
"favourite": "Bookmark",
"favourites": "Bookmarks",
"favourites.has_no_favourites": "You haven't bookmarked any posts yet.",
"favourite": "علاقمندی",
"favourites": "علاقمندی ها",
"favourites.has_no_favourites": "شما هیچ پستی را به صورت علاقمندی ندارید.",
"loading_more_posts": "بارگذاری پست‌های بیش‌تر",
"move_topic": "جابه‌جایی موضوع",
"move_topics": "انتقال موضوع",
@ -85,7 +85,7 @@
"fork_topic_instruction": "پست‌هایی را که می‌خواهید به موضوع تازه ببرید، انتخاب کنید",
"fork_no_pids": "هیچ پستی انتخاب نشده!",
"fork_success": "موضوع با موفقیت منشعب شد! برای رفتن به موضوع انشعابی اینجا را کلیک کنید.",
"delete_posts_instruction": "Click the posts you want to delete/purge",
"delete_posts_instruction": "با کلیک بر روی پست شما می خواهید به حذف/پاکسازی",
"composer.title_placeholder": "عنوان موضوعتان را اینجا بنویسید...",
"composer.handle_placeholder": "نام",
"composer.discard": "دور بیانداز",
@ -112,7 +112,7 @@
"stale.warning": "موضوعی که شما در حال پاسخگویی به آن هستید قدیمی می باشد. آیا میلید به جای آن یک موضوع جدید ایجاد کنید و در آن به این موضوع ارجاع دهید؟",
"stale.create": "ایجاد یک موضوع جدید",
"stale.reply_anyway": "در هر صورت می خواهم به این موضوع پاسخ دهم",
"link_back": "Re: [%1](%2)",
"link_back": "پاسخ: [%1](%2)",
"spam": "اسپم",
"offensive": "توهین آمیز",
"custom-flag-reason": "وارد کردن دلیل پرچمگذاری"

@ -7,7 +7,7 @@
"all": "همه",
"all_categories": "تمام دسته ها",
"topics_marked_as_read.success": "همه موضوع ها خوانده شدند",
"all-topics": "All Topics",
"new-topics": "New Topics",
"watched-topics": "Watched Topics"
"all-topics": "همه موضوع ها",
"new-topics": "موضوع های جدید",
"watched-topics": "موضوع های پیگیری شده"
}

@ -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": "در حال بارگذاری فایل...",
"select-file-to-upload": "فایل مورد نظر را برای بارگذاری انتخاب کنید!",
"upload-success": "فایل با موفقیت بارگذاری شد!",
"maximum-file-size": "حداکثر %1 کیلوبایت"
}

@ -22,7 +22,7 @@
"profile": "پروفایل",
"profile_views": "بازدیدهای نمایه",
"reputation": "اعتبار",
"favourites": "Bookmarks",
"favourites": "علاقمندی ها",
"watched": "پیگیری شده",
"followers": "دنبال‌کننده‌ها",
"following": "دنبال‌شونده‌ها",
@ -39,7 +39,7 @@
"change_username": "تغییر نام کاربری",
"change_email": "تغییر ایمیل",
"edit": "ویرایش",
"edit-profile": "Edit Profile",
"edit-profile": "ویرایش پروفایل",
"default_picture": "آیکون پیش فرض",
"uploaded_picture": "تصویر بارشده",
"upload_new_picture": "بارگذاری تصویر تازه",
@ -56,11 +56,11 @@
"password": "گذرواژه",
"username_taken_workaround": "نام کاربری درخواستی شما در حال حاضر گرفته شده است، بنابراین ما آن را کمی تغییر داده‌ایم. شما هم‌اکنون با نام <strong>%1</strong شناخته می‌شوید.",
"password_same_as_username": "کلمه ی عبور شما با نام کاربری شما یکسان می باشند ، لطفا کلمه ی عبور دیگری را انتخاب کنید",
"password_same_as_email": "Your password is the same as your email, please select another password.",
"password_same_as_email": "کلمه ی عبور شما با ایمیل شما یکسان است، لطفا کلمه عبور دیگری را انتخاب کنید.",
"upload_picture": "بارگذاری تصویر",
"upload_a_picture": "یک تصویر بارگذاری کنید",
"remove_uploaded_picture": "پاک کردن عکس بارگذاری شده",
"upload_cover_picture": "Upload cover picture",
"upload_cover_picture": "بارگذاری عکس کاور",
"settings": "تنظیمات",
"show_email": "نمایش ایمیل‌ام",
"show_fullname": "نام کامل من را نشان بده",
@ -79,9 +79,9 @@
"has_no_posts": "این کاربر تا به حال هیچ چیزی ارسال نکرده است.",
"has_no_topics": "این کاربر تا به حال هیچ موضوعی ارسال نکرده است",
"has_no_watched_topics": "این کاربر تا به حال هیچ موضوعی را پیگیری نکرده است",
"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_upvoted_posts": "این کاربر به هیچ پستی امتیاز نداده است.",
"has_no_downvoted_posts": "این کاربر به هیچ پستی رای منفی نداده است.",
"has_no_voted_posts": "این کاربر به پست رای نداده است",
"email_hidden": "ایمیل پنهان شده",
"hidden": "پنهان",
"paginate_description": "صفحه بندی و نمایش موضوع ها و پست‌ها به جای نمایش بر اساس اسکرول موس",
@ -92,12 +92,12 @@
"open_links_in_new_tab": "پیوندهای به بیرون را در برگ جدید باز کن",
"enable_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",
"delay_image_loading": "تاخیر در حال بارگذاری عکس",
"image_load_delay_help": "اگر فعال باشد، تصاویر در تاپیک ها بارگذاری نمی شود تا زمانی که از طریق اسکرول روی آن بروید قابل مشاهده است",
"scroll_to_my_post": "پس از ارسال پست، اولین پست جدید نشان بده",
"follow_topics_you_reply_to": "تاپیک هایی که پاسخ داده ای را دنبال کن",
"follow_topics_you_create": "موضوع هایی که ایجاد کرده ای را دنبال کن",
"grouptitle": "Group Title",
"grouptitle": "عنوان گروه",
"no-group-title": "عنوان گروهی نیست",
"select-skin": "Select a Skin",
"select-homepage": "Select a Homepage",

@ -16,5 +16,5 @@
"unread_topics": "موضوع های خوانده نشده",
"categories": "دسته ها",
"tags": "برچسب‌ها",
"no-users-found": "No users found!"
"no-users-found": "کاربری پیدا نشد!"
}

@ -30,6 +30,7 @@
"user-banned": "Käyttäjä on estetty",
"user-too-new": "Anteeksi, mutta sinun täytyy odottaa %1 sekunti(a) ennen sinun ensimmäisen viestin lähettämistä",
"blacklisted-ip": "Sorry, your IP address has been banned from this community. If you feel this is in error, please contact an administrator.",
"ban-expiry-missing": "Please provide an end date for this ban",
"no-category": "Kategoriaa ei ole olemassa",
"no-topic": "Aihetta ei ole olemassa",
"no-post": "Viestiä ei ole olemassa",
@ -46,6 +47,13 @@
"post-edit-duration-expired-hours-minutes": "You are only allowed to edit posts for %1 hour(s) %2 minute(s) after posting",
"post-edit-duration-expired-days": "You are only allowed to edit posts for %1 day(s) after posting",
"post-edit-duration-expired-days-hours": "You are only allowed to edit posts for %1 day(s) %2 hour(s) after posting",
"post-delete-duration-expired": "You are only allowed to delete posts for %1 second(s) after posting",
"post-delete-duration-expired-minutes": "You are only allowed to delete posts for %1 minute(s) after posting",
"post-delete-duration-expired-minutes-seconds": "You are only allowed to delete posts for %1 minute(s) %2 second(s) after posting",
"post-delete-duration-expired-hours": "You are only allowed to delete posts for %1 hour(s) after posting",
"post-delete-duration-expired-hours-minutes": "You are only allowed to delete posts for %1 hour(s) %2 minute(s) after posting",
"post-delete-duration-expired-days": "You are only allowed to delete posts for %1 day(s) after posting",
"post-delete-duration-expired-days-hours": "You are only allowed to delete posts for %1 day(s) %2 hour(s) after posting",
"content-too-short": "Ole hyvä ja syötä pidempi viesti. Sen pitäisi sisältää ainakin %1 merkki(ä).",
"content-too-long": "Ole hyvä ja syötä lyhyempi viesti. Sen voi sisältää vain %1 merkki(ä).",
"title-too-short": "Ole hyä ja syötä pidempi otsikko. Sen pitäisi sisältää anakin %1 merkki(ä).",
@ -68,6 +76,7 @@
"invalid-image-extension": "Invalid image extension",
"invalid-file-type": "Invalid file type. Allowed types are: %1",
"group-name-too-short": "Ryhmän nimi on liian lyhyt",
"group-name-too-long": "Group name too long",
"group-already-exists": "Ryhmä on jo olemassa",
"group-name-change-not-allowed": "Et voi vaihtaa ryhmän nimeä",
"group-already-member": "Already part of this group",

@ -30,6 +30,7 @@
"user-banned": "Utilisateur banni",
"user-too-new": "Désolé, vous devez attendre encore %1 seconde(s) avant d'envoyer votre premier message",
"blacklisted-ip": "Désolé, votre adresse IP a été bannie de cette communauté. Si vous pensez que c'est une erreur, veuillez contacter un administrateur.",
"ban-expiry-missing": "Please provide an end date for this ban",
"no-category": "Cette catégorie n'existe pas",
"no-topic": "Ce sujet n'existe pas",
"no-post": "Ce message n'existe pas",
@ -46,6 +47,13 @@
"post-edit-duration-expired-hours-minutes": "Vous ne pouvez éditer un message que %1 heure(s) et %2 minute(s) après l'avoir posté.",
"post-edit-duration-expired-days": "Vous ne pouvez éditer un message que %1 jours(s) après l'avoir posté.",
"post-edit-duration-expired-days-hours": "Vous ne pouvez éditer un message que %1 jours(s) et %2 heures(s) après l'avoir posté.",
"post-delete-duration-expired": "You are only allowed to delete posts for %1 second(s) after posting",
"post-delete-duration-expired-minutes": "You are only allowed to delete posts for %1 minute(s) after posting",
"post-delete-duration-expired-minutes-seconds": "You are only allowed to delete posts for %1 minute(s) %2 second(s) after posting",
"post-delete-duration-expired-hours": "You are only allowed to delete posts for %1 hour(s) after posting",
"post-delete-duration-expired-hours-minutes": "You are only allowed to delete posts for %1 hour(s) %2 minute(s) after posting",
"post-delete-duration-expired-days": "You are only allowed to delete posts for %1 day(s) after posting",
"post-delete-duration-expired-days-hours": "You are only allowed to delete posts for %1 day(s) %2 hour(s) after posting",
"content-too-short": "Veuillez entrer un message plus long. %1 caractère(s) minimum.",
"content-too-long": "Veuillez poster un message plus cours. Les messages ne peuvent être plus long que %1 caractère(s).",
"title-too-short": "Veuillez entrer un titre plus long. %1 caractère(s) minimum.",
@ -68,6 +76,7 @@
"invalid-image-extension": "Extension d'image invalide",
"invalid-file-type": "Type de fichier non valide. Les types autorisés sont : %1",
"group-name-too-short": "Nom de groupe trop court",
"group-name-too-long": "Group name too long",
"group-already-exists": "Ce groupe existe déjà",
"group-name-change-not-allowed": "Modification du nom de groupe non permise",
"group-already-member": "Déjà membre du groupe",

@ -30,6 +30,7 @@
"user-banned": "Usuario expulsado",
"user-too-new": "Desculpa, agarda %1 second(s) antes de facer a túa primeira publicación.",
"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.",
"ban-expiry-missing": "Please provide an end date for this ban",
"no-category": "A categoría non existe",
"no-topic": "O tema non existe",
"no-post": "A publicación non existe",
@ -46,6 +47,13 @@
"post-edit-duration-expired-hours-minutes": "Só podes editar as publicacións %1 hora(s) %2 segundo(s) despois de envialas. ",
"post-edit-duration-expired-days": "Só podes editar as publicacións %1 día(s) despois de envialas. ",
"post-edit-duration-expired-days-hours": "Só podes editar as publicacións %1 día(s) %2 hora(s) despois de envialas. ",
"post-delete-duration-expired": "You are only allowed to delete posts for %1 second(s) after posting",
"post-delete-duration-expired-minutes": "You are only allowed to delete posts for %1 minute(s) after posting",
"post-delete-duration-expired-minutes-seconds": "You are only allowed to delete posts for %1 minute(s) %2 second(s) after posting",
"post-delete-duration-expired-hours": "You are only allowed to delete posts for %1 hour(s) after posting",
"post-delete-duration-expired-hours-minutes": "You are only allowed to delete posts for %1 hour(s) %2 minute(s) after posting",
"post-delete-duration-expired-days": "You are only allowed to delete posts for %1 day(s) after posting",
"post-delete-duration-expired-days-hours": "You are only allowed to delete posts for %1 day(s) %2 hour(s) after posting",
"content-too-short": "Por favor, introduce unha publicación máis longa. Debe conter %1 carácter(es) como mínimo.",
"content-too-long": "Por favor, introduce unha publicación máis curta. As publicacións non poden conter máis de %1 carácter(es).",
"title-too-short": "Por favor, introduce un título máis longo. Os títulos deben conter %1 carácter(es) como mínimo.",
@ -68,6 +76,7 @@
"invalid-image-extension": "Extensión de imaxe inválida",
"invalid-file-type": "Tipo de arquivo inválido. Tipos admitidos: %1",
"group-name-too-short": "Nome de grupo moi curto",
"group-name-too-long": "Group name too long",
"group-already-exists": "O grupo xa existe",
"group-name-change-not-allowed": "Cambio de nome do grupo non permitido",
"group-already-member": "Xa eres parte deste grupo",

@ -30,6 +30,7 @@
"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.",
"ban-expiry-missing": "Please provide an end date for this ban",
"no-category": "קטגוריה אינה קיימת",
"no-topic": "נושא אינו קיים",
"no-post": "פוסט אינו קיים",
@ -46,6 +47,13 @@
"post-edit-duration-expired-hours-minutes": "You are only allowed to edit posts for %1 hour(s) %2 minute(s) after posting",
"post-edit-duration-expired-days": "You are only allowed to edit posts for %1 day(s) after posting",
"post-edit-duration-expired-days-hours": "You are only allowed to edit posts for %1 day(s) %2 hour(s) after posting",
"post-delete-duration-expired": "You are only allowed to delete posts for %1 second(s) after posting",
"post-delete-duration-expired-minutes": "You are only allowed to delete posts for %1 minute(s) after posting",
"post-delete-duration-expired-minutes-seconds": "You are only allowed to delete posts for %1 minute(s) %2 second(s) after posting",
"post-delete-duration-expired-hours": "You are only allowed to delete posts for %1 hour(s) after posting",
"post-delete-duration-expired-hours-minutes": "You are only allowed to delete posts for %1 hour(s) %2 minute(s) after posting",
"post-delete-duration-expired-days": "You are only allowed to delete posts for %1 day(s) after posting",
"post-delete-duration-expired-days-hours": "You are only allowed to delete posts for %1 day(s) %2 hour(s) after posting",
"content-too-short": "אנא הכנס פוסט ארוך יותר. פוסטים חייבים להכיל לפחות %1 תווים.",
"content-too-long": "אנא הכנס פוסט קצר יותר. פוסטים חייבים להיות קצרים יותר מ-%1 תווים.",
"title-too-short": "אנא הכנס כותרת ארוכה יותר. כותרות חייבות להכיל לפחות %1 תווים.",
@ -68,6 +76,7 @@
"invalid-image-extension": "פורמט תמונה לא תקין",
"invalid-file-type": "פורמט הקובץ לא תקין. הפורמטים המורשים הם: %1",
"group-name-too-short": "שם הקבוצה קצר מדי",
"group-name-too-long": "Group name too long",
"group-already-exists": "הקבוצה כבר קיימת",
"group-name-change-not-allowed": "לא ניתן לשנות את שם הקבוצה",
"group-already-member": "כבר חבר בקבוצה זו",

@ -30,6 +30,7 @@
"user-banned": "Kitiltott felhasználó",
"user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post",
"blacklisted-ip": "Sorry, your IP address has been banned from this community. If you feel this is in error, please contact an administrator.",
"ban-expiry-missing": "Please provide an end date for this ban",
"no-category": "Nem létező kategória",
"no-topic": "Nem létező téma",
"no-post": "Nem létező hozzászólás",
@ -46,6 +47,13 @@
"post-edit-duration-expired-hours-minutes": "You are only allowed to edit posts for %1 hour(s) %2 minute(s) after posting",
"post-edit-duration-expired-days": "You are only allowed to edit posts for %1 day(s) after posting",
"post-edit-duration-expired-days-hours": "You are only allowed to edit posts for %1 day(s) %2 hour(s) after posting",
"post-delete-duration-expired": "You are only allowed to delete posts for %1 second(s) after posting",
"post-delete-duration-expired-minutes": "You are only allowed to delete posts for %1 minute(s) after posting",
"post-delete-duration-expired-minutes-seconds": "You are only allowed to delete posts for %1 minute(s) %2 second(s) after posting",
"post-delete-duration-expired-hours": "You are only allowed to delete posts for %1 hour(s) after posting",
"post-delete-duration-expired-hours-minutes": "You are only allowed to delete posts for %1 hour(s) %2 minute(s) after posting",
"post-delete-duration-expired-days": "You are only allowed to delete posts for %1 day(s) after posting",
"post-delete-duration-expired-days-hours": "You are only allowed to delete posts for %1 day(s) %2 hour(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).",
@ -68,6 +76,7 @@
"invalid-image-extension": "Érvénytelen a kép kiterjesztése",
"invalid-file-type": "Érvénytelen a fájl típusa. Engedélyezett kiterjesztések: %1",
"group-name-too-short": "A csoport név túl rövid",
"group-name-too-long": "Group name too long",
"group-already-exists": "A csoport nem létezik",
"group-name-change-not-allowed": "A csoport névváltoztatás nem engedélyezett",
"group-already-member": "Already part of this group",

@ -30,6 +30,7 @@
"user-banned": "Pengguna dibanned",
"user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post",
"blacklisted-ip": "Sorry, your IP address has been banned from this community. If you feel this is in error, please contact an administrator.",
"ban-expiry-missing": "Please provide an end date for this ban",
"no-category": "Kategori tidak ditemukan",
"no-topic": "Topik tidak ditemukan",
"no-post": "Post tidak ditemukan",
@ -46,6 +47,13 @@
"post-edit-duration-expired-hours-minutes": "You are only allowed to edit posts for %1 hour(s) %2 minute(s) after posting",
"post-edit-duration-expired-days": "You are only allowed to edit posts for %1 day(s) after posting",
"post-edit-duration-expired-days-hours": "You are only allowed to edit posts for %1 day(s) %2 hour(s) after posting",
"post-delete-duration-expired": "You are only allowed to delete posts for %1 second(s) after posting",
"post-delete-duration-expired-minutes": "You are only allowed to delete posts for %1 minute(s) after posting",
"post-delete-duration-expired-minutes-seconds": "You are only allowed to delete posts for %1 minute(s) %2 second(s) after posting",
"post-delete-duration-expired-hours": "You are only allowed to delete posts for %1 hour(s) after posting",
"post-delete-duration-expired-hours-minutes": "You are only allowed to delete posts for %1 hour(s) %2 minute(s) after posting",
"post-delete-duration-expired-days": "You are only allowed to delete posts for %1 day(s) after posting",
"post-delete-duration-expired-days-hours": "You are only allowed to delete posts for %1 day(s) %2 hour(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).",
@ -68,6 +76,7 @@
"invalid-image-extension": "Invalid image extension",
"invalid-file-type": "Invalid file type. Allowed types are: %1",
"group-name-too-short": "Nama grup terlalu pendek",
"group-name-too-long": "Group name too long",
"group-already-exists": "Grup sudah ada",
"group-name-change-not-allowed": "Perubahan nama grup tidak dibolehkan",
"group-already-member": "Already part of this group",

@ -30,6 +30,7 @@
"user-banned": "Utente bannato",
"user-too-new": "Devi attendere %1 secondi prima di creare il tuo primo post",
"blacklisted-ip": "Sorry, your IP address has been banned from this community. If you feel this is in error, please contact an administrator.",
"ban-expiry-missing": "Please provide an end date for this ban",
"no-category": "La Categoria non esiste",
"no-topic": "Il Topic non esiste",
"no-post": "Il Post non esiste",
@ -46,6 +47,13 @@
"post-edit-duration-expired-hours-minutes": "You are only allowed to edit posts for %1 hour(s) %2 minute(s) after posting",
"post-edit-duration-expired-days": "You are only allowed to edit posts for %1 day(s) after posting",
"post-edit-duration-expired-days-hours": "You are only allowed to edit posts for %1 day(s) %2 hour(s) after posting",
"post-delete-duration-expired": "You are only allowed to delete posts for %1 second(s) after posting",
"post-delete-duration-expired-minutes": "You are only allowed to delete posts for %1 minute(s) after posting",
"post-delete-duration-expired-minutes-seconds": "You are only allowed to delete posts for %1 minute(s) %2 second(s) after posting",
"post-delete-duration-expired-hours": "You are only allowed to delete posts for %1 hour(s) after posting",
"post-delete-duration-expired-hours-minutes": "You are only allowed to delete posts for %1 hour(s) %2 minute(s) after posting",
"post-delete-duration-expired-days": "You are only allowed to delete posts for %1 day(s) after posting",
"post-delete-duration-expired-days-hours": "You are only allowed to delete posts for %1 day(s) %2 hour(s) after posting",
"content-too-short": "Inserisci un testo più lungo. Il messaggio deve contenere almeno %1 caratteri.",
"content-too-long": "Inserisci un post più breve. I post non possono essere più lunghi di %1 caratteri.",
"title-too-short": "Inserisci un titolo più lungo. I titoli devono contenere almeno %1 caratteri.",
@ -68,6 +76,7 @@
"invalid-image-extension": "Estensione immagine non valida",
"invalid-file-type": "Tipo di file non valido. I formati consentiti sono: %1",
"group-name-too-short": "Nome del Gruppo troppo corto",
"group-name-too-long": "Group name too long",
"group-already-exists": "Il Gruppo esiste già",
"group-name-change-not-allowed": "Il cambio di nome al Gruppo non è consentito",
"group-already-member": "Already part of this group",

@ -30,6 +30,7 @@
"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.",
"ban-expiry-missing": "Please provide an end date for this ban",
"no-category": "カテゴリは存在しません",
"no-topic": "トピックは存在しません",
"no-post": "投稿は存在しません",
@ -46,6 +47,13 @@
"post-edit-duration-expired-hours-minutes": "You are only allowed to edit posts for %1 hour(s) %2 minute(s) after posting",
"post-edit-duration-expired-days": "You are only allowed to edit posts for %1 day(s) after posting",
"post-edit-duration-expired-days-hours": "You are only allowed to edit posts for %1 day(s) %2 hour(s) after posting",
"post-delete-duration-expired": "You are only allowed to delete posts for %1 second(s) after posting",
"post-delete-duration-expired-minutes": "You are only allowed to delete posts for %1 minute(s) after posting",
"post-delete-duration-expired-minutes-seconds": "You are only allowed to delete posts for %1 minute(s) %2 second(s) after posting",
"post-delete-duration-expired-hours": "You are only allowed to delete posts for %1 hour(s) after posting",
"post-delete-duration-expired-hours-minutes": "You are only allowed to delete posts for %1 hour(s) %2 minute(s) after posting",
"post-delete-duration-expired-days": "You are only allowed to delete posts for %1 day(s) after posting",
"post-delete-duration-expired-days-hours": "You are only allowed to delete posts for %1 day(s) %2 hour(s) after posting",
"content-too-short": "より長く投稿を書いて下さい。投稿にはせめて%1文字が必要です。",
"content-too-long": "より短く投稿を書いて下さい。投稿が%1文字以上が許されません。",
"title-too-short": "より長くタイトルを書いて下さい。タイトルはせめて%1文字が必要です。",
@ -68,6 +76,7 @@
"invalid-image-extension": "無効なイメージのエクステンション",
"invalid-file-type": "無効なファイルタイプです。許可された種類は: %1",
"group-name-too-short": "グループ名は短すぎます。",
"group-name-too-long": "Group name too long",
"group-already-exists": "グループ名はすでに存在しています",
"group-name-change-not-allowed": "グループ名の修正はできません",
"group-already-member": "既にこのグループの一部であります",

@ -30,6 +30,7 @@
"user-banned": "차단된 사용자입니다.",
"user-too-new": "죄송합니다, 첫 번째 게시물은 %1 초 후에 작성할 수 있습니다.",
"blacklisted-ip": "죄송하지만, 당신의 IP는 이 커뮤니티로부터 차단되었습니다. 만약 에러라는 생각이 드신다면 관리자에게 연락해주세요.",
"ban-expiry-missing": "Please provide an end date for this ban",
"no-category": "존재하지 않는 카테고리입니다.",
"no-topic": "존재하지 않는 주제입니다.",
"no-post": "존재하지 않는 게시물입니다.",
@ -46,6 +47,13 @@
"post-edit-duration-expired-hours-minutes": "You are only allowed to edit posts for %1 hour(s) %2 minute(s) after posting",
"post-edit-duration-expired-days": "You are only allowed to edit posts for %1 day(s) after posting",
"post-edit-duration-expired-days-hours": "You are only allowed to edit posts for %1 day(s) %2 hour(s) after posting",
"post-delete-duration-expired": "You are only allowed to delete posts for %1 second(s) after posting",
"post-delete-duration-expired-minutes": "You are only allowed to delete posts for %1 minute(s) after posting",
"post-delete-duration-expired-minutes-seconds": "You are only allowed to delete posts for %1 minute(s) %2 second(s) after posting",
"post-delete-duration-expired-hours": "You are only allowed to delete posts for %1 hour(s) after posting",
"post-delete-duration-expired-hours-minutes": "You are only allowed to delete posts for %1 hour(s) %2 minute(s) after posting",
"post-delete-duration-expired-days": "You are only allowed to delete posts for %1 day(s) after posting",
"post-delete-duration-expired-days-hours": "You are only allowed to delete posts for %1 day(s) %2 hour(s) after posting",
"content-too-short": "게시물의 내용이 너무 짧습니다. 내용은 최소 %1자 이상이어야 합니다.",
"content-too-long": "게시물의 내용이 너무 깁니다. 내용은 최대 %1자 이내로 작성할 수 있습니다.",
"title-too-short": "제목이 너무 짧습니다. 제목은 최소 %1자 이상이어야 합니다.",
@ -68,6 +76,7 @@
"invalid-image-extension": "올바르지 않은 이미지 확장자입니다.",
"invalid-file-type": "올바르지 않은 파일 유형입니다. 사용가능한 유형: %1",
"group-name-too-short": "그룹 이름이 너무 짧습니다.",
"group-name-too-long": "Group name too long",
"group-already-exists": "이미 존재하는 그룹입니다.",
"group-name-change-not-allowed": "그룹 이름의 변경은 불가합니다.",
"group-already-member": "이미 이 그룹에 속해있습니다.",

@ -30,6 +30,7 @@
"user-banned": "Vartotojas užblokuotas",
"user-too-new": "Atsiprašome, jūs įpareigoti palaukti %1 sekunde(s) prieš rašant pirmą pranešimą",
"blacklisted-ip": "Sorry, your IP address has been banned from this community. If you feel this is in error, please contact an administrator.",
"ban-expiry-missing": "Please provide an end date for this ban",
"no-category": "Tokios kategorijos nėra",
"no-topic": "Tokios temos nėra",
"no-post": "Tokio įrašo nėra",
@ -46,6 +47,13 @@
"post-edit-duration-expired-hours-minutes": "You are only allowed to edit posts for %1 hour(s) %2 minute(s) after posting",
"post-edit-duration-expired-days": "You are only allowed to edit posts for %1 day(s) after posting",
"post-edit-duration-expired-days-hours": "You are only allowed to edit posts for %1 day(s) %2 hour(s) after posting",
"post-delete-duration-expired": "You are only allowed to delete posts for %1 second(s) after posting",
"post-delete-duration-expired-minutes": "You are only allowed to delete posts for %1 minute(s) after posting",
"post-delete-duration-expired-minutes-seconds": "You are only allowed to delete posts for %1 minute(s) %2 second(s) after posting",
"post-delete-duration-expired-hours": "You are only allowed to delete posts for %1 hour(s) after posting",
"post-delete-duration-expired-hours-minutes": "You are only allowed to delete posts for %1 hour(s) %2 minute(s) after posting",
"post-delete-duration-expired-days": "You are only allowed to delete posts for %1 day(s) after posting",
"post-delete-duration-expired-days-hours": "You are only allowed to delete posts for %1 day(s) %2 hour(s) after posting",
"content-too-short": "Prašome parašyti ilgesni pranešimą. Pranešimas turi sudaryti mažiausiai %1 simboli(us)",
"content-too-long": "Prašome parašyti trumpesnį pranešimą. Pranešimas negali sudaryti daugiau %1 simboli(us)",
"title-too-short": "Prašome įvesti ilgesni pavadinimą. Pavadinimas turi sudaryti mažiausiai %1 simboli(us)",
@ -68,6 +76,7 @@
"invalid-image-extension": "Neteisingas vaizdo plėtinys",
"invalid-file-type": "Neteisingas failo tipas. Leidžiami tipai: %1",
"group-name-too-short": "Grupės pavadinimas per trumpas",
"group-name-too-long": "Group name too long",
"group-already-exists": "Tokia grupė jau egzistuoja",
"group-name-change-not-allowed": "Grupės pavadinimas keitimas neleidžiamas",
"group-already-member": "Already part of this group",

@ -30,6 +30,7 @@
"user-banned": "Pengguna diharamkan",
"user-too-new": "Maaf, anda dikehendaki menunggu %1 saat() sebelum membuat kiriman pertama anda",
"blacklisted-ip": "Sorry, your IP address has been banned from this community. If you feel this is in error, please contact an administrator.",
"ban-expiry-missing": "Please provide an end date for this ban",
"no-category": "Kategori tidak wujud",
"no-topic": "Topik tidak wujud",
"no-post": "Kiriman tidak wujud",
@ -46,6 +47,13 @@
"post-edit-duration-expired-hours-minutes": "You are only allowed to edit posts for %1 hour(s) %2 minute(s) after posting",
"post-edit-duration-expired-days": "You are only allowed to edit posts for %1 day(s) after posting",
"post-edit-duration-expired-days-hours": "You are only allowed to edit posts for %1 day(s) %2 hour(s) after posting",
"post-delete-duration-expired": "You are only allowed to delete posts for %1 second(s) after posting",
"post-delete-duration-expired-minutes": "You are only allowed to delete posts for %1 minute(s) after posting",
"post-delete-duration-expired-minutes-seconds": "You are only allowed to delete posts for %1 minute(s) %2 second(s) after posting",
"post-delete-duration-expired-hours": "You are only allowed to delete posts for %1 hour(s) after posting",
"post-delete-duration-expired-hours-minutes": "You are only allowed to delete posts for %1 hour(s) %2 minute(s) after posting",
"post-delete-duration-expired-days": "You are only allowed to delete posts for %1 day(s) after posting",
"post-delete-duration-expired-days-hours": "You are only allowed to delete posts for %1 day(s) %2 hour(s) after posting",
"content-too-short": "Sila masukkan kiriman yang lebih panjang. Kiriman mesti mengandungi sekurang-kurangnya %1 aksara().",
"content-too-long": "Sila masukkan kiriman yang lebih ringkas. Kiriman mesti mengandungi tidak lebih %1 aksara().",
"title-too-short": "Sila masukkan tajuk yang lebih panjang. Tajuk mesti mengandungi sekurang-kurangnya %1 aksara().",
@ -68,6 +76,7 @@
"invalid-image-extension": "Sambungan imej tak sah",
"invalid-file-type": "Jenis fail tak sah. Jenis fail yang dibenarkan ialah: %1",
"group-name-too-short": "Nama kumpulan terlalu pendek",
"group-name-too-long": "Group name too long",
"group-already-exists": "Kumpulan telah wujud",
"group-name-change-not-allowed": "Pengubahan nama kumpulan tidak dibenarkan",
"group-already-member": "Sudah pun sebahagian dari kumpulan ini",

@ -30,6 +30,7 @@
"user-banned": "Bruker utestengt",
"user-too-new": "Beklager, du må vente %1 sekund(er) før du oppretter ditt første innlegg",
"blacklisted-ip": "Sorry, your IP address has been banned from this community. If you feel this is in error, please contact an administrator.",
"ban-expiry-missing": "Please provide an end date for this ban",
"no-category": "Kategorien eksisterer ikke",
"no-topic": "Emne eksisterer ikke",
"no-post": "Innlegg eksisterer ikke",
@ -46,6 +47,13 @@
"post-edit-duration-expired-hours-minutes": "You are only allowed to edit posts for %1 hour(s) %2 minute(s) after posting",
"post-edit-duration-expired-days": "You are only allowed to edit posts for %1 day(s) after posting",
"post-edit-duration-expired-days-hours": "You are only allowed to edit posts for %1 day(s) %2 hour(s) after posting",
"post-delete-duration-expired": "You are only allowed to delete posts for %1 second(s) after posting",
"post-delete-duration-expired-minutes": "You are only allowed to delete posts for %1 minute(s) after posting",
"post-delete-duration-expired-minutes-seconds": "You are only allowed to delete posts for %1 minute(s) %2 second(s) after posting",
"post-delete-duration-expired-hours": "You are only allowed to delete posts for %1 hour(s) after posting",
"post-delete-duration-expired-hours-minutes": "You are only allowed to delete posts for %1 hour(s) %2 minute(s) after posting",
"post-delete-duration-expired-days": "You are only allowed to delete posts for %1 day(s) after posting",
"post-delete-duration-expired-days-hours": "You are only allowed to delete posts for %1 day(s) %2 hour(s) after posting",
"content-too-short": "Vennligst skriv et lengre innlegg. Innlegg må inneholde minst %1 tegn.",
"content-too-long": "Vennligst skriv et kortere innlegg. Innlegg kan ikke være lengre enn %1 tegn.",
"title-too-short": "Vennligst skriv en lengre tittel. Titler må inneholde minst %1 tegn.",
@ -68,6 +76,7 @@
"invalid-image-extension": "Ugyldig bildefiltype",
"invalid-file-type": "Ugyldig filtype. Tillatte typer er: %1",
"group-name-too-short": "Gruppenavnet er for kort",
"group-name-too-long": "Group name too long",
"group-already-exists": "Gruppe eksisterer allerede",
"group-name-change-not-allowed": "Endring av gruppenavn er ikke tillatt",
"group-already-member": "Already part of this group",

@ -30,6 +30,7 @@
"user-banned": "Gebruiker verbannen",
"user-too-new": "Helaas, het is een vereiste om %1 seconde(n) te wachten voordat het eerste bericht geplaatst kan worden.",
"blacklisted-ip": "Sorry, uw IP-adres is verbannen uit deze community. Als u meent dat dit onterecht is, neem dan contact op met een beheerder.",
"ban-expiry-missing": "Please provide an end date for this ban",
"no-category": "Categorie bestaat niet",
"no-topic": "Onderwerp bestaat niet",
"no-post": "Bericht bestaat niet",
@ -46,6 +47,13 @@
"post-edit-duration-expired-hours-minutes": "You are only allowed to edit posts for %1 hour(s) %2 minute(s) after posting",
"post-edit-duration-expired-days": "You are only allowed to edit posts for %1 day(s) after posting",
"post-edit-duration-expired-days-hours": "You are only allowed to edit posts for %1 day(s) %2 hour(s) after posting",
"post-delete-duration-expired": "You are only allowed to delete posts for %1 second(s) after posting",
"post-delete-duration-expired-minutes": "You are only allowed to delete posts for %1 minute(s) after posting",
"post-delete-duration-expired-minutes-seconds": "You are only allowed to delete posts for %1 minute(s) %2 second(s) after posting",
"post-delete-duration-expired-hours": "You are only allowed to delete posts for %1 hour(s) after posting",
"post-delete-duration-expired-hours-minutes": "You are only allowed to delete posts for %1 hour(s) %2 minute(s) after posting",
"post-delete-duration-expired-days": "You are only allowed to delete posts for %1 day(s) after posting",
"post-delete-duration-expired-days-hours": "You are only allowed to delete posts for %1 day(s) %2 hour(s) after posting",
"content-too-short": "Geef wat meer inhoud aan een bericht! Berichten dienen uit minimaal %1 teken(s) te bestaan.",
"content-too-long": "Kort het bericht wat in, het aantal gebruikte tekens overschrijdt het ingestelde limiet want berichten mogen niet meer dan %1 teken(s) bevatten.",
"title-too-short": "Geef een titel op die uit meer tekens bestaat. Titels dienen ten minste uit %1 teken(s) te bestaan.",
@ -68,6 +76,7 @@
"invalid-image-extension": "Ongeldig bestandstype afbeelding",
"invalid-file-type": "Dit bestandstype wordt niet ondersteund. Toegestane bestandstypen zijn: %1",
"group-name-too-short": "De groepsnaam is te kort",
"group-name-too-long": "Group name too long",
"group-already-exists": "Een groep met deze naam bestaat al",
"group-name-change-not-allowed": "Het aanpassen van de groepsnaam is niet toegestaan",
"group-already-member": "Deze gebruiker is al lid van deze groep",

@ -30,6 +30,7 @@
"user-banned": "Użytkownik zbanowany",
"user-too-new": "Przepraszamy, musisz odczekać %1 sekund(y) przed utworzeniem pierwszego posta",
"blacklisted-ip": "Twój adres IP został zablokowany na tej społeczności. Jeśli uważasz to za błąd, zgłoś to administratorowi",
"ban-expiry-missing": "Please provide an end date for this ban",
"no-category": "Kategoria nie istnieje",
"no-topic": "Temat nie istnieje",
"no-post": "Post nie istnieje",
@ -46,6 +47,13 @@
"post-edit-duration-expired-hours-minutes": "Możesz edytować posty tylko przez %1 godzin(y) i %2 minut(y) po ich napisaniu",
"post-edit-duration-expired-days": "Możesz edytować posty tylko przez %1 dzień (dni) po ich napisaniu",
"post-edit-duration-expired-days-hours": "Możesz edytować posty tylko przez %1 dzień (dni) i %2 godzin(y) po ich napisaniu",
"post-delete-duration-expired": "You are only allowed to delete posts for %1 second(s) after posting",
"post-delete-duration-expired-minutes": "You are only allowed to delete posts for %1 minute(s) after posting",
"post-delete-duration-expired-minutes-seconds": "You are only allowed to delete posts for %1 minute(s) %2 second(s) after posting",
"post-delete-duration-expired-hours": "You are only allowed to delete posts for %1 hour(s) after posting",
"post-delete-duration-expired-hours-minutes": "You are only allowed to delete posts for %1 hour(s) %2 minute(s) after posting",
"post-delete-duration-expired-days": "You are only allowed to delete posts for %1 day(s) after posting",
"post-delete-duration-expired-days-hours": "You are only allowed to delete posts for %1 day(s) %2 hour(s) after posting",
"content-too-short": "Prosimy wpisać dłuższy post. Posty powinny zawierać co najmniej %1 znaków.",
"content-too-long": "Prosimy wpisać krótszy post. Posty nie mogą zawierać więcej niż %1 znaków.",
"title-too-short": "Prosimy podać dłuższy tytuł. Tytuły powinny zawierać co najmniej %1 znaków.",
@ -68,6 +76,7 @@
"invalid-image-extension": "Błędne rozszerzenie pliku",
"invalid-file-type": "Błędny typ pliku. Dozwolone typy to: %1",
"group-name-too-short": "Nazwa grupy za krótka",
"group-name-too-long": "Group name too long",
"group-already-exists": "Grupa już istnieje",
"group-name-change-not-allowed": "Nie można zmieniać nazwy tej grupy.",
"group-already-member": "Już jesteś członkiem tej grupy",

@ -30,6 +30,7 @@
"user-banned": "Usuário banido",
"user-too-new": "Desculpe, é necessário que você aguarde %1 segundo(s) antes de fazer o seu primeiro post.",
"blacklisted-ip": "Desculpe, o seu endereço IP foi banido desta comunidade. Se você acha que isso é um engano, por favor contate um administrador.",
"ban-expiry-missing": "Please provide an end date for this ban",
"no-category": "A categoria não existe",
"no-topic": "O tópico não existe",
"no-post": "O post não existe",
@ -46,6 +47,13 @@
"post-edit-duration-expired-hours-minutes": "Você pode apenas editar posts por %1 hora(s) e %2 minuto(s) após postar",
"post-edit-duration-expired-days": "Você pode apenas editar posts por %1 dia(s) após postar",
"post-edit-duration-expired-days-hours": "Você pode apenas editar posts por %1 dia(s) e %2 hora(s) após postar",
"post-delete-duration-expired": "You are only allowed to delete posts for %1 second(s) after posting",
"post-delete-duration-expired-minutes": "You are only allowed to delete posts for %1 minute(s) after posting",
"post-delete-duration-expired-minutes-seconds": "You are only allowed to delete posts for %1 minute(s) %2 second(s) after posting",
"post-delete-duration-expired-hours": "You are only allowed to delete posts for %1 hour(s) after posting",
"post-delete-duration-expired-hours-minutes": "You are only allowed to delete posts for %1 hour(s) %2 minute(s) after posting",
"post-delete-duration-expired-days": "You are only allowed to delete posts for %1 day(s) after posting",
"post-delete-duration-expired-days-hours": "You are only allowed to delete posts for %1 day(s) %2 hour(s) after posting",
"content-too-short": "Por favor digite um post maior. Posts precisam conter ao menos %1 caractere(s).",
"content-too-long": "Por favor digite um post mais curto. Posts não podem ser maiores que %1 caractere(s)",
"title-too-short": "Por favor digite um título maior. Títulos devem conter no mínimo %1 caractere(s)",
@ -68,6 +76,7 @@
"invalid-image-extension": "Extensão de imagem inválida",
"invalid-file-type": "Tipo de arquivo inválido. Os tipos permitidos são: %1",
"group-name-too-short": "Nome do grupo é muito curto",
"group-name-too-long": "Group name too long",
"group-already-exists": "O grupo já existe",
"group-name-change-not-allowed": "Sem permissão para alterar nome do grupo",
"group-already-member": "Já faz parte deste grupo",

@ -30,6 +30,7 @@
"user-banned": "Utilizator banat",
"user-too-new": "Imi pare rau dar trebuie sa astepti %1 secunda(e) pentru a posta prima oara.",
"blacklisted-ip": "Sorry, your IP address has been banned from this community. If you feel this is in error, please contact an administrator.",
"ban-expiry-missing": "Please provide an end date for this ban",
"no-category": "Categoria nu exista.",
"no-topic": "Topicul nu exista.",
"no-post": "Post-ul nu exista.",
@ -46,6 +47,13 @@
"post-edit-duration-expired-hours-minutes": "You are only allowed to edit posts for %1 hour(s) %2 minute(s) after posting",
"post-edit-duration-expired-days": "You are only allowed to edit posts for %1 day(s) after posting",
"post-edit-duration-expired-days-hours": "You are only allowed to edit posts for %1 day(s) %2 hour(s) after posting",
"post-delete-duration-expired": "You are only allowed to delete posts for %1 second(s) after posting",
"post-delete-duration-expired-minutes": "You are only allowed to delete posts for %1 minute(s) after posting",
"post-delete-duration-expired-minutes-seconds": "You are only allowed to delete posts for %1 minute(s) %2 second(s) after posting",
"post-delete-duration-expired-hours": "You are only allowed to delete posts for %1 hour(s) after posting",
"post-delete-duration-expired-hours-minutes": "You are only allowed to delete posts for %1 hour(s) %2 minute(s) after posting",
"post-delete-duration-expired-days": "You are only allowed to delete posts for %1 day(s) after posting",
"post-delete-duration-expired-days-hours": "You are only allowed to delete posts for %1 day(s) %2 hour(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).",
@ -68,6 +76,7 @@
"invalid-image-extension": "Invalid image extension",
"invalid-file-type": "Invalid file type. Allowed types are: %1",
"group-name-too-short": "Numele grupului este prea scurt",
"group-name-too-long": "Group name too long",
"group-already-exists": "Grupul deja există",
"group-name-change-not-allowed": "Schimbarea numelui grupului este interzisă",
"group-already-member": "Already part of this group",

@ -30,6 +30,7 @@
"user-banned": "Пользователь заблокирован",
"user-too-new": "Вы можете написать свое первой сообщение через %1 сек.",
"blacklisted-ip": "Извините, ваш IP адрес был забанен этим сообществом. Если вы считаете что это ошибка, пожалуйста, свяжитесь с администратором.",
"ban-expiry-missing": "Please provide an end date for this ban",
"no-category": "Категория не существует",
"no-topic": "Тема не существует",
"no-post": "Сообщение не существует",
@ -46,6 +47,13 @@
"post-edit-duration-expired-hours-minutes": "Вы можете редактировать сообщения в течение %1 час(а) %2 минут(ы) после публикации.",
"post-edit-duration-expired-days": "Вы можете редактировать сообщения в течение %1 дня(ей) после публикации.",
"post-edit-duration-expired-days-hours": "Вы можете редактировать сообщения в течение %1 чдня(ей) и %2 час(а) после публикации.",
"post-delete-duration-expired": "You are only allowed to delete posts for %1 second(s) after posting",
"post-delete-duration-expired-minutes": "You are only allowed to delete posts for %1 minute(s) after posting",
"post-delete-duration-expired-minutes-seconds": "You are only allowed to delete posts for %1 minute(s) %2 second(s) after posting",
"post-delete-duration-expired-hours": "You are only allowed to delete posts for %1 hour(s) after posting",
"post-delete-duration-expired-hours-minutes": "You are only allowed to delete posts for %1 hour(s) %2 minute(s) after posting",
"post-delete-duration-expired-days": "You are only allowed to delete posts for %1 day(s) after posting",
"post-delete-duration-expired-days-hours": "You are only allowed to delete posts for %1 day(s) %2 hour(s) after posting",
"content-too-short": "Слишком короткое сообщение. Минимум символов: %1.",
"content-too-long": "Слишком длинное сообщение. Максимум символов: %1.",
"title-too-short": "Слишком короткое сообщение. Минимум символов: %1.",
@ -68,6 +76,7 @@
"invalid-image-extension": "Недопустимое расширение файла",
"invalid-file-type": "Неверный формат файла. Поддерживаемые форматы: %1",
"group-name-too-short": "Название группы слишком короткое",
"group-name-too-long": "Group name too long",
"group-already-exists": "Группа уже существует",
"group-name-change-not-allowed": "Изменение названия группы запрещено",
"group-already-member": "Уже в этой группе",

@ -30,6 +30,7 @@
"user-banned": "Umuntu wirukanwe",
"user-too-new": "Wihangena kuko usabwa gutegereza amasegonda (isegonda) %1 mbere yo gushyiraho ikintu cyawe cya mbere",
"blacklisted-ip": "Sorry, your IP address has been banned from this community. If you feel this is in error, please contact an administrator.",
"ban-expiry-missing": "Please provide an end date for this ban",
"no-category": "Icyiciro kitabaho",
"no-topic": "Ikiganiro kitabaho",
"no-post": "Icyashyizweho kitabaho",
@ -46,6 +47,13 @@
"post-edit-duration-expired-hours-minutes": "You are only allowed to edit posts for %1 hour(s) %2 minute(s) after posting",
"post-edit-duration-expired-days": "You are only allowed to edit posts for %1 day(s) after posting",
"post-edit-duration-expired-days-hours": "You are only allowed to edit posts for %1 day(s) %2 hour(s) after posting",
"post-delete-duration-expired": "You are only allowed to delete posts for %1 second(s) after posting",
"post-delete-duration-expired-minutes": "You are only allowed to delete posts for %1 minute(s) after posting",
"post-delete-duration-expired-minutes-seconds": "You are only allowed to delete posts for %1 minute(s) %2 second(s) after posting",
"post-delete-duration-expired-hours": "You are only allowed to delete posts for %1 hour(s) after posting",
"post-delete-duration-expired-hours-minutes": "You are only allowed to delete posts for %1 hour(s) %2 minute(s) after posting",
"post-delete-duration-expired-days": "You are only allowed to delete posts for %1 day(s) after posting",
"post-delete-duration-expired-days-hours": "You are only allowed to delete posts for %1 day(s) %2 hour(s) after posting",
"content-too-short": "Gerageza ushyireho ikintu kirekireho. Icyo ushyiraho kigomba kuba kigizwe nibura n'inyuguti (cyangwa ibimenyetso) zigera kuri %1.",
"content-too-long": "Gerageza ushyireho ibintu bigufiyaho. Icyo ushyiraho kigomba kuba kigizwe n'inyuguti (cyangwa ibimenyetso) zirenga %1. ",
"title-too-short": "Gerageza ushyireho umutwe muremureho. Umutwe ugomba kuba ugizwe n'inyuguti (cyangwa ibimenyetso) zigera kuri %1. ",
@ -68,6 +76,7 @@
"invalid-image-extension": "Impera itemewe igaragaza foruma y'ifoto",
"invalid-file-type": "Ubwoko bw'ifayilo ntibwemewe. Hemewe gusa: %1",
"group-name-too-short": "Izina ry'itsinda ni rigufi cyane",
"group-name-too-long": "Group name too long",
"group-already-exists": "Itsinda ryitwa gutya risanzweho",
"group-name-change-not-allowed": "Guhindura izina ry'itsinda ntibyemewe",
"group-already-member": "Already part of this group",

@ -30,6 +30,7 @@
"user-banned": "User banned",
"user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post",
"blacklisted-ip": "Sorry, your IP address has been banned from this community. If you feel this is in error, please contact an administrator.",
"ban-expiry-missing": "Please provide an end date for this ban",
"no-category": "Category does not exist",
"no-topic": "Topic does not exist",
"no-post": "Post does not exist",
@ -46,6 +47,13 @@
"post-edit-duration-expired-hours-minutes": "You are only allowed to edit posts for %1 hour(s) %2 minute(s) after posting",
"post-edit-duration-expired-days": "You are only allowed to edit posts for %1 day(s) after posting",
"post-edit-duration-expired-days-hours": "You are only allowed to edit posts for %1 day(s) %2 hour(s) after posting",
"post-delete-duration-expired": "You are only allowed to delete posts for %1 second(s) after posting",
"post-delete-duration-expired-minutes": "You are only allowed to delete posts for %1 minute(s) after posting",
"post-delete-duration-expired-minutes-seconds": "You are only allowed to delete posts for %1 minute(s) %2 second(s) after posting",
"post-delete-duration-expired-hours": "You are only allowed to delete posts for %1 hour(s) after posting",
"post-delete-duration-expired-hours-minutes": "You are only allowed to delete posts for %1 hour(s) %2 minute(s) after posting",
"post-delete-duration-expired-days": "You are only allowed to delete posts for %1 day(s) after posting",
"post-delete-duration-expired-days-hours": "You are only allowed to delete posts for %1 day(s) %2 hour(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).",
@ -68,6 +76,7 @@
"invalid-image-extension": "Invalid image extension",
"invalid-file-type": "Invalid file type. Allowed types are: %1",
"group-name-too-short": "Group name too short",
"group-name-too-long": "Group name too long",
"group-already-exists": "Group already exists",
"group-name-change-not-allowed": "Group name change not allowed",
"group-already-member": "Already part of this group",

@ -30,6 +30,7 @@
"user-banned": "Užívateľ je zakázaný",
"user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post",
"blacklisted-ip": "Sorry, your IP address has been banned from this community. If you feel this is in error, please contact an administrator.",
"ban-expiry-missing": "Please provide an end date for this ban",
"no-category": "Category does not exist",
"no-topic": "Topic does not exist",
"no-post": "Post does not exist",
@ -46,6 +47,13 @@
"post-edit-duration-expired-hours-minutes": "You are only allowed to edit posts for %1 hour(s) %2 minute(s) after posting",
"post-edit-duration-expired-days": "You are only allowed to edit posts for %1 day(s) after posting",
"post-edit-duration-expired-days-hours": "You are only allowed to edit posts for %1 day(s) %2 hour(s) after posting",
"post-delete-duration-expired": "You are only allowed to delete posts for %1 second(s) after posting",
"post-delete-duration-expired-minutes": "You are only allowed to delete posts for %1 minute(s) after posting",
"post-delete-duration-expired-minutes-seconds": "You are only allowed to delete posts for %1 minute(s) %2 second(s) after posting",
"post-delete-duration-expired-hours": "You are only allowed to delete posts for %1 hour(s) after posting",
"post-delete-duration-expired-hours-minutes": "You are only allowed to delete posts for %1 hour(s) %2 minute(s) after posting",
"post-delete-duration-expired-days": "You are only allowed to delete posts for %1 day(s) after posting",
"post-delete-duration-expired-days-hours": "You are only allowed to delete posts for %1 day(s) %2 hour(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).",
@ -68,6 +76,7 @@
"invalid-image-extension": "Invalid image extension",
"invalid-file-type": "Invalid file type. Allowed types are: %1",
"group-name-too-short": "Názov skupiny je príliš krátky",
"group-name-too-long": "Group name too long",
"group-already-exists": "Skupina už existuje",
"group-name-change-not-allowed": "Nepovolená zmena mena skupiny",
"group-already-member": "Already part of this group",

@ -30,6 +30,7 @@
"user-banned": "Uporabnik je blokiran",
"user-too-new": "Oprostite, počakajte %1 sekund pred vašo prvo objavo",
"blacklisted-ip": "Sorry, your IP address has been banned from this community. If you feel this is in error, please contact an administrator.",
"ban-expiry-missing": "Please provide an end date for this ban",
"no-category": "Kategorija ne obstaja",
"no-topic": "Tema ne obstaja",
"no-post": "Objava ne obstaja",
@ -46,6 +47,13 @@
"post-edit-duration-expired-hours-minutes": "You are only allowed to edit posts for %1 hour(s) %2 minute(s) after posting",
"post-edit-duration-expired-days": "You are only allowed to edit posts for %1 day(s) after posting",
"post-edit-duration-expired-days-hours": "You are only allowed to edit posts for %1 day(s) %2 hour(s) after posting",
"post-delete-duration-expired": "You are only allowed to delete posts for %1 second(s) after posting",
"post-delete-duration-expired-minutes": "You are only allowed to delete posts for %1 minute(s) after posting",
"post-delete-duration-expired-minutes-seconds": "You are only allowed to delete posts for %1 minute(s) %2 second(s) after posting",
"post-delete-duration-expired-hours": "You are only allowed to delete posts for %1 hour(s) after posting",
"post-delete-duration-expired-hours-minutes": "You are only allowed to delete posts for %1 hour(s) %2 minute(s) after posting",
"post-delete-duration-expired-days": "You are only allowed to delete posts for %1 day(s) after posting",
"post-delete-duration-expired-days-hours": "You are only allowed to delete posts for %1 day(s) %2 hour(s) after posting",
"content-too-short": "Prosimo napišite daljšo objavo. Objave morajo vsebovati vsaj %1 znak(ov).",
"content-too-long": "Prosimo napišite krajšo objavo. Objave ne smejo vsebovati več kot %1 znak(ov).",
"title-too-short": "Prosimo vnesite daljši naslov. Naslovi morajo vsebovati vsaj %1 znak(ov).",
@ -68,6 +76,7 @@
"invalid-image-extension": "Nedovoljena končnica slike",
"invalid-file-type": "Nedovoljen format datoteke. Dovoljeni formati so: %1",
"group-name-too-short": "Ime skupine je prekratko",
"group-name-too-long": "Group name too long",
"group-already-exists": "Skupina še obstaja",
"group-name-change-not-allowed": "Sprememba imena skupine ni dovoljena",
"group-already-member": "Already part of this group",

@ -30,6 +30,7 @@
"user-banned": "Члан банован",
"user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post",
"blacklisted-ip": "Sorry, your IP address has been banned from this community. If you feel this is in error, please contact an administrator.",
"ban-expiry-missing": "Please provide an end date for this ban",
"no-category": "Категорија не постоји",
"no-topic": "Тема не постоји",
"no-post": "Порука не постоји",
@ -46,6 +47,13 @@
"post-edit-duration-expired-hours-minutes": "You are only allowed to edit posts for %1 hour(s) %2 minute(s) after posting",
"post-edit-duration-expired-days": "You are only allowed to edit posts for %1 day(s) after posting",
"post-edit-duration-expired-days-hours": "You are only allowed to edit posts for %1 day(s) %2 hour(s) after posting",
"post-delete-duration-expired": "You are only allowed to delete posts for %1 second(s) after posting",
"post-delete-duration-expired-minutes": "You are only allowed to delete posts for %1 minute(s) after posting",
"post-delete-duration-expired-minutes-seconds": "You are only allowed to delete posts for %1 minute(s) %2 second(s) after posting",
"post-delete-duration-expired-hours": "You are only allowed to delete posts for %1 hour(s) after posting",
"post-delete-duration-expired-hours-minutes": "You are only allowed to delete posts for %1 hour(s) %2 minute(s) after posting",
"post-delete-duration-expired-days": "You are only allowed to delete posts for %1 day(s) after posting",
"post-delete-duration-expired-days-hours": "You are only allowed to delete posts for %1 day(s) %2 hour(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).",
@ -68,6 +76,7 @@
"invalid-image-extension": "Неважећи тип слике",
"invalid-file-type": "Неважећи тип фајла. Дозвољени су: %1",
"group-name-too-short": "Име групе је прекратко",
"group-name-too-long": "Group name too long",
"group-already-exists": "Група већ постоји",
"group-name-change-not-allowed": "Мењање имена групе није дозвољено",
"group-already-member": "Already part of this group",

@ -30,6 +30,7 @@
"user-banned": "Användare bannlyst",
"user-too-new": "När du är ny medlem måste du vänta %1 sekund(er) innan du gör ditt första inlägg",
"blacklisted-ip": "Din IP-adress har blivit bannlyst från det här forumet. Om du tror att det beror på ett misstag, vad god kontakta en administratör. ",
"ban-expiry-missing": "Ange ett slutdatum för denna banning",
"no-category": "Kategorin finns inte",
"no-topic": "Ämnet finns inte",
"no-post": "Inlägget finns inte",
@ -40,12 +41,19 @@
"category-disabled": "Kategorin inaktiverad",
"topic-locked": "Ämnet låst",
"post-edit-duration-expired": "Du kan endast ändra inlägg inom %1 sekund(er) efter att ha skickat det",
"post-edit-duration-expired-minutes": "You are only allowed to edit posts for %1 minute(s) after posting",
"post-edit-duration-expired-minutes-seconds": "You are only allowed to edit posts for %1 minute(s) %2 second(s) after posting",
"post-edit-duration-expired-hours": "You are only allowed to edit posts for %1 hour(s) after posting",
"post-edit-duration-expired-hours-minutes": "You are only allowed to edit posts for %1 hour(s) %2 minute(s) after posting",
"post-edit-duration-expired-days": "You are only allowed to edit posts for %1 day(s) after posting",
"post-edit-duration-expired-days-hours": "You are only allowed to edit posts for %1 day(s) %2 hour(s) after posting",
"post-edit-duration-expired-minutes": "Du kan endast ändra inlägg inom %1 minut(er) efter att ha skickat det",
"post-edit-duration-expired-minutes-seconds": "Du kan endast ändra inlägg inom %1 minut(er) %2 sekund(er) efter att ha skickat det",
"post-edit-duration-expired-hours": "Du kan endast ändra inlägg inom %1 timm(ar) efter att ha skickat det",
"post-edit-duration-expired-hours-minutes": "Du kan endast ändra inlägg inom %1 timm(ar) %2 minut(er) efter att ha skickat det",
"post-edit-duration-expired-days": "Du kan endast ändra inlägg inom %1 dag(ar) efter att ha skickat det",
"post-edit-duration-expired-days-hours": "Du kan endast ändra inlägg inom %1 dag(ar) %2 timm(ar) efter att ha skickat det",
"post-delete-duration-expired": "Du kan endast radera inlägg inom %1 sekund(er) efter att ha skickat det",
"post-delete-duration-expired-minutes": "Du kan endast radera inlägg inom %1 minut(er) efter att ha skickat det",
"post-delete-duration-expired-minutes-seconds": "Du kan endast radera inlägg inom %1 minut(er) %2 sekund(er) efter att ha skickat det",
"post-delete-duration-expired-hours": "Du kan endast radera inlägg inom %1 timm(ar) efter att ha skickat det",
"post-delete-duration-expired-hours-minutes": "Du kan endast radera inlägg inom %1 timmar(er) %2 minut(er) efter att ha skickat det",
"post-delete-duration-expired-days": "Du kan endast radera inlägg inom %1 dag(ar) efter att ha skickat det",
"post-delete-duration-expired-days-hours": "Du kan endast radera inlägg inom %1 dag(ar) %2 timm(ar) efter att ha skickat det",
"content-too-short": "Skriv ett längre inlägg. Inlägg måste innehålla minst %1 tecken.",
"content-too-long": "Skriv ett kortare inlägg. Inlägg kan inte innehålla mer än %1 tecken.",
"title-too-short": "Skriv en längre rubrik. Rubriker måste innehålla minst %1 tecken.",
@ -63,11 +71,12 @@
"already-unfavourited": "Du har redan tagit bort bokmärket för det här inlägget",
"cant-ban-other-admins": "Du kan inte bannlysa andra administratörer!",
"cant-remove-last-admin": "Du är den enda administratören. Lägg till en annan användare som administratör innan du tar bort dig själv.",
"cant-delete-admin": "Remove administrator privileges from this account before attempting to delete it.",
"cant-delete-admin": "Ta bort administratörsbehörighet från detta konto innan du försöker ta bort den.",
"invalid-image-type": "Ogiltig bildtyp. Tillåtna typer är: % 1",
"invalid-image-extension": "Ogiltigt bildformat",
"invalid-file-type": "Ogiltig filtyp. Tillåtna typer är: % 1",
"group-name-too-short": "Gruppnamnet är för kort",
"group-name-too-long": "Gruppnamnet är för långt",
"group-already-exists": "Gruppen existerar redan",
"group-name-change-not-allowed": "Gruppnamnet får inte ändras",
"group-already-member": "Redan i denna grupp",

@ -30,6 +30,7 @@
"user-banned": "User banned",
"user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post",
"blacklisted-ip": "Sorry, your IP address has been banned from this community. If you feel this is in error, please contact an administrator.",
"ban-expiry-missing": "Please provide an end date for this ban",
"no-category": "ยังไม่มี Category นี้",
"no-topic": "ยังไม่มี Topic นี้",
"no-post": "ยังไม่มี Post นี้",
@ -46,6 +47,13 @@
"post-edit-duration-expired-hours-minutes": "You are only allowed to edit posts for %1 hour(s) %2 minute(s) after posting",
"post-edit-duration-expired-days": "You are only allowed to edit posts for %1 day(s) after posting",
"post-edit-duration-expired-days-hours": "You are only allowed to edit posts for %1 day(s) %2 hour(s) after posting",
"post-delete-duration-expired": "You are only allowed to delete posts for %1 second(s) after posting",
"post-delete-duration-expired-minutes": "You are only allowed to delete posts for %1 minute(s) after posting",
"post-delete-duration-expired-minutes-seconds": "You are only allowed to delete posts for %1 minute(s) %2 second(s) after posting",
"post-delete-duration-expired-hours": "You are only allowed to delete posts for %1 hour(s) after posting",
"post-delete-duration-expired-hours-minutes": "You are only allowed to delete posts for %1 hour(s) %2 minute(s) after posting",
"post-delete-duration-expired-days": "You are only allowed to delete posts for %1 day(s) after posting",
"post-delete-duration-expired-days-hours": "You are only allowed to delete posts for %1 day(s) %2 hour(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).",
@ -68,6 +76,7 @@
"invalid-image-extension": "Invalid image extension",
"invalid-file-type": "Invalid file type. Allowed types are: %1",
"group-name-too-short": "Group name too short",
"group-name-too-long": "Group name too long",
"group-already-exists": "Group already exists",
"group-name-change-not-allowed": "Group name change not allowed",
"group-already-member": "Already part of this group",

@ -30,6 +30,7 @@
"user-banned": "Kullanıcı Yasaklı",
"user-too-new": "Özür dileriz, ilk iletinizi yapmadan önce %1 saniye beklemeniz gerekiyor",
"blacklisted-ip": "Üzgünüz, IP adresiniz, bu toplulukta yasaklandı. Bunun bir hata olduğunu düşünüyorsanız, bir yönetici ile irtibata geçiniz.",
"ban-expiry-missing": "Please provide an end date for this ban",
"no-category": "Kategori Yok",
"no-topic": "Başlık Yok",
"no-post": "İleti Yok",
@ -46,6 +47,13 @@
"post-edit-duration-expired-hours-minutes": "Gönderildikten %1 saat(s) %2 dakika(s) sonra iletini düzenlemene izin verilir.",
"post-edit-duration-expired-days": "Gönderildikten %1 gün(s) sonra iletini düzenlemene izin verilir.",
"post-edit-duration-expired-days-hours": "Gönderildikten %1 gün(s) %2 saat(s) sonra iletini düzenlemene izin verilir.",
"post-delete-duration-expired": "You are only allowed to delete posts for %1 second(s) after posting",
"post-delete-duration-expired-minutes": "You are only allowed to delete posts for %1 minute(s) after posting",
"post-delete-duration-expired-minutes-seconds": "You are only allowed to delete posts for %1 minute(s) %2 second(s) after posting",
"post-delete-duration-expired-hours": "You are only allowed to delete posts for %1 hour(s) after posting",
"post-delete-duration-expired-hours-minutes": "You are only allowed to delete posts for %1 hour(s) %2 minute(s) after posting",
"post-delete-duration-expired-days": "You are only allowed to delete posts for %1 day(s) after posting",
"post-delete-duration-expired-days-hours": "You are only allowed to delete posts for %1 day(s) %2 hour(s) after posting",
"content-too-short": "Lütfen daha uzun bir ileti girin. En az %1 karakter.",
"content-too-long": "Lütfen daha kısa bir ileti girin. İletiler %1 karakterden uzun olamaz.",
"title-too-short": "Lütfen daha uzun bir başlık girin. Başlıklar en az %1 karakter içermelidir.",
@ -68,6 +76,7 @@
"invalid-image-extension": "Geçersiz resim uzantısı",
"invalid-file-type": "Geçersiz dosya türü. İzin verilenler şunlar : %1",
"group-name-too-short": "Grup ismi çok kısa",
"group-name-too-long": "Group name too long",
"group-already-exists": "Grup zaten var",
"group-name-change-not-allowed": "Grup ismini değiştiremezsiniz",
"group-already-member": "Bu grubun zaten bir parçasısın.",

@ -30,6 +30,7 @@
"user-banned": "Tài khoản bị ban",
"user-too-new": "Rất tiếc, bạn phải chờ %1 giây để đăng bài viết đầu tiên.",
"blacklisted-ip": "Rất tiếc, địa chỉ IP của bạn đã bị ban khỏi cộng đồng. Nếu bạn cảm thấy có gì không đúng, hãy liên lạc với người quản trị.",
"ban-expiry-missing": "Please provide an end date for this ban",
"no-category": "Danh mục không tồn tại",
"no-topic": "Chủ đề không tồn tại",
"no-post": "Bài viết không tồn tại",
@ -46,6 +47,13 @@
"post-edit-duration-expired-hours-minutes": "Bạn chỉ được phép sửa các bài viết sau khi đăng %1 giờ(s) %2 phút(s)",
"post-edit-duration-expired-days": "Bạn chỉ được phép sửa các bài viết sau khi đăng %1 ngày(s)",
"post-edit-duration-expired-days-hours": "Bạn chỉ được phép sửa các bài viết sau khi đăng %1 ngày(s) %2 giờ(s)",
"post-delete-duration-expired": "You are only allowed to delete posts for %1 second(s) after posting",
"post-delete-duration-expired-minutes": "You are only allowed to delete posts for %1 minute(s) after posting",
"post-delete-duration-expired-minutes-seconds": "You are only allowed to delete posts for %1 minute(s) %2 second(s) after posting",
"post-delete-duration-expired-hours": "You are only allowed to delete posts for %1 hour(s) after posting",
"post-delete-duration-expired-hours-minutes": "You are only allowed to delete posts for %1 hour(s) %2 minute(s) after posting",
"post-delete-duration-expired-days": "You are only allowed to delete posts for %1 day(s) after posting",
"post-delete-duration-expired-days-hours": "You are only allowed to delete posts for %1 day(s) %2 hour(s) after posting",
"content-too-short": "Vui lòng nhập một bài viết dài hơn. Bài viết phải có tối thiểu %1 ký tự.",
"content-too-long": "Vui lòng nhập một bài viết ngắn hơn. Bài viết chỉ có thể có tối đa %1 ký tự.",
"title-too-short": "Vui lòng nhập tiêu đề dài hơn. Tiêu đề phải có tối thiểu %1 ký tự.",
@ -68,6 +76,7 @@
"invalid-image-extension": "Định dạng ảnh không hợp lệ",
"invalid-file-type": "Định dạng file không hợp lệ. Những định dạng được cho phép là: %1",
"group-name-too-short": "Tên nhóm quá ngắn",
"group-name-too-long": "Group name too long",
"group-already-exists": "Nhóm đã tồn tại",
"group-name-change-not-allowed": "Không cho phép đổi tên nhóm",
"group-already-member": "Bạn đã là thành viên của nhóm này.",

@ -30,6 +30,7 @@
"user-banned": "用户已禁止",
"user-too-new": "抱歉,您需要等待 %1 秒后,才可以发帖!",
"blacklisted-ip": "对不起您的IP地址已被社区禁用。如果您认为这是一个错误请与管理员联系。",
"ban-expiry-missing": "Please provide an end date for this ban",
"no-category": "版块不存在",
"no-topic": "主题不存在",
"no-post": "帖子不存在",
@ -46,6 +47,13 @@
"post-edit-duration-expired-hours-minutes": "发表 %1 小时 2 分钟后才能修改内容",
"post-edit-duration-expired-days": "发表 %1 天后才能修改内容",
"post-edit-duration-expired-days-hours": "发表 %1 天 %2 小时后才能修改内容",
"post-delete-duration-expired": "You are only allowed to delete posts for %1 second(s) after posting",
"post-delete-duration-expired-minutes": "You are only allowed to delete posts for %1 minute(s) after posting",
"post-delete-duration-expired-minutes-seconds": "You are only allowed to delete posts for %1 minute(s) %2 second(s) after posting",
"post-delete-duration-expired-hours": "You are only allowed to delete posts for %1 hour(s) after posting",
"post-delete-duration-expired-hours-minutes": "You are only allowed to delete posts for %1 hour(s) %2 minute(s) after posting",
"post-delete-duration-expired-days": "You are only allowed to delete posts for %1 day(s) after posting",
"post-delete-duration-expired-days-hours": "You are only allowed to delete posts for %1 day(s) %2 hour(s) after posting",
"content-too-short": "请增添发帖内容,不能少于 %1 个字符。",
"content-too-long": "请删减发帖内容,不能超过 %1 个字符。",
"title-too-short": "请增加标题,不能少于 %1 个字符。",
@ -63,11 +71,12 @@
"already-unfavourited": "您已取消了此贴的书签",
"cant-ban-other-admins": "您不能封禁其他管理员!",
"cant-remove-last-admin": "您是唯一的管理员。在删除您的管理员权限前,请添加另一个管理员。",
"cant-delete-admin": "Remove administrator privileges from this account before attempting to delete it.",
"cant-delete-admin": "在删除之前请你先把管理员的权限从这个账号移除。",
"invalid-image-type": "无效的图像类型。允许的类型有:%1",
"invalid-image-extension": "无效的图像扩展",
"invalid-file-type": "无效文件格式,允许的格式有:%1",
"group-name-too-short": "小组名太短",
"group-name-too-long": "Group name too long",
"group-already-exists": "小组已存在",
"group-name-change-not-allowed": "不允许更改小组名称",
"group-already-member": "已经是此小组的成员",

@ -30,6 +30,7 @@
"user-banned": "該使用者已被停用",
"user-too-new": "抱歉,發表你第一篇文章須要等待 %1 秒",
"blacklisted-ip": "抱歉你的IP位置已經被這個社群禁用了。如果你覺得這是一個失誤請連絡管理員。",
"ban-expiry-missing": "Please provide an end date for this ban",
"no-category": "類別並不存在",
"no-topic": "主題並不存在",
"no-post": "文章並不存在",
@ -46,6 +47,13 @@
"post-edit-duration-expired-hours-minutes": "You are only allowed to edit posts for %1 hour(s) %2 minute(s) after posting",
"post-edit-duration-expired-days": "You are only allowed to edit posts for %1 day(s) after posting",
"post-edit-duration-expired-days-hours": "You are only allowed to edit posts for %1 day(s) %2 hour(s) after posting",
"post-delete-duration-expired": "You are only allowed to delete posts for %1 second(s) after posting",
"post-delete-duration-expired-minutes": "You are only allowed to delete posts for %1 minute(s) after posting",
"post-delete-duration-expired-minutes-seconds": "You are only allowed to delete posts for %1 minute(s) %2 second(s) after posting",
"post-delete-duration-expired-hours": "You are only allowed to delete posts for %1 hour(s) after posting",
"post-delete-duration-expired-hours-minutes": "You are only allowed to delete posts for %1 hour(s) %2 minute(s) after posting",
"post-delete-duration-expired-days": "You are only allowed to delete posts for %1 day(s) after posting",
"post-delete-duration-expired-days-hours": "You are only allowed to delete posts for %1 day(s) %2 hour(s) after posting",
"content-too-short": "請輸入一個長一點的張貼內容。張貼內容長度不能少於 %1 字元。",
"content-too-long": "請輸入一個短一點的張貼內容。張貼內容長度不能超過 %1 字元。",
"title-too-short": "請輸入一個長一點的標題。標題長度不能少於 %1 字元。",
@ -68,6 +76,7 @@
"invalid-image-extension": "無效的圖像擴充元件",
"invalid-file-type": "無效的檔案類型。允許的類型:%1",
"group-name-too-short": "群組名稱太短了",
"group-name-too-long": "Group name too long",
"group-already-exists": "群組名稱已存在",
"group-name-change-not-allowed": "變更群組名稱不被允許",
"group-already-member": "已經加入這個群組",

@ -103,4 +103,16 @@
&.avatar-rounded {
border-radius: 50%;
}
}
.ban-modal {
input[type="number"] {
width: 7rem;
text-align: center;
margin-left: 1rem;
}
.form-inline, .form-group {
width: 100%;
}
}

@ -1,11 +1,12 @@
"use strict";
/*global define, socket, app, admin, utils, bootbox, RELATIVE_PATH*/
/*global define, socket, app, utils, bootbox, ajaxify*/
define('admin/manage/flags', [
'forum/infinitescroll',
'admin/modules/selectable',
'autocomplete'
], function(infinitescroll, selectable, autocomplete) {
'autocomplete',
'Chart'
], function(infinitescroll, selectable, autocomplete, Chart) {
var Flags = {};
@ -20,6 +21,7 @@ define('admin/manage/flags', [
handleDismissAll();
handleDelete();
handleInfiniteScroll();
handleGraphs();
};
function handleDismiss() {
@ -101,5 +103,42 @@ define('admin/manage/flags', [
});
}
function handleGraphs() {
var dailyCanvas = document.getElementById('flags:daily');
var dailyLabels = utils.getDaysArray().map(function(text, idx) {
return idx % 3 ? '' : text;
});
if (utils.isMobile()) {
Chart.defaults.global.showTooltips = false;
}
var data = {
'flags:daily': {
labels: dailyLabels,
datasets: [
{
label: "",
fillColor: "rgba(151,187,205,0.2)",
strokeColor: "rgba(151,187,205,1)",
pointColor: "rgba(151,187,205,1)",
pointStrokeColor: "#fff",
pointHighlightFill: "#fff",
pointHighlightStroke: "rgba(151,187,205,1)",
data: ajaxify.data.analytics
}
]
}
};
dailyCanvas.width = $(dailyCanvas).parent().width();
new Chart(dailyCanvas.getContext('2d')).Line(data['flags:daily'], {
responsive: true,
animation: false
});
}
return Flags;
});

@ -47,25 +47,59 @@ define('admin/manage/users', ['admin/modules/selectable'], function(selectable)
$('.ban-user').on('click', function() {
var uids = getSelectedUids();
if (!uids.length) {
return false;
app.alertError('[[error:no-users-selected]]');
return false; // specifically to keep the menu open
}
bootbox.confirm('Do you really want to ban?', function(confirm) {
bootbox.confirm('Do you really want to ban ' + (uids.length > 1 ? 'these users' : 'this user') + ' <strong>permanently</strong>?', function(confirm) {
if (confirm) {
socket.emit('user.banUsers', uids, done('User(s) banned!', '.ban', true));
socket.emit('user.banUsers', { uids: uids }, done('User(s) banned!', '.ban', true));
}
});
return false;
});
$('.ban-user-temporary').on('click', function() {
var uids = getSelectedUids();
if (!uids.length) {
app.alertError('[[error:no-users-selected]]');
return false; // specifically to keep the menu open
}
templates.parse('admin/partials/temporary-ban', {}, function(html) {
bootbox.dialog({
className: 'ban-modal',
title: '[[user:ban_account]]',
message: html,
show: true,
buttons: {
close: {
label: '[[global:close]]',
className: 'btn-link'
},
submit: {
label: 'Ban ' + uids.length + (uids.length > 1 ? ' users' : ' user'),
callback: function() {
var formData = $('.ban-modal form').serializeArray().reduce(function(data, cur) {
data[cur.name] = cur.value;
return data;
}, {});
var until = Date.now() + formData.length * 1000*60*60 * (parseInt(formData.unit, 10) ? 24 : 1);
socket.emit('user.banUsers', { uids: uids, until: until }, done('User(s) banned!', '.ban', true));
}
}
}
});
});
});
$('.unban-user').on('click', function() {
var uids = getSelectedUids();
if (!uids.length) {
return;
app.alertError('[[error:no-users-selected]]');
return false; // specifically to keep the menu open
}
socket.emit('user.unbanUsers', uids, done('User(s) unbanned!', '.ban', false));
return false;
});
$('.reset-lockout').on('click', function() {
@ -75,7 +109,6 @@ define('admin/manage/users', ['admin/modules/selectable'], function(selectable)
}
socket.emit('admin.user.resetLockouts', uids, done('Lockout(s) reset!'));
return false;
});
$('.reset-flags').on('click', function() {
@ -85,7 +118,6 @@ define('admin/manage/users', ['admin/modules/selectable'], function(selectable)
}
socket.emit('admin.user.resetFlags', uids, done('Flags(s) reset!'));
return false;
});
$('.admin-user').on('click', function() {
@ -99,7 +131,6 @@ define('admin/manage/users', ['admin/modules/selectable'], function(selectable)
} else {
socket.emit('admin.user.makeAdmins', uids, done('User(s) are now administrators.', '.administrator', true));
}
return false;
});
$('.remove-admin-user').on('click', function() {
@ -117,7 +148,6 @@ define('admin/manage/users', ['admin/modules/selectable'], function(selectable)
}
});
}
return false;
});
$('.validate-email').on('click', function() {
@ -131,7 +161,6 @@ define('admin/manage/users', ['admin/modules/selectable'], function(selectable)
socket.emit('admin.user.validateEmail', uids, done('Emails validated', '.notvalidated', false));
}
});
return false;
});
$('.send-validation-email').on('click', function() {
@ -158,7 +187,6 @@ define('admin/manage/users', ['admin/modules/selectable'], function(selectable)
socket.emit('admin.user.sendPasswordResetEmail', uids, done('Emails sent'));
}
});
return false;
});
$('.delete-user').on('click', function() {
@ -180,7 +208,6 @@ define('admin/manage/users', ['admin/modules/selectable'], function(selectable)
});
}
});
return false;
});
function handleUserCreate() {

@ -103,18 +103,34 @@ define('forum/account/header', [
}
function banAccount() {
translator.translate('[[user:ban_account_confirm]]', function(translated) {
bootbox.confirm(translated, function(confirm) {
if (!confirm) {
return;
}
socket.emit('user.banUsers', [ajaxify.data.theirid], function(err) {
if (err) {
return app.alertError(err.message);
templates.parse('admin/partials/temporary-ban', {}, function(html) {
bootbox.dialog({
className: 'ban-modal',
title: '[[user:ban_account]]',
message: html,
show: true,
buttons: {
close: {
label: '[[global:close]]',
className: 'btn-link'
},
submit: {
label: '[[user:ban_account]]',
callback: function() {
var formData = $('.ban-modal form').serializeArray().reduce(function(data, cur) {
data[cur.name] = cur.value;
return data;
}, {});
var until = Date.now() + formData.length * 1000*60*60 * (parseInt(formData.unit, 10) ? 24 : 1);
socket.emit('user.banUsers', { uids: [ajaxify.data.theirid], until: until }, function(err) {
if (err) {
return app.alertError(err.message);
}
ajaxify.refresh();
});
}
}
components.get('account/ban').parent().addClass('hide');
components.get('account/unban').parent().removeClass('hide');
});
}
});
});
}
@ -124,9 +140,7 @@ define('forum/account/header', [
if (err) {
return app.alertError(err.message);
}
components.get('account/ban').parent().removeClass('hide');
components.get('account/unban').parent().addClass('hide');
ajaxify.refresh();
});
}

@ -96,12 +96,14 @@ define('forum/topic/events', [
if (!data || !data.post) {
return;
}
var editedPostEl = components.get('post/content', data.post.pid),
editorEl = $('[data-pid="' + data.post.pid + '"] [component="post/editor"]'),
topicTitle = components.get('topic/title'),
breadCrumb = components.get('breadcrumb/current');
var editedPostEl = components.get('post/content', data.post.pid);
var editorEl = $('[data-pid="' + data.post.pid + '"] [component="post/editor"]');
var topicTitle = components.get('topic/title');
var navbarTitle = components.get('navbar/title').find('span');
var breadCrumb = components.get('breadcrumb/current');
if (topicTitle.length && data.topic.title && topicTitle.html() !== data.topic.title) {
ajaxify.data.title = data.topic.title;
var newUrl = 'topic/' + data.topic.slug + (window.location.search ? window.location.search : '');
history.replaceState({url: newUrl}, null, window.location.protocol + '//' + window.location.host + config.relative_path + '/' + newUrl);
@ -111,6 +113,9 @@ define('forum/topic/events', [
breadCrumb.fadeOut(250, function() {
breadCrumb.html(data.topic.title).fadeIn(250);
});
navbarTitle.fadeOut(250, function() {
navbarTitle.html(data.topic.title).fadeIn(250);
});
}
editedPostEl.fadeOut(250, function() {
@ -121,19 +126,19 @@ define('forum/topic/events', [
posts.unloadImages(editedPostEl.parent());
posts.loadImages();
editedPostEl.fadeIn(250);
$(window).trigger('action:posts.edited', data);
});
var editData = {
editor: data.editor,
editedISO: utils.toISOString(data.post.edited)
};
templates.parse('partials/topic/post-editor', editData, function(html) {
translator.translate(html, function(translated) {
html = $(translated);
editorEl.replaceWith(html);
html.find('.timeago').timeago();
var editData = {
editor: data.editor,
editedISO: utils.toISOString(data.post.edited)
};
templates.parse('partials/topic/post-editor', editData, function(html) {
translator.translate(html, function(translated) {
html = $(translated);
editorEl.replaceWith(html);
html.find('.timeago').timeago();
$(window).trigger('action:posts.edited', data);
});
});
});

@ -6,7 +6,11 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator
var PostTools = {};
var staleReplyAnyway = false;
PostTools.init = function(tid) {
staleReplyAnyway = false;
renderMenu();
addPostHandlers(tid);
@ -54,6 +58,8 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator
postEl.find('[component="post/delete"]').toggleClass('hidden', isDeleted);
postEl.find('[component="post/restore"]').toggleClass('hidden', !isDeleted);
postEl.find('[component="post/purge"]').toggleClass('hidden', !isDeleted);
postEl.find('.dropdown-menu').html('');
};
PostTools.updatePostCount = function(postCount) {
@ -171,42 +177,54 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator
var timestamp = parseInt(getData(btn, 'data-timestamp'), 10);
var postEditDuration = parseInt(ajaxify.data.postEditDuration, 10);
if (!ajaxify.data.privileges.isAdminOrMod && postEditDuration && Date.now() - timestamp > postEditDuration * 1000) {
var numDays = Math.floor(postEditDuration / 86400);
var numHours = Math.floor((postEditDuration % 86400) / 3600);
var numMinutes = Math.floor(((postEditDuration % 86400) % 3600) / 60);
var numSeconds = ((postEditDuration % 86400) % 3600) % 60;
var msg = '[[error:post-edit-duration-expired, ' + postEditDuration + ']]';
if (checkDuration(postEditDuration, timestamp, 'post-edit-duration-expired')) {
$(window).trigger('action:composer.post.edit', {
pid: getData(btn, 'data-pid')
});
}
});
postContainer.on('click', '[component="post/delete"]', function() {
var btn = $(this);
var timestamp = parseInt(getData(btn, 'data-timestamp'), 10);
var postDeleteDuration = parseInt(ajaxify.data.postDeleteDuration, 10);
if (checkDuration(postDeleteDuration, timestamp, 'post-delete-duration-expired')) {
togglePostDelete($(this), tid);
}
});
function checkDuration(duration, postTimestamp, languageKey) {
if (!ajaxify.data.privileges.isAdminOrMod && duration && Date.now() - postTimestamp > duration * 1000) {
var numDays = Math.floor(duration / 86400);
var numHours = Math.floor((duration % 86400) / 3600);
var numMinutes = Math.floor(((duration % 86400) % 3600) / 60);
var numSeconds = ((duration % 86400) % 3600) % 60;
var msg = '[[error:' + languageKey + ', ' + duration + ']]';
if (numDays) {
if (numHours) {
msg = '[[error:post-edit-duration-expired-days-hours, ' + numDays + ', ' + numHours + ']]';
msg = '[[error:' + languageKey + '-days-hours, ' + numDays + ', ' + numHours + ']]';
} else {
msg = '[[error:post-edit-duration-expired-days, ' + numDays + ']]';
msg = '[[error:' + languageKey + '-days, ' + numDays + ']]';
}
} else if (numHours) {
if (numMinutes) {
msg = '[[error:post-edit-duration-expired-hours-minutes, ' + numHours + ', ' + numMinutes + ']]';
msg = '[[error:' + languageKey + '-hours-minutes, ' + numHours + ', ' + numMinutes + ']]';
} else {
msg = '[[error:post-edit-duration-expired-hours, ' + numHours + ']]';
msg = '[[error:' + languageKey + '-hours, ' + numHours + ']]';
}
} else if (numMinutes) {
if (numSeconds) {
msg = '[[error:post-edit-duration-expired-minutes-seconds, ' + numMinutes + ', ' + numSeconds + ']]';
msg = '[[error:' + languageKey + '-minutes-seconds, ' + numMinutes + ', ' + numSeconds + ']]';
} else {
msg = '[[error:post-edit-duration-expired-minutes, ' + numMinutes + ']]';
msg = '[[error:' + languageKey + '-minutes, ' + numMinutes + ']]';
}
}
return app.alertError(msg);
app.alertError(msg);
return false;
}
$(window).trigger('action:composer.post.edit', {
pid: getData(btn, 'data-pid')
});
});
postContainer.on('click', '[component="post/delete"]', function() {
togglePostDelete($(this), tid);
});
return true;
}
postContainer.on('click', '[component="post/restore"]', function() {
togglePostDelete($(this), tid);
@ -226,9 +244,9 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator
}
function onReplyClicked(button, tid) {
showStaleWarning(function() {
var selectedText = getSelectedText(button);
var selectedText = getSelectedText(button);
showStaleWarning(function() {
var username = getUserName(button);
if (getData(button, 'data-uid') === '0' || !getData(button, 'data-userslug')) {
username = '';
@ -258,6 +276,8 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator
}
function onQuoteClicked(button, tid) {
var selectedText = getSelectedText(button);
showStaleWarning(function() {
function quote(text) {
@ -274,7 +294,7 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator
var username = getUserName(button);
var pid = getData(button, 'data-pid');
var selectedText = getSelectedText(button);
if (selectedText) {
return quote(selectedText);
}
@ -394,9 +414,9 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator
}
function togglePostDelete(button, tid) {
var pid = getData(button, 'data-pid'),
postEl = components.get('post', 'pid', pid),
action = !postEl.hasClass('deleted') ? 'delete' : 'restore';
var pid = getData(button, 'data-pid');
var postEl = components.get('post', 'pid', pid);
var action = !postEl.hasClass('deleted') ? 'delete' : 'restore';
postAction(action, pid, tid);
}
@ -494,7 +514,7 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator
}
function showStaleWarning(callback) {
if (ajaxify.data.lastposttime >= (Date.now() - (1000 * 60 * 60 * 24 * ajaxify.data.topicStaleDays))) {
if (staleReplyAnyway || ajaxify.data.lastposttime >= (Date.now() - (1000 * 60 * 60 * 24 * ajaxify.data.topicStaleDays))) {
return callback();
}
@ -507,6 +527,7 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator
label: '[[topic:stale.reply_anyway]]',
className: 'btn-link',
callback: function() {
staleReplyAnyway = true;
callback();
}
},

@ -345,10 +345,11 @@ define('forum/topic/posts', [
Posts.showBottomPostBar = function() {
var mainPost = components.get('post', 'index', 0);
var placeHolder = $('.post-bar-placeholder');
var posts = $('[component="post"]');
if (!!mainPost.length && posts.length > 1 && $('.post-bar').length < 2 && $('.post-bar-placeholder').length) {
$('.post-bar').clone().appendTo(mainPost);
$('.post-bar-placeholder').remove();
if (!!mainPost.length && posts.length > 1 && $('.post-bar').length < 2 && placeHolder.length) {
$('.post-bar').clone().insertAfter(placeHolder);
placeHolder.remove();
} else if (mainPost.length && posts.length < 2) {
mainPost.find('.post-bar').remove();
}

@ -67,6 +67,7 @@ define('forum/users', ['translator'], function(translator) {
translated = $(translated);
$('#users-container').append(translated);
translated.find('span.timeago').timeago();
utils.addCommasToNumbers(translated.find('.formatted-number'));
$('#users-container .anon-user').appendTo($('#users-container'));
});
});
@ -101,14 +102,15 @@ define('forum/users', ['translator'], function(translator) {
if (!username) {
return loadPage(page);
}
var activeSection = getActiveSection();
socket.emit('user.search', {
query: username,
page: page,
searchBy: 'username',
sortBy: $('.search select').val() || getSortBy(),
onlineOnly: $('.search .online-only').is(':checked') || (getActiveSection() === 'online'),
bannedOnly: getActiveSection() === 'banned'
onlineOnly: $('.search .online-only').is(':checked') || (activeSection === 'online'),
bannedOnly: activeSection === 'banned',
flaggedOnly: activeSection === 'flagged'
}, function(err, data) {
if (err) {
return app.alertError(err.message);
@ -167,8 +169,8 @@ define('forum/users', ['translator'], function(translator) {
}
function getActiveSection() {
var url = window.location.href,
parts = url.split('/');
var url = window.location.href;
var parts = url.split('/');
return parts[parts.length - 1];
}

@ -37,6 +37,7 @@ define('uploader', ['csrf', 'translator'], function(csrf, translator) {
uploadForm.find('#params').val(JSON.stringify(data.params));
uploadModal.find('#fileUploadSubmitBtn').on('click', function() {
$(this).addClass('disabled');
uploadForm.submit();
});
@ -54,6 +55,9 @@ define('uploader', ['csrf', 'translator'], function(csrf, translator) {
function onSubmit(uploadModal, fileSize, callback) {
function showAlert(type, message) {
module.hideAlerts(uploadModal);
if (type === 'error') {
uploadModal.find('#fileUploadSubmitBtn').removeClass('disabled');
}
uploadModal.find('#alert-' + type).translateText(message).removeClass('hide');
}

@ -141,6 +141,9 @@ helpers.getBaseUser = function(userslug, callerUID, callback) {
isGlobalModerator: function(next) {
user.isGlobalModerator(callerUID, next);
},
isFollowing: function(next) {
user.isFollowing(callerUID, uid, next);
},
profile_links: function(next) {
plugins.fireHook('filter:user.profileLinks', [], next);
}
@ -155,6 +158,7 @@ helpers.getBaseUser = function(userslug, callerUID, callback) {
results.user.theirid = results.user.uid;
results.user.status = user.getStatus(results.user);
results.user.isSelf = parseInt(callerUID, 10) === parseInt(results.user.uid, 10);
results.user.isFollowing = results.isFollowing;
results.user.showHidden = results.user.isSelf || results.isAdmin || results.isGlobalModerator;
results.user.profile_links = filterLinks(results.profile_links, results.user.isSelf);

@ -2,6 +2,7 @@
var async = require('async');
var posts = require('../../posts');
var analytics = require('../../analytics');
var flagsController = {};
@ -13,20 +14,28 @@ flagsController.get = function(req, res, next) {
async.waterfall([
function (next) {
if (byUsername) {
posts.getUserFlags(byUsername, sortBy, req.uid, start, stop, next);
} else {
var set = sortBy === 'count' ? 'posts:flags:count' : 'posts:flagged';
posts.getFlags(set, req.uid, start, stop, next);
}
async.parallel({
posts: function(next) {
if (byUsername) {
posts.getUserFlags(byUsername, sortBy, req.uid, start, stop, next);
} else {
var set = sortBy === 'count' ? 'posts:flags:count' : 'posts:flagged';
posts.getFlags(set, req.uid, start, stop, next);
}
},
analytics: function(next) {
analytics.getDailyStatsForSet('analytics:flags', Date.now(), 30, next);
}
}, next);
}
], function (err, posts) {
], function (err, results) {
if (err) {
return next(err);
}
var data = {
posts: posts,
next: stop + 1,
posts: results.posts,
analytics: results.analytics,
next: stop + 1,
byUsername: byUsername,
title: '[[pages:flagged-posts]]'
};

@ -28,6 +28,10 @@ usersController.noPosts = function(req, res, next) {
getUsersByScore('users:postcount', 'noposts', 0, 0, req, res, next);
};
usersController.flagged = function(req, res, next) {
getUsersByScore('users:flags', 'mostflags', 1, '+inf', req, res, next);
};
usersController.inactive = function(req, res, next) {
var timeRange = 1000 * 60 * 60 * 24 * 30 * (parseInt(req.query.months, 10) || 3);
var cutoff = Date.now() - timeRange;

@ -129,47 +129,93 @@ apiController.renderWidgets = function(req, res, next) {
});
};
apiController.getObject = function(req, res, next) {
apiController.getObjectByType(req.uid, req.params.type, req.params.id, function(err, results) {
if (err) {
return next(err);
apiController.getPostData = function(pid, uid, callback) {
async.parallel({
privileges: function(next) {
privileges.posts.get([pid], uid, next);
},
post: function(next) {
posts.getPostData(pid, next);
}
}, function(err, results) {
if (err || !results.post) {
return callback(err);
}
var post = results.post;
var privileges = results.privileges[0];
res.json(results);
if (!privileges.read || !privileges['topics:read']) {
return callback();
}
post.ip = privileges.isAdminOrMod ? post.ip : undefined;
var selfPost = uid && uid === parseInt(post.uid, 10);
if (post.deleted && !(privileges.isAdminOrMod || selfPost)) {
post.content = '[[topic:post_is_deleted]]';
}
callback(null, post);
});
};
apiController.getObjectByType = function(uid, type, id, callback) {
var methods = {
post: {
canRead: privileges.posts.can,
data: posts.getPostData
},
topic: {
canRead: privileges.topics.can,
data: topics.getTopicData
apiController.getTopicData = function(tid, uid, callback) {
async.parallel({
privileges: function(next) {
privileges.topics.get(tid, uid, next);
},
category: {
canRead: privileges.categories.can,
data: categories.getCategoryData
topic: function(next) {
topics.getTopicData(tid, next);
}
}, function(err, results) {
if (err || !results.topic) {
return callback(err);
}
};
if (!methods[type]) {
return callback();
}
if (!results.privileges.read || !results.privileges['topics:read'] || (parseInt(results.topic.deleted, 10) && !results.privileges.view_deleted)) {
return callback();
}
callback(null, results.topic);
});
};
async.waterfall([
function (next) {
methods[type].canRead('read', id, uid, next);
apiController.getCategoryData = function(cid, uid, callback) {
async.parallel({
privileges: function(next) {
privileges.categories.get(cid, uid, next);
},
function (canRead, next) {
if (!canRead) {
return next(new Error('[[error:no-privileges]]'));
}
methods[type].data(id, next);
category: function(next) {
categories.getCategoryData(cid, next);
}
], callback);
}, function(err, results) {
if (err || !results.category) {
return callback(err);
}
if (!results.privileges.read) {
return callback();
}
callback(null, results.category);
});
};
apiController.getObject = function(req, res, next) {
var methods = {
post: apiController.getPostData,
topic: apiController.getTopicData,
category: apiController.getCategoryData
};
var method = methods[req.params.type];
if (!method) {
return next();
}
method(req.params.id, req.uid, function(err, result) {
if (err || !result) {
return next(err);
}
res.json(result);
});
};
apiController.getUserByUID = function(req, res, next) {

@ -334,10 +334,13 @@ authenticationController.localLogin = function(req, username, password, next) {
function (next) {
async.parallel({
userData: function(next) {
db.getObjectFields('user:' + uid, ['password', 'banned', 'passwordExpiry'], next);
db.getObjectFields('user:' + uid, ['password', 'passwordExpiry'], next);
},
isAdmin: function(next) {
user.isAdministrator(uid, next);
},
banned: function(next) {
user.isBanned(uid, next);
}
}, next);
},
@ -349,13 +352,13 @@ authenticationController.localLogin = function(req, username, password, next) {
if (!result.isAdmin && parseInt(meta.config.allowLocalLogin, 10) === 0) {
return next(new Error('[[error:local-login-disabled]]'));
}
if (!userData || !userData.password) {
return next(new Error('[[error:invalid-user-data]]'));
}
if (userData.banned && parseInt(userData.banned, 10) === 1) {
if (result.banned) {
return next(new Error('[[error:user-banned]]'));
}
Password.compare(password, userData.password, next);
},
function (passwordMatch, next) {

@ -264,7 +264,8 @@ topicsController.get = function(req, res, callback) {
data['downvote:disabled'] = parseInt(meta.config['downvote:disabled'], 10) === 1;
data['feeds:disableRSS'] = parseInt(meta.config['feeds:disableRSS'], 10) === 1;
data.bookmarkThreshold = parseInt(meta.config.bookmarkThreshold, 10) || 5;
data.postEditDuration = parseInt(meta.config.postEditDuration, 10);
data.postEditDuration = parseInt(meta.config.postEditDuration, 10) || 0;
data.postDeleteDuration = parseInt(meta.config.postDeleteDuration, 10) || 0;
data.scrollToMyPost = settings.scrollToMyPost;
data.rssFeedUrl = nconf.get('relative_path') + '/topic/' + data.tid + '.rss';
data.pagination = pagination.create(currentPage, pageCount);

@ -69,6 +69,20 @@ usersController.getBannedUsers = function(req, res, next) {
});
};
usersController.getFlaggedUsers = function(req, res, next) {
usersController.getUsers('users:flags', req.uid, req.query.page, function(err, userData) {
if (err) {
return next(err);
}
if (!userData.isAdminOrGlobalMod) {
return next();
}
render(req, res, userData, next);
});
};
usersController.renderUsersPage = function(set, req, res, next) {
usersController.getUsers(set, req.uid, req.query.page, function(err, userData) {
if (err) {
@ -79,23 +93,16 @@ usersController.renderUsersPage = function(set, req, res, next) {
};
usersController.getUsers = function(set, uid, page, callback) {
var setToTitles = {
'users:postcount': '[[pages:users/sort-posts]]',
'users:reputation': '[[pages:users/sort-reputation]]',
'users:joindate': '[[pages:users/latest]]',
'users:online': '[[pages:users/online]]',
'users:banned': '[[pages:users/banned]]'
};
var setToCrumbs = {
'users:postcount': '[[users:top_posters]]',
'users:reputation': '[[users:most_reputation]]',
'users:joindate': '[[global:users]]',
'users:online': '[[global:online]]',
'users:banned': '[[user:banned]]'
var setToData = {
'users:postcount': {title: '[[pages:users/sort-posts]]', crumb: '[[users:top_posters]]'},
'users:reputation': {title: '[[pages:users/sort-reputation]]', crumb: '[[users:most_reputation]]'},
'users:joindate': {title: '[[pages:users/latest]]', crumb: '[[global:users]]'},
'users:online': {title: '[[pages:users/online]]', crumb: '[[global:online]]'},
'users:banned': {title: '[[pages:users/banned]]', crumb: '[[user:banned]]'},
'users:flags': {title: '[[pages:users/most-flags]]', crumb: '[[users:most_flags]]'},
};
var breadcrumbs = [{text: setToCrumbs[set]}];
var breadcrumbs = [{text: setToData[set].crumb}];
if (set !== 'users:joindate') {
breadcrumbs.unshift({text: '[[global:users]]', url: '/users'});
@ -127,7 +134,7 @@ usersController.getUsers = function(set, uid, page, callback) {
users: results.usersData.users,
pagination: pagination.create(page, pageCount),
userCount: results.usersData.count,
title: setToTitles[set] || '[[pages:users/latest]]',
title: setToData[set].title || '[[pages:users/latest]]',
breadcrumbs: helpers.buildBreadcrumbs(breadcrumbs),
setName: set,
isAdminOrGlobalMod: results.isAdministrator || results.isGlobalMod
@ -148,6 +155,8 @@ usersController.getUsersAndCount = function(set, uid, start, stop, callback) {
db.sortedSetCount('users:online', now - 300000, '+inf', next);
} else if (set === 'users:banned') {
db.sortedSetCard('users:banned', next);
} else if (set === 'users:flags') {
db.sortedSetCard('users:flags', next);
} else {
db.getObjectField('global', 'userCount', next);
}

@ -39,7 +39,9 @@ module.exports = function(Groups) {
}, next);
});
}
], callback);
], function(err) {
callback(err);
});
});
};
};

@ -13,76 +13,76 @@ var db = require('./../database');
module.exports = function(Groups) {
Groups.join = function(groupName, uid, callback) {
function join() {
var tasks = [
async.apply(db.sortedSetAdd, 'group:' + groupName + ':members', Date.now(), uid),
async.apply(db.incrObjectField, 'group:' + groupName, 'memberCount')
];
async.waterfall([
function(next) {
async.parallel({
isAdmin: function(next) {
user.isAdministrator(uid, next);
},
isHidden: function(next) {
Groups.isHidden(groupName, next);
}
}, next);
},
function(results, next) {
if (results.isAdmin) {
tasks.push(async.apply(db.setAdd, 'group:' + groupName + ':owners', uid));
}
if (!results.isHidden) {
tasks.push(async.apply(db.sortedSetIncrBy, 'groups:visible:memberCount', 1, groupName));
}
async.parallel(tasks, next);
},
function(results, next) {
setGroupTitleIfNotSet(groupName, uid, next);
},
function(next) {
plugins.fireHook('action:group.join', {
groupName: groupName,
uid: uid
});
next();
}
], callback);
}
callback = callback || function() {};
if (!groupName) {
return callback(new Error('[[error:invalid-data]]'));
}
Groups.exists(groupName, function(err, exists) {
if (err) {
return callback(err);
}
if (exists) {
return join();
}
Groups.create({
name: groupName,
description: '',
hidden: 1
}, function(err) {
if (err && err.message !== '[[error:group-already-exists]]') {
winston.error('[groups.join] Could not create new hidden group: ' + err.message);
return callback(err);
async.waterfall([
function(next) {
Groups.isMember(uid, groupName, next);
},
function(isMember, next) {
if (isMember) {
return callback();
}
join();
});
});
Groups.exists(groupName, next);
},
function(exists, next) {
if (exists) {
return next();
}
Groups.create({
name: groupName,
description: '',
hidden: 1
}, function(err) {
if (err && err.message !== '[[error:group-already-exists]]') {
winston.error('[groups.join] Could not create new hidden group: ' + err.message);
return callback(err);
}
next();
});
},
function(next) {
async.parallel({
isAdmin: function(next) {
user.isAdministrator(uid, next);
},
isHidden: function(next) {
Groups.isHidden(groupName, next);
}
}, next);
},
function(results, next) {
var tasks = [
async.apply(db.sortedSetAdd, 'group:' + groupName + ':members', Date.now(), uid),
async.apply(db.incrObjectField, 'group:' + groupName, 'memberCount')
];
if (results.isAdmin) {
tasks.push(async.apply(db.setAdd, 'group:' + groupName + ':owners', uid));
}
if (!results.isHidden) {
tasks.push(async.apply(db.sortedSetIncrBy, 'groups:visible:memberCount', 1, groupName));
}
async.parallel(tasks, next);
},
function(results, next) {
setGroupTitleIfNotSet(groupName, uid, next);
},
function(next) {
plugins.fireHook('action:group.join', {
groupName: groupName,
uid: uid
});
next();
}
], callback);
};
function setGroupTitleIfNotSet(groupName, uid, callback) {
if (groupName === 'registered-users') {
if (groupName === 'registered-users' || Groups.isPrivilegeGroup(groupName)) {
return callback();
}
@ -204,38 +204,52 @@ module.exports = function(Groups) {
Groups.leave = function(groupName, uid, callback) {
callback = callback || function() {};
var tasks = [
async.apply(db.sortedSetRemove, 'group:' + groupName + ':members', uid),
async.apply(db.setRemove, 'group:' + groupName + ':owners', uid),
async.apply(db.decrObjectField, 'group:' + groupName, 'memberCount')
];
async.parallel(tasks, function(err) {
if (err) {
return callback(err);
}
plugins.fireHook('action:group.leave', {
groupName: groupName,
uid: uid
});
Groups.getGroupFields(groupName, ['hidden', 'memberCount'], function(err, groupData) {
if (err || !groupData) {
return callback(err);
async.waterfall([
function(next) {
Groups.isMember(uid, groupName, next);
},
function(isMember, next) {
if (!isMember) {
return callback();
}
Groups.exists(groupName, next);
},
function(exists, next) {
if (!exists) {
return callback();
}
async.parallel([
async.apply(db.sortedSetRemove, 'group:' + groupName + ':members', uid),
async.apply(db.setRemove, 'group:' + groupName + ':owners', uid),
async.apply(db.decrObjectField, 'group:' + groupName, 'memberCount')
], next);
},
function(results, next) {
Groups.getGroupFields(groupName, ['hidden', 'memberCount'], next);
},
function(groupData, next) {
if (!groupData) {
return callback();
}
if (parseInt(groupData.hidden, 10) === 1 && parseInt(groupData.memberCount, 10) === 0) {
Groups.destroy(groupName, callback);
Groups.destroy(groupName, next);
} else {
if (parseInt(groupData.hidden, 10) !== 1) {
db.sortedSetAdd('groups:visible:memberCount', groupData.memberCount, groupName, callback);
db.sortedSetAdd('groups:visible:memberCount', groupData.memberCount, groupName, next);
} else {
callback();
next();
}
}
});
});
},
function(next) {
plugins.fireHook('action:group.leave', {
groupName: groupName,
uid: uid
});
next();
}
], callback);
};
Groups.leaveAllGroups = function(uid, callback) {

@ -61,14 +61,14 @@ var async = require('async'),
plugins.fireHook('static:app.reload', {}, next);
},
async.apply(plugins.clearRequireCache),
async.apply(plugins.reload),
async.apply(plugins.reloadRoutes),
async.apply(Meta.css.minify),
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(plugins.reload),
async.apply(plugins.reloadRoutes),
async.apply(auth.reloadRoutes),
function(next) {
Meta.config['cache-buster'] = utils.generateUUID();

@ -1,38 +0,0 @@
var path = require('path');
var sockets = require('path');
var websockets = require('../socket.io/');
var continuationLocalStorage = require('continuation-local-storage');
var APP_NAMESPACE = require(path.join(__dirname, '../../package.json')).name;
var namespace = continuationLocalStorage.createNamespace(APP_NAMESPACE);
(function(cls) {
cls.http = function (req, res, next) {
namespace.run(function() {
namespace.set('request', req);
next && next();
});
};
cls.socket = function (socket, payload, event, next) {
namespace.run(function() {
namespace.set('request', websockets.reqFromSocket(socket, payload, event));
next && next();
});
};
cls.get = function (key) {
return namespace.get(key);
};
cls.set = function (key, value) {
return namespace.set(key, value);
};
cls.setItem = cls.set;
cls.getItem = cls.get;
cls.namespace = namespace;
cls.continuationLocalStorage = continuationLocalStorage;
})(exports);

@ -14,7 +14,6 @@ var meta = require('../meta'),
compression = require('compression'),
favicon = require('serve-favicon'),
session = require('express-session'),
cls = require('./cls'),
useragent = require('express-useragent');
@ -62,7 +61,7 @@ module.exports = function(app) {
if (nconf.get('secure')) {
cookie.secure = true;
}
if (relativePath !== '') {
cookie.path = relativePath;
}
@ -78,7 +77,6 @@ module.exports = function(app) {
app.use(middleware.addHeaders);
app.use(middleware.processRender);
app.use(cls.http);
auth.initialize(app, middleware);
return middleware;

@ -7,29 +7,6 @@ module.exports = function(Plugins) {
Plugins.deprecatedHooks = {
'filter:user.custom_fields': null // remove in v1.1.0
};
Plugins.deprecatedHooksParams = {
'action:homepage.get': '{req, res}',
'filter:register.check': '{req, res}',
'action:user.loggedOut': '{req, res}',
'static:user.loggedOut': '{req, res}',
'filter:categories.build': '{req, res}',
'filter:category.build': '{req, res}',
'filter:group.build': '{req, res}',
'filter:register.build': '{req, res}',
'filter:composer.build': '{req, res}',
'filter:popular.build': '{req, res}',
'filter:recent.build': '{req, res}',
'filter:topic.build': '{req, res}',
'filter:users.build': '{req, res}',
'filter:admin.category.get': '{req, res}',
'filter:middleware.renderHeader': '{req, res}',
'filter:widget.render': '{req, res}',
'filter:middleware.buildHeader': '{req, locals}',
'action:middleware.pageView': '{req}',
'action:meta.override404': '{req}'
};
/*
`data` is an object consisting of (* is required):
`data.hook`*, the name of the NodeBB hook
@ -62,12 +39,6 @@ module.exports = function(Plugins) {
parts.pop();
}
var hook = parts.join(':');
if (Plugins.deprecatedHooksParams[hook]) {
winston.warn('[plugins/' + id + '] Hook `' + hook + '` parameters: `' + Plugins.deprecatedHooksParams[hook] + '`, are being deprecated, '
+ 'all plugins should now use the `middleware/cls` module instead of hook\'s arguments to get a reference to the `http-request` or the `socket-request` object(s) (from which you can get the current `uid` if you need to.) '
+ '- for more info, visit https://docs.nodebb.org/en/latest/plugins/create.html#getting-a-reference-to-each-request-from-within-any-plugin-hook\n');
delete Plugins.deprecatedHooksParams[hook];
}
}
if (data.hook && data.method) {

@ -2,10 +2,10 @@
'use strict';
var async = require('async'),
db = require('../database'),
user = require('../user');
var async = require('async');
var db = require('../database');
var user = require('../user');
var analytics = require('../analytics');
module.exports = function(Posts) {
@ -13,52 +13,59 @@ module.exports = function(Posts) {
if (!parseInt(uid, 10) || !reason) {
return callback();
}
async.parallel({
hasFlagged: async.apply(hasFlagged, post.pid, uid),
exists: async.apply(Posts.exists, post.pid)
}, function(err, results) {
if (err || !results.exists) {
return callback(err || new Error('[[error:no-post]]'));
}
if (results.hasFlagged) {
return callback(new Error('[[error:already-flagged]]'));
}
var now = Date.now();
async.parallel([
function(next) {
db.sortedSetAdd('posts:flagged', now, post.pid, next);
},
function(next) {
db.sortedSetIncrBy('posts:flags:count', 1, post.pid, next);
},
function(next) {
db.incrObjectField('post:' + post.pid, 'flags', next);
},
function(next) {
db.sortedSetAdd('pid:' + post.pid + ':flag:uids', now, uid, next);
},
function(next) {
db.sortedSetAdd('pid:' + post.pid + ':flag:uid:reason', 0, uid + ':' + reason, next);
},
function(next) {
if (parseInt(post.uid, 10)) {
db.sortedSetAdd('uid:' + post.uid + ':flag:pids', now, post.pid, next);
} else {
next();
}
},
function(next) {
if (parseInt(post.uid, 10)) {
db.setAdd('uid:' + post.uid + ':flagged_by', uid, next);
} else {
next();
}
async.waterfall([
function(next) {
async.parallel({
hasFlagged: async.apply(hasFlagged, post.pid, uid),
exists: async.apply(Posts.exists, post.pid)
}, next);
},
function(results, next) {
if (!results.exists) {
return next(new Error('[[error:no-post]]'));
}
if (results.hasFlagged) {
return next(new Error('[[error:already-flagged]]'));
}
], function(err) {
callback(err);
});
var now = Date.now();
async.parallel([
function(next) {
db.sortedSetAdd('posts:flagged', now, post.pid, next);
},
function(next) {
db.sortedSetIncrBy('posts:flags:count', 1, post.pid, next);
},
function(next) {
db.incrObjectField('post:' + post.pid, 'flags', next);
},
function(next) {
db.sortedSetAdd('pid:' + post.pid + ':flag:uids', now, uid, next);
},
function(next) {
db.sortedSetAdd('pid:' + post.pid + ':flag:uid:reason', 0, uid + ':' + reason, next);
},
function(next) {
if (parseInt(post.uid, 10)) {
async.parallel([
async.apply(db.sortedSetIncrBy, 'users:flags', 1, post.uid),
async.apply(db.incrObjectField, 'user:' + post.uid, 'flags'),
async.apply(db.sortedSetAdd, 'uid:' + post.uid + ':flag:pids', now, post.pid)
], next);
} else {
next();
}
}
], next);
}
], function(err) {
if (err) {
return callback(err);
}
analytics.increment('flags');
callback();
});
};
@ -67,45 +74,58 @@ module.exports = function(Posts) {
}
Posts.dismissFlag = function(pid, callback) {
var uid;
async.parallel([
async.waterfall([
function(next) {
db.getObjectField('post:' + pid, 'uid', function(err, _uid) {
if (err) {
return next(err);
}
uid = _uid;
db.sortedSetsRemove([
'posts:flagged',
'posts:flags:count',
'uid:' + uid + ':flag:pids'
], pid, next);
});
db.getObjectFields('post:' + pid, ['pid', 'uid', 'flags'], next);
},
function(next) {
async.series([
function(postData, next) {
if (!postData.pid) {
return callback();
}
async.parallel([
function(next) {
db.getSortedSetRange('pid:' + pid + ':flag:uids', 0, -1, function(err, uids) {
async.each(uids, function(uid, next) {
var nid = 'post_flag:' + pid + ':uid:' + uid;
if (parseInt(postData.uid, 10)) {
if (parseInt(postData.flags, 10) > 0) {
async.parallel([
async.apply(db.delete, 'notifications:' + nid),
async.apply(db.sortedSetRemove, 'notifications', 'post_flag:' + pid + ':uid:' + uid)
async.apply(db.sortedSetIncrBy, 'users:flags', -postData.flags, postData.uid),
async.apply(db.incrObjectFieldBy, 'user:' + postData.uid, 'flags', -postData.flags)
], next);
}, next);
});
} else {
next();
}
}
},
async.apply(db.delete, 'pid:' + pid + ':flag:uids')
function(next) {
db.sortedSetsRemove([
'posts:flagged',
'posts:flags:count',
'uid:' + postData.uid + ':flag:pids'
], pid, next);
},
function(next) {
async.series([
function(next) {
db.getSortedSetRange('pid:' + pid + ':flag:uids', 0, -1, function(err, uids) {
async.each(uids, function(uid, next) {
var nid = 'post_flag:' + pid + ':uid:' + uid;
async.parallel([
async.apply(db.delete, 'notifications:' + nid),
async.apply(db.sortedSetRemove, 'notifications', 'post_flag:' + pid + ':uid:' + uid)
], next);
}, next);
});
},
async.apply(db.delete, 'pid:' + pid + ':flag:uids')
], next);
},
async.apply(db.deleteObjectField, 'post:' + pid, 'flags'),
async.apply(db.delete, 'pid:' + pid + ':flag:uid:reason')
], next);
},
async.apply(db.deleteObjectField, 'post:' + pid, 'flags'),
async.apply(db.delete, 'pid:' + pid + ':flag:uid:reason')
], function(err) {
callback(err);
});
function(results, next) {
db.sortedSetsRemoveRangeByScore(['users:flags'], '-inf', 0, next);
}
], callback);
};
Posts.dismissAllFlags = function(callback) {
@ -113,7 +133,16 @@ module.exports = function(Posts) {
if (err) {
return callback(err);
}
async.eachLimit(pids, 50, Posts.dismissFlag, callback);
async.eachSeries(pids, Posts.dismissFlag, callback);
});
};
Posts.dismissUserFlags = function(uid, callback) {
db.getSortedSetRange('uid:' + uid + ':flag:pids', 0, -1, function(err, pids) {
if (err) {
return callback(err);
}
async.eachSeries(pids, Posts.dismissFlag, callback);
});
};

@ -31,7 +31,6 @@ 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);
@ -67,8 +66,8 @@ module.exports = function(Posts) {
content = content.slice(0, current.index + 6) + absolute + content.slice(current.index + 6 + current[1].length);
}
} catch(err) {
winston.verbose(err.messsage);
}
winston.verbose(err.messsage);
}
}
}

@ -118,6 +118,7 @@ module.exports = function(Posts) {
var cids = topics.map(function(topic) {
if (topic) {
topic.title = validator.escape(topic.title);
topic.deleted = parseInt(topic.deleted, 10) === 1;
}
return topic && topic.cid;
}).filter(function(topic, index, array) {
@ -145,4 +146,4 @@ module.exports = function(Posts) {
}
return content;
}
};
};

@ -34,10 +34,10 @@ module.exports = function(Posts) {
return next(new Error('[[error:post-already-restored]]'));
}
privileges.posts.canEdit(pid, uid, next);
privileges.posts.canDelete(pid, uid, next);
},
function (canEdit, next) {
if (!canEdit) {
function (canDelete, next) {
if (!canDelete) {
return next(new Error('[[error:no-privileges]]'));
}

@ -19,17 +19,20 @@ module.exports = function(privileges) {
return callback(null, []);
}
async.parallel({
isAdmin: function(next){
user.isAdministrator(uid, next);
},
isModerator: function(next) {
posts.isModerator(pids, uid, next);
async.waterfall([
function(next) {
posts.getCidsByPids(pids, next);
},
isOwner: function(next) {
posts.isOwner(pids, uid, next);
function(cids, next) {
async.parallel({
isAdmin: async.apply(user.isAdministrator, uid),
isModerator: async.apply(posts.isModerator, pids, uid),
isOwner: async.apply(posts.isOwner, pids, uid),
'topics:read': async.apply(helpers.isUserAllowedTo, 'topics:read', uid, cids),
read: async.apply(helpers.isUserAllowedTo, 'read', uid, cids),
}, next);
}
}, function(err, results) {
], function(err, results) {
if (err) {
return callback(err);
}
@ -37,11 +40,16 @@ module.exports = function(privileges) {
var privileges = [];
for (var i=0; i<pids.length; ++i) {
var editable = results.isAdmin || results.isModerator[i] || results.isOwner[i];
var isAdminOrMod = results.isAdmin || results.isModerator[i];
var editable = isAdminOrMod || results.isOwner[i];
privileges.push({
editable: editable,
view_deleted: editable,
move: results.isAdmin || results.isModerator[i]
move: isAdminOrMod,
isAdminOrMod: isAdminOrMod,
'topics:read': results['topics:read'][i] || isAdminOrMod,
read: results.read[i] || isAdminOrMod
});
}
@ -150,6 +158,38 @@ module.exports = function(privileges) {
});
};
privileges.posts.canDelete = function(pid, uid, callback) {
var postData;
async.waterfall([
function(next) {
posts.getPostFields(pid, ['tid', 'timestamp'], next);
},
function(_postData, next) {
postData = _postData;
async.parallel({
isAdminOrMod: async.apply(isAdminOrMod, pid, uid),
isLocked: async.apply(topics.isLocked, postData.tid),
isOwner: async.apply(posts.isOwner, pid, uid)
}, next);
}
], function(err, results) {
if (err) {
return callback(err);
}
if (results.isAdminOrMod) {
return callback(null, true);
}
if (results.isLocked) {
return callback(new Error('[[error:topic-locked]]'));
}
var postDeleteDuration = parseInt(meta.config.postDeleteDuration, 10);
if (postDeleteDuration && (Date.now() - parseInt(postData.timestamp, 10) > postDeleteDuration * 1000)) {
return callback(new Error('[[error:post-delete-duration-expired, ' + meta.config.postDeleteDuration + ']]'));
}
callback(null, results.isOwner);
});
};
privileges.posts.canMove = function(pid, uid, callback) {
posts.isMain(pid, function(err, isMain) {
if (err || isMain) {

@ -65,6 +65,7 @@ function addRoutes(router, middleware, controllers) {
router.get('/manage/users/not-validated', middlewares, controllers.admin.users.notValidated);
router.get('/manage/users/no-posts', middlewares, controllers.admin.users.noPosts);
router.get('/manage/users/inactive', middlewares, controllers.admin.users.inactive);
router.get('/manage/users/flagged', middlewares, controllers.admin.users.flagged);
router.get('/manage/users/banned', middlewares, controllers.admin.users.banned);
router.get('/manage/registration', middlewares, controllers.admin.users.registrationQueue);

@ -75,6 +75,7 @@ function userRoutes(app, middleware, controllers) {
setupPageRoute(app, '/users/sort-posts', middleware, middlewares, controllers.users.getUsersSortedByPosts);
setupPageRoute(app, '/users/sort-reputation', middleware, middlewares, controllers.users.getUsersSortedByReputation);
setupPageRoute(app, '/users/banned', middleware, middlewares, controllers.users.getBannedUsers);
setupPageRoute(app, '/users/flagged', middleware, middlewares, controllers.users.getFlaggedUsers);
}
function groupRoutes(app, middleware, controllers) {

@ -185,25 +185,15 @@ User.search = function(socket, data, callback) {
return user && user.uid;
});
async.parallel({
users: function(next) {
user.getUsersFields(uids, ['email'], next);
},
flagCounts: function(next) {
var sets = uids.map(function(uid) {
return 'uid:' + uid + ':flagged_by';
});
db.setsCount(sets, next);
}
}, function(err, results) {
user.getUsersFields(uids, ['email', 'flags'], function(err, userInfo) {
if (err) {
return callback(err);
}
userData.forEach(function(user, index) {
if (user) {
user.email = (results.users[index] && results.users[index].email) || '';
user.flags = results.flagCounts[index] || 0;
if (user && userInfo[index]) {
user.email = userInfo[index].email || '';
user.flags = userInfo[index].flags || 0;
}
});

@ -193,7 +193,7 @@ SocketCategories.isModerator = function(socket, cid, callback) {
};
SocketCategories.getCategory = function(socket, cid, callback) {
apiController.getObjectByType(socket.uid, 'category', cid, callback);
apiController.getCategoryData(cid, socket.uid, callback);
};
module.exports = SocketCategories;

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save