+ flag get
+ flag creation, migration from socket method
+ flag update, migration from socket method
* fixed bug where you could not unassign someone from a flag
Feel free to close this if it is intentional, but as you are not allowed to delete other users notes I expect you shouldn't be able to edit them. Editing another users post also changes ownership, allowing you to then delete it.
I also added `error:` to the errormessage so that they display properly.
* test: failing test for issue
* fix: #9593, don't lock if email is identical to username
* fix: lock calls after first call
* fix: add back email check
* test: remove invalid test
Co-authored-by: Julian Lam <julian@nodebb.org>
The session reroll logic is still standard practice, but in some cases, it is not necessary or causes UX issues. An issue opened in session sharing (julianlam/nodebb-plugin-session-sharing#95) brought this to attention in that parsing the cookie to log in the user caused a reroll (as expected), but caused the session open on other tabs to be mismatched. If "re-validate" was turned on, it basically meant that it was not possible to use NodeBB with multiple tabs.
Session sharing now sets `reroll` to `false` if re-validate is enabled.
* Fixes flag note editing, deletion, and template update
Flag note datetime should be int.
Corrects argument order for note reloading.
* Chore: add missing radix
* fix: empty append bug
This line results in an error message popping up when clicking the flag notes text box, as the 'appendNote' case fires with no text. I can't tell that it serves any function.
* switch to ioredis
also need this fix in redisearch:
redis-search.js:98
```
redisClient.multi(cmds).exec(function(err, ids) {
if (err) {
return callback(err);
}
var errRes = ids[resultIndex];
if (errRes[0]) {
return callback(errRes[0]);
}
callback(null, errRes[1]);
});
```
* dbsearch compatible with ioredis
* fixed dbsearch?
Hook payload updated to pass login strategy (if overridden, this value will be something other than 'local'), and explicitly pass error if the login failed.
* fix: #9395, pass all data from client to Topics.reply
so plugins can set custom fields
refactor and use setDefaultPostData
* fix: circular json error
* refactor: change params
* refactor: automatically authenticate all requests setup through route helpers
* fix: removed connect-ensure-login dependency
* fix: bug with some middlewares not defined outside route helper methods
`action:flags.create` on initial flag creation
`action:flags.notify` on notification to admins and moderators
`action:flags.addReport` on flag report addition (called during initial flag create, too)
* Update taskbar.js
add aria-label to make the link text discernible to screen readers.
* place quotes around attribute value
Co-authored-by: Peter Jaszkowiak <p.jaszkow@gmail.com>
In some edge cases (e.g. SSO plugin redirecting the user immediately), with modern browsers, the request is never "completed" for speed. This causes a condition where the session object never persists to the database, even though it has changed. This added line forces a db persist on a successful login.
Context: https://github.com/expressjs/session/pull/484
One notable change is line 200, where a conditional was changed. The conditional used to check for `user.hasOwnProperty('picture')` and was added so that icons would only be included in the response if the picture was requested. This doesn't seem to apply as picture could be set regardless (see default avatar logic above), so I explicitly check `requestedFields` now.
>
> A plugin wanted to use `response:rotuer.page` to 404 a specific page on some condition. res.render returns early in send404 and so must be awaited otherwise multiple responses will be sent
If URL was set to something like `http://example.com:8080`, and port
was set to 4567, keep listening on port 4567 and keep linking through
URL that was specified.
This allows to listen on port 4567, while having NGINX (or any proxy)
set to listen on port 8080 and route traffic to port 4567.
So NodeBB can be "hidden" behind proxy while URL can still contain
non-standard port, i.e., port different than 80 and 443.
fix: ensure proper admin privilege checking on remounted `/admin` mount
fix: guard against plugins sending back missing mounts
fix: no need to make addRemountableRoutes awaitable
For 7+ years we were escaping this value, but it is in many cases already sanitized (as it may be a post content). For those cases when it is not, I now run it through parse.raw.
Instead of escaping, it now strips p, img, and a tags.
* feat: wip categories pagination
* feat: add subCategoriesPerPage setting
* feat: add load more sub categories button to category page
* fix: openapi spec
* feat: show sub categories left on category page
hide button when no more categories left
* breaking: rename categories to allCategories on /search
categories contains the search results
* fix: spec
* refactor: remove cidsPerPage
* fix: tests
* feat: use component for subcategories
* fix: prevent negative subCategoriesLeft
* feat: new category filter/search WIP
* feat: remove categories from /tag
* fix: dont load all categories when showing move modal
* feat: allow adding custom categories to list
* breaking: dont load entire category tree on post queue
removed unused code
add hooks to filter/selector
add options to filter/selector
* feat: make selector modal work again
* feat: replace old search module
* fix: topic move selector
* feat: dont load all categories on create category modal
* fix: fix more categorySelectors
* feat: dont load entire category tree on group details page
* feat: dont load all categories on home page and user settings page
* feat: add pagination to /user/:userslug/categories
* fix: update schemas
* fix: more tests
* fix: test
* feat: flags page, dont return entire category tree
* fix: flag test
* feat: categories manage page
dont load all categories
allow changing root category
clear caches properly
* fix: spec
* feat: admins&mods page
dont load all categories
* fix: spec
* fix: dont load all children when opening dropdown
* fix: on search results dont return all children
* refactor: pass all options, rename options.cids to options.selectedCids
* fix: #9266
* fix: index 0
* fix: spec
* feat: #9265, add setObjectBulk
* refactor: shoter updateOrder
* feat: selectors on categories/category
* fix: tests and search filter
* fix: category update test
* feat: pagination on acp categories page
show order in set order modal
* fix: allow drag&drop on pages > 1 in /admin/manage/categories
* fix: teasers for deep nested categories
fix sub category display on /category page
* fix: spec
* refactor: use eslint-disable-next-line
* refactor: shorter
Login route saves the previous page by checking for the X-Return-To header. This header is automatically set by ajaxify.
Login takes this value and saves it to `req.session`.
Up until now, `/register` saved the previous URL in a hidden input, and redirected based on that value, but it occasionally conflicted with req.session.returnTo. It was also confusing because it did not match how login handled the values.
This commit updates the route handling so it works identically to `/login`.
Adds a `Service-Worker-Allowed` header on `assets/src/service-worker.js` URL and uses `scope` option during registration to ensure the service worker is correctly scoped to the entire forum and only the forum.
* feat: wip categories pagination
* feat: add subCategoriesPerPage setting
* feat: add load more sub categories button to category page
* fix: openapi spec
* feat: show sub categories left on category page
hide button when no more categories left
* breaking: rename categories to allCategories on /search
categories contains the search results
* fix: spec
* refactor: remove cidsPerPage
* fix: tests
* feat: use component for subcategories
* fix: prevent negative subCategoriesLeft
If multiple sorted-lists were on separate pages, saving one page would erase the sorted-lists saved on the other page. This was caused by naive deletion of the sorted-lists index on settings save.
At the same time, a bug was found where if fewer items were passed in, only that many items were removed from the database, leaving leftover orphan data in the database.
The logic now:
- Only removes sorted-lists if they are passed in (and empty)
- Deletes all sorted list items, not just the items passed in.
`/api/post/pid/:pid`, `/api/topic/tid/:tid`, `/api/category/cid/:cid` have now been removed in favour of routes in the Write API (`/api/v3/(posts|topics|categories)/:id`)
The slowdown is fairly insignificant (< .1s), and the only change is the minified file is identical across environments, which is better from a debugging standpoint
These options were originally used when the flag filters were shown in the sidebar. This has seen been removed, and so the information is now superfluous
When combining filters, the old logic assumed that every filter was
exclusive, unless that filter contained multiple items, in which
case it was added to a list of "or" filters that returned all
matching flags.
A fault was discovered in that if you passed in multiple "or"
states, it did not return flags with the expected filtering.
e.g. open flags, closed flags, flags of cid 1, flags of cid 2
This could return open flags of cid 3, since all of the filters
were "OR"'d.
This logic change updates the behaviour so disparate OR sets are
intersected (ANDed).
This change is breaking in the sense that if you have written
interstitial callbacks before that are async functions _with_ a
callback, those are no longer allowed. You will not need to call
next() as that argument will no longer be passed in to async
functions.
Access checks were added for topic GET route, but occasionally a post_uuid is passed in, which is available to everyone, and so checks should be skipped
After conversing with Dave from CodeClimate, he suggested these changes to adjust CodeClimate's detection so that it does not alert as frequently for code blocks that are similar, but functionally different. I also added a line to enforce the rule of threes, since CC often alerted only when two blocks were identical.
When you select Custom Route as home you get a 404 error "/custom not found" error.
This because 'homePageRoute' property was used instead of 'homePageCustom'
when you have 4k+ categories manipulating DOM becomes very slow
clone the list and manipulate it outside of DOM, replace list on DOM when search is done
add utils.debounce so list is updated slower
- Resized thumb no longer skews aspect ratio
- Thumbs resized down to maximum thumb size by WIDTH only
- image.checkDimensions() now returns dimensions
- rename Thumbs.commit to Thumbs.migrate
- new PUT method that calls Thumbs.migrate
- `checkThumbPrivileges` now takes a single object parameter (ins. of req/res)
- addThumb and deleteThumb are now protected routes (duh)
- new getThumbs route GET /api/v3/topics/<tid>/thumbs
- Updated `assert.path` middleware to better handle if relative paths are received with upload_url
- Slight refactor of thumbs lib to use validator to differentiate between tid and UUID
* feat: socket.io 3 changes
* feat: replace socketio-wildcard with socket.onAny
up socket.io-redis to 6.x
* feat: remove mongodb/psql socket.io adapters
* feat: show data on fail
* fix: tests
* fix: typo
* fix: logger test fix
* fix: logger.io_close
* chore: up deps
* chore: update readme to reflect redis requirement
* fix: increase timeout show data if test fails
fix category link redirect on cold load
fix helpers.redirect if passed in url is external
fix ajaxify so it doesn't slice first character of external url
* fix: add back topic assert middleware for pin route
* feat: server-side handling of pin expiries
* refactor: togglePin to not require uid parameter [breaking]
* feat: automatic unpinning if pin has expiration set
* feat: client-side modal for setting pin expiration
* refactor: categories.getPinnedTids to accept multiple cids
... in preparation for pin expiry logic, direct access to *:pinned zsets is discouraged
* fix: remove references to since-removed jobs file for topics
* feat: expire pins when getPinnedTids is called
* refactor: make the togglePin change non-breaking
The 'action:topic.pin' hook now sends uid again, as before. However, if it is a system action (that is, a pin that expired), 'system' will be sent in instead of a valid uid
* Run grunt with debugger enabled
When forking a node.js thread we are also having the possibility to pass some node.js arguments, such as "--inspect=0.0.0.0". By providing this, we are adding the capability of doing live debugging even when the system is started with grunt.
* removed whitespace
* Update Gruntfile.js
display latest posts instead of oldest in topic rss feed
fix missing await that was causing rss_tokens to not function
fix feed test
more tests for getTopicWithPosts
* feat: #8444 Allow nested objects in translations
* feat: #8444 Allow nested objects in translations
* style: don't change formatting
* fix: don't use the first string match if key isn't finished
* feat: #8444 Allow nested objects in translations
* feat: #8444 Allow nested objects in translations
* style: don't change formatting
* fix: don't use the first string match if key isn't finished
* feat: add nested translations test
* feat: allow invites in normal registration mode + invite privilege
* feat: select groups to join from an invite
* test: check if groups from invitations have been joined
* fix: remove unused variable
* feat: write API versions of socket calls
* docs: openapi specs for the new routes
* test: iron out mongo redis difference
* refactor: move inviteGroups endpoint into write API
* refactor: use GET /api/v3/users/:uid/invites/groups
Instead of GET /api/v3/users/:uid/inviteGroups
* fix: no need for /api/v3 prefix when using api module
* fix: tests
* refactor: change POST /api/v3/users/invite
To POST /api/v3/users/:uid/invites
* refactor: make helpers.invite awaitable
* fix: restrict invite API to self-use only
* fix: move invite groups controller to write api, +tests
* fix: tests
Co-authored-by: Julian Lam <julian@nodebb.org>
* feat: allow groups to specify which cids to show member posts from
* docs: fix tests for openapi
* fix: test breakage caused by improper conditional
* feat: server-side checking of memberPostCids for validity
* feat: admin panel template update to select categories to include
* refactor: privilege helpers.isUserAllowedTo
... to helpers.isAllowedTo, allowing group names to be passed in
* feat: #7514 Optional timer for registration queue
* feat: show minutes in average time
* fix: don't show total number of minutes
* feat: implement requested changes
* fix: just store minutes instead of milliseconds
* feat: set default values
* feat: allow passwords longer than 73 characters
Context: A bcrypt/blowfish limitation means that password length is capped at 72 characters. We can get around this without compromising on security
by hashing all incoming passwords with SHA512, and then sending that to bcrypt.
https://dropbox.tech/security/how-dropbox-securely-stores-your-passwords
* feat: add additional test for passwords > 73 chars
* fix: remove 'password-too-long' error message and all invocations
* test: added test to show that a super long password won't bring down NodeBB
* fix: remove debug log
* Revert "fix: remove 'password-too-long' error message and all invocations"
This reverts commit 1e312bf7ef.
* fix: added back password length checks, but at 512 chars
As processing a large string still uses a lot of memory
* feat: use github actions for ci
- test using minimum supported db versions
- ESLint will make review comments on PRs
- formatted configs
* mess up eslint
* fix: lint maybe
Co-authored-by: Barış Soner Uşaklı <baris@nodebb.org>
If the post template contains references to items outside of the scope of the post, then when the post is loaded via IS, the expected values are empty.
This was due to createNewPosts calling app.parseAndTranslate with a subset of the page payload. This works fine in Persona (and most other themes)
because they do not refer to properties outside of the post object, but it may be helpful to include the rest of the ajaxify data as well.
@baris Also, I am now allowing the following properties to be saved in User.saveSettings:
- categoryTopicSort
- topicPostSort
- setCategorySort
- setTopicSort
This is a breaking change if your install uses multiple URLs to access. You will need to update the Access-Control-Allow-Origin header in ACP > Advanced > Headers to supply all URLs you use to access your site
* feat: updating logo assets, square logos missing still
* fix: squared logo for touch icon and notification fallback
* fix: update link to favicon
* feat: add default touch icon sizes, if one isn't uploaded
Co-authored-by: Barış Soner Uşaklı <barisusakli@gmail.com>
'node_redis: The HGET command contains a invalid argument type.\n' +
'Only strings, dates and buffers are accepted. Please update your code to use valid argument types.'
only return promise if callback is undefined
dont append baseUrl if url already starts with api
correctly handle writeapi readapi response for data/error
remove unused onError
dont append empty ? to url for get routes
* feat: wip admin/users
* feat: more work
* feat: more fixes
* feat: #8662, verified/unverified user groups
* feat: add filter
* feat: change user search to use filters array
* refactor: remove unused search call
* fix: tests
* fix: cant join system groups
* fix: upgrade script
* feat: #8734, jquery-ui, jquery-form, timeago
get rid of forum/footer.js move that code to app.js & wait for app to load before calling ajaxify.end
make sockets.js a requirejs module
move jquery-ui to node_modules and load via requirejs
move jquery-form to node_modules and load via requirejs
move timeago to node_modules and load via requirejs
only include the css for needed jquery-ui widgets
* feat: keep socket/io global for backwards compat
* refactor: move socket listener to chat
* feat: revoke user sessions above threshold
* fix: removed translations from en-US
* fix: defined default maxUserSessions in install\data\defaults.json
This reverts commit a395324b52, and
fixes the issue where the ACP became unusable because of the earlier
variant of this code.
Thanks @psychobunny for spotting.
This solves a small UX issue where clicking on a button (or anchor
that is not meant to be ajaxified) before ajaxify.end is called
leads to nothing happening because the appropriate click handler
has not been added.
This code will intercept premature clicks, wait until ajaxify.end
is called, and then re-send the click.
* feat: fullname search
* fix: take last element
* fix: attempt to fix psql like query
* feat: upgrade sript, another fix attempt
* fix: psql test
* fix: psql scan
* feat: add debug for test
* feat: test collate
* feat: cleanup
* fix: upgrade script
* refactor: socket posts delete/restore/purge so tid is not necessary
* refactor: stop trying to be fancy
* fix: tests to not pass in tid into posts.deletePosts
* fix: some more unnecessary tid passing
* Removed invalid options for the sendmail transport that were causing Nodemailer to return the SMTPTransport instead.
* Removed options for rate limiting in admin email interface. Added new option for toggling whether to use pooled connections.
There was an odd issue where non-superadmins could not use
the /admin route to access the ACP, even though they had
appropriate access. For whatever reason, it could not
be reliably reproduced on my dev. As it turns out, the
reason was because I was checking the wrong privilege,
and my dev database had this wrong privilege leftover
from the initial development of the ACP admin privileges
feature. Dumb.
Anyhow, that fixes this issue.
9adaccd036 introduced the ability to
configure an assetBaseUrl, but the timeago strings were still
calling a hardcoded value as it was handled server-side. There's
no need for the strings to be loaded until timeago is initialised.
Additional base URLs were necessary for benchpress and translator,
and in order to not clutter the API response with needless one-
time use base URLs, I decided to use a single base that is used
by all of the services, assetBaseUrl.
We used to send a soft 404 because require.js would error out on
a 404, but it seems years ago, error handling was added to the
require() call, so a hard 404 will not throw errors to the console
* feat: privileges save button, #8537, WIP
* fix: disable firefox autocomplete on privilege form fields
* feat: closes#8537 privilege changes commit on save
- new language strings for confirmation and success modals/toasts
- indeterminate privilege handling (/cc @psychobunny)
- added new discard button
- both discard and save buttons now have confirmation dialogs
* fix(tests): remove duplicate template helper test
* fix(tests): broken template helper test
* feat: confirm dialogs for all privilege copy actions
Also, ability to add user to a privilege table without needing
to refresh the privilege table.
* feat: group row addition w/o table refresh
breaking: helpers.getUserPrivileges and helpers.getGroupPrivileges
no longer make socket calls to the following hooks:
- filter:privileges.list, filter:privileges.admin.list,
filter:privileges.global.list, filter:privileges.groups.list,
filter:privileges.admin.groups.list,
filter:privileges.gloval.groups.list
The filters are still called, but done before the helper method
is called, and the results are passed in instead. This change
should only affect you if you directly call the helper methods,
otherwise the change is transparent.
* fix: stale ajaxify data on privilege category switch
* fix: implicit privileges not showing for user privs
* fix: groups, not group, also fix tests
* fix(tests): again
* fix: wrong tpl rendered when adding group to global priv table
"message": "for..in loops iterate over the entire prototype chain, which is virtually never what you want. Use Object.{keys,values,entries}, and iterate over the resulting array."
},
{
"selector": "LabeledStatement",
"message": "Labels are a form of GOTO; using them makes code confusing and hard to maintain and understand."
},
{
"selector": "WithStatement",
"message": "`with` is disallowed in strict mode because it makes code impossible to predict and optimize."
NodeBB's security policy is based around a private bug bounty program. Users are invited to explore NodeBB for vulnerabilities, and report them to the NodeBB team so that they can be patched.
If you have found a security vulnerability, **do not post it onto our GitHub tracker**. Some security vulnerabilities are quite severe and discretion is recommended. Email the NodeBB Security Team at security@nodebb.org, instead.
# Bug Bounty Program
Security vulnerability reports may be eligible for a bounty based on severity and confirmation from NodeBB team members. For full details regarding our bug bounty program, including the bounty amounts, please consult the following page: https://blog.nodebb.org/bounty
[**NodeBB Forum Software**](https://nodebb.org) is powered by Node.js and built on either a Redis or MongoDB database. It utilizes web sockets for instant interactions and real-time notifications. NodeBB has many modern features out of the box such as social network integration and streaming discussions, while still making sure to be compatible with older browsers.
[**NodeBB Forum Software**](https://nodebb.org) is powered by Node.js and supports either Redis, MongoDB, or a PostgreSQL database. It utilizes web sockets for instant interactions and real-time notifications. NodeBB has many modern features out of the box such as social network integration and streaming discussions, while still making sure to be compatible with older browsers.
Additional functionality is enabled through the use of third-party plugins.
Additional functionality is enabled through the use of third-party plugins.
* [Demo & Meta Discussion](http://community.nodebb.org)
// except for allowing for..in, because for..of is unavailable on some clients
"no-restricted-syntax": [
"error",
{
"selector": "ForOfStatement",
"message": "iterators/generators require regenerator-runtime, which is too heavyweight for this guide to allow them. Separately, loops should be avoided in favor of array iterations."
},
{
"selector": "LabeledStatement",
"message": "Labels are a form of GOTO; using them makes code confusing and hard to maintain and understand."
},
{
"selector": "WithStatement",
"message": "`with` is disallowed in strict mode because it makes code impossible to predict and optimize."
"upgrade-available":"<p>A new version (v%1) has been released. Consider <a href=\"https://docs.nodebb.org/configuring/upgrade/\" target=\"_blank\">upgrading your NodeBB</a>.</p>",
"upgrade-available":"<p>A new version (v%1) has been released. Consider <a href=\"https://docs.nodebb.org/configuring/upgrade/\" target=\"_blank\">upgrading your NodeBB</a>.</p>",
"prerelease-upgrade-available":"<p>This is an outdated pre-release version of NodeBB. A new version (v%1) has been released. Consider <a href=\"https://docs.nodebb.org/configuring/upgrade/\" target=\"_blank\">upgrading your NodeBB</a>.</p>",
"prerelease-upgrade-available":"<p>This is an outdated pre-release version of NodeBB. A new version (v%1) has been released. Consider <a href=\"https://docs.nodebb.org/configuring/upgrade/\" target=\"_blank\">upgrading your NodeBB</a>.</p>",
"prerelease-warning":"<p>هذه نسخة <strong>ماقبل الإصدار</strong> من NodeBB. قد تحدث أخطاء غير مقصودة. <i class=\"fa fa-exclamation-triangle\"></i></p>",
"prerelease-warning":"<p>هذه نسخة <strong>ماقبل الإصدار</strong> من NodeBB. قد تحدث أخطاء غير مقصودة. <i class=\"fa fa-exclamation-triangle\"></i></p>",
"fallback-emailer-not-found":"Fallback emailer not found!",
"running-in-development":"المنتدى قيد التشغيل في وضع \"المطورين\". وقد تكون هناك ثغرات أمنية مفتوحة؛ من فضلك تواصل مع مسؤول نظامك.",
"running-in-development":"المنتدى قيد التشغيل في وضع \"المطورين\". وقد تكون هناك ثغرات أمنية مفتوحة؛ من فضلك تواصل مع مسؤول نظامك.",
"latest-lookup-failed":"<p>Failed to look up latest available version of NodeBB</p>",
"latest-lookup-failed":"<p>Failed to look up latest available version of NodeBB</p>",
@@ -75,5 +77,12 @@
"graphs.registered-users":"مستخدمين مسجلين",
"graphs.registered-users":"مستخدمين مسجلين",
"graphs.anonymous-users":"مستخدمين مجهولين",
"graphs.anonymous-users":"مستخدمين مجهولين",
"last-restarted-by":"Last restarted by",
"last-restarted-by":"Last restarted by",
"no-users-browsing":"No users browsing"
"no-users-browsing":"No users browsing",
"back-to-dashboard":"Back to Dashboard",
"details.no-users":"No users have joined within the selected timeframe",
"details.no-topics":"No topics have been posted within the selected timeframe",
"details.no-logins":"No logins have been recorded within the selected timeframe",
"details.logins-static":"NodeBB only saves session data for %1 days, and so this table below will only show the most recently active sessions",
"set-order-help":"Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.",
"select-category":"Select Category",
"select-category":"Select Category",
"set-parent-category":"Set Parent Category",
"set-parent-category":"Set Parent Category",
@@ -45,6 +50,8 @@
"privileges.no-users":"No user-specific privileges in this category.",
"privileges.no-users":"No user-specific privileges in this category.",
"privileges.section-group":"Group",
"privileges.section-group":"Group",
"privileges.group-private":"This group is private",
"privileges.group-private":"This group is private",
"privileges.inheritance-exception":"This group does not inherit privileges from registered-users group",
"privileges.banned-user-inheritance":"Banned users inherit privileges from banned-users group",
"privileges.search-group":"Add Group",
"privileges.search-group":"Add Group",
"privileges.copy-to-children":"Copy to Children",
"privileges.copy-to-children":"Copy to Children",
"privileges.copy-from-category":"Copy from Category",
"privileges.copy-from-category":"Copy from Category",
"alert.none-active":"You have no active categories.",
"alert.none-active":"You have no active categories.",
"alert.create":"Create a Category",
"alert.create":"Create a Category",
"alert.confirm-moderate":"<strong>Are you sure you wish to grant the moderation privilege to this user group?</strong> This group is public, and any users can join at will.",
"alert.confirm-purge":"<p class=\"lead\">Do you really want to purge this category \"%1\"?</p><h5><strong class=\"text-danger\">Warning!</strong> All topics and posts in this category will be purged!</h5> <p class=\"help-block\">Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category <em>temporarily</em>, you'll want to \"disable\" the category instead.</p>",
"alert.confirm-purge":"<p class=\"lead\">Do you really want to purge this category \"%1\"?</p><h5><strong class=\"text-danger\">Warning!</strong> All topics and posts in this category will be purged!</h5> <p class=\"help-block\">Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category <em>temporarily</em>, you'll want to \"disable\" the category instead.</p>",
"global.no-users":"No user-specific global privileges.",
"admin":"Admin",
"admin":"Admin",
"group-privileges":"Group Privileges",
"group-privileges":"Group Privileges",
"user-privileges":"User Privileges",
"user-privileges":"User Privileges",
"edit-privileges":"Edit Privileges",
"edit-privileges":"Edit Privileges",
"select-clear-all":"Select/Clear All",
"chat":"Chat",
"chat":"Chat",
"upload-images":"Upload Images",
"upload-images":"Upload Images",
"upload-files":"Upload Files",
"upload-files":"Upload Files",
"signature":"Signature",
"signature":"Signature",
"ban":"Ban",
"ban":"Ban",
"invite":"Invite",
"search-content":"Search Content",
"search-content":"Search Content",
"search-users":"Search Users",
"search-users":"Search Users",
"search-tags":"Search Tags",
"search-tags":"Search Tags",
@@ -24,6 +25,7 @@
"access-topics":"Access Topics",
"access-topics":"Access Topics",
"create-topics":"Create Topics",
"create-topics":"Create Topics",
"reply-to-topics":"Reply to Topics",
"reply-to-topics":"Reply to Topics",
"schedule-topics":"Schedule Topics",
"tag-topics":"Tag Topics",
"tag-topics":"Tag Topics",
"edit-posts":"Edit Posts",
"edit-posts":"Edit Posts",
"view-edit-history":"View Edit History",
"view-edit-history":"View Edit History",
@@ -38,5 +40,21 @@
"admin-categories":"Categories",
"admin-categories":"Categories",
"admin-privileges":"Privileges",
"admin-privileges":"Privileges",
"admin-users":"Users",
"admin-users":"Users",
"admin-settings":"Settings"
"admin-admins-mods":"Admins & Mods",
"admin-groups":"Groups",
"admin-tags":"Tags",
"admin-settings":"Settings",
"alert.confirm-moderate":"<strong>Are you sure you wish to grant the moderation privilege to this user group?</strong> This group is public, and any users can join at will.",
"alert.confirm-admins-mods":"<strong>Are you sure you wish to grant the "Admins & Mods" privilege to this user/group?</strong> Users with this privilege are able to promote and demote other users into privileged positions, <em>including super administrator</em>",
"alert.confirm-save":"Please confirm your intention to save these privileges",
"alert.saved":"Privilege changes saved and applied",
"alert.confirm-discard":"Are you sure you wish to discard your privilege changes?",
"alert.discarded":"Privilege changes discarded",
"alert.confirm-copyToAll":"Are you sure you wish to apply this privilege set to <strong>all categories</strong>?",
"alert.confirm-copyToAllGroup":"Are you sure you wish to apply this group's privilege set to <strong>all categories</strong>?",
"alert.confirm-copyToChildren":"Are you sure you wish to apply this privilege set to <strong>all descendant (child) categories</strong>?",
"alert.confirm-copyToChildrenGroup":"Are you sure you wish to apply this group's privilege set to <strong>all descendant (child) categories</strong>?",
"alert.no-undo":"<em>This action cannot be undone.</em>",
"alert.admin-warning":"Administrators implicitly get all privileges"
"analytics.max-cache":"Analytics Cache Max Value",
"analytics.max-cache-help":"On high-traffic installs, the cache could be exhausted continuously if there are more concurrent active users than the Max Cache value. (Restart required)",
"compression.settings":"Compression Settings",
"compression.enable":"Enable Compression",
"compression.help":"This setting enables gzip compression. For a high-traffic website in production, the best way to put compression in place is to implement it at a reverse proxy level. You can enable it here for testing purposes."
"lead-text":"From this page you can configure access to the Write API in NodeBB.",
"intro":"By default, the Write API authenticates users based on their session cookie, but NodeBB also supports Bearer authentication via tokens generated via this page.",
"docs":"Click here to access the full API specification",
"require-https":"Require API usage via HTTPS only",
"require-https-caveat":"<strong>Note</strong>: Some installations involving load balancers may proxy their requests to NodeBB using HTTP, in which case this option should remain disabled.",
"uid":"User ID",
"uid-help-text":"Specify a User ID to associate with this token. If the user ID is <code>0</code>, it will be considered a <em>master</em> token, which can assume the identity of other users based on the <code>_uid</code> parameter",
"description":"Description",
"no-description":"No description specified.",
"token-on-save":"Token will be generated once form is saved"
"sendmail-rate-delta":"... every <em>X</em> milliseconds",
"sendmail-rate-help":"Instructs the NodeBB mailer to limit the number of messages sent at once in order to not overwhelm email receiving services. These options do not apply if SMTP Transport is enabled (below).",
"smtp-transport":"SMTP Transport",
"smtp-transport":"SMTP Transport",
"smtp-transport.enabled":"Use an external email server to send emails",
"smtp-transport.enabled":"Use an external email server to send emails",
@@ -25,6 +22,8 @@
"smtp-transport.username":"Username",
"smtp-transport.username":"Username",
"smtp-transport.username-help":"<b>For the Gmail service,</b> enter the full email address here, especially if you are using a Google Apps managed domain.",
"smtp-transport.username-help":"<b>For the Gmail service,</b> enter the full email address here, especially if you are using a Google Apps managed domain.",
"smtp-transport.password":"Password",
"smtp-transport.password":"Password",
"smtp-transport.pool":"Enable pooled connections",
"smtp-transport.pool-help":"Pooling connections prevents NodeBB from creating a new connection for every email. This option only applies if SMTP Transport is enabled.",
"template":"Edit Email Template",
"template":"Edit Email Template",
"template.select":"Select Email Template",
"template.select":"Select Email Template",
@@ -36,5 +35,7 @@
"subscriptions":"Email Digests",
"subscriptions":"Email Digests",
"subscriptions.disable":"Disable email digests",
"subscriptions.disable":"Disable email digests",
"subscriptions.hour":"Digest Hour",
"subscriptions.hour":"Digest Hour",
"subscriptions.hour-help":"Please enter a number representing the hour to send scheduled email digests (e.g. <code>0</code> for midnight, <code>17</code> for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.<br /> The approximate server time is: <span id=\"serverTime\"></span><br /> The next daily digest is scheduled to be sent <span id=\"nextDigestTime\"></span>"
"subscriptions.hour-help":"Please enter a number representing the hour to send scheduled email digests (e.g. <code>0</code> for midnight, <code>17</code> for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.<br /> The approximate server time is: <span id=\"serverTime\"></span><br /> The next daily digest is scheduled to be sent <span id=\"nextDigestTime\"></span>",
"log.alt-text-placeholder":"Alternative text for accessibility",
"log.alt-text-placeholder":"Alternative text for accessibility",
"favicon":"صورة المفضله",
"favicon":"صورة المفضله",
"favicon.upload":"رفع",
"favicon.upload":"رفع",
"touch-icon":"Homescreen/Touch Icon",
"pwa":"Progressive Web App",
"touch-icon":"Touch Icon",
"touch-icon.upload":"رفع",
"touch-icon.upload":"رفع",
"touch-icon.help":"Recommended size and format: 192x192, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.",
"touch-icon.help":"Recommended size and format: 512x512, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.",
"maskable-icon":"Maskable (Homescreen) Icon",
"maskable-icon.help":"Recommended size and format: 512x512, PNG format only. If no maskable icon is specified, NodeBB will fall back to the Touch Icon.",
"background-color-help":"Color used for splash screen background when website is installed as a PWA"
"background-color-help":"Color used for splash screen background when website is installed as a PWA",
}
"undo-timeout":"Undo Timeout",
"undo-timeout-help":"Some operations such as moving topics will allow for the moderator to undo their action within a certain timeframe. Set to 0 to disable undo completely.",
"handles.enabled-help":"This option exposes a new field that allows guests to pick a name to associate with each post they make. If disabled, they will simply be called \"Guest\""
"handles.enabled-help":"This option exposes a new field that allows guests to pick a name to associate with each post they make. If disabled, they will simply be called \"Guest\"",
"topic-views.enabled":"Allow guests to increase topic view counts",
"reply-notifications.enabled":"Allow guests to generate reply notifications"
"timestamp.cut-off-help":"Dates & times will be shown in a relative manner (e.g. \"3 hours ago\" / \"5 days ago\"), and localised into various\n\t\t\t\t\tlanguages. After a certain point, this text can be switched to display the localised date itself\n\t\t\t\t\t(e.g. 5 Nov 2016 15:30).<br /><em>(Default: <code>30</code>, or one month). Set to 0 to always display dates, leave blank to always display relative times.</em>",
"timestamp.cut-off-help":"Dates & times will be shown in a relative manner (e.g. \"3 hours ago\" / \"5 days ago\"), and localised into various\n\t\t\t\t\tlanguages. After a certain point, this text can be switched to display the localised date itself\n\t\t\t\t\t(e.g. 5 Nov 2016 15:30).<br /><em>(Default: <code>30</code>, or one month). Set to 0 to always display dates, leave blank to always display relative times.</em>",
"timestamp.necro-threshold":"Necro Threshold (in days)",
"timestamp.necro-threshold":"Necro Threshold (in days)",
"timestamp.necro-threshold-help":"A message will be shown between posts if the time between them is longer than the necro threshold. (Default: <code>7</code>, or one week). Set to 0 to disable.</em>",
"timestamp.necro-threshold-help":"A message will be shown between posts if the time between them is longer than the necro threshold. (Default: <code>7</code>, or one week). Set to 0 to disable.</em>",
"timestamp.topic-views-interval":"Increment topic views interval (in minutes)",
"timestamp.topic-views-interval-help":"Topic views will only increment once every X minutes as defined by this setting.",
"teaser":"Teaser Post",
"teaser":"Teaser Post",
"teaser.last-post":"Last – Show the latest post, including the original post, if no replies",
"teaser.last-post":"Last – Show the latest post, including the original post, if no replies",
"teaser.last-reply":"Last – Show the latest reply, or a \"No replies\" placeholder if no replies",
"teaser.last-reply":"Last – Show the latest reply, or a \"No replies\" placeholder if no replies",
"flags.limit-per-target-help":"When a post or user is flagged multiple times, each additional flag is considered a "report" and added to the original flag. Set this option to a number other than zero to limit the number of reports an item can receive.",
"flags.auto-resolve-on-ban":"Automatically resolve all of a user's tickets when they are banned"
"allowed-file-extensions-help":"أدخل قائمة بامتدادات الملفات مفصولة بفواصل (مثال: <code>pdf,xls,doc</code>). القائمة الفارغة تعني أن كل الامتدادات مسموح بها.",
"allowed-file-extensions-help":"أدخل قائمة بامتدادات الملفات مفصولة بفواصل (مثال: <code>pdf,xls,doc</code>). القائمة الفارغة تعني أن كل الامتدادات مسموح بها.",
"upload-limit-threshold":"Rate limit user uploads to:",
"hide-fullname":"إخفاء الإسم الكامل عن المستخدمين",
"hide-fullname":"إخفاء الإسم الكامل عن المستخدمين",
"hide-email":"إخفاء البريد الإلكتروني عن المستخدمين",
"hide-email":"إخفاء البريد الإلكتروني عن المستخدمين",
"show-fullname-as-displayname":"Show user's full name as their display name if available",
"themes":"القوالب",
"themes":"القوالب",
"disable-user-skins":"منع المستخدمين من اختيار سمة مخصص",
"disable-user-skins":"منع المستخدمين من اختيار سمة مخصص",
"account-protection":"حماية الحساب",
"account-protection":"حماية الحساب",
@@ -43,6 +44,9 @@
"registration-type.disabled":"لا يوجد تسجيل",
"registration-type.disabled":"لا يوجد تسجيل",
"registration-type.help":"Normal - Users can register from the /register page.<br/>\nInvite Only - Users can invite others from the <a href=\"%1/users\" target=\"_blank\">users</a> page.<br/>\nAdmin Invite Only - Only administrators can invite others from <a href=\"%1/users\" target=\"_blank\">users</a> and <a href=\"%1/admin/manage/users\">admin/manage/users</a> pages.<br/>\nNo registration - No user registration.<br/>",
"registration-type.help":"Normal - Users can register from the /register page.<br/>\nInvite Only - Users can invite others from the <a href=\"%1/users\" target=\"_blank\">users</a> page.<br/>\nAdmin Invite Only - Only administrators can invite others from <a href=\"%1/users\" target=\"_blank\">users</a> and <a href=\"%1/admin/manage/users\">admin/manage/users</a> pages.<br/>\nNo registration - No user registration.<br/>",
"registration-approval-type.help":"Normal - Users are registered immediately.<br/>\nAdmin Approval - User registrations are placed in an <a href=\"%1/admin/manage/registration\">approval queue</a> for administrators.<br/>\nAdmin Approval for IPs - Normal for new users, Admin Approval for IP addresses that already have an account.<br/>",
"registration-approval-type.help":"Normal - Users are registered immediately.<br/>\nAdmin Approval - User registrations are placed in an <a href=\"%1/admin/manage/registration\">approval queue</a> for administrators.<br/>\nAdmin Approval for IPs - Normal for new users, Admin Approval for IP addresses that already have an account.<br/>",
"invalid-username-or-password":"المرجود تحديد اسم مستخدم و كلمة مرور",
"invalid-username-or-password":"المرجود تحديد اسم مستخدم و كلمة مرور",
"invalid-search-term":"كلمة البحث غير صحيحة",
"invalid-search-term":"كلمة البحث غير صحيحة",
"invalid-url":"Invalid URL",
"invalid-url":"Invalid URL",
"invalid-event":"Invalid event: %1",
"local-login-disabled":"Local login system has been disabled for non-privileged accounts.",
"local-login-disabled":"Local login system has been disabled for non-privileged accounts.",
"csrf-invalid":"لم تتمكن من تسجيل الدخول. هنالك أحتمال ان جلستك انتهت. رجاءًا حاول مرة اخرى.",
"csrf-invalid":"لم تتمكن من تسجيل الدخول. هنالك أحتمال ان جلستك انتهت. رجاءًا حاول مرة اخرى.",
"invalid-pagination-value":"رقم الصفحة غير صحيح ، يجب أن يكون بين %1 و %2 .",
"invalid-pagination-value":"رقم الصفحة غير صحيح ، يجب أن يكون بين %1 و %2 .",
"username-taken":"اسم المستخدم مأخوذ",
"username-taken":"اسم المستخدم مأخوذ",
"email-taken":"البريد الالكتروني مأخوذ",
"email-taken":"البريد الالكتروني مأخوذ",
"email-invited":"Email was already invited",
"email-not-confirmed":"You are unable to post until your email is confirmed, please click here to confirm your email.",
"email-not-confirmed":"You are unable to post until your email is confirmed, please click here to confirm your email.",
"email-not-confirmed-chat":"لا يمكنك الدردشة حتى تقوم بتأكيد بريدك الإلكتروني، الرجاء إضغط هنا لتأكيد بريدك اﻹلكتروني.",
"email-not-confirmed-chat":"لا يمكنك الدردشة حتى تقوم بتأكيد بريدك الإلكتروني، الرجاء إضغط هنا لتأكيد بريدك اﻹلكتروني.",
"email-not-confirmed-email-sent":"Your email has not been confirmed yet, please check your inbox for the confirmation email. You won't be able to post or chat until your email is confirmed.",
"email-not-confirmed-email-sent":"Your email has not been confirmed yet, please check your inbox for the confirmation email. You won't be able to post or chat until your email is confirmed.",
@@ -38,6 +41,7 @@
"username-too-long":"اسم المستخدم طويل",
"username-too-long":"اسم المستخدم طويل",
"password-too-long":"كلمة السر طويلة ",
"password-too-long":"كلمة السر طويلة ",
"reset-rate-limited":"Too many password reset requests (rate limited)",
"reset-rate-limited":"Too many password reset requests (rate limited)",
"reset-same-password":"Please use a password that is different from your current one",
"user-banned":"المستخدم محظور",
"user-banned":"المستخدم محظور",
"user-banned-reason":"Sorry, this account has been banned (Reason: %1)",
"user-banned-reason":"Sorry, this account has been banned (Reason: %1)",
"user-banned-reason-until":"Sorry, this account has been banned until %1 (Reason: %2)",
"user-banned-reason-until":"Sorry, this account has been banned until %1 (Reason: %2)",
@@ -80,15 +84,26 @@
"tag-too-long":"Please enter a shorter tag. Tags can't be longer than %1 character(s)",
"tag-too-long":"Please enter a shorter tag. Tags can't be longer than %1 character(s)",
"not-enough-tags":"Not enough tags. Topics must have at least %1 tag(s)",
"not-enough-tags":"Not enough tags. Topics must have at least %1 tag(s)",
"too-many-tags":"Too many tags. Topics can't have more than %1 tag(s)",
"too-many-tags":"Too many tags. Topics can't have more than %1 tag(s)",
"cant-use-system-tag":"You can not use this system tag.",
"cant-remove-system-tag":"You can not remove this system tag.",
"still-uploading":"الرجاء الانتظار حتى يكتمل الرفع.",
"still-uploading":"الرجاء الانتظار حتى يكتمل الرفع.",
"description":"There are no posts in the post queue. <br> To enable this feature, go to <a href=\"%1\">Settings → Post → Post Queue</a> and enable <strong>Post Queue</strong>.",
"description":"There are no posts in the post queue. <br> To enable this feature, go to <a href=\"%1\">Settings → Post → Post Queue</a> and enable <strong>Post Queue</strong>.",
@@ -7,5 +8,11 @@
"content":"Content",
"content":"Content",
"posted":"Posted",
"posted":"Posted",
"reply-to":"Reply to \"%1\"",
"reply-to":"Reply to \"%1\"",
"content-editable":"You can click on individual content to edit before posting."
"wrong_reset_code.message":"رمز إعادة التعين غير صحيح، يرجى المحاولة مرة أخرى أو <a href='/reset'>اطلب رمزا جديدا</a>",
"wrong_reset_code.message":"رمز إعادة التعين غير صحيح، يرجى المحاولة مرة أخرى أو <a href='/reset'>اطلب رمزا جديدا</a>",
"new_password":"كلمة المرور الجديدة",
"new_password":"كلمة المرور الجديدة",
"repeat_password":"تأكيد كلمة المرور",
"repeat_password":"تأكيد كلمة المرور",
"changing_password":"Changing Password",
"enter_email":"يرجى إدخال <strong>عنوان البريد الإلكتروني</strong> الخاص بك وسوف نرسل لك رسالة بالبريد الالكتروني مع تعليمات حول كيفية إستعادة حسابك.",
"enter_email":"يرجى إدخال <strong>عنوان البريد الإلكتروني</strong> الخاص بك وسوف نرسل لك رسالة بالبريد الالكتروني مع تعليمات حول كيفية إستعادة حسابك.",
"enter_email_address":"ادخل عنوان البريد الإلكتروني",
"enter_email_address":"ادخل عنوان البريد الإلكتروني",
"password_reset_sent":"If the specified address corresponds to an existing user account, a password reset email was sent. Please note that only one email will be sent per minute.",
"password_reset_sent":"If the specified address corresponds to an existing user account, a password reset email was sent. Please note that only one email will be sent per minute.",
"bookmark_instructions":"اضغط هنا للعودة لأخر مشاركة مقروءة في الموضوع",
"bookmark_instructions":"اضغط هنا للعودة لأخر مشاركة مقروءة في الموضوع",
"flag-post":"Flag this post",
"flag-post":"Flag this post",
"flag-user":"Flag this user",
"flag-user":"Flag this user",
"already-flagged":"Already Flagged",
"already-flagged":"Already Flagged",
"view-flag-report":"View Flag Report",
"view-flag-report":"View Flag Report",
"resolve-flag":"Resolve Flag",
"merged_message":"This topic has been merged into <a href=\"%1\">%2</a>",
"merged_message":"This topic has been merged into <a href=\"%1\">%2</a>",
"deleted_message":"هذه المشاركة محذوفة. فقط من لهم صلاحية الإشراف على ا لمشاركات يمكنهم معاينتها.",
"deleted_message":"هذه المشاركة محذوفة. فقط من لهم صلاحية الإشراف على ا لمشاركات يمكنهم معاينتها.",
"following_topic.message":"ستستلم تنبيها عند كل مشاركة جديدة في هذا الموضوع.",
"following_topic.message":"ستستلم تنبيها عند كل مشاركة جديدة في هذا الموضوع.",
@@ -81,10 +91,17 @@
"thread_tools.purge_confirm":"هل أنت متأكد أنك تريد تطهير هذا الموضوع؟",
"thread_tools.purge_confirm":"هل أنت متأكد أنك تريد تطهير هذا الموضوع؟",
"thread_tools.merge_topics":"Merge Topics",
"thread_tools.merge_topics":"Merge Topics",
"thread_tools.merge":"Merge",
"thread_tools.merge":"Merge",
"topic_move_success":"تم نقل هذا الموضوع إلى %1 بنجاح",
"topic_move_success":"This topic will be moved to \"%1\" shortly. Click here to undo.",
"topic_move_multiple_success":"These topics will be moved to \"%1\" shortly. Click here to undo.",
"topic_move_all_success":"All topics will be moved to \"%1\" shortly. Click here to undo.",
"topic_move_undone":"Topic move undone",
"topic_move_posts_success":"Posts will be moved shortly. Click here to undo.",
"topic_move_posts_undone":"Post move undone",
"post_delete_confirm":"هل أنت متأكد أنك تريد حذف هذه المشاركة؟",
"post_delete_confirm":"هل أنت متأكد أنك تريد حذف هذه المشاركة؟",
"post_restore_confirm":"هل أنت متأكد أنك تريد استعادة هذه المشاركة؟",
"post_restore_confirm":"هل أنت متأكد أنك تريد استعادة هذه المشاركة؟",
"post_purge_confirm":"هل أنت متأكد أنك تريد تطهير هذه المشاركة؟",
"post_purge_confirm":"هل أنت متأكد أنك تريد تطهير هذه المشاركة؟",
"pin-modal-expiry":"Expiration Date",
"pin-modal-help":"You can optionally set an expiration date for the pinned topic(s) here. Alternatively, you can leave this field blank to have the topic stay pinned until it is manually unpinned.",
"load_categories":"تحميل الفئات",
"load_categories":"تحميل الفئات",
"confirm_move":"انقل",
"confirm_move":"انقل",
"confirm_fork":"فرع",
"confirm_fork":"فرع",
@@ -97,8 +114,12 @@
"move_post":"نقل المشاركة",
"move_post":"نقل المشاركة",
"post_moved":"تم نقل المشاركة",
"post_moved":"تم نقل المشاركة",
"fork_topic":"فرع الموضوع",
"fork_topic":"فرع الموضوع",
"enter-new-topic-title":"Enter new topic title",
"fork_topic_instruction":"إضغط على المشاركات التي تريد تفريعها",
"fork_topic_instruction":"إضغط على المشاركات التي تريد تفريعها",
"fork_no_pids":"لم تختر أي مشاركة",
"fork_no_pids":"لم تختر أي مشاركة",
"no-posts-selected":"No posts selected!",
"x-posts-selected":"%1 post(s) selected",
"x-posts-will-be-moved-to-y":"%1 post(s) will be moved to \"%2\"",
"fork_pid_count":"1% مشاركة محددة",
"fork_pid_count":"1% مشاركة محددة",
"fork_success":"تم إنشاء فرع للموضوع بنجاح! إضغط هنا لمعاينة الفرع.",
"fork_success":"تم إنشاء فرع للموضوع بنجاح! إضغط هنا لمعاينة الفرع.",
"delete_posts_instruction":"Click the posts you want to delete/purge",
"delete_posts_instruction":"Click the posts you want to delete/purge",
@@ -107,14 +128,17 @@
"merge-options":"Merge options",
"merge-options":"Merge options",
"merge-select-main-topic":"Select the main topic",
"merge-select-main-topic":"Select the main topic",
"merge-new-title-for-topic":"New title for topic",
"merge-new-title-for-topic":"New title for topic",
"move_posts_instruction":"Click the posts you want to move",
"topic-id":"Topic ID",
"move_posts_instruction":"Click the posts you want to move then enter a topic ID or go to the target topic",
"change_owner_instruction":"Click the posts you want to assign to another user",
"change_owner_instruction":"Click the posts you want to assign to another user",
"composer.title_placeholder":"أدخل عنوان موضوعك هنا...",
"composer.title_placeholder":"أدخل عنوان موضوعك هنا...",
"composer.handle_placeholder":"Enter your name/handle here",
"composer.handle_placeholder":"Enter your name/handle here",
"composer.discard":"نبذ التغييرات",
"composer.discard":"نبذ التغييرات",
"composer.submit":"حفظ",
"composer.submit":"حفظ",
"composer.schedule":"Schedule",
"composer.replying_to":"الرد على %1",
"composer.replying_to":"الرد على %1",
"composer.new_topic":"موضوع جديد",
"composer.new_topic":"موضوع جديد",
"composer.editing":"Editing",
"composer.uploading":"جاري الرفع",
"composer.uploading":"جاري الرفع",
"composer.thumb_url_label":"ألصق رابط الصورة المصغرة للموضوع",
"composer.thumb_url_label":"ألصق رابط الصورة المصغرة للموضوع",
"composer.thumb_title":"إضافة صورة مصغرة للموضوع",
"composer.thumb_title":"إضافة صورة مصغرة للموضوع",
@@ -142,8 +166,12 @@
"diffs.current-revision":"current revision",
"diffs.current-revision":"current revision",
"diffs.original-revision":"original revision",
"diffs.original-revision":"original revision",
"diffs.restore":"Restore this revision",
"diffs.restore":"Restore this revision",
"diffs.restore-description":"A new revision will be appended to this post's edit history.",
"diffs.restore-description":"A new revision will be appended to this post's edit history after restoring.",
"diffs.post-restored":"Post successfully restored to earlier revision",
"diffs.post-restored":"Post successfully restored to earlier revision",
"open_links_in_new_tab":"فتح الروابط الخارجية في نافدة جديدة",
"open_links_in_new_tab":"فتح الروابط الخارجية في نافدة جديدة",
"enable_topic_searching":"تفعيل خاصية البحث داخل المواضيع",
"enable_topic_searching":"تفعيل خاصية البحث داخل المواضيع",
"topic_search_help":"إذا قمت بتفعيل ميزة البحث في-الموضوع، سيتم تجاوز الخيار الافتراضي للمتصفح مما يؤدي للبحث بكامل الموضوع بدلا عن البحث في الجزء الظاهر في الشاشة.",
"topic_search_help":"إذا قمت بتفعيل ميزة البحث في-الموضوع، سيتم تجاوز الخيار الافتراضي للمتصفح مما يؤدي للبحث بكامل الموضوع بدلا عن البحث في الجزء الظاهر في الشاشة.",
"update_url_with_post_index":"Update url with post index while browsing topics",
"scroll_to_my_post":"بعد اضافة رد على المشاركة, قم بإظهار المشاركة",
"scroll_to_my_post":"بعد اضافة رد على المشاركة, قم بإظهار المشاركة",
"follow_topics_you_reply_to":"متابعة المواضيع التي تقوم بالرد عليها",
"follow_topics_you_reply_to":"متابعة المواضيع التي تقوم بالرد عليها",
"follow_topics_you_create":"متابعة المواضيع التي تقوم بإنشائها",
"follow_topics_you_create":"متابعة المواضيع التي تقوم بإنشائها",
@@ -139,7 +136,7 @@
"homepage":"الصفحة الرئيسية",
"homepage":"الصفحة الرئيسية",
"homepage_description":"حدد صفحة لاستخدامها كصفحة رئيسية للمنتدى أو \"لا شيء\" لاستخدام الصفحة الرئيسية الافتراضية.",
"homepage_description":"حدد صفحة لاستخدامها كصفحة رئيسية للمنتدى أو \"لا شيء\" لاستخدام الصفحة الرئيسية الافتراضية.",
"custom_route":"مسار الصفحة الرئيسية المخصصة",
"custom_route":"مسار الصفحة الرئيسية المخصصة",
"custom_route_help":"أدخل اسم مسار هنا، بدون أي شرطة مائلة (على سبيل المثال \"حديثة\" أو \"شائعة\")",
"custom_route_help":"Enter a route name here, without any preceding slash (e.g. \"recent\" or \"category/2/general-discussion\")",
"upgrade-available":"<p>Има нова версия (версия %1). Ако имате възможност, <a href=\"https://docs.nodebb.org/configuring/upgrade/\" target=\"_blank\">обновете NodeBB</a>.</p>",
"upgrade-available":"<p>Има нова версия (версия %1). Ако имате възможност, <a href=\"https://docs.nodebb.org/configuring/upgrade/\" target=\"_blank\">обновете NodeBB</a>.</p>",
"prerelease-upgrade-available":"<p>Това е остаряла предварителна версия на NodeBB. Има нова версия (версия %1). Ако имате възможност, <a href=\"https://docs.nodebb.org/configuring/upgrade/\" target=\"_blank\">обновете NodeBB</a>.</p>",
"prerelease-upgrade-available":"<p>Това е остаряла предварителна версия на NodeBB. Има нова версия (версия %1). Ако имате възможност, <a href=\"https://docs.nodebb.org/configuring/upgrade/\" target=\"_blank\">обновете NodeBB</a>.</p>",
"prerelease-warning":"<p>Това е версия за <strong>предварителен преглед</strong> на NodeBB. Възможно е да има неочаквани неизправности. <i class=\"fa fa-exclamation-triangle\"></i></p>",
"prerelease-warning":"<p>Това е версия за <strong>предварителен преглед</strong> на NodeBB. Възможно е да има неочаквани неизправности. <i class=\"fa fa-exclamation-triangle\"></i></p>",
"fallback-emailer-not-found":"Нее намерен резервен изпращач на е-поща",
"running-in-development":"<span>Форумът работи в режим за разработчици, така че може да бъде уязвим. Моля, свържете се със системния си администратор.</span>",
"running-in-development":"<span>Форумът работи в режим за разработчици, така че може да бъде уязвим. Моля, свържете се със системния си администратор.</span>",
"latest-lookup-failed":"<p>Не може да бъде извършена проверка за последната налична версия на NodeBB</p>",
"latest-lookup-failed":"<p>Не може да бъде извършена проверка за последната налична версия на NodeBB</p>",
"details.no-users":"В избрания период не сасе регистрирали нови потребители",
"details.no-topics":"В избрания период не са публикувани нови теми",
"details.no-logins":"В избрания период не са отчетени вписвания",
"details.logins-static":"NodeBB запазва данни за сесията в продължение на %1 дни, така че в следната таблица могат да се видят само последните активни сесии",
"set-order-help":"Задаването на позиция за категорията ще я премести на желаното място и ще промени местата на другите категории, ако е необходимо. Най-малкият възможен номер е 1, което ще постави категорията най-отгоре.",
"select-category":"Изберете категория",
"select-category":"Изберете категория",
"set-parent-category":"Задайте базова категория",
"set-parent-category":"Задайте базова категория",
@@ -45,6 +50,8 @@
"privileges.no-users":"В тази категория няма правомощия за отделни потребители.",
"privileges.no-users":"В тази категория няма правомощия за отделни потребители.",
"privileges.section-group":"Група",
"privileges.section-group":"Група",
"privileges.group-private":"Тази група е частна",
"privileges.group-private":"Тази група е частна",
"privileges.inheritance-exception":"Тази група не наследява правомощията от групата на регистрираните потребители",
"privileges.banned-user-inheritance":"Блокираните потребители наследяват правомощията от групата на блокираните потребители",
"privileges.search-group":"Добавяне на група",
"privileges.search-group":"Добавяне на група",
"privileges.copy-to-children":"Копиране в наследниците",
"privileges.copy-to-children":"Копиране в наследниците",
"privileges.copy-from-category":"Копиране от категория",
"privileges.copy-from-category":"Копиране от категория",
@@ -66,7 +73,6 @@
"alert.create-success":"Категорията е създадена успешно!",
"alert.create-success":"Категорията е създадена успешно!",
"alert.none-active":"Нямате активни категории.",
"alert.none-active":"Нямате активни категории.",
"alert.create":"Създаване на категория",
"alert.create":"Създаване на категория",
"alert.confirm-moderate":"<strong>Наистина ли искате да дадете правомощието за модериране на тази потребителска група?</strong> Тази група е публична и всеки може свободно да се присъедини към нея.",
"alert.confirm-purge":"<p class=\"lead\">Наистина ли искате да изтриете категорията „%1“?</p><h5><strong class=\"text-danger\">Внимание!</strong> Всички теми и публикации в тази категория ще бъдат изтрити!</h5> <p class=\"help-block\">Изтриването на категорията ще премахне всички теми и публикации, и ще изтрие категорията от базата данни. Ако искате да премахнете категорията <em>временно</em>, можете просто да я „изключите“.</p>",
"alert.confirm-purge":"<p class=\"lead\">Наистина ли искате да изтриете категорията „%1“?</p><h5><strong class=\"text-danger\">Внимание!</strong> Всички теми и публикации в тази категория ще бъдат изтрити!</h5> <p class=\"help-block\">Изтриването на категорията ще премахне всички теми и публикации, и ще изтрие категорията от базата данни. Ако искате да премахнете категорията <em>временно</em>, можете просто да я „изключите“.</p>",
"global.no-users":"Няма глобални правомощия за отделни потребители.",
"admin":"Администратор",
"admin":"Администратор",
"group-privileges":"Правомощия за групите",
"group-privileges":"Правомощия за групите",
"user-privileges":"Правомощия за потребителите",
"user-privileges":"Правомощия за потребителите",
"edit-privileges":"Редактиране на правомощията",
"edit-privileges":"Редактиране на правомощията",
"select-clear-all":"Избиране/изчистване на всичко",
"chat":"Разговор",
"chat":"Разговор",
"upload-images":"Качване на изображения",
"upload-images":"Качване на изображения",
"upload-files":"Качване на файлове",
"upload-files":"Качване на файлове",
"signature":"Подпис",
"signature":"Подпис",
"ban":"Блокиране",
"ban":"Блокиране",
"invite":"Пращане на покана",
"search-content":"Търсене на съдържание",
"search-content":"Търсене на съдържание",
"search-users":"Търсене на потребители",
"search-users":"Търсене на потребители",
"search-tags":"Търсене на етикети",
"search-tags":"Търсене на етикети",
@@ -24,6 +25,7 @@
"access-topics":"Достъп до теми",
"access-topics":"Достъп до теми",
"create-topics":"Създаване на теми",
"create-topics":"Създаване на теми",
"reply-to-topics":"Отговаряне в теми",
"reply-to-topics":"Отговаряне в теми",
"schedule-topics":"Насрочване на теми",
"tag-topics":"Поставяне на етикети на теми",
"tag-topics":"Поставяне на етикети на теми",
"edit-posts":"Редактиране на публикации",
"edit-posts":"Редактиране на публикации",
"view-edit-history":"Преглед на историята на редакциите",
"view-edit-history":"Преглед на историята на редакциите",
@@ -38,5 +40,21 @@
"admin-categories":"Категории",
"admin-categories":"Категории",
"admin-privileges":"Правомощия",
"admin-privileges":"Правомощия",
"admin-users":"Потребители",
"admin-users":"Потребители",
"admin-settings":"Настройки"
"admin-admins-mods":"Администратори и модератори",
"admin-groups":"Групи",
"admin-tags":"Етикети",
"admin-settings":"Настройки",
"alert.confirm-moderate":"<strong>Наистина ли искате да дадете правомощието за модериране на тази потребителска група?</strong> Тази група е публична и всеки може свободно да се присъедини към нея.",
"alert.confirm-admins-mods":"<strong>Наистина ли искате да дадете правото „Администратори и модератори“ на този потребител/група?</strong> Потребителите с това право могат да променят правомощията на други групи, <em>включително да им дават правото на супер администратори</em>",
"alert.confirm-save":"Моля, потвърдете желанието си да запазите тези правомощия",
"alert.saved":"Промените по правомощията са запазени и приложени",
"alert.confirm-discard":"Наистина ли искате да отхвърлите промените по правомощията?",
"alert.discarded":"Промените по правомощията са отхвърлени",
"alert.confirm-copyToAll":"Наистина ли искате да приложите този набор от правомощия към <strong>всички категории</strong>?",
"alert.confirm-copyToAllGroup":"Наистина ли искате да приложите набора от правомощия на таи група към <strong>всички категории</strong>?",
"alert.confirm-copyToChildren":"Наистина ли искате да приложите този набор от правомощия към <strong>всички по-долни (дъщерни) категории</strong>?",
"alert.confirm-copyToChildrenGroup":"Наистина ли искате да приложите набора от правомощия на таи група към <strong>всички по-долни (дъщерни) категории</strong>?",
"alert.no-undo":"<em>Това действие е необратимо.</em>",
"alert.admin-warning":"Администраторите имат всички правомощия по подразбиране"
"sockets.delay":"Забавяне при повторно свързване",
"analytics.settings":"Настройки за анализите",
"analytics.max-cache":"Макс. стойност на кеша за анализите",
"analytics.max-cache-help":"При инсталации с натоварен трафик, кешът може да бъде изразходен, ако има повече едновременни потребители, от колкото е максималната стойност на кеша. (Изисква рестартиране)",
"compression.settings":"Настройки за компресирането",
"compression.enable":"Включване на компресирането",
"compression.help":"Тази настройка включва компресирането чрез „gzip“. За натоварени уеб сайтове най-добрият начин за използване на компресия е тя да се случва на нивото на обратния сървър-посредник (reverse proxy). Нос цел тестване, можете да го включите и тук."
"lead-text":"На тази страница можете да настроите достъпа до ППИ за писане в NodeBB.",
"intro":"По подразбиране ППИ за писане удостоверява потребителите чрез бисквитката им за сесията, но NodeBB поддържа и удостоверяване чрез метода „Bearer“, използвайки кодовете от тази страница.",
"docs":"Щракнете тук за достъп до пълната документация на ППИ",
"require-https":"Ползването на ППИ да работи само чрез HTTPS",
"require-https-caveat":"<strong>Забележка</strong>: В някои случаи, когато се ползват програми за балансиране на натоварването, е възможно заявките към NodeBB да се препращат чрез HTTP – тогава тази настройка трябва да остане изключена.",
"uid":"Потребителски ИД",
"uid-help-text":"Посочете потребителски ИД, който да бъде свързан с този код. Ако ИД е <code>0</code>, това ще се счита за <em>главен</em> код, който може да приема идентичността на всеки от другите потребители чрез параметъра <code>_uid</code>",
"description":"Описание",
"no-description":"Няма описание.",
"token-on-save":"Кодът ще бъде създаден след като данните бъдат запазени"
"address-help":"Следният адрес на е-поща е този, който получателят ще види в полетата „От“ и “Отговор до“.",
"address-help":"Следният адрес на е-поща е този, който получателят ще види в полетата „От“ и “Отговор до“.",
"from":"Име за полето „От“",
"from":"Име за полето „От“",
"from-help":"Името на изпращача, което да бъде показано в е-писмото.",
"from-help":"Името на изпращача, което да бъде показано в е-писмото.",
"sendmail-rate-limit":"Изпращане на <em>X</em> е-писма…",
"sendmail-rate-delta":"…на всеки <em>X</em> милисекунди",
"sendmail-rate-help":"Задава на програмата за изпращане на е-писма на NodeBB да ограничи броя едновременно изпращани съобщения, за да не се претоварват пощенските сървъри. Тези настройки не се вземат предвид, ако е включена настройката „Транспорт чрез SMTP“ (по-долу).",
"smtp-transport":"Транспорт чрез SMTP",
"smtp-transport":"Транспорт чрез SMTP",
"smtp-transport.enabled":"Използване на външен сървър за е-поща за изпращане на е-писма",
"smtp-transport.enabled":"Използване на външен сървър за е-поща за изпращане на е-писма",
@@ -25,6 +22,8 @@
"smtp-transport.username":"Потребителско име",
"smtp-transport.username":"Потребителско име",
"smtp-transport.username-help":"<b>За услугата на Gmail</b>, въведете пълния адрес на е-пощата тук, особено ако използвате управляван домейн на „Google Apps“.",
"smtp-transport.username-help":"<b>За услугата на Gmail</b>, въведете пълния адрес на е-пощата тук, особено ако използвате управляван домейн на „Google Apps“.",
"smtp-transport.password":"Парола",
"smtp-transport.password":"Парола",
"smtp-transport.pool":"Включване на групираните връзки",
"smtp-transport.pool-help":"Групирането на връзките предотвратява създаването на нова връзка за всяко е-писмо. Тази настройка има ефект, само ако е включено „Транспорт чрез SMTP“.",
"template":"Редактирана не шаблона за е-писма",
"template":"Редактирана не шаблона за е-писма",
"template.select":"Изберете шаблон за е-писма",
"template.select":"Изберете шаблон за е-писма",
@@ -36,5 +35,7 @@
"subscriptions":"Резюмета по е-поща",
"subscriptions":"Резюмета по е-поща",
"subscriptions.disable":"Изключване на резюметата по е-пощата",
"subscriptions.disable":"Изключване на резюметата по е-пощата",
"subscriptions.hour":"Време за разпращане",
"subscriptions.hour":"Време за разпращане",
"subscriptions.hour-help":"Моля, въведете число, представляващо часа, в който да се разпращат е-писма с подготвеното резюме (напр.. <code>0</code> за полунощ, <code>17</code> за 5 следобед). Имайте предвид, че този час е според часовата зона на сървъра и може да не съвпада с часовника на системата Ви.<br /> Приблизителното време на сървъра е: <span id=\"serverTime\"></span><br /> Изпращането на следващия ежедневен бюлетин е планирано за <span id=\"nextDigestTime\"></span>"
"subscriptions.hour-help":"Моля, въведете число, представляващо часа, в който да се разпращат е-писма с подготвеното резюме (напр.. <code>0</code> за полунощ, <code>17</code> за 5 следобед). Имайте предвид, че този час е според часовата зона на сървъра и може да не съвпада с часовника на системата Ви.<br /> Приблизителното време на сървъра е: <span id=\"serverTime\"></span><br /> Изпращането на следващия ежедневен бюлетин е планирано за <span id=\"nextDigestTime\"></span>",
"notifications.settings":"Настройки за известията по е-поща",
"notifications.remove-images":"Премахване на изображенията от известията по е-поща"
"log.alt-text-placeholder":"Алтернативен текст за достъпност",
"log.alt-text-placeholder":"Алтернативен текст за достъпност",
"favicon":"Иконка на уеб сайта",
"favicon":"Иконка на уеб сайта",
"favicon.upload":"Качване",
"favicon.upload":"Качване",
"touch-icon":"Иконка за начален екран (мобилно устройство)",
"pwa":"Прогресивно уеб-приложение",
"touch-icon":"Иконка за сензорен екран",
"touch-icon.upload":"Качване",
"touch-icon.upload":"Качване",
"touch-icon.help":"Препоръчителен размер и формат: 192x192, само във формат „PNG“. Ако не е посочена иконка за начален екран на мобилно устройство, NodeBB ще използва иконката на уеб сайта.",
"touch-icon.help":"Препоръчителен размер и формат: 512x512, само във формат „PNG“. Ако не е посочена иконка за сензорен екран, NodeBB ще използва иконката на уеб сайта.",
"maskable-icon":"Маскируема иконка (за начален екран)",
"maskable-icon.help":"Препоръчителен размер и формат: 512x512, само във формат „PNG“. Ако не е посочена маскируема иконка, NodeBB ще използва иконката за сензорен екран.",
"outgoing-links":"Изходящи връзки",
"outgoing-links":"Изходящи връзки",
"outgoing-links.warning-page":"Показване на предупредителна страница при щракване върху външни връзки",
"outgoing-links.warning-page":"Показване на предупредителна страница при щракване върху външни връзки",
"search-default-sort-by":"Подредба по подразбиране при търсене",
"search-default-sort-by":"Подредба по подразбиране при търсене",
@@ -37,5 +40,8 @@
"site-colors":"Мета-данни за цвета на уеб сайта",
"site-colors":"Мета-данни за цвета на уеб сайта",
"theme-color":"Цвят на темата",
"theme-color":"Цвят на темата",
"background-color":"Фонов цвят",
"background-color":"Фонов цвят",
"background-color-help":"Цвят, който да се използва като фон за началния екран, когато уеб сайтът е инсталиран като приложение"
"background-color-help":"Цвят, който да се използва като фон за началния екран, когато уеб сайтът е инсталиран като приложение",
}
"undo-timeout":"Време за отмяна",
"undo-timeout-help":"Някои действия, като например преместването на теми, могат да бъдат отменени от модератора в рамките на определено време. Задайте 0, за да забраните изцяло отменянето.",
"handles.enabled":"Позволяване на имената за гостите",
"handles.enabled":"Позволяване на имената за гостите",
"handles.enabled-help":"Тази възможност предоставя ново поле, което позволява на гостите да си изберат име, което да се използва за всяка публикация, която правят. Ако е изключено, всички те просто ще имат името „Гост“."
"handles.enabled-help":"Тази възможност предоставя ново поле, което позволява на гостите да си изберат име, което да се използва за всяка публикация, която правят. Ако е изключено, всички те просто ще имат името „Гост“.",
"topic-views.enabled":"Гостите да допринасят за броя на преглеждания на темите",
"reply-notifications.enabled":"Гостите да могат да предизвикват изпращането на известия за отговорите си"
"enable":"Разделяне на темите и публикациите на страници, вместо да се превърта безкрайно.",
"enable":"Разделяне на темите и публикациите на страници, вместо да се превърта безкрайно.",
"posts":"Странициране в публикациите",
"topics":"Странициране в темите",
"topics":"Странициране в темите",
"posts-per-page":"Публикации на страница",
"posts-per-page":"Публикации на страница",
"max-posts-per-page":"Максимален брой публикации на страница",
"max-posts-per-page":"Максимален брой публикации на страница",
"categories":"Странициране на категориите",
"categories":"Странициране на категориите",
"topics-per-page":"Теми на страница",
"topics-per-page":"Теми на страница",
"max-topics-per-page":"Максимален брой теми на страница"
"max-topics-per-page":"Максимален брой теми на страница",
"categories-per-page":"Брой категории на страница"
}
}
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.