Merge commit 'd839f291ac7d54088c4d09c43af0a75bff92cc27' into weekly

This commit is contained in:
NodeBB Misty
2016-05-30 16:00:18 -04:00
95 changed files with 700 additions and 422 deletions

View File

@@ -171,7 +171,7 @@ function forkWorker(index, isPrimary) {
}
process.env.isPrimary = isPrimary;
process.env.isCluster = true;
process.env.isCluster = ports.length > 1 ? true : false;
process.env.port = ports[index];
var worker = fork('app.js', [], {

View File

@@ -37,6 +37,7 @@
"html-to-text": "2.0.0",
"ip": "1.1.2",
"jimp": "0.2.21",
"json-2-csv": "^2.0.22",
"less": "^2.0.0",
"logrotate-stream": "^0.2.3",
"lru-cache": "4.0.0",
@@ -47,17 +48,17 @@
"morgan": "^1.3.2",
"mousetrap": "^1.5.3",
"nconf": "~0.8.2",
"nodebb-plugin-composer-default": "3.0.31",
"nodebb-plugin-composer-default": "4.0.2",
"nodebb-plugin-dbsearch": "1.0.1",
"nodebb-plugin-emoji-one": "1.1.3",
"nodebb-plugin-emoji-extended": "1.1.0",
"nodebb-plugin-emoji-one": "1.1.3",
"nodebb-plugin-markdown": "5.1.5",
"nodebb-plugin-mentions": "1.1.1",
"nodebb-plugin-soundpack-default": "0.1.6",
"nodebb-plugin-spam-be-gone": "0.4.6",
"nodebb-rewards-essentials": "0.0.8",
"nodebb-theme-lavender": "3.0.12",
"nodebb-theme-persona": "4.0.142",
"nodebb-theme-lavender": "3.0.13",
"nodebb-theme-persona": "4.0.146",
"nodebb-theme-vanilla": "5.0.78",
"nodebb-widget-essentials": "2.0.9",
"nodemailer": "2.0.0",
@@ -117,4 +118,4 @@
"url": "https://github.com/barisusakli"
}
]
}
}

View File

@@ -18,9 +18,6 @@
"upvoted_your_post_in_multiple": "<strong>%1</strong> and %2 others have upvoted your post in <strong>%3</strong>.",
"moved_your_post": "<strong>%1</strong> has moved your post to <strong>%2</strong>",
"moved_your_topic": "<strong>%1</strong> has moved <strong>%2</strong>",
"favourited_your_post_in": "<strong>%1</strong> has bookmarked your post in <strong>%2</strong>.",
"favourited_your_post_in_dual": "<strong>%1</strong> and <strong>%2</strong> have bookmarked your post in <strong>%3</strong>.",
"favourited_your_post_in_multiple": "<strong>%1</strong> and %2 others have bookmarked your post in <strong>%3</strong>.",
"user_flagged_post_in": "<strong>%1</strong> flagged a post in <strong>%2</strong>",
"user_flagged_post_in_dual": "<strong>%1</strong> and <strong>%2</strong> flagged a post in <strong>%3</strong>",
"user_flagged_post_in_multiple": "<strong>%1</strong> and %2 others flagged a post in <strong>%3</strong>",

View File

@@ -2,14 +2,14 @@
"category": "Categoría",
"subcategories": "Subcategorías",
"new_topic_button": "Nuevo tema",
"guest-login-post": "Acceder para poder escribir un mensaje",
"guest-login-post": "Accede para poder escribir un mensaje",
"no_topics": "<strong>No hay temas en esta categoría.</strong><br />¿Por qué no te animas y publicas uno?",
"browsing": "viendo ahora",
"no_replies": "Nadie ha respondido aún",
"no_new_posts": "No hay mensajes nuevos.",
"share_this_category": "Compartir esta categoría",
"watch": "Seguir",
"ignore": "Ignorar",
"watch": "Siguiendo",
"ignore": "Ignorando",
"watch.message": "Ahora estás viendo actualizaciones de esta categoría",
"ignore.message": "Ahora estás ignorando las actualizaciones de esta categoría",
"watched-categories": "Categorías seguidas"

View File

@@ -14,7 +14,7 @@
"invalid-password": "Contraseña no válida",
"invalid-username-or-password": "Por favor especifica tanto un usuario como contraseña",
"invalid-search-term": "Término de búsqueda inválido",
"csrf-invalid": "We were unable to log you in, likely due to an expired session. Please try again",
"csrf-invalid": "El acceso ha fallado porque tu sesión ha expirado. Por favor prueba otra vez.",
"invalid-pagination-value": "Número de página inválido, debe estar entre %1 y %2",
"username-taken": "Nombre de usuario ocupado",
"email-taken": "Correo electrónico ocupado",

View File

@@ -49,7 +49,7 @@
"users": "Usuarios",
"topics": "Temas",
"posts": "Posts",
"best": "Mejor",
"best": "Mejor valorados",
"upvoted": "Votado positivamente",
"downvoted": "Votado negativamente",
"views": "Visitas",
@@ -59,7 +59,7 @@
"posted_ago_by_guest": "publicado %1 por Invitado",
"posted_ago_by": "publicado %1 por %2",
"posted_ago": "publicado %1",
"posted_in": "Publicado %1",
"posted_in": "publicado en %1",
"posted_in_by": "publicado en %1 por %2",
"posted_in_ago": "publicado en %1 %2",
"posted_in_ago_by": "publicado en %1 %2 por %3",

View File

@@ -23,8 +23,8 @@
"groups": "Grupos",
"group": "Grupo de %1",
"chats": "Chats",
"chat": "Chateando con %1",
"account/edit": "Editando \"%1\"",
"chat": "Chatear con %1",
"account/edit": "Editar \"%1\"",
"account/edit/password": "Editar contraseña de \"%1\"",
"account/edit/username": "Editar nombre de usuario de \"%1\"",
"account/edit/email": "Editar email \"%1\"",

View File

@@ -32,7 +32,7 @@
"deleted_message": "Este tema ha sido borrado. Solo los usuarios que tengan privilegios de administración de temas pueden verlo.",
"following_topic.message": "Ahora recibiras notificaciones cuando alguien publique en este tema.",
"not_following_topic.message": "No recibiras notificaciones de este tema.",
"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": "Ya no verás este tema en no leídos. Serás notificado si te mencionan o te votan.",
"login_to_subscribe": "Por favor, conéctate para subscribirte a este tema.",
"markAsUnreadForAll.success": "Publicación marcada como no leída para todos.",
"mark_unread": "Marcar no leído",
@@ -42,12 +42,12 @@
"watch.title": "Serás notificado cuando haya nuevas respuestas en este tema",
"unwatch.title": "Dejar de seguir este tema",
"share_this_post": "Compartir este 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": "Siguiendo",
"not-watching": "No siguiendo",
"ignoring": "Ignorando",
"watching.description": "Notificarme de nuevas respuestas.<br/>Mostrar tema en no leídos. ",
"not-watching.description": "No notificarme de nuevas respuestas.<br/>Mostrar tema en no leídos si sigo esa categoría. ",
"ignoring.description": "No notificarme de nuevas respuestas.<br/>No mostrar tema en no leídos. ",
"thread_tools.title": "Herramientas",
"thread_tools.markAsUnreadForAll": "Marcar no leído",
"thread_tools.pin": "Adherir tema",

View File

@@ -2,13 +2,13 @@
"banned": "Baneado",
"offline": "Desconectado",
"username": "Nombre de usuario",
"joindate": "Fecha de Registro",
"joindate": "Fecha de registro",
"postcount": "Número De Publicaciones",
"email": "Correo electrónico",
"confirm_email": "Confirmar correo electrónico",
"ban_account": "Banear Cuenta",
"ban_account": "Banear cuenta",
"ban_account_confirm": "Quieres confirmar el baneo de este usuario?",
"unban_account": "Desbanear Cuenta",
"unban_account": "Desbanear cuenta",
"delete_account": "Eliminar cuenta",
"delete_account_confirm": "¿Estás seguro de que quieres eliminar tu cuenta? <br /><strong>Esta acción es irreversible y no podrás recuperar ninguno de tus datos.</strong><br /><br />Introduce tu nombre de usuario para confirmar la eliminación de la cuenta.",
"delete_this_account_confirm": "Esta seguro de eliminar este usuario? <br /><strong>Esta acción de irreversible y no podrás recuperar ningún dato</strong><br /><br />",
@@ -30,7 +30,7 @@
"signature": "Firma",
"birthday": "Cumpleaños",
"chat": "Chat",
"chat_with": "Chateando con %1",
"chat_with": "Chatear con %1",
"follow": "Seguir",
"unfollow": "Dejar de seguir",
"more": "Más",
@@ -90,20 +90,20 @@
"notification_sounds": "Reproducir un sonido al recibir una notificación",
"browsing": "Preferencias de navegación.",
"open_links_in_new_tab": "Abrir los enlaces externos en una nueva pestaña",
"enable_topic_searching": "Activar la búsqueda \"in-topic\"",
"topic_search_help": "Si está activada, la búsqueda 'in-topic' sustituirá el comportamiento por defecto del navegador y le permitirá buscar en el tema al completo, en vez de hacer una búsqueda únicamente sobre el contenido mostrado en pantalla",
"enable_topic_searching": "Activar la búsqueda \"dentro del tema\"",
"topic_search_help": "Si está activada, la búsqueda 'dentro del tema' al usar el buscador de la barra de navegación automáticamente buscaras solo en el tema actual.",
"delay_image_loading": "Retrasar la carga de imágenes",
"image_load_delay_help": "Si se habilita, las imágenes no cargarán hasta que se vean en pantalla",
"scroll_to_my_post": "Luego de enviar una respuesta, mostrar el nuevo mensaje",
"follow_topics_you_reply_to": "Seguir los temas en los que respondes",
"follow_topics_you_create": "Seguir publicaciones que creas",
"grouptitle": "Título del Grupo",
"grouptitle": "Título del grupo",
"no-group-title": "Sin título de grupo",
"select-skin": "Seleccionar una plantilla",
"select-homepage": "Seleccione una Página de inicio",
"select-homepage": "Seleccione una página de inicio",
"homepage": "Página de inicio",
"homepage_description": "Seleccione una página para su uso habitual como la página principal del foro o 'Ninguno' para utilizar la página de inicio.",
"custom_route": "Modificar página de ruta",
"custom_route": "Pagina de inicio personalizada",
"custom_route_help": "Introduzca un nombre de ruta aquí, sin ninguna barra anterior (por ejemplo, \"reciente\", o \"popular\")",
"sso.title": "Servicios de Inicio de sesión Único",
"sso.associated": "Asociado con",

View File

@@ -24,7 +24,7 @@
"digest.day": "päev",
"digest.week": "nädal",
"digest.month": "kuu",
"digest.subject": "Digest for %1",
"digest.subject": "Ima 1% jaoks",
"notif.chat.subject": "Sulle on saabunud uus sõnum kasutajalt %1",
"notif.chat.cta": "Vajuta siia, et jätkata vestlusega",
"notif.chat.unsub.info": "See chat teavitus on saadetud teile tellimuse seadistuse tõttu.",

View File

@@ -14,7 +14,7 @@
"invalid-password": "Vigane parool",
"invalid-username-or-password": "Palun täpsusta kasutajanime ja parooli",
"invalid-search-term": "Vigane otsingusõna",
"csrf-invalid": "We were unable to log you in, likely due to an expired session. Please try again",
"csrf-invalid": "Me ei saanud Sind sisse logida, võimalik, et tänu aegunud sessioonile, palun proovi uuesti",
"invalid-pagination-value": "Väär lehekülje numeratsioon, peab olema vähemalt %1 ja kõige rohkem %2",
"username-taken": "Kasutajanimi on juba võetud",
"email-taken": "Email on võetud",
@@ -23,13 +23,13 @@
"no-email-to-confirm": "See foorum nõuab emaili kinnitust, palun vajuta siia, et sisestada email",
"email-confirm-failed": "Meil ei õnnestunud sinu emaili kinnitada, proovi hiljem uuesti.",
"confirm-email-already-sent": "Kinnituskiri on juba saadetud, palun oota %1 minut(it) uue kirja saatmiseks.",
"sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.",
"sendmail-not-found": "Sendmail'i käivitatavat ei leitud, palun tee kindlaks, et see on installeeritud ja on käivitatav kasutaja poolt, kes käitab NodeBB't.",
"username-too-short": "Kasutajanimi on liiga lühike",
"username-too-long": "Kasutajanimi on liiga pikk",
"password-too-long": "Parool liiga pikk",
"user-banned": "Kasutaja bannitud",
"user-too-new": "Vabandust, te peate ootama %1 sekund(it) enne esimese postituse loomist.",
"blacklisted-ip": "Sorry, your IP address has been banned from this community. If you feel this is in error, please contact an administrator.",
"blacklisted-ip": "Vabandust! Sinu IP-aadress on siin kogukonnas keelatud. Kui arvad, et see on eksitus, palun leia kontakti administraatoriga.",
"no-category": "Kategooriat ei eksisteeri",
"no-topic": "Teemat ei eksisteeri",
"no-post": "Postitust ei eksisteeri",
@@ -53,8 +53,8 @@
"still-uploading": "Palun oota, kuni üleslaadimised on laetud.",
"file-too-big": "Maksimaalne üleslaetava faili suurus on %1 kB - valige väiksema mahuga fail.",
"guest-upload-disabled": "Külaliste üleslaadimine on keelatud.",
"already-favourited": "You have already bookmarked this post",
"already-unfavourited": "You have already unbookmarked this post",
"already-favourited": "Sa oled juba selle postituse järjehoidjatesse pannud.",
"already-unfavourited": "Sa oled juba selle postituse järjehoidjatest ära võtnud.",
"cant-ban-other-admins": "Sa ei saa bannida teisi administraatoreid!",
"cant-remove-last-admin": "Te olete ainus administraator. Lisage keegi teine administraatoriks, enne kui eemaldate endalt administraatori.",
"invalid-image-type": "Vigane pildi formaat. Lubatud formaadid on: %1",
@@ -87,7 +87,7 @@
"cant-edit-chat-message": "Sul ei ole lubatud antud sõnumit muuta",
"cant-remove-last-user": "Sa ei saa viimast kasutajat eemaldada",
"cant-delete-chat-message": "Sul ei ole lubatud antud sõnumit kustutada",
"already-voting-for-this-post": "You have already voted for this post.",
"already-voting-for-this-post": "Sa oled juba hääletanud sellel postitusel.",
"reputation-system-disabled": "Reputatsiooni süsteem ei ole aktiveeritud",
"downvoting-disabled": "Negatiivsete häälte andmine ei ole võimaldatud",
"not-enough-reputation-to-downvote": "Sul ei ole piisavalt reputatsiooni, et anda negatiivset hinnangut sellele postitusele.",
@@ -101,6 +101,6 @@
"invite-maximum-met": "Sa oled kutsunud maksimaalse lubatud inimeste arvu (%1 %2 'st).",
"no-session-found": "Sisse logimis sessiooni ei leitud!",
"not-in-room": "Kasutaja pole ruumis",
"no-users-in-room": "No users in this room",
"cant-kick-self": "You can't kick yourself from the group"
"no-users-in-room": "Ühtegi kasutajat ei leidu siit ruumist",
"cant-kick-self": "Sa ei saa ennast ära visata gruppist"
}

View File

@@ -87,8 +87,8 @@
"map": "Kaart",
"sessions": "Logitud Sessioonid",
"ip_address": "IP Aadress",
"enter_page_number": "Enter page number",
"upload_file": "Upload file",
"upload": "Upload",
"allowed-file-types": "Allowed file types are %1"
"enter_page_number": "Sisesta lehekülje number",
"upload_file": "Lae fail üles",
"upload": "Lae üles",
"allowed-file-types": "Lubatud faili formaadid on %1"
}

View File

@@ -41,7 +41,7 @@
"details.hidden": "Peidetud",
"details.hidden_help": "Kui sisse lülitatud, siis seda gruppi ei kuvata gruppide nimekirjas ning liikmed tuleb lisada manuaalselt",
"details.delete_group": "Kustuta grupp",
"details.private_system_help": "Private groups is disabled at system level, this option does not do anything",
"details.private_system_help": "Privaatset gruppid on keelatud sellel süsteemi tasemel, see sätte ei tee midagi",
"event.updated": "Grupi lisainformatsiooni on uuendatud",
"event.deleted": "Grupp \"%1\" on kustutatud",
"membership.accept-invitation": "Võta kutse vastu",
@@ -50,5 +50,5 @@
"membership.leave-group": "Lahku grupist",
"membership.reject": "Lükka tagasi",
"new-group.group_name": "Grupi nimi:",
"upload-group-cover": "Upload group cover"
"upload-group-cover": "Lae gruppi pilt üles"
}

View File

@@ -5,7 +5,7 @@
"remember_me": "Mäleta mind?",
"forgot_password": "Unustasid parooli?",
"alternative_logins": "Alternatiivsed sisse logimise võimalused",
"failed_login_attempt": "Login Unsuccessful",
"failed_login_attempt": "Sisselogimine ebaõnnestus",
"login_successful": "Edukalt sisse logitud!",
"dont_have_account": "Pole veel kasutajat?"
}

View File

@@ -6,7 +6,7 @@
"chat.user_typing": "%1 kirjutab sõnumit...",
"chat.user_has_messaged_you": "%1 saatis sulle sõnumi.",
"chat.see_all": "Vaata kõiki vestluseid",
"chat.mark_all_read": "Mark all chats read",
"chat.mark_all_read": "Märgi kõik jutud loetuks",
"chat.no-messages": "Vali sõnumisaaja, et vaadata sõnumite ajalugu.",
"chat.no-users-in-room": "Ühtki kasutajat selles ruumis",
"chat.recent-chats": "Hiljutised vestlused",
@@ -29,14 +29,14 @@
"composer.submit_and_lock": "Kinnita ja Lukusta",
"composer.toggle_dropdown": "Aktiveeri rippmenüü",
"composer.uploading": "%1 Üleslaadimine",
"composer.formatting.bold": "Bold",
"composer.formatting.italic": "Italic",
"composer.formatting.list": "List",
"composer.formatting.strikethrough": "Strikethrough",
"composer.formatting.bold": "Paksult",
"composer.formatting.italic": "Kaldkiri",
"composer.formatting.list": "Nimekiri",
"composer.formatting.strikethrough": "Läbitõmmatud",
"composer.formatting.link": "Link",
"composer.formatting.picture": "Picture",
"composer.upload-picture": "Upload Image",
"composer.upload-file": "Upload File",
"composer.formatting.picture": "Pilt",
"composer.upload-picture": "Lae pilt üles",
"composer.upload-file": "Lae fail üles",
"bootbox.ok": "Olgu",
"bootbox.cancel": "Katkesta",
"bootbox.confirm": "Kinnita",

View File

@@ -16,9 +16,9 @@
"upvoted_your_post_in_multiple": "<strong>%1</strong> ja %2 teist on kiitnud sinu postituse heaks: <strong>%3</strong>.",
"moved_your_post": "<strong>%1</strong> liigutas sinu postituse <strong>%2 'sse</strong>",
"moved_your_topic": "<strong>%1</strong> liigutas <strong>%2</strong>",
"favourited_your_post_in": "<strong>%1</strong> has bookmarked your post in <strong>%2</strong>.",
"favourited_your_post_in_dual": "<strong>%1</strong> and <strong>%2</strong> have bookmarked your post in <strong>%3</strong>.",
"favourited_your_post_in_multiple": "<strong>%1</strong> and %2 others have bookmarked your post in <strong>%3</strong>.",
"favourited_your_post_in": "<strong>%1</strong> pani Sinu postituse <strong>%2</strong> järjehoidjatesse.",
"favourited_your_post_in_dual": "<strong>%1</strong> ja <strong>%2</strong> panid Sinu postituse <strong>%3</strong> enda järjehoidjatesse.",
"favourited_your_post_in_multiple": "<strong>%1</strong> ja %2 teist on Sinu postitust <strong>%3</strong> järjehoidjasse lisanud.",
"user_flagged_post_in": "<strong>%1</strong> raporteeris postitust <strong>%2</strong>",
"user_flagged_post_in_dual": "<strong>%1</strong> ja <strong>%2</strong> märgistasid postituse: <strong>%3</strong>",
"user_flagged_post_in_multiple": "<strong>%1</strong> ja %2 teist märgistasid postituse: <strong>%3</strong>",
@@ -30,7 +30,7 @@
"user_started_following_you_dual": "<strong>%1</strong> ja <strong>%2</strong> hakkasid sind jälgima.",
"user_started_following_you_multiple": "<strong>%1</strong> ja %2 hakkasid sind jälgima.",
"new_register": "<strong>%1</strong> saatis registreerimistaotluse.",
"new_register_multiple": "There are <strong>%1</strong> registration requests awaiting review.",
"new_register_multiple": "<strong>%1</strong> registreerimistaotlust ootavad ülevaadet.",
"email-confirmed": "Emaili aadress kinnitatud",
"email-confirmed-message": "Täname, et kinnitasite oma emaili aadressi. Teie kasutaja on nüüd täielikult aktiveeritud.",
"email-confirm-error-message": "Emaili aadressi kinnitamisel tekkis viga. Võibolla kinnituskood oli vale või aegunud.",

View File

@@ -33,13 +33,13 @@
"account/posts": "Postitused, mis on tehtud kasutaja %1 poolt",
"account/topics": "Teemad on kirjutanud %1",
"account/groups": "Kasutaja %1 grupid",
"account/favourites": "%1's Bookmarked Posts",
"account/favourites": "%1 järjehoidjad",
"account/settings": "Kasutaja sätted",
"account/watched": "Teemasid jälgib %1 kasutajat",
"account/upvoted": "Postitused %1 poolt heaks kiidetud",
"account/downvoted": "Postitused %1 poolt vastu hääletatud",
"account/best": "Parimad postitused %1 poolt",
"confirm": "Email Confirmed",
"confirm": "Emaili aadress kinnitatud",
"maintenance.text": "%1 foorumil on käimas hooldustööd. Palun külastage meid mõne aja pärast uuesti.",
"maintenance.messageIntro": "Administraator on jätnud ka omaltpoolt sõnumi:",
"throttled.text": "%1 ei ole hetkel kättesaadav liigse koormuse tõttu. Palun tulge tagasi mõni teine kord."

View File

@@ -26,13 +26,13 @@
"tools": "Tööriistad",
"flag": "Märgista",
"locked": "Lukustatud",
"bookmark_instructions": "Click here to return to the last read post in this thread.",
"bookmark_instructions": "Vajuta siia, et tagasi minna viimati loetud postituse juurde siin teemas.",
"flag_title": "Märgista see postitus modereerimiseks",
"flag_success": "See postitus on nüüd märgistatud modereerimiseks.",
"deleted_message": "See teema on kustutatud. Ainult kasutajad kellel on piisavalt õigusi saavad seda näha.",
"following_topic.message": "Sulle ei edastata enam teateid uutest postitustest kui keegi postitab siia teemasse.",
"not_following_topic.message": "Sulle ei edastata enam teateid uutest postitustest siin teemas.",
"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": "Sa ei näe seda teemat enam lugemata teemade nimekirjas. Sind teavitatakse, kui Sind mainitakse või Sinu postitust kiidetakse heaks.",
"login_to_subscribe": "Palun registreeru kasutajaks või logi sisse, et tellida teateid selle postituse kohta.",
"markAsUnreadForAll.success": "Teema märgitud mitte-loetuks kõikidele.",
"mark_unread": "Märgi lugematuks",
@@ -42,9 +42,9 @@
"watch.title": "Saa teateid uutest postitustest siin teemas",
"unwatch.title": "Ära järgi enam seda teemat",
"share_this_post": "Jaga seda postitust",
"watching": "Watching",
"not-watching": "Not Watching",
"ignoring": "Ignoring",
"watching": "Vaatan",
"not-watching": "Ei vaata",
"ignoring": "Ignoreerin",
"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.",
@@ -72,9 +72,9 @@
"disabled_categories_note": "Kinnised kategooriad on hallid",
"confirm_move": "Liiguta",
"confirm_fork": "Fork",
"favourite": "Bookmark",
"favourites": "Bookmarks",
"favourites.has_no_favourites": "You haven't bookmarked any posts yet.",
"favourite": "Järjehoidja",
"favourites": "Järjehoidjad",
"favourites.has_no_favourites": "Sa ei ole ühtegi postitust pannud järjehoidjatesse veel.",
"loading_more_posts": "Laen postitusi",
"move_topic": "Liiguta teemat",
"move_topics": "Liiguta teemasi",

View File

@@ -7,7 +7,7 @@
"all": "Kõik",
"all_categories": "Kõik kategooriad",
"topics_marked_as_read.success": "Teemad märgitud loetuks!",
"all-topics": "All Topics",
"new-topics": "New Topics",
"watched-topics": "Watched Topics"
"all-topics": "Kõik teemad",
"new-topics": "Uued teemad",
"watched-topics": "Vaadatud teemad"
}

View File

@@ -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": "Laen faili üles...",
"select-file-to-upload": "Vali fail mida üles laadida!",
"upload-success": "Fail üles laetud edukalt!",
"maximum-file-size": "Maksimaalselt %1 kb"
}

View File

@@ -22,7 +22,7 @@
"profile": "Profiil",
"profile_views": "Vaatamisi",
"reputation": "Reputatsioon",
"favourites": "Bookmarks",
"favourites": "Järjehoidjad",
"watched": "Vaadatud",
"followers": "Jälgijad",
"following": "Jälgimised",
@@ -39,7 +39,7 @@
"change_username": "Vaheta kasutajanime",
"change_email": "Vaheta emaili",
"edit": "Muuda",
"edit-profile": "Edit Profile",
"edit-profile": "Redigeeri profiili",
"default_picture": "Algne ikoon",
"uploaded_picture": "Üleslaetud pilt",
"upload_new_picture": "Laadi uus pilt",
@@ -56,11 +56,11 @@
"password": "Parool",
"username_taken_workaround": "Kasutajanimi mida soovisid, ei olnud saadaval, seeg muutsime seda natukene. Sinu uus kasutajanimi on nüüd: <strong>%1</strong>",
"password_same_as_username": "Su parool kattub su kasutajanimega, palun vali mõni muu parool.",
"password_same_as_email": "Your password is the same as your email, please select another password.",
"password_same_as_email": "Su parool kattub su e-mailiga, palun vali mõni muu parool.",
"upload_picture": "Laadi pilt",
"upload_a_picture": "Lae pilt üles",
"remove_uploaded_picture": "Eemalda üleslaetud pilt",
"upload_cover_picture": "Upload cover picture",
"upload_cover_picture": "Lae üles katte pilt",
"settings": "Seaded",
"show_email": "Näita minu emaili",
"show_fullname": "Näita minu täisnime",
@@ -92,12 +92,12 @@
"open_links_in_new_tab": "Ava väljaminevad lingid uues aknas",
"enable_topic_searching": "Võimalda teemasisene otsing",
"topic_search_help": "Kui see on sisse lükatud, siis teemasisene otsing võtab üle brauseri tavapärase otsingu ning võimaldab otsida ainult ekraanile mahtuva teema asemel terve teema ulatuses.",
"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": "Viivita pildi laadimisega",
"image_load_delay_help": "Kui lubatud, pildid teemades ei lae kuni nad on nähtavuses",
"scroll_to_my_post": "Pärast vastuse postitamist, näita uut postitust",
"follow_topics_you_reply_to": "Järgi teemasid, millele olete vastanud.",
"follow_topics_you_create": "Järgi teemasi, mis on teie loodud.",
"grouptitle": "Group Title",
"grouptitle": "Grupi tiitel",
"no-group-title": "Grupi tiitel puudub",
"select-skin": "Vali välimus",
"select-homepage": "Vali avaleht",

View File

@@ -8,9 +8,9 @@
"no_replies": "Personne n'a répondu",
"no_new_posts": "Pas de nouveau message",
"share_this_category": "Partager cette catégorie",
"watch": "Surveiller",
"watch": "S'abonner",
"ignore": "Ne plus surveiller",
"watch.message": "Vous surveillez désormais les mises à jour de cette catégorie.",
"watch.message": "Vous êtes désormais abonné aux mises à jour de cette catégorie.",
"ignore.message": "Vous ne surveillez plus les mises jour de cette catégorie.",
"watched-categories": "Catégories Suivies"
"watched-categories": "Abonnements"
}

View File

@@ -14,7 +14,7 @@
"invalid-password": "Mot de passe invalide",
"invalid-username-or-password": "Veuillez entrer un nom d'utilisateur et un mot de passe",
"invalid-search-term": "Données de recherche invalides",
"csrf-invalid": "We were unable to log you in, likely due to an expired session. Please try again",
"csrf-invalid": "Nous ne pouvons pas vous connectez, possiblement car votre session a expiré. Merci de réessayer.",
"invalid-pagination-value": "Valeur de pagination invalide. Celle-ci doit être comprise entre %1 et %2.",
"username-taken": "Nom dutilisateur déjà utilisé",
"email-taken": "Email déjà utilisé",

View File

@@ -43,8 +43,8 @@
"alert.error": "Erreur",
"alert.banned": "Banni",
"alert.banned.message": "Vous venez d'être banni, vous allez maintenant être déconnecté.",
"alert.unfollow": "Vous ne suivez désormais plus %1 !",
"alert.follow": "Vous suivez désormais %1 !",
"alert.unfollow": "Vous n'êtes plus abonné à %1 !",
"alert.follow": "Vous êtes désormais abonné à %1 !",
"online": "En ligne",
"users": "Utilisateurs",
"topics": "Sujets",
@@ -81,8 +81,8 @@
"updated.title": "Forum mis à jour",
"updated.message": "Ce forum a été mis à jour à la dernière version. Cliquez ici pour recharger la page.",
"privacy": "Vie privée",
"follow": "Suivre",
"unfollow": "Ne plus suivre",
"follow": "S'abonner",
"unfollow": "Se désabonner",
"delete_all": "Tout supprimer",
"map": "Carte",
"sessions": "Sessions de connexion",

View File

@@ -28,14 +28,14 @@
"account/edit/password": "Édition du mot de passe de \"%1\"",
"account/edit/username": "Édition du nom d'utilisateur de \"%1\"",
"account/edit/email": "Édition de l'e-mail de \"%1\"",
"account/following": "Les personnes que %1 suit",
"account/following": "Les personnes auxquelles %1 est abonné",
"account/followers": "Les personnes qui suivent %1",
"account/posts": "Messages postés par %1",
"account/topics": "Sujets créés par %1",
"account/groups": "Groupes auxquels appartient %1",
"account/favourites": "Marques-pages de %1",
"account/settings": "Paramètres d'utilisateur",
"account/watched": "Sujets surveillés par %1",
"account/watched": "Sujets auxquels %1 est abonné",
"account/upvoted": "Messages pour lesquels %1 a voté",
"account/downvoted": "Messages contre lesquels %1 a voté",
"account/best": "Meilleurs messages postés par %1",

View File

@@ -32,22 +32,22 @@
"deleted_message": "Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.",
"following_topic.message": "Vous recevrez désormais des notifications lorsque quelqu'un postera dans ce sujet.",
"not_following_topic.message": "Vous ne recevrez plus de notifications pour ce sujet.",
"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": "Vous ne verrez plus ce sujet dans la liste des sujets non lus. Vous serez notifié lorsque vous serez mentionné ou que quelqu'un votera pour votre message.",
"login_to_subscribe": "Veuillez vous enregistrer ou vous connecter afin de vous abonner à ce sujet.",
"markAsUnreadForAll.success": "Sujet marqué comme non lu pour tout le monde.",
"mark_unread": "Marquer comme non-lu",
"mark_unread.success": "Sujet marqué comme non lu.",
"watch": "Surveiller",
"unwatch": "Ne plus surveiller",
"watch": "S'abonner",
"unwatch": "Se désabonner",
"watch.title": "Être notifié des nouvelles réponses dans ce sujet",
"unwatch.title": "Arrêter de surveiller ce sujet",
"unwatch.title": "Se désabonner de ce sujet",
"share_this_post": "Partager ce message",
"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": "Abonné",
"not-watching": "Non abonné",
"ignoring": "Ignoré",
"watching.description": "Me notifier les nouvelles réponses.<br/>Afficher le sujet dans l'onglet \"Non lu\".",
"not-watching.description": "Ne pas me notifier les nouvelles réponses.<br/>Afficher le sujet dans l'onglet \"Non lu\" si la catégorie n'est pas ignorée.",
"ignoring.description": "Ne pas me notifier les nouvelle réponses.<br/>Ne pas afficher ce sujet dans l'onglet \"Non lu\".",
"thread_tools.title": "Outils pour sujets",
"thread_tools.markAsUnreadForAll": "Marquer comme non lu",
"thread_tools.pin": "Épingler le sujet",

View File

@@ -9,5 +9,5 @@
"topics_marked_as_read.success": "Sujets marqués comme lus !",
"all-topics": "Tous les sujets",
"new-topics": "Nouveau sujet",
"watched-topics": "Sujets surveillés"
"watched-topics": "Abonnements"
}

View File

@@ -23,7 +23,7 @@
"profile_views": "Vues",
"reputation": "Réputation",
"favourites": "Marque-pages",
"watched": "Suivis",
"watched": "Abonnements",
"followers": "Abonnés",
"following": "Abonnements",
"aboutme": "À propos de moi",
@@ -64,7 +64,7 @@
"settings": "Paramètres",
"show_email": "Afficher mon email",
"show_fullname": "Afficher mon nom complet",
"restrict_chats": "Autoriser la réception de messages provenant uniquement des personnes que je suis",
"restrict_chats": "Autoriser la réception de messages ne provenant que des personnes que je suis",
"digest_label": "Sinscrire aux comptes-rendus",
"digest_description": "S'abonner par email aux mises à jours de ce forum (nouvelles notifications et nouveaux sujets) selon le planning sélectionné.",
"digest_off": "Désactivé",
@@ -78,7 +78,7 @@
"follows_no_one": "Cet utilisateur ne suit personne :(",
"has_no_posts": "Cet utilisateur n'a encore rien posté.",
"has_no_topics": "Cet utilisateur n'a encore créé aucun sujet.",
"has_no_watched_topics": "Cet utilisateur n'a encore consulté aucun sujet.",
"has_no_watched_topics": "Cet utilisateur ne s'est encore abonné à aucun sujet.",
"has_no_upvoted_posts": "Cet utilisateur n'a voté pour aucun message",
"has_no_downvoted_posts": "Cet utilisateur n'a voté contre aucun message",
"has_no_voted_posts": "Personne n'a voté pour des messages de cet utilisateur",
@@ -93,10 +93,10 @@
"enable_topic_searching": "Activer la recherche dans les sujets",
"topic_search_help": "Une fois activé, la recherche dans les sujets va remplacer la recherche de page du navigateur et vous permettra de rechercher dans l'intégralité d'un sujet au lieu des seuls posts affichés à l'écran.",
"delay_image_loading": "Délayer le chargement des images",
"image_load_delay_help": "Lorsque cette option est activée, les images des sujets ne seront pas chargées avant qu'elles soient visibles dans la fenêtre.",
"image_load_delay_help": "Lorsque cette option est activée, les images des sujets ne seront pas chargées avant qu'elles ne soient visibles dans la fenêtre.",
"scroll_to_my_post": "Après avoir répondu, montrer le nouveau message",
"follow_topics_you_reply_to": "Suivre les sujets auxquels vous répondez",
"follow_topics_you_create": "Suivre les sujets que vous créez",
"follow_topics_you_reply_to": "S'abonner aux sujets auxquels vous répondez",
"follow_topics_you_create": "S'abonner aux sujets que vous créez",
"grouptitle": "Nom du groupe",
"no-group-title": "Aucun titre de groupe",
"select-skin": "Sélectionner un thème",

View File

@@ -14,7 +14,7 @@
"invalid-password": "Contrasinal Inválido",
"invalid-username-or-password": "Especifica ámbolos dous por favor, nome de usuario e contrasinal",
"invalid-search-term": "Termo de búsqueda inválido",
"csrf-invalid": "We were unable to log you in, likely due to an expired session. Please try again",
"csrf-invalid": "Non fomos capaces de entrar, probablemente debido a que a sesión expirou. Por favor, téntao de novo",
"invalid-pagination-value": "Valor de paxinación incorreto, ten que estar entre %1 e %2",
"username-taken": "Nome de usuario en uso",
"email-taken": "Correo en uso",

View File

@@ -32,7 +32,7 @@
"deleted_message": "Este tema foi borrado. Só os usuarios con privilexios administrativos poden velo.",
"following_topic.message": "Agora recibirás notificacións cando alguén publique neste tema.",
"not_following_topic.message": "Non recibirás notificacións deste tema.",
"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": "Xa non verás este fío na lista de fíos non lidos. Serás notificado cando sexas mencionado ou a túa publicación sexa votada.",
"login_to_subscribe": "Por favor, identifícate para subscribirte a este tema.",
"markAsUnreadForAll.success": "Publicación marcada como non lida para todos.",
"mark_unread": "Marcar coma non lido",
@@ -42,12 +42,12 @@
"watch.title": "Serás notificado canto haxa novas respostas neste tema",
"unwatch.title": "Deixar de vixiar este tema",
"share_this_post": "Compartir esta publicación",
"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": "Vendo",
"not-watching": "Non Vendo",
"ignoring": "Ignorar",
"watching.description": "Notificádeme das novas repostas. <br/>Amosa-lo fío nos non lidos.",
"not-watching.description": "Non me notifiquedes as novas respostas. <br/>Amosa-lo fío en non lidos se a categoría non está ignorada.",
"ignoring.description": "Non me notifiquedes as novas respostas. <br/>Non amosa-lo fío en non lidos.",
"thread_tools.title": "Ferramentas do tema",
"thread_tools.markAsUnreadForAll": "Marcar como non lido",
"thread_tools.pin": "Fixar Tema",

View File

@@ -1,16 +1,16 @@
{
"category": "Category",
"subcategories": "Subcategories",
"category": "Categorie",
"subcategories": "Subcategorii",
"new_topic_button": "Subiect Nou",
"guest-login-post": "Log in to post",
"guest-login-post": "Conecteaza-te pentru a posta",
"no_topics": "<strong>Nu există nici un subiect de discuție în această categorie.</strong><br />De ce nu încerci să postezi tu unul?",
"browsing": "navighează",
"no_replies": "Nu a răspuns nimeni",
"no_new_posts": "No new posts.",
"no_new_posts": "Nici o postare nouă",
"share_this_category": "Distribuie această categorie",
"watch": "Watch",
"watch": "Urmărește",
"ignore": "Ignoră",
"watch.message": "You are now watching updates from this category",
"ignore.message": "You are now ignoring updates from this category",
"watched-categories": "Watched categories"
"watch.message": "Urmăriți acum actualizări din această categorie",
"ignore.message": "Ignorați acum actualizări din această categorie",
"watched-categories": "Categorii urmărite"
}

View File

@@ -1,19 +1,19 @@
{
"password-reset-requested": "Cererea de resetare a parolei a fost efectuată - %1!",
"welcome-to": "Salutare lui %1",
"invite": "Invitation from %1",
"invite": "Invitație de la %1",
"greeting_no_name": "Salut",
"greeting_with_name": "Salut %1",
"welcome.text1": "îți mulțumim că te-ai Înregistrat cu %1!",
"welcome.text2": "Pentru a-ți activa cu success contul trebuie să verificăm adresa de email pe care ai folosit-o la înregistrare.",
"welcome.text3": "An administrator has accepted your registration application. You can login with your username/password now.",
"welcome.cta": "Apasă aici pentru a confirma adresa ta de email",
"invitation.text1": "%1 has invited you to join %2",
"invitation.text1": "%1 te-a invitat să te alături %2",
"invitation.ctr": "Click here to create your account.",
"reset.text1": "We received a request to reset your password, possibly because you have forgotten it. If this is not the case, please ignore this email.",
"reset.text2": "Pentru a continua cu resetarea parolei, te rugăm sa apeși pe următorul link:",
"reset.cta": "Apasă aici pentru a-ți reseta parola",
"reset.notify.subject": "Password successfully changed",
"reset.notify.subject": "Parola a fost schimbată cu succes",
"reset.notify.text1": "We are notifying you that on %1, your password was changed successfully.",
"reset.notify.text2": "If you did not authorise this, please notify an administrator immediately.",
"digest.notifications": "You have unread notifications from %1:",
@@ -21,10 +21,10 @@
"digest.cta": "Apasă aici pentru a vizita %1",
"digest.unsub.info": "This digest was sent to you due to your subscription settings.",
"digest.no_topics": "There have been no active topics in the past %1",
"digest.day": "day",
"digest.week": "week",
"digest.month": "month",
"digest.subject": "Digest for %1",
"digest.day": "zi",
"digest.week": "saptămână",
"digest.month": "lună",
"digest.subject": "Rezumat pentru %1",
"notif.chat.subject": "Ai primit un mesaj de la %1",
"notif.chat.cta": "Apasă aici pentru a continua conversația",
"notif.chat.unsub.info": "This chat notification was sent to you due to your subscription settings.",

View File

@@ -3,8 +3,8 @@
"search": "Căutare",
"buttons.close": "Închide",
"403.title": "Acces Interzis",
"403.message": "You seem to have stumbled upon a page that you do not have access to.",
"403.login": "Perhaps you should <a href='%1/login'>try logging in</a>?",
"403.message": "Se pare că ai ajuns pe o pagină la care nu ai acces",
"403.login": "Poate ar trebui să te <a href='%1/login'>autentifici</a>?",
"404.title": "Nu a fost găsit",
"404.message": "You seem to have stumbled upon a page that does not exist. Return to the <a href='%1/'>home page</a>.",
"500.title": "Eroare internă.",
@@ -49,7 +49,7 @@
"users": "Utilizatori",
"topics": "Subiecte",
"posts": "Mesaje",
"best": "Best",
"best": "Cel mai bun",
"upvoted": "Upvoted",
"downvoted": "Downvoted",
"views": "Vizualizări",
@@ -65,7 +65,7 @@
"posted_in_ago_by": "postat în %1 %2 de %3",
"user_posted_ago": "%1 a postat %2",
"guest_posted_ago": "Vizitator a postat %1",
"last_edited_by": "last edited by %1",
"last_edited_by": "ultima editare de %1",
"norecentposts": "Nici un mesaj recent",
"norecenttopics": "Nici un subiect recent",
"recentposts": "Mesaje Recente",
@@ -85,10 +85,10 @@
"unfollow": "Nu mai urmări",
"delete_all": "Şterge Tot",
"map": "Hartă",
"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": "Ședința de login",
"ip_address": "Adresa IP",
"enter_page_number": "Introdu numărul paginei",
"upload_file": "Încărcați fișierul",
"upload": "Încărcați",
"allowed-file-types": "Tipuri de fișiere permise sunt %1"
}

View File

@@ -1,54 +1,54 @@
{
"groups": "Grupuri",
"view_group": "Vezi Grup",
"owner": "Group Owner",
"new_group": "Create New Group",
"no_groups_found": "There are no groups to see",
"pending.accept": "Accept",
"pending.reject": "Reject",
"pending.accept_all": "Accept All",
"pending.reject_all": "Reject All",
"pending.none": "There are no pending members at this time",
"invited.none": "There are no invited members at this time",
"invited.uninvite": "Rescind Invitation",
"owner": "Propietar de group",
"new_group": "Crează un grup nou",
"no_groups_found": "Nu sunt grupuri de văzut",
"pending.accept": "Acceptă",
"pending.reject": "Respinge",
"pending.accept_all": "Acceptă toate",
"pending.reject_all": "Respinge toate",
"pending.none": "Momentan nu există membrii în așteptare",
"invited.none": "Momentan nu există membrii invitați",
"invited.uninvite": "Anulează invitația",
"invited.search": "Search for a user to invite to this group",
"invited.notification_title": "You have been invited to join <strong>%1</strong>",
"invited.notification_title": "Ai fost invitat să te alături <strong>%1<strong>",
"request.notification_title": "Group Membership Request from <strong>%1</strong>",
"request.notification_text": "<strong>%1</strong> has requested to become a member of <strong>%2</strong>",
"cover-save": "Save",
"cover-saving": "Saving",
"cover-save": "Salvează",
"cover-saving": "Salvez",
"details.title": "Detalii Grup",
"details.members": "Listă Membrii",
"details.pending": "Pending Members",
"details.invited": "Invited Members",
"details.pending": "Membrii în așteptare",
"details.invited": "Membrii invitați",
"details.has_no_posts": "Membrii acestui grup nu au facut nici o postare.",
"details.latest_posts": "Ultimele Mesaje",
"details.private": "Private",
"details.private": "Privat",
"details.disableJoinRequests": "Disable join requests",
"details.grant": "Grant/Rescind Ownership",
"details.kick": "Kick",
"details.owner_options": "Group Administration",
"details.group_name": "Group Name",
"details.member_count": "Member Count",
"details.creation_date": "Creation Date",
"details.description": "Description",
"details.badge_preview": "Badge Preview",
"details.change_icon": "Change Icon",
"details.change_colour": "Change Colour",
"details.badge_text": "Badge Text",
"details.userTitleEnabled": "Show Badge",
"details.owner_options": "Administrarea grupului",
"details.group_name": "Numele grupului",
"details.member_count": "Număr de membrii",
"details.creation_date": "Data creării",
"details.description": "Descriere",
"details.badge_preview": "Previzualizarea insignei",
"details.change_icon": "Schimbă icoana",
"details.change_colour": "Schimbă culoarea",
"details.badge_text": "Textul insignei",
"details.userTitleEnabled": "Arată insigna",
"details.private_help": "If enabled, joining of groups requires approval from a group owner",
"details.hidden": "Hidden",
"details.hidden": "Ascuns",
"details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
"details.delete_group": "Delete Group",
"details.delete_group": "Șterge grupul",
"details.private_system_help": "Private groups is disabled at system level, this option does not do anything",
"event.updated": "Group details have been updated",
"event.deleted": "The group \"%1\" has been deleted",
"membership.accept-invitation": "Accept Invitation",
"membership.invitation-pending": "Invitation Pending",
"membership.join-group": "Join Group",
"membership.leave-group": "Leave Group",
"membership.reject": "Reject",
"new-group.group_name": "Group Name:",
"upload-group-cover": "Upload group cover"
"event.updated": "Detaliile grupului au fost actualizate",
"event.deleted": "Grupul %1\" a fost șters",
"membership.accept-invitation": "Acceptă invitația",
"membership.invitation-pending": "Invitație in așteptare",
"membership.join-group": "Alăture-te grupului",
"membership.leave-group": "Părăsește grupul",
"membership.reject": "Respinge",
"new-group.group_name": "Numele grupului:",
"upload-group-cover": "Încarcă coperta de grup"
}

View File

@@ -5,7 +5,7 @@
"remember_me": "Autentifică-mă automat la fiecare vizită",
"forgot_password": "Ai uitat parola?",
"alternative_logins": "Autentificare Alternativă",
"failed_login_attempt": "Login Unsuccessful",
"failed_login_attempt": "Login nereușit",
"login_successful": "Te-ai autentificat cu succes!",
"dont_have_account": "Nu ai un cont?"
}

View File

@@ -5,7 +5,7 @@
"chat.no_active": "Nu ai nici o conversație activă",
"chat.user_typing": "%1 scrie ...",
"chat.user_has_messaged_you": "%1 ți-a trimis un mesaj.",
"chat.see_all": "See all chats",
"chat.see_all": "Vezi toate conversațiile",
"chat.mark_all_read": "Mark all chats read",
"chat.no-messages": "Selectează un recipient pentru a vedea istoria mesajelor chat",
"chat.no-users-in-room": "No users in this room",
@@ -20,7 +20,7 @@
"chat.delete_message_confirm": "Are you sure you wish to delete this message?",
"chat.roomname": "Chat Room %1",
"chat.add-users-to-room": "Add users to room",
"composer.compose": "Compose",
"composer.compose": "Scrie",
"composer.show_preview": "Show Preview",
"composer.hide_preview": "Hide Preview",
"composer.user_said_in": "%1 a spus în %2:",

View File

@@ -1,11 +1,11 @@
{
"title": "Notificări",
"no_notifs": "Nu ai nici o notificare recentă",
"see_all": "See all notifications",
"mark_all_read": "Mark all notifications read",
"see_all": "Vezi toate notificările",
"mark_all_read": "Marchează toate notificările citite",
"back_to_home": "Înapoi la %1",
"outgoing_link": "Link Extern",
"outgoing_link_message": "You are now leaving %1",
"outgoing_link_message": "Părăsești acuma %1",
"continue_to": "Continuă la %1",
"return_to": "Întoarce-te la %1",
"new_notification": "Notificare Nouă",

View File

@@ -1,24 +1,24 @@
{
"home": "Acasă",
"unread": "Subiecte Necitite",
"popular-day": "Popular topics today",
"popular-week": "Popular topics this week",
"popular-month": "Popular topics this month",
"popular-day": "Subiecte populare azi",
"popular-week": "Subiecte populare în săptămâna asta",
"popular-month": "Subiecte populare în luna asta",
"popular-alltime": "All time popular topics",
"recent": "Subiecte Noi",
"flagged-posts": "Flagged Posts",
"users/online": "Online Users",
"users/latest": "Latest Users",
"users/sort-posts": "Users with the most posts",
"users/online": "Utilizatori online",
"users/latest": "Ultimii membrii",
"users/sort-posts": "Membrii cu cele mai multe postări",
"users/sort-reputation": "Users with the most reputation",
"users/banned": "Banned Users",
"users/search": "User Search",
"notifications": "Notificări",
"tags": "Taguri",
"tag": "Topics tagged under \"%1\"",
"register": "Register an account",
"register": "Înregistrează un cont nou",
"login": "Login to your account",
"reset": "Reset your account password",
"reset": "Resetează parola contului tău",
"categories": "Categorii",
"groups": "Grupuri",
"group": "%1 group",

View File

@@ -6,14 +6,14 @@
"year": "An",
"alltime": "Tot Timpul",
"no_recent_topics": "Nu există subiecte recente.",
"no_popular_topics": "There are no popular topics.",
"there-is-a-new-topic": "There is a new topic.",
"there-is-a-new-topic-and-a-new-post": "There is a new topic and a new post.",
"no_popular_topics": "Nu sunt subiecte populare.",
"there-is-a-new-topic": "Există un subiect nou.",
"there-is-a-new-topic-and-a-new-post": "Există un subiect nou si o postare nouă.",
"there-is-a-new-topic-and-new-posts": "There is a new topic and %1 new posts.",
"there-are-new-topics": "There are %1 new topics.",
"there-are-new-topics-and-a-new-post": "There are %1 new topics and a new post.",
"there-are-new-topics-and-new-posts": "There are %1 new topics and %2 new posts.",
"there-is-a-new-post": "There is a new post.",
"there-are-new-posts": "There are %1 new posts.",
"there-are-new-topics": "Există %1 postări noi.",
"there-are-new-topics-and-a-new-post": "Exista %1 subiect nou și o postare nouă",
"there-are-new-topics-and-new-posts": "Exista %1 subiecte noi și %2 postări noi",
"there-is-a-new-post": "Exista o postare nouă",
"there-are-new-posts": "Există %1 postări noi",
"click-here-to-reload": "Click here to reload."
}

View File

@@ -13,5 +13,5 @@
"invalid_email": "Adresă de email invalidă / Adresa de email nu există!",
"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_expired": "Parola ta a expirat, te rugăm alege altă parolă"
}

View File

@@ -5,7 +5,7 @@
"no_topics_found": "Nu a fost găsit nici un subiect!",
"no_posts_found": "Nu a fost găsit nici un mesaj!",
"post_is_deleted": "Acest mesaj a fost șters!",
"topic_is_deleted": "This topic is deleted!",
"topic_is_deleted": "Acest subiect este șters!",
"profile": "Profil",
"posted_by": "Postat de %1",
"posted_by_guest": "Postat de Vizitator",
@@ -13,8 +13,8 @@
"notify_me": "Notică-mă de noi răspunsuri în acest subiect",
"quote": "Citează",
"reply": "Răspunde",
"reply-as-topic": "Reply as topic",
"guest-login-reply": "Log in to reply",
"reply-as-topic": "Răspunde ca subiect",
"guest-login-reply": "Login pentru a răspunde",
"edit": "Editează",
"delete": "Șterge",
"purge": "Curăță",

View File

@@ -5,9 +5,9 @@
"mark_as_read": "Marchează ca citit",
"selected": "Selectate",
"all": "Toate",
"all_categories": "All categories",
"all_categories": "Toate categoriile",
"topics_marked_as_read.success": "Subiectele au fost marcate ca citite!",
"all-topics": "All Topics",
"new-topics": "New Topics",
"watched-topics": "Watched Topics"
"all-topics": "Toate subiectele",
"new-topics": "Subiecte noi",
"watched-topics": "Subiecte urmărite"
}

View File

@@ -1,6 +1,6 @@
{
"uploading-file": "Uploading the file...",
"select-file-to-upload": "Select a file to upload!",
"select-file-to-upload": "Selectează un fișier pentru încărcare!",
"upload-success": "File uploaded successfully!",
"maximum-file-size": "Maximum %1 kb"
"maximum-file-size": "Maxim %1 kB"
}

View File

@@ -12,7 +12,7 @@
"delete_account": "Șterge Cont",
"delete_account_confirm": "Ești sigur ca vrei să îți ștergi contul? <br /><strong>Această acțiune este ireversibilă și nu o să mai fie posibil să îți recuperezi datele</strong><br /><br />Introdu numele tău de utilizator pentru a confirma că dorești să ștergi acest cont.",
"delete_this_account_confirm": "Are you sure you want to delete this account? <br /><strong>This action is irreversible and you will not be able to recover any data</strong><br /><br />",
"account-deleted": "Account deleted",
"account-deleted": "Cont șters",
"fullname": "Nume Întreg",
"website": "Pagină Web",
"location": "Locație",

View File

@@ -7,7 +7,7 @@
"load_more": "Încarcă mai multe",
"users-found-search-took": "%1 user(s) found! Search took %2 seconds.",
"filter-by": "Filter By",
"online-only": "Online only",
"online-only": "Numai online",
"invite": "Invită",
"invitation-email-sent": "An invitation email has been sent to %1",
"user_list": "Listă utilizatori",

View File

@@ -2,15 +2,15 @@
"category": "類別",
"subcategories": "子類別",
"new_topic_button": "新主題",
"guest-login-post": "登入後才能張貼",
"no_topics": "<strong>這個類別沒有任何主題。</strong><br />為何不來發點東西呢?",
"guest-login-post": "登入後才能張貼文章",
"no_topics": "<strong>這個類別目前沒有任何主題。</strong><br />你要不要來張貼個新主題呢?",
"browsing": "正在瀏覽",
"no_replies": "還沒有回覆",
"no_new_posts": "沒有新的張貼",
"share_this_category": "分享這類別",
"watch": "觀看",
"watch": "關注",
"ignore": "忽略",
"watch.message": "您正觀看著此類別的更新",
"ignore.message": "已忽略此類別的更新",
"watched-categories": "看過的類別"
"watch.message": "你正關注此類別的更新",
"ignore.message": "已忽略此類別的更新",
"watched-categories": "關注的類別"
}

View File

@@ -1,36 +1,36 @@
{
"password-reset-requested": "已要求重設密碼 - %1!",
"welcome-to": "歡迎來到%1",
"welcome-to": "歡迎來到 %1",
"invite": "邀請來自 %1",
"greeting_no_name": "好",
"greeting_with_name": "您好,%1",
"welcome.text1": "感謝註冊 %1!",
"welcome.text2": "要啟你的帳戶,我們先要驗證你用作登記的電郵地址",
"welcome.text3": "管理者已經批準的註冊申請。你現在可以使用你的帳號/密碼進行登入。",
"welcome.cta": "請點擊此處確認的電地址",
"invitation.text1": "%1 邀請加入 %2",
"greeting_no_name": "好",
"greeting_with_name": "%1 你好",
"welcome.text1": "感謝註冊 %1!",
"welcome.text2": "要啟你的帳戶,我們先要驗證你用作註冊的電子郵件地址",
"welcome.text3": "管理者已經批準的註冊申請。你現在可以使用你的帳號/密碼進行登入。",
"welcome.cta": "請點擊此處確認的電子郵件地址",
"invitation.text1": "%1 邀請加入 %2",
"invitation.ctr": "點擊這裡來建立你的帳號",
"reset.text1": "我們收到一個重設密碼的請求,你忘掉了密碼嗎?如果不是,請忽略這封郵件。",
"reset.text2": "要繼續重置密碼,請點擊以下鏈接:",
"reset.cta": "點擊這裡重置密碼",
"reset.notify.subject": "密碼修改成功",
"reset.notify.text1": "提醒您密碼已於 %1 修改成功",
"reset.notify.text2": "如果未允許此動作, 請即通知系統管理者",
"digest.notifications": "你有來自$1的未讀通知",
"digest.latest_topics": "來自%1的最新題",
"digest.cta": "點擊這裡訪問%1",
"digest.unsub.info": "本摘要按您的訂閱設置發送給。",
"digest.no_topics": "在過去%1沒有活躍的題",
"reset.notify.text1": "我們要通知你在 %1 的密碼已成功更改",
"reset.notify.text2": "如果未允許此動作, 請即通知系統管理者",
"digest.notifications": "你有來自 %1 的未讀通知:",
"digest.latest_topics": "來自 %1 的最新題",
"digest.cta": "點擊這裡訪問 %1",
"digest.unsub.info": "本摘要依照你的訂閱設置發送給。",
"digest.no_topics": "在過去 %1 沒有活躍的題",
"digest.day": "日",
"digest.week": "週",
"digest.month": "月",
"digest.subject": "摘要於 %1",
"notif.chat.subject": "收到來自$1的聊天息",
"notif.chat.cta": "點擊此處繼續對話",
"notif.chat.unsub.info": "本聊天通知按的訂閱設置發送給。",
"notif.post.cta": "按此以閱讀完整題",
"notif.post.unsub.info": "本發文通知按的訂閱設置發送給。",
"test.text1": "這是一個測試電郵,以確認的NodeBB郵件設置正確。",
"unsub.cta": "點擊這裡更改這些設置",
"closing": "謝謝!"
"notif.chat.subject": "收到來自 %1 的聊天息",
"notif.chat.cta": "點擊此處繼續聊天對話",
"notif.chat.unsub.info": "本聊天通知按的訂閱設置發送給。",
"notif.post.cta": "點擊此處來閱讀完整題",
"notif.post.unsub.info": "本張貼通知按的訂閱設置發送給。",
"test.text1": "這是一個測試電子郵件,用於確認的NodeBB郵件功能是否設置正確。",
"unsub.cta": "點擊此處來更改這些設置",
"closing": "感謝!"
}

View File

@@ -1,7 +1,7 @@
{
"invalid-data": "無效的資料",
"not-logged-in": "似乎還沒有登入喔!",
"account-locked": "的帳戶暫時被鎖定!",
"not-logged-in": "似乎還沒有登入喔!",
"account-locked": "的帳戶暫時被鎖定!",
"search-requires-login": "進行搜尋需要有帳號 - 請先註冊或登入",
"invalid-cid": "無效的類別 ID",
"invalid-tid": "無效的主題 ID",
@@ -14,11 +14,11 @@
"invalid-password": "無效的密碼",
"invalid-username-or-password": "請指定用戶名和密碼",
"invalid-search-term": "無效的搜索字詞",
"csrf-invalid": "We were unable to log you in, likely due to an expired session. Please try again",
"csrf-invalid": "我們無法讓你登入,似乎是因為連線階段已到期。請再重試一次。",
"invalid-pagination-value": "無效的分頁數值, 必需是至少 %1 與最多 %2",
"username-taken": "該使用者名稱已被使用",
"email-taken": "該信箱已被使用",
"email-not-confirmed": "的電郵尚未得到確認,請點擊此處確認的電子郵件。",
"email-not-confirmed": "的電子郵件尚未確認,請點擊此處確認的電子郵件。",
"email-not-confirmed-chat": "你需要先確認電子郵件後才能進行聊天,請點擊這裡來確認你的電子郵件。",
"no-email-to-confirm": "討論區要求電子郵件確認,請點擊這裡輸入一個電子郵件。",
"email-confirm-failed": "我們無法確認你的Email請之後再重試。",
@@ -28,7 +28,7 @@
"username-too-long": "帳號太長",
"password-too-long": "密碼太長",
"user-banned": "該使用者已被停用",
"user-too-new": "抱歉,發表第一篇文章須要等待 %1 秒",
"user-too-new": "抱歉,發表第一篇文章須要等待 %1 秒",
"blacklisted-ip": "抱歉你的IP位置已經被這個社群禁用了。如果你覺得這是一個失誤請連絡管理員。",
"no-category": "類別並不存在",
"no-topic": "主題並不存在",
@@ -36,7 +36,7 @@
"no-group": "群組並不存在",
"no-user": "使用者並不存在",
"no-teaser": "Teaser 並不存在",
"no-privileges": "您似乎沒有執行這個行為的權限!",
"no-privileges": "沒有執行這個行為的足夠權限!",
"category-disabled": "該類別已被關閉",
"topic-locked": "該主題已被鎖定",
"post-edit-duration-expired": "在張貼 %1 秒後,你才能編輯張貼文章",
@@ -55,7 +55,7 @@
"guest-upload-disabled": "訪客上傳是被禁止的",
"already-favourited": "你已經將這篇張貼加入書籤",
"already-unfavourited": "你已經將這篇張貼移除書籤",
"cant-ban-other-admins": "無法禁止其他的管理員!",
"cant-ban-other-admins": "無法封鎖其他的管理員!",
"cant-remove-last-admin": "你是唯一的管理員。在你移除自己為管理員前,需要新增另一個使用者為管理員。",
"invalid-image-type": "無效的圖像類型。允許的類型:%1",
"invalid-image-extension": "無效的圖像擴充元件",
@@ -96,8 +96,8 @@
"reload-failed": "NodeBB重載\"%1\"時遇到了問題。 NodeBB將繼續提供現有的客戶端資源但請你撤消重載前的動作。",
"registration-error": "註冊錯誤",
"parse-error": "當剖析伺服器回應時發生了某個錯誤",
"wrong-login-type-email": "請使用的電子郵件進行登",
"wrong-login-type-username": "請使用您的使用者名稱進行登",
"wrong-login-type-email": "請使用的電子郵件進行登",
"wrong-login-type-username": "請使用你的帳號進行登",
"invite-maximum-met": "你已經邀請最多可邀請的人數限制 (%1 於 %2)。",
"no-session-found": "沒有找到登入的連線階段!",
"not-in-room": "使用者沒有在聊天室中",

View File

@@ -3,86 +3,86 @@
"search": "搜尋",
"buttons.close": "關閉",
"403.title": "禁止存取",
"403.message": "你沒有該頁面的存取權限",
"403.login": "可能是因為你尚未<a href='%1/login'>登入</a>?",
"403.message": "你沒有該頁面的存取權限",
"403.login": "或許是你應該 <a href='%1/login'>試著登入</a>?",
"404.title": "無法找到該頁",
"404.message": "你所查找的頁面並不存在返回<a href='%1/'>頁</a>。",
"404.message": "你所查找的頁面並不存在返回<a href='%1/'>頁</a>。",
"500.title": "內部錯誤",
"500.message": "不好!看來是哪裡出錯了",
"register": "冊",
"login": "登",
"please_log_in": "請登入",
"logout": "退出",
"posting_restriction_info": "發表文章目前僅限於註冊會員,點擊此處進行登。",
"500.message": "糟糕! 看來是不知道哪裡出錯了!",
"register": "冊",
"login": "登",
"please_log_in": "請登入",
"logout": "出",
"posting_restriction_info": "張貼文章目前只限註冊會員,點擊此處進行登。",
"welcome_back": "歡迎回來!",
"you_have_successfully_logged_in": "您已經成功登",
"save_changes": "保存修改",
"you_have_successfully_logged_in": "你已成功登",
"save_changes": "儲存變更",
"close": "關閉",
"pagination": "分頁",
"pagination.out_of": "%1 out of %2",
"pagination.enter_index": "輸入Index",
"pagination.out_of": "%1 %2",
"pagination.enter_index": "輸入索引",
"header.admin": "管理",
"header.categories": "類別",
"header.recent": "最近",
"header.unread": "未讀",
"header.tags": "標籤",
"header.popular": "熱門",
"header.users": "用戶",
"header.users": "使用者",
"header.groups": "群組",
"header.chats": "聊天",
"header.notifications": "通知",
"header.search": "搜尋",
"header.profile": "設置",
"header.profile": "個人資料",
"header.navigation": "導覽",
"notifications.loading": "消息載入中",
"chats.loading": "聊天載入中···",
"notifications.loading": "通知載入中",
"chats.loading": "聊天載入中",
"motd.welcome": "歡迎來到 NodeBB一個未來的討論平台。",
"previouspage": "上一頁",
"nextpage": "下一頁",
"alert.success": "成功",
"alert.error": "錯誤",
"alert.banned": "封鎖",
"alert.banned.message": "你被封鎖並將登出!",
"alert.unfollow": "你已不再關注 %1!",
"alert.follow": "你正在關注 %1!",
"online": "線",
"alert.banned.message": "你被封鎖,將會被登出!",
"alert.unfollow": "你已不再跟隨 %1!",
"alert.follow": "你正在跟隨 %1!",
"online": "線",
"users": "使用者",
"topics": "主題",
"posts": "文章",
"posts": "張貼",
"best": "最棒",
"upvoted": "",
"downvoted": "",
"views": "Views",
"reputation": "聲",
"read_more": "閱讀更多...",
"upvoted": "正向投票",
"downvoted": "負向投票",
"views": "瀏覽",
"reputation": "聲",
"read_more": "閱讀更多",
"more": "更多",
"posted_ago_by_guest": "posted %1 by Guest",
"posted_ago_by": "posted %1 by %2",
"posted_ago": "posted %1",
"posted_in": "張貼 %1",
"posted_ago_by_guest": "訪客張貼 %1",
"posted_ago_by": "%2 張貼 %1 ",
"posted_ago": "張貼 %1",
"posted_in": "張貼 %1",
"posted_in_by": "張貼於 %1 由 %2",
"posted_in_ago": "posted in %1",
"posted_in_ago_by": "posted in %1 %2 by %3",
"user_posted_ago": "%1 posted %2",
"guest_posted_ago": "Guest posted %1",
"posted_in_ago": "張貼在 %1 %2",
"posted_in_ago_by": "由 %3 張貼在 %1 %2 ",
"user_posted_ago": "%1 張貼 %2",
"guest_posted_ago": "訪客張貼 %1",
"last_edited_by": "最後編輯由 %1",
"norecentposts": "最近沒新文章",
"norecenttopics": "最近沒新主題",
"recentposts": "最近的文",
"recentips": "最近登的 IP 來源位址",
"norecentposts": "沒新張貼文",
"norecenttopics": "沒新主題",
"recentposts": "最近的張貼文",
"recentips": "最近登的 IP 位址",
"away": "離開",
"dnd": "不要打擾",
"invisible": "隱",
"dnd": "打擾",
"invisible": "隱",
"offline": "離線",
"email": "Email",
"language": "語言",
"guest": "Guest",
"guests": "Guests",
"updated.title": "討論區更新完畢",
"updated.message": "這個討論區最近更新至最新的版本. 按此來重整這個頁面",
"guest": "訪客",
"guests": "訪客",
"updated.title": "討論區更新",
"updated.message": "這個討論區最近更新至最新的版本。點擊此處來重整這個頁面",
"privacy": "隱私",
"follow": "追蹤",
"unfollow": "取消追蹤",
"follow": "跟隨",
"unfollow": "取消跟隨",
"delete_all": "全部刪除",
"map": "地圖",
"sessions": "登入連線階段",

View File

@@ -4,7 +4,7 @@
"chat.send": "發送",
"chat.no_active": "暫無聊天",
"chat.user_typing": "%1 正在輸入中...",
"chat.user_has_messaged_you": "%1 傳送訊息給你",
"chat.user_has_messaged_you": "%1 傳送訊息給你",
"chat.see_all": "顯示全部聊天",
"chat.mark_all_read": "所有訊息標為已讀",
"chat.no-messages": "請選擇收件人來查看聊天記錄",
@@ -23,8 +23,8 @@
"composer.compose": "撰寫",
"composer.show_preview": "顯示預覽",
"composer.hide_preview": "隱藏預覽",
"composer.user_said_in": "%1%2裡說",
"composer.user_said": "%1說",
"composer.user_said_in": "%1%2 裡說:",
"composer.user_said": "%1 說:",
"composer.discard": "你確定要放棄這帖子嗎?",
"composer.submit_and_lock": "提交然後鎖定",
"composer.toggle_dropdown": "切換下拉選單",

View File

@@ -3,15 +3,15 @@
"no_notifs": "沒有新消息",
"see_all": "觀看所有通知",
"mark_all_read": "所有訊息設為已讀",
"back_to_home": "返回%1",
"back_to_home": "返回 %1",
"outgoing_link": "站外連結",
"outgoing_link_message": "你現在離開了 %1",
"continue_to": "繼續前往 %1",
"return_to": "返回%1",
"return_to": "返回 %1",
"new_notification": "新訊息通知",
"you_have_unread_notifications": "有未讀的訊息!",
"you_have_unread_notifications": "有未讀的通知。",
"new_message_from": "來自 <strong>%1</strong> 的新訊息",
"upvoted_your_post_in": "<strong>%1</strong> upvote了您在 <strong>%2</strong>的post。",
"upvoted_your_post_in": "<strong>%1</strong> 對你在 <strong>%2</strong>的張貼文投了正向票。",
"upvoted_your_post_in_dual": "<strong>%1</strong> 與 <strong>%2</strong> 已經對你在<strong>%3</strong>的張貼作正向投票。",
"upvoted_your_post_in_multiple": "<strong>%1</strong> 與 %2 其他人已經對你在<strong>%3</strong>正向投票。",
"moved_your_post": "<strong>%1</strong> 已經移動你的張貼到 <strong>%2</strong>",
@@ -19,7 +19,7 @@
"favourited_your_post_in": "<strong>%1</strong> 已經把你在 <strong>%2</strong> 的張貼加入書籤。",
"favourited_your_post_in_dual": "<strong>%1</strong> 與 <strong>%2</strong> 已經把你在<strong>%3</strong>的張貼加入書籤。",
"favourited_your_post_in_multiple": "<strong>%1</strong> 與 %2 其他人已經把你在 <strong>%3</strong> 的張貼加入書籤。",
"user_flagged_post_in": "<strong>%1</strong> 舉報了 <strong>%2</strong>裡的一個post。",
"user_flagged_post_in": "<strong>%1</strong> 標記了 <strong>%2</strong>裡的一個張貼。",
"user_flagged_post_in_dual": "<strong>%1</strong> 與 <strong>%2</strong> 標記一個張貼在 <strong>%3</strong>",
"user_flagged_post_in_multiple": "<strong>%1</strong> 與 %2 其他人標記一個張貼在 <strong>%3</strong>",
"user_posted_to": "<strong>%1</strong> 發布一個回覆給: <strong>%2</strong>",
@@ -31,8 +31,8 @@
"user_started_following_you_multiple": "<strong>%1</strong> 與 %2 其他的開始跟隨你。",
"new_register": "<strong>%1</strong>傳送了註冊要求。",
"new_register_multiple": "目前有 <strong>%1</strong> 個註冊要求等待審核中。",
"email-confirmed": "已確認電",
"email-confirmed-message": "感謝驗證您的電郵。您的帳戶現已全面啟用。",
"email-confirm-error-message": "驗證的電地址時出現問題。也許啟動碼無效或已過期。",
"email-confirm-sent": "已發送確認電。"
"email-confirmed": "已確認電子郵件",
"email-confirmed-message": "感謝驗證電子郵件。你的帳戶現已完整的啟動。",
"email-confirm-error-message": "驗證的電子郵件地址時發生問題。也許啟動碼無效或已過期。",
"email-confirm-sent": "已發送確認電子郵件。"
}

View File

@@ -25,7 +25,7 @@
"chats": "聊天",
"chat": "與 %1 聊天",
"account/edit": "編輯 \"%1\"",
"account/edit/password": "編輯\"%1\"的密碼",
"account/edit/password": "編輯 \"%1\" 的密碼",
"account/edit/username": "編輯\"%1\"的帳號",
"account/edit/email": "編輯\"%1\"的電子郵件",
"account/following": "使用者 %1 跟隨",

View File

@@ -1,8 +1,8 @@
{
"register": "註冊",
"help.email": "默認情況下,你的郵箱不會公開。",
"help.username_restrictions": "用戶名由%1到%2個字組成。其他人可以通過 @<span id='yourUsername'>用戶名</span> 點名你。",
"help.minimum_password_length": "密碼必須至少包含%1個字。",
"help.username_restrictions": "獨立的帳號由 %1 到 %2 個字組成。其他人可以通過 @<span id='yourUsername'>帳號</span> 提及你。",
"help.minimum_password_length": "密碼必須至少包含 %1 個字。",
"email_address": "Email",
"email_address_placeholder": "輸入郵箱地址",
"username": "用戶名",
@@ -15,5 +15,5 @@
"alternative_registration": "其他註冊方式",
"terms_of_use": "使用條款",
"agree_to_terms_of_use": "同意遵守使用條款",
"registration-added-to-queue": "的註冊已經被加入到審核序列中。將會在管理者批準後收到一封電子郵件。"
"registration-added-to-queue": "的註冊已經被加入到審核序列中。將會在管理者批準後收到一封電子郵件。"
}

View File

@@ -4,10 +4,10 @@
"password_changed.title": "密碼已更改",
"password_changed.message": "<p>密碼重設成功,請重新<a href=\"/login\">登錄</a>。",
"wrong_reset_code.title": "驗証碼不正確",
"wrong_reset_code.message": "您輸入的驗証碼有誤,請重新輸入,或<a href=\"/reset\">申請新驗証碼</a>。",
"wrong_reset_code.message": "重置驗証碼不正確。請重新輸入,或<a href=\"/reset\">申請新重置驗証碼</a>。",
"new_password": "輸入新的密碼",
"repeat_password": "再次確認新密碼",
"enter_email": "請輸入的<strong>電子郵件地址</strong>,我們會寄送郵件告訴如何重設密碼。",
"enter_email": "請輸入的<strong>電子郵件地址</strong>,我們會寄送郵件告訴如何重置你的帳戶。",
"enter_email_address": "輸入電子郵件地址",
"password_reset_sent": "密碼重設郵件已發送。",
"invalid_email": "無效的電子郵件 / 電子郵件不存在!",

View File

@@ -1,17 +1,17 @@
{
"results_matching": "有%1個跟\"%2\"相符的結果%3秒",
"results_matching": "有 %1 個與 \"%2\" 符合的結果 (%3秒)",
"no-matches": "沒有找到相符的主題",
"advanced-search": "進階搜尋",
"in": "在",
"titles": "標題",
"titles-posts": "標題與發布",
"posted-by": "Posted by",
"titles-posts": "標題與張貼",
"posted-by": "張貼由",
"in-categories": "在類別中",
"search-child-categories": "搜尋子類別",
"reply-count": "回覆數量",
"at-least": "最少",
"at-most": "最多",
"post-time": "發布時間",
"post-time": "張貼時間",
"newer-than": "較新",
"older-than": "較舊",
"any-date": "任意日期",
@@ -22,7 +22,7 @@
"three-months": "三個月",
"six-months": "六個月",
"one-year": "一年",
"sort-by": "排序依",
"sort-by": "排序依",
"last-reply-time": "最後回覆時間",
"topic-title": "主題",
"number-of-replies": "回覆數量",

View File

@@ -1,6 +1,6 @@
{
"success": "成功",
"topic-post": "的文章已張貼成功",
"topic-post": "的文章已張貼成功",
"authentication-successful": "驗證成功",
"settings-saved": "設定已儲存"
}

View File

@@ -32,7 +32,7 @@
"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": "標為未讀",
@@ -42,12 +42,12 @@
"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": "釘選主題",
@@ -56,7 +56,7 @@
"thread_tools.unlock": "解除主題鎖定",
"thread_tools.move": "移動主題",
"thread_tools.move_all": "移動全部",
"thread_tools.fork": "Fork 主題",
"thread_tools.fork": "分叉主題",
"thread_tools.delete": "刪除主題",
"thread_tools.delete-posts": "刪除張貼",
"thread_tools.delete_confirm": "你確定要刪除這個主題?",
@@ -107,7 +107,7 @@
"oldest_to_newest": "從舊到新",
"newest_to_oldest": "從新到舊",
"most_votes": "得票最多",
"most_posts": "最多post",
"most_posts": "最多張貼",
"stale.title": "改為建立新的主題?",
"stale.warning": "你正回覆的主題是非常舊的一篇。你想要改為建立一個新主題,然後參考到這篇你回覆的?",
"stale.create": "建立新主題",

View File

@@ -5,12 +5,12 @@
"joindate": "加入時間",
"postcount": "文章數量",
"email": "電子郵件",
"confirm_email": "確認電",
"confirm_email": "確認電子郵件",
"ban_account": "禁用帳號",
"ban_account_confirm": "你確定要禁用這個使用者?",
"unban_account": "取消禁用帳號",
"delete_account": "刪除帳戶",
"delete_account_confirm": "你確定要刪除自己的帳戶? <br /><strong>此操作不能復原,將無法恢復任何數據</strong><br /><br />輸入您的使用者名稱,以確認希望刪除這個帳戶。",
"delete_account_confirm": "你確定要刪除自己的帳戶? <br /><strong>此操作不能復原,將無法恢復任何數據</strong><br /><br />輸入你的帳號,用來確認希望刪除這個帳戶。",
"delete_this_account_confirm": "你確定要刪除這個帳戶? <br /><strong>此操作是不能還原的,你將無法回復任何資料</strong><br />",
"account-deleted": "帳號已刪除",
"fullname": "全名",
@@ -34,7 +34,7 @@
"follow": "跟隨",
"unfollow": "取消跟隨",
"more": "更多",
"profile_update_success": "的個人資料已更新成功!",
"profile_update_success": "的個人資料已更新成功!",
"change_picture": "改變頭像",
"change_username": "更改帳號",
"change_email": "更改電子郵件",
@@ -50,11 +50,11 @@
"change_password_error_wrong_current": "目前的密碼不正確!",
"change_password_error_length": "密碼太短!",
"change_password_error_match": "密碼必須要一致!",
"change_password_error_privileges": "沒有變更此密碼的權限!",
"change_password_error_privileges": "沒有變更此密碼的權限!",
"change_password_success": "你的密碼已經更新!",
"confirm_password": "確認密碼",
"password": "密碼",
"username_taken_workaround": "您所註冊的使用者名稱已經被使用了,所以我們將它略改變。你現在改稱 <strong>%1</strong>",
"username_taken_workaround": "你想要註冊的帳號已經被使用了,所以我們將它略改變。你現在的帳號名稱是 <strong>%1</strong>",
"password_same_as_username": "你的密碼和帳號是一樣的,請選擇另一組密碼。",
"password_same_as_email": "你的密碼和電子郵件是一樣的,請選擇另一組密碼。",
"upload_picture": "上傳頭像",
@@ -66,7 +66,7 @@
"show_fullname": "顯示我的全名",
"restrict_chats": "只允許我跟隨的用戶和我聊天",
"digest_label": "訂閱摘要",
"digest_description": "使用 eamil 訂閱本論壇新的訊息通知與主題 (根據您所設的時間表)",
"digest_description": "根據你所設的時間排程,用電子郵件訂閱這個討論區 (新的通知與主題)。",
"digest_off": "關閉",
"digest_daily": "每日",
"digest_weekly": "每週",

View File

@@ -5,7 +5,7 @@
"search": "搜尋",
"enter_username": "輸入想找的使用者帳號",
"load_more": "載入更多",
"users-found-search-took": "發現 %1 用戶!搜尋只用 %2 秒。",
"users-found-search-took": "找到 %1 使用者! 搜尋用了 %2 秒。",
"filter-by": "過濾依照",
"online-only": "線上僅有",
"invite": "邀請",

View File

@@ -50,12 +50,30 @@
color: @link-color;
}
// .floating-button can either be a container or the button itself
.floating-button {
background: @brand-primary !important;
position: fixed;
right: 30px;
bottom: 30px;
z-index: 1;
max-width: 56px;
button {
&.primary {
background: @brand-primary !important;
}
&.success {
background: @brand-success !important;
}
&:not(:last-child) {
margin-bottom: 2rem;
}
}
}
button.floating-button {
background: @brand-primary !important;
}
.user-img {

View File

@@ -0,0 +1,81 @@
"use strict";
/*global config, define, app, socket, ajaxify, bootbox, templates, Chart, utils */
define('admin/advanced/errors', ['Chart'], function(Chart) {
var Errors = {};
Errors.init = function() {
Errors.setupCharts();
$('[data-action="clear"]').on('click', Errors.clear404);
};
Errors.clear404 = function() {
bootbox.confirm('Are you sure you wish to clear the 404 error logs?', function(ok) {
if (ok) {
socket.emit('admin.errors.clear', {}, function(err) {
ajaxify.refresh();
app.alertSuccess('"404 Not Found" errors cleared');
});
}
});
};
Errors.setupCharts = function() {
var notFoundCanvas = document.getElementById('not-found'),
tooBusyCanvas = document.getElementById('toobusy'),
dailyLabels = utils.getDaysArray();
dailyLabels = dailyLabels.slice(-7);
if (utils.isMobile()) {
Chart.defaults.global.showTooltips = false;
}
var data = {
'not-found': {
labels: dailyLabels,
datasets: [
{
label: "",
fillColor: "rgba(186,139,175,0.2)",
strokeColor: "rgba(186,139,175,1)",
pointColor: "rgba(186,139,175,1)",
pointStrokeColor: "#fff",
pointHighlightFill: "#fff",
pointHighlightStroke: "rgba(186,139,175,1)",
data: ajaxify.data.analytics['not-found']
}
]
},
'toobusy': {
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['toobusy']
}
]
}
};
notFoundCanvas.width = $(notFoundCanvas).parent().width();
tooBusyCanvas.width = $(tooBusyCanvas).parent().width();
new Chart(notFoundCanvas.getContext('2d')).Line(data['not-found'], {
responsive: true,
animation: false
});
new Chart(tooBusyCanvas.getContext('2d')).Line(data['toobusy'], {
responsive: true,
animation: false
});
};
return Errors;
});

View File

@@ -31,12 +31,12 @@ define('admin/extend/plugins', function() {
app.alert({
alert_id: 'plugin_toggled',
title: 'Plugin ' + (status.active ? 'Enabled' : 'Disabled'),
message: status.active ? 'Please reload your NodeBB to fully activate this plugin' : 'Plugin successfully deactivated',
message: status.active ? 'Please restart your NodeBB to fully activate this plugin' : 'Plugin successfully deactivated',
type: status.active ? 'warning' : 'success',
timeout: 5000,
clickfn: function() {
require(['admin/modules/instance'], function(instance) {
instance.reload();
instance.restart();
});
}
});

View File

@@ -1,7 +1,7 @@
"use strict";
/*global config, define, app, socket, ajaxify, bootbox, templates, Chart, utils */
/*global config, define, app, socket, ajaxify, bootbox, templates, utils */
define('admin/manage/category-analytics', [], function() {
define('admin/manage/category-analytics', ['Chart'], function(Chart) {
var CategoryAnalytics = {};
CategoryAnalytics.init = function() {
@@ -80,7 +80,7 @@ define('admin/manage/category-analytics', [], function() {
data: ajaxify.data.analytics['posts:daily']
}
]
},
}
};
hourlyCanvas.width = $(hourlyCanvas).parent().width();

View File

@@ -59,6 +59,8 @@ define('forum/category', [
});
handleIgnoreWatch(cid);
$(window).trigger('action:topics.loaded', {topics: ajaxify.data.topics});
};
function handleIgnoreWatch(cid) {

View File

@@ -5,8 +5,8 @@
define('forum/recent', ['forum/infinitescroll', 'components'], function(infinitescroll, components) {
var Recent = {};
var newTopicCount = 0,
newPostCount = 0;
var newTopicCount = 0;
var newPostCount = 0;
$(window).on('action:ajaxify.start', function(ev, data) {
if (ajaxify.currentPage !== data.url) {
@@ -26,6 +26,8 @@ define('forum/recent', ['forum/infinitescroll', 'components'], function(infinite
if (!config.usePagination) {
infinitescroll.init(Recent.loadMoreTopics);
}
$(window).trigger('action:topics.loaded', {topics: ajaxify.data.topics});
};
Recent.watchForNewPosts = function () {

View File

@@ -168,33 +168,33 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator
postContainer.on('click', '[component="post/edit"]', function() {
var btn = $(this);
var timestamp = parseInt(getData(btn, 'data-timestamp'), 10);
var postEditDuration = parseInt(ajaxify.data.postEditDuration, 10);
if (postEditDuration && Date.now() - timestamp > postEditDuration * 1000) {
var numDays = Math.floor(postEditDuration / 86400);
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 (numDays) {
if (numHours) {
msg = '[[error:post-edit-duration-expired-days-hours, ' + numDays + ', ' + numHours + ']]';
msg = '[[error:post-edit-duration-expired-days-hours, ' + numDays + ', ' + numHours + ']]';
} else {
msg = '[[error:post-edit-duration-expired-days, ' + numDays + ']]';
}
}
} else if (numHours) {
if (numMinutes) {
msg = '[[error:post-edit-duration-expired-hours-minutes, ' + numHours + ', ' + numMinutes + ']]';
msg = '[[error:post-edit-duration-expired-hours-minutes, ' + numHours + ', ' + numMinutes + ']]';
} else {
msg = '[[error:post-edit-duration-expired-hours, ' + numHours + ']]';
}
}
} else if (numMinutes) {
if (numSeconds) {
msg = '[[error:post-edit-duration-expired-minutes-seconds, ' + numMinutes + ', ' + numSeconds + ']]';
msg = '[[error:post-edit-duration-expired-minutes-seconds, ' + numMinutes + ', ' + numSeconds + ']]';
} else {
msg = '[[error:post-edit-duration-expired-minutes, ' + numMinutes + ']]';
}
}
}
return app.alertError(msg);
}
@@ -232,7 +232,7 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator
var selection = window.getSelection ? window.getSelection() : document.selection.createRange();
var content = button.parents('[component="post"]').find('[component="post/content"]').get(0);
if (content && selection.containsNode(content, true)) {
if (selection && selection.containsNode && content && selection.containsNode(content, true)) {
var bounds = document.createRange();
bounds.selectNodeContents(content);
var range = selection.getRangeAt(0).cloneRange();

View File

@@ -20,6 +20,8 @@ define('forum/unread', ['forum/recent', 'topicSelect', 'forum/infinitescroll', '
recent.watchForNewPosts();
$(window).trigger('action:topics.loaded', {topics: ajaxify.data.topics});
$('#markSelectedRead').on('click', function() {
var tids = topicSelect.getSelectedTids();
if(!tids.length) {

View File

@@ -204,6 +204,7 @@ define('chat', [
app.loadJQueryUI(function() {
chatModal.find('.modal-content').resizable({
handles: 'n, e, s, w, se',
minHeight: 250,
minWidth: 400
});

View File

@@ -102,9 +102,11 @@ define('notifications', ['sounds', 'translator', 'components'], function(sound,
ajaxify.refresh();
}
if (!unreadNotifs[notifData.nid]) {
incrementNotifCount(1);
socket.emit('notifications.getCount', function(err, count) {
Notifications.updateNotifCount(count);
});
if (!unreadNotifs[notifData.nid]) {
sound.play('notification');
unreadNotifs[notifData.nid] = true;
}

View File

@@ -15,6 +15,7 @@ define('settings/checkbox', function () {
},
set: function (element, value) {
element.prop('checked', value);
element.closest('.mdl-switch').toggleClass('is-checked', element.is(':checked'));
},
get: function (element, trim, empty) {
var value = element.prop('checked');

View File

@@ -187,4 +187,11 @@ var db = require('./database');
}, callback);
};
Analytics.getErrorAnalytics = function(callback) {
async.parallel({
'not-found': async.apply(Analytics.getDailyStatsForSet, 'analytics:errors:404', Date.now(), 7),
'toobusy': async.apply(Analytics.getDailyStatsForSet, 'analytics:errors:503', Date.now(), 7)
}, callback);
};
}(exports));

View File

@@ -62,7 +62,7 @@ module.exports = function(Categories) {
},
function(results, next) {
if (data.cloneFromCid && parseInt(data.cloneFromCid, 10)) {
return Categories.copySettingsFrom(data.cloneFromCid, category.cid, next);
return Categories.copySettingsFrom(data.cloneFromCid, category.cid, !data.parentCid, next);
}
next(null, category);
},
@@ -81,7 +81,7 @@ module.exports = function(Categories) {
return [backgrounds[index], text[index]];
};
Categories.copySettingsFrom = function(fromCid, toCid, callback) {
Categories.copySettingsFrom = function(fromCid, toCid, copyParent, callback) {
var destination;
async.waterfall([
function (next) {
@@ -97,11 +97,11 @@ module.exports = function(Categories) {
destination = results.destination;
var tasks = [];
if (utils.isNumber(results.source.parentCid)) {
if (copyParent && utils.isNumber(results.source.parentCid)) {
tasks.push(async.apply(db.sortedSetAdd, 'cid:' + results.source.parentCid + ':children', results.source.order, toCid));
}
if (destination && utils.isNumber(destination.parentCid)) {
if (copyParent && destination && utils.isNumber(destination.parentCid)) {
tasks.push(async.apply(db.sortedSetRemove, 'cid:' + destination.parentCid + ':children', toCid));
}
@@ -114,8 +114,11 @@ module.exports = function(Categories) {
destination.numRecentReplies = results.source.numRecentReplies;
destination.class = results.source.class;
destination.imageClass = results.source.imageClass;
destination.parentCid = results.source.parentCid || 0;
if (copyParent) {
destination.parentCid = results.source.parentCid || 0;
}
tasks.push(async.apply(db.setObject, 'category:' + toCid, destination));
async.series(tasks, next);

View File

@@ -14,6 +14,7 @@ var adminController = {
},
events: require('./admin/events'),
logs: require('./admin/logs'),
errors: require('./admin/errors'),
database: require('./admin/database'),
postCache: require('./admin/postCache'),
plugins: require('./admin/plugins'),

View File

@@ -0,0 +1,30 @@
'use strict';
var async = require('async'),
json2csv = require('json-2-csv').json2csv;
var meta = require('../../meta'),
analytics = require('../../analytics');
var errorsController = {};
errorsController.get = function(req, res) {
async.parallel({
'not-found': async.apply(meta.errors.get, true),
analytics: async.apply(analytics.getErrorAnalytics)
}, function(err, data) {
res.render('admin/advanced/errors', data);
});
};
errorsController.export = function(req, res) {
async.waterfall([
async.apply(meta.errors.get, false),
async.apply(json2csv)
], function(err, csv) {
res.set('Content-Type', 'text/csv').set('Content-Disposition', 'attachment; filename="404.csv"').send(csv);
});
};
module.exports = errorsController;

View File

@@ -373,12 +373,14 @@ Controllers.handle404 = function(req, res) {
} else if (isLanguage.test(req.url)) {
res.status(200).json({});
} else if (req.path.startsWith(relativePath + '/uploads') || (req.get('accept') && req.get('accept').indexOf('text/html') === -1) || req.path === '/favicon.ico') {
meta.errors.log404(req.path || '');
res.sendStatus(404);
} else if (req.accepts('html')) {
if (process.env.NODE_ENV === 'development') {
winston.warn('Route requested but not found: ' + req.url);
}
meta.errors.log404(req.path.replace(/^\/api/, '') || '');
res.status(404);
if (res.locals.isAPI) {

View File

@@ -126,6 +126,7 @@ usersController.getUsers = function(set, uid, page, callback) {
loadmore_display: results.usersData.count > (stop - start + 1) ? 'block' : 'hide',
users: results.usersData.users,
pagination: pagination.create(page, pageCount),
userCount: results.usersData.count,
title: setToTitles[set] || '[[pages:users/latest]]',
breadcrumbs: helpers.buildBreadcrumbs(breadcrumbs),
setName: set,
@@ -171,12 +172,14 @@ function render(req, res, data, next) {
data.adminInviteOnly = registrationType === 'admin-invite-only';
data['reputation:disabled'] = parseInt(meta.config['reputation:disabled'], 10) === 1;
user.getInvitesNumber(req.uid, function(err, num) {
user.getInvitesNumber(req.uid, function(err, numInvites) {
if (err) {
return next(err);
}
data.invites = num;
res.append('X-Total-Count', data.userCount);
data.invites = numInvites;
res.render('users', data);
});
}

View File

@@ -520,7 +520,7 @@ module.exports = function(db, module) {
return callback();
}
var data = {};
value = helpers.fieldToString(value);
value = helpers.valueToString(value);
data.score = parseInt(increment, 10);
db.collection('objects').findAndModify({_key: key, value: value}, {}, {$inc: data}, {new: true, upsert: true}, function(err, result) {

View File

@@ -24,6 +24,7 @@ var async = require('async'),
require('./meta/sounds')(Meta);
require('./meta/settings')(Meta);
require('./meta/logs')(Meta);
require('./meta/errors')(Meta);
require('./meta/tags')(Meta);
require('./meta/dependencies')(Meta);
Meta.templates = require('./meta/templates');

35
src/meta/errors.js Normal file
View File

@@ -0,0 +1,35 @@
'use strict';
var async = require('async'),
winston = require('winston'),
validator = require('validator');
var db = require('../database'),
analytics = require('../analytics');
module.exports = function(Meta) {
Meta.errors = {};
Meta.errors.log404 = function(route, callback) {
callback = callback || function() {};
route = route.replace(/\/$/, ''); // remove trailing slashes
analytics.increment('errors:404');
db.sortedSetIncrBy('errors:404', 1, route, callback);
};
Meta.errors.get = function(escape, callback) {
db.getSortedSetRevRangeByScoreWithScores('errors:404', 0, -1, '+inf', '-inf', function(err, data) {
data = data.map(function(nfObject) {
nfObject.value = escape ? validator.escape(nfObject.value) : nfObject.value;
return nfObject;
});
callback(null, data);
});
};
Meta.errors.clear = function(callback) {
db.delete('errors:404', callback);
};
};

View File

@@ -29,7 +29,7 @@ var namespace = continuationLocalStorage.createNamespace(APP_NAMESPACE);
};
cls.setItem = cls.set;
cls.getItem = cls.set;
cls.getItem = cls.get;
cls.namespace = namespace;
cls.continuationLocalStorage = continuationLocalStorage;

View File

@@ -77,17 +77,21 @@ module.exports = function(app, middleware) {
user.isGlobalModerator(req.uid, next);
},
user: function(next) {
var userData = {
uid: 0,
username: '[[global:guest]]',
userslug: '',
email: '',
picture: meta.config.defaultAvatar,
status: 'offline',
banned: false,
reputation: 0,
'email:confirmed': false
};
if (req.uid) {
user.getUserFields(req.uid, ['username', 'userslug', 'email', 'picture', 'status', 'email:confirmed', 'banned'], next);
user.getUserFields(req.uid, Object.keys(userData), next);
} else {
next(null, {
username: '[[global:guest]]',
userslug: '',
picture: meta.config.defaultAvatar,
status: 'offline',
banned: false,
uid: 0
});
next(null, userData);
}
},
navigation: async.apply(navigation.get),

View File

@@ -302,6 +302,7 @@ middleware.privateUploads = function(req, res, next) {
middleware.busyCheck = function(req, res, next) {
if (global.env === 'production' && (!meta.config.hasOwnProperty('eventLoopCheckEnabled') || parseInt(meta.config.eventLoopCheckEnabled, 10) === 1) && toobusy()) {
analytics.increment('errors:503');
res.status(503).type('text/html').sendFile(path.join(__dirname, '../../public/503.html'));
} else {
next();

View File

@@ -268,6 +268,23 @@ var utils = require('../public/src/utils');
});
};
Notifications.rescind = function(nid, callback) {
callback = callback || function() {};
async.parallel([
async.apply(db.sortedSetRemove, 'notifications', nid),
async.apply(db.delete, 'notifications:' + nid)
], function(err) {
if (err) {
winston.error('Encountered error rescinding notification (' + nid + '): ' + err.message);
} else {
winston.verbose('[notifications/rescind] Rescinded notification "' + nid + '"');
}
callback(err, nid);
});
};
Notifications.markRead = function(nid, uid, callback) {
callback = callback || function() {};
if (!parseInt(uid, 10) || !nid) {
@@ -411,7 +428,6 @@ var utils = require('../public/src/utils');
Notifications.merge = function(notifications, callback) {
// When passed a set of notification objects, merge any that can be merged
var mergeIds = [
'notifications:favourited_your_post_in',
'notifications:upvoted_your_post_in',
'notifications:user_started_following_you',
'notifications:user_posted_to',
@@ -458,7 +474,7 @@ var utils = require('../public/src/utils');
}
switch(mergeId) {
case 'notifications:favourited_your_post_in': // intentional fall-through
// intentional fall-through
case 'notifications:upvoted_your_post_in':
case 'notifications:user_started_following_you':
case 'notifications:user_posted_to':

View File

@@ -82,6 +82,8 @@ function addRoutes(router, middleware, controllers) {
router.get('/advanced/database', middlewares, controllers.admin.database.get);
router.get('/advanced/events', middlewares, controllers.admin.events.get);
router.get('/advanced/logs', middlewares, controllers.admin.logs.get);
router.get('/advanced/errors', middlewares, controllers.admin.errors.get);
router.get('/advanced/errors/export', middlewares, controllers.admin.errors.export);
router.get('/advanced/post-cache', middlewares, controllers.admin.postCache.get);
router.get('/development/logger', middlewares, controllers.admin.logger.get);

View File

@@ -33,7 +33,8 @@ var async = require('async'),
settings: {},
email: {},
analytics: {},
logs: {}
logs: {},
errors: {}
};
SocketAdmin.before = function(socket, method, data, next) {
@@ -255,6 +256,11 @@ SocketAdmin.logs.clear = function(socket, data, callback) {
meta.logs.clear(callback);
};
SocketAdmin.errors.clear = function(socket, data, callback) {
console.log('clearing errors?');
meta.errors.clear(callback);
};
SocketAdmin.getMoreEvents = function(socket, next, callback) {
var start = parseInt(next, 10);
if (start < 0) {

View File

@@ -72,44 +72,31 @@ Categories.getPrivilegeSettings = function(socket, cid, callback) {
};
Categories.copyPrivilegesToChildren = function(socket, cid, callback) {
async.parallel({
category: function(next) {
categories.getCategories([cid], socket.uid, next);
},
privileges: function(next) {
privileges.categories.list(cid, next);
}
}, function(err, results) {
categories.getCategories([cid], socket.uid, function(err, categories) {
if (err) {
return callback(err);
}
var category = results.category[0];
var category = categories[0];
async.eachSeries(category.children, function(child, next) {
copyPrivilegesToChildrenRecursive(child, results.privileges.groups, next);
copyPrivilegesToChildrenRecursive(cid, child, next);
}, callback);
});
};
function copyPrivilegesToChildrenRecursive(category, privilegeGroups, callback) {
async.eachSeries(privilegeGroups, function(privGroup, next) {
var privs = Object.keys(privGroup.privileges);
async.each(privs, function(privilege, next) {
var isSet = privGroup.privileges[privilege];
groups[isSet ? 'join' : 'leave']('cid:' + category.cid + ':privileges:' + privilege, privGroup.name, next);
}, next);
}, function(err) {
function copyPrivilegesToChildrenRecursive(parentCid, category, callback) {
categories.copyPrivilegesFrom(parentCid, category.cid, function(err) {
if (err) {
return callback(err);
}
async.eachSeries(category.children, function(child, next) {
copyPrivilegesToChildrenRecursive(child, privilegeGroups, next);
copyPrivilegesToChildrenRecursive(parentCid, child, next);
}, callback);
});
}
Categories.copySettingsFrom = function(socket, data, callback) {
categories.copySettingsFrom(data.fromCid, data.toCid, callback);
categories.copySettingsFrom(data.fromCid, data.toCid, true, callback);
};
Categories.copyPrivilegesFrom = function(socket, data, callback) {

View File

@@ -77,7 +77,7 @@ function filterTidCidIgnorers(uids, tid, cid, callback) {
], callback);
}
SocketHelpers.sendNotificationToPostOwner = function(pid, fromuid, notification) {
SocketHelpers.sendNotificationToPostOwner = function(pid, fromuid, command, notification) {
if (!pid || !fromuid || !notification) {
return;
}
@@ -107,7 +107,7 @@ SocketHelpers.sendNotificationToPostOwner = function(pid, fromuid, notification)
bodyLong: results.postObj.content,
pid: pid,
path: '/post/' + pid,
nid: 'post:' + pid + ':uid:' + fromuid,
nid: command + ':post:' + pid + ':uid:' + fromuid,
from: fromuid,
mergeId: notification + '|' + pid,
topicTitle: results.topicTitle
@@ -124,7 +124,7 @@ SocketHelpers.sendNotificationToPostOwner = function(pid, fromuid, notification)
};
SocketHelpers.sendNotificationToTopicOwner = function(tid, fromuid, notification) {
SocketHelpers.sendNotificationToTopicOwner = function(tid, fromuid, command, notification) {
if (!tid || !fromuid || !notification) {
return;
}
@@ -150,7 +150,7 @@ SocketHelpers.sendNotificationToTopicOwner = function(tid, fromuid, notification
notifications.create({
bodyShort: '[[' + notification + ', ' + results.username + ', ' + titleEscaped + ']]',
path: '/topic/' + results.topicData.slug,
nid: 'tid:' + tid + ':uid:' + fromuid,
nid: command + ':tid:' + tid + ':uid:' + fromuid,
from: fromuid
}, next);
}
@@ -164,6 +164,17 @@ SocketHelpers.sendNotificationToTopicOwner = function(tid, fromuid, notification
});
};
SocketHelpers.rescindUpvoteNotification = function(pid, fromuid) {
var nid = 'upvote:post:' + pid + ':uid:' + fromuid;
notifications.rescind(nid);
posts.getPostField(pid, 'uid', function(err, uid) {
user.notifications.getUnreadCount(uid, function(err, count) {
websockets.in('uid_' + uid).emit('event:notifications.updateCount', count);
});
});
};
SocketHelpers.emitToTopicAndCategory = function(event, data) {
websockets.in('topic_' + data.tid).emit(event, data);
websockets.in('category_' + data.cid).emit(event, data);

View File

@@ -52,10 +52,6 @@ SocketPosts.reply = function(socket, data, callback) {
user.updateOnlineUsers(socket.uid);
socketHelpers.notifyNew(socket.uid, 'newPost', result);
if (data.lock) {
socketTopics.doTopicAction('lock', 'event:topic_locked', socket, {tids: [postData.topic.tid], cid: postData.topic.cid});
}
});
};

View File

@@ -92,7 +92,7 @@ module.exports = function(SocketPosts) {
};
SocketPosts.favourite = function(socket, data, callback) {
favouriteCommand(socket, 'favourite', 'favourited', 'notifications:favourited_your_post_in', data, callback);
favouriteCommand(socket, 'favourite', 'favourited', '', data, callback);
};
SocketPosts.unfavourite = function(socket, data, callback) {
@@ -103,7 +103,7 @@ module.exports = function(SocketPosts) {
if (!socket.uid) {
return callback(new Error('[[error:not-logged-in]]'))
}
if(!data || !data.pid || !data.room_id) {
if (!data || !data.pid || !data.room_id) {
return callback(new Error('[[error:invalid-data]]'));
}
async.parallel({
@@ -152,7 +152,9 @@ module.exports = function(SocketPosts) {
}
if (result && notification) {
socketHelpers.sendNotificationToPostOwner(data.pid, socket.uid, notification);
socketHelpers.sendNotificationToPostOwner(data.pid, socket.uid, command, notification);
} else if (result && command === 'unvote') {
socketHelpers.rescindUpvoteNotification(data.pid, socket.uid);
}
callback();
});

View File

@@ -28,7 +28,7 @@ module.exports = function(SocketPosts) {
topics.movePostToTopic(data.pid, data.tid, next);
},
function (next) {
socketHelpers.sendNotificationToPostOwner(data.pid, socket.uid, 'notifications:moved_your_post');
socketHelpers.sendNotificationToPostOwner(data.pid, socket.uid, 'move', 'notifications:moved_your_post');
next();
}
], callback);

View File

@@ -36,10 +36,6 @@ SocketTopics.post = function(socket, data, callback) {
return callback(err);
}
if (data.lock) {
SocketTopics.doTopicAction('lock', 'event:topic_locked', socket, {tids: [result.topicData.tid], cid: result.topicData.cid});
}
callback(null, result.topicData);
socket.emit('event:new_post', {posts: [result.postData]});

View File

@@ -40,7 +40,7 @@ module.exports = function(SocketTopics) {
socketHelpers.emitToTopicAndCategory('event:topic_moved', topicData);
socketHelpers.sendNotificationToTopicOwner(tid, socket.uid, 'notifications:moved_your_topic');
socketHelpers.sendNotificationToTopicOwner(tid, socket.uid, 'move', 'notifications:moved_your_topic');
next();
});

View File

@@ -0,0 +1,66 @@
<div class="row">
<div class="col-lg-9">
<div class="row">
<div class="col-sm-6 text-center">
<div class="panel panel-default">
<div class="panel-body">
<div><canvas id="not-found" height="250"></canvas></div>
</div>
<div class="panel-footer"><small><strong>Figure 1</strong> &ndash; <code>404 Not Found</code> events per day</small></div>
</div>
</div>
<div class="col-sm-6 text-center">
<div class="panel panel-default">
<div class="panel-body">
<div><canvas id="toobusy" height="250"></canvas></div>
</div>
<div class="panel-footer"><small><strong>Figure 2</strong> &ndash; <code>503 Service Unavailable</code> events per day</small></div>
</div>
</div>
</div>
</div>
<div class="col-lg-3 acp-sidebar">
<div class="panel panel-default">
<div class="panel-heading">Manage Error Log</div>
<div class="panel-body">
<div class="btn-group-vertical btn-block" role="group">
<a class="btn btn-info" target="_top" href="{config.relative_path}/admin/advanced/errors/export"><i class="fa fa-download"></i> Export Error Log (CSV)</a>
<button class="btn btn-danger" data-action="clear"><i class="fa fa-trash"></i> Clear Error Log</button>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-xs-12">
<div class="panel panel-default">
<div class="panel-heading"><i class="fa fa-exclamation-triangle"></i> 404 Not Found</div>
<div class="panel-body">
<table class="table table-striped">
<thead>
<th>Route</th>
<th>Count</th>
</thead>
<tbody>
<!-- BEGIN not-found -->
<tr>
<td>{../value}</td>
<td>{../score}</td>
</tr>
<!-- END not-found -->
<!-- IF !not-found.length -->
<tr>
<td colspan="2">
<div class="alert alert-success">
Hooray! There are no routes that were not found.
</div>
</td>
</tr>
<!-- ENDIF !not-found.length -->
</tbody>
</table>
</div>
</div>
</div>
</div>

View File

@@ -95,6 +95,7 @@
<li><a href="{relative_path}/admin/advanced/database">Database</a></li>
<li><a href="{relative_path}/admin/advanced/events">Events</a></li>
<li><a href="{relative_path}/admin/advanced/logs">Logs</a></li>
<li><a href="{relative_path}/admin/advanced/errors">Errors</a></li>
<li><a href="{relative_path}/admin/advanced/post-cache">Post Cache</a></li>
<!-- IF env -->
<li><a href="{relative_path}/admin/development/logger">Logger</a></li>
@@ -247,6 +248,7 @@
<li><a href="{relative_path}/admin/advanced/database">Database</a></li>
<li><a href="{relative_path}/admin/advanced/events">Events</a></li>
<li><a href="{relative_path}/admin/advanced/logs">Logs</a></li>
<li><a href="{relative_path}/admin/advanced/errors">Errors</a></li>
<li><a href="{relative_path}/admin/advanced/post-cache">Post Cache</a></li>
<!-- IF env -->
<li><a href="{relative_path}/admin/development/logger">Logger</a></li>

File diff suppressed because one or more lines are too long