Compare commits

..

7 Commits

Author SHA1 Message Date
Julian Lam
0df3ea8661 refactor: client-side to use flag notes API 2021-07-16 13:51:37 -04:00
Julian Lam
b6c84222c2 test: fix breaking test on mongo 2021-07-16 12:29:39 -04:00
Julian Lam
6bcc0d0ddc chore: remove debug line 2021-07-16 11:33:23 -04:00
Julian Lam
e219cf0226 feat: flag notes API + tests 2021-07-16 11:28:52 -04:00
Julian Lam
b5da3f136b fix: flag tests to use Write API instead of sockets 2021-07-14 16:39:55 -04:00
Julian Lam
8a02c66ed5 feat: tests for new flags API
added missing files for schema update
2021-07-14 15:41:01 -04:00
Julian Lam
66946be9f0 feat: new routes for flags API
+ 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
2021-07-14 15:21:25 -04:00
2743 changed files with 31347 additions and 53190 deletions

View File

@@ -10,7 +10,7 @@ checks:
threshold: 500 threshold: 500
method-lines: method-lines:
config: config:
threshold: 75 threshold: 50
method-complexity: method-complexity:
config: config:
threshold: 10 threshold: 10

View File

@@ -18,12 +18,3 @@ logs/
.eslintrc .eslintrc
test/files test/files
*.min.js *.min.js
/public/src/app.js
/public/src/client.js
/public/src/admin/admin.js
/public/src/modules/translator.common.js
/public/src/modules/pictureCropper.js
/public/src/modules/ace-editor.js
/public/src/client/account/header.js
/public/src/client/test.js

114
.eslintrc
View File

@@ -1,3 +1,115 @@
{ {
"extends": "nodebb" "extends": "airbnb-base",
"parserOptions": {
"sourceType": "script"
},
"rules": {
// === Configure rules for our style ===
// imports must be resolvable
"import/no-unresolved": "error",
// use single quotes,
// unless a different style allows avoiding escapes
"quotes": ["error", "single", {
"avoidEscape": true,
"allowTemplateLiterals": true
}],
// allow else-if return
"no-else-return": [ "error", { "allowElseIf": true } ],
// expressions split over multiple lines
// should break after the operator
"operator-linebreak": [ "error", "after" ],
// require arrow parens only when needed
// and whenever the body is a block
"arrow-parens": ["error", "as-needed", { "requireForBlockBody": true }],
// what variables are errors in callbacks
"handle-callback-err": [ "error","^(e$|(e|(.*(_e|E)))rr)" ],
// allow dangling commas in functions
// require them everywhere else
"comma-dangle": ["error", {
"arrays": "always-multiline",
"objects": "always-multiline",
"imports": "always-multiline",
"exports": "always-multiline",
"functions": "only-multiline"
}],
// we actually encourage `return await`
"no-return-await": "off",
// allow `while (true)`
"no-constant-condition": ["error", { "checkLoops": false }],
// allow ignoring an error with `catch`
"no-empty": ["error", { "allowEmptyCatch": true }],
// allow `3 + 5 - 1`, but not `3 * 5 - 1`
"no-mixed-operators": ["error", { "allowSamePrecedence": true }],
// require `'use strict';`
"strict": ["error", "global"],
// we actually use tabs for indentation
"indent": ["error", "tab", { "SwitchCase": 1 }],
"no-tabs": "off",
// we want `== null` to also handle undefined
"no-eq-null": "off",
// allow `for (..; i++)`
"no-plusplus": ["error", { "allowForLoopAfterthoughts": true }],
// allow using functions defined later
"no-use-before-define": ["error", "nofunc"],
// require consistent newlines before and after braces
// if contents are multiline
"object-curly-newline": ["error", { "consistent": true, "multiline": true }],
// require consistent linebreaks inline function parenthesis (arguments or params)
"function-paren-newline": ["error", "consistent"],
// only require const if all parts of destructuring can be const
"prefer-const": ["error", { "destructuring": "all" }],
// don't require destructuring for arrays or assignment
"prefer-destructuring": ["error", {
"VariableDeclarator": { "array": false, "object": true },
"AssignmentExpression": { "array": false, "object": false }
}],
// identical to airbnb rule, except for allowing for..of, because we want to use it
"no-restricted-syntax": [
"error",
{
"selector": "ForInStatement",
"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."
}
],
// allow lines of up to 120 characters
"max-len": ["error", { "code": 120, "tabWidth": 2, "ignoreUrls": true, "ignoreStrings": true, "ignoreTemplateLiterals": true, "ignoreRegExpLiterals": true }],
// === Disable rules ===
// more liberal naming
"camelcase": "off",
"no-underscore-dangle": "off",
// don't require anonymous function names
"func-names": "off",
// allow console
"no-console": "off",
// allow new for side effects
// allow new with non-capitalized
"no-new": "off",
"new-cap": "off",
// allow shadowing variables (usually callbacks)
"no-shadow": "off",
// allow multiple empty lines in a row
"no-multiple-empty-lines": "off",
// allow not using object shorthand
"object-shorthand": "off",
// TODO
"consistent-return": "off",
"no-restricted-globals": "off",
"no-prototype-builtins": "off",
"import/no-extraneous-dependencies": "off",
"import/no-dynamic-require": "off",
"global-require": "off",
"no-param-reassign": "off",
"default-case": "off"
}
} }

32
.github/ISSUE_TEMPLATE.md vendored Normal file
View File

@@ -0,0 +1,32 @@
<!--
== Github Issues are for bug reports and feature requests only ==
== Please visit https://community.nodebb.org for other support ==
== Found a security exploit? Please email us at security@nodebb.org instead for immediate attention ==
== → DO NOT SUBMIT VULNERABILITIES TO THE PUBLIC BUG TRACKER ==
-->
<!-- ++ Please include the following information when submitting a bug report ++ -->
- **NodeBB version:**
- **NodeBB git hash:**
- **NodeJS version:**
<!-- (to find your git hash, execute `git rev-parse HEAD` from the main NodeBB directory) -->
- **Installed NodeBB Plugins:**
<!-- (to find installed plugins run ./nodebb plugins) -->
- **Database type:** mongo, redis, or postgres
- **Database version:**
<!-- `mongod --version`, `redis-server --version`, or `postgres --version` -->
- **Exact steps to cause this issue:**
<!--
1. First I did this...
2. Then, I clicked on this item...
A quick note: MP4 and MOV formatted video files are now allowed to be uploaded to GH.
Please upload if reproduction steps are hard to describe or reproduce reliably.
-->
- **What you expected:**
<!-- e.g. I expected *abc* to *xyz* -->
- **What happened instead:**
<!-- e.g. Instead, I got *zyx* and NodeBB set fire to my house -->
<!-- Thank you! -->

View File

@@ -1,81 +0,0 @@
name: Bug Report
description: File a bug report
labels: ["bug"]
body:
- type: markdown
attributes:
value: |
Github Issues are for bug reports and feature requests only
Please visit https://community.nodebb.org for other support
Found a security exploit? Please email us at security@nodebb.org instead for immediate attention
### → DO NOT SUBMIT VULNERABILITIES TO THE PUBLIC BUG TRACKER ←
- type: input
attributes:
label: NodeBB version
placeholder: e.g. v2.2.0
- type: input
attributes:
label: NodeBB git hash
description: to find your git hash, execute `git rev-parse HEAD` from the main NodeBB directory
placeholder: e.g. 783250ee6f8c51cdc243ce3b8d9f1a080517247e
- type: input
attributes:
label: NodeJS version
placeholder: e.g. v16.15.1
- type: textarea
attributes:
label: Installed NodeBB plugins
description: to find installed plugins run `./nodebb plugins`
placeholder: |
e.g.
* nodebb-plugin-2factor@5.0.1 (installed, disabled)
* nodebb-plugin-composer-default@8.0.0 (installed, enabled)
* nodebb-plugin-dbsearch@5.1.5 (installed, disabled)
* nodebb-plugin-emoji@4.0.4 (installed, enabled)
* nodebb-plugin-emoji-android@3.0.0 (installed, enabled)
* nodebb-plugin-markdown@10.0.0 (installed, enabled)
* nodebb-plugin-mentions@3.0.11 (installed, enabled)
* nodebb-plugin-spam-be-gone@1.0.0 (installed, disabled)
* nodebb-rewards-essentials@0.2.1 (installed, enabled)
* nodebb-theme-lavender@6.0.0 (installed, disabled)
* nodebb-theme-persona@12.0.11 (installed, enabled)
* nodebb-theme-slick@2.0.2 (installed, disabled)
* nodebb-theme-vanilla@12.1.18 (installed, disabled)
* nodebb-widget-essentials@6.0.0 (installed, enabled)
- type: dropdown
attributes:
label: Database type
multiple: true
options:
- MongoDB
- Redis
- PostgreSQL
- type: input
attributes:
label: Database version
description: "`mongod --version`, `redis-server --version`, or `postgres --version`"
placeholder: e.g. v5.0.9
- type: textarea
attributes:
label: Exact steps to cause this issue
placeholder: |
1. First I did this...
2. Then, I clicked on this item...
A quick note: MP4 and MOV formatted video files are now allowed to be uploaded to GH.
Please upload if reproduction steps are hard to describe or reproduce reliably.
- type: textarea
attributes:
label: What you expected
placeholder: e.g. I expected *abc* to *xyz*
- type: textarea
attributes:
label: What happened instead
placeholder: e.g. Instead, I got *zyx* and NodeBB set fire to my house
- type: textarea
attributes:
label: Anything else?
description: Any additional context about the issue you're encountering
- type: markdown
attributes:
value: "**Thank you!**"

View File

@@ -1,5 +0,0 @@
blank_issues_enabled: true
contact_links:
- name: Community Forum
url: https://community.nodebb.org
about: Github Issues are for bug reports and feature requests only, please use community forum for other support

View File

@@ -1,24 +0,0 @@
name: Feature Request
description: Suggest a new feature
labels: ["enhancement"]
body:
- type: markdown
attributes:
value: |
Github Issues are for bug reports and feature requests only
Please visit https://community.nodebb.org for other support
Found a security exploit? Please email us at security@nodebb.org instead for immediate attention
### → DO NOT SUBMIT VULNERABILITIES TO THE PUBLIC BUG TRACKER ←
- type: textarea
attributes:
label: Description
validations:
required: true
- type: input
attributes:
label: Community forum reference
description: If this feature was already discussed on the Community Forum link it here
placeholder: https://community.nodebb.org/topic/0/example-feature-request
- type: markdown
attributes:
value: "**Thank you!**"

4
.github/SECURITY.md vendored
View File

@@ -2,8 +2,8 @@
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. 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, even if you are not sure whether something qualifies. 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 # 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 [dedicated page for our Bug Bounty Program](https://nodebb.org/bounty). 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

View File

@@ -1,51 +0,0 @@
name: Run Docker
# Controls when the workflow will run
on:
push:
branches:
- 'master'
- 'v*.x'
tags:
- 'v*'
workflow_dispatch:
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Set up QEMU
uses: docker/setup-qemu-action@v1
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Login to Docker Hub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Docker meta
id: meta
uses: docker/metadata-action@v4
with:
images: nodebb/docker
tags: |
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=raw,value=latest
- name: Build and push Docker images
uses: docker/build-push-action@v2
with:
context: .
file: ./Dockerfile
push: true
tags: ${{ steps.meta.outputs.tags }}

View File

@@ -21,7 +21,7 @@ jobs:
fail-fast: false fail-fast: false
matrix: matrix:
os: [ubuntu-latest] os: [ubuntu-latest]
node: [14, 16, 18] node: [12, 14]
database: [mongo-dev, mongo, redis, postgres] database: [mongo-dev, mongo, redis, postgres]
include: include:
# only run coverage once # only run coverage once
@@ -69,7 +69,7 @@ jobs:
- 6379:6379 - 6379:6379
mongo: mongo:
image: 'mongo:3.6' image: 'mongo:3.2'
ports: ports:
# Maps port 27017 on service container to the host # Maps port 27017 on service container to the host
- 27017:27017 - 27017:27017

1
.gitignore vendored
View File

@@ -69,4 +69,3 @@ package-lock.json
/package.json /package.json
*.mongodb *.mongodb
link-plugins.sh link-plugins.sh
test.sh

17
.jsbeautifyrc Normal file
View File

@@ -0,0 +1,17 @@
{
"indent_size": 4,
"indent_char": " ",
"indent_level": 0,
"indent_with_tabs": true,
"preserve_newlines": true,
"max_preserve_newlines": 10,
"jslint_happy": true,
"brace_style": "collapse",
"keep_array_indentation": false,
"keep_function_indentation": false,
"space_before_conditional": true,
"break_chained_methods": false,
"eval_code": false,
"unescape_strings": false,
"wrap_line_length": 0
}

91
.jshintrc Normal file
View File

@@ -0,0 +1,91 @@
{
// JSHint Default Configuration File (as on JSHint website)
// See http://jshint.com/docs/ for more details
"maxerr" : 50, // {int} Maximum error before stopping
"esversion": 6,
// Enforcing
"bitwise" : true, // true: Prohibit bitwise operators (&, |, ^, etc.)
"camelcase" : false, // true: Identifiers must be in camelCase
"curly" : true, // true: Require {} for every new block or scope
"eqeqeq" : true, // true: Require triple equals (===) for comparison
"forin" : true, // true: Require filtering for..in loops with obj.hasOwnProperty()
"immed" : false, // true: Require immediate invocations to be wrapped in parens e.g. `(function () { } ());`
"indent" : 4, // {int} Number of spaces to use for indentation
"latedef" : false, // true: Require variables/functions to be defined before being used
"newcap" : false, // true: Require capitalization of all constructor functions e.g. `new F()`
"noarg" : true, // true: Prohibit use of `arguments.caller` and `arguments.callee`
"noempty" : true, // true: Prohibit use of empty blocks
"nonew" : false, // true: Prohibit use of constructors for side-effects (without assignment)
"plusplus" : false, // true: Prohibit use of `++` & `--`
"quotmark" : false, // Quotation mark consistency:
// false : do nothing (default)
// true : ensure whatever is used is consistent
// "single" : require single quotes
// "double" : require double quotes
"undef" : true, // true: Require all non-global variables to be declared (prevents global leaks)
"unused" : true, // true: Require all defined variables be used
"strict" : true, // true: Requires all functions run in ES5 Strict Mode
"trailing" : false, // true: Prohibit trailing whitespaces
"maxparams" : false, // {int} Max number of formal params allowed per function
"maxdepth" : false, // {int} Max depth of nested blocks (within functions)
"maxstatements" : false, // {int} Max number statements per function
"maxcomplexity" : false, // {int} Max cyclomatic complexity per function
"maxlen" : false, // {int} Max number of characters per line
// Relaxing
"asi" : false, // true: Tolerate Automatic Semicolon Insertion (no semicolons)
"boss" : false, // true: Tolerate assignments where comparisons would be expected
"debug" : false, // true: Allow debugger statements e.g. browser breakpoints.
"eqnull" : false, // true: Tolerate use of `== null`
"es5" : false, // true: Allow ES5 syntax (ex: getters and setters)
"esnext" : false, // true: Allow ES.next (ES6) syntax (ex: `const`)
"moz" : false, // true: Allow Mozilla specific syntax (extends and overrides esnext features)
// (ex: `for each`, multiple try/catch, function expression…)
"evil" : false, // true: Tolerate use of `eval` and `new Function()`
"expr" : false, // true: Tolerate `ExpressionStatement` as Programs
"funcscope" : false, // true: Tolerate defining variables inside control statements"
"globalstrict" : false, // true: Allow global "use strict" (also enables 'strict')
"iterator" : false, // true: Tolerate using the `__iterator__` property
"lastsemic" : false, // true: Tolerate omitting a semicolon for the last statement of a 1-line block
"laxbreak" : false, // true: Tolerate possibly unsafe line breakings
"laxcomma" : false, // true: Tolerate comma-first style coding
"loopfunc" : false, // true: Tolerate functions being defined in loops
"multistr" : false, // true: Tolerate multi-line strings
"proto" : false, // true: Tolerate using the `__proto__` property
"scripturl" : false, // true: Tolerate script-targeted URLs
"smarttabs" : false, // true: Tolerate mixed tabs/spaces when used for alignment
"shadow" : false, // true: Allows re-define variables later in code e.g. `var x=1; x=2;`
"sub" : false, // true: Tolerate using `[]` notation when it can still be expressed in dot notation
"supernew" : false, // true: Tolerate `new function () { ... };` and `new Object;`
"validthis" : false, // true: Tolerate using this in a non-constructor function
// Environments
"browser" : true, // Web Browser (window, document, etc)
"couch" : false, // CouchDB
"devel" : true, // Development/debugging (alert, confirm, etc)
"dojo" : false, // Dojo Toolkit
"jquery" : true, // jQuery
"mootools" : false, // MooTools
"node" : true, // Node.js
"nonstandard" : false, // Widely adopted globals (escape, unescape, etc)
"prototypejs" : false, // Prototype and Scriptaculous
"rhino" : false, // Rhino
"worker" : false, // Web Workers
"wsh" : false, // Windows Scripting Host
"yui" : false, // Yahoo User Interface
"mocha": true,
// Legacy
"nomen" : false, // true: Prohibit dangling `_` in variables
"onevar" : false, // true: Allow only one `var` statement per function
"passfail" : false, // true: Stop on first error
"white" : false, // true: Check against strict whitespace and indentation rules
// Custom Globals
"globals" : {
"Promise": true
} // additional predefined global variables
}

View File

@@ -41,7 +41,6 @@ trans.rw = public/language/rw/category.json
trans.sc = public/language/sc/category.json trans.sc = public/language/sc/category.json
trans.sk = public/language/sk/category.json trans.sk = public/language/sk/category.json
trans.sl = public/language/sl/category.json trans.sl = public/language/sl/category.json
trans.sq_AL = public/language/sq-AL/category.json
trans.sr = public/language/sr/category.json trans.sr = public/language/sr/category.json
trans.sv = public/language/sv/category.json trans.sv = public/language/sv/category.json
trans.th = public/language/th/category.json trans.th = public/language/th/category.json
@@ -92,7 +91,6 @@ trans.rw = public/language/rw/login.json
trans.sc = public/language/sc/login.json trans.sc = public/language/sc/login.json
trans.sk = public/language/sk/login.json trans.sk = public/language/sk/login.json
trans.sl = public/language/sl/login.json trans.sl = public/language/sl/login.json
trans.sq_AL = public/language/sq-AL/login.json
trans.sr = public/language/sr/login.json trans.sr = public/language/sr/login.json
trans.sv = public/language/sv/login.json trans.sv = public/language/sv/login.json
trans.th = public/language/th/login.json trans.th = public/language/th/login.json
@@ -143,7 +141,6 @@ trans.rw = public/language/rw/recent.json
trans.sc = public/language/sc/recent.json trans.sc = public/language/sc/recent.json
trans.sk = public/language/sk/recent.json trans.sk = public/language/sk/recent.json
trans.sl = public/language/sl/recent.json trans.sl = public/language/sl/recent.json
trans.sq_AL = public/language/sq-AL/recent.json
trans.sr = public/language/sr/recent.json trans.sr = public/language/sr/recent.json
trans.sv = public/language/sv/recent.json trans.sv = public/language/sv/recent.json
trans.th = public/language/th/recent.json trans.th = public/language/th/recent.json
@@ -194,7 +191,6 @@ trans.rw = public/language/rw/unread.json
trans.sc = public/language/sc/unread.json trans.sc = public/language/sc/unread.json
trans.sk = public/language/sk/unread.json trans.sk = public/language/sk/unread.json
trans.sl = public/language/sl/unread.json trans.sl = public/language/sl/unread.json
trans.sq_AL = public/language/sq-AL/unread.json
trans.sr = public/language/sr/unread.json trans.sr = public/language/sr/unread.json
trans.sv = public/language/sv/unread.json trans.sv = public/language/sv/unread.json
trans.th = public/language/th/unread.json trans.th = public/language/th/unread.json
@@ -245,7 +241,6 @@ trans.rw = public/language/rw/modules.json
trans.sc = public/language/sc/modules.json trans.sc = public/language/sc/modules.json
trans.sk = public/language/sk/modules.json trans.sk = public/language/sk/modules.json
trans.sl = public/language/sl/modules.json trans.sl = public/language/sl/modules.json
trans.sq_AL = public/language/sq-AL/modules.json
trans.sr = public/language/sr/modules.json trans.sr = public/language/sr/modules.json
trans.sv = public/language/sv/modules.json trans.sv = public/language/sv/modules.json
trans.th = public/language/th/modules.json trans.th = public/language/th/modules.json
@@ -296,7 +291,6 @@ trans.rw = public/language/rw/post-queue.json
trans.sc = public/language/sc/post-queue.json trans.sc = public/language/sc/post-queue.json
trans.sk = public/language/sk/post-queue.json trans.sk = public/language/sk/post-queue.json
trans.sl = public/language/sl/post-queue.json trans.sl = public/language/sl/post-queue.json
trans.sq_AL = public/language/sq-AL/post-queue.json
trans.sr = public/language/sr/post-queue.json trans.sr = public/language/sr/post-queue.json
trans.sv = public/language/sv/post-queue.json trans.sv = public/language/sv/post-queue.json
trans.th = public/language/th/post-queue.json trans.th = public/language/th/post-queue.json
@@ -347,7 +341,6 @@ trans.rw = public/language/rw/ip-blacklist.json
trans.sc = public/language/sc/ip-blacklist.json trans.sc = public/language/sc/ip-blacklist.json
trans.sk = public/language/sk/ip-blacklist.json trans.sk = public/language/sk/ip-blacklist.json
trans.sl = public/language/sl/ip-blacklist.json trans.sl = public/language/sl/ip-blacklist.json
trans.sq_AL = public/language/sq-AL/ip-blacklist.json
trans.sr = public/language/sr/ip-blacklist.json trans.sr = public/language/sr/ip-blacklist.json
trans.sv = public/language/sv/ip-blacklist.json trans.sv = public/language/sv/ip-blacklist.json
trans.th = public/language/th/ip-blacklist.json trans.th = public/language/th/ip-blacklist.json
@@ -398,7 +391,6 @@ trans.rw = public/language/rw/register.json
trans.sc = public/language/sc/register.json trans.sc = public/language/sc/register.json
trans.sk = public/language/sk/register.json trans.sk = public/language/sk/register.json
trans.sl = public/language/sl/register.json trans.sl = public/language/sl/register.json
trans.sq_AL = public/language/sq-AL/register.json
trans.sr = public/language/sr/register.json trans.sr = public/language/sr/register.json
trans.sv = public/language/sv/register.json trans.sv = public/language/sv/register.json
trans.th = public/language/th/register.json trans.th = public/language/th/register.json
@@ -449,7 +441,6 @@ trans.rw = public/language/rw/user.json
trans.sc = public/language/sc/user.json trans.sc = public/language/sc/user.json
trans.sk = public/language/sk/user.json trans.sk = public/language/sk/user.json
trans.sl = public/language/sl/user.json trans.sl = public/language/sl/user.json
trans.sq_AL = public/language/sq-AL/user.json
trans.sr = public/language/sr/user.json trans.sr = public/language/sr/user.json
trans.sv = public/language/sv/user.json trans.sv = public/language/sv/user.json
trans.th = public/language/th/user.json trans.th = public/language/th/user.json
@@ -500,7 +491,6 @@ trans.rw = public/language/rw/global.json
trans.sc = public/language/sc/global.json trans.sc = public/language/sc/global.json
trans.sk = public/language/sk/global.json trans.sk = public/language/sk/global.json
trans.sl = public/language/sl/global.json trans.sl = public/language/sl/global.json
trans.sq_AL = public/language/sq-AL/global.json
trans.sr = public/language/sr/global.json trans.sr = public/language/sr/global.json
trans.sv = public/language/sv/global.json trans.sv = public/language/sv/global.json
trans.th = public/language/th/global.json trans.th = public/language/th/global.json
@@ -551,7 +541,6 @@ trans.rw = public/language/rw/notifications.json
trans.sc = public/language/sc/notifications.json trans.sc = public/language/sc/notifications.json
trans.sk = public/language/sk/notifications.json trans.sk = public/language/sk/notifications.json
trans.sl = public/language/sl/notifications.json trans.sl = public/language/sl/notifications.json
trans.sq_AL = public/language/sq-AL/notifications.json
trans.sr = public/language/sr/notifications.json trans.sr = public/language/sr/notifications.json
trans.sv = public/language/sv/notifications.json trans.sv = public/language/sv/notifications.json
trans.th = public/language/th/notifications.json trans.th = public/language/th/notifications.json
@@ -602,7 +591,6 @@ trans.rw = public/language/rw/reset_password.json
trans.sc = public/language/sc/reset_password.json trans.sc = public/language/sc/reset_password.json
trans.sk = public/language/sk/reset_password.json trans.sk = public/language/sk/reset_password.json
trans.sl = public/language/sl/reset_password.json trans.sl = public/language/sl/reset_password.json
trans.sq_AL = public/language/sq-AL/reset_password.json
trans.sr = public/language/sr/reset_password.json trans.sr = public/language/sr/reset_password.json
trans.sv = public/language/sv/reset_password.json trans.sv = public/language/sv/reset_password.json
trans.th = public/language/th/reset_password.json trans.th = public/language/th/reset_password.json
@@ -653,7 +641,6 @@ trans.rw = public/language/rw/users.json
trans.sc = public/language/sc/users.json trans.sc = public/language/sc/users.json
trans.sk = public/language/sk/users.json trans.sk = public/language/sk/users.json
trans.sl = public/language/sl/users.json trans.sl = public/language/sl/users.json
trans.sq_AL = public/language/sq-AL/users.json
trans.sr = public/language/sr/users.json trans.sr = public/language/sr/users.json
trans.sv = public/language/sv/users.json trans.sv = public/language/sv/users.json
trans.th = public/language/th/users.json trans.th = public/language/th/users.json
@@ -704,7 +691,6 @@ trans.rw = public/language/rw/language.json
trans.sc = public/language/sc/language.json trans.sc = public/language/sc/language.json
trans.sk = public/language/sk/language.json trans.sk = public/language/sk/language.json
trans.sl = public/language/sl/language.json trans.sl = public/language/sl/language.json
trans.sq_AL = public/language/sq-AL/language.json
trans.sr = public/language/sr/language.json trans.sr = public/language/sr/language.json
trans.sv = public/language/sv/language.json trans.sv = public/language/sv/language.json
trans.th = public/language/th/language.json trans.th = public/language/th/language.json
@@ -755,7 +741,6 @@ trans.rw = public/language/rw/pages.json
trans.sc = public/language/sc/pages.json trans.sc = public/language/sc/pages.json
trans.sk = public/language/sk/pages.json trans.sk = public/language/sk/pages.json
trans.sl = public/language/sl/pages.json trans.sl = public/language/sl/pages.json
trans.sq_AL = public/language/sq-AL/pages.json
trans.sr = public/language/sr/pages.json trans.sr = public/language/sr/pages.json
trans.sv = public/language/sv/pages.json trans.sv = public/language/sv/pages.json
trans.th = public/language/th/pages.json trans.th = public/language/th/pages.json
@@ -806,7 +791,6 @@ trans.rw = public/language/rw/topic.json
trans.sc = public/language/sc/topic.json trans.sc = public/language/sc/topic.json
trans.sk = public/language/sk/topic.json trans.sk = public/language/sk/topic.json
trans.sl = public/language/sl/topic.json trans.sl = public/language/sl/topic.json
trans.sq_AL = public/language/sq-AL/topic.json
trans.sr = public/language/sr/topic.json trans.sr = public/language/sr/topic.json
trans.sv = public/language/sv/topic.json trans.sv = public/language/sv/topic.json
trans.th = public/language/th/topic.json trans.th = public/language/th/topic.json
@@ -857,7 +841,6 @@ trans.rw = public/language/rw/success.json
trans.sc = public/language/sc/success.json trans.sc = public/language/sc/success.json
trans.sk = public/language/sk/success.json trans.sk = public/language/sk/success.json
trans.sl = public/language/sl/success.json trans.sl = public/language/sl/success.json
trans.sq_AL = public/language/sq-AL/success.json
trans.sr = public/language/sr/success.json trans.sr = public/language/sr/success.json
trans.sv = public/language/sv/success.json trans.sv = public/language/sv/success.json
trans.th = public/language/th/success.json trans.th = public/language/th/success.json
@@ -908,7 +891,6 @@ trans.rw = public/language/rw/error.json
trans.sc = public/language/sc/error.json trans.sc = public/language/sc/error.json
trans.sk = public/language/sk/error.json trans.sk = public/language/sk/error.json
trans.sl = public/language/sl/error.json trans.sl = public/language/sl/error.json
trans.sq_AL = public/language/sq-AL/error.json
trans.sr = public/language/sr/error.json trans.sr = public/language/sr/error.json
trans.sv = public/language/sv/error.json trans.sv = public/language/sv/error.json
trans.th = public/language/th/error.json trans.th = public/language/th/error.json
@@ -959,7 +941,6 @@ trans.rw = public/language/rw/flags.json
trans.sc = public/language/sc/flags.json trans.sc = public/language/sc/flags.json
trans.sk = public/language/sk/flags.json trans.sk = public/language/sk/flags.json
trans.sl = public/language/sl/flags.json trans.sl = public/language/sl/flags.json
trans.sq_AL = public/language/sq-AL/flags.json
trans.sr = public/language/sr/flags.json trans.sr = public/language/sr/flags.json
trans.sv = public/language/sv/flags.json trans.sv = public/language/sv/flags.json
trans.th = public/language/th/flags.json trans.th = public/language/th/flags.json
@@ -1009,7 +990,6 @@ trans.rw = public/language/rw/tags.json
trans.sc = public/language/sc/tags.json trans.sc = public/language/sc/tags.json
trans.sk = public/language/sk/tags.json trans.sk = public/language/sk/tags.json
trans.sl = public/language/sl/tags.json trans.sl = public/language/sl/tags.json
trans.sq_AL = public/language/sq-AL/tags.json
trans.sr = public/language/sr/tags.json trans.sr = public/language/sr/tags.json
trans.sv = public/language/sv/tags.json trans.sv = public/language/sv/tags.json
trans.th = public/language/th/tags.json trans.th = public/language/th/tags.json
@@ -1020,57 +1000,6 @@ trans.zh_CN = public/language/zh-CN/tags.json
trans.zh_TW = public/language/zh-TW/tags.json trans.zh_TW = public/language/zh-TW/tags.json
type = KEYVALUEJSON type = KEYVALUEJSON
[nodebb.top]
file_filter = public/language/<lang>/top.json
source_file = public/language/en-GB/top.json
source_lang = en_GB
trans.ar = public/language/ar/top.json
trans.bg = public/language/bg/top.json
trans.bn = public/language/bn/top.json
trans.cs = public/language/cs/top.json
trans.da = public/language/da/top.json
trans.de = public/language/de/top.json
trans.el = public/language/el/top.json
trans.en@pirate = public/language/en-x-pirate/top.json
trans.en_US = public/language/en-US/top.json
trans.es = public/language/es/top.json
trans.et = public/language/et/top.json
trans.fa_IR = public/language/fa-IR/top.json
trans.fi = public/language/fi/top.json
trans.fr = public/language/fr/top.json
trans.gl = public/language/gl/top.json
trans.he = public/language/he/top.json
trans.hr = public/language/hr/top.json
trans.hu = public/language/hu/top.json
trans.id = public/language/id/top.json
trans.it = public/language/it/top.json
trans.ja = public/language/ja/top.json
trans.ko = public/language/ko/top.json
trans.lt = public/language/lt/top.json
trans.lv = public/language/lv/top.json
trans.ms = public/language/ms/top.json
trans.nb = public/language/nb/top.json
trans.nl = public/language/nl/top.json
trans.pl = public/language/pl/top.json
trans.pt_BR = public/language/pt-BR/top.json
trans.pt_PT = public/language/pt-PT/top.json
trans.ro = public/language/ro/top.json
trans.ru = public/language/ru/top.json
trans.rw = public/language/rw/top.json
trans.sc = public/language/sc/top.json
trans.sk = public/language/sk/top.json
trans.sl = public/language/sl/top.json
trans.sq_AL = public/language/sq-AL/top.json
trans.sr = public/language/sr/top.json
trans.sv = public/language/sv/top.json
trans.th = public/language/th/top.json
trans.tr = public/language/tr/top.json
trans.uk = public/language/uk/top.json
trans.vi = public/language/vi/top.json
trans.zh_CN = public/language/zh-CN/top.json
trans.zh_TW = public/language/zh-TW/top.json
type = KEYVALUEJSON
[nodebb.email] [nodebb.email]
file_filter = public/language/<lang>/email.json file_filter = public/language/<lang>/email.json
source_file = public/language/en-GB/email.json source_file = public/language/en-GB/email.json
@@ -1111,7 +1040,6 @@ trans.rw = public/language/rw/email.json
trans.sc = public/language/sc/email.json trans.sc = public/language/sc/email.json
trans.sk = public/language/sk/email.json trans.sk = public/language/sk/email.json
trans.sl = public/language/sl/email.json trans.sl = public/language/sl/email.json
trans.sq_AL = public/language/sq-AL/email.json
trans.sr = public/language/sr/email.json trans.sr = public/language/sr/email.json
trans.sv = public/language/sv/email.json trans.sv = public/language/sv/email.json
trans.th = public/language/th/email.json trans.th = public/language/th/email.json
@@ -1162,7 +1090,6 @@ trans.rw = public/language/rw/search.json
trans.sc = public/language/sc/search.json trans.sc = public/language/sc/search.json
trans.sk = public/language/sk/search.json trans.sk = public/language/sk/search.json
trans.sl = public/language/sl/search.json trans.sl = public/language/sl/search.json
trans.sq_AL = public/language/sq-AL/search.json
trans.sr = public/language/sr/search.json trans.sr = public/language/sr/search.json
trans.sv = public/language/sv/search.json trans.sv = public/language/sv/search.json
trans.th = public/language/th/search.json trans.th = public/language/th/search.json
@@ -1213,7 +1140,6 @@ trans.rw = public/language/rw/groups.json
trans.sc = public/language/sc/groups.json trans.sc = public/language/sc/groups.json
trans.sk = public/language/sk/groups.json trans.sk = public/language/sk/groups.json
trans.sl = public/language/sl/groups.json trans.sl = public/language/sl/groups.json
trans.sq_AL = public/language/sq-AL/groups.json
trans.sr = public/language/sr/groups.json trans.sr = public/language/sr/groups.json
trans.sv = public/language/sv/groups.json trans.sv = public/language/sv/groups.json
trans.th = public/language/th/groups.json trans.th = public/language/th/groups.json
@@ -1264,7 +1190,6 @@ trans.rw = public/language/rw/uploads.json
trans.sc = public/language/sc/uploads.json trans.sc = public/language/sc/uploads.json
trans.sk = public/language/sk/uploads.json trans.sk = public/language/sk/uploads.json
trans.sl = public/language/sl/uploads.json trans.sl = public/language/sl/uploads.json
trans.sq_AL = public/language/sq-AL/uploads.json
trans.sr = public/language/sr/uploads.json trans.sr = public/language/sr/uploads.json
trans.sv = public/language/sv/uploads.json trans.sv = public/language/sv/uploads.json
trans.th = public/language/th/uploads.json trans.th = public/language/th/uploads.json
@@ -1315,7 +1240,6 @@ trans.rw = public/language/rw/admin/admin.json
trans.sc = public/language/sc/admin/admin.json trans.sc = public/language/sc/admin/admin.json
trans.sk = public/language/sk/admin/admin.json trans.sk = public/language/sk/admin/admin.json
trans.sl = public/language/sl/admin/admin.json trans.sl = public/language/sl/admin/admin.json
trans.sq_AL = public/language/sq-AL/admin/admin.json
trans.sr = public/language/sr/admin/admin.json trans.sr = public/language/sr/admin/admin.json
trans.sv = public/language/sv/admin/admin.json trans.sv = public/language/sv/admin/admin.json
trans.th = public/language/th/admin/admin.json trans.th = public/language/th/admin/admin.json
@@ -1366,7 +1290,6 @@ trans.rw = public/language/rw/admin/menu.json
trans.sc = public/language/sc/admin/menu.json trans.sc = public/language/sc/admin/menu.json
trans.sk = public/language/sk/admin/menu.json trans.sk = public/language/sk/admin/menu.json
trans.sl = public/language/sl/admin/menu.json trans.sl = public/language/sl/admin/menu.json
trans.sq_AL = public/language/sq-AL/admin/menu.json
trans.sr = public/language/sr/admin/menu.json trans.sr = public/language/sr/admin/menu.json
trans.sv = public/language/sv/admin/menu.json trans.sv = public/language/sv/admin/menu.json
trans.th = public/language/th/admin/menu.json trans.th = public/language/th/admin/menu.json
@@ -1417,7 +1340,6 @@ trans.rw = public/language/rw/admin/advanced/cache.json
trans.sc = public/language/sc/admin/advanced/cache.json trans.sc = public/language/sc/admin/advanced/cache.json
trans.sk = public/language/sk/admin/advanced/cache.json trans.sk = public/language/sk/admin/advanced/cache.json
trans.sl = public/language/sl/admin/advanced/cache.json trans.sl = public/language/sl/admin/advanced/cache.json
trans.sq_AL = public/language/sq-AL/admin/advanced/cache.json
trans.sr = public/language/sr/admin/advanced/cache.json trans.sr = public/language/sr/admin/advanced/cache.json
trans.sv = public/language/sv/admin/advanced/cache.json trans.sv = public/language/sv/admin/advanced/cache.json
trans.th = public/language/th/admin/advanced/cache.json trans.th = public/language/th/admin/advanced/cache.json
@@ -1468,7 +1390,6 @@ trans.rw = public/language/rw/admin/advanced/database.json
trans.sc = public/language/sc/admin/advanced/database.json trans.sc = public/language/sc/admin/advanced/database.json
trans.sk = public/language/sk/admin/advanced/database.json trans.sk = public/language/sk/admin/advanced/database.json
trans.sl = public/language/sl/admin/advanced/database.json trans.sl = public/language/sl/admin/advanced/database.json
trans.sq_AL = public/language/sq-AL/admin/advanced/database.json
trans.sr = public/language/sr/admin/advanced/database.json trans.sr = public/language/sr/admin/advanced/database.json
trans.sv = public/language/sv/admin/advanced/database.json trans.sv = public/language/sv/admin/advanced/database.json
trans.th = public/language/th/admin/advanced/database.json trans.th = public/language/th/admin/advanced/database.json
@@ -1519,7 +1440,6 @@ trans.rw = public/language/rw/admin/advanced/errors.json
trans.sc = public/language/sc/admin/advanced/errors.json trans.sc = public/language/sc/admin/advanced/errors.json
trans.sk = public/language/sk/admin/advanced/errors.json trans.sk = public/language/sk/admin/advanced/errors.json
trans.sl = public/language/sl/admin/advanced/errors.json trans.sl = public/language/sl/admin/advanced/errors.json
trans.sq_AL = public/language/sq-AL/admin/advanced/errors.json
trans.sr = public/language/sr/admin/advanced/errors.json trans.sr = public/language/sr/admin/advanced/errors.json
trans.sv = public/language/sv/admin/advanced/errors.json trans.sv = public/language/sv/admin/advanced/errors.json
trans.th = public/language/th/admin/advanced/errors.json trans.th = public/language/th/admin/advanced/errors.json
@@ -1570,7 +1490,6 @@ trans.rw = public/language/rw/admin/advanced/events.json
trans.sc = public/language/sc/admin/advanced/events.json trans.sc = public/language/sc/admin/advanced/events.json
trans.sk = public/language/sk/admin/advanced/events.json trans.sk = public/language/sk/admin/advanced/events.json
trans.sl = public/language/sl/admin/advanced/events.json trans.sl = public/language/sl/admin/advanced/events.json
trans.sq_AL = public/language/sq-AL/admin/advanced/events.json
trans.sr = public/language/sr/admin/advanced/events.json trans.sr = public/language/sr/admin/advanced/events.json
trans.sv = public/language/sv/admin/advanced/events.json trans.sv = public/language/sv/admin/advanced/events.json
trans.th = public/language/th/admin/advanced/events.json trans.th = public/language/th/admin/advanced/events.json
@@ -1621,7 +1540,6 @@ trans.rw = public/language/rw/admin/advanced/logs.json
trans.sc = public/language/sc/admin/advanced/logs.json trans.sc = public/language/sc/admin/advanced/logs.json
trans.sk = public/language/sk/admin/advanced/logs.json trans.sk = public/language/sk/admin/advanced/logs.json
trans.sl = public/language/sl/admin/advanced/logs.json trans.sl = public/language/sl/admin/advanced/logs.json
trans.sq_AL = public/language/sq-AL/admin/advanced/logs.json
trans.sr = public/language/sr/admin/advanced/logs.json trans.sr = public/language/sr/admin/advanced/logs.json
trans.sv = public/language/sv/admin/advanced/logs.json trans.sv = public/language/sv/admin/advanced/logs.json
trans.th = public/language/th/admin/advanced/logs.json trans.th = public/language/th/admin/advanced/logs.json
@@ -1672,7 +1590,6 @@ trans.rw = public/language/rw/admin/appearance/customise.json
trans.sc = public/language/sc/admin/appearance/customise.json trans.sc = public/language/sc/admin/appearance/customise.json
trans.sk = public/language/sk/admin/appearance/customise.json trans.sk = public/language/sk/admin/appearance/customise.json
trans.sl = public/language/sl/admin/appearance/customise.json trans.sl = public/language/sl/admin/appearance/customise.json
trans.sq_AL = public/language/sq-AL/admin/appearance/customise.json
trans.sr = public/language/sr/admin/appearance/customise.json trans.sr = public/language/sr/admin/appearance/customise.json
trans.sv = public/language/sv/admin/appearance/customise.json trans.sv = public/language/sv/admin/appearance/customise.json
trans.th = public/language/th/admin/appearance/customise.json trans.th = public/language/th/admin/appearance/customise.json
@@ -1723,7 +1640,6 @@ trans.rw = public/language/rw/admin/appearance/skins.json
trans.sc = public/language/sc/admin/appearance/skins.json trans.sc = public/language/sc/admin/appearance/skins.json
trans.sk = public/language/sk/admin/appearance/skins.json trans.sk = public/language/sk/admin/appearance/skins.json
trans.sl = public/language/sl/admin/appearance/skins.json trans.sl = public/language/sl/admin/appearance/skins.json
trans.sq_AL = public/language/sq-AL/admin/appearance/skins.json
trans.sr = public/language/sr/admin/appearance/skins.json trans.sr = public/language/sr/admin/appearance/skins.json
trans.sv = public/language/sv/admin/appearance/skins.json trans.sv = public/language/sv/admin/appearance/skins.json
trans.th = public/language/th/admin/appearance/skins.json trans.th = public/language/th/admin/appearance/skins.json
@@ -1774,7 +1690,6 @@ trans.rw = public/language/rw/admin/appearance/themes.json
trans.sc = public/language/sc/admin/appearance/themes.json trans.sc = public/language/sc/admin/appearance/themes.json
trans.sk = public/language/sk/admin/appearance/themes.json trans.sk = public/language/sk/admin/appearance/themes.json
trans.sl = public/language/sl/admin/appearance/themes.json trans.sl = public/language/sl/admin/appearance/themes.json
trans.sq_AL = public/language/sq-AL/admin/appearance/themes.json
trans.sr = public/language/sr/admin/appearance/themes.json trans.sr = public/language/sr/admin/appearance/themes.json
trans.sv = public/language/sv/admin/appearance/themes.json trans.sv = public/language/sv/admin/appearance/themes.json
trans.th = public/language/th/admin/appearance/themes.json trans.th = public/language/th/admin/appearance/themes.json
@@ -1825,7 +1740,6 @@ trans.rw = public/language/rw/admin/development/info.json
trans.sc = public/language/sc/admin/development/info.json trans.sc = public/language/sc/admin/development/info.json
trans.sk = public/language/sk/admin/development/info.json trans.sk = public/language/sk/admin/development/info.json
trans.sl = public/language/sl/admin/development/info.json trans.sl = public/language/sl/admin/development/info.json
trans.sq_AL = public/language/sq-AL/admin/development/info.json
trans.sr = public/language/sr/admin/development/info.json trans.sr = public/language/sr/admin/development/info.json
trans.sv = public/language/sv/admin/development/info.json trans.sv = public/language/sv/admin/development/info.json
trans.th = public/language/th/admin/development/info.json trans.th = public/language/th/admin/development/info.json
@@ -1876,7 +1790,6 @@ trans.rw = public/language/rw/admin/development/logger.json
trans.sc = public/language/sc/admin/development/logger.json trans.sc = public/language/sc/admin/development/logger.json
trans.sk = public/language/sk/admin/development/logger.json trans.sk = public/language/sk/admin/development/logger.json
trans.sl = public/language/sl/admin/development/logger.json trans.sl = public/language/sl/admin/development/logger.json
trans.sq_AL = public/language/sq-AL/admin/development/logger.json
trans.sr = public/language/sr/admin/development/logger.json trans.sr = public/language/sr/admin/development/logger.json
trans.sv = public/language/sv/admin/development/logger.json trans.sv = public/language/sv/admin/development/logger.json
trans.th = public/language/th/admin/development/logger.json trans.th = public/language/th/admin/development/logger.json
@@ -1927,7 +1840,6 @@ trans.rw = public/language/rw/admin/extend/plugins.json
trans.sc = public/language/sc/admin/extend/plugins.json trans.sc = public/language/sc/admin/extend/plugins.json
trans.sk = public/language/sk/admin/extend/plugins.json trans.sk = public/language/sk/admin/extend/plugins.json
trans.sl = public/language/sl/admin/extend/plugins.json trans.sl = public/language/sl/admin/extend/plugins.json
trans.sq_AL = public/language/sq-AL/admin/extend/plugins.json
trans.sr = public/language/sr/admin/extend/plugins.json trans.sr = public/language/sr/admin/extend/plugins.json
trans.sv = public/language/sv/admin/extend/plugins.json trans.sv = public/language/sv/admin/extend/plugins.json
trans.th = public/language/th/admin/extend/plugins.json trans.th = public/language/th/admin/extend/plugins.json
@@ -1978,7 +1890,6 @@ trans.rw = public/language/rw/admin/extend/rewards.json
trans.sc = public/language/sc/admin/extend/rewards.json trans.sc = public/language/sc/admin/extend/rewards.json
trans.sk = public/language/sk/admin/extend/rewards.json trans.sk = public/language/sk/admin/extend/rewards.json
trans.sl = public/language/sl/admin/extend/rewards.json trans.sl = public/language/sl/admin/extend/rewards.json
trans.sq_AL = public/language/sq-AL/admin/extend/rewards.json
trans.sr = public/language/sr/admin/extend/rewards.json trans.sr = public/language/sr/admin/extend/rewards.json
trans.sv = public/language/sv/admin/extend/rewards.json trans.sv = public/language/sv/admin/extend/rewards.json
trans.th = public/language/th/admin/extend/rewards.json trans.th = public/language/th/admin/extend/rewards.json
@@ -2029,7 +1940,6 @@ trans.rw = public/language/rw/admin/extend/widgets.json
trans.sc = public/language/sc/admin/extend/widgets.json trans.sc = public/language/sc/admin/extend/widgets.json
trans.sk = public/language/sk/admin/extend/widgets.json trans.sk = public/language/sk/admin/extend/widgets.json
trans.sl = public/language/sl/admin/extend/widgets.json trans.sl = public/language/sl/admin/extend/widgets.json
trans.sq_AL = public/language/sq-AL/admin/extend/widgets.json
trans.sr = public/language/sr/admin/extend/widgets.json trans.sr = public/language/sr/admin/extend/widgets.json
trans.sv = public/language/sv/admin/extend/widgets.json trans.sv = public/language/sv/admin/extend/widgets.json
trans.th = public/language/th/admin/extend/widgets.json trans.th = public/language/th/admin/extend/widgets.json
@@ -2080,7 +1990,6 @@ trans.rw = public/language/rw/admin/dashboard.json
trans.sc = public/language/sc/admin/dashboard.json trans.sc = public/language/sc/admin/dashboard.json
trans.sk = public/language/sk/admin/dashboard.json trans.sk = public/language/sk/admin/dashboard.json
trans.sl = public/language/sl/admin/dashboard.json trans.sl = public/language/sl/admin/dashboard.json
trans.sq_AL = public/language/sq-AL/admin/dashboard.json
trans.sr = public/language/sr/admin/dashboard.json trans.sr = public/language/sr/admin/dashboard.json
trans.sv = public/language/sv/admin/dashboard.json trans.sv = public/language/sv/admin/dashboard.json
trans.th = public/language/th/admin/dashboard.json trans.th = public/language/th/admin/dashboard.json
@@ -2131,7 +2040,6 @@ trans.rw = public/language/rw/admin/settings/homepage.json
trans.sc = public/language/sc/admin/settings/homepage.json trans.sc = public/language/sc/admin/settings/homepage.json
trans.sk = public/language/sk/admin/settings/homepage.json trans.sk = public/language/sk/admin/settings/homepage.json
trans.sl = public/language/sl/admin/settings/homepage.json trans.sl = public/language/sl/admin/settings/homepage.json
trans.sq_AL = public/language/sq-AL/admin/settings/homepage.json
trans.sr = public/language/sr/admin/settings/homepage.json trans.sr = public/language/sr/admin/settings/homepage.json
trans.sv = public/language/sv/admin/settings/homepage.json trans.sv = public/language/sv/admin/settings/homepage.json
trans.th = public/language/th/admin/settings/homepage.json trans.th = public/language/th/admin/settings/homepage.json
@@ -2182,7 +2090,6 @@ trans.rw = public/language/rw/admin/settings/languages.json
trans.sc = public/language/sc/admin/settings/languages.json trans.sc = public/language/sc/admin/settings/languages.json
trans.sk = public/language/sk/admin/settings/languages.json trans.sk = public/language/sk/admin/settings/languages.json
trans.sl = public/language/sl/admin/settings/languages.json trans.sl = public/language/sl/admin/settings/languages.json
trans.sq_AL = public/language/sq-AL/admin/settings/languages.json
trans.sr = public/language/sr/admin/settings/languages.json trans.sr = public/language/sr/admin/settings/languages.json
trans.sv = public/language/sv/admin/settings/languages.json trans.sv = public/language/sv/admin/settings/languages.json
trans.th = public/language/th/admin/settings/languages.json trans.th = public/language/th/admin/settings/languages.json
@@ -2233,7 +2140,6 @@ trans.rw = public/language/rw/admin/settings/navigation.json
trans.sc = public/language/sc/admin/settings/navigation.json trans.sc = public/language/sc/admin/settings/navigation.json
trans.sk = public/language/sk/admin/settings/navigation.json trans.sk = public/language/sk/admin/settings/navigation.json
trans.sl = public/language/sl/admin/settings/navigation.json trans.sl = public/language/sl/admin/settings/navigation.json
trans.sq_AL = public/language/sq-AL/admin/settings/navigation.json
trans.sr = public/language/sr/admin/settings/navigation.json trans.sr = public/language/sr/admin/settings/navigation.json
trans.sv = public/language/sv/admin/settings/navigation.json trans.sv = public/language/sv/admin/settings/navigation.json
trans.th = public/language/th/admin/settings/navigation.json trans.th = public/language/th/admin/settings/navigation.json
@@ -2284,7 +2190,6 @@ trans.rw = public/language/rw/admin/settings/social.json
trans.sc = public/language/sc/admin/settings/social.json trans.sc = public/language/sc/admin/settings/social.json
trans.sk = public/language/sk/admin/settings/social.json trans.sk = public/language/sk/admin/settings/social.json
trans.sl = public/language/sl/admin/settings/social.json trans.sl = public/language/sl/admin/settings/social.json
trans.sq_AL = public/language/sq-AL/admin/settings/social.json
trans.sr = public/language/sr/admin/settings/social.json trans.sr = public/language/sr/admin/settings/social.json
trans.sv = public/language/sv/admin/settings/social.json trans.sv = public/language/sv/admin/settings/social.json
trans.th = public/language/th/admin/settings/social.json trans.th = public/language/th/admin/settings/social.json
@@ -2335,7 +2240,6 @@ trans.rw = public/language/rw/admin/settings/sounds.json
trans.sc = public/language/sc/admin/settings/sounds.json trans.sc = public/language/sc/admin/settings/sounds.json
trans.sk = public/language/sk/admin/settings/sounds.json trans.sk = public/language/sk/admin/settings/sounds.json
trans.sl = public/language/sl/admin/settings/sounds.json trans.sl = public/language/sl/admin/settings/sounds.json
trans.sq_AL = public/language/sq-AL/admin/settings/sounds.json
trans.sr = public/language/sr/admin/settings/sounds.json trans.sr = public/language/sr/admin/settings/sounds.json
trans.sv = public/language/sv/admin/settings/sounds.json trans.sv = public/language/sv/admin/settings/sounds.json
trans.th = public/language/th/admin/settings/sounds.json trans.th = public/language/th/admin/settings/sounds.json
@@ -2386,7 +2290,6 @@ trans.rw = public/language/rw/admin/manage/admins-mods.json
trans.sc = public/language/sc/admin/manage/admins-mods.json trans.sc = public/language/sc/admin/manage/admins-mods.json
trans.sk = public/language/sk/admin/manage/admins-mods.json trans.sk = public/language/sk/admin/manage/admins-mods.json
trans.sl = public/language/sl/admin/manage/admins-mods.json trans.sl = public/language/sl/admin/manage/admins-mods.json
trans.sq_AL = public/language/sq-AL/admin/manage/admins-mods.json
trans.sr = public/language/sr/admin/manage/admins-mods.json trans.sr = public/language/sr/admin/manage/admins-mods.json
trans.sv = public/language/sv/admin/manage/admins-mods.json trans.sv = public/language/sv/admin/manage/admins-mods.json
trans.th = public/language/th/admin/manage/admins-mods.json trans.th = public/language/th/admin/manage/admins-mods.json
@@ -2437,7 +2340,6 @@ trans.rw = public/language/rw/admin/manage/categories.json
trans.sc = public/language/sc/admin/manage/categories.json trans.sc = public/language/sc/admin/manage/categories.json
trans.sk = public/language/sk/admin/manage/categories.json trans.sk = public/language/sk/admin/manage/categories.json
trans.sl = public/language/sl/admin/manage/categories.json trans.sl = public/language/sl/admin/manage/categories.json
trans.sq_AL = public/language/sq-AL/admin/manage/categories.json
trans.sr = public/language/sr/admin/manage/categories.json trans.sr = public/language/sr/admin/manage/categories.json
trans.sv = public/language/sv/admin/manage/categories.json trans.sv = public/language/sv/admin/manage/categories.json
trans.th = public/language/th/admin/manage/categories.json trans.th = public/language/th/admin/manage/categories.json
@@ -2488,7 +2390,6 @@ trans.rw = public/language/rw/admin/manage/groups.json
trans.sc = public/language/sc/admin/manage/groups.json trans.sc = public/language/sc/admin/manage/groups.json
trans.sk = public/language/sk/admin/manage/groups.json trans.sk = public/language/sk/admin/manage/groups.json
trans.sl = public/language/sl/admin/manage/groups.json trans.sl = public/language/sl/admin/manage/groups.json
trans.sq_AL = public/language/sq-AL/admin/manage/groups.json
trans.sr = public/language/sr/admin/manage/groups.json trans.sr = public/language/sr/admin/manage/groups.json
trans.sv = public/language/sv/admin/manage/groups.json trans.sv = public/language/sv/admin/manage/groups.json
trans.th = public/language/th/admin/manage/groups.json trans.th = public/language/th/admin/manage/groups.json
@@ -2539,7 +2440,6 @@ trans.rw = public/language/rw/admin/manage/privileges.json
trans.sc = public/language/sc/admin/manage/privileges.json trans.sc = public/language/sc/admin/manage/privileges.json
trans.sk = public/language/sk/admin/manage/privileges.json trans.sk = public/language/sk/admin/manage/privileges.json
trans.sl = public/language/sl/admin/manage/privileges.json trans.sl = public/language/sl/admin/manage/privileges.json
trans.sq_AL = public/language/sq-AL/admin/manage/privileges.json
trans.sr = public/language/sr/admin/manage/privileges.json trans.sr = public/language/sr/admin/manage/privileges.json
trans.sv = public/language/sv/admin/manage/privileges.json trans.sv = public/language/sv/admin/manage/privileges.json
trans.th = public/language/th/admin/manage/privileges.json trans.th = public/language/th/admin/manage/privileges.json
@@ -2590,7 +2490,6 @@ trans.rw = public/language/rw/admin/manage/registration.json
trans.sc = public/language/sc/admin/manage/registration.json trans.sc = public/language/sc/admin/manage/registration.json
trans.sk = public/language/sk/admin/manage/registration.json trans.sk = public/language/sk/admin/manage/registration.json
trans.sl = public/language/sl/admin/manage/registration.json trans.sl = public/language/sl/admin/manage/registration.json
trans.sq_AL = public/language/sq-AL/admin/manage/registration.json
trans.sr = public/language/sr/admin/manage/registration.json trans.sr = public/language/sr/admin/manage/registration.json
trans.sv = public/language/sv/admin/manage/registration.json trans.sv = public/language/sv/admin/manage/registration.json
trans.th = public/language/th/admin/manage/registration.json trans.th = public/language/th/admin/manage/registration.json
@@ -2641,7 +2540,6 @@ trans.rw = public/language/rw/admin/manage/tags.json
trans.sc = public/language/sc/admin/manage/tags.json trans.sc = public/language/sc/admin/manage/tags.json
trans.sk = public/language/sk/admin/manage/tags.json trans.sk = public/language/sk/admin/manage/tags.json
trans.sl = public/language/sl/admin/manage/tags.json trans.sl = public/language/sl/admin/manage/tags.json
trans.sq_AL = public/language/sq-AL/admin/manage/tags.json
trans.sr = public/language/sr/admin/manage/tags.json trans.sr = public/language/sr/admin/manage/tags.json
trans.sv = public/language/sv/admin/manage/tags.json trans.sv = public/language/sv/admin/manage/tags.json
trans.th = public/language/th/admin/manage/tags.json trans.th = public/language/th/admin/manage/tags.json
@@ -2692,7 +2590,6 @@ trans.rw = public/language/rw/admin/manage/uploads.json
trans.sc = public/language/sc/admin/manage/uploads.json trans.sc = public/language/sc/admin/manage/uploads.json
trans.sk = public/language/sk/admin/manage/uploads.json trans.sk = public/language/sk/admin/manage/uploads.json
trans.sl = public/language/sl/admin/manage/uploads.json trans.sl = public/language/sl/admin/manage/uploads.json
trans.sq_AL = public/language/sq-AL/admin/manage/uploads.json
trans.sr = public/language/sr/admin/manage/uploads.json trans.sr = public/language/sr/admin/manage/uploads.json
trans.sv = public/language/sv/admin/manage/uploads.json trans.sv = public/language/sv/admin/manage/uploads.json
trans.th = public/language/th/admin/manage/uploads.json trans.th = public/language/th/admin/manage/uploads.json
@@ -2743,7 +2640,6 @@ trans.rw = public/language/rw/admin/manage/users.json
trans.sc = public/language/sc/admin/manage/users.json trans.sc = public/language/sc/admin/manage/users.json
trans.sk = public/language/sk/admin/manage/users.json trans.sk = public/language/sk/admin/manage/users.json
trans.sl = public/language/sl/admin/manage/users.json trans.sl = public/language/sl/admin/manage/users.json
trans.sq_AL = public/language/sq-AL/admin/manage/users.json
trans.sr = public/language/sr/admin/manage/users.json trans.sr = public/language/sr/admin/manage/users.json
trans.sv = public/language/sv/admin/manage/users.json trans.sv = public/language/sv/admin/manage/users.json
trans.th = public/language/th/admin/manage/users.json trans.th = public/language/th/admin/manage/users.json
@@ -2794,7 +2690,6 @@ trans.rw = public/language/rw/admin/manage/digest.json
trans.sc = public/language/sc/admin/manage/digest.json trans.sc = public/language/sc/admin/manage/digest.json
trans.sk = public/language/sk/admin/manage/digest.json trans.sk = public/language/sk/admin/manage/digest.json
trans.sl = public/language/sl/admin/manage/digest.json trans.sl = public/language/sl/admin/manage/digest.json
trans.sq_AL = public/language/sq-AL/admin/manage/digest.json
trans.sr = public/language/sr/admin/manage/digest.json trans.sr = public/language/sr/admin/manage/digest.json
trans.sv = public/language/sv/admin/manage/digest.json trans.sv = public/language/sv/admin/manage/digest.json
trans.th = public/language/th/admin/manage/digest.json trans.th = public/language/th/admin/manage/digest.json
@@ -2845,7 +2740,6 @@ trans.rw = public/language/rw/admin/settings/advanced.json
trans.sc = public/language/sc/admin/settings/advanced.json trans.sc = public/language/sc/admin/settings/advanced.json
trans.sk = public/language/sk/admin/settings/advanced.json trans.sk = public/language/sk/admin/settings/advanced.json
trans.sl = public/language/sl/admin/settings/advanced.json trans.sl = public/language/sl/admin/settings/advanced.json
trans.sq_AL = public/language/sq-AL/admin/settings/advanced.json
trans.sr = public/language/sr/admin/settings/advanced.json trans.sr = public/language/sr/admin/settings/advanced.json
trans.sv = public/language/sv/admin/settings/advanced.json trans.sv = public/language/sv/admin/settings/advanced.json
trans.th = public/language/th/admin/settings/advanced.json trans.th = public/language/th/admin/settings/advanced.json
@@ -2896,7 +2790,6 @@ trans.rw = public/language/rw/admin/settings/cookies.json
trans.sc = public/language/sc/admin/settings/cookies.json trans.sc = public/language/sc/admin/settings/cookies.json
trans.sk = public/language/sk/admin/settings/cookies.json trans.sk = public/language/sk/admin/settings/cookies.json
trans.sl = public/language/sl/admin/settings/cookies.json trans.sl = public/language/sl/admin/settings/cookies.json
trans.sq_AL = public/language/sq-AL/admin/settings/cookies.json
trans.sr = public/language/sr/admin/settings/cookies.json trans.sr = public/language/sr/admin/settings/cookies.json
trans.sv = public/language/sv/admin/settings/cookies.json trans.sv = public/language/sv/admin/settings/cookies.json
trans.th = public/language/th/admin/settings/cookies.json trans.th = public/language/th/admin/settings/cookies.json
@@ -2947,7 +2840,6 @@ trans.rw = public/language/rw/admin/settings/general.json
trans.sc = public/language/sc/admin/settings/general.json trans.sc = public/language/sc/admin/settings/general.json
trans.sk = public/language/sk/admin/settings/general.json trans.sk = public/language/sk/admin/settings/general.json
trans.sl = public/language/sl/admin/settings/general.json trans.sl = public/language/sl/admin/settings/general.json
trans.sq_AL = public/language/sq-AL/admin/settings/general.json
trans.sr = public/language/sr/admin/settings/general.json trans.sr = public/language/sr/admin/settings/general.json
trans.sv = public/language/sv/admin/settings/general.json trans.sv = public/language/sv/admin/settings/general.json
trans.th = public/language/th/admin/settings/general.json trans.th = public/language/th/admin/settings/general.json
@@ -2998,7 +2890,6 @@ trans.rw = public/language/rw/admin/settings/guest.json
trans.sc = public/language/sc/admin/settings/guest.json trans.sc = public/language/sc/admin/settings/guest.json
trans.sk = public/language/sk/admin/settings/guest.json trans.sk = public/language/sk/admin/settings/guest.json
trans.sl = public/language/sl/admin/settings/guest.json trans.sl = public/language/sl/admin/settings/guest.json
trans.sq_AL = public/language/sq-AL/admin/settings/guest.json
trans.sr = public/language/sr/admin/settings/guest.json trans.sr = public/language/sr/admin/settings/guest.json
trans.sv = public/language/sv/admin/settings/guest.json trans.sv = public/language/sv/admin/settings/guest.json
trans.th = public/language/th/admin/settings/guest.json trans.th = public/language/th/admin/settings/guest.json
@@ -3049,7 +2940,6 @@ trans.rw = public/language/rw/admin/settings/pagination.json
trans.sc = public/language/sc/admin/settings/pagination.json trans.sc = public/language/sc/admin/settings/pagination.json
trans.sk = public/language/sk/admin/settings/pagination.json trans.sk = public/language/sk/admin/settings/pagination.json
trans.sl = public/language/sl/admin/settings/pagination.json trans.sl = public/language/sl/admin/settings/pagination.json
trans.sq_AL = public/language/sq-AL/admin/settings/pagination.json
trans.sr = public/language/sr/admin/settings/pagination.json trans.sr = public/language/sr/admin/settings/pagination.json
trans.sv = public/language/sv/admin/settings/pagination.json trans.sv = public/language/sv/admin/settings/pagination.json
trans.th = public/language/th/admin/settings/pagination.json trans.th = public/language/th/admin/settings/pagination.json
@@ -3100,7 +2990,6 @@ trans.rw = public/language/rw/admin/settings/reputation.json
trans.sc = public/language/sc/admin/settings/reputation.json trans.sc = public/language/sc/admin/settings/reputation.json
trans.sk = public/language/sk/admin/settings/reputation.json trans.sk = public/language/sk/admin/settings/reputation.json
trans.sl = public/language/sl/admin/settings/reputation.json trans.sl = public/language/sl/admin/settings/reputation.json
trans.sq_AL = public/language/sq-AL/admin/settings/reputation.json
trans.sr = public/language/sr/admin/settings/reputation.json trans.sr = public/language/sr/admin/settings/reputation.json
trans.sv = public/language/sv/admin/settings/reputation.json trans.sv = public/language/sv/admin/settings/reputation.json
trans.th = public/language/th/admin/settings/reputation.json trans.th = public/language/th/admin/settings/reputation.json
@@ -3151,7 +3040,6 @@ trans.rw = public/language/rw/admin/settings/tags.json
trans.sc = public/language/sc/admin/settings/tags.json trans.sc = public/language/sc/admin/settings/tags.json
trans.sk = public/language/sk/admin/settings/tags.json trans.sk = public/language/sk/admin/settings/tags.json
trans.sl = public/language/sl/admin/settings/tags.json trans.sl = public/language/sl/admin/settings/tags.json
trans.sq_AL = public/language/sq-AL/admin/settings/tags.json
trans.sr = public/language/sr/admin/settings/tags.json trans.sr = public/language/sr/admin/settings/tags.json
trans.sv = public/language/sv/admin/settings/tags.json trans.sv = public/language/sv/admin/settings/tags.json
trans.th = public/language/th/admin/settings/tags.json trans.th = public/language/th/admin/settings/tags.json
@@ -3202,7 +3090,6 @@ trans.rw = public/language/rw/admin/settings/user.json
trans.sc = public/language/sc/admin/settings/user.json trans.sc = public/language/sc/admin/settings/user.json
trans.sk = public/language/sk/admin/settings/user.json trans.sk = public/language/sk/admin/settings/user.json
trans.sl = public/language/sl/admin/settings/user.json trans.sl = public/language/sl/admin/settings/user.json
trans.sq_AL = public/language/sq-AL/admin/settings/user.json
trans.sr = public/language/sr/admin/settings/user.json trans.sr = public/language/sr/admin/settings/user.json
trans.sv = public/language/sv/admin/settings/user.json trans.sv = public/language/sv/admin/settings/user.json
trans.th = public/language/th/admin/settings/user.json trans.th = public/language/th/admin/settings/user.json
@@ -3253,7 +3140,6 @@ trans.rw = public/language/rw/admin/settings/chat.json
trans.sc = public/language/sc/admin/settings/chat.json trans.sc = public/language/sc/admin/settings/chat.json
trans.sk = public/language/sk/admin/settings/chat.json trans.sk = public/language/sk/admin/settings/chat.json
trans.sl = public/language/sl/admin/settings/chat.json trans.sl = public/language/sl/admin/settings/chat.json
trans.sq_AL = public/language/sq-AL/admin/settings/chat.json
trans.sr = public/language/sr/admin/settings/chat.json trans.sr = public/language/sr/admin/settings/chat.json
trans.sv = public/language/sv/admin/settings/chat.json trans.sv = public/language/sv/admin/settings/chat.json
trans.th = public/language/th/admin/settings/chat.json trans.th = public/language/th/admin/settings/chat.json
@@ -3304,7 +3190,6 @@ trans.rw = public/language/rw/admin/settings/email.json
trans.sc = public/language/sc/admin/settings/email.json trans.sc = public/language/sc/admin/settings/email.json
trans.sk = public/language/sk/admin/settings/email.json trans.sk = public/language/sk/admin/settings/email.json
trans.sl = public/language/sl/admin/settings/email.json trans.sl = public/language/sl/admin/settings/email.json
trans.sq_AL = public/language/sq-AL/admin/settings/email.json
trans.sr = public/language/sr/admin/settings/email.json trans.sr = public/language/sr/admin/settings/email.json
trans.sv = public/language/sv/admin/settings/email.json trans.sv = public/language/sv/admin/settings/email.json
trans.th = public/language/th/admin/settings/email.json trans.th = public/language/th/admin/settings/email.json
@@ -3355,7 +3240,6 @@ trans.rw = public/language/rw/admin/settings/group.json
trans.sc = public/language/sc/admin/settings/group.json trans.sc = public/language/sc/admin/settings/group.json
trans.sk = public/language/sk/admin/settings/group.json trans.sk = public/language/sk/admin/settings/group.json
trans.sl = public/language/sl/admin/settings/group.json trans.sl = public/language/sl/admin/settings/group.json
trans.sq_AL = public/language/sq-AL/admin/settings/group.json
trans.sr = public/language/sr/admin/settings/group.json trans.sr = public/language/sr/admin/settings/group.json
trans.sv = public/language/sv/admin/settings/group.json trans.sv = public/language/sv/admin/settings/group.json
trans.th = public/language/th/admin/settings/group.json trans.th = public/language/th/admin/settings/group.json
@@ -3406,7 +3290,6 @@ trans.rw = public/language/rw/admin/settings/notifications.json
trans.sc = public/language/sc/admin/settings/notifications.json trans.sc = public/language/sc/admin/settings/notifications.json
trans.sk = public/language/sk/admin/settings/notifications.json trans.sk = public/language/sk/admin/settings/notifications.json
trans.sl = public/language/sl/admin/settings/notifications.json trans.sl = public/language/sl/admin/settings/notifications.json
trans.sq_AL = public/language/sq-AL/admin/settings/notifications.json
trans.sr = public/language/sr/admin/settings/notifications.json trans.sr = public/language/sr/admin/settings/notifications.json
trans.sv = public/language/sv/admin/settings/notifications.json trans.sv = public/language/sv/admin/settings/notifications.json
trans.th = public/language/th/admin/settings/notifications.json trans.th = public/language/th/admin/settings/notifications.json
@@ -3457,7 +3340,6 @@ trans.rw = public/language/rw/admin/settings/api.json
trans.sc = public/language/sc/admin/settings/api.json trans.sc = public/language/sc/admin/settings/api.json
trans.sk = public/language/sk/admin/settings/api.json trans.sk = public/language/sk/admin/settings/api.json
trans.sl = public/language/sl/admin/settings/api.json trans.sl = public/language/sl/admin/settings/api.json
trans.sq_AL = public/language/sq-AL/admin/settings/api.json
trans.sr = public/language/sr/admin/settings/api.json trans.sr = public/language/sr/admin/settings/api.json
trans.sv = public/language/sv/admin/settings/api.json trans.sv = public/language/sv/admin/settings/api.json
trans.th = public/language/th/admin/settings/api.json trans.th = public/language/th/admin/settings/api.json
@@ -3508,7 +3390,6 @@ trans.rw = public/language/rw/admin/settings/post.json
trans.sc = public/language/sc/admin/settings/post.json trans.sc = public/language/sc/admin/settings/post.json
trans.sk = public/language/sk/admin/settings/post.json trans.sk = public/language/sk/admin/settings/post.json
trans.sl = public/language/sl/admin/settings/post.json trans.sl = public/language/sl/admin/settings/post.json
trans.sq_AL = public/language/sq-AL/admin/settings/post.json
trans.sr = public/language/sr/admin/settings/post.json trans.sr = public/language/sr/admin/settings/post.json
trans.sv = public/language/sv/admin/settings/post.json trans.sv = public/language/sv/admin/settings/post.json
trans.th = public/language/th/admin/settings/post.json trans.th = public/language/th/admin/settings/post.json
@@ -3559,7 +3440,6 @@ trans.rw = public/language/rw/admin/settings/sockets.json
trans.sc = public/language/sc/admin/settings/sockets.json trans.sc = public/language/sc/admin/settings/sockets.json
trans.sk = public/language/sk/admin/settings/sockets.json trans.sk = public/language/sk/admin/settings/sockets.json
trans.sl = public/language/sl/admin/settings/sockets.json trans.sl = public/language/sl/admin/settings/sockets.json
trans.sq_AL = public/language/sq-AL/admin/settings/sockets.json
trans.sr = public/language/sr/admin/settings/sockets.json trans.sr = public/language/sr/admin/settings/sockets.json
trans.sv = public/language/sv/admin/settings/sockets.json trans.sv = public/language/sv/admin/settings/sockets.json
trans.th = public/language/th/admin/settings/sockets.json trans.th = public/language/th/admin/settings/sockets.json
@@ -3610,7 +3490,6 @@ trans.rw = public/language/rw/admin/settings/uploads.json
trans.sc = public/language/sc/admin/settings/uploads.json trans.sc = public/language/sc/admin/settings/uploads.json
trans.sk = public/language/sk/admin/settings/uploads.json trans.sk = public/language/sk/admin/settings/uploads.json
trans.sl = public/language/sl/admin/settings/uploads.json trans.sl = public/language/sl/admin/settings/uploads.json
trans.sq_AL = public/language/sq-AL/admin/settings/uploads.json
trans.sr = public/language/sr/admin/settings/uploads.json trans.sr = public/language/sr/admin/settings/uploads.json
trans.sv = public/language/sv/admin/settings/uploads.json trans.sv = public/language/sv/admin/settings/uploads.json
trans.th = public/language/th/admin/settings/uploads.json trans.th = public/language/th/admin/settings/uploads.json
@@ -3661,7 +3540,6 @@ trans.rw = public/language/rw/admin/settings/web-crawler.json
trans.sc = public/language/sc/admin/settings/web-crawler.json trans.sc = public/language/sc/admin/settings/web-crawler.json
trans.sk = public/language/sk/admin/settings/web-crawler.json trans.sk = public/language/sk/admin/settings/web-crawler.json
trans.sl = public/language/sl/admin/settings/web-crawler.json trans.sl = public/language/sl/admin/settings/web-crawler.json
trans.sq_AL = public/language/sq-AL/admin/settings/web-crawler.json
trans.sr = public/language/sr/admin/settings/web-crawler.json trans.sr = public/language/sr/admin/settings/web-crawler.json
trans.sv = public/language/sv/admin/settings/web-crawler.json trans.sv = public/language/sv/admin/settings/web-crawler.json
trans.th = public/language/th/admin/settings/web-crawler.json trans.th = public/language/th/admin/settings/web-crawler.json

File diff suppressed because it is too large Load Diff

View File

@@ -1,20 +1,17 @@
FROM node:lts FROM node:lts
RUN mkdir -p /usr/src/app && \ RUN mkdir -p /usr/src/app
chown -R node:node /usr/src/app
WORKDIR /usr/src/app WORKDIR /usr/src/app
ARG NODE_ENV ARG NODE_ENV
ENV NODE_ENV $NODE_ENV ENV NODE_ENV $NODE_ENV
COPY --chown=node:node install/package.json /usr/src/app/package.json COPY install/package.json /usr/src/app/package.json
USER node
RUN npm install --only=prod && \ RUN npm install --only=prod && \
npm cache clean --force npm cache clean --force
COPY --chown=node:node . /usr/src/app COPY . /usr/src/app
ENV NODE_ENV=production \ ENV NODE_ENV=production \
daemon=false \ daemon=false \
@@ -22,4 +19,4 @@ ENV NODE_ENV=production \
EXPOSE 4567 EXPOSE 4567
CMD test -n "${SETUP}" && ./nodebb setup || node ./nodebb build; node ./nodebb start CMD node ./nodebb build ; node ./nodebb start

View File

@@ -20,7 +20,6 @@ const prestart = require('./src/prestart');
prestart.loadConfig(configFile); prestart.loadConfig(configFile);
const db = require('./src/database'); const db = require('./src/database');
const plugins = require('./src/plugins');
module.exports = function (grunt) { module.exports = function (grunt) {
const args = []; const args = [];
@@ -41,35 +40,35 @@ module.exports = function (grunt) {
grunt.registerTask('init', async function () { grunt.registerTask('init', async function () {
const done = this.async(); const done = this.async();
let pluginList = []; let plugins = [];
if (!process.argv.includes('--core')) { if (!process.argv.includes('--core')) {
await db.init(); await db.init();
pluginList = await plugins.getActive(); plugins = await db.getSortedSetRange('plugins:active', 0, -1);
addBaseThemes(pluginList); addBaseThemes(plugins);
if (!pluginList.includes('nodebb-plugin-composer-default')) { if (!plugins.includes('nodebb-plugin-composer-default')) {
pluginList.push('nodebb-plugin-composer-default'); plugins.push('nodebb-plugin-composer-default');
} }
if (!pluginList.includes('nodebb-theme-persona')) { if (!plugins.includes('nodebb-theme-persona')) {
pluginList.push('nodebb-theme-persona'); plugins.push('nodebb-theme-persona');
} }
} }
const styleUpdated_Client = pluginList.map(p => `node_modules/${p}/*.less`) const styleUpdated_Client = plugins.map(p => `node_modules/${p}/*.less`)
.concat(pluginList.map(p => `node_modules/${p}/*.css`)) .concat(plugins.map(p => `node_modules/${p}/*.css`))
.concat(pluginList.map(p => `node_modules/${p}/+(public|static|less)/**/*.less`)) .concat(plugins.map(p => `node_modules/${p}/+(public|static|less)/**/*.less`))
.concat(pluginList.map(p => `node_modules/${p}/+(public|static)/**/*.css`)); .concat(plugins.map(p => `node_modules/${p}/+(public|static)/**/*.css`));
const styleUpdated_Admin = pluginList.map(p => `node_modules/${p}/*.less`) const styleUpdated_Admin = plugins.map(p => `node_modules/${p}/*.less`)
.concat(pluginList.map(p => `node_modules/${p}/*.css`)) .concat(plugins.map(p => `node_modules/${p}/*.css`))
.concat(pluginList.map(p => `node_modules/${p}/+(public|static|less)/**/*.less`)) .concat(plugins.map(p => `node_modules/${p}/+(public|static|less)/**/*.less`))
.concat(pluginList.map(p => `node_modules/${p}/+(public|static)/**/*.css`)); .concat(plugins.map(p => `node_modules/${p}/+(public|static)/**/*.css`));
const clientUpdated = pluginList.map(p => `node_modules/${p}/+(public|static)/**/*.js`); const clientUpdated = plugins.map(p => `node_modules/${p}/+(public|static)/**/*.js`);
const serverUpdated = pluginList.map(p => `node_modules/${p}/*.js`) const serverUpdated = plugins.map(p => `node_modules/${p}/*.js`)
.concat(pluginList.map(p => `node_modules/${p}/+(lib|src)/**/*.js`)); .concat(plugins.map(p => `node_modules/${p}/+(lib|src)/**/*.js`));
const templatesUpdated = pluginList.map(p => `node_modules/${p}/+(public|static|templates)/**/*.tpl`); const templatesUpdated = plugins.map(p => `node_modules/${p}/+(public|static|templates)/**/*.tpl`);
const langUpdated = pluginList.map(p => `node_modules/${p}/+(public|static|languages)/**/*.json`); const langUpdated = plugins.map(p => `node_modules/${p}/+(public|static|languages)/**/*.json`);
grunt.config(['watch'], { grunt.config(['watch'], {
styleUpdated_Client: { styleUpdated_Client: {
@@ -106,9 +105,9 @@ module.exports = function (grunt) {
'app.js', 'app.js',
'install/*.js', 'install/*.js',
'src/**/*.js', 'src/**/*.js',
'public/src/modules/translator.common.js', 'public/src/modules/translator.js',
'public/src/modules/helpers.common.js', 'public/src/modules/helpers.js',
'public/src/utils.common.js', 'public/src/utils.js',
serverUpdated, serverUpdated,
'!src/upgrades/**', '!src/upgrades/**',
], ],
@@ -138,10 +137,9 @@ module.exports = function (grunt) {
}); });
const build = require('./src/meta/build'); const build = require('./src/meta/build');
if (!grunt.option('skip')) { if (!grunt.option('skip')) {
await build.build(true, { webpack: false }); await build.build(true);
} }
run(); run();
await build.webpack({ watch: true });
done(); done();
}); });
@@ -185,7 +183,7 @@ module.exports = function (grunt) {
return run(); return run();
} }
require('./src/meta/build').build([compiling], { webpack: false }, (err) => { require('./src/meta/build').build([compiling], (err) => {
if (err) { if (err) {
winston.error(err.stack); winston.error(err.stack);
} }
@@ -196,10 +194,10 @@ module.exports = function (grunt) {
}); });
}; };
function addBaseThemes(pluginList) { function addBaseThemes(plugins) {
let themeId = pluginList.find(p => p.includes('nodebb-theme-')); let themeId = plugins.find(p => p.includes('nodebb-theme-'));
if (!themeId) { if (!themeId) {
return pluginList; return plugins;
} }
let baseTheme; let baseTheme;
do { do {
@@ -210,9 +208,9 @@ function addBaseThemes(pluginList) {
} }
if (baseTheme) { if (baseTheme) {
pluginList.push(baseTheme); plugins.push(baseTheme);
themeId = baseTheme; themeId = baseTheme;
} }
} while (baseTheme); } while (baseTheme);
return pluginList; return plugins;
} }

View File

@@ -1,14 +1,22 @@
# ![NodeBB](public/images/sm-card.png) # ![NodeBB](public/images/logo.svg)
[![Workflow](https://github.com/NodeBB/NodeBB/actions/workflows/test.yaml/badge.svg)](https://github.com/NodeBB/NodeBB/actions/workflows/test.yaml) [![Build Status](https://travis-ci.org/NodeBB/NodeBB.svg?branch=master)](https://travis-ci.org/NodeBB/NodeBB)
[![Coverage Status](https://coveralls.io/repos/github/NodeBB/NodeBB/badge.svg?branch=master)](https://coveralls.io/github/NodeBB/NodeBB?branch=master) [![Coverage Status](https://coveralls.io/repos/github/NodeBB/NodeBB/badge.svg?branch=master)](https://coveralls.io/github/NodeBB/NodeBB?branch=master)
[![Dependency Status](https://david-dm.org/nodebb/nodebb.svg?path=install)](https://david-dm.org/nodebb/nodebb?path=install)
[![Code Climate](https://codeclimate.com/github/NodeBB/NodeBB/badges/gpa.svg)](https://codeclimate.com/github/NodeBB/NodeBB) [![Code Climate](https://codeclimate.com/github/NodeBB/NodeBB/badges/gpa.svg)](https://codeclimate.com/github/NodeBB/NodeBB)
[**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 takes the best of the modern web: real-time streaming discussions, mobile responsiveness, and rich RESTful read/write APIs, while staying true to the original bulletin board/forum format &rarr; categorical hierarchies, local user accounts, and asynchronous messaging. [**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.
NodeBB by itself contains a "common core" of basic functionality, while additional functionality and integrations are enabled through the use of third-party plugins. Additional functionality is enabled through the use of third-party plugins.
### [Try it now](//try.nodebb.org) | [Documentation](//docs.nodebb.org) * [Demo](https://try.nodebb.org)
* [Developer Community](http://community.nodebb.org)
* [Documentation & Installation Instructions](http://docs.nodebb.org)
* [Help translate NodeBB](https://www.transifex.com/projects/p/nodebb/)
* [NodeBB Blog](http://blog.nodebb.org)
* [Premium Hosting for NodeBB](http://www.nodebb.org/ "NodeBB")
* [Follow us on Twitter](http://www.twitter.com/NodeBB/ "NodeBB Twitter")
* [Like us on Facebook](http://www.facebook.com/NodeBB/ "NodeBB Facebook")
## Screenshots ## Screenshots
@@ -34,7 +42,7 @@ Our minimalist "Persona" theme gets you going right away, no coding experience r
* If you are a developer, feel free to check out the source and submit pull requests. We also have a wide array of [plugins](http://community.nodebb.org/category/7/nodebb-plugins) which would be a great starting point for learning the codebase. * If you are a developer, feel free to check out the source and submit pull requests. We also have a wide array of [plugins](http://community.nodebb.org/category/7/nodebb-plugins) which would be a great starting point for learning the codebase.
* If you are a designer, [NodeBB needs themes](http://community.nodebb.org/category/10/nodebb-themes)! NodeBB's theming system allows extension of the base templates as well as styling via LESS or CSS. NodeBB's base theme utilizes [Bootstrap 3](http://getbootstrap.com/) but themes can choose to use a different framework altogether. * If you are a designer, [NodeBB needs themes](http://community.nodebb.org/category/10/nodebb-themes)! NodeBB's theming system allows extension of the base templates as well as styling via LESS or CSS. NodeBB's base theme utilizes [Bootstrap 3](http://getbootstrap.com/) but themes can choose to use a different framework altogether.
* If you know languages other than English you can help us translate NodeBB. We use [Transifex](https://explore.transifex.com/nodebb/nodebb/) for internationalization. * If you know languages other than English you can help us translate NodeBB. We use [Transifex](https://www.transifex.com/projects/p/nodebb/) for internationalization.
* Please don't forget to **like**, **follow**, and **star our repo**! Join our growing [community](http://community.nodebb.org) to keep up to date with the latest NodeBB development. * Please don't forget to **like**, **follow**, and **star our repo**! Join our growing [community](http://community.nodebb.org) to keep up to date with the latest NodeBB development.
## Requirements ## Requirements
@@ -42,7 +50,7 @@ Our minimalist "Persona" theme gets you going right away, no coding experience r
NodeBB requires the following software to be installed: NodeBB requires the following software to be installed:
* A version of Node.js at least 12 or greater ([installation/upgrade instructions](https://github.com/nodesource/distributions)) * A version of Node.js at least 12 or greater ([installation/upgrade instructions](https://github.com/nodesource/distributions))
* MongoDB, version 3.6 or greater **or** Redis, version 2.8.9 or greater * MongoDB, version 2.6 or greater **or** Redis, version 2.8.9 or greater
* If you are using [clustering](https://docs.nodebb.org/configuring/scaling/) you need Redis installed and configured. * If you are using [clustering](https://docs.nodebb.org/configuring/scaling/) you need Redis installed and configured.
* nginx, version 1.3.13 or greater (**only if** intending to use nginx to proxy requests to a NodeBB) * nginx, version 1.3.13 or greater (**only if** intending to use nginx to proxy requests to a NodeBB)
@@ -70,15 +78,3 @@ Detailed upgrade instructions are listed in [Upgrading NodeBB](https://docs.node
NodeBB is licensed under the **GNU General Public License v3 (GPL-3)** (http://www.gnu.org/copyleft/gpl.html). NodeBB is licensed under the **GNU General Public License v3 (GPL-3)** (http://www.gnu.org/copyleft/gpl.html).
Interested in a sublicense agreement for use of NodeBB in a non-free/restrictive environment? Contact us at sales@nodebb.org. Interested in a sublicense agreement for use of NodeBB in a non-free/restrictive environment? Contact us at sales@nodebb.org.
## More Information/Links
* [Demo](https://try.nodebb.org)
* [Developer Community](http://community.nodebb.org)
* [Documentation & Installation Instructions](http://docs.nodebb.org)
* [Help translate NodeBB](https://explore.transifex.com/nodebb/nodebb/)
* [NodeBB Blog](http://blog.nodebb.org)
* [Premium Hosting for NodeBB](http://www.nodebb.org/ "NodeBB")
* Unofficial IRC community &ndash; channel `#nodebb` on Libera.chat
* [Follow us on Twitter](http://www.twitter.com/NodeBB/ "NodeBB Twitter")
* [Like us on Facebook](http://www.facebook.com/NodeBB/ "NodeBB Facebook")

4
app.js
View File

@@ -1,7 +1,7 @@
/* /*
NodeBB - A better forum platform for the modern web NodeBB - A better forum platform for the modern web
https://github.com/NodeBB/NodeBB/ https://github.com/NodeBB/NodeBB/
Copyright (C) 2013-2021 NodeBB Inc. Copyright (C) 2013-2017 NodeBB Inc.
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
@@ -71,7 +71,7 @@ if (nconf.get('setup') || nconf.get('install')) {
}); });
} else if (nconf.get('activate')) { } else if (nconf.get('activate')) {
require('./src/cli/manage').activate(nconf.get('activate')); require('./src/cli/manage').activate(nconf.get('activate'));
} else if (nconf.get('plugins') && typeof nconf.get('plugins') !== 'object') { } else if (nconf.get('plugins')) {
require('./src/cli/manage').listPlugins(); require('./src/cli/manage').listPlugins();
} else if (nconf.get('build')) { } else if (nconf.get('build')) {
require('./src/cli/manage').build(nconf.get('build')); require('./src/cli/manage').build(nconf.get('build'));

View File

@@ -14,7 +14,6 @@
"newbiePostEditDuration": 3600, "newbiePostEditDuration": 3600,
"postDeleteDuration": 0, "postDeleteDuration": 0,
"enablePostHistory": 1, "enablePostHistory": 1,
"topicBacklinks": 1,
"postCacheSize": 10485760, "postCacheSize": 10485760,
"disableChat": 0, "disableChat": 0,
"chatEditDuration": 0, "chatEditDuration": 0,
@@ -45,7 +44,6 @@
"allowMultipleBadges": 0, "allowMultipleBadges": 0,
"maximumFileSize": 2048, "maximumFileSize": 2048,
"stripEXIFData": 1, "stripEXIFData": 1,
"orphanExpiryDays": 0,
"resizeImageWidthThreshold": 2000, "resizeImageWidthThreshold": 2000,
"resizeImageWidth": 760, "resizeImageWidth": 760,
"rejectImageWidth": 5000, "rejectImageWidth": 5000,
@@ -67,10 +65,10 @@
"profileImageDimension": 200, "profileImageDimension": 200,
"profile:convertProfileImageToPNG": 0, "profile:convertProfileImageToPNG": 0,
"profile:keepAllUserImages": 0, "profile:keepAllUserImages": 0,
"requireEmailConfirmation": 0,
"gdpr_enabled": 1, "gdpr_enabled": 1,
"allowProfileImageUploads": 1, "allowProfileImageUploads": 1,
"teaserPost": "last-reply", "teaserPost": "last-reply",
"showPostPreviewsOnHover": 1,
"allowPrivateGroups": 1, "allowPrivateGroups": 1,
"unreadCutoff": 2, "unreadCutoff": 2,
"bookmarkThreshold": 5, "bookmarkThreshold": 5,
@@ -78,13 +76,9 @@
"reputation:disabled": 0, "reputation:disabled": 0,
"downvote:disabled": 0, "downvote:disabled": 0,
"disableSignatures": 0, "disableSignatures": 0,
"upvotesPerDay": 20,
"upvotesPerUserPerDay": 6,
"downvotesPerDay": 10, "downvotesPerDay": 10,
"downvotesPerUserPerDay": 3, "downvotesPerUserPerDay": 3,
"min:rep:chat": 0,
"min:rep:downvote": 0, "min:rep:downvote": 0,
"min:rep:upvote": 0,
"min:rep:flag": 0, "min:rep:flag": 0,
"min:rep:profile-picture": 0, "min:rep:profile-picture": 0,
"min:rep:cover-picture": 0, "min:rep:cover-picture": 0,
@@ -92,7 +86,6 @@
"min:rep:aboutme": 0, "min:rep:aboutme": 0,
"min:rep:signature": 0, "min:rep:signature": 0,
"flags:limitPerTarget": 0, "flags:limitPerTarget": 0,
"flags:autoFlagOnDownvoteThreshold": 0,
"notificationType_upvote": "notification", "notificationType_upvote": "notification",
"notificationType_new-topic": "notification", "notificationType_new-topic": "notification",
"notificationType_new-reply": "notification", "notificationType_new-reply": "notification",
@@ -115,9 +108,6 @@
"postsPerPage": 20, "postsPerPage": 20,
"categoriesPerPage": 50, "categoriesPerPage": 50,
"userSearchResultsPerPage": 50, "userSearchResultsPerPage": 50,
"searchDefaultSortBy": "relevance",
"searchDefaultIn": "titlesposts",
"searchDefaultInQuick": "titles",
"maximumGroupNameLength": 255, "maximumGroupNameLength": 255,
"maximumGroupTitleLength": 40, "maximumGroupTitleLength": 40,
"preventTopicDeleteAfterReplies": 0, "preventTopicDeleteAfterReplies": 0,
@@ -144,18 +134,10 @@
"disableEmailSubscriptions": 0, "disableEmailSubscriptions": 0,
"emailConfirmInterval": 10, "emailConfirmInterval": 10,
"removeEmailNotificationImages": 0, "removeEmailNotificationImages": 0,
"sendValidationEmail": 1,
"includeUnverifiedEmails": 0,
"emailPrompt": 1,
"sendEmailToBanned": 0,
"requireEmailAddress": 0,
"inviteExpiration": 7, "inviteExpiration": 7,
"dailyDigestFreq": "off", "dailyDigestFreq": "off",
"digestHour": 17, "digestHour": 17,
"passwordExpiryDays": 0, "passwordExpiryDays": 0,
"cross-origin-embedder-policy": 0,
"cross-origin-opener-policy": "same-origin",
"cross-origin-resource-policy": "same-origin",
"hsts-maxage": 31536000, "hsts-maxage": 31536000,
"hsts-subdomains": 0, "hsts-subdomains": 0,
"hsts-preload": 0, "hsts-preload": 0,

View File

@@ -64,6 +64,9 @@
"iconClass": "fa-cogs", "iconClass": "fa-cogs",
"textClass": "visible-xs-inline", "textClass": "visible-xs-inline",
"text": "[[global:header.admin]]", "text": "[[global:header.admin]]",
"groups": ["administrators"] "groups": ["administrators"],
"properties": {
"targetBlank": false
}
} }
] ]

View File

@@ -3,6 +3,10 @@
const prompt = require('prompt'); const prompt = require('prompt');
const winston = require('winston'); const winston = require('winston');
const util = require('util');
const promptGet = util.promisify((schema, callback) => prompt.get(schema, callback));
const questions = { const questions = {
redis: require('../src/database/redis').questions, redis: require('../src/database/redis').questions,
mongo: require('../src/database/mongo').questions, mongo: require('../src/database/mongo').questions,
@@ -24,17 +28,17 @@ async function getDatabaseConfig(config) {
if (config['redis:host'] && config['redis:port']) { if (config['redis:host'] && config['redis:port']) {
return config; return config;
} }
return await prompt.get(questions.redis); return await promptGet(questions.redis);
} else if (config.database === 'mongo') { } else if (config.database === 'mongo') {
if ((config['mongo:host'] && config['mongo:port']) || config['mongo:uri']) { if ((config['mongo:host'] && config['mongo:port']) || config['mongo:uri']) {
return config; return config;
} }
return await prompt.get(questions.mongo); return await promptGet(questions.mongo);
} else if (config.database === 'postgres') { } else if (config.database === 'postgres') {
if (config['postgres:host'] && config['postgres:port']) { if (config['postgres:host'] && config['postgres:port']) {
return config; return config;
} }
return await prompt.get(questions.postgres); return await promptGet(questions.postgres);
} }
throw new Error(`unknown database : ${config.database}`); throw new Error(`unknown database : ${config.database}`);
} }

View File

@@ -2,7 +2,7 @@
"name": "nodebb", "name": "nodebb",
"license": "GPL-3.0", "license": "GPL-3.0",
"description": "NodeBB Forum", "description": "NodeBB Forum",
"version": "2.4.4", "version": "1.17.2",
"homepage": "http://www.nodebb.org", "homepage": "http://www.nodebb.org",
"repository": { "repository": {
"type": "git", "type": "git",
@@ -28,141 +28,136 @@
] ]
}, },
"dependencies": { "dependencies": {
"@adactive/bootstrap-tagsinput": "0.8.2", "@adactive/bootstrap-tagsinput": "^0.8.2",
"@isaacs/ttlcache": "^1.2.0", "ace-builds": "^1.4.12",
"ace-builds": "1.8.1", "archiver": "^5.2.0",
"archiver": "5.3.1", "async": "^3.2.0",
"async": "3.2.4", "autoprefixer": "10.3.1",
"autoprefixer": "10.4.8",
"bcryptjs": "2.4.3", "bcryptjs": "2.4.3",
"benchpressjs": "2.4.3", "benchpressjs": "2.4.3",
"body-parser": "1.20.0", "body-parser": "^1.19.0",
"bootbox": "5.5.3", "bootbox": "5.5.2",
"bootstrap": "3.4.1", "bootstrap": "^3.4.1",
"chalk": "4.1.2", "chart.js": "^2.9.4",
"chart.js": "2.9.4", "cli-graph": "^3.2.2",
"cli-graph": "3.2.2", "clipboard": "^2.0.6",
"clipboard": "2.0.11", "colors": "^1.4.0",
"colors": "1.4.0", "commander": "^7.1.0",
"commander": "9.4.0", "compare-versions": "3.6.0",
"compare-versions": "4.1.3", "compression": "^1.7.4",
"compression": "1.7.4", "connect-flash": "^0.1.1",
"connect-flash": "0.1.1", "connect-mongo": "4.4.1",
"connect-mongo": "4.6.0", "connect-multiparty": "^2.2.0",
"connect-multiparty": "2.2.0", "connect-pg-simple": "^6.2.1",
"connect-pg-simple": "7.0.0", "connect-redis": "6.0.0",
"connect-redis": "6.1.3", "cookie-parser": "^1.4.5",
"cookie-parser": "1.4.6", "cron": "^1.8.2",
"cron": "2.1.0", "cropperjs": "^1.5.11",
"cropperjs": "1.5.12", "csurf": "^1.11.0",
"csurf": "1.11.0", "daemon": "^1.1.0",
"daemon": "1.1.0", "diff": "^5.0.0",
"diff": "5.1.0", "express": "^4.17.1",
"express": "4.18.1", "express-session": "^1.17.1",
"express-session": "1.17.3", "express-useragent": "^1.0.15",
"express-useragent": "1.0.15", "graceful-fs": "^4.2.6",
"file-loader": "6.2.0", "helmet": "^4.4.1",
"fs-extra": "10.1.0", "html-to-text": "7.1.1",
"graceful-fs": "4.2.10", "ipaddr.js": "^2.0.0",
"helmet": "5.1.1",
"html-to-text": "8.2.1",
"ipaddr.js": "2.0.1",
"jquery": "3.6.0", "jquery": "3.6.0",
"jquery-deserialize": "2.0.0", "jquery-deserialize": "2.0.0-rc1",
"jquery-form": "4.3.0", "jquery-form": "4.3.0",
"jquery-serializeobject": "1.0.0", "jquery-serializeobject": "1.0.0",
"jquery-ui": "1.13.2", "jquery-ui": "1.12.1",
"jsesc": "3.0.2", "jsesc": "3.0.2",
"json2csv": "5.0.7", "json2csv": "5.0.6",
"jsonwebtoken": "8.5.1", "jsonwebtoken": "^8.5.1",
"less": "4.1.3", "less": "^3.11.1",
"lodash": "4.17.21", "lodash": "^4.17.21",
"logrotate-stream": "0.2.8", "logrotate-stream": "^0.2.7",
"lru-cache": "7.13.1", "lru-cache": "6.0.0",
"material-design-lite": "1.3.0", "material-design-lite": "^1.3.0",
"mime": "3.0.0", "mime": "^2.5.2",
"mkdirp": "1.0.4", "mkdirp": "^1.0.4",
"mongodb": "4.8.1", "mongodb": "3.6.10",
"morgan": "1.10.0", "morgan": "^1.10.0",
"mousetrap": "1.6.5", "mousetrap": "^1.6.5",
"multiparty": "4.2.3", "multiparty": "4.2.2",
"@nodebb/bootswatch": "3.4.2", "@nodebb/bootswatch": "3.4.2",
"nconf": "0.12.0", "nconf": "^0.11.2",
"nodebb-plugin-2factor": "5.0.2", "nodebb-plugin-composer-default": "6.5.34",
"nodebb-plugin-composer-default": "8.0.0", "nodebb-plugin-dbsearch": "5.0.2",
"nodebb-plugin-dbsearch": "5.1.5", "nodebb-plugin-emoji": "^3.5.0",
"nodebb-plugin-emoji": "4.0.4", "nodebb-plugin-emoji-android": "2.0.5",
"nodebb-plugin-emoji-android": "3.0.0", "nodebb-plugin-markdown": "8.14.2",
"nodebb-plugin-markdown": "10.1.0", "nodebb-plugin-mentions": "2.13.11",
"nodebb-plugin-mentions": "3.0.11", "nodebb-plugin-spam-be-gone": "0.7.9",
"nodebb-plugin-spam-be-gone": "1.0.0", "nodebb-rewards-essentials": "0.1.5",
"nodebb-rewards-essentials": "0.2.1", "nodebb-theme-lavender": "5.2.1",
"nodebb-theme-lavender": "6.0.0", "nodebb-theme-persona": "11.0.26",
"nodebb-theme-persona": "12.1.0", "nodebb-theme-slick": "1.4.7",
"nodebb-theme-slick": "2.0.2", "nodebb-theme-vanilla": "12.0.8",
"nodebb-theme-vanilla": "12.1.18", "nodebb-widget-essentials": "5.0.4",
"nodebb-widget-essentials": "6.0.0", "nodemailer": "^6.5.0",
"nodemailer": "6.7.7",
"nprogress": "0.2.0", "nprogress": "0.2.0",
"passport": "0.5.2", "passport": "^0.4.1",
"passport-http-bearer": "1.0.1", "passport-http-bearer": "^1.0.1",
"passport-local": "1.0.0", "passport-local": "1.0.0",
"pg": "8.7.3", "pg": "^8.5.1",
"pg-cursor": "2.7.3", "pg-cursor": "^2.5.2",
"postcss": "8.4.14", "postcss": "8.3.5",
"postcss-clean": "1.2.0", "postcss-clean": "1.2.0",
"prompt": "1.3.0", "prompt": "^1.1.0",
"ioredis": "5.2.2", "ioredis": "4.27.6",
"request": "2.88.2", "request": "2.88.2",
"request-promise-native": "1.0.9", "request-promise-native": "^1.0.9",
"requirejs": "2.3.6",
"rimraf": "3.0.2", "rimraf": "3.0.2",
"rss": "1.2.2", "rss": "^1.2.2",
"sanitize-html": "2.7.1", "sanitize-html": "^2.3.2",
"semver": "7.3.7", "semver": "^7.3.4",
"serve-favicon": "2.5.0", "serve-favicon": "^2.5.0",
"sharp": "0.30.7", "sharp": "0.28.3",
"sitemap": "7.1.1", "sitemap": "^7.0.0",
"slideout": "1.0.1", "slideout": "1.0.1",
"socket.io": "4.5.1", "socket.io": "4.1.3",
"socket.io-client": "4.5.1", "socket.io-adapter-cluster": "^1.0.1",
"@socket.io/redis-adapter": "7.2.0", "socket.io-client": "4.1.3",
"sortablejs": "1.15.0", "@socket.io/redis-adapter": "7.0.0",
"spdx-license-list": "6.6.0", "sortablejs": "1.14.0",
"spdx-license-list": "^6.4.0",
"spider-detector": "2.0.0", "spider-detector": "2.0.0",
"textcomplete": "0.18.2", "textcomplete": "^0.18.0",
"textcomplete.contenteditable": "0.1.1", "textcomplete.contenteditable": "^0.1.1",
"timeago": "1.6.7", "timeago": "^1.6.7",
"tinycon": "0.6.8", "tinycon": "0.6.8",
"toobusy-js": "0.5.1", "toobusy-js": "^0.5.1",
"uglify-es": "3.3.9", "uglify-es": "^3.3.9",
"validator": "13.7.0", "validator": "13.6.0",
"visibilityjs": "2.0.2", "visibilityjs": "2.0.2",
"webpack": "5.74.0", "winston": "3.3.3",
"webpack-merge": "5.8.0", "xml": "^1.0.1",
"winston": "3.8.1", "xregexp": "^5.0.1",
"xml": "1.0.1", "yargs": "16.2.0",
"xregexp": "5.1.1", "zxcvbn": "^4.4.2"
"yargs": "17.5.1",
"zxcvbn": "4.4.2"
}, },
"devDependencies": { "devDependencies": {
"@apidevtools/swagger-parser": "10.0.3", "@apidevtools/swagger-parser": "10.0.2",
"@commitlint/cli": "17.0.3", "@commitlint/cli": "12.1.4",
"@commitlint/config-angular": "17.0.3", "@commitlint/config-angular": "12.1.4",
"coveralls": "3.1.1", "coveralls": "3.1.1",
"eslint": "8.21.0", "eslint": "7.30.0",
"eslint-config-nodebb": "0.1.1", "eslint-config-airbnb-base": "14.2.1",
"eslint-plugin-import": "2.26.0", "eslint-plugin-import": "2.23.4",
"grunt": "1.5.3", "grunt": "1.4.1",
"grunt-contrib-watch": "1.1.0", "grunt-contrib-watch": "1.1.0",
"husky": "8.0.1", "husky": "6.0.0",
"jsdom": "20.0.0", "jsdom": "16.6.0",
"lint-staged": "13.0.3", "lint-staged": "11.0.1",
"mocha": "10.0.0", "mocha": "8.4.0",
"mocha-lcov-reporter": "1.3.0", "mocha-lcov-reporter": "1.3.0",
"mockdate": "3.0.5", "mockdate": "3.0.5",
"nyc": "15.1.0", "nyc": "15.1.0",
"smtp-server": "3.11.0" "smtp-server": "3.9.0"
}, },
"bugs": { "bugs": {
"url": "https://github.com/NodeBB/NodeBB/issues" "url": "https://github.com/NodeBB/NodeBB/issues"

View File

@@ -7,8 +7,12 @@ const fs = require('fs');
const path = require('path'); const path = require('path');
const childProcess = require('child_process'); const childProcess = require('child_process');
const less = require('less'); const less = require('less');
const util = require('util');
const webpack = require('webpack'); const lessRenderAsync = util.promisify(
(style, opts, cb) => less.render(String(style), opts, cb)
);
const uglify = require('uglify-es');
const nconf = require('nconf'); const nconf = require('nconf');
const Benchpress = require('benchpressjs'); const Benchpress = require('benchpressjs');
@@ -46,6 +50,16 @@ winston.configure({
}); });
const web = module.exports; const web = module.exports;
const scripts = [
'node_modules/jquery/dist/jquery.js',
'node_modules/xregexp/xregexp-all.js',
'public/src/modules/slugify.js',
'public/src/utils.js',
'public/src/installer/install.js',
'node_modules/zxcvbn/dist/zxcvbn.js',
];
let installing = false; let installing = false;
let success = false; let success = false;
let error = false; let error = false;
@@ -58,8 +72,6 @@ web.install = async function (port) {
winston.info(`Launching web installer on port ${port}`); winston.info(`Launching web installer on port ${port}`);
app.use(express.static('public', {})); app.use(express.static('public', {}));
app.use('/assets', express.static(path.join(__dirname, '../build/public'), {}));
app.engine('tpl', (filepath, options, callback) => { app.engine('tpl', (filepath, options, callback) => {
filepath = filepath.replace(/\.tpl$/, '.js'); filepath = filepath.replace(/\.tpl$/, '.js');
@@ -74,7 +86,7 @@ web.install = async function (port) {
await Promise.all([ await Promise.all([
compileTemplate(), compileTemplate(),
compileLess(), compileLess(),
runWebpack(), compileJS(),
copyCSS(), copyCSS(),
loadDefaults(), loadDefaults(),
]); ]);
@@ -85,13 +97,6 @@ web.install = async function (port) {
} }
}; };
async function runWebpack() {
const util = require('util');
const webpackCfg = require('../webpack.installer');
const compiler = webpack(webpackCfg);
const webpackRun = util.promisify(compiler.run).bind(compiler);
await webpackRun();
}
function launchExpress(port) { function launchExpress(port) {
server = app.listen(port, () => { server = app.listen(port, () => {
@@ -112,7 +117,7 @@ function ping(req, res) {
} }
function welcome(req, res) { function welcome(req, res) {
const dbs = ['mongo', 'redis', 'postgres']; const dbs = ['redis', 'mongo', 'postgres'];
const databases = dbs.map((databaseName) => { const databases = dbs.map((databaseName) => {
const questions = require(`../src/database/${databaseName}`).questions.filter(question => question && !question.hideOnWebInstall); const questions = require(`../src/database/${databaseName}`).questions.filter(question => question && !question.hideOnWebInstall);
@@ -145,27 +150,29 @@ function install(req, res) {
} }
req.setTimeout(0); req.setTimeout(0);
installing = true; installing = true;
const setupEnvVars = nconf.get();
for (const [key, value] of Object.entries(req.body)) {
if (!process.env.hasOwnProperty(key)) {
setupEnvVars[key.replace(':', '__')] = value;
}
}
const database = nconf.get('database') || req.body.database || 'mongo'; // Flatten any objects in setupEnvVars
const setupEnvVars = { const pushToRoot = function (parentKey, key) {
...process.env, setupEnvVars[`${parentKey}__${key}`] = setupEnvVars[parentKey][key];
NODEBB_URL: nconf.get('url') || req.body.url || (`${req.protocol}://${req.get('host')}`),
NODEBB_PORT: nconf.get('port') || 4567,
NODEBB_ADMIN_USERNAME: nconf.get('admin:username') || req.body['admin:username'],
NODEBB_ADMIN_PASSWORD: nconf.get('admin:password') || req.body['admin:password'],
NODEBB_ADMIN_EMAIL: nconf.get('admin:email') || req.body['admin:email'],
NODEBB_DB: database,
NODEBB_DB_HOST: nconf.get(`${database}:host`) || req.body[`${database}:host`],
NODEBB_DB_PORT: nconf.get(`${database}:port`) || req.body[`${database}:port`],
NODEBB_DB_USER: nconf.get(`${database}:username`) || req.body[`${database}:username`],
NODEBB_DB_PASSWORD: nconf.get(`${database}:password`) || req.body[`${database}:password`],
NODEBB_DB_NAME: nconf.get(`${database}:database`) || req.body[`${database}:database`],
NODEBB_DB_SSL: nconf.get(`${database}:ssl`) || req.body[`${database}:ssl`],
defaultPlugins: JSON.stringify(nconf.get('defaultplugins') || nconf.get('defaultPlugins') || []),
}; };
for (const [parentKey, value] of Object.entries(setupEnvVars)) {
if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
Object.keys(value).forEach(key => pushToRoot(parentKey, key));
delete setupEnvVars[parentKey];
} else if (Array.isArray(value)) {
setupEnvVars[parentKey] = JSON.stringify(value);
}
}
winston.info('Starting setup process'); winston.info('Starting setup process');
launchUrl = setupEnvVars.NODEBB_URL; winston.info(setupEnvVars);
launchUrl = setupEnvVars.url;
const child = require('child_process').fork('app', ['--setup'], { const child = require('child_process').fork('app', ['--setup'], {
env: setupEnvVars, env: setupEnvVars,
@@ -206,20 +213,15 @@ async function launch(req, res) {
} }
const filesToDelete = [ const filesToDelete = [
path.join(__dirname, '../public', 'installer.css'), 'installer.css',
path.join(__dirname, '../public', 'bootstrap.min.css'), 'installer.min.js',
path.join(__dirname, '../build/public', 'installer.min.js'), 'bootstrap.min.css',
]; ];
try {
await Promise.all( await Promise.all(
filesToDelete.map( filesToDelete.map(
filename => fs.promises.unlink(filename) filename => fs.promises.unlink(path.join(__dirname, '../public', filename))
) )
); );
} catch (err) {
console.log(err.stack);
}
child.unref(); child.unref();
process.exit(0); process.exit(0);
} catch (err) { } catch (err) {
@@ -251,7 +253,7 @@ async function compileLess() {
try { try {
const installSrc = path.join(__dirname, '../public/less/install.less'); const installSrc = path.join(__dirname, '../public/less/install.less');
const style = await fs.promises.readFile(installSrc); const style = await fs.promises.readFile(installSrc);
const css = await less.render(String(style), { filename: path.resolve(installSrc) }); const css = await lessRenderAsync(style, { filename: path.resolve(installSrc) });
await fs.promises.writeFile(path.join(__dirname, '../public/installer.css'), css.css); await fs.promises.writeFile(path.join(__dirname, '../public/installer.css'), css.css);
} catch (err) { } catch (err) {
winston.error(`Unable to compile LESS: \n${err.stack}`); winston.error(`Unable to compile LESS: \n${err.stack}`);
@@ -259,6 +261,23 @@ async function compileLess() {
} }
} }
async function compileJS() {
let code = '';
for (const srcPath of scripts) {
// eslint-disable-next-line no-await-in-loop
const buffer = await fs.promises.readFile(path.join(__dirname, '..', srcPath));
code += buffer.toString();
}
const minified = uglify.minify(code, {
compress: false,
});
if (!minified.code) {
throw new Error('[[error:failed-to-minify]]');
}
await fs.promises.writeFile(path.join(__dirname, '../public/installer.min.js'), minified.code);
}
async function copyCSS() { async function copyCSS() {
const src = await fs.promises.readFile( const src = await fs.promises.readFile(
path.join(__dirname, '../node_modules/bootstrap/dist/css/bootstrap.min.css'), 'utf8' path.join(__dirname, '../node_modules/bootstrap/dist/css/bootstrap.min.css'), 'utf8'
@@ -269,15 +288,12 @@ async function copyCSS() {
async function loadDefaults() { async function loadDefaults() {
const setupDefaultsPath = path.join(__dirname, '../setup.json'); const setupDefaultsPath = path.join(__dirname, '../setup.json');
try { try {
// eslint-disable-next-line no-bitwise await fs.promises.access(setupDefaultsPath, fs.constants.F_OK + fs.constants.R_OK);
await fs.promises.access(setupDefaultsPath, fs.constants.F_OK | fs.constants.R_OK);
} catch (err) { } catch (err) {
// setup.json not found or inaccessible, proceed with no defaults // setup.json not found or inaccessible, proceed with no defaults
if (err.code !== 'ENOENT') { if (err.code !== 'ENOENT') {
throw err; throw err;
} }
return;
} }
winston.info('[installer] Found setup.json, populating default values'); winston.info('[installer] Found setup.json, populating default values');
nconf.file({ nconf.file({

View File

@@ -5,6 +5,7 @@ const fs = require('fs');
const url = require('url'); const url = require('url');
const path = require('path'); const path = require('path');
const { fork } = require('child_process'); const { fork } = require('child_process');
const async = require('async');
const logrotate = require('logrotate-stream'); const logrotate = require('logrotate-stream');
const mkdirp = require('mkdirp'); const mkdirp = require('mkdirp');
@@ -35,7 +36,7 @@ const Loader = {
}; };
const appPath = path.join(__dirname, 'app.js'); const appPath = path.join(__dirname, 'app.js');
Loader.init = function () { Loader.init = function (callback) {
if (silent) { if (silent) {
console.log = (...args) => { console.log = (...args) => {
output.write(`${args.join(' ')}\n`); output.write(`${args.join(' ')}\n`);
@@ -44,15 +45,17 @@ Loader.init = function () {
process.on('SIGHUP', Loader.restart); process.on('SIGHUP', Loader.restart);
process.on('SIGTERM', Loader.stop); process.on('SIGTERM', Loader.stop);
callback();
}; };
Loader.displayStartupMessages = function () { Loader.displayStartupMessages = function (callback) {
console.log(''); console.log('');
console.log(`NodeBB v${pkg.version} Copyright (C) 2013-${(new Date()).getFullYear()} NodeBB Inc.`); console.log(`NodeBB v${pkg.version} Copyright (C) 2013-2014 NodeBB Inc.`);
console.log('This program comes with ABSOLUTELY NO WARRANTY.'); console.log('This program comes with ABSOLUTELY NO WARRANTY.');
console.log('This is free software, and you are welcome to redistribute it under certain conditions.'); console.log('This is free software, and you are welcome to redistribute it under certain conditions.');
console.log('For the full license, please visit: http://www.gnu.org/copyleft/gpl.html'); console.log('For the full license, please visit: http://www.gnu.org/copyleft/gpl.html');
console.log(''); console.log('');
callback();
}; };
Loader.addWorkerEvents = function (worker) { Loader.addWorkerEvents = function (worker) {
@@ -104,13 +107,17 @@ Loader.addWorkerEvents = function (worker) {
}); });
}; };
Loader.start = function () { Loader.start = function (callback) {
numProcs = getPorts().length; numProcs = getPorts().length;
console.log(`Clustering enabled: Spinning up ${numProcs} process(es).\n`); console.log(`Clustering enabled: Spinning up ${numProcs} process(es).\n`);
for (let x = 0; x < numProcs; x += 1) { for (let x = 0; x < numProcs; x += 1) {
forkWorker(x, x === 0); forkWorker(x, x === 0);
} }
if (callback) {
callback();
}
}; };
function forkWorker(index, isPrimary) { function forkWorker(index, isPrimary) {
@@ -208,26 +215,13 @@ fs.open(pathToConfig, 'r', (err) => {
if (nconf.get('daemon') !== 'false' && nconf.get('daemon') !== false) { if (nconf.get('daemon') !== 'false' && nconf.get('daemon') !== false) {
if (file.existsSync(pidFilePath)) { if (file.existsSync(pidFilePath)) {
let pid = 0;
try { try {
pid = fs.readFileSync(pidFilePath, { encoding: 'utf-8' }); const pid = fs.readFileSync(pidFilePath, { encoding: 'utf-8' });
if (pid) {
process.kill(pid, 0); process.kill(pid, 0);
console.info(`Process "${pid}" from pidfile already running, exiting`);
process.exit(); process.exit();
} else { } catch (e) {
console.info(`Invalid pid "${pid}" from pidfile, deleting pidfile`);
fs.unlinkSync(pidFilePath); fs.unlinkSync(pidFilePath);
} }
} catch (err) {
if (err.code === 'ESRCH') {
console.info(`Process "${pid}" from pidfile not found, deleting pidfile`);
fs.unlinkSync(pidFilePath);
} else {
console.error(err.stack);
throw err;
}
}
} }
require('daemon')({ require('daemon')({
@@ -238,12 +232,15 @@ fs.open(pathToConfig, 'r', (err) => {
fs.writeFileSync(pidFilePath, String(process.pid)); fs.writeFileSync(pidFilePath, String(process.pid));
} }
try {
Loader.init(); async.series([
Loader.displayStartupMessages(); Loader.init,
Loader.start(); Loader.displayStartupMessages,
} catch (err) { Loader.start,
], (err) => {
if (err) {
console.error('[loader] Error during startup'); console.error('[loader] Error during startup');
throw err; throw err;
} }
});
}); });

View File

@@ -1,3 +1,82 @@
{ {
"extends": "nodebb/public" "globals": {
"app": true,
"io": true,
"socket": true,
"ajaxify": true,
"config": true,
"utils": true,
"overrides": true,
"componentHandler": true,
"bootbox": true,
"Visibility": true,
"Tinycon": true,
"Promise": true
},
"env": {
"jquery": true,
"amd": true,
"browser": true,
"es6": true
},
"rules": {
"comma-dangle": ["error", {
"arrays": "always-multiline",
"objects": "always-multiline",
"imports": "always-multiline",
"exports": "always-multiline",
"functions": "never"
}],
"block-scoped-var": "off",
"no-dupe-class-members": "off",
"prefer-object-spread": "off",
"prefer-reflect": "off",
// ES6
"prefer-rest-params": "off",
"prefer-spread": "off",
"prefer-arrow-callback": "off",
"prefer-template": "off",
"no-var": "off",
"object-shorthand": "off",
"vars-on-top": "off",
"prefer-destructuring": "off",
// identical to airbnb rule
// 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."
}
]
},
"parserOptions": {
"ecmaVersion": 2018,
"ecmaFeatures": {
"classes": false,
"defaultParams": false,
"blockBindings": false,
"forOf": false,
"generators": false,
"globalReturn": false,
"jsx": false,
"modules": false,
"objectLiteralComputedProperties": false,
"objectLiteralDuplicateProperties": false,
"objectLiteralShorthandMethods": false,
"objectLiteralShorthandProperties": false,
"impliedStrict": false,
"restParams": false,
"superInFunctions": false
}
}
} }

83
public/.jshintrc Normal file
View File

@@ -0,0 +1,83 @@
{
"maxerr" : 50, // {int} Maximum error before stopping
// Enforcing
"bitwise" : true, // true: Prohibit bitwise operators (&, |, ^, etc.)
"camelcase" : false, // true: Identifiers must be in camelCase
"curly" : true, // true: Require {} for every new block or scope
"eqeqeq" : true, // true: Require triple equals (===) for comparison
"forin" : true, // true: Require filtering for..in loops with obj.hasOwnProperty()
"immed" : false, // true: Require immediate invocations to be wrapped in parens e.g. `(function () { } ());`
"indent" : 4, // {int} Number of spaces to use for indentation
"latedef" : false, // true: Require variables/functions to be defined before being used
"newcap" : false, // true: Require capitalization of all constructor functions e.g. `new F()`
"noarg" : true, // true: Prohibit use of `arguments.caller` and `arguments.callee`
"noempty" : true, // true: Prohibit use of empty blocks
"nonew" : false, // true: Prohibit use of constructors for side-effects (without assignment)
"plusplus" : false, // true: Prohibit use of `++` & `--`
"quotmark" : false, // Quotation mark consistency:
// false : do nothing (default)
// true : ensure whatever is used is consistent
// "single" : require single quotes
// "double" : require double quotes
"undef" : true, // true: Require all non-global variables to be declared (prevents global leaks)
"unused" : true, // true: Require all defined variables be used
"strict" : true, // true: Requires all functions run in ES5 Strict Mode
"trailing" : false, // true: Prohibit trailing whitespaces
"maxparams" : false, // {int} Max number of formal params allowed per function
"maxdepth" : false, // {int} Max depth of nested blocks (within functions)
"maxstatements" : false, // {int} Max number statements per function
"maxcomplexity" : false, // {int} Max cyclomatic complexity per function
"maxlen" : false, // {int} Max number of characters per line
// Relaxing
"asi" : false, // true: Tolerate Automatic Semicolon Insertion (no semicolons)
"boss" : false, // true: Tolerate assignments where comparisons would be expected
"debug" : false, // true: Allow debugger statements e.g. browser breakpoints.
"eqnull" : false, // true: Tolerate use of `== null`
"es5" : false, // true: Allow ES5 syntax (ex: getters and setters)
"esnext" : false, // true: Allow ES.next (ES6) syntax (ex: `const`)
"moz" : false, // true: Allow Mozilla specific syntax (extends and overrides esnext features)
// (ex: `for each`, multiple try/catch, function expression…)
"evil" : false, // true: Tolerate use of `eval` and `new Function()`
"expr" : false, // true: Tolerate `ExpressionStatement` as Programs
"funcscope" : false, // true: Tolerate defining variables inside control statements"
"globalstrict" : false, // true: Allow global "use strict" (also enables 'strict')
"iterator" : false, // true: Tolerate using the `__iterator__` property
"lastsemic" : false, // true: Tolerate omitting a semicolon for the last statement of a 1-line block
"laxbreak" : false, // true: Tolerate possibly unsafe line breakings
"laxcomma" : false, // true: Tolerate comma-first style coding
"loopfunc" : false, // true: Tolerate functions being defined in loops
"multistr" : false, // true: Tolerate multi-line strings
"proto" : false, // true: Tolerate using the `__proto__` property
"scripturl" : false, // true: Tolerate script-targeted URLs
"smarttabs" : false, // true: Tolerate mixed tabs/spaces when used for alignment
"shadow" : false, // true: Allows re-define variables later in code e.g. `var x=1; x=2;`
"sub" : false, // true: Tolerate using `[]` notation when it can still be expressed in dot notation
"supernew" : false, // true: Tolerate `new function () { ... };` and `new Object;`
"validthis" : false, // true: Tolerate using this in a non-constructor function
"globals": {
"app": true,
"io": true,
"socket": true,
"ajaxify": true,
"config": true,
"utils": true,
"overrides": true,
"componentHandler": true,
"bootbox": true,
"templates": true,
"Visibility": true,
"Tinycon": true,
"require": true,
"define": true,
"ace": true,
"Sortable": true,
"Slideout": true,
"NProgress": true
},
"jquery": true,
"browser": true
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 215 KiB

View File

@@ -3,7 +3,7 @@
The files here are read-only and overwritten daily (if there are changes) by the The files here are read-only and overwritten daily (if there are changes) by the
helper bot [Misty](https://github.com/nodebb-misty). helper bot [Misty](https://github.com/nodebb-misty).
Our localisation efforts are handled via [our Transifex Project](https://explore.transifex.com/nodebb/nodebb/), Our localisation efforts are handled via [our Transifex Project](https://www.transifex.com/nodebb/nodebb/),
and any pull requests made to this directory will be automatically closed because and any pull requests made to this directory will be automatically closed because
localisations can go out-of-sync when edited directly. localisations can go out-of-sync when edited directly.

View File

@@ -1,3 +0,0 @@
# The files here are not meant to be edited directly
Please see the &rarr; [Internalization README](../README.md).

View File

@@ -3,9 +3,5 @@
"alert.confirm-restart": "هل تريد بالتأكيد إعادة تشغيل NodeBB؟", "alert.confirm-restart": "هل تريد بالتأكيد إعادة تشغيل NodeBB؟",
"acp-title": "لوحة تحكم إدارة NodeBB | %1", "acp-title": "لوحة تحكم إدارة NodeBB | %1",
"settings-header-contents": "محتويات", "settings-header-contents": "محتويات"
"changes-saved": "Changes Saved",
"changes-saved-message": "Your changes to the NodeBB configuration have been saved.",
"changes-not-saved": "Changes Not Saved",
"changes-not-saved-message": "NodeBB encountered a problem saving your changes. (%1)"
} }

View File

@@ -3,7 +3,6 @@
"no-events": "لا توجد أحداث", "no-events": "لا توجد أحداث",
"control-panel": "لوحة تحكم الأحداث", "control-panel": "لوحة تحكم الأحداث",
"delete-events": "حذف الاحداث", "delete-events": "حذف الاحداث",
"confirm-delete-all-events": "Are you sure you want to delete all logged events?",
"filters": "تصفية", "filters": "تصفية",
"filters-apply": "تطبيق التصفية", "filters-apply": "تطبيق التصفية",
"filter-type": "نوع الحدث", "filter-type": "نوع الحدث",

View File

@@ -56,8 +56,8 @@
"active-users.total": "المجموع", "active-users.total": "المجموع",
"active-users.connections": "Connections", "active-users.connections": "Connections",
"guest-registered-users": "Guest vs Registered Users", "anonymous-registered-users": "المجهولين مقابل المستخدمين المسجلين",
"guest": "Guest", "anonymous": "مجهول",
"registered": "مسجل", "registered": "مسجل",
"user-presence": "تواجد المستخدمين", "user-presence": "تواجد المستخدمين",
@@ -68,7 +68,6 @@
"unread": "غير مقروء", "unread": "غير مقروء",
"high-presence-topics": "مواضيع ذات حضور قوي", "high-presence-topics": "مواضيع ذات حضور قوي",
"popular-searches": "Popular Searches",
"graphs.page-views": "مشاهدات الصفحة", "graphs.page-views": "مشاهدات الصفحة",
"graphs.page-views-registered": "Page Views Registered", "graphs.page-views-registered": "Page Views Registered",
@@ -76,14 +75,13 @@
"graphs.page-views-bot": "Page Views Bot", "graphs.page-views-bot": "Page Views Bot",
"graphs.unique-visitors": "زوار فريدين", "graphs.unique-visitors": "زوار فريدين",
"graphs.registered-users": "مستخدمين مسجلين", "graphs.registered-users": "مستخدمين مسجلين",
"graphs.guest-users": "Guest 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", "back-to-dashboard": "Back to Dashboard",
"details.no-users": "No users have joined within the selected timeframe", "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-topics": "No topics have been posted within the selected timeframe",
"details.no-searches": "No searches have been made yet",
"details.no-logins": "No logins have been recorded 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", "details.logins-static": "NodeBB only saves session data for %1 days, and so this table below will only show the most recently active sessions",
"details.logins-login-time": "Login Time" "details.logins-login-time": "Login Time"

View File

@@ -8,11 +8,7 @@
"nodejs": "nodejs", "nodejs": "nodejs",
"online": "online", "online": "online",
"git": "git", "git": "git",
"process-memory": "process memory", "memory": "memory",
"system-memory": "system memory",
"used-memory-process": "Used memory by process",
"used-memory-os": "Used system memory",
"total-memory-os": "Total system memory",
"load": "system load", "load": "system load",
"cpu-usage": "cpu usage", "cpu-usage": "cpu usage",
"uptime": "uptime", "uptime": "uptime",

View File

@@ -8,6 +8,8 @@
"delete": "Delete", "delete": "Delete",
"enable": "Enable", "enable": "Enable",
"disable": "Disable", "disable": "Disable",
"control-panel": "Rewards Control",
"new-reward": "New Reward",
"alert.delete-success": "Successfully deleted reward", "alert.delete-success": "Successfully deleted reward",
"alert.no-inputs-found": "Illegal reward - no inputs found!", "alert.no-inputs-found": "Illegal reward - no inputs found!",

View File

@@ -0,0 +1,79 @@
{
"forum-traffic": "Forum Traffic",
"page-views": "مشاهدات الصفحات",
"unique-visitors": "زائرين فريدين",
"new-users": "New Users",
"posts": "مشاركات",
"topics": "مواضيع",
"page-views-seven": "آخر 7 ايام",
"page-views-thirty": "آخر 30 يوماً",
"page-views-last-day": "آخر 24 ساعة",
"page-views-custom": "مدة زمنية مخصصة",
"page-views-custom-start": "بداية المدة",
"page-views-custom-end": "نهاية المده",
"page-views-custom-help": "أدخل نطاقا زمنيا لمرات مشاهدة الصفحات التي ترغب في عرضها. إذا لم يظهر منتقي التاريخ، فإن التنسيق المقبول هو <code>YYYY-MM-DD</code>",
"page-views-custom-error": "الرجاء إدخال نطاق تاريخ صالح بالتنسيق <code>YYYY-MM-DD</code>",
"stats.yesterday": "Yesterday",
"stats.today": "Today",
"stats.last-week": "Last Week",
"stats.this-week": "This Week",
"stats.last-month": "Last Month",
"stats.this-month": "This Month",
"stats.all": "كل الوقت",
"updates": "تحديثات",
"running-version": "المنتدى يعمل حاليا على <strong>NodeBB الإصدار<span id=\"version\">%1</span></strong>.",
"keep-updated": "تأكد دائما من أن NodeBB يعمل على احدث إصدار للحصول على أحدث التصحيحات الأمنية وإصلاحات الأخطاء.",
"up-to-date": "<p>المنتدى <strong>يعمل على أحدث إصدار</strong> <i class=\"fa fa-check\"></i></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-warning": "<p>هذه نسخة <strong>ماقبل الإصدار</strong> من NodeBB. قد تحدث أخطاء غير مقصودة. <i class=\"fa fa-exclamation-triangle\"></i></p>",
"running-in-development": "المنتدى قيد التشغيل في وضع \"المطورين\". وقد تكون هناك ثغرات أمنية مفتوحة؛ من فضلك تواصل مع مسؤول نظامك.",
"latest-lookup-failed": "<p>Failed to look up latest available version of NodeBB</p>",
"notices": "إشعارات",
"restart-not-required": "إعادة التشغيل غير مطلوب",
"restart-required": "إعادة التشغيل مطلوبة",
"search-plugin-installed": "إضافة البحث منصبة",
"search-plugin-not-installed": "إضافة البحث غير منصبة",
"search-plugin-tooltip": "نصب إضافة البحث من صفحة الإضافات البرمجية لتنشيط وظيفة البحث",
"control-panel": "التحكم بالنظام",
"rebuild-and-restart": "Rebuild &amp; Restart",
"restart": "Restart",
"restart-warning": "Rebuilding or Restarting your NodeBB will drop all existing connections for a few seconds.",
"restart-disabled": "Rebuilding and Restarting your NodeBB has been disabled as you do not seem to be running it via the appropriate daemon.",
"maintenance-mode": "وضع الصيانة",
"maintenance-mode-title": "انقر هنا لإعداد وضع الصيانة لـNodeBB",
"realtime-chart-updates": "التحديث الفوري للرسم البياني",
"active-users": "المستخدمين النشطين",
"active-users.users": "الأعضاء",
"active-users.guests": "الزوار",
"active-users.total": "المجموع",
"active-users.connections": "Connections",
"anonymous-registered-users": "المجهولين مقابل المستخدمين المسجلين",
"anonymous": "مجهول",
"registered": "مسجل",
"user-presence": "تواجد المستخدمين",
"on-categories": "في قائمة الأقسام",
"reading-posts": "قراءة المشاركات",
"browsing-topics": "تصفح المواضيع",
"recent": "الأخيرة",
"unread": "غير مقروء",
"high-presence-topics": "مواضيع ذات حضور قوي",
"graphs.page-views": "مشاهدات الصفحة",
"graphs.page-views-registered": "Page Views Registered",
"graphs.page-views-guest": "Page Views Guest",
"graphs.page-views-bot": "Page Views Bot",
"graphs.unique-visitors": "زوار فريدين",
"graphs.registered-users": "مستخدمين مسجلين",
"graphs.anonymous-users": "مستخدمين مجهولين",
"last-restarted-by": "Last restarted by",
"no-users-browsing": "No users browsing"
}

View File

@@ -0,0 +1,6 @@
{
"language-settings": "اعدادات اللغة",
"description": "تُحدد اللغة الافتراضية إعدادات اللغة لجميع المستخدمين الذين يزورون المنتدى. <br />يمكن للأعضاء تجاوز اللغة الافتراضية من خلال صفحة إعدادات الحساب الخاصة بهم.",
"default-language": "اللغة الافتراضية",
"auto-detect": "الكشف عن إعدادات اللغة للزوار بشكل آلي"
}

View File

@@ -11,8 +11,6 @@
"properties": "Properties:", "properties": "Properties:",
"groups": "Groups:", "groups": "Groups:",
"open-new-window": "Open in a new window", "open-new-window": "Open in a new window",
"dropdown": "Dropdown",
"dropdown-placeholder": "Place your dropdown menu items below, ie: <br/>&lt;li&gt;&lt;a href&#x3D;&quot;https://myforum.com&quot;&gt;Link 1&lt;/a&gt;&lt;/li&gt;",
"btn.delete": "Delete", "btn.delete": "Delete",
"btn.disable": "Disable", "btn.disable": "Disable",

View File

@@ -0,0 +1,9 @@
{
"notifications": "التنبيهات",
"chat-messages": "Chat Messages",
"play-sound": "Play",
"incoming-message": "Incoming Message",
"outgoing-message": "Outgoing Message",
"upload-new-sound": "Upload New Sound",
"saved": "Settings Saved"
}

View File

@@ -1,10 +1,8 @@
{ {
"administrators": "Administrators", "administrators": "Administrators",
"global-moderators": "Global Moderators", "global-moderators": "Global Moderators",
"moderators": "Moderators",
"no-global-moderators": "No Global Moderators", "no-global-moderators": "No Global Moderators",
"no-sub-categories": "No subcategories", "moderators-of-category": "%1 Moderators",
"subcategories": "%1 subcategories",
"no-moderators": "No Moderators", "no-moderators": "No Moderators",
"add-administrator": "Add Administrator", "add-administrator": "Add Administrator",
"add-global-moderator": "Add Global Moderator", "add-global-moderator": "Add Global Moderator",

View File

@@ -13,7 +13,6 @@
"resent-single": "Manual digest resend completed", "resent-single": "Manual digest resend completed",
"resent-day": "Daily digest resent", "resent-day": "Daily digest resent",
"resent-week": "Weekly digest resent", "resent-week": "Weekly digest resent",
"resent-biweek": "Bi-Weekly digest resent",
"resent-month": "Monthly digest resent", "resent-month": "Monthly digest resent",
"null": "<em>Never</em>", "null": "<em>Never</em>",
"manual-run": "Manual digest run:", "manual-run": "Manual digest run:",

View File

@@ -10,7 +10,6 @@
"upload-files": "Upload Files", "upload-files": "Upload Files",
"signature": "Signature", "signature": "Signature",
"ban": "Ban", "ban": "Ban",
"mute": "Mute",
"invite": "Invite", "invite": "Invite",
"search-content": "Search Content", "search-content": "Search Content",
"search-users": "Search Users", "search-users": "Search Users",
@@ -52,13 +51,10 @@
"alert.saved": "Privilege changes saved and applied", "alert.saved": "Privilege changes saved and applied",
"alert.confirm-discard": "Are you sure you wish to discard your privilege changes?", "alert.confirm-discard": "Are you sure you wish to discard your privilege changes?",
"alert.discarded": "Privilege changes discarded", "alert.discarded": "Privilege changes discarded",
"alert.confirm-copyToAll": "Are you sure you wish to apply this set of <strong>%1</strong> to <strong>all categories</strong>?", "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 set of <strong>%1</strong> 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 set of <strong>%1</strong> to <strong>all descendant (child) 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 set of <strong>%1</strong> 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.no-undo": "<em>This action cannot be undone.</em>",
"alert.admin-warning": "Administrators implicitly get all privileges", "alert.admin-warning": "Administrators implicitly get all privileges"
"alert.copyPrivilegesFrom-title": "Select a category to copy from",
"alert.copyPrivilegesFrom-warning": "This will copy <strong>%1</strong> from the selected category.",
"alert.copyPrivilegesFromGroup-warning": "This will copy this group's set of <strong>%1</strong> from the selected category."
} }

View File

@@ -5,7 +5,5 @@
"orphaned": "Orphaned", "orphaned": "Orphaned",
"size/filecount": "Size / Filecount", "size/filecount": "Size / Filecount",
"confirm-delete": "Do you really want to delete this file?", "confirm-delete": "Do you really want to delete this file?",
"filecount": "%1 files", "filecount": "%1 files"
"new-folder": "New Folder",
"name-new-folder": "Enter a name for new the folder"
} }

View File

@@ -18,8 +18,7 @@
"download-csv": "Download CSV", "download-csv": "Download CSV",
"manage-groups": "Manage Groups", "manage-groups": "Manage Groups",
"add-group": "Add Group", "add-group": "Add Group",
"create": "Create User", "invite": "Invite",
"invite": "Invite by Email",
"new": "New User", "new": "New User",
"filter-by": "Filter by", "filter-by": "Filter by",
"pills.unvalidated": "Not Validated", "pills.unvalidated": "Not Validated",
@@ -48,7 +47,6 @@
"users.uid": "uid", "users.uid": "uid",
"users.username": "username", "users.username": "username",
"users.email": "email", "users.email": "email",
"users.no-email": "(no email)",
"users.ip": "IP", "users.ip": "IP",
"users.postcount": "postcount", "users.postcount": "postcount",
"users.reputation": "reputation", "users.reputation": "reputation",
@@ -63,7 +61,7 @@
"create.password": "Password", "create.password": "Password",
"create.password-confirm": "Confirm Password", "create.password-confirm": "Confirm Password",
"temp-ban.length": "Length", "temp-ban.length": "Ban Length",
"temp-ban.reason": "Reason <span class=\"text-muted\">(Optional)</span>", "temp-ban.reason": "Reason <span class=\"text-muted\">(Optional)</span>",
"temp-ban.hours": "Hours", "temp-ban.hours": "Hours",
"temp-ban.days": "Days", "temp-ban.days": "Days",
@@ -91,7 +89,6 @@
"alerts.validate-email-success": "Emails validated", "alerts.validate-email-success": "Emails validated",
"alerts.validate-force-password-reset-success": "User(s) passwords have been reset and their existing sessions have been revoked.", "alerts.validate-force-password-reset-success": "User(s) passwords have been reset and their existing sessions have been revoked.",
"alerts.password-reset-confirm": "Do you want to send password reset email(s) to these user(s)?", "alerts.password-reset-confirm": "Do you want to send password reset email(s) to these user(s)?",
"alerts.password-reset-email-sent": "Password reset email sent.",
"alerts.confirm-delete": "<strong>Warning!</strong><p>Do you really want to delete <strong>user(s)</strong>?</p><p>This action is not reversible! Only the user account will be deleted, their posts and topics will remain.</p>", "alerts.confirm-delete": "<strong>Warning!</strong><p>Do you really want to delete <strong>user(s)</strong>?</p><p>This action is not reversible! Only the user account will be deleted, their posts and topics will remain.</p>",
"alerts.delete-success": "User(s) Deleted!", "alerts.delete-success": "User(s) Deleted!",
"alerts.confirm-delete-content": "<strong>Warning!</strong><p>Do you really want to delete these user(s) <strong>content</strong>?</p><p>This action is not reversible! The users' accounts will remain, but their posts and topics will be deleted.</p>", "alerts.confirm-delete-content": "<strong>Warning!</strong><p>Do you really want to delete these user(s) <strong>content</strong>?</p><p>This action is not reversible! The users' accounts will remain, but their posts and topics will be deleted.</p>",

View File

@@ -4,7 +4,6 @@
"dashboard/logins": "Logins", "dashboard/logins": "Logins",
"dashboard/users": "Users", "dashboard/users": "Users",
"dashboard/topics": "Topics", "dashboard/topics": "Topics",
"dashboard/searches": "Searches",
"section-general": "عام", "section-general": "عام",
"section-manage": "إدارة", "section-manage": "إدارة",
@@ -76,7 +75,7 @@
"logout": "Log out", "logout": "Log out",
"view-forum": "View Forum", "view-forum": "View Forum",
"search.placeholder": "Search settings", "search.placeholder": "Press &quot;/&quot; to search for settings",
"search.no-results": "No results...", "search.no-results": "No results...",
"search.search-forum": "Search the forum for <strong></strong>", "search.search-forum": "Search the forum for <strong></strong>",
"search.keep-typing": "Type more to see results...", "search.keep-typing": "Type more to see results...",

View File

@@ -15,10 +15,6 @@
"headers.acac": "Access-Control-Allow-Credentials", "headers.acac": "Access-Control-Allow-Credentials",
"headers.acam": "Access-Control-Allow-Methods", "headers.acam": "Access-Control-Allow-Methods",
"headers.acah": "Access-Control-Allow-Headers", "headers.acah": "Access-Control-Allow-Headers",
"headers.coep": "Cross-Origin-Embedder-Policy",
"headers.coep-help": "When enabled (default), will set the header to <code>require-corp</code>",
"headers.coop": "Cross-Origin-Opener-Policy",
"headers.corp": "Cross-Origin-Resource-Policy",
"hsts": "Strict Transport Security", "hsts": "Strict Transport Security",
"hsts.enabled": "Enabled HSTS (recommended)", "hsts.enabled": "Enabled HSTS (recommended)",
"hsts.maxAge": "HSTS Max Age", "hsts.maxAge": "HSTS Max Age",

View File

@@ -6,14 +6,13 @@
"from-help": "The from name to display in the email.", "from-help": "The from name to display in the email.",
"smtp-transport": "SMTP Transport", "smtp-transport": "SMTP Transport",
"smtp-transport.enabled": "Enable SMTP Transport", "smtp-transport.enabled": "Use an external email server to send emails",
"smtp-transport-help": "You can select from a list of well-known services or enter a custom one.", "smtp-transport-help": "You can select from a list of well-known services or enter a custom one.",
"smtp-transport.service": "Select a service", "smtp-transport.service": "Select a service",
"smtp-transport.service-custom": "Custom Service", "smtp-transport.service-custom": "Custom Service",
"smtp-transport.service-help": "Select a service name above in order to use the known information about it. Alternatively, select &quot;Custom Service&quot; and enter the details below.", "smtp-transport.service-help": "Select a service name above in order to use the known information about it. Alternatively, select 'Custom Service' and enter the details below.",
"smtp-transport.gmail-warning1": "If you are using GMail as your email provider, you will have to generate an &quot;App Password&quot; in order for NodeBB to authenticate successfully. You can generate one at the <a href=\"https://myaccount.google.com/apppasswords\">App Passwords <i class=\"fa fa-external-link\"></i></a> page.", "smtp-transport.gmail-warning1": "There have been reports of the Gmail service not working on accounts with heightened security. In those scenarios, you will have to <a href=\"https://www.google.com/settings/security/lesssecureapps\">configure your GMail account to allow less secure apps</a>.",
"smtp-transport.gmail-warning2": "For more information about this workaround, <a href=\"https://nodemailer.com/usage/using-gmail/\">please consult this NodeMailer article <i class=\"fa fa-external-link\"></i></a> on the issue. An alternative would be to utilise a third-party emailer plugin such as SendGrid, Mailgun, etc. <a href=\"../extend/plugins\">Browse available plugins here</a>.", "smtp-transport.gmail-warning2": "For more information about this workaround, <a href=\"https://nodemailer.com/usage/using-gmail/\">please consult this NodeMailer article on the issue.</a> An alternative would be to utilise a third-party emailer plugin such as SendGrid, Mailgun, etc. <a href=\"../extend/plugins\">Browse available plugins here</a>.",
"smtp-transport.auto-enable-toast": "It looks like you&apos;re configuring an SMTP transport. We enabled the \"SMTP Transport\" option for you.",
"smtp-transport.host": "SMTP Host", "smtp-transport.host": "SMTP Host",
"smtp-transport.port": "SMTP Port", "smtp-transport.port": "SMTP Port",
"smtp-transport.security": "Connection security", "smtp-transport.security": "Connection security",
@@ -37,13 +36,6 @@
"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>",
"notifications.remove-images": "Remove images from email notifications", "notifications.settings": "Email notification settings",
"require-email-address": "Require new users to specify an email address", "notifications.remove-images": "Remove images from email notifications"
"require-email-address-warning": "By default, users can opt-out of entering an email address by leaving the field blank. Enabling this option means they have to enter an email address in order to proceed with registration. <strong>It does not ensure user will enter a real email address, nor even an address they own.</strong>",
"send-validation-email": "Send validation emails when an email is added or changed",
"include-unverified-emails": "Send emails to recipients who have not explicitly confirmed their emails",
"include-unverified-warning": "By default, users with emails associated with their account have already been verified, but there are situations where this is not the case (e.g. SSO logins, grandfathered users, etc). <strong>Enable this setting at your own risk</strong> &ndash; sending emails to unverified addresses may be a violation of regional anti-spam laws.",
"prompt": "Prompt users to enter or confirm their emails",
"prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen.",
"sendEmailToBanned": "Send emails to users even if they have been banned"
} }

View File

@@ -3,9 +3,9 @@
"title": "عنوان الموقع", "title": "عنوان الموقع",
"title.short": "عنوان قصير", "title.short": "عنوان قصير",
"title.short-placeholder": "ان لم تقم بكتابة عنوان مختصر, سيتم استخدام عنوان الموقع الكلي", "title.short-placeholder": "ان لم تقم بكتابة عنوان مختصر, سيتم استخدام عنوان الموقع الكلي",
"title.url": "Title Link URL", "title.url": "الرابط",
"title.url-placeholder": "The URL of the site title", "title.url-placeholder": "The URL of the site title",
"title.url-help": "When the title is clicked, send users to this address. If left blank, user will be sent to the forum index. <br> Note: This is not the external URL used in emails, etc. That is set by the <code>url</code> property in config.json", "title.url-help": "When the title is clicked, send users to this address. If left blank, user will be sent to the forum index.",
"title.name": "اسم المنتدي", "title.name": "اسم المنتدي",
"title.show-in-header": "Show Site Title in Header", "title.show-in-header": "Show Site Title in Header",
"browser-title": "عنوان المتصفح", "browser-title": "عنوان المتصفح",
@@ -20,9 +20,9 @@
"logo.image": "صورة", "logo.image": "صورة",
"logo.image-placeholder": "Path to a logo to display on forum header", "logo.image-placeholder": "Path to a logo to display on forum header",
"logo.upload": "رفع", "logo.upload": "رفع",
"logo.url": "Logo Link URL", "logo.url": "الرابط",
"logo.url-placeholder": "The URL of the site logo", "logo.url-placeholder": "The URL of the site logo",
"logo.url-help": "When the logo is clicked, send users to this address. If left blank, user will be sent to the forum index. <br> Note: This is not the external URL used in emails, etc. That is set by the <code>url</code> property in config.json", "logo.url-help": "When the logo is clicked, send users to this address. If left blank, user will be sent to the forum index.",
"logo.alt-text": "نص بديل", "logo.alt-text": "نص بديل",
"log.alt-text-placeholder": "Alternative text for accessibility", "log.alt-text-placeholder": "Alternative text for accessibility",
"favicon": "صورة المفضله", "favicon": "صورة المفضله",
@@ -35,10 +35,7 @@
"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.", "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.",
"outgoing-links": "Outgoing Links", "outgoing-links": "Outgoing Links",
"outgoing-links.warning-page": "Use Outgoing Links Warning Page", "outgoing-links.warning-page": "Use Outgoing Links Warning Page",
"search": "Search", "search-default-sort-by": "الترتيب الافتراضي للبحث",
"search-default-in": "Search In",
"search-default-in-quick": "Quick Search In",
"search-default-sort-by": "Sort by",
"outgoing-links.whitelist": "Domains to whitelist for bypassing the warning page", "outgoing-links.whitelist": "Domains to whitelist for bypassing the warning page",
"site-colors": "Site Color Metadata", "site-colors": "Site Color Metadata",
"theme-color": "لون الثيم", "theme-color": "لون الثيم",

View File

@@ -11,8 +11,6 @@
"properties": "Properties:", "properties": "Properties:",
"groups": "Groups:", "groups": "Groups:",
"open-new-window": "Open in a new window", "open-new-window": "Open in a new window",
"dropdown": "Dropdown",
"dropdown-placeholder": "Place your dropdown menu items below, ie: <br/>&lt;li&gt;&lt;a href&#x3D;&quot;https://myforum.com&quot;&gt;Link 1&lt;/a&gt;&lt;/li&gt;",
"btn.delete": "Delete", "btn.delete": "Delete",
"btn.disable": "Disable", "btn.disable": "Disable",

View File

@@ -2,6 +2,5 @@
"notifications": "Notifications", "notifications": "Notifications",
"welcome-notification": "Welcome Notification", "welcome-notification": "Welcome Notification",
"welcome-notification-link": "Welcome Notification Link", "welcome-notification-link": "Welcome Notification Link",
"welcome-notification-uid": "Welcome Notification User (UID)", "welcome-notification-uid": "Welcome Notification User (UID)"
"post-queue-notification-uid": "Post Queue User (UID)"
} }

View File

@@ -40,7 +40,6 @@
"teaser.last-post": "Last &ndash; Show the latest post, including the original post, if no replies", "teaser.last-post": "Last &ndash; Show the latest post, including the original post, if no replies",
"teaser.last-reply": "Last &ndash; Show the latest reply, or a \"No replies\" placeholder if no replies", "teaser.last-reply": "Last &ndash; Show the latest reply, or a \"No replies\" placeholder if no replies",
"teaser.first": "First", "teaser.first": "First",
"showPostPreviewsOnHover": "Show a preview of posts when mouse overed",
"unread": "Unread Settings", "unread": "Unread Settings",
"unread.cutoff": "Unread cutoff days", "unread.cutoff": "Unread cutoff days",
"unread.min-track-last": "Minimum posts in topic before tracking last read", "unread.min-track-last": "Minimum posts in topic before tracking last read",
@@ -57,9 +56,6 @@
"composer.show-help": "Show \"Help\" tab", "composer.show-help": "Show \"Help\" tab",
"composer.enable-plugin-help": "Allow plugins to add content to the help tab", "composer.enable-plugin-help": "Allow plugins to add content to the help tab",
"composer.custom-help": "Custom Help Text", "composer.custom-help": "Custom Help Text",
"backlinks": "Backlinks",
"backlinks.enabled": "Enable topic backlinks",
"backlinks.help": "If a post references another topic, a link back to the post will be inserted into the referenced topic at that point in time.",
"ip-tracking": "IP Tracking", "ip-tracking": "IP Tracking",
"ip-tracking.each-post": "Track IP Address for each post", "ip-tracking.each-post": "Track IP Address for each post",
"enable-post-history": "Enable Post History" "enable-post-history": "Enable Post History"

View File

@@ -4,13 +4,9 @@
"disable-down-voting": "Disable Down Voting", "disable-down-voting": "Disable Down Voting",
"votes-are-public": "All Votes Are Public", "votes-are-public": "All Votes Are Public",
"thresholds": "Activity Thresholds", "thresholds": "Activity Thresholds",
"min-rep-upvote": "Minimum reputation to upvote posts",
"upvotes-per-day": "Upvotes per day (set to 0 for unlimited upvotes)",
"upvotes-per-user-per-day": "Upvotes per user per day (set to 0 for unlimited upvotes)",
"min-rep-downvote": "Minimum reputation to downvote posts", "min-rep-downvote": "Minimum reputation to downvote posts",
"downvotes-per-day": "Downvotes per day (set to 0 for unlimited downvotes)", "downvotes-per-day": "Downvotes per day (set to 0 for unlimited downvotes)",
"downvotes-per-user-per-day": "Downvotes per user per day (set to 0 for unlimited downvotes)", "downvotes-per-user-per-day": "Downvotes per user per day (set to 0 for unlimited downvotes)",
"min-rep-chat": "Minimum reputation to send chat messages",
"min-rep-flag": "Minimum reputation to flag posts", "min-rep-flag": "Minimum reputation to flag posts",
"min-rep-website": "Minimum reputation to add \"Website\" to user profile", "min-rep-website": "Minimum reputation to add \"Website\" to user profile",
"min-rep-aboutme": "Minimum reputation to add \"About me\" to user profile", "min-rep-aboutme": "Minimum reputation to add \"About me\" to user profile",
@@ -22,6 +18,5 @@
"flags.limit-per-target": "Maximum number of times something can be flagged", "flags.limit-per-target": "Maximum number of times something can be flagged",
"flags.limit-per-target-placeholder": "Default: 0", "flags.limit-per-target-placeholder": "Default: 0",
"flags.limit-per-target-help": "When a post or user is flagged multiple times, each additional flag is considered a &quot;report&quot; 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.limit-per-target-help": "When a post or user is flagged multiple times, each additional flag is considered a &quot;report&quot; 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-flag-on-downvote-threshold": "Number of downvotes to auto flag posts (Set to 0 to disable, default: 0)",
"flags.auto-resolve-on-ban": "Automatically resolve all of a user's tickets when they are banned" "flags.auto-resolve-on-ban": "Automatically resolve all of a user's tickets when they are banned"
} }

View File

@@ -1,11 +1,8 @@
{ {
"posts": "المشاركات", "posts": "المشاركات",
"orphans": "Orphaned Files", "allow-files": "السماح للأعضاء بتحميل الملفات الإعتيادية",
"private": "جعل الملفات التي تم رفعها خاصة", "private": "جعل الملفات التي تم رفعها خاصة",
"strip-exif-data": "Strip EXIF Data", "strip-exif-data": "Strip EXIF Data",
"preserve-orphaned-uploads": "Keep uploaded files on disk after a post is purged",
"orphanExpiryDays": "Days to keep orphaned files",
"orphanExpiryDays-help": "After this many days, orphaned uploads will be deleted from the file system.<br />Set 0 or leave blank to disable.",
"private-extensions": "File extensions to make private", "private-extensions": "File extensions to make private",
"private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. <code>pdf,xls,doc</code>). An empty list means all files are private.", "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. <code>pdf,xls,doc</code>). An empty list means all files are private.",
"resize-image-width-threshold": "Resize images if they are wider than specified width", "resize-image-width-threshold": "Resize images if they are wider than specified width",

View File

@@ -1,10 +1,12 @@
{ {
"authentication": "المصادقة", "authentication": "المصادقة",
"require-email-confirmation": "يطلب تأكيد البريد الإلكتروني",
"email-confirm-interval": "لا يمكن للمستخدم إعادة إرسال رسالة تأكيد البريد الالكتروني حتى مرور", "email-confirm-interval": "لا يمكن للمستخدم إعادة إرسال رسالة تأكيد البريد الالكتروني حتى مرور",
"email-confirm-email2": "دقائق", "email-confirm-email2": "دقائق",
"allow-login-with": "السماح بتسجيل الدخول باستخدام", "allow-login-with": "السماح بتسجيل الدخول باستخدام",
"allow-login-with.username-email": "اسم المستخدم أو البريد الالكتروني", "allow-login-with.username-email": "اسم المستخدم أو البريد الالكتروني",
"allow-login-with.username": "اسم المستخدم فقط", "allow-login-with.username": "اسم المستخدم فقط",
"allow-login-with.email": "البريد الالكتروني فقط",
"account-settings": "إعدادت الحساب", "account-settings": "إعدادت الحساب",
"gdpr_enabled": "Enable GDPR consent collection", "gdpr_enabled": "Enable GDPR consent collection",
"gdpr_enabled_help": "When enabled, all new registrants will be required to explicitly give consent for data collection and usage under the <a href=\"https://ec.europa.eu/info/priorities/justice-and-fundamental-rights/data-protection/2018-reform-eu-data-protection-rules/eu-data-protection-rules_en\">General Data Protection Regulation (GDPR)</a>. <strong>Note</strong>: Enabling GDPR does not force pre-existing users to provide consent. To do so, you will need to install the GDPR plugin.", "gdpr_enabled_help": "When enabled, all new registrants will be required to explicitly give consent for data collection and usage under the <a href=\"https://ec.europa.eu/info/priorities/justice-and-fundamental-rights/data-protection/2018-reform-eu-data-protection-rules/eu-data-protection-rules_en\">General Data Protection Regulation (GDPR)</a>. <strong>Note</strong>: Enabling GDPR does not force pre-existing users to provide consent. To do so, you will need to install the GDPR plugin.",
@@ -69,7 +71,6 @@
"digest-freq.off": "Off", "digest-freq.off": "Off",
"digest-freq.daily": "Daily", "digest-freq.daily": "Daily",
"digest-freq.weekly": "Weekly", "digest-freq.weekly": "Weekly",
"digest-freq.biweekly": "Bi-Weekly",
"digest-freq.monthly": "Monthly", "digest-freq.monthly": "Monthly",
"email-chat-notifs": "Send an email if a new chat message arrives and I am not online", "email-chat-notifs": "Send an email if a new chat message arrives and I am not online",
"email-post-notif": "Send an email when replies are made to topics I am subscribed to", "email-post-notif": "Send an email when replies are made to topics I am subscribed to",

View File

@@ -6,9 +6,7 @@
"greeting_no_name": "مرحبًا", "greeting_no_name": "مرحبًا",
"greeting_with_name": "مرحبًا بك يا %1", "greeting_with_name": "مرحبًا بك يا %1",
"email.verify-your-email.subject": "Please verify your email", "email.verify-your-email.subject": "Please verify your email",
"email.verify.text1": "You've requested that we change or confirm your email address", "email.verify.text1": "Your email address has changed!",
"email.verify.text2": "For security purposes, we only change or confirm the email address on file once its ownership has been confirmed via email. <strong>If you did not request this, no action is required on your part.</strong>",
"email.verify.text3": "Once you confirm this email address, we will replace your current email address with this one (%1).",
"welcome.text1": "شكرًا على تسجيلك في %1!", "welcome.text1": "شكرًا على تسجيلك في %1!",
"welcome.text2": "لتفعيل حسابك، نحتاج إلى التأكد من صحة عنوان البريد الإلكتروني الذي سجلت به.", "welcome.text2": "لتفعيل حسابك، نحتاج إلى التأكد من صحة عنوان البريد الإلكتروني الذي سجلت به.",
"welcome.text3": "تم قبول نتسجيلك ، يمكنك الدخول باتسخدام اسم المستخدم و كلمة المرور.", "welcome.text3": "تم قبول نتسجيلك ، يمكنك الدخول باتسخدام اسم المستخدم و كلمة المرور.",
@@ -48,8 +46,6 @@
"unsub.cta": "انقر هنا لتغيير تلك الإعدادات", "unsub.cta": "انقر هنا لتغيير تلك الإعدادات",
"unsubscribe": "unsubscribe", "unsubscribe": "unsubscribe",
"unsub.success": "You will no longer receive emails from the <strong>%1</strong> mailing list", "unsub.success": "You will no longer receive emails from the <strong>%1</strong> mailing list",
"unsub.failure.title": "Unable to unsubscribe",
"unsub.failure.message": "Unfortunately, we were not able to unsubscribe you from the mailing list, as there was an issue with the link. However, you can alter your email preferences by going to <a href=\"%2\">your user settings</a>.<br /><br />(error: <code>%1</code>)",
"banned.subject": "You have been banned from %1", "banned.subject": "You have been banned from %1",
"banned.text1": "The user %1 has been banned from %2.", "banned.text1": "The user %1 has been banned from %2.",
"banned.text2": "This ban will last until %1.", "banned.text2": "This ban will last until %1.",

View File

@@ -1,8 +1,6 @@
{ {
"invalid-data": "بيانات غير صحيحة", "invalid-data": "بيانات غير صحيحة",
"invalid-json": "Invalid JSON", "invalid-json": "Invalid JSON",
"wrong-parameter-type": "A value of type %3 was expected for property `%1`, but %2 was received instead",
"required-parameters-missing": "Required parameters were missing from this API call: %1",
"not-logged-in": "لم تقم بتسجيل الدخول", "not-logged-in": "لم تقم بتسجيل الدخول",
"account-locked": "تم حظر حسابك مؤقتًا.", "account-locked": "تم حظر حسابك مؤقتًا.",
"search-requires-login": "البحث في المنتدى يتطلب حساب - الرجاء تسجيل الدخول أو التسجيل", "search-requires-login": "البحث في المنتدى يتطلب حساب - الرجاء تسجيل الدخول أو التسجيل",
@@ -11,7 +9,6 @@
"invalid-tid": "موضوع غير متواجد", "invalid-tid": "موضوع غير متواجد",
"invalid-pid": "رد غير موجود", "invalid-pid": "رد غير موجود",
"invalid-uid": "مستخدم غير موجود", "invalid-uid": "مستخدم غير موجود",
"invalid-mid": "Invalid Chat Message ID",
"invalid-date": "A valid date must be provided", "invalid-date": "A valid date must be provided",
"invalid-username": "اسم المستخدم غير مقبول", "invalid-username": "اسم المستخدم غير مقبول",
"invalid-email": "البريد الاكتروني غير مقبول", "invalid-email": "البريد الاكتروني غير مقبول",
@@ -28,18 +25,14 @@
"invalid-event": "Invalid event: %1", "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-path": "Invalid path",
"folder-exists": "Folder exists",
"invalid-pagination-value": "رقم الصفحة غير صحيح ، يجب أن يكون بين %1 و %2 .", "invalid-pagination-value": "رقم الصفحة غير صحيح ، يجب أن يكون بين %1 و %2 .",
"username-taken": "اسم المستخدم مأخوذ", "username-taken": "اسم المستخدم مأخوذ",
"email-taken": "البريد الالكتروني مأخوذ", "email-taken": "البريد الالكتروني مأخوذ",
"email-nochange": "The email entered is the same as the email already on file.",
"email-invited": "Email was already invited", "email-invited": "Email was already invited",
"email-not-confirmed": "Posting in some categories or topics is enabled once your email is confirmed, please click here to send a confirmation 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 may not be able to post in some categories 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.",
"no-email-to-confirm": "Your account does not have an email set. An email is necessary for account recovery, and may be necessary for chatting and posting in some categories. Please click here to enter an email.", "no-email-to-confirm": "هذا المنتدى يستلزم تفعيل بريدك الإلكتروني، انقر هنا من فضلك لإدخاله.",
"user-doesnt-have-email": "User \"%1\" does not have an email set.",
"email-confirm-failed": "لم نستطع تفعيل بريدك الإلكتروني، المرجو المحاولة لاحقًا.", "email-confirm-failed": "لم نستطع تفعيل بريدك الإلكتروني، المرجو المحاولة لاحقًا.",
"confirm-email-already-sent": "لقد تم ارسال بريد التأكيد، الرجاء اﻹنتظار 1% دقائق لإعادة اﻹرسال", "confirm-email-already-sent": "لقد تم ارسال بريد التأكيد، الرجاء اﻹنتظار 1% دقائق لإعادة اﻹرسال",
"sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.",
@@ -61,7 +54,6 @@
"no-group": "مجموعة غير موجودة", "no-group": "مجموعة غير موجودة",
"no-user": "اسم مستخدم غير موجود", "no-user": "اسم مستخدم غير موجود",
"no-teaser": "مقتطف غير موجود", "no-teaser": "مقتطف غير موجود",
"no-flag": "Flag does not exist",
"no-privileges": "لاتملك الصلاحيات اللازمة للقيام بهذه العملية", "no-privileges": "لاتملك الصلاحيات اللازمة للقيام بهذه العملية",
"category-disabled": "قائمة معطلة", "category-disabled": "قائمة معطلة",
"topic-locked": "الموضوع مقفول", "topic-locked": "الموضوع مقفول",
@@ -108,10 +100,6 @@
"already-bookmarked": "You have already bookmarked this post", "already-bookmarked": "You have already bookmarked this post",
"already-unbookmarked": "You have already unbookmarked this post", "already-unbookmarked": "You have already unbookmarked this post",
"cant-ban-other-admins": "لايمكن حظر مدبر نظام آخر.", "cant-ban-other-admins": "لايمكن حظر مدبر نظام آخر.",
"cant-mute-other-admins": "You can't mute other admins!",
"user-muted-for-hours": "You have been muted, you will be able to post in %1 hour(s)",
"user-muted-for-minutes": "You have been muted, you will be able to post in %1 minute(s)",
"cant-make-banned-users-admin": "You can't make banned users admin.",
"cant-remove-last-admin": "رجاءًا ، أضف مدير أخر قبل حذف صلاحيات الإدارة من حسابك.", "cant-remove-last-admin": "رجاءًا ، أضف مدير أخر قبل حذف صلاحيات الإدارة من حسابك.",
"account-deletion-disabled": "Account deletion is disabled", "account-deletion-disabled": "Account deletion is disabled",
"cant-delete-admin": "رجاءًا أزل صلاحيات الإدارة قبل حذف الحساب. ", "cant-delete-admin": "رجاءًا أزل صلاحيات الإدارة قبل حذف الحساب. ",
@@ -149,6 +137,7 @@
"invalid-chat-message": "الرسالة غير صالحة.", "invalid-chat-message": "الرسالة غير صالحة.",
"chat-message-too-long": "Chat messages can not be longer than %1 characters.", "chat-message-too-long": "Chat messages can not be longer than %1 characters.",
"cant-edit-chat-message": "غير مصرح لك بتعديل الرسالة.", "cant-edit-chat-message": "غير مصرح لك بتعديل الرسالة.",
"cant-remove-last-user": "لأيمكنك إزالت اخر مستخدم.",
"cant-delete-chat-message": "غير مصرح لك بحذف الرسالة.", "cant-delete-chat-message": "غير مصرح لك بحذف الرسالة.",
"chat-edit-duration-expired": "You are only allowed to edit chat messages for %1 second(s) after posting", "chat-edit-duration-expired": "You are only allowed to edit chat messages for %1 second(s) after posting",
"chat-delete-duration-expired": "You are only allowed to delete chat messages for %1 second(s) after posting", "chat-delete-duration-expired": "You are only allowed to delete chat messages for %1 second(s) after posting",
@@ -158,23 +147,19 @@
"already-voting-for-this-post": "لقد شاركت بالتصويت ، ألا تذكر؟", "already-voting-for-this-post": "لقد شاركت بالتصويت ، ألا تذكر؟",
"reputation-system-disabled": "نظام السمعة معطل", "reputation-system-disabled": "نظام السمعة معطل",
"downvoting-disabled": "التصويتات السلبية معطلة", "downvoting-disabled": "التصويتات السلبية معطلة",
"not-enough-reputation-to-chat": "You need %1 reputation to chat", "not-enough-reputation-to-downvote": "ليس لديك سمعة تكفي لإضافة صوت سلبي لهذا الموضوع",
"not-enough-reputation-to-upvote": "You need %1 reputation to upvote", "not-enough-reputation-to-flag": "ليس لديك سمعة تكفي للإشعار بموضوع مخل",
"not-enough-reputation-to-downvote": "You need %1 reputation to downvote", "not-enough-reputation-min-rep-website": "You do not have enough reputation to add a website",
"not-enough-reputation-to-flag": "You need %1 reputation to flag this post", "not-enough-reputation-min-rep-aboutme": "You do not have enough reputation to add an about me",
"not-enough-reputation-min-rep-website": "You need %1 reputation to add a website", "not-enough-reputation-min-rep-signature": "You do not have enough reputation to add a signature",
"not-enough-reputation-min-rep-aboutme": "You need %1 reputation to add an about me", "not-enough-reputation-min-rep-profile-picture": "You do not have enough reputation to add a profile picture",
"not-enough-reputation-min-rep-signature": "You need %1 reputation to add a signature", "not-enough-reputation-min-rep-cover-picture": "You do not have enough reputation to add a cover picture",
"not-enough-reputation-min-rep-profile-picture": "You need %1 reputation to add a profile picture",
"not-enough-reputation-min-rep-cover-picture": "You need %1 reputation to add a cover picture",
"post-already-flagged": "You have already flagged this post", "post-already-flagged": "You have already flagged this post",
"user-already-flagged": "You have already flagged this user", "user-already-flagged": "You have already flagged this user",
"post-flagged-too-many-times": "This post has been flagged by others already", "post-flagged-too-many-times": "This post has been flagged by others already",
"user-flagged-too-many-times": "This user has been flagged by others already", "user-flagged-too-many-times": "This user has been flagged by others already",
"cant-flag-privileged": "You are not allowed to flag the profiles or content of privileged users (moderators/global moderators/admins)", "cant-flag-privileged": "You are not allowed to flag the profiles or content of privileged users (moderators/global moderators/admins)",
"self-vote": "You cannot vote on your own post", "self-vote": "You cannot vote on your own post",
"too-many-upvotes-today": "You can only upvote %1 times a day",
"too-many-upvotes-today-user": "You can only upvote a user %1 times a day",
"too-many-downvotes-today": "You can only downvote %1 times a day", "too-many-downvotes-today": "You can only downvote %1 times a day",
"too-many-downvotes-today-user": "You can only downvote a user %1 times a day", "too-many-downvotes-today-user": "You can only downvote a user %1 times a day",
"reload-failed": "المنتدى واجه مشكلة أثناء إعادة التحميل: \"%1\". سيواصل المنتدى خدمة العملاء السابقين لكن يجب عليك إلغاء أي تغيير قمت به قبل إعادة التحميل.", "reload-failed": "المنتدى واجه مشكلة أثناء إعادة التحميل: \"%1\". سيواصل المنتدى خدمة العملاء السابقين لكن يجب عليك إلغاء أي تغيير قمت به قبل إعادة التحميل.",
@@ -205,8 +190,6 @@
"no-connection": "There seems to be a problem with your internet connection", "no-connection": "There seems to be a problem with your internet connection",
"socket-reconnect-failed": "Unable to reach the server at this time. Click here to try again, or try again later", "socket-reconnect-failed": "Unable to reach the server at this time. Click here to try again, or try again later",
"plugin-not-whitelisted": "Unable to install plugin &ndash; only plugins whitelisted by the NodeBB Package Manager can be installed via the ACP", "plugin-not-whitelisted": "Unable to install plugin &ndash; only plugins whitelisted by the NodeBB Package Manager can be installed via the ACP",
"plugins-set-in-configuration": "You are not allowed to change plugin state as they are defined at runtime (config.json, environmental variables or terminal arguments), please modify the configuration instead.",
"theme-not-set-in-configuration": "When defining active plugins in configuration, changing themes requires adding the new theme to the list of active plugins before updating it in the ACP",
"topic-event-unrecognized": "Topic event '%1' unrecognized", "topic-event-unrecognized": "Topic event '%1' unrecognized",
"cant-set-child-as-parent": "Can't set child as parent category", "cant-set-child-as-parent": "Can't set child as parent category",
"cant-set-self-as-parent": "Can't set self as parent category", "cant-set-self-as-parent": "Can't set self as parent category",

View File

@@ -38,7 +38,6 @@
"delete-post": "حذف المشاركة", "delete-post": "حذف المشاركة",
"purge-post": "Purge Post", "purge-post": "Purge Post",
"restore-post": "استرجاع المشاركة", "restore-post": "استرجاع المشاركة",
"delete": "Delete Flag",
"user-view": "مشاهدة الملف الشخصي", "user-view": "مشاهدة الملف الشخصي",
"user-edit": "تعديل الملف الشخصي", "user-edit": "تعديل الملف الشخصي",
@@ -47,10 +46,8 @@
"add-note": "اضافة ملاحظة", "add-note": "اضافة ملاحظة",
"no-notes": "No shared notes.", "no-notes": "No shared notes.",
"delete-note-confirm": "Are you sure you want to delete this flag note?", "delete-note-confirm": "Are you sure you want to delete this flag note?",
"delete-flag-confirm": "Are you sure you want to delete this flag?",
"note-added": "Note Added", "note-added": "Note Added",
"note-deleted": "Note Deleted", "note-deleted": "Note Deleted",
"flag-deleted": "Flag Deleted",
"history": "Account &amp; Flag History", "history": "Account &amp; Flag History",
"no-history": "No flag history.", "no-history": "No flag history.",
@@ -80,10 +77,12 @@
"modal-reason-custom": "Reason for reporting this content...", "modal-reason-custom": "Reason for reporting this content...",
"modal-submit": "Submit Report", "modal-submit": "Submit Report",
"modal-submit-success": "Content has been flagged for moderation.", "modal-submit-success": "Content has been flagged for moderation.",
"modal-submit-confirm": "Confirm Submission",
"modal-submit-confirm-text": "You have a custom reason specified already. Are you sure you wish to submit via quick-report?",
"modal-submit-confirm-text-help": "Submitting a quick report will overwrite any custom reasons defined.",
"bulk-actions": "Bulk Actions", "bulk-actions": "Bulk Actions",
"bulk-resolve": "Resolve Flag(s)", "bulk-resolve": "Resolve Flag(s)",
"bulk-success": "%1 flags updated", "bulk-success": "%1 flags updated",
"flagged-timeago-readable": "Flagged <span class=\"timeago\" title=\"%1\"></span> (%2)", "flagged-timeago-readable": "Flagged <span class=\"timeago\" title=\"%1\"></span> (%2)"
"auto-flagged": "[Auto Flagged] Received %1 downvotes."
} }

View File

@@ -23,7 +23,7 @@
"close": "أغلق", "close": "أغلق",
"pagination": "الصفحات", "pagination": "الصفحات",
"pagination.out_of": "%1 من %2", "pagination.out_of": "%1 من %2",
"pagination.enter_index": "Go to post index", "pagination.enter_index": "أدخل الرقم التسلسلي",
"header.admin": "مدير النظام", "header.admin": "مدير النظام",
"header.categories": "الأقسام", "header.categories": "الأقسام",
"header.recent": "حديث", "header.recent": "حديث",
@@ -56,7 +56,6 @@
"posts": "المشاركات", "posts": "المشاركات",
"x-posts": "%1 posts", "x-posts": "%1 posts",
"best": "الأفضل", "best": "الأفضل",
"controversial": "Controversial",
"votes": "Votes", "votes": "Votes",
"x-votes": "%1 votes", "x-votes": "%1 votes",
"voters": "Voters", "voters": "Voters",
@@ -71,7 +70,6 @@
"firstpost": "First post", "firstpost": "First post",
"read_more": "اقرأ المزيد", "read_more": "اقرأ المزيد",
"more": "المزيد", "more": "المزيد",
"none": "None",
"posted_ago_by_guest": "كتب %1 بواسطة زائر", "posted_ago_by_guest": "كتب %1 بواسطة زائر",
"posted_ago_by": "كتب %1 بواسطة %2", "posted_ago_by": "كتب %1 بواسطة %2",
"posted_ago": "كتب %1", "posted_ago": "كتب %1",

View File

@@ -1,6 +1,7 @@
{ {
"username-email": "اسم المستخدم / البريد الإلكتروني", "username-email": "اسم المستخدم / البريد الإلكتروني",
"username": "اسم المستخدم", "username": "اسم المستخدم",
"email": "البريد الإلكتروني",
"remember_me": "تذكرني؟", "remember_me": "تذكرني؟",
"forgot_password": "نسيت كلمة المرور؟", "forgot_password": "نسيت كلمة المرور؟",
"alternative_logins": "تسجيلات الدخول البديلة", "alternative_logins": "تسجيلات الدخول البديلة",

View File

@@ -1,13 +1,13 @@
{ {
"chat.chatting_with": "Chat with", "chat.chatting_with": "Chat with",
"chat.placeholder": "Type chat message here, drag & drop images, press enter to send", "chat.placeholder": "أكتب رسالة دردشة هنا، اضغط ENTER للإرسال",
"chat.scroll-up-alert": "You are looking at older messages, click here to go to most recent message.", "chat.scroll-up-alert": "You are looking at older messages, click here to go to most recent message.",
"chat.send": "أرسل", "chat.send": "أرسل",
"chat.no_active": "لا يوجد لديك دردشات نشطة.", "chat.no_active": "لا يوجد لديك دردشات نشطة.",
"chat.user_typing": "%1 يكتب رسالة...", "chat.user_typing": "%1 يكتب رسالة...",
"chat.user_has_messaged_you": "%1 أرسل لك رسالة.", "chat.user_has_messaged_you": "%1 أرسل لك رسالة.",
"chat.see_all": "All chats", "chat.see_all": "عرض كل المحادثات",
"chat.mark_all_read": "Mark all read", "chat.mark_all_read": "Mark all chats read",
"chat.no-messages": "المرجو اختيار مرسل إليه لمعاينة تاريخ الدردشات", "chat.no-messages": "المرجو اختيار مرسل إليه لمعاينة تاريخ الدردشات",
"chat.no-users-in-room": "No users in this room", "chat.no-users-in-room": "No users in this room",
"chat.recent-chats": "آخر الدردشات", "chat.recent-chats": "آخر الدردشات",
@@ -54,7 +54,7 @@
"composer.formatting.strikethrough": "Strikethrough", "composer.formatting.strikethrough": "Strikethrough",
"composer.formatting.code": "Code", "composer.formatting.code": "Code",
"composer.formatting.link": "Link", "composer.formatting.link": "Link",
"composer.formatting.picture": "Image Link", "composer.formatting.picture": "Picture",
"composer.upload-picture": "Upload Image", "composer.upload-picture": "Upload Image",
"composer.upload-file": "Upload File", "composer.upload-file": "Upload File",
"composer.zen_mode": "Zen Mode", "composer.zen_mode": "Zen Mode",
@@ -68,8 +68,6 @@
"bootbox.ok": "OK", "bootbox.ok": "OK",
"bootbox.cancel": "إلغاء", "bootbox.cancel": "إلغاء",
"bootbox.confirm": "تأكيد", "bootbox.confirm": "تأكيد",
"bootbox.submit": "Submit",
"bootbox.send": "Send",
"cover.dragging_title": "Cover Photo Positioning", "cover.dragging_title": "Cover Photo Positioning",
"cover.dragging_message": "Drag the cover photo to the desired position and click \"Save\"", "cover.dragging_message": "Drag the cover photo to the desired position and click \"Save\"",
"cover.saved": "Cover photo image and position saved", "cover.saved": "Cover photo image and position saved",

View File

@@ -1,8 +1,8 @@
{ {
"title": "التنبيهات", "title": "التنبيهات",
"no_notifs": "ليس لديك أية تنبيهات جديدة", "no_notifs": "ليس لديك أية تنبيهات جديدة",
"see_all": "All notifications", "see_all": "عرض كل التنبيهات",
"mark_all_read": "Mark all read", "mark_all_read": "اجعل كل التنبيهات مقروءة",
"back_to_home": "عودة إلى %1", "back_to_home": "عودة إلى %1",
"outgoing_link": "رابط خارجي", "outgoing_link": "رابط خارجي",
"outgoing_link_message": "أنت تغادر اﻻن %1", "outgoing_link_message": "أنت تغادر اﻻن %1",
@@ -50,7 +50,6 @@
"users-csv-exported": "Users csv exported, click to download", "users-csv-exported": "Users csv exported, click to download",
"post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.",
"post-queue-rejected": "Your queued post has been rejected.", "post-queue-rejected": "Your queued post has been rejected.",
"post-queue-notify": "Queued post received a notification:<br/>\"%1\"",
"email-confirmed": "تم التحقق من عنوان البريد الإلكتروني", "email-confirmed": "تم التحقق من عنوان البريد الإلكتروني",
"email-confirmed-message": "شكرًا على إثبات صحة عنوان بريدك الإلكتروني. صار حسابك مفعلًا بالكامل.", "email-confirmed-message": "شكرًا على إثبات صحة عنوان بريدك الإلكتروني. صار حسابك مفعلًا بالكامل.",
"email-confirm-error-message": "حدث خطأ أثناء التحقق من عنوان بريدك الإلكتروني. ربما رمز التفعيل خاطئ أو انتهت صلاحيته.", "email-confirm-error-message": "حدث خطأ أثناء التحقق من عنوان بريدك الإلكتروني. ربما رمز التفعيل خاطئ أو انتهت صلاحيته.",

View File

@@ -54,7 +54,6 @@
"account/upvoted": "Posts upvoted by %1", "account/upvoted": "Posts upvoted by %1",
"account/downvoted": "Posts downvoted by %1", "account/downvoted": "Posts downvoted by %1",
"account/best": "Best posts made by %1", "account/best": "Best posts made by %1",
"account/controversial": "Controversial posts made by %1",
"account/blocks": "Blocked users for %1", "account/blocks": "Blocked users for %1",
"account/uploads": "Uploads by %1", "account/uploads": "Uploads by %1",
"account/sessions": "Login Sessions", "account/sessions": "Login Sessions",

View File

@@ -14,18 +14,5 @@
"reply": "Reply", "reply": "Reply",
"topic": "Topic", "topic": "Topic",
"accept": "Accept", "accept": "Accept",
"reject": "Reject", "reject": "Reject"
"remove": "Remove",
"notify": "Notify",
"notify-user": "Notify User",
"confirm-reject": "Do you want to reject this post?",
"bulk-actions": "Bulk Actions",
"accept-all": "Accept All",
"accept-selected": "Accept Selected",
"reject-all": "Reject All",
"reject-all-confirm": "Do you want to reject all posts?",
"reject-selected": "Reject Selected",
"reject-selected-confirm": "Do you want to reject %1 selected posts?",
"bulk-accept-success": "%1 posts accepted",
"bulk-reject-success": "%1 posts rejected"
} }

View File

@@ -20,9 +20,8 @@
"registration-added-to-queue": "تمت إضافتك في قائمة الإنتضار. ستتلقى رسالة إلكترونية عند الموافقة على تسجيلك من قبل الإدارة.", "registration-added-to-queue": "تمت إضافتك في قائمة الإنتضار. ستتلقى رسالة إلكترونية عند الموافقة على تسجيلك من قبل الإدارة.",
"registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.",
"registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.",
"interstitial.intro": "We'd like some additional information in order to update your account&hellip;", "interstitial.intro": "نحتاج إلى بعض المعلومات الإضافية قبل أن نتمكن من إنشاء حسابك.",
"interstitial.intro-new": "We'd like some additional information before we can create your account&hellip;", "interstitial.errors-found": "تعذر علينا إتمام عملية التسجيل:",
"interstitial.errors-found": "Please review the entered information:",
"gdpr_agree_data": "I consent to the collection and processing of my personal information on this website.", "gdpr_agree_data": "I consent to the collection and processing of my personal information on this website.",
"gdpr_agree_email": "I consent to receive digest and notification emails from this website.", "gdpr_agree_email": "I consent to receive digest and notification emails from this website.",
"gdpr_consent_denied": "You must give consent to this site to collect/process your information, and to send you emails.", "gdpr_consent_denied": "You must give consent to this site to collect/process your information, and to send you emails.",

View File

@@ -1,4 +0,0 @@
{
"title": "Top",
"no_top_topics": "No top topics"
}

View File

@@ -20,8 +20,6 @@
"login-to-view": "🔒 Log in to view", "login-to-view": "🔒 Log in to view",
"edit": "تعديل", "edit": "تعديل",
"delete": "حذف", "delete": "حذف",
"delete-event": "Delete Event",
"delete-event-confirm": "Are you sure you want to delete this event?",
"purge": "تطهير", "purge": "تطهير",
"restore": "استعادة", "restore": "استعادة",
"move": "نقل", "move": "نقل",
@@ -45,10 +43,7 @@
"unpinned-by": "Unpinned by", "unpinned-by": "Unpinned by",
"deleted-by": "Deleted by", "deleted-by": "Deleted by",
"restored-by": "Restored by", "restored-by": "Restored by",
"moved-from-by": "Moved from %1 by",
"queued-by": "Post queued for approval &rarr;", "queued-by": "Post queued for approval &rarr;",
"backlink": "Referenced by",
"forked-by": "Forked by",
"bookmark_instructions": "اضغط هنا للعودة لأخر مشاركة مقروءة في الموضوع", "bookmark_instructions": "اضغط هنا للعودة لأخر مشاركة مقروءة في الموضوع",
"flag-post": "Flag this post", "flag-post": "Flag this post",
"flag-user": "Flag this user", "flag-user": "Flag this user",
@@ -113,7 +108,6 @@
"bookmark": "Bookmark", "bookmark": "Bookmark",
"bookmarks": "Bookmarks", "bookmarks": "Bookmarks",
"bookmarks.has_no_bookmarks": "You haven't bookmarked any posts yet.", "bookmarks.has_no_bookmarks": "You haven't bookmarked any posts yet.",
"copy-permalink": "Copy Permalink",
"loading_more_posts": "تحميل المزيد من المشاركات", "loading_more_posts": "تحميل المزيد من المشاركات",
"move_topic": "نقل الموضوع", "move_topic": "نقل الموضوع",
"move_topics": "نقل المواضيع", "move_topics": "نقل المواضيع",
@@ -141,7 +135,6 @@
"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.additional-options": "Additional Options",
"composer.schedule": "Schedule", "composer.schedule": "Schedule",
"composer.replying_to": "الرد على %1", "composer.replying_to": "الرد على %1",
"composer.new_topic": "موضوع جديد", "composer.new_topic": "موضوع جديد",
@@ -162,7 +155,6 @@
"newest_to_oldest": "من الأحدث إلى الأقدم", "newest_to_oldest": "من الأحدث إلى الأقدم",
"most_votes": "Most Votes", "most_votes": "Most Votes",
"most_posts": "Most Posts", "most_posts": "Most Posts",
"most_views": "Most Views",
"stale.title": "Create new topic instead?", "stale.title": "Create new topic instead?",
"stale.warning": "The topic you are replying to is quite old. Would you like to create a new topic instead, and reference this one in your reply?", "stale.warning": "The topic you are replying to is quite old. Would you like to create a new topic instead, and reference this one in your reply?",
"stale.create": "موضوع جديد", "stale.create": "موضوع جديد",
@@ -181,8 +173,5 @@
"timeago_later": "%1 later", "timeago_later": "%1 later",
"timeago_earlier": "%1 earlier", "timeago_earlier": "%1 earlier",
"first-post": "First post", "first-post": "First post",
"last-post": "Last post", "last-post": "Last post"
"go-to-my-next-post": "Go to my next post",
"no-more-next-post": "You don't have more posts in this topic",
"post-quick-reply": "Post quick reply"
} }

View File

@@ -1,6 +1,5 @@
{ {
"banned": "محظور", "banned": "محظور",
"muted": "Muted",
"offline": "غير متصل", "offline": "غير متصل",
"deleted": "محذوف", "deleted": "محذوف",
"username": "إسم المستخدم", "username": "إسم المستخدم",
@@ -13,8 +12,6 @@
"ban_account": "حظر الحساب", "ban_account": "حظر الحساب",
"ban_account_confirm": "هل تريد حقاً حظر هاذا العضو؟", "ban_account_confirm": "هل تريد حقاً حظر هاذا العضو؟",
"unban_account": "إزالة حظر الحساب", "unban_account": "إزالة حظر الحساب",
"mute_account": "Mute Account",
"unmute_account": "Unmute Account",
"delete_account": "حذف الحساب", "delete_account": "حذف الحساب",
"delete_account_as_admin": "Delete <strong>Account</strong>", "delete_account_as_admin": "Delete <strong>Account</strong>",
"delete_content": "Delete Account <strong>Content</strong>", "delete_content": "Delete Account <strong>Content</strong>",
@@ -97,18 +94,16 @@
"digest_off": "غير مفعل", "digest_off": "غير مفعل",
"digest_daily": "يوميا", "digest_daily": "يوميا",
"digest_weekly": "أسبوعيًّا", "digest_weekly": "أسبوعيًّا",
"digest_biweekly": "Bi-Weekly",
"digest_monthly": "شهريًّا", "digest_monthly": "شهريًّا",
"has_no_follower": "هذا المستخدم ليس لديه أية متابعين :(", "has_no_follower": "هذا المستخدم ليس لديه أية متابعين :(",
"follows_no_one": "هذا المستخدم لا يتابع أحد :(", "follows_no_one": "هذا المستخدم لا يتابع أحد :(",
"has_no_posts": "هذا المستخدم لم يشارك حتى الآن.", "has_no_posts": "هذا المستخدم لم يشارك حتى الآن.",
"has_no_best_posts": "This user does not have any upvoted posts yet.",
"has_no_topics": "هذا المستخدم لم يكتب أي موضوع حتى الآن.", "has_no_topics": "هذا المستخدم لم يكتب أي موضوع حتى الآن.",
"has_no_watched_topics": "هذا المستخدم لم يقم بمراقبة اية مواضيع حتى الآن.", "has_no_watched_topics": "هذا المستخدم لم يقم بمراقبة اية مواضيع حتى الآن.",
"has_no_ignored_topics": "هذا المستخدم لم يقم بتجاهل اية مواضيع حتى الآن.", "has_no_ignored_topics": "هذا المستخدم لم يقم بتجاهل اية مواضيع حتى الآن.",
"has_no_upvoted_posts": "هذا المستخدم لم يقم بالتصويت للأعلى لأي مشاركة حتى الآن.", "has_no_upvoted_posts": "هذا المستخدم لم يقم بالتصويت للأعلى لأي مشاركة حتى الآن.",
"has_no_downvoted_posts": "هذا المستخدم لم يقم بالتصويت للأسفل لأي مشاركة حتى الآن.", "has_no_downvoted_posts": "هذا المستخدم لم يقم بالتصويت للأسفل لأي مشاركة حتى الآن.",
"has_no_controversial_posts": "This user does not have any downvoted posts yet.", "has_no_voted_posts": "هذا المستخدم لا يمتلك اية مشاركات تم التصويت عليها",
"has_no_blocks": "You have blocked no users.", "has_no_blocks": "You have blocked no users.",
"email_hidden": "البريد الإلكتروني مخفي", "email_hidden": "البريد الإلكتروني مخفي",
"hidden": "مخفي", "hidden": "مخفي",
@@ -157,11 +152,6 @@
"info.banned-permanently": "محظور بشكل دائم", "info.banned-permanently": "محظور بشكل دائم",
"info.banned-reason-label": "سبب", "info.banned-reason-label": "سبب",
"info.banned-no-reason": "لم يتم إعطاء سبب.", "info.banned-no-reason": "لم يتم إعطاء سبب.",
"info.mute-history": "Recent Mute History",
"info.no-mute-history": "This user has never been muted",
"info.muted-until": "Muted until %1",
"info.muted-expiry": "Expiry",
"info.muted-no-reason": "No reason given.",
"info.username-history": "سجل اسم المستخدم", "info.username-history": "سجل اسم المستخدم",
"info.email-history": "سجل البريد الإلكتروني", "info.email-history": "سجل البريد الإلكتروني",
"info.moderation-note": "ملاحظة الإشراف", "info.moderation-note": "ملاحظة الإشراف",
@@ -190,10 +180,5 @@
"consent.export_uploads": "Export Uploaded Content (.zip)", "consent.export_uploads": "Export Uploaded Content (.zip)",
"consent.export-uploads-success": "Exporting uploads, you will get a notification when it is complete.", "consent.export-uploads-success": "Exporting uploads, you will get a notification when it is complete.",
"consent.export_posts": "Export Posts (.csv)", "consent.export_posts": "Export Posts (.csv)",
"consent.export-posts-success": "Exporting posts, you will get a notification when it is complete.", "consent.export-posts-success": "Exporting posts, you will get a notification when it is complete."
"emailUpdate.intro": "Please enter your email address below. This forum uses your email address for scheduled digest and notifications, as well as for account recovery in the event of a lost password.",
"emailUpdate.optional": "<strong>This field is optional</strong>. You are not obligated to provide your email address, but without a validated email you will not be able to recover your account or login with your email.",
"emailUpdate.required": "<strong>This field is required</strong>.",
"emailUpdate.change-instructions": "A confirmation email will be sent to the entered email address with a unique link. Accessing that link will confirm your ownership of the email address and it will become active on your account. At any time, you are able to update your email on file from within your account page.",
"emailUpdate.password-challenge": "Please enter your password in order to verify account ownership."
} }

View File

@@ -5,7 +5,6 @@
"most_flags": "Most Flags", "most_flags": "Most Flags",
"search": "بحث", "search": "بحث",
"enter_username": "أدخل اسم مستخدم للبحث", "enter_username": "أدخل اسم مستخدم للبحث",
"search-user-for-chat": "ابحث عن مستخدم لبدء محادثة ",
"load_more": "حمل المزيد", "load_more": "حمل المزيد",
"users-found-search-took": "تم إيجاد %1 مستخدمـ(ين)! استغرق البحث %2 ثانية.", "users-found-search-took": "تم إيجاد %1 مستخدمـ(ين)! استغرق البحث %2 ثانية.",
"filter-by": "Filter By", "filter-by": "Filter By",

View File

@@ -1,3 +0,0 @@
# The files here are not meant to be edited directly
Please see the &rarr; [Internalization README](../README.md).

View File

@@ -3,9 +3,5 @@
"alert.confirm-restart": "Наистина ли искате да рестартирате NodeBB?", "alert.confirm-restart": "Наистина ли искате да рестартирате NodeBB?",
"acp-title": "%1 | Контролен панел за администратори на NodeBB", "acp-title": "%1 | Контролен панел за администратори на NodeBB",
"settings-header-contents": "Съдържание", "settings-header-contents": "Съдържание"
"changes-saved": "Промените са запазени",
"changes-saved-message": "Промените Ви в настройките на NodeBB бяха запазени.",
"changes-not-saved": "Промените не са запазени",
"changes-not-saved-message": "Възникна проблем при запазването на промените Ви по NodeBB. (%1)"
} }

View File

@@ -3,7 +3,6 @@
"no-events": "Няма събития", "no-events": "Няма събития",
"control-panel": "Контролен панел за събитията", "control-panel": "Контролен панел за събитията",
"delete-events": "Изтриване на събитията", "delete-events": "Изтриване на събитията",
"confirm-delete-all-events": "Наистина ли искате да изтриете всички събития в журнала?",
"filters": "Филтри", "filters": "Филтри",
"filters-apply": "Прилагане на филтрите", "filters-apply": "Прилагане на филтрите",
"filter-type": "Вид събитие", "filter-type": "Вид събитие",

View File

@@ -56,8 +56,8 @@
"active-users.total": "Общо", "active-users.total": "Общо",
"active-users.connections": "Връзки", "active-users.connections": "Връзки",
"guest-registered-users": "Гости към регистрирани потребители", "anonymous-registered-users": "Анонимни към регистрирани потребители",
"guest": "Гост", "anonymous": "Анонимни",
"registered": "Регистрирани", "registered": "Регистрирани",
"user-presence": "Присъствие на потребителите ", "user-presence": "Присъствие на потребителите ",
@@ -68,7 +68,6 @@
"unread": "Непрочетени", "unread": "Непрочетени",
"high-presence-topics": "Теми с най-голяма присъственост", "high-presence-topics": "Теми с най-голяма присъственост",
"popular-searches": "Популярни търсения",
"graphs.page-views": "Преглеждания на страниците", "graphs.page-views": "Преглеждания на страниците",
"graphs.page-views-registered": "Преглеждания на страниците от регистрирани потребители", "graphs.page-views-registered": "Преглеждания на страниците от регистрирани потребители",
@@ -76,14 +75,13 @@
"graphs.page-views-bot": "Преглеждания на страниците от ботове", "graphs.page-views-bot": "Преглеждания на страниците от ботове",
"graphs.unique-visitors": "Уникални посетители", "graphs.unique-visitors": "Уникални посетители",
"graphs.registered-users": "Регистрирани потребители", "graphs.registered-users": "Регистрирани потребители",
"graphs.guest-users": "Гости", "graphs.anonymous-users": "Анонимни потребители",
"last-restarted-by": "Последно рестартиране от", "last-restarted-by": "Последно рестартиране от",
"no-users-browsing": "Няма разглеждащи потребители", "no-users-browsing": "Няма разглеждащи потребители",
"back-to-dashboard": "Назад към таблото", "back-to-dashboard": "Назад към таблото",
"details.no-users": "В избрания период не са се регистрирали нови потребители", "details.no-users": "В избрания период не са се регистрирали нови потребители",
"details.no-topics": "В избрания период не са публикувани нови теми", "details.no-topics": "В избрания период не са публикувани нови теми",
"details.no-searches": "Все още не са правени търсения",
"details.no-logins": "В избрания период не са отчетени вписвания", "details.no-logins": "В избрания период не са отчетени вписвания",
"details.logins-static": "NodeBB запазва данни за сесията в продължение на %1 дни, така че в следната таблица могат да се видят само последните активни сесии", "details.logins-static": "NodeBB запазва данни за сесията в продължение на %1 дни, така че в следната таблица могат да се видят само последните активни сесии",
"details.logins-login-time": "Време на вписване" "details.logins-login-time": "Време на вписване"

View File

@@ -8,11 +8,7 @@
"nodejs": "nodejs", "nodejs": "nodejs",
"online": "на линия", "online": "на линия",
"git": "git", "git": "git",
"process-memory": "памет на процеса", "memory": "памет",
"system-memory": "системна памет",
"used-memory-process": "Използвана памет от процеса",
"used-memory-os": "Използвана системна памет",
"total-memory-os": "Обща системна памет",
"load": "натоварване на системата", "load": "натоварване на системата",
"cpu-usage": "използване на процесора", "cpu-usage": "използване на процесора",
"uptime": "активно време", "uptime": "активно време",

View File

@@ -8,6 +8,8 @@
"delete": "Изтриване", "delete": "Изтриване",
"enable": "Включване", "enable": "Включване",
"disable": "Изключване", "disable": "Изключване",
"control-panel": "Управление на наградите",
"new-reward": "Нова награда",
"alert.delete-success": "Наградата е изтрита успешно", "alert.delete-success": "Наградата е изтрита успешно",
"alert.no-inputs-found": "Неправомерна награда — няма нищо въведено!", "alert.no-inputs-found": "Неправомерна награда — няма нищо въведено!",

View File

@@ -0,0 +1,79 @@
{
"forum-traffic": "Трафик на форума",
"page-views": "Преглеждания на страниците",
"unique-visitors": "Уникални посетители",
"new-users": "Нови потребители",
"posts": "Публикации",
"topics": "Теми",
"page-views-seven": "Последните 7 дни",
"page-views-thirty": "Последните 30 дни",
"page-views-last-day": "Последните 24 часа",
"page-views-custom": "Интервал по избор",
"page-views-custom-start": "Начална дата",
"page-views-custom-end": "Крайна дата",
"page-views-custom-help": "Въведете интервал от дати, за които искате да видите преглежданията на страниците. Ако не се появи календар за избор, можете да въведете датите във формат: <code>ГГГГ-ММ-ДД</code>",
"page-views-custom-error": "Моля, въведете правилен интервал от дати във формата: <code>ГГГГ-ММ-ДД</code>",
"stats.yesterday": "Вчера",
"stats.today": "Днес",
"stats.last-week": "Миналата седмица",
"stats.this-week": "Тази седмица",
"stats.last-month": "Миналия месец",
"stats.this-month": "Този месец",
"stats.all": "От началото",
"updates": "Обновления",
"running-version": "Вие използвате <strong>NodeBB версия <span id=\"version\">%1</span></strong>.",
"keep-updated": "Стремете се винаги да използвате най-новата версия на NodeBB, за да се възползвате от последните подобрения на сигурността и поправки на проблеми.",
"up-to-date": "<p>Вие използвате <strong>най-новата версия</strong> <i class=\"fa fa-check\"></i></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-warning": "<p>Това е версия за <strong>предварителен преглед</strong> на NodeBB. Възможно е да има неочаквани неизправности. <i class=\"fa fa-exclamation-triangle\"></i></p>",
"running-in-development": "<span>Форумът работи в режим за разработчици, така че може да бъде уязвим. Моля, свържете се със системния си администратор.</span>",
"latest-lookup-failed": "<p>Не може да бъде извършена проверка за последната налична версия на NodeBB</p>",
"notices": "Забележки",
"restart-not-required": "Не се изисква рестартиране",
"restart-required": "Изисква се рестартиране",
"search-plugin-installed": "Добавката за търсене е инсталирана",
"search-plugin-not-installed": "Добавката за търсене не е инсталирана",
"search-plugin-tooltip": "Инсталирайте добавка за търсене от страницата с добавките, за да включите функционалността за търсене",
"control-panel": "Системен контрол",
"rebuild-and-restart": "Повторно изграждане и рестартиране",
"restart": "Рестартиране",
"restart-warning": "Повторното изграждане и рестартирането на NodeBB ще прекъснат всички връзки за няколко секунди.",
"restart-disabled": "Възможностите за повторно изграждане и рестартиране на NodeBB са изключени, тъй като изглежда, че NodeBB не се изпълнява чрез подходящия демон.",
"maintenance-mode": "Режим на профилактика",
"maintenance-mode-title": "Щракнете тук, за да зададете режим на профилактика на NodeBB",
"realtime-chart-updates": "Актуализации на таблиците в реално време",
"active-users": "Дейни потребители",
"active-users.users": "Потребители",
"active-users.guests": "Гости",
"active-users.total": "Общо",
"active-users.connections": "Връзки",
"anonymous-registered-users": "Анонимни към регистрирани потребители",
"anonymous": "Анонимни",
"registered": "Регистрирани",
"user-presence": "Присъствие на потребителите ",
"on-categories": "В списъка с категории",
"reading-posts": "Четящи публикации",
"browsing-topics": "Разглеждащи теми",
"recent": "Скорошни",
"unread": "Непрочетени",
"high-presence-topics": "Теми с най-голяма присъственост",
"graphs.page-views": "Преглеждания на страниците",
"graphs.page-views-registered": "Преглеждания на страниците от регистрирани потребители",
"graphs.page-views-guest": "Преглеждания на страниците от гости",
"graphs.page-views-bot": "Преглеждания на страниците от ботове",
"graphs.unique-visitors": "Уникални посетители",
"graphs.registered-users": "Регистрирани потребители",
"graphs.anonymous-users": "Анонимни потребители",
"last-restarted-by": "Последно рестартиране от",
"no-users-browsing": "Няма разглеждащи потребители"
}

View File

@@ -0,0 +1,8 @@
{
"home-page": "Начална страница",
"description": "Изберете коя страница да бъде показана, когато потребителите отидат на главния адрес на форума.",
"home-page-route": "Път на началната страница",
"custom-route": "Персонализиран път",
"allow-user-home-pages": "Разрешаване на потребителските начални страници",
"home-page-title": "Заглавие на началната страница (по подразбиране: „Начало“)"
}

View File

@@ -0,0 +1,6 @@
{
"language-settings": "Езикови настройки",
"description": "Езикът по подразбиране определя езиковите настройки за всички потребители, които посещават Вашия форум. <br />Отделните потребители могат да сменят езика си от страницата с настройки на профила си.",
"default-language": "Език по подразбиране",
"auto-detect": "Автоматично разпознаване на езика за гостите"
}

View File

@@ -0,0 +1,23 @@
{
"icon": "Иконка:",
"change-icon": "промяна",
"route": "Маршрут:",
"tooltip": "Подсказка:",
"text": "Текст:",
"text-class": "Текстов клас: <small>незадължително</small>",
"class": "Клас: <small>незадължително</small>",
"id": "Идентификатор: <small>незадължително</small>",
"properties": "Свойства:",
"groups": "Групи:",
"open-new-window": "Отваряне в нов прозорец",
"btn.delete": "Изтриване",
"btn.disable": "Изключване",
"btn.enable": "Включване",
"available-menu-items": "Налични елементи за менюто",
"custom-route": "Персонализиран маршрут",
"core": "ядро",
"plugin": "добавка"
}

View File

@@ -0,0 +1,5 @@
{
"post-sharing": "Споделяне на публикации",
"info-plugins-additional": "Добавките могат да добавят допълнителни мрежи за споделяне на публикации.",
"save-success": "Мрежите за споделяне на публикации са запазени успешно!"
}

View File

@@ -0,0 +1,9 @@
{
"notifications": "Известия",
"chat-messages": "Съобщения в разговори",
"play-sound": "Пускане",
"incoming-message": "Входящо съобщение",
"outgoing-message": "Изходящо съобщение",
"upload-new-sound": "Качване на нов звук",
"saved": "Настройките са запазени"
}

View File

@@ -1,10 +1,8 @@
{ {
"administrators": "Администратори", "administrators": "Администратори",
"global-moderators": "Глобални модератори", "global-moderators": "Глобални модератори",
"moderators": "Модератори",
"no-global-moderators": "Няма глобални модератори", "no-global-moderators": "Няма глобални модератори",
"no-sub-categories": "Няма подкатегории", "moderators-of-category": "%1 модератори",
"subcategories": "%1 подкатегории",
"no-moderators": "Няма модератори", "no-moderators": "Няма модератори",
"add-administrator": "Добавяне на администратор", "add-administrator": "Добавяне на администратор",
"add-global-moderator": "Добавяне на глобален модератор", "add-global-moderator": "Добавяне на глобален модератор",

View File

@@ -13,7 +13,6 @@
"resent-single": "Ръчното повторно разпращане на резюмето е завършено", "resent-single": "Ръчното повторно разпращане на резюмето е завършено",
"resent-day": "Дневното резюме беше изпратено повторно", "resent-day": "Дневното резюме беше изпратено повторно",
"resent-week": "Седмичното резюме беше изпратено повторно", "resent-week": "Седмичното резюме беше изпратено повторно",
"resent-biweek": "Двуседмичното резюме беше изпратено повторно",
"resent-month": "Месечното резюме беше изпратено повторно", "resent-month": "Месечното резюме беше изпратено повторно",
"null": "<em>Никога</em>", "null": "<em>Никога</em>",
"manual-run": "Ръчно разпращане на резюмето:", "manual-run": "Ръчно разпращане на резюмето:",

View File

@@ -10,7 +10,6 @@
"upload-files": "Качване на файлове", "upload-files": "Качване на файлове",
"signature": "Подпис", "signature": "Подпис",
"ban": "Блокиране", "ban": "Блокиране",
"mute": "Заглушаване",
"invite": "Пращане на покана", "invite": "Пращане на покана",
"search-content": "Търсене на съдържание", "search-content": "Търсене на съдържание",
"search-users": "Търсене на потребители", "search-users": "Търсене на потребители",
@@ -52,13 +51,10 @@
"alert.saved": "Промените по правомощията са запазени и приложени", "alert.saved": "Промените по правомощията са запазени и приложени",
"alert.confirm-discard": "Наистина ли искате да отхвърлите промените по правомощията?", "alert.confirm-discard": "Наистина ли искате да отхвърлите промените по правомощията?",
"alert.discarded": "Промените по правомощията са отхвърлени", "alert.discarded": "Промените по правомощията са отхвърлени",
"alert.confirm-copyToAll": "Наистина ли искате да приложите този набор от <strong>%1</strong> към <strong>всички категории</strong>?", "alert.confirm-copyToAll": "Наистина ли искате да приложите този набор от правомощия към <strong>всички категории</strong>?",
"alert.confirm-copyToAllGroup": "Наистина ли искате да приложите набора от <strong>%1</strong> на тази група към <strong>всички категории</strong>?", "alert.confirm-copyToAllGroup": "Наистина ли искате да приложите набора от правомощия на таи група към <strong>всички категории</strong>?",
"alert.confirm-copyToChildren": "Наистина ли искате да приложите този набор от <strong>%1</strong> към <strong>всички по-долни (дъщерни) категории</strong>?", "alert.confirm-copyToChildren": "Наистина ли искате да приложите този набор от правомощия към <strong>всички по-долни (дъщерни) категории</strong>?",
"alert.confirm-copyToChildrenGroup": "Наистина ли искате да приложите набора от <strong>%1</strong> на тази група към <strong>всички по-долни (дъщерни) категории</strong>?", "alert.confirm-copyToChildrenGroup": "Наистина ли искате да приложите набора от правомощия на таи група към <strong>всички по-долни (дъщерни) категории</strong>?",
"alert.no-undo": "<em>Това действие е необратимо.</em>", "alert.no-undo": "<em>Това действие е необратимо.</em>",
"alert.admin-warning": "Администраторите имат всички правомощия по подразбиране", "alert.admin-warning": "Администраторите имат всички правомощия по подразбиране"
"alert.copyPrivilegesFrom-title": "Изберете категория, от която да се копира",
"alert.copyPrivilegesFrom-warning": "Това ще копира <strong>%1</strong> от избраната категория.",
"alert.copyPrivilegesFromGroup-warning": "Това ще копира набора от <strong>%1</strong> на тези група от избраната категория."
} }

View File

@@ -5,7 +5,5 @@
"orphaned": "Без ползвания", "orphaned": "Без ползвания",
"size/filecount": "Размер / брой файлове", "size/filecount": "Размер / брой файлове",
"confirm-delete": "Наистина ли искате да изтриете този файл?", "confirm-delete": "Наистина ли искате да изтриете този файл?",
"filecount": "%1 файла", "filecount": "%1 файла"
"new-folder": "Нова папка",
"name-new-folder": "Въведете име за новата папка"
} }

View File

@@ -18,8 +18,7 @@
"download-csv": "Сваляне във формат „CSV“", "download-csv": "Сваляне във формат „CSV“",
"manage-groups": "Управление на групите", "manage-groups": "Управление на групите",
"add-group": "Добавяне на група", "add-group": "Добавяне на група",
"create": "Създаване на потребител", "invite": "Покана",
"invite": "Поканване по е-поща",
"new": "Нов потребител", "new": "Нов потребител",
"filter-by": "Филтриране по", "filter-by": "Филтриране по",
"pills.unvalidated": "Няма потвърдена е-поща", "pills.unvalidated": "Няма потвърдена е-поща",
@@ -48,7 +47,6 @@
"users.uid": "потр. ид.", "users.uid": "потр. ид.",
"users.username": "потребителско име", "users.username": "потребителско име",
"users.email": "е-поща", "users.email": "е-поща",
"users.no-email": "(няма е-поща)",
"users.ip": "IP адрес", "users.ip": "IP адрес",
"users.postcount": "брой публикации", "users.postcount": "брой публикации",
"users.reputation": "репутация", "users.reputation": "репутация",
@@ -63,7 +61,7 @@
"create.password": "Парола", "create.password": "Парола",
"create.password-confirm": "Потвърдете паролата", "create.password-confirm": "Потвърдете паролата",
"temp-ban.length": "Продължителност", "temp-ban.length": "Продължителност на блокирането",
"temp-ban.reason": "Причина <span class=\"text-muted\">(незадължително)</span>", "temp-ban.reason": "Причина <span class=\"text-muted\">(незадължително)</span>",
"temp-ban.hours": "Часове", "temp-ban.hours": "Часове",
"temp-ban.days": "Дни", "temp-ban.days": "Дни",
@@ -91,7 +89,6 @@
"alerts.validate-email-success": "Е-пощите са проверени", "alerts.validate-email-success": "Е-пощите са проверени",
"alerts.validate-force-password-reset-success": "Паролата на потребителя (или паролите на потребителите) беше подновена и сесията му беше прекратена.", "alerts.validate-force-password-reset-success": "Паролата на потребителя (или паролите на потребителите) беше подновена и сесията му беше прекратена.",
"alerts.password-reset-confirm": "Искате ли да изпратите е-писмо/а за възстановяване на паролата на този/тези потребител(и)?", "alerts.password-reset-confirm": "Искате ли да изпратите е-писмо/а за възстановяване на паролата на този/тези потребител(и)?",
"alerts.password-reset-email-sent": "Е-писмото за възстановяване на паролата е изпратено.",
"alerts.confirm-delete": "<strong>ВНИМАНИЕ!</strong><p>Наистина ли искате да изтриете <strong>потребителя/ите</strong>?</p> <p>Това действие е необратимо! Ще бъде изтрит само профилът на потребителя/ите, неговите/техните публикациите и теми ще останат.</p>", "alerts.confirm-delete": "<strong>ВНИМАНИЕ!</strong><p>Наистина ли искате да изтриете <strong>потребителя/ите</strong>?</p> <p>Това действие е необратимо! Ще бъде изтрит само профилът на потребителя/ите, неговите/техните публикациите и теми ще останат.</p>",
"alerts.delete-success": "Потребителят/ите е/са изтрит(и)!", "alerts.delete-success": "Потребителят/ите е/са изтрит(и)!",
"alerts.confirm-delete-content": "<strong>ВНИМАНИЕ!</strong><p>Наистина ли искате да изтриете <strong>съдържанието</strong> на този потребител или тези потребители?</p> <p>Това действие е необратимо! Профилите на потребителите ще останат, но всички техни публикации и теми ще бъдат изтрити.</p>", "alerts.confirm-delete-content": "<strong>ВНИМАНИЕ!</strong><p>Наистина ли искате да изтриете <strong>съдържанието</strong> на този потребител или тези потребители?</p> <p>Това действие е необратимо! Профилите на потребителите ще останат, но всички техни публикации и теми ще бъдат изтрити.</p>",

View File

@@ -4,7 +4,6 @@
"dashboard/logins": "Вписвания", "dashboard/logins": "Вписвания",
"dashboard/users": "Потребители", "dashboard/users": "Потребители",
"dashboard/topics": "Теми", "dashboard/topics": "Теми",
"dashboard/searches": "Търсения",
"section-general": "Общи", "section-general": "Общи",
"section-manage": "Управление", "section-manage": "Управление",
@@ -76,7 +75,7 @@
"logout": "Изход", "logout": "Изход",
"view-forum": "Преглед на форума", "view-forum": "Преглед на форума",
"search.placeholder": "Търсене на настройки", "search.placeholder": "Натиснете „/“ за търсене на настройки",
"search.no-results": "Няма резултати…", "search.no-results": "Няма резултати…",
"search.search-forum": "Търсене във форума за <strong></strong>", "search.search-forum": "Търсене във форума за <strong></strong>",
"search.keep-typing": "Продължете да пишете, за да видите още резултати…", "search.keep-typing": "Продължете да пишете, за да видите още резултати…",

View File

@@ -8,17 +8,13 @@
"headers.csp-frame-ancestors": "Задайте заглавката „Content-Security-Policy frame-ancestors“ за да поставите NodeBB „iFrame“", "headers.csp-frame-ancestors": "Задайте заглавката „Content-Security-Policy frame-ancestors“ за да поставите NodeBB „iFrame“",
"headers.csp-frame-ancestors-help": "„none“ (нищо), „self“ (себе си по подразбиране) или списък от позволени адреси.", "headers.csp-frame-ancestors-help": "„none“ (нищо), „self“ (себе си по подразбиране) или списък от позволени адреси.",
"headers.powered-by": "Персонализиране на заглавната част „Захранван от“, която се изпраща от NodeBB", "headers.powered-by": "Персонализиране на заглавната част „Захранван от“, която се изпраща от NodeBB",
"headers.acao": "Access-Control-Allow-Origin", "headers.acao": "Произход за разрешаване на управлението на достъпа",
"headers.acao-regex": "Регулярен израз за „Access-Control-Allow-Origin“", "headers.acao-regex": "Регулярен израз за произхода за разрешаване на управлението на достъпа",
"headers.acao-help": "За да забраните достъпа до всички уеб сайтове, оставете празно", "headers.acao-help": "За да забраните достъпа до всички уеб сайтове, оставете празно",
"headers.acao-regex-help": "Въведете регулярен израз за съвпадение с динамичните произходи. За да забраните достъпа на всички уеб сайтове, оставете това празно.", "headers.acao-regex-help": "Въведете регулярен израз за съвпадение с динамичните произходи. За да забраните достъпа на всички уеб сайтове, оставете това празно.",
"headers.acac": "Access-Control-Allow-Credentials", "headers.acac": "Удостоверителни данни за разрешаване на управлението на достъпа",
"headers.acam": "Методи за разрешаване на управлението на достъпа", "headers.acam": "Методи за разрешаване на управлението на достъпа",
"headers.acah": "Access-Control-Allow-Headers", "headers.acah": "Заглавки за разрешаване на управлението на достъпа",
"headers.coep": "Cross-Origin-Embedder-Policy",
"headers.coep-help": "Когато е включено (по подразбиране), стойността на заглавката ще бъде <code>require-corp</code>",
"headers.coop": "Cross-Origin-Opener-Policy",
"headers.corp": "Cross-Origin-Resource-Policy",
"hsts": "Стриктна транспортна сигурност", "hsts": "Стриктна транспортна сигурност",
"hsts.enabled": "Включване на HSTS (препоръчително)", "hsts.enabled": "Включване на HSTS (препоръчително)",
"hsts.maxAge": "Максимална възраст на HSTS", "hsts.maxAge": "Максимална възраст на HSTS",

View File

@@ -6,14 +6,13 @@
"from-help": "Името на изпращача, което да бъде показано в е-писмото.", "from-help": "Името на изпращача, което да бъде показано в е-писмото.",
"smtp-transport": "Транспорт чрез SMTP", "smtp-transport": "Транспорт чрез SMTP",
"smtp-transport.enabled": "Включване на транспорта чрез SMTP", "smtp-transport.enabled": "Използване на външен сървър за е-поща за изпращане на е-писма",
"smtp-transport-help": "Можете да изберете от списък от познати услуги, или да въведете такава ръчно.", "smtp-transport-help": "Можете да изберете от списък от познати услуги, или да въведете такава ръчно.",
"smtp-transport.service": "Изберете услуга", "smtp-transport.service": "Изберете услуга",
"smtp-transport.service-custom": "Персонализирана услуга", "smtp-transport.service-custom": "Персонализирана услуга",
"smtp-transport.service-help": "Изберете името на услугата по-горе, за да използвате известните данни за нея. Или изберете „Персонализирана услуга“ и въведете данните ѝ по-долу.", "smtp-transport.service-help": "Изберете името на услугата по-горе, за да използвате известните данни за нея. Или изберете „Персонализирана услуга“ и въведете данните ѝ по-долу.",
"smtp-transport.gmail-warning1": "Ако използвате GMail, ще трябва да създадете „Парола за приложение“, за да може NodeBB да използва данните за удостоверяване. Можете да създадете такава в страницата с <a href=\"https://myaccount.google.com/apppasswords\">Пароли за приложения<i class=\"fa fa-external-link\"></i></a>.", "smtp-transport.gmail-warning1": "Има доклади, че услугата на Gmail не работи за акаунти с подсилена защита. В тези случаи ще трябва да <a href=\"https://www.google.com/settings/security/lesssecureapps\">настроите своя акаунт в GMail така, че да позволява използването на по-малко защитени приложения</a>.",
"smtp-transport.gmail-warning2": "За повече информация относно това обиколно решение, <a href=\"https://nodemailer.com/usage/using-gmail/\">моля, прегледайте тази статия за проблема в „NodeMailer“<i class=\"fa fa-external-link\"></i></a>. Друго решение би било използването на добавка за е-поща от трета страна, като например „SendGrid“, „Mailgun“ и т.н. <a href=\"../extend/plugins\">Вижте наличните добавки тук</a>.", "smtp-transport.gmail-warning2": "За повече информация относно това обиколно решение, <a href=\"https://nodemailer.com/usage/using-gmail/\">моля, прегледайте тази статия за проблема в „NodeMailer“.</a> Друго решение би било използването на добавка за е-поща от трета страна, като например „SendGrid“, „Mailgun“ и т.н. <a href=\"../extend/plugins\">Вижте наличните добавки тук</a>.",
"smtp-transport.auto-enable-toast": "Изглежда настройвате функционалност, която изисква транспорт чрез SMTP. Включихме настройката „Транспорт чрез SMTP“, за да не го правите Вие.",
"smtp-transport.host": "SMTP сървър", "smtp-transport.host": "SMTP сървър",
"smtp-transport.port": "SMTP порт", "smtp-transport.port": "SMTP порт",
"smtp-transport.security": "Сигурност на връзката", "smtp-transport.security": "Сигурност на връзката",
@@ -37,13 +36,6 @@
"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.remove-images": "Премахване на изображенията от известията по е-поща", "notifications.settings": "Настройки за известията по е-поща",
"require-email-address": "Новите потребители задължително трябва да предоставят е-поща", "notifications.remove-images": "Премахване на изображенията от известията по е-поща"
"require-email-address-warning": "По подразбиране потребителите могат да не въвеждат адрес на е-поща, като оставят полето празно. Ако включите това, те задължително ще трябва да предоставят е-поща, за да могат да се регистрират. <strong>Това не означава, че потребителят ще въведе съществуваща е-поща, нито че тя ще е негова.</strong>",
"send-validation-email": "Изпращане на е-писма за потвърждение, когато бъде добавена или променена е-поща",
"include-unverified-emails": "Изпращане на е-писма към получатели, които не са потвърдили изрично е-пощата си",
"include-unverified-warning": "За потребителите, които имат свързана е-поща с регистрацията си, тя се смята за потвърдена. Но има ситуации, в които това не е така (например при ползване на регистрация от друга система, но и в други случаи), <strong>Включете тази настройка на собствен риск</strong> &ndash; изпращането на е-писма към непотвърдени адреси може да нарушава определени местни закони против нежеланата поща.",
"prompt": "Подсещане на потребителите да въведат или потвърдят е-пощата си",
"prompt-help": "Ако потребител няма зададена е-поща, или ако тя не е потвърдена, на екрана му ще се покаже предупредително съобщение.",
"sendEmailToBanned": "Изпращане на е-писма дори до блокираните потребители"
} }

View File

@@ -3,9 +3,9 @@
"title": "Заглавие на уеб сайта", "title": "Заглавие на уеб сайта",
"title.short": "Кратко заглавие", "title.short": "Кратко заглавие",
"title.short-placeholder": "Ако не е посочено кратко заглавие, ще бъде използвано заглавието на уеб сайта", "title.short-placeholder": "Ако не е посочено кратко заглавие, ще бъде използвано заглавието на уеб сайта",
"title.url": "Адрес за заглавието", "title.url": "Адрес",
"title.url-placeholder": "Адресът за заглавието на уеб сайта", "title.url-placeholder": "Адресът на заглавието на уеб сайта",
"title.url-help": "Когато потребител щракне върху заглавието, той ще бъде прехвърлен към този адрес. Ако е празно, потребителят ще бъде изпратен към началната страница на форума. <br> Забележка: Това не е външният адрес, който се ползва в е-писмата. Той се задава от свойството <code>url</code> във файла config.json", "title.url-help": "При щракване върху заглавието, потребителите ще бъдат изпратени на този адрес. Ако бъде оставено празно, потребителите ще бъдат изпращани на началната страница на форума.",
"title.name": "Името на общността Ви", "title.name": "Името на общността Ви",
"title.show-in-header": "Показване на заглавието на уеб сайта в заглавната част", "title.show-in-header": "Показване на заглавието на уеб сайта в заглавната част",
"browser-title": "Заглавие на браузъра", "browser-title": "Заглавие на браузъра",
@@ -20,9 +20,9 @@
"logo.image": "Изображение", "logo.image": "Изображение",
"logo.image-placeholder": "Път до логото, което да бъде показано в заглавната част на форума", "logo.image-placeholder": "Път до логото, което да бъде показано в заглавната част на форума",
"logo.upload": "Качване", "logo.upload": "Качване",
"logo.url": "Адрес за логото", "logo.url": "Адрес",
"logo.url-placeholder": "Адресът за логото на уеб сайта", "logo.url-placeholder": "Адресът на логото на уеб сайта",
"logo.url-help": "Когато потребител щракне върху логото, той ще бъде прехвърлен към този адрес. Ако е празно, потребителят ще бъде изпратен към началната страница на форума. <br> Забележка: Това не е външният адрес, който се ползва в е-писмата. Той се задава от свойството <code>url</code> във файла config.json", "logo.url-help": "При щракване върху логото, потребителите ще бъдат изпратени на този адрес. Ако бъде оставено празно, потребителите ще бъдат изпращани на началната страница на форума.",
"logo.alt-text": "Алтернативен текст", "logo.alt-text": "Алтернативен текст",
"log.alt-text-placeholder": "Алтернативен текст за достъпност", "log.alt-text-placeholder": "Алтернативен текст за достъпност",
"favicon": "Иконка на уеб сайта", "favicon": "Иконка на уеб сайта",
@@ -35,10 +35,7 @@
"maskable-icon.help": "Препоръчителен размер и формат: 512x512, само във формат „PNG“. Ако не е посочена маскируема иконка, NodeBB ще използва иконката за сензорен екран.", "maskable-icon.help": "Препоръчителен размер и формат: 512x512, само във формат „PNG“. Ако не е посочена маскируема иконка, NodeBB ще използва иконката за сензорен екран.",
"outgoing-links": "Изходящи връзки", "outgoing-links": "Изходящи връзки",
"outgoing-links.warning-page": "Показване на предупредителна страница при щракване върху външни връзки", "outgoing-links.warning-page": "Показване на предупредителна страница при щракване върху външни връзки",
"search": "Търсене", "search-default-sort-by": "Подредба по подразбиране при търсене",
"search-default-in": "Търсене в",
"search-default-in-quick": "Бързо търсене в",
"search-default-sort-by": "Подреждане по",
"outgoing-links.whitelist": "Домейни, за които да не се показва предупредителната страница", "outgoing-links.whitelist": "Домейни, за които да не се показва предупредителната страница",
"site-colors": "Мета-данни за цвета на уеб сайта", "site-colors": "Мета-данни за цвета на уеб сайта",
"theme-color": "Цвят на темата", "theme-color": "Цвят на темата",

View File

@@ -11,8 +11,6 @@
"properties": "Свойства:", "properties": "Свойства:",
"groups": "Групи:", "groups": "Групи:",
"open-new-window": "Отваряне в нов прозорец", "open-new-window": "Отваряне в нов прозорец",
"dropdown": "Падащо меню",
"dropdown-placeholder": "Въведете елементите на падащото меню по-долу. Пример: <br/>&lt;li&gt;&lt;a href&#x3D;&quot;https://myforum.com&quot;&gt;Връзка 1&lt;/a&gt;&lt;/li&gt;",
"btn.delete": "Изтриване", "btn.delete": "Изтриване",
"btn.disable": "Изключване", "btn.disable": "Изключване",

View File

@@ -2,6 +2,5 @@
"notifications": "Известия", "notifications": "Известия",
"welcome-notification": "Приветствено известие", "welcome-notification": "Приветствено известие",
"welcome-notification-link": "Връзка за приветственото известие", "welcome-notification-link": "Връзка за приветственото известие",
"welcome-notification-uid": "Потр. ид. за приветственото известие", "welcome-notification-uid": "Потр. ид. за приветственото известие"
"post-queue-notification-uid": "Потр. ид. за опашката с публикации"
} }

View File

@@ -40,7 +40,6 @@
"teaser.last-post": "Последната &ndash; Показване на последната публикация, или първоначалната такава, ако няма отговори.", "teaser.last-post": "Последната &ndash; Показване на последната публикация, или първоначалната такава, ако няма отговори.",
"teaser.last-reply": "Последната &ndash; Показване на последния отговор, или „Няма отговори“, ако все още няма такива.", "teaser.last-reply": "Последната &ndash; Показване на последния отговор, или „Няма отговори“, ако все още няма такива.",
"teaser.first": "Първата", "teaser.first": "Първата",
"showPostPreviewsOnHover": "Показване на кратък преглед на публикациите при посочване с мишката",
"unread": "Настройки за непрочетените", "unread": "Настройки за непрочетените",
"unread.cutoff": "Възраст на публикациите, след която те не се показват в непрочетените (в брой дни)", "unread.cutoff": "Възраст на публикациите, след която те не се показват в непрочетените (в брой дни)",
"unread.min-track-last": "Минимален брой публикации в темата, след което да започва следене на последно прочетената", "unread.min-track-last": "Минимален брой публикации в темата, след което да започва следене на последно прочетената",
@@ -57,9 +56,6 @@
"composer.show-help": "Показване на раздела „Помощ“", "composer.show-help": "Показване на раздела „Помощ“",
"composer.enable-plugin-help": "Позволяване на добавките да добавят съдържание в раздела за помощ", "composer.enable-plugin-help": "Позволяване на добавките да добавят съдържание в раздела за помощ",
"composer.custom-help": "Персонализиран текст за помощ", "composer.custom-help": "Персонализиран текст за помощ",
"backlinks": "Обратни връзки",
"backlinks.enabled": "Включване на обратните връзки в темите",
"backlinks.help": "Ако в публикацията има препратка към друга тема, там ще бъде поставена връзка към публикацията, с конкретното време.",
"ip-tracking": "Записване на IP адреса", "ip-tracking": "Записване на IP адреса",
"ip-tracking.each-post": "Записване на IP адреса за всяка публикация", "ip-tracking.each-post": "Записване на IP адреса за всяка публикация",
"enable-post-history": "Включване на историята на публикациите" "enable-post-history": "Включване на историята на публикациите"

View File

@@ -4,13 +4,9 @@
"disable-down-voting": "Забрана на отрицателното гласуване", "disable-down-voting": "Забрана на отрицателното гласуване",
"votes-are-public": "Всички гласувания са публични", "votes-are-public": "Всички гласувания са публични",
"thresholds": "Ограничения на дейността", "thresholds": "Ограничения на дейността",
"min-rep-upvote": "Минимална репутация, необходима за положително гласуване за публикации",
"upvotes-per-day": "Положителни гласувания за ден (задайте 0 за неограничен брой)",
"upvotes-per-user-per-day": "Положителни гласувания за потребител за ден (задайте 0 за неограничен брой)",
"min-rep-downvote": "Минимална репутация, необходима за отрицателно гласуване за публикации", "min-rep-downvote": "Минимална репутация, необходима за отрицателно гласуване за публикации",
"downvotes-per-day": "Отрицателни гласувания за ден (задайте 0 за неограничен брой)", "downvotes-per-day": "Отрицателни гласувания за ден (задайте 0 за неограничен брой)",
"downvotes-per-user-per-day": "Отрицателни гласувания за потребител за ден (задайте 0 за неограничен брой)", "downvotes-per-user-per-day": "Отрицателни гласувания за потребител за ден (задайте 0 за неограничен брой)",
"min-rep-chat": "Минимална репутация, необходима за изпращане на съобщения в разговори",
"min-rep-flag": "Минимална репутация, необходима за докладване на публикации", "min-rep-flag": "Минимална репутация, необходима за докладване на публикации",
"min-rep-website": "Минимална репутация, необходима за добавяне на полето „Уебсайт“ към профила на потребителя", "min-rep-website": "Минимална репутация, необходима за добавяне на полето „Уебсайт“ към профила на потребителя",
"min-rep-aboutme": "Минимална репутация, необходима за добавяне на полето „За мен“ към профила на потребителя", "min-rep-aboutme": "Минимална репутация, необходима за добавяне на полето „За мен“ към профила на потребителя",
@@ -22,6 +18,5 @@
"flags.limit-per-target": "Максимален брой докладвания на едно и също нещо", "flags.limit-per-target": "Максимален брой докладвания на едно и също нещо",
"flags.limit-per-target-placeholder": "По подразбиране: 0", "flags.limit-per-target-placeholder": "По подразбиране: 0",
"flags.limit-per-target-help": "Когато публикация или потребител бъде докладван няколко пъти, това се добавя към един общ доклад. Задайте на тази настройка стойност по-голяма от нула, за да ограничите броя на докладванията, които могат да бъдат натрупани към една публикация или потребител.", "flags.limit-per-target-help": "Когато публикация или потребител бъде докладван няколко пъти, това се добавя към един общ доклад. Задайте на тази настройка стойност по-голяма от нула, за да ограничите броя на докладванията, които могат да бъдат натрупани към една публикация или потребител.",
"flags.auto-flag-on-downvote-threshold": "Брой отрицателни гласове, при които публикациите да бъдат докладвани автоматично (0 = изключено, по подразбиране: 0)",
"flags.auto-resolve-on-ban": "Автоматично премахване на всички доклади за потребител, когато той бъде блокиран" "flags.auto-resolve-on-ban": "Автоматично премахване на всички доклади за потребител, когато той бъде блокиран"
} }

View File

@@ -1,11 +1,8 @@
{ {
"posts": "Публикации", "posts": "Публикации",
"orphans": "Неизползвани файлове", "allow-files": "Позволяване на потребителите да качват обикновени файлове",
"private": "Качените файлове да бъдат частни", "private": "Качените файлове да бъдат частни",
"strip-exif-data": "Премахване на данните EXIF", "strip-exif-data": "Премахване на данните EXIF",
"preserve-orphaned-uploads": "Запазване на качените файлове на диска дори след изтриването на публикацията",
"orphanExpiryDays": "Брой дни за съхранение на неизползваните файлове",
"orphanExpiryDays-help": "След толкова на брой дни неизползваните качени файлове ще бъдат изтривани.<br />Задайте 0 или оставете празно, за да изключите тази функционалност.",
"private-extensions": "Файлови разширения, които да бъдат частни", "private-extensions": "Файлови разширения, които да бъдат частни",
"private-uploads-extensions-help": "Въведете списък от файлови разширения, разделени със запетаи, които искате да бъдат частни (например <code>pdf,xls,doc</code>). Ако оставите това поле празно, всички файлове ще бъдат частни.", "private-uploads-extensions-help": "Въведете списък от файлови разширения, разделени със запетаи, които искате да бъдат частни (например <code>pdf,xls,doc</code>). Ако оставите това поле празно, всички файлове ще бъдат частни.",
"resize-image-width-threshold": "Преоразмеряване на изображенията, ако са по-широки от определената ширина", "resize-image-width-threshold": "Преоразмеряване на изображенията, ако са по-широки от определената ширина",

View File

@@ -1,10 +1,12 @@
{ {
"authentication": "Удостоверяване", "authentication": "Удостоверяване",
"require-email-confirmation": "Изискване на потвърждение на е-пощата",
"email-confirm-interval": "Потребителят не може да изпраща повторно е-писмото за потвърждение, преди да са минали", "email-confirm-interval": "Потребителят не може да изпраща повторно е-писмото за потвърждение, преди да са минали",
"email-confirm-email2": "минути", "email-confirm-email2": "минути",
"allow-login-with": "Позволяване на вписването чрез", "allow-login-with": "Позволяване на вписването чрез",
"allow-login-with.username-email": "Потребителско име или е-поща", "allow-login-with.username-email": "Потребителско име или е-поща",
"allow-login-with.username": "Само потребителско име", "allow-login-with.username": "Само потребителско име",
"allow-login-with.email": "Само е-поща",
"account-settings": "Настройки на акаунта", "account-settings": "Настройки на акаунта",
"gdpr_enabled": "Включване на искането за съгласие с ОРЗД", "gdpr_enabled": "Включване на искането за съгласие с ОРЗД",
"gdpr_enabled_help": "Ако това е включено, всички новорегистрирани потребители ще бъдат задължени изрично да дадат съгласието си за събирането на данни и статистики за потреблението според <a href=\"https://ec.europa.eu/info/priorities/justice-and-fundamental-rights/data-protection/2018-reform-eu-data-protection-rules/eu-data-protection-rules_en\">Общия регламент относно защитата на данните (ОРЗД)</a>. <strong>Забележка</strong>: Включването на ОРЗД не задължава съществуващите потребители да дадат съгласието си. Ако искате това, ще трябва да инсталирате добавката за ОРЗД (GDPR).", "gdpr_enabled_help": "Ако това е включено, всички новорегистрирани потребители ще бъдат задължени изрично да дадат съгласието си за събирането на данни и статистики за потреблението според <a href=\"https://ec.europa.eu/info/priorities/justice-and-fundamental-rights/data-protection/2018-reform-eu-data-protection-rules/eu-data-protection-rules_en\">Общия регламент относно защитата на данните (ОРЗД)</a>. <strong>Забележка</strong>: Включването на ОРЗД не задължава съществуващите потребители да дадат съгласието си. Ако искате това, ще трябва да инсталирате добавката за ОРЗД (GDPR).",
@@ -23,7 +25,7 @@
"login-attempts": "Брой опити за вписване на час", "login-attempts": "Брой опити за вписване на час",
"login-attempts-help": "Ако опитите за вписване на потребител минат тази граница, акаунтът ще бъде заключен за определено време.", "login-attempts-help": "Ако опитите за вписване на потребител минат тази граница, акаунтът ще бъде заключен за определено време.",
"lockout-duration": "Продължителност на заключването на акаунта (в минути)", "lockout-duration": "Продължителност на заключването на акаунта (в минути)",
"login-days": "Брой дни за помнене на сесията за вписване на потребителя", "login-days": "Продължителност на запомнянето на сесията за вписване на потребителя (в дни)",
"password-expiry-days": "Изискване на промяна на паролата през определен период от дни", "password-expiry-days": "Изискване на промяна на паролата през определен период от дни",
"session-time": "Продължителност на сесията", "session-time": "Продължителност на сесията",
"session-time-days": "Дни", "session-time-days": "Дни",
@@ -69,7 +71,6 @@
"digest-freq.off": "Изключено", "digest-freq.off": "Изключено",
"digest-freq.daily": "Ежедневно", "digest-freq.daily": "Ежедневно",
"digest-freq.weekly": "Ежеседмично", "digest-freq.weekly": "Ежеседмично",
"digest-freq.biweekly": "На всеки две седмици",
"digest-freq.monthly": "Ежемесечно", "digest-freq.monthly": "Ежемесечно",
"email-chat-notifs": "Изпращане на е-писмо, ако получа ново съобщение в разговор, а не съм на линия", "email-chat-notifs": "Изпращане на е-писмо, ако получа ново съобщение в разговор, а не съм на линия",
"email-post-notif": "Изпращане на е-писмо, когато се появи отговор в темите, за които съм абониран(а).", "email-post-notif": "Изпращане на е-писмо, когато се появи отговор в темите, за които съм абониран(а).",

View File

@@ -6,9 +6,7 @@
"greeting_no_name": "Здравейте", "greeting_no_name": "Здравейте",
"greeting_with_name": "Здравейте, %1", "greeting_with_name": "Здравейте, %1",
"email.verify-your-email.subject": "Моля, потвърдете е-пощата си", "email.verify-your-email.subject": "Моля, потвърдете е-пощата си",
"email.verify.text1": "Вие поискахте да променим или потвърдим адреса на е-пощата Ви", "email.verify.text1": "Адресът на е-пощата Ви е променен!",
"email.verify.text2": "Поради причини, свързани със сигурността, можем да променим или потвърдим адреса на е-поща, само когато притежанието ѝ вече е било установено чрез е-писмо. <strong>Ако не сте поискали това, няма нужда да правите нищо.</strong>",
"email.verify.text3": "След като потвърдите адреса на тази е-поща, ще променим текущия Ви адрес с този (%1).",
"welcome.text1": "Благодарим Ви, че се регистрирахте в %1", "welcome.text1": "Благодарим Ви, че се регистрирахте в %1",
"welcome.text2": "За да активирате напълно акаунта си, трябва да потвърдите е-пощата, с която сте се регистрирали.", "welcome.text2": "За да активирате напълно акаунта си, трябва да потвърдите е-пощата, с която сте се регистрирали.",
"welcome.text3": "Вашата заявка за регистрация беше приета от администратор. Вече можете да се впишете със своето потребителско име и парола.", "welcome.text3": "Вашата заявка за регистрация беше приета от администратор. Вече можете да се впишете със своето потребителско име и парола.",
@@ -48,8 +46,6 @@
"unsub.cta": "Натиснете тук, за да промените тези настройки", "unsub.cta": "Натиснете тук, за да промените тези настройки",
"unsubscribe": "отписване", "unsubscribe": "отписване",
"unsub.success": "Повече няма да получавате е-писма от пощенския списък на <strong>%1</strong>", "unsub.success": "Повече няма да получавате е-писма от пощенския списък на <strong>%1</strong>",
"unsub.failure.title": "Отписването не може да се извърши",
"unsub.failure.message": "За съжаление не успяхме да Ви отпишем от пощенския списък, поради проблем с връзката. Можете, обаче, да промените предпочитанията си за е-писмата в <a href=\"%2\">потребителските си настройки</a>.<br /><br />(грешка: <code>%1</code>)",
"banned.subject": "Вие бяхте блокиран(а) от %1", "banned.subject": "Вие бяхте блокиран(а) от %1",
"banned.text1": "Потребителят %1 беше блокиран от %2.", "banned.text1": "Потребителят %1 беше блокиран от %2.",
"banned.text2": "Това блокиране ще е в сила до %1.", "banned.text2": "Това блокиране ще е в сила до %1.",

View File

@@ -1,8 +1,6 @@
{ {
"invalid-data": "Грешни данни", "invalid-data": "Грешни данни",
"invalid-json": "Неправилен JSON", "invalid-json": "Неправилен JSON",
"wrong-parameter-type": "За свойството `%1` се очакваше стойност от тип %3, но вместо това беше получено %2",
"required-parameters-missing": "Липсват задължителни параметри от това извикване към ППИ: %1",
"not-logged-in": "Изглежда не сте се вписали в системата.", "not-logged-in": "Изглежда не сте се вписали в системата.",
"account-locked": "Вашият акаунт беше заключен временно", "account-locked": "Вашият акаунт беше заключен временно",
"search-requires-login": "Търсенето изисква регистриран акаунт! Моля, впишете се или се регистрирайте!", "search-requires-login": "Търсенето изисква регистриран акаунт! Моля, впишете се или се регистрирайте!",
@@ -11,7 +9,6 @@
"invalid-tid": "Грешен идентификатор на тема", "invalid-tid": "Грешен идентификатор на тема",
"invalid-pid": "Грешен идентификатор на публикация", "invalid-pid": "Грешен идентификатор на публикация",
"invalid-uid": "Грешен идентификатор на потребител", "invalid-uid": "Грешен идентификатор на потребител",
"invalid-mid": "Грешен идентификатор на съобщение в разговор",
"invalid-date": "Трябва да бъде посочена правилна дата", "invalid-date": "Трябва да бъде посочена правилна дата",
"invalid-username": "Грешно потребителско име", "invalid-username": "Грешно потребителско име",
"invalid-email": "Грешна е-поща", "invalid-email": "Грешна е-поща",
@@ -28,18 +25,14 @@
"invalid-event": "Грешно събитие: %1", "invalid-event": "Грешно събитие: %1",
"local-login-disabled": "Системата за местно вписване е изключена за непривилегированите акаунти.", "local-login-disabled": "Системата за местно вписване е изключена за непривилегированите акаунти.",
"csrf-invalid": "Не успяхме да Ви впишем, най-вероятно защото сесията Ви е изтекла. Моля, опитайте отново", "csrf-invalid": "Не успяхме да Ви впишем, най-вероятно защото сесията Ви е изтекла. Моля, опитайте отново",
"invalid-path": "Грешен път",
"folder-exists": "Вече има папка с това име",
"invalid-pagination-value": "Грешен номер на странициране, трябва да бъде между %1 и %2", "invalid-pagination-value": "Грешен номер на странициране, трябва да бъде между %1 и %2",
"username-taken": "Потребителското име е заето", "username-taken": "Потребителското име е заето",
"email-taken": "Е-пощата е заета", "email-taken": "Е-пощата е заета",
"email-nochange": "Въведената е-поща е същата като съществуващата.",
"email-invited": "На тази е-поща вече е била изпратена покана", "email-invited": "На тази е-поща вече е била изпратена покана",
"email-not-confirmed": "Публикуването в някои категории и теми ще бъде възможно едва след като е-пощата Ви бъде потвърдена. Щръкнете тук, за да Ви изпратим е-писмо за потвърждение.", "email-not-confirmed": "Няма да можете да публикувате съобщения, докато е-пощата Ви не бъде потвърдена. Моля, натиснете тук, за да потвърдите е-пощата си.",
"email-not-confirmed-chat": "Няма да можете да пишете в разговори, докато е-пощата Ви не бъде потвърдена. Моля, натиснете тук, за да потвърдите е-пощата си.", "email-not-confirmed-chat": "Няма да можете да пишете в разговори, докато е-пощата Ви не бъде потвърдена. Моля, натиснете тук, за да потвърдите е-пощата си.",
"email-not-confirmed-email-sent": "Вашата е-поща все още не е потвърдена. Моля, проверете входящата си кутия за писмото за потвърждение. Възможно е да не можете да публикувате съобщения или да пишете в разговори, докато е-пощата Ви не бъде потвърдена.", "email-not-confirmed-email-sent": "Вашата е-поща все още не е потвърдена. Моля, проверете входящата си кутия за писмото за потвърждение. Няма да можете да публикувате съобщения или да пишете в разговори, докато е-пощата Ви не бъде потвърдена.",
"no-email-to-confirm": "Нямате зададена е-поща. Тя е необходима за възстановяването на акаунта в случай на проблем, а може и да се изисква, за да пишете в някои категории. Натиснете тук, за да въведете е-поща.", "no-email-to-confirm": "Този форум изисква потвърдена е-поща. Моля, натиснете тук, за да въведете е-поща",
"user-doesnt-have-email": "Потребителят „%1“ няма зададена е-поща.",
"email-confirm-failed": "Не успяхме да потвърдим е-пощата Ви. Моля, опитайте отново по-късно.", "email-confirm-failed": "Не успяхме да потвърдим е-пощата Ви. Моля, опитайте отново по-късно.",
"confirm-email-already-sent": "Е-писмото за потвърждение вече е изпратено. Моля, почакайте още %1 минута/и, преди да изпратите ново.", "confirm-email-already-sent": "Е-писмото за потвърждение вече е изпратено. Моля, почакайте още %1 минута/и, преди да изпратите ново.",
"sendmail-not-found": "Изпълнимият файл на „sendmail“ не може да бъде намерен. Моля, уверете се, че е инсталиран и изпълним за потребителя, чрез който е пуснат NodeBB.", "sendmail-not-found": "Изпълнимият файл на „sendmail“ не може да бъде намерен. Моля, уверете се, че е инсталиран и изпълним за потребителя, чрез който е пуснат NodeBB.",
@@ -61,7 +54,6 @@
"no-group": "Групата не съществува", "no-group": "Групата не съществува",
"no-user": "Потребителят не съществува", "no-user": "Потребителят не съществува",
"no-teaser": "Резюмето не съществува", "no-teaser": "Резюмето не съществува",
"no-flag": "Докладът не съществува",
"no-privileges": "Нямате достатъчно права за това действие.", "no-privileges": "Нямате достатъчно права за това действие.",
"category-disabled": "Категорията е изключена", "category-disabled": "Категорията е изключена",
"topic-locked": "Темата е заключена", "topic-locked": "Темата е заключена",
@@ -108,10 +100,6 @@
"already-bookmarked": "Вече имате отметка към тази публикация", "already-bookmarked": "Вече имате отметка към тази публикация",
"already-unbookmarked": "Вече сте премахнали отметката си от тази публикация", "already-unbookmarked": "Вече сте премахнали отметката си от тази публикация",
"cant-ban-other-admins": "Не можете да блокирате другите администратори!", "cant-ban-other-admins": "Не можете да блокирате другите администратори!",
"cant-mute-other-admins": "Не можете да заглушавате другите администратори!",
"user-muted-for-hours": "Вие бяхте заглушен(а). Ще можете да пускате публикации отново след %1 час(а)",
"user-muted-for-minutes": "Вие бяхте заглушен(а). Ще можете да пускате публикации отново след %1 минута/и",
"cant-make-banned-users-admin": "Не можете да давате администраторски права на блокирани потребители.",
"cant-remove-last-admin": "Вие сте единственият администратор. Добавете друг потребител като администратор, преди да премахнете себе си като администратор", "cant-remove-last-admin": "Вие сте единственият администратор. Добавете друг потребител като администратор, преди да премахнете себе си като администратор",
"account-deletion-disabled": "Изтриването на акаунт е забранено", "account-deletion-disabled": "Изтриването на акаунт е забранено",
"cant-delete-admin": "Премахнете администраторските права от този акаунт, преди да го изтриете.", "cant-delete-admin": "Премахнете администраторските права от този акаунт, преди да го изтриете.",
@@ -149,6 +137,7 @@
"invalid-chat-message": "Неправилно съобщение", "invalid-chat-message": "Неправилно съобщение",
"chat-message-too-long": "Съобщенията в разговор не може да бъдат по-дълги от %1 знака.", "chat-message-too-long": "Съобщенията в разговор не може да бъдат по-дълги от %1 знака.",
"cant-edit-chat-message": "Нямате право да редактирате това съобщение", "cant-edit-chat-message": "Нямате право да редактирате това съобщение",
"cant-remove-last-user": "Не можете да премахнете последния потребител",
"cant-delete-chat-message": "Нямате право да изтриете това съобщение", "cant-delete-chat-message": "Нямате право да изтриете това съобщение",
"chat-edit-duration-expired": "Можете да редактирате съобщенията си в разговорите до %1 секунда/и, след като ги пуснете", "chat-edit-duration-expired": "Можете да редактирате съобщенията си в разговорите до %1 секунда/и, след като ги пуснете",
"chat-delete-duration-expired": "Можете да изтривате съобщенията си в разговорите до %1 секунда/и след пускането им", "chat-delete-duration-expired": "Можете да изтривате съобщенията си в разговорите до %1 секунда/и след пускането им",
@@ -158,23 +147,19 @@
"already-voting-for-this-post": "Вече сте дали глас за тази публикация.", "already-voting-for-this-post": "Вече сте дали глас за тази публикация.",
"reputation-system-disabled": "Системата за репутация е изключена.", "reputation-system-disabled": "Системата за репутация е изключена.",
"downvoting-disabled": "Отрицателното гласуване е изключено", "downvoting-disabled": "Отрицателното гласуване е изключено",
"not-enough-reputation-to-chat": "Репутацията Ви трябва да бъде поне %1, за да участвате в разговори", "not-enough-reputation-to-downvote": "Нямате достатъчно репутация, за да гласувате отрицателно за тази публикация",
"not-enough-reputation-to-upvote": "Репутацията Ви трябва да бъде поне %1, за да гласувате положително", "not-enough-reputation-to-flag": "Нямате достатъчно репутация, за да докладвате тази публикация",
"not-enough-reputation-to-downvote": "Репутацията Ви трябва да бъде поне %1, за да гласувате отрицателно", "not-enough-reputation-min-rep-website": "Нямате достатъчно репутация, за да добавите уеб сайт",
"not-enough-reputation-to-flag": "Репутацията Ви трябва да бъде поне %1, за да докладвате тази публикация", "not-enough-reputation-min-rep-aboutme": "Нямате достатъчно репутация, за да добавите информация за себе си",
"not-enough-reputation-min-rep-website": "Репутацията Ви трябва да бъде поне %1, за да добавите уеб сайт", "not-enough-reputation-min-rep-signature": "Нямате достатъчно репутация, за да добавите подпис",
"not-enough-reputation-min-rep-aboutme": "Репутацията Ви трябва да бъде поне %1, за да добавите информация за себе си", "not-enough-reputation-min-rep-profile-picture": "Нямате достатъчно репутация, за да добавите снимка на профила си",
"not-enough-reputation-min-rep-signature": "Репутацията Ви трябва да бъде поне %1, за да добавите подпис", "not-enough-reputation-min-rep-cover-picture": "Нямате достатъчно репутация, за да добавите снимка на корицата",
"not-enough-reputation-min-rep-profile-picture": "Репутацията Ви трябва да бъде поне %1, за да добавите снимка на профила си",
"not-enough-reputation-min-rep-cover-picture": "Репутацията Ви трябва да бъде поне %1, за да добавите снимка на корицата",
"post-already-flagged": "Вече сте докладвали тази публикация", "post-already-flagged": "Вече сте докладвали тази публикация",
"user-already-flagged": "Вече сте докладвали този потребител", "user-already-flagged": "Вече сте докладвали този потребител",
"post-flagged-too-many-times": "Тази публикация вече е докладвана от други хора", "post-flagged-too-many-times": "Тази публикация вече е докладвана от други хора",
"user-flagged-too-many-times": "Този потребител вече е докладван от други хора", "user-flagged-too-many-times": "Този потребител вече е докладван от други хора",
"cant-flag-privileged": "Не можете да докладвате профилите или съдържанието от потребители с по-високи правомощия (модератори, глобални модератори, администратори)", "cant-flag-privileged": "Не можете да докладвате профилите или съдържанието от потребители с по-високи правомощия (модератори, глобални модератори, администратори)",
"self-vote": "Не можете да гласувате за собствената си публикация", "self-vote": "Не можете да гласувате за собствената си публикация",
"too-many-upvotes-today": "Можете да гласувате положително не повече от %1 пъти на ден",
"too-many-upvotes-today-user": "Можете да гласувате положително за потребител не повече от %1 пъти на ден",
"too-many-downvotes-today": "Можете да гласувате отрицателно не повече от %1 пъти на ден", "too-many-downvotes-today": "Можете да гласувате отрицателно не повече от %1 пъти на ден",
"too-many-downvotes-today-user": "Можете да гласувате отрицателно за потребител не повече от %1 пъти на ден", "too-many-downvotes-today-user": "Можете да гласувате отрицателно за потребител не повече от %1 пъти на ден",
"reload-failed": "NodeBB срещна проблем при презареждането: „%1“. NodeBB ще продължи да поддържа съществуващите клиентски ресурси, но Вие трябва да отмените последните си действия преди презареждането.", "reload-failed": "NodeBB срещна проблем при презареждането: „%1“. NodeBB ще продължи да поддържа съществуващите клиентски ресурси, но Вие трябва да отмените последните си действия преди презареждането.",
@@ -205,8 +190,6 @@
"no-connection": "Изглежда има проблем с връзката Ви с Интернет", "no-connection": "Изглежда има проблем с връзката Ви с Интернет",
"socket-reconnect-failed": "В момента сървърът е недостъпен. Натиснете тук, за да опитате отново, или опитайте пак по-късно.", "socket-reconnect-failed": "В момента сървърът е недостъпен. Натиснете тук, за да опитате отново, или опитайте пак по-късно.",
"plugin-not-whitelisted": "Добавката не може да бъде инсталирана само добавки, одобрени от пакетния мениджър на NodeBB могат да бъдат инсталирани чрез ACP", "plugin-not-whitelisted": "Добавката не може да бъде инсталирана само добавки, одобрени от пакетния мениджър на NodeBB могат да бъдат инсталирани чрез ACP",
"plugins-set-in-configuration": "Не можете да променяте състоянието на добавката, тъй като то се определя по време на работата ѝ (чрез config.json, променливи на средата или аргументи при изпълнение). Вместо това може да промените конфигурацията.",
"theme-not-set-in-configuration": "Когато определяте активните добавки в конфигурацията, промяната на темите изисква да се добави новата тема към активните добавки, преди актуализирането ѝ в ACP",
"topic-event-unrecognized": "Събитието „%1“ на темата е неизвестно", "topic-event-unrecognized": "Събитието „%1“ на темата е неизвестно",
"cant-set-child-as-parent": "Дъщерна категория не може да се зададе като базова такава", "cant-set-child-as-parent": "Дъщерна категория не може да се зададе като базова такава",
"cant-set-self-as-parent": "Категорията не може да се зададе като базова категория на себе си", "cant-set-self-as-parent": "Категорията не може да се зададе като базова категория на себе си",

View File

@@ -38,7 +38,6 @@
"delete-post": "Изтриване на публикацията", "delete-post": "Изтриване на публикацията",
"purge-post": "Изчистване на публикацията", "purge-post": "Изчистване на публикацията",
"restore-post": "Възстановяване на публикацията", "restore-post": "Възстановяване на публикацията",
"delete": "Изтриване на доклада",
"user-view": "Преглед на профила", "user-view": "Преглед на профила",
"user-edit": "Редактиране на профила", "user-edit": "Редактиране на профила",
@@ -47,10 +46,8 @@
"add-note": "Добавяне на бележка", "add-note": "Добавяне на бележка",
"no-notes": "Няма споделени бележки.", "no-notes": "Няма споделени бележки.",
"delete-note-confirm": "Наистина ли искате да изтриете тази бележка към доклада?", "delete-note-confirm": "Наистина ли искате да изтриете тази бележка към доклада?",
"delete-flag-confirm": "Наистина ли искате да изтриете този доклад?",
"note-added": "Бележката е добавена", "note-added": "Бележката е добавена",
"note-deleted": "Бележката е изтрита", "note-deleted": "Бележката е изтрита",
"flag-deleted": "Докладът е изтрит",
"history": "Акаунт и история на докладванията", "history": "Акаунт и история на докладванията",
"no-history": "Няма история на доклада.", "no-history": "Няма история на доклада.",
@@ -80,10 +77,12 @@
"modal-reason-custom": "Причина за докладването на това съдържание…", "modal-reason-custom": "Причина за докладването на това съдържание…",
"modal-submit": "Изпращане на доклада", "modal-submit": "Изпращане на доклада",
"modal-submit-success": "Съдържанието беше докладвано на модераторите.", "modal-submit-success": "Съдържанието беше докладвано на модераторите.",
"modal-submit-confirm": "Потвърждаване на докладването",
"modal-submit-confirm-text": "Вече сте описали специалната си причина. Наистина ли искате да изпратите доклада си по бързата процедура?",
"modal-submit-confirm-text-help": "Изпращането на доклад по бързата процедура ще премахне описаната от Вас специалната причина.",
"bulk-actions": "Групови действия", "bulk-actions": "Групови действия",
"bulk-resolve": "Разрешаване на доклад(и)", "bulk-resolve": "Разрешаване на доклад(и)",
"bulk-success": "%1 доклада са обновени", "bulk-success": "%1 доклада са обновени",
"flagged-timeago-readable": "Докладвано <span class=\"timeago\" title=\"%1\"></span> (%2)", "flagged-timeago-readable": "Докладвано <span class=\"timeago\" title=\"%1\"></span> (%2)"
"auto-flagged": "[Авт. докладвано] Получени %1 отрицателни гласа."
} }

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