mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-12-24 09:20:32 +01:00
Compare commits
6 Commits
v1.17.2-be
...
v1.16.2-be
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a373731570 | ||
|
|
a76b5d15e0 | ||
|
|
a06b84d258 | ||
|
|
ecf212d307 | ||
|
|
dc6fc65322 | ||
|
|
27b481765b |
197
.eslintrc
197
.eslintrc
@@ -5,111 +5,136 @@
|
||||
},
|
||||
|
||||
"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
|
||||
// Customized
|
||||
"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"
|
||||
"functions": "never"
|
||||
}],
|
||||
// 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-constant-condition": "off",
|
||||
"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-mixed-operators": ["error", { "allowSamePrecedence": true }],
|
||||
"strict": ["error", "global"],
|
||||
"consistent-return": "off",
|
||||
"func-names": "off",
|
||||
"no-tabs": "off",
|
||||
"indent": ["error", "tab", { "SwitchCase": 1 }],
|
||||
"no-eq-null": "off",
|
||||
"camelcase": "off",
|
||||
"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
|
||||
"no-use-before-define": ["error", "nofunc"],
|
||||
"no-prototype-builtins": "off",
|
||||
"new-cap": "off",
|
||||
"no-plusplus": ["error", { "allowForLoopAfterthoughts": true }],
|
||||
"object-curly-newline": "off",
|
||||
"no-restricted-globals": "off",
|
||||
"function-paren-newline": "off",
|
||||
"import/no-unresolved": "error",
|
||||
"quotes": ["error", "single", {
|
||||
"avoidEscape": true,
|
||||
"allowTemplateLiterals": true
|
||||
}],
|
||||
"no-else-return": [ "error", { "allowElseIf": true } ],
|
||||
"operator-linebreak": [ "error", "after" ],
|
||||
"arrow-parens": ["error", "as-needed", { "requireForBlockBody": true }],
|
||||
|
||||
// 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",
|
||||
|
||||
// TODO
|
||||
"consistent-return": "off",
|
||||
"no-restricted-globals": "off",
|
||||
"no-prototype-builtins": "off",
|
||||
"import/no-extraneous-dependencies": "off",
|
||||
"import/no-dynamic-require": "off",
|
||||
"import/newline-after-import": "off",
|
||||
"no-bitwise": "off",
|
||||
"global-require": "off",
|
||||
"max-len": "off",
|
||||
"no-param-reassign": "off",
|
||||
"default-case": "off"
|
||||
"no-restricted-syntax": "off",
|
||||
"no-script-url": "off",
|
||||
"default-case": "off",
|
||||
"linebreak-style": "off",
|
||||
|
||||
// "no-multi-assign": "off",
|
||||
// "one-var": "off",
|
||||
// "no-undef": "off",
|
||||
// "max-nested-callbacks": "off",
|
||||
// "no-mixed-requires": "off",
|
||||
// "brace-style": "off",
|
||||
// "max-statements-per-line": "off",
|
||||
// "no-unused-vars": "off",
|
||||
// "no-mixed-spaces-and-tabs": "off",
|
||||
// "no-useless-concat": "off",
|
||||
// "require-jsdoc": "off",
|
||||
// "eqeqeq": "off",
|
||||
// "no-negated-condition": "off",
|
||||
// "one-var-declaration-per-line": "off",
|
||||
// "no-lonely-if": "off",
|
||||
// "radix": "off",
|
||||
// "no-else-return": "off",
|
||||
// "no-useless-escape": "off",
|
||||
// "block-scoped-var": "off",
|
||||
// "operator-assignment": "off",
|
||||
// "yoda": "off",
|
||||
// "no-loop-func": "off",
|
||||
// "no-void": "off",
|
||||
// "valid-jsdoc": "off",
|
||||
// "no-cond-assign": "off",
|
||||
// "no-redeclare": "off",
|
||||
// "no-unreachable": "off",
|
||||
// "no-nested-ternary": "off",
|
||||
// "operator-linebreak": "off",
|
||||
// "guard-for-in": "off",
|
||||
// "no-unneeded-ternary": "off",
|
||||
// "no-sequences": "off",
|
||||
// "no-extend-native": "off",
|
||||
// "no-shadow-restricted-names": "off",
|
||||
// "no-extra-boolean-cast": "off",
|
||||
// "no-path-concat": "off",
|
||||
// "no-unused-expressions": "off",
|
||||
// "no-return-assign": "off",
|
||||
// "no-restricted-modules": "off",
|
||||
// "object-curly-spacing": "off",
|
||||
// "indent": "off",
|
||||
// "padded-blocks": "off",
|
||||
// "eol-last": "off",
|
||||
// "lines-around-directive": "off",
|
||||
// "strict": "off",
|
||||
// "comma-dangle": "off",
|
||||
// "no-multi-spaces": "off",
|
||||
// "quotes": "off",
|
||||
// "keyword-spacing": "off",
|
||||
// "no-mixed-operators": "off",
|
||||
// "comma-spacing": "off",
|
||||
// "no-trailing-spaces": "off",
|
||||
// "key-spacing": "off",
|
||||
"no-multiple-empty-lines": "off"
|
||||
// "spaced-comment": "off",
|
||||
// "space-in-parens": "off",
|
||||
// "block-spacing": "off",
|
||||
// "quote-props": "off",
|
||||
// "space-unary-ops": "off",
|
||||
// "no-empty": "off",
|
||||
// "dot-notation": "off",
|
||||
// "func-call-spacing": "off",
|
||||
// "array-bracket-spacing": "off",
|
||||
// "object-property-newline": "off",
|
||||
// "no-continue": "off",
|
||||
// "no-extra-semi": "off",
|
||||
// "no-spaced-func": "off",
|
||||
// "no-useless-return": "off"
|
||||
}
|
||||
}
|
||||
|
||||
52
.github/workflows/docker.yml
vendored
52
.github/workflows/docker.yml
vendored
@@ -1,52 +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@v3
|
||||
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 }}
|
||||
|
||||
8
.github/workflows/test.yaml
vendored
8
.github/workflows/test.yaml
vendored
@@ -21,7 +21,7 @@ jobs:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [ubuntu-latest]
|
||||
node: [12, 14]
|
||||
node: [10, 12, 14]
|
||||
database: [mongo-dev, mongo, redis, postgres]
|
||||
include:
|
||||
# only run coverage once
|
||||
@@ -186,19 +186,19 @@ jobs:
|
||||
run: npm run coverage
|
||||
|
||||
- name: Test coverage
|
||||
uses: coverallsapp/github-action@1.1.3
|
||||
uses: coverallsapp/github-action@v1.1.2
|
||||
if: matrix.coverage
|
||||
with:
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
flag-name: ${{ matrix.os }}-node-${{ matrix.node }}-db-${{ matrix.database }}
|
||||
parallel: true
|
||||
|
||||
|
||||
finish:
|
||||
needs: test
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Coveralls Finished
|
||||
uses: coverallsapp/github-action@1.1.3
|
||||
uses: coverallsapp/github-action@v1.1.2
|
||||
with:
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
parallel-finished: true
|
||||
|
||||
1
.husky/.gitignore
vendored
1
.husky/.gitignore
vendored
@@ -1 +0,0 @@
|
||||
_
|
||||
@@ -1,4 +0,0 @@
|
||||
#!/bin/sh
|
||||
. "$(dirname "$0")/_/husky.sh"
|
||||
|
||||
npx --no-install commitlint --edit $1
|
||||
@@ -1,4 +0,0 @@
|
||||
#!/bin/sh
|
||||
. "$(dirname "$0")/_/husky.sh"
|
||||
|
||||
npx --no-install lint-staged
|
||||
812
CHANGELOG.md
812
CHANGELOG.md
@@ -1,815 +1,3 @@
|
||||
#### v1.17.1 (2021-05-26)
|
||||
|
||||
##### Chores
|
||||
|
||||
* **deps:**
|
||||
* update dependency grunt to v1.4.1 (0e37bbfd)
|
||||
* update dependency jsdom to v16.6.0 (60170ad6)
|
||||
* update dependency eslint to v7.27.0 (298af98d)
|
||||
* update dependency eslint-plugin-import to v2.23.0 (1623ba4f)
|
||||
* update commitlint monorepo to v12.1.4 (4a01313d)
|
||||
* update commitlint monorepo to v12.1.3 (b82774c5)
|
||||
* update dependency eslint to v7.26.0 (d1418210)
|
||||
* update dependency lint-staged to v11 (1bf57d40)
|
||||
* update dependency mocha to v8.4.0 (461e187b)
|
||||
* update dependency eslint to v7.25.0 (32c20806)
|
||||
* update dependency grunt to v1.4.0 (a30deef3)
|
||||
* incrementing version number - v1.17.0 (75f7972b)
|
||||
* update changelog for v1.17.0 (4c441a1b)
|
||||
|
||||
##### Documentation Changes
|
||||
|
||||
* update API docs to better outline authentication options (6ef0c8e9)
|
||||
* update API authentication verbiage (d08d0c42)
|
||||
|
||||
##### New Features
|
||||
|
||||
* keep query string when redirecting category (77dde41f)
|
||||
* add req.query to flags.list/getCount (3d6bdeb3)
|
||||
* add filter:flags.getFlagIdsWithFilters (d35c64b1)
|
||||
* #9559, set order help text (f5847f4f)
|
||||
* add filter:user.getWatchedCategories (4afca690)
|
||||
* pass req.query to getUserDataByUserSlug (518157d9)
|
||||
* #9508, add cluster support (94c12e37)
|
||||
* #9551 (a3d6c56e)
|
||||
* add template to hook (1f3e6601)
|
||||
* add filter:account.getPostsFromUserSet (a2442ee9)
|
||||
* automatically attempt reconnection on window focus (8cc61f11)
|
||||
* #9533, allow redirect in build hooks (f6b583bb)
|
||||
* add _hooks metadata object to all hooks that have object-type params (46899cca)
|
||||
* add filter:categories.copySettingsFrom (d8e4fd4c)
|
||||
* guard against multiple resolves (084c9851)
|
||||
* #9511 send notifications on accept/reject (b40fc4b6)
|
||||
* `hidden` class to FOUC (2bfa63ae)
|
||||
* add filter:middleware.autoLocale (a478dc7e)
|
||||
* remove sync hooks support (01956af4)
|
||||
|
||||
##### Bug Fixes
|
||||
|
||||
* #9580, proper 404 when ajaxifying (9ebfdeb7)
|
||||
* lint (09f51792)
|
||||
* #9567 fix tests (951e71a0)
|
||||
* #9567, use regular 404 (5215c30a)
|
||||
* ioredis upgrade fix, maybe (1ce59508)
|
||||
* bug where interstitial errors were not properly passed to the front-end via req.flash (1d9cfe1e)
|
||||
* #9553, use same fields for user search results in acp (0551642a)
|
||||
* lint (e8c5c18a)
|
||||
* lint (ffa80163)
|
||||
* tests (fad5988e)
|
||||
* tests (074ee859)
|
||||
* wrong error message checked (a9bb1088)
|
||||
* #9507 session reroll causes socket.io to become confused (#9534) (ec6d1e23)
|
||||
* isObjectField(s) empty field (2c22b06f)
|
||||
* do not register SW for Safari until upstream fixes #9193 (ce5fea2a)
|
||||
* infinite scroll with small number of items #9524 (#9525) (cb1dd0a3)
|
||||
* #9519 unable to properly ajaxify to home on subfolder installs if anchor did not have a trailing slash (db48b952)
|
||||
* #9512, fix chat icon if no privileges (6ed8890c)
|
||||
* #9503, dont error in markUnread if room doesnt exist (308252f5)
|
||||
* use socket.request.headers (9e07efc1)
|
||||
* buildReqObject headers for socket.io calls (ed534f34)
|
||||
* **deps:**
|
||||
* update dependency sharp to v0.28.3 (963a9fe6)
|
||||
* update dependency ioredis to v4.27.3 (075dab27)
|
||||
* update dependency nodebb-theme-vanilla to v12.0.8 (#9574) (10290f54)
|
||||
* update dependency mongodb to v3.6.8 (#9573) (64935787)
|
||||
* update dependency postcss to v8.3.0 (ad4afd59)
|
||||
* update dependency nodebb-theme-persona to v11.0.20 (403bcfac)
|
||||
* update dependency nodebb-plugin-composer-default to v6.5.29 (8d7e4420)
|
||||
* update dependency mongodb to v3.6.7 (f29e4e87)
|
||||
* update dependency textcomplete to ^0.18.0 (9b7653cc)
|
||||
* update socket.io packages to v4.1.2 (#9563) (ca7c77bc)
|
||||
* update dependency nodebb-plugin-dbsearch to v5.0.2 (#9562) (2d0564cb)
|
||||
* update dependency nodebb-theme-slick to v1.4.7 (bf4aa50c)
|
||||
* update dependency nodebb-plugin-composer-default to v6.5.28 (4164b322)
|
||||
* update socket.io packages to v4.1.1 (155a7fb6)
|
||||
* update socket.io packages to v4.1.0 (53335677)
|
||||
* update dependency sharp to v0.28.2 (4bc07a08)
|
||||
* update dependency postcss to v8.2.15 (7770c2a1)
|
||||
* update dependency nodebb-theme-persona to v11.0.19 (3145c7d5)
|
||||
* update dependency nodebb-plugin-mentions to v2.13.11 (7e2ea4df)
|
||||
* update dependency nodebb-plugin-markdown to v8.12.10 (2ac5a085)
|
||||
* update dependency nodebb-plugin-markdown to v8.12.9 (ee3634cc)
|
||||
* update socket.io packages to v4.0.2 (ff98f854)
|
||||
* update dependency postcss to v8.2.14 (22ec1ea5)
|
||||
* update dependency sitemap to v7 (0389dd96)
|
||||
* update dependency nodebb-widget-essentials to v5.0.4 (19f1cbfc)
|
||||
* update dependency nodebb-theme-persona to v11.0.18 (33d91fde)
|
||||
* update dependency connect-redis to v5.2.0 (c0d54a06)
|
||||
* update dependency postcss to v8.2.13 (831e5c26)
|
||||
* update dependency postcss to v8.2.12 (38454df9)
|
||||
* **#9508:** switch to ioredis (#9545) (dd81dd03)
|
||||
|
||||
##### Refactors
|
||||
|
||||
* cli/upgrade async/await (#9558) (ac86937c)
|
||||
* bubble other errors (0096cf17)
|
||||
|
||||
##### Reverts
|
||||
|
||||
* sync hooks (5fe97b9c)
|
||||
|
||||
##### Tests
|
||||
|
||||
* fix tests (1029a06a)
|
||||
* fix redis tests (4e490f60)
|
||||
* add test for undefined fields in getObjectsFields (92de49be)
|
||||
|
||||
#### v1.17.0 (2021-04-22)
|
||||
|
||||
##### Breaking Changes
|
||||
|
||||
* add additional flag hooks [breaking] (00a68a95)
|
||||
* remove deprecated `User.emailConfirm` [breaking] (fb84c785)
|
||||
* remove deprecated plugin hook `filter:privileges:isUserAllowedTo` [breaking] (5a775e09)
|
||||
* remove deprecated plugin hook methods [breaking] (d41de481)
|
||||
* more removals of thumb specific backwards-compatibility [breaking] (cc0d562e)
|
||||
* remove deprecated `filter:admin/header.build` hook [breaking] (5f9f241e)
|
||||
* remove deprecated v2 style responses for thumbs upload route [breaking] (84dfdfe6)
|
||||
* remove deprecated getObject routes [breaking] (2ad0d0d0)
|
||||
* remove 'filters' and 'categories' from flag details API return [breaking] (8b72479f)
|
||||
* filtering logic of flags [breaking] (1603566b)
|
||||
* feature flag for auto-resolving a user's flags on ban [breaking] (6b1c97db)
|
||||
* allow interstitial callbacks to be async functions [breaking] (280285cd)
|
||||
|
||||
##### Chores
|
||||
|
||||
* **deps:**
|
||||
* update dependency jsdom to v16.5.3 (0f249aa7)
|
||||
* update dependency eslint to v7.24.0 (60c0c16f)
|
||||
* update dependency husky to v6 (f155f326)
|
||||
* update commitlint monorepo to v12.1.1 (b4d01388)
|
||||
* update dependency jsdom to v16.5.2 (5e2e7a58)
|
||||
* update dependency eslint to v7.23.0 (d600cd94)
|
||||
* update dependency husky to v5.2.0 (77f551a4)
|
||||
* update dependency jsdom to v16.5.1 (28ed579b)
|
||||
* update dependency eslint to v7.22.0 (775c3b91)
|
||||
* update dependency mocha to v8.3.2 (3ce731d8)
|
||||
* update dependency jsdom to v16.5.0 (fd926d61)
|
||||
* update dependency mocha to v8.3.1 (651c629f)
|
||||
* update dependency husky to v5.1.3 (8791b44e)
|
||||
* update dependency husky to v5.1.2 (5f061b94)
|
||||
* update commitlint monorepo to v12 (42f7cd52)
|
||||
* update dependency eslint to v7.21.0 (59518437)
|
||||
* update dependency husky to v5.1.1 (2551295c)
|
||||
* update dependency husky to v5.1.0 (dc06fe22)
|
||||
* update dependency eslint to v7.20.0 (9ec0b2ed)
|
||||
* update dependency mocha to v8.3.0 (73f07958)
|
||||
* update dependency husky to v5 (d89ccf26)
|
||||
* update dependency lint-staged to v10.5.4 (030ecffa)
|
||||
* update dependency eslint to v7.19.0 (3696a199)
|
||||
* incrementing version number - v1.17.0-beta.5 (42c4f963)
|
||||
* fix indent (6406e527)
|
||||
* benchpress 2.4.1 (3403635c)
|
||||
* remove log (a1ee1a2a)
|
||||
* incrementing version number - v1.17.0-beta.4 (91992240)
|
||||
* bump composer-default (289bfc0b)
|
||||
* up themes (d14ba1f4)
|
||||
* remove node 10 (8d3ec234)
|
||||
* bump composer-default to 6.5.20 (33fbfdfe)
|
||||
* incrementing version number - v1.17.0-beta.3 (6e8b1bb9)
|
||||
* add multiparty dep (ef3ec96a)
|
||||
* incrementing version number - v1.17.0-beta.2 (0c1945dc)
|
||||
* incrementing version number - v1.17.0-beta.1 (31872aac)
|
||||
* bump composer (30954789)
|
||||
* bump deps (#9335) (b9fd2c87)
|
||||
* incrementing version number - v1.17.0-beta.0 (b61257ef)
|
||||
* incrementing version number - v1.16.3-beta.0 (477157cc)
|
||||
* extra console.log (1ae8dda8)
|
||||
* up composer (1c9acef6)
|
||||
* eslint max-len (cc9d6fd0)
|
||||
* eslint no-restricted-syntax (5c2f0f05)
|
||||
* eslint prefer-rest-params, prefer-spread (115d19e2)
|
||||
* eslint prefer-destructuring (23f212a4)
|
||||
* eslint object-curly-newline (8d1462ff)
|
||||
* eslint function-paren-newline (62869bae)
|
||||
* eslint no-var, vars-on-top (dab3b235)
|
||||
* eslint prefer-arrow-callback (b56d9e12)
|
||||
* eslint prefer-template (707b55b6)
|
||||
* eslint import/newline-after-import (4ee0f145)
|
||||
* eslint no-script-url (9f6a682c)
|
||||
* eslint no-bitwise (dad01e30)
|
||||
* eslint rules matching existing styles (58528d1a)
|
||||
* fallbacks (74be1a59)
|
||||
* deprecation notices for plugins using plugin old hook methods (3052256d)
|
||||
* add deprecation notice in comments for ajaxify.loadExtraScripts (8b09292e)
|
||||
* incrementing version number - v1.16.2 (ea7f8381)
|
||||
* update changelog for v1.16.2 (d3883d4b)
|
||||
|
||||
##### Documentation Changes
|
||||
|
||||
* fixed typo (e7550673)
|
||||
* added comment re: #9305 (65c57c73)
|
||||
* update deprecation-removal version for plugin hook helper methods in 1.18.0 (15ba0abb)
|
||||
|
||||
##### New Features
|
||||
|
||||
* lang strings (9b71b087)
|
||||
* rate limit file uploads (a9978fcf)
|
||||
* filter flags by username #8489 (#9451) (8faa6e45)
|
||||
* roll session identifier on login, as security best practice (697ed3bf)
|
||||
* allow different slugs (4494728c)
|
||||
* remove sort again (fd3bc605)
|
||||
* update hook (f65d2162)
|
||||
* add reverse of recent to getSortedTopics (05f22361)
|
||||
* allow exists methods to work with arrays and single id (285aa365)
|
||||
* pass all data to filter:category.get (d16b45fd)
|
||||
* add action:posts.loaded (dbb59228)
|
||||
* rescheduling (editing ST) (#9445) (aa0137b1)
|
||||
* upgrade sharp (#9442) (f7f46e7c)
|
||||
* optional urlMethod param for loginStrategies (9e1f72a4)
|
||||
* add hooks to language loading (#9426) (344575dd)
|
||||
* doggy.gif (b06f0ea2)
|
||||
* allow adding sorted-list items from forms outside of modal (a3e95e79)
|
||||
* scheduled topics (#9399) (077330b7)
|
||||
* show link if category is a link (a94d9651)
|
||||
* make info page full width (dd12c83f)
|
||||
* allow optional fields argument on db.getObject(s) (#9385) (4327a09d)
|
||||
* closes #9380, add category filtering and topic tools to tag page (668508cc)
|
||||
* allow sync function (#9379) (34b9aaed)
|
||||
* allow filter functions that return promises or the data directly (e6c52cf2)
|
||||
* add resolve flag to post tools (52082e12)
|
||||
* hide revert button in ACP > Privileges until privileges change (4cbd13fd)
|
||||
* bring back static hook timeout (46270f9f)
|
||||
* upgrade connect-mongo, closes https://github.com/NodeBB/NodeBB/pull/9367 (3c60ccfd)
|
||||
* pass interstital errors to individual partials as well as to registerComplete (f71cb0e4)
|
||||
* add filter:plugins.firehook (5eb3132d)
|
||||
* copy default favicon if it doesn't exist (754283d3)
|
||||
* add missing translation keys (17184bfa)
|
||||
* allow missing (or non-array) middlewares argument in route helper methods (4b545085)
|
||||
* pass modified params, only affects filter hooks (e74df539)
|
||||
* add back topic id input (696c4895)
|
||||
* expose username validation logic to user lib, new hook `filter:username.check` (bfd512b9)
|
||||
* add $.deserialize to client side (e5133a78)
|
||||
* allow for settings.save/settings.load on client side (66196d2c)
|
||||
* remove promise-pollyfil (902a88c2)
|
||||
* category privilege API routes (c1b3079d)
|
||||
* change uploadCroppedPicture to use updateProfile as well (0af9d26f)
|
||||
* use updateProfile for picture change (a598abcd)
|
||||
* allow payload to be passed to emailer test method (1155b0c4)
|
||||
* add uid of user who created flag to action:flags.create (069ac60f)
|
||||
* new client-side hook `filter:api.options` to allow plugins to modify api requests (7d391d47)
|
||||
* keep notifs for one month, load 50 notifications instead of 30 (02f08111)
|
||||
* also pass in uid to `filter:email.prepare` (86b0c57d)
|
||||
* new hook `filter:email.prepare` (27ea3dcb)
|
||||
* new hook static:email.send (bf90d158)
|
||||
* show time info for upgrade scripts (14a6c349)
|
||||
* add dashboard sub-pages to ACP menu (73dc64d9)
|
||||
* recent logins sessions table in dashbaord subpage (2f89b0d7)
|
||||
* topics dashboard details subpage (e1ed514b)
|
||||
* update user list in dashboard/users on graph update (c57c7703)
|
||||
* show list of recent users in dashboard/users (cc938224)
|
||||
* req.query parsing and dynamically loading data instead (6fdcae73)
|
||||
* new hooks for notifications get/getCount (079a13d4)
|
||||
* allow hook unregistration, and temporary page-based hooks (d0136074)
|
||||
* report login statistics from analytics data, instead of its own zset (16d3c457)
|
||||
* track login sessions for admin dashboard reporting (9a9f366d)
|
||||
* track successful logins in analytics (504fd107)
|
||||
* pass user picture object into change_picture_modal (c96fd3b1)
|
||||
* add logout to invalid session (beb14273)
|
||||
* category search test (a592ebd1)
|
||||
* pass post object to filter:post.tools (ed3d9dcb)
|
||||
* allow defining a list of system tags (0e07f3c9)
|
||||
* add category search test, #9307 (bbaaead0)
|
||||
* add tag filter to getSortedTopics (9ce6f8ad)
|
||||
* ability to re-order topic thumbnails (7223074f)
|
||||
* add close button to topic thumbnail modal (db027170)
|
||||
* #9304, add category/topic/username to post queue notification emails (0738dae8)
|
||||
* add failing test for list append/prepend with list (#9303) (8f0386d9)
|
||||
* link to post-queue from topic event (a4b4a556)
|
||||
* post-queue topic event (8fd78ce5)
|
||||
* add post-queue cache (3f35fd33)
|
||||
* newsletter opt-in/out in UCP, closes #21 (3c7cd9a6)
|
||||
* load user posts/topics via xhr on infinitescroll (35954734)
|
||||
* #9294, put new categories at top (4b2bf12f)
|
||||
* add invalid event name to error message (670cde78)
|
||||
* new notifications load/loaded hooks on client side (7edc8f45)
|
||||
* pass req.session into buildReqObject (a6fa351b)
|
||||
* new hook `action:login.continue` (4f976390)
|
||||
* banned-users group (53e0d4d2)
|
||||
* #9109, ability to delete a post's diffs (eb642f40)
|
||||
* add .delete() method to api module (501441b7)
|
||||
* doc add description (cc560ca3)
|
||||
* add doc for query param (ed11e171)
|
||||
* #9234, add pagination to /api/recent/posts/:term? (fffdc4e0)
|
||||
* allow sorted-lists on multiple pages (d5d24594)
|
||||
* #9232, add profile picture into exported zip (f6cd2862)
|
||||
* new hook `filter:login.override`, deprecate `action:auth.overrideLogin` (b820d234)
|
||||
* guard password fields in login/register against accidental caps lock (4bb3b032)
|
||||
* ability to search categories, #8813 (34c42c6f)
|
||||
* restore action:script.load, allow modifying loaded module via static:script.init (05be1c66)
|
||||
* async/await redis connection (fdfbc902)
|
||||
* async/await psql connection (33bf1b0e)
|
||||
* add group name to csv event (672959c1)
|
||||
* **user:** icon background selector in change picture modal (95502124)
|
||||
* **remountable-routes:**
|
||||
* allow category and account routes to be remounted (9021f071)
|
||||
* allow /admin and /post to be remountable (f01af62b)
|
||||
* **topic-events:**
|
||||
* topic events GET route in write API (dc84559d)
|
||||
* server-side tests for topic events (449c379d)
|
||||
* clear out topic events when a topic is purged (0d4a3775)
|
||||
* client-side handling on topic event log (8e93bf73)
|
||||
* handle newest_to_oldest sort in topic events, WIP (882e6a15)
|
||||
* generic css for timeline-event (2293a07a)
|
||||
* support for uids in topic event payloads (611d1f87)
|
||||
* work in progress topic events logic and client-side implementation (ab2e1ecb)
|
||||
* **hooks:**
|
||||
* update action:ajaxify.end to use new hooks module (1d775721)
|
||||
* client-side hooks module (01c9b184)
|
||||
|
||||
##### Bug Fixes
|
||||
|
||||
* regress. rescheduling shouldn't add to sets that pinning removed… (#9477) (8b79c7f1)
|
||||
* logic is hard (4dd38446)
|
||||
* run in series (bc0ca61c)
|
||||
* wrong variable for cache (2e9efc0e)
|
||||
* accidentally committed this (13fa983e)
|
||||
* tests (eb240c90)
|
||||
* eslint (fa0c92a7)
|
||||
* use req.ip instead, since guests can upload as well (ea22cd30)
|
||||
* #9492, keep query params on redirect (36f119a9)
|
||||
* stripTags for editing sorted list items as well (93598982)
|
||||
* #9487, session data gathered during a session is lost upon login (1fee6a70)
|
||||
* failure on session reroll 🍣 test (f4c5050a)
|
||||
* registration interstitials not handling promise rejections properly (e845c34b)
|
||||
* stripHTMLTags for sorted list entries (75073c0e)
|
||||
* restore original behavior for up/downvoting when logged out (e50408b4)
|
||||
* let recent replies respect oldest/newest sort settings (60eed8d8)
|
||||
* #9483, fix events count display (6907837f)
|
||||
* escape flag reason (161081e9)
|
||||
* copy change on plugin activate to instruct admins to rebuild as well as restart (95d5359c)
|
||||
* updateCategoryTagsCount (2dc3283f)
|
||||
* #9473 (#9476) (036f935f)
|
||||
* #9474, load hooks on page load (1af34b43)
|
||||
* spec (d09cdc04)
|
||||
* #9466, don't call leaveRoom in maintenance mode (f32ea173)
|
||||
* exempt ST from being del/res via last main posts (#9468) (a0dd9080)
|
||||
* #9462, on install copy default favicon (784600d9)
|
||||
* #9463 (c5ae8a70)
|
||||
* #9465 (4041e786)
|
||||
* #9450 express session saved even if saveUninitialized explicitly passed in (9c52fd2e)
|
||||
* acp crash (cb53a64c)
|
||||
* #9447, include query params in previousUrl (536591f8)
|
||||
* thumb count not updated when uploading multiple thumbs at a time (1ad1787e)
|
||||
* change email button stays disabled if user submitted an invalid email (01f63e5d)
|
||||
* use app.logout() to clear session after deleting user (cfdef77b)
|
||||
* ./nodebb help with commander@7 (#9434) (2a03012e)
|
||||
* hide titleRaw for deleted topics as well (edf80cfb)
|
||||
* #9410, fix post queue (c5dda64f)
|
||||
* privilege tables (9052db93)
|
||||
* #9420, paginate after loading notifications (67b09cba)
|
||||
* hooks for alert animate, no more fadein/fadeout for reconnect alert (d9e20290)
|
||||
* #9414, use posts:view_deleted (e42b152f)
|
||||
* preserve order when changing parent (2ceda70a)
|
||||
* #9411 (3c4e93a3)
|
||||
* #9412 (cef58d1d)
|
||||
* #9406, update flag post tools (93c595d9)
|
||||
* typo in switch..case (d8ff9851)
|
||||
* #9404, show signatures if the target user has signature privilege (801570e4)
|
||||
* selector (ee69c1f8)
|
||||
* sorting when filtering by uid (75553b24)
|
||||
* allow local (and overridden) login strategies to pass Error objects back (98b72ca5)
|
||||
* category search not using uid (6aa60b63)
|
||||
* inf scroll with subfolder install (262e059f)
|
||||
* flicker on dashboard (2041b808)
|
||||
* #9398, crash on post flag (90d64fe1)
|
||||
* #9395, pass all data from client to Topics.reply (#9396) (a8f7b244)
|
||||
* lint (4ac38ab2)
|
||||
* #9394, fix guest handles (eb360351)
|
||||
* #9387, don't try to load undefined images (03e30634)
|
||||
* #9389, allow admins to add themselves to private groups (5c59354c)
|
||||
* #9386, add missing translation string (482641e3)
|
||||
* #9383, don't show deleted topic titles in inf scroll (e789fe8d)
|
||||
* #9378, crash on verifyToken if API Token settings not saved (null case error) (cc489708)
|
||||
* closes #9382, fix digest topic links (35700d16)
|
||||
* spec (1e1127bd)
|
||||
* regression from filter hook change (53f67ff3)
|
||||
* crash if unreadTopics is undefined (617f4730)
|
||||
* dont crash if login el doesnt exist (f45c0aab)
|
||||
* regression via c1b3079d93fb4c49ba62a4be5279b7bff8e5a54d (2a939aad)
|
||||
* change notification updateCount to use client-side hooks (84725130)
|
||||
* tests (39b0e0fb)
|
||||
* #9370, show correct teaser index if sorting is newest to oldest (9382fc6d)
|
||||
* don't copy if src doesn't exist (ebccc794)
|
||||
* #9362 best not to check file exists on every page load; copying favicon to uploads/system folder instead (771a8955)
|
||||
* #9362 (ad565495)
|
||||
* regression where login redirect for admin routes didn't go to local=1 (678e8f0f)
|
||||
* lint (f4f61b92)
|
||||
* if no in passed use "titles" to match header search (e787e6ea)
|
||||
* add back middleware.authenticateOrGuest (166d65a1)
|
||||
* request authentication called twice in account routes (e3b2c00d)
|
||||
* #9354, don't close quicksearch results if mouse is down on them (8a4c361e)
|
||||
* #9339, only log email errors once per digest, notification push (3aa26c4d)
|
||||
* winston.info (3f42d40c)
|
||||
* #9351 bad logic when inserting rows to privilege tables, also a missing tfoot :foot: (c5e25788)
|
||||
* app.parseAndTranslate to always return promise (c2650169)
|
||||
* bug where fallback window trigger was not firing if there were no hook listeners attached (1e579428)
|
||||
* bad assignment (c8b78654)
|
||||
* #9348 incorrect redirect via connect-ensure-login (fbe9215b)
|
||||
* bug where loginSeconds setting was ignored for local login (f806befd)
|
||||
* remove old dep (b58bacaf)
|
||||
* notif pruning (2737f653)
|
||||
* notification prune test (ca817631)
|
||||
* user icon text overflow in some cases (2b7d0b5a)
|
||||
* use components for toggleNavbar instead (114e3a1e)
|
||||
* allow interstitial callbacks to be functional (no cb required) (9bf94ad5)
|
||||
* don't publish before pubClient is connected (cdf5d18f)
|
||||
* remove unused async (48f1e265)
|
||||
* in setupPageRoute helper, buildHeader after plugin hooks have fired (984c9dd9)
|
||||
* timeago missing on table update (655e2c67)
|
||||
* wrong qs param, allow string to be passed to util.getDaysArray (f8e1a74c)
|
||||
* wrong call to sortedSetAdd (dbe5f702)
|
||||
* session not persisting to database in some scenarios (020f0b83)
|
||||
* allow hidden inputs in user settings page (beaac0a1)
|
||||
* use root context if buildAvatar context is undefined (b4c0b32b)
|
||||
* use bootbox module (fa91525a)
|
||||
* #9307, use _.flatten (25c8f026)
|
||||
* awaiting res.render in send404 controller > > A plugin wanted to use `response:rotuer.page` to 404 a specific page on some condition. res.render returns early in send404 and so must be awaited otherwise multiple responses will be sent (2fef4627)
|
||||
* do not overwrite `config.port` from URL, if it's already set (34096b73)
|
||||
* switch back to getSortedSetRange (8686fbfa)
|
||||
* settings v3 (91734a64)
|
||||
* another topic thumb test fix (782bef5e)
|
||||
* thumbs.associate logic fix + tests (7ebb6d30)
|
||||
* missing awaits, possible test fix (7665adf7)
|
||||
* #9301, dont call sitemapstream if there are no entries in categories/pages/topics.xml (9a6cf3d9)
|
||||
* properly incase its the same path (807b0d43)
|
||||
* numThumbs count on associate (76bcc0c9)
|
||||
* missing cache deletion calls for post-queue cache (1490b32d)
|
||||
* use of removed URL to get post data (36e8d251)
|
||||
* init topic events from webserver.js (b81508c4)
|
||||
* check null topics (b753c69c)
|
||||
* guard against null topics (58cd797e)
|
||||
* tests, new categories go to top now (fc90f32e)
|
||||
* #9292, messageobj.content already parsed (c953b1b3)
|
||||
* clear category cache on copy parent (765db86d)
|
||||
* delete category cache key on category create (ed3e9ce2)
|
||||
* typo (c61cc37b)
|
||||
* wait for event.log to finish before killing process (a5fa212f)
|
||||
* tests, only generate csrf_token on 404 gets (b6493f89)
|
||||
* #9287, generate csrf_token on 404 (94f72d60)
|
||||
* do not blindly escape a notification's bodyLong (783786cf)
|
||||
* pass jquery object in to action:notifications.loaded hook (16610b2d)
|
||||
* #9275, (0cca6893)
|
||||
* don't use global bootbox obj (cfa0d423)
|
||||
* remove console.log (550cd995)
|
||||
* move service worker back to relative_path/service-worker.js (fca17cb7)
|
||||
* spec (ab0ef442)
|
||||
* markread selector (a4878a5b)
|
||||
* position when scrolling up (3090a2ae)
|
||||
* cache key collision (e40af441)
|
||||
* tests breakage due to 67e3fb64981fe2310b17515e1f18c32021a5e983 (5c21c33e)
|
||||
* register returnTo logic to match login route (67e3fb64)
|
||||
* tests (492cbc62)
|
||||
* posts.uploads.sync dissociates uploaded thumbs of the main pid (f79aeef8)
|
||||
* update grammar on unban text (68da1c55)
|
||||
* privileges page - tweak icon position and width, group name wrapping (c729adeb)
|
||||
* autofocus on search field in ACP > Manage > Plugins (4af9c2fc)
|
||||
* openapi test specs (cabec378)
|
||||
* include admins (7c9674de)
|
||||
* include admins, limit to category mods, correct privilege name (eaf9d2e4)
|
||||
* http 200 test for api routes (bd583963)
|
||||
* invalid API call when unfollowing a user (58655e9a)
|
||||
* example (833c73e8)
|
||||
* #9127, scope service worker to relative_path for the forum (#9239) (2bc74cff)
|
||||
* update docs (4c12e0aa)
|
||||
* broken test after sorted-lists logic change (d6f60f45)
|
||||
* clear all locks on restart (9834f72f)
|
||||
* `action:admin.settingsLoaded` to use new hooks lib (5131eb6b)
|
||||
* crash on firing action hook that had no listeners registered (b0f5d5a5)
|
||||
* bug where `action:settings.sorted-list.loaded` fired early (1a04ec64)
|
||||
* regression where `filter:settings.set` no longer received sorted-lists (a8be6fb8)
|
||||
* #9231, fix redis pubsub connection (5bc1f5b4)
|
||||
* don't translate message on every ajaxify (a29dd21d)
|
||||
* tests (05c53394)
|
||||
* improper override of req.body.username in login logic (74199220)
|
||||
* full settings hash not passed through to action:settings.set (473d5f4a)
|
||||
* #9223, don't overwrite stmp settings (a5bf9779)
|
||||
* multiple sorted-lists do not save to the correct set (4029ec37)
|
||||
* pass module name to `static:script.init`, +comments (f8bf9e99)
|
||||
* handle delete and update for categories:name zset (e8429f50)
|
||||
* tests remove old routes (faeb6373)
|
||||
* removed object routes (d41ce873)
|
||||
* removed methods (647d3ba8)
|
||||
* incorrect return for Thumbs.get() if thumbs were disabled (7b090c58)
|
||||
* script failure if client-side page script does not exist (7da1b43f)
|
||||
* bug where `action:ajaxify.end` was never called if there were no init scripts (faf59603)
|
||||
* update js concatenation logic to bundle scripts.rjs into minfile regardless of build environment (8ff07bc1)
|
||||
* #7125, allow list for page route, configurable via plugin hook (f975063b)
|
||||
* error on flag list if no flag filters were saved in session (942d9247)
|
||||
* mod cid filter accidentally saved in session (35c92d0c)
|
||||
* more tests for #9217 (ce7c74b2)
|
||||
* tests for #9217 (f2a5cd0b)
|
||||
* missing return for #9217 (27cae0d5)
|
||||
* #9217, render 400 error page on bad access to /register (b2b1450e)
|
||||
* redis check compat tests (78896fc6)
|
||||
* registration completion overriding returnTo if it was already set (a186ea0f)
|
||||
* add missing user delete event types (5c1b7429)
|
||||
* missing option for user-deleteAccount on ACP Events page (1c420602)
|
||||
* **deps:**
|
||||
* update dependency html-to-text to v7.1.1 (427e4f47)
|
||||
* update dependency redis to v3.1.2 (35a4d0be)
|
||||
* update dependency validator to v13.6.0 (e3d5d8d7)
|
||||
* update dependency nodebb-plugin-composer-default to v6.5.27 (1b846271)
|
||||
* update dependency redis to v3.1.1 (286a63e3)
|
||||
* update dependency nodebb-theme-persona to v11.0.17 (51d58ce6)
|
||||
* update dependency nodebb-theme-vanilla to v12.0.7 (16a1ba57)
|
||||
* update dependency postcss to v8.2.10 (31cec2de)
|
||||
* update dependency nodebb-plugin-mentions to v2.13.9 (fe087806)
|
||||
* update dependency mongodb to v3.6.6 (#9467) (4264b236)
|
||||
* update dependency sharp to v0.28.1 (34cbc9e2)
|
||||
* update dependency nodebb-theme-persona to v11.0.16 (a8330b6d)
|
||||
* update dependency nodebb-theme-vanilla to v12.0.6 (c02310b8)
|
||||
* update dependency nodebb-theme-persona to v11.0.15 (316c71d7)
|
||||
* update socket.io packages to v4.0.1 (e7776f8d)
|
||||
* update dependency redis to v3.1.0 (fd9ff334)
|
||||
* update dependency nodebb-plugin-composer-default to v6.5.26 (#9446) (8d9afbc6)
|
||||
* update dependency postcss to v8.2.9 (6f51c460)
|
||||
* update dependency nodebb-theme-persona to v11.0.14 (#9443) (fecfcd81)
|
||||
* update dependency nodebb-theme-persona to v11.0.13 (#9437) (e5cc6e40)
|
||||
* update dependency nodebb-theme-slick to v1.4.6 (dfdb0050)
|
||||
* update dependency nodebb-theme-persona to v11.0.11 (27de58f2)
|
||||
* update dependency benchpressjs to v2.4.3 (382f75bc)
|
||||
* update dependency nodebb-plugin-composer-default to v6.5.25 (24236718)
|
||||
* update dependency nodebb-theme-vanilla to v12.0.5 (89973d80)
|
||||
* update dependency nodebb-plugin-composer-default to v6.5.24 (dec34446)
|
||||
* update dependency nodebb-theme-persona to v11.0.10 (f78b4ba6)
|
||||
* update dependency nodebb-plugin-composer-default to v6.5.23 (#9422) (e35d0741)
|
||||
* update dependency nodebb-theme-persona to v11.0.8 (124cb9d9)
|
||||
* update dependency benchpressjs to v2.4.2 (1dddcb49)
|
||||
* update dependency nodebb-plugin-mentions to v2.13.8 (d511216c)
|
||||
* update dependency connect-mongo to v4.4.1 (29ff5bb9)
|
||||
* update dependency nodebb-theme-persona to v11.0.7 (c5734063)
|
||||
* update dependency nodebb-theme-vanilla to v12.0.4 (#9409) (870e6c2c)
|
||||
* update dependency nodebb-theme-slick to v1.4.5 (#9408) (24be8642)
|
||||
* update dependency nodebb-theme-persona to v11.0.6 (#9407) (b50739c1)
|
||||
* update dependency nodebb-plugin-spam-be-gone to v0.7.9 (#9405) (9359cae9)
|
||||
* update dependency nodebb-theme-persona to v11.0.5 (47b2b97f)
|
||||
* update dependency nodebb-plugin-composer-default to v6.5.21 (#9401) (2f70ac5a)
|
||||
* update dependency mongodb to v3.6.5 (fcd887fd)
|
||||
* update dependency nodebb-plugin-composer-default to v6.5.19 (#9391) (1631f159)
|
||||
* update dependency nodebb-plugin-composer-default to v6.5.17 (#9384) (8d401760)
|
||||
* update dependency nodebb-theme-persona to v11.0.3 (27facadb)
|
||||
* update dependency socket.io-redis to v6.1.0 (adaddde6)
|
||||
* update dependency nodebb-plugin-composer-default to v6.5.16 (a98e92b4)
|
||||
* update dependency nodebb-plugin-markdown to v8.12.7 (#9371) (56b0bfd5)
|
||||
* update dependency nodebb-theme-vanilla to v12.0.2 (#9369) (8923d34c)
|
||||
* update dependency nodebb-theme-persona to v11.0.2 (#9368) (fa71c483)
|
||||
* update socket.io packages to v4 (#9363) (13f3c504)
|
||||
* update dependency postcss to v8.2.8 (680cf5ef)
|
||||
* update dependency nodebb-theme-persona to v10.5.17 (2645bf55)
|
||||
* update dependency connect-mongo to v4.3.1 (59459074)
|
||||
* update dependency connect-mongo to v4.3.0 (f388086a)
|
||||
* update dependency autoprefixer to v10.2.5 (4f4cdacc)
|
||||
* update dependency postcss to v8.2.7 (72db3754)
|
||||
* update dependency nodebb-plugin-composer-default to v6.5.13 (017af7cb)
|
||||
* update dependency jquery to v3.6.0 (dd6082a0)
|
||||
* update dependency connect-mongo to v4.2.2 (ec0912cc)
|
||||
* update dependency nodebb-plugin-spam-be-gone to v0.7.8 (#9337) (536bae70)
|
||||
* update dependency nodebb-plugin-composer-default to v6.5.12 (2674de01)
|
||||
* update socket.io packages to v3.1.2 (510eb1f9)
|
||||
* update dependency nodebb-theme-persona to v10.5.16 (217d3afd)
|
||||
* update dependency nodebb-plugin-emoji-android to v2.0.5 (e8209341)
|
||||
* update dependency sharp to v0.27.2 (c5231f10)
|
||||
* update dependency nodebb-theme-vanilla to v11.4.5 (8596dcc4)
|
||||
* update dependency nodebb-theme-persona to v10.5.15 (753ab0a0)
|
||||
* update dependency nodebb-theme-persona to v10.5.14 (ed503b80)
|
||||
* update dependency nodebb-theme-persona to v10.5.12 (ddd8fa31)
|
||||
* update dependency benchpressjs to v2.4.1 (4ee3a8e8)
|
||||
* update dependency nodebb-theme-persona to v10.5.10 (7f8fd4b0)
|
||||
* update dependency nodebb-theme-persona to v10.5.9 (5dd748c6)
|
||||
* require xregexp 5.0.1 (86e911ba)
|
||||
* update dependency xregexp to v5 (513cd1c3)
|
||||
* update dependency nodebb-theme-persona to v10.5.8 (54b4dc1d)
|
||||
* update dependency postcss to v8.2.6 (4d92af5a)
|
||||
* update dependency nodebb-theme-persona to v10.5.7 (#9288) (c2459fd5)
|
||||
* update dependency nodebb-plugin-composer-default to v6.5.10 (b312725f)
|
||||
* update dependency nodebb-theme-persona to v10.5.6 (4599144f)
|
||||
* update dependency nodebb-widget-essentials to v5.0.3 (#9284) (eb9f058f)
|
||||
* update dependency nodebb-plugin-composer-default to v6.5.9 (6e14014b)
|
||||
* update dependency nodebb-plugin-composer-default to v6.5.8 (674a31d1)
|
||||
* update dependency nodebb-theme-slick to v1.4.3 (#9278) (d3923585)
|
||||
* update dependency nodebb-theme-vanilla to v11.4.4 (#9279) (1f28e8c3)
|
||||
* update dependency nodebb-theme-persona to v10.5.5 (#9277) (a7b46adc)
|
||||
* update dependency connect-redis to v5.1.0 (#9276) (83a0b6b8)
|
||||
* update dependency nodebb-theme-persona to v10.5.4 (#9270) (dc145284)
|
||||
* update dependency nodebb-theme-vanilla to v11.4.3 (#9272) (2fda6774)
|
||||
* update dependency nodebb-theme-slick to v1.4.2 (2b12905d)
|
||||
* update dependency nodebb-theme-lavender to v5.2.1 (fb2f1143)
|
||||
* update dependency nodebb-theme-slick to v1.4.1 (#9262) (2cfab367)
|
||||
* update socket.io packages to v3.1.1 (#9253) (2147d386)
|
||||
* update dependency postcss to v8.2.5 (1fa0d4f4)
|
||||
* update dependency nodebb-plugin-emoji-android to v2.0.1 (42e365d9)
|
||||
* update dependency nodebb-plugin-markdown to v8.12.6 (4fd6027b)
|
||||
* update dependency nodebb-plugin-mentions to v2.13.7 (8a2fe3d9)
|
||||
* update dependency nodebb-theme-vanilla to v11.4.2 (2326e9a6)
|
||||
* update dependency nodebb-theme-persona to v10.5.3 (9245ffaf)
|
||||
* update dependency nodebb-plugin-dbsearch to v4.2.0 (389690c3)
|
||||
* update dependency nodebb-plugin-composer-default to v6.5.7 (13e12c95)
|
||||
* update dependency json2csv to v5.0.6 (0aa8e03f)
|
||||
* bump theme deps for #9244 (44019e28)
|
||||
* update dependency mongodb to v3.6.4 (56e4e56b)
|
||||
* update dependency nodebb-theme-persona to v10.5.1 (04411449)
|
||||
* update dependency nodebb-theme-vanilla to v11.4.0 (#9238) (897d29ec)
|
||||
* update dependency nodebb-theme-slick to v1.4.0 (#9237) (8e2deab4)
|
||||
* update dependency nodebb-theme-persona to v10.5.0 (#9236) (4f842a79)
|
||||
* update dependency nodebb-theme-lavender to v5.2.0 (47fd1634)
|
||||
* update dependency nodebb-plugin-dbsearch to v4.1.3 (1e10ebfb)
|
||||
* update dependency nodebb-plugin-composer-default to v6.5.6 (0e2b329b)
|
||||
* update dependency autoprefixer to v10.2.4 (6c3b1fde)
|
||||
* update dependency nodebb-plugin-markdown to v8.12.5 (05901fcd)
|
||||
* update dependency nodebb-theme-persona to v10.4.1 (a9b3fb37)
|
||||
* update dependency sharp to v0.27.1 (a90773a6)
|
||||
* bump persona to get timeline style (ca14c0e2)
|
||||
* update dependency postcss to v8.2.4 (5b2f0be0)
|
||||
* update dependency autoprefixer to v10.2.3 (d99cb1cf)
|
||||
* update dependency postcss-clean to v1.2.0 (4232d97b)
|
||||
* **#9315:** api v3 post, put, del JSON (0d59fe3d)
|
||||
* **remountable-routes:**
|
||||
* more fixes to remountable routes (9d17f397)
|
||||
* bug with user routes remounting to itself (bc68e990)
|
||||
* **#9252:** pass site domain to nodemailer (#9254) (5e5d37c3)
|
||||
* **topic-events:**
|
||||
* topicEvents.init() test (aa8b84bb)
|
||||
* repeated invocations of Posts.addTopicEvents caused dupes to be added to DOM (df2fdd56)
|
||||
* **hooks:**
|
||||
* bug where hook firing would fail if there were no listeners (efff8e2a)
|
||||
* fallback handling for core invocations of hooks.fire (412d2858)
|
||||
|
||||
##### Other Changes
|
||||
|
||||
* schema docs for new ACP dashboard subpage routes (0804d547)
|
||||
|
||||
##### Performance Improvements
|
||||
|
||||
* increase batch size for notifs, run parallel (728ac5ff)
|
||||
* faster category tags upgrade script (0dad568c)
|
||||
* use setObjectBulk (95033ef7)
|
||||
* make upgrade script faster (a07509f7)
|
||||
* make upgrade script faster (0959b124)
|
||||
* cache base_url (cf4002bc)
|
||||
* single call to get digest topics, dont send duplicate topics (5ce28207)
|
||||
* single db call to add all uids (90d5c9da)
|
||||
* make digests a little bit faster (0185ea1b)
|
||||
* only load thumbs for topics that actually have thumbs (7eebcbdb)
|
||||
|
||||
##### Refactors
|
||||
|
||||
* make debug handler async (1db8920b)
|
||||
* widgets (#9471) (397baf02)
|
||||
* style, no need to convert length to string (d00268c9)
|
||||
* deprecate action:script.load, use filter:script.load instead (d1685600)
|
||||
* remove uncessary check (f316c4d4)
|
||||
* remove async.each/reduce from hooks for better stack traces (d05d7091)
|
||||
* use hooks.fire (0d3979ef)
|
||||
* fix variable name (1982edfd)
|
||||
* account edit logic and template, closes #9364 (98bf4064)
|
||||
* automatically authenticate all requests setup through route helpers (#9357) (7da061f0)
|
||||
* async listen testSocket (0021c601)
|
||||
* remove startsWith/endsWith (48bc23c0)
|
||||
* app.parseAndTranslate to return promise if no callback passed (b5a6a314)
|
||||
* privileges, export modules directly (#9325) (293b7c26)
|
||||
* have Graph.init and Graph.update return promises (3fa2e3ce)
|
||||
* abstract out some client side dashboard code into modules, analytics subpages for users, topics, and logins (f561799f)
|
||||
* move picture change client-side logic to its own rjs module (28f6931e)
|
||||
* remove dupe code (5286f208)
|
||||
* thumbs.associate accepts both relative path and url in path arg (3e6640ef)
|
||||
* move post queue retrival code to posts.getQueuedPosts (36f20211)
|
||||
* call topic events init from within file itself (6074a0fb)
|
||||
* improvements (970bd06f)
|
||||
* update dom after diff deletion better (a2a7557c)
|
||||
* removed 3 lines (4447a64e)
|
||||
* use Map to track sorted lists in Settings.set() (65de2e76)
|
||||
* **user:** all plugins to change list of icon background colours (fbccf6e2)
|
||||
* **remountable-routes:**
|
||||
* rename `src/routes/accounts.js` to `src/routes/user.js` to better match the route prefix (1f28713f)
|
||||
* allow certain route prefixes to be mounted elsewhere (92758ec5)
|
||||
* **topic-events:**
|
||||
* expose addTopicEvents method in topic posts lib (9559fad8)
|
||||
* break out some logic in events.get into local modifyEvent method (cec3fc93)
|
||||
* fire topic event logging in topics/tools instead, pass uid into payload (425eca14)
|
||||
* **hooks:**
|
||||
* deprecate `action:script.load` client-side hook (8e5687a4)
|
||||
* better error handling (e7bd038d)
|
||||
|
||||
##### Reverts
|
||||
|
||||
* revert tag sort (f9df6431)
|
||||
* change toPid truthy (56523aa1)
|
||||
* bring back backwards compat (a1c01446)
|
||||
|
||||
##### Code Style Changes
|
||||
|
||||
* eslint (b5ce8d25)
|
||||
* **remountable-routes:** abstract removable routes code to a separate local fn (16c1d6e9)
|
||||
|
||||
##### Tests
|
||||
|
||||
* remove logs (435067aa)
|
||||
* clear cache between runs, require middleware later in helpers (2ea468da)
|
||||
* log (d15e2710)
|
||||
* remove equals (354e0a82)
|
||||
* test times (2f401d7d)
|
||||
* log (80ef1082)
|
||||
* added test for session id reroll on login (a3a7ab3a)
|
||||
* add missing test (8ef38cb2)
|
||||
* double filter test (70a653d0)
|
||||
* admin/manage/users tests (0e67ab01)
|
||||
* fix spec for topic thumbs (4c078084)
|
||||
* added missing properties to topicObject (1d9ade4c)
|
||||
* added missing test file (b31f6dd2)
|
||||
* topic reordering tests (ad54b174)
|
||||
* additional tests for topic thumbs (50664487)
|
||||
* added more topic thumbnail tests (28b30134)
|
||||
* post diff deletion tests (72b050b4)
|
||||
* **user:** added additional tests for icon background colour (d3a9e76a)
|
||||
|
||||
#### v1.16.2 (2021-01-21)
|
||||
|
||||
##### Breaking Changes
|
||||
|
||||
* unescape header navigation originalRoute [breaking] (6cb5888c)
|
||||
* allow override of local fns in login controller, 400 instead of 500 for wrong login type [breaking] (1cf0032d)
|
||||
|
||||
##### Chores
|
||||
|
||||
* **deps:**
|
||||
* update dependency husky to v4.3.8 (a6f5de86)
|
||||
* update dependency eslint to v7.18.0 (afbef95f)
|
||||
* update dependency husky to v4.3.7 (d3e041e2)
|
||||
* incrementing version number - v1.16.2-beta.0 (43ff8e41)
|
||||
* incrementing version number - v1.16.1 (e3cd7a23)
|
||||
* update changelog for v1.16.1 (b6d71710)
|
||||
|
||||
##### New Features
|
||||
|
||||
* add filter:email.cancel to allow plugins to cancel sending emails (c2e23706)
|
||||
* grant plugins the ability to specify options to the SSO handler (ab11435e)
|
||||
* add unread-count badge if navigator contains /flags route (c07e1e16)
|
||||
* handle HTTP 429 as a response code (8bbb3208)
|
||||
* add write API route for checking login credentials (56f929ed)
|
||||
* #8813, faster category search dropdown (072a0e32)
|
||||
* **api:** schema definition for new credential checking route (0da28432)
|
||||
|
||||
##### Bug Fixes
|
||||
|
||||
* **deps:**
|
||||
* update dependency bootbox to v5 (#8751) (b5cb2f8b)
|
||||
* update dependency nodebb-theme-persona to v10.3.19 (f16cdc9f)
|
||||
* update socket.io packages to v3.1.0 (3d1224e1)
|
||||
* update dependency nodebb-theme-slick to v1.3.8 (1901ecb2)
|
||||
* update dependency sortablejs to v1.13.0 (36069da2)
|
||||
* update dependency autoprefixer to v10.2.1 (5b3c48fd)
|
||||
* https://github.com/NodeBB/nodebb-plugin-webhooks/issues/3 (c608b0e8)
|
||||
* restored sanity checks for post move socket calls (d85ad10d)
|
||||
* don't chagne scrollTop if at the top of page (0fa4c11e)
|
||||
* #9206, fix double escaped arguments (1590cdf1)
|
||||
* regression caused by 77ab46686db62871f149419a368c35628453884e (f5fcd232)
|
||||
* don't crash if fullname is not a string (4fb90787)
|
||||
* #9204, bypass groupname length check for system group in upgrade script (00ba89b6)
|
||||
* add missing await (9938a139)
|
||||
* ssoState passed to strategies even if not called for (9b289eca)
|
||||
* use max (0a471b76)
|
||||
* keep 60 topics minimum on topic list (c30b40ab)
|
||||
* access checks for tags and thumbs get route (77ab4668)
|
||||
* #9194 global mods unable to pin or unpin topics (c0fb1cb5)
|
||||
* #9192, exit after logging error (ef16cd2e)
|
||||
* make sure inviter user exists (69419571)
|
||||
* #9178 missing language strings (and fallbacks) for post-queue (a407a51d)
|
||||
* #9185, fix string boolean values (89e6c75d)
|
||||
* test for topicThumbs (e817d5be)
|
||||
* #9184 proper relative_path usage in topic thumbs.get (66da6bcd)
|
||||
* #9169, re-adding v2-style behaviour so as to not break the API... yet (b742229e)
|
||||
* #9177, handled multiple deleted users properly (eaf62d39)
|
||||
* broken test caused by errant .pop(), missing await (4ede18ce)
|
||||
* missing error message (d83d40cf)
|
||||
* test for https://github.com/NodeBB/NodeBB/pull/9180 (8ece64ab)
|
||||
* #9176, limit description size (da546970)
|
||||
* broken test due to change in response code (9534d956)
|
||||
* return a user object, not an array of user objects (in v3 login check route) (97d678fd)
|
||||
* bad execution flow in utilities.login (8c86f5bc)
|
||||
* missing breadcrumbs in schema (87a7d85e)
|
||||
* random loadFiles added by errant vscode autocompletion (53422413)
|
||||
* add missing breadcrumb on /user/<slug>/categories (6cbb77af)
|
||||
* `--help` usage info (a51c5698)
|
||||
|
||||
##### Performance Improvements
|
||||
|
||||
* use only required calls (f0dd302c)
|
||||
|
||||
##### Refactors
|
||||
|
||||
* **api:**
|
||||
* post move to write API (966c4117)
|
||||
* post diffs to use write API (e118e59c)
|
||||
* change var to const (1374e0ee)
|
||||
* single remove call (25ab99b9)
|
||||
* flags lib to have a separate getFlagIdsWithFilters method (6a1311b4)
|
||||
* split out logic dedicated to calculating unread counts, to a separate local method (03a0e72f)
|
||||
|
||||
##### Code Style Changes
|
||||
|
||||
* update codeclimate config to be less sensitive to duplicate code blocks (fdf03472)
|
||||
|
||||
#### v1.16.1 (2021-01-06)
|
||||
|
||||
##### Chores
|
||||
|
||||
49
Gruntfile.js
49
Gruntfile.js
@@ -2,27 +2,24 @@
|
||||
|
||||
const path = require('path');
|
||||
const nconf = require('nconf');
|
||||
|
||||
nconf.argv().env({
|
||||
separator: '__',
|
||||
});
|
||||
const winston = require('winston');
|
||||
const { fork } = require('child_process');
|
||||
|
||||
const { env } = process;
|
||||
let worker;
|
||||
const fork = require('child_process').fork;
|
||||
const env = process.env;
|
||||
var worker;
|
||||
|
||||
env.NODE_ENV = env.NODE_ENV || 'development';
|
||||
|
||||
const configFile = path.resolve(__dirname, nconf.any(['config', 'CONFIG']) || 'config.json');
|
||||
const prestart = require('./src/prestart');
|
||||
|
||||
prestart.loadConfig(configFile);
|
||||
|
||||
const db = require('./src/database');
|
||||
var db = require('./src/database');
|
||||
|
||||
module.exports = function (grunt) {
|
||||
const args = [];
|
||||
var args = [];
|
||||
|
||||
if (!grunt.option('verbose')) {
|
||||
args.push('--log-level=info');
|
||||
@@ -39,7 +36,7 @@ module.exports = function (grunt) {
|
||||
grunt.registerTask('default', ['watch']);
|
||||
|
||||
grunt.registerTask('init', async function () {
|
||||
const done = this.async();
|
||||
var done = this.async();
|
||||
let plugins = [];
|
||||
if (!process.argv.includes('--core')) {
|
||||
await db.init();
|
||||
@@ -53,22 +50,22 @@ module.exports = function (grunt) {
|
||||
}
|
||||
}
|
||||
|
||||
const styleUpdated_Client = plugins.map(p => `node_modules/${p}/*.less`)
|
||||
.concat(plugins.map(p => `node_modules/${p}/*.css`))
|
||||
.concat(plugins.map(p => `node_modules/${p}/+(public|static|less)/**/*.less`))
|
||||
.concat(plugins.map(p => `node_modules/${p}/+(public|static)/**/*.css`));
|
||||
const styleUpdated_Client = plugins.map(p => 'node_modules/' + p + '/*.less')
|
||||
.concat(plugins.map(p => 'node_modules/' + p + '/*.css'))
|
||||
.concat(plugins.map(p => 'node_modules/' + p + '/+(public|static|less)/**/*.less'))
|
||||
.concat(plugins.map(p => 'node_modules/' + p + '/+(public|static)/**/*.css'));
|
||||
|
||||
const styleUpdated_Admin = plugins.map(p => `node_modules/${p}/*.less`)
|
||||
.concat(plugins.map(p => `node_modules/${p}/*.css`))
|
||||
.concat(plugins.map(p => `node_modules/${p}/+(public|static|less)/**/*.less`))
|
||||
.concat(plugins.map(p => `node_modules/${p}/+(public|static)/**/*.css`));
|
||||
const styleUpdated_Admin = plugins.map(p => 'node_modules/' + p + '/*.less')
|
||||
.concat(plugins.map(p => 'node_modules/' + p + '/*.css'))
|
||||
.concat(plugins.map(p => 'node_modules/' + p + '/+(public|static|less)/**/*.less'))
|
||||
.concat(plugins.map(p => 'node_modules/' + p + '/+(public|static)/**/*.css'));
|
||||
|
||||
const clientUpdated = plugins.map(p => `node_modules/${p}/+(public|static)/**/*.js`);
|
||||
const serverUpdated = plugins.map(p => `node_modules/${p}/*.js`)
|
||||
.concat(plugins.map(p => `node_modules/${p}/+(lib|src)/**/*.js`));
|
||||
const clientUpdated = plugins.map(p => 'node_modules/' + p + '/+(public|static)/**/*.js');
|
||||
const serverUpdated = plugins.map(p => 'node_modules/' + p + '/*.js')
|
||||
.concat(plugins.map(p => 'node_modules/' + p + '/+(lib|src)/**/*.js'));
|
||||
|
||||
const templatesUpdated = plugins.map(p => `node_modules/${p}/+(public|static|templates)/**/*.tpl`);
|
||||
const langUpdated = plugins.map(p => `node_modules/${p}/+(public|static|languages)/**/*.json`);
|
||||
const templatesUpdated = plugins.map(p => 'node_modules/' + p + '/+(public|static|templates)/**/*.tpl');
|
||||
const langUpdated = plugins.map(p => 'node_modules/' + p + '/+(public|static|languages)/**/*.json');
|
||||
|
||||
grunt.config(['watch'], {
|
||||
styleUpdated_Client: {
|
||||
@@ -164,8 +161,8 @@ module.exports = function (grunt) {
|
||||
grunt.task.run('init');
|
||||
|
||||
grunt.event.removeAllListeners('watch');
|
||||
grunt.event.on('watch', (action, filepath, target) => {
|
||||
let compiling;
|
||||
grunt.event.on('watch', function update(action, filepath, target) {
|
||||
var compiling;
|
||||
if (target === 'styleUpdated_Client') {
|
||||
compiling = 'clientCSS';
|
||||
} else if (target === 'styleUpdated_Admin') {
|
||||
@@ -183,7 +180,7 @@ module.exports = function (grunt) {
|
||||
return run();
|
||||
}
|
||||
|
||||
require('./src/meta/build').build([compiling], (err) => {
|
||||
require('./src/meta/build').build([compiling], function (err) {
|
||||
if (err) {
|
||||
winston.error(err.stack);
|
||||
}
|
||||
@@ -202,7 +199,7 @@ function addBaseThemes(plugins) {
|
||||
let baseTheme;
|
||||
do {
|
||||
try {
|
||||
baseTheme = require(`${themeId}/theme`).baseTheme;
|
||||
baseTheme = require(themeId + '/theme').baseTheme;
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
}
|
||||
|
||||
4
app.js
4
app.js
@@ -22,7 +22,6 @@
|
||||
require('./require-main');
|
||||
|
||||
const nconf = require('nconf');
|
||||
|
||||
nconf.argv().env({
|
||||
separator: '__',
|
||||
});
|
||||
@@ -41,7 +40,6 @@ const configFile = path.resolve(__dirname, nconf.any(['config', 'CONFIG']) || 'c
|
||||
const configExists = file.existsSync(configFile) || (nconf.get('url') && nconf.get('secret') && nconf.get('database'));
|
||||
|
||||
const prestart = require('./src/prestart');
|
||||
|
||||
prestart.loadConfig(configFile);
|
||||
prestart.setupWinston();
|
||||
prestart.versionCheck();
|
||||
@@ -49,7 +47,7 @@ winston.verbose('* using configuration stored in: %s', configFile);
|
||||
|
||||
if (!process.send) {
|
||||
// If run using `node app`, log GNU copyright info along with server info
|
||||
winston.info(`NodeBB v${nconf.get('version')} Copyright (C) 2013-${(new Date()).getFullYear()} NodeBB Inc.`);
|
||||
winston.info('NodeBB v' + nconf.get('version') + ' Copyright (C) 2013-' + (new Date()).getFullYear() + ' NodeBB Inc.');
|
||||
winston.info('This program comes with ABSOLUTELY NO WARRANTY.');
|
||||
winston.info('This is free software, and you are welcome to redistribute it under certain conditions.');
|
||||
winston.info('');
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"description": "Announcements regarding our community",
|
||||
"descriptionParsed": "<p>Announcements regarding our community</p>\n",
|
||||
"bgColor": "#fda34b",
|
||||
"color": "#ffffff",
|
||||
"color": "#fff",
|
||||
"icon" : "fa-bullhorn",
|
||||
"order": 1
|
||||
},
|
||||
@@ -13,7 +13,7 @@
|
||||
"description": "A place to talk about whatever you want",
|
||||
"descriptionParsed": "<p>A place to talk about whatever you want</p>\n",
|
||||
"bgColor": "#59b3d0",
|
||||
"color": "#ffffff",
|
||||
"color": "#fff",
|
||||
"icon" : "fa-comments-o",
|
||||
"order": 2
|
||||
},
|
||||
@@ -22,7 +22,7 @@
|
||||
"description": "Blog posts from individual members",
|
||||
"descriptionParsed": "<p>Blog posts from individual members</p>\n",
|
||||
"bgColor": "#86ba4b",
|
||||
"color": "#ffffff",
|
||||
"color": "#fff",
|
||||
"icon" : "fa-newspaper-o",
|
||||
"order": 4
|
||||
},
|
||||
@@ -31,7 +31,7 @@
|
||||
"description": "Got a question? Ask away!",
|
||||
"descriptionParsed": "<p>Got a question? Ask away!</p>\n",
|
||||
"bgColor": "#e95c5a",
|
||||
"color": "#ffffff",
|
||||
"color": "#fff",
|
||||
"icon" : "fa-question",
|
||||
"order": 3
|
||||
}
|
||||
|
||||
@@ -19,27 +19,22 @@
|
||||
"chatEditDuration": 0,
|
||||
"chatDeleteDuration": 0,
|
||||
"chatMessageDelay": 200,
|
||||
"notificationSendDelay": 60,
|
||||
"newbiePostDelayThreshold": 3,
|
||||
"postQueue": 0,
|
||||
"postQueueReputationThreshold": 0,
|
||||
"groupsExemptFromPostQueue": ["administrators", "Global Moderators"],
|
||||
"minimumPostLength": 8,
|
||||
"maximumPostLength": 32767,
|
||||
"systemTags": "",
|
||||
"minimumTagsPerTopic": 0,
|
||||
"maximumTagsPerTopic": 5,
|
||||
"minimumTagLength": 3,
|
||||
"maximumTagLength": 15,
|
||||
"undoTimeout": 10000,
|
||||
"allowTopicsThumbnail": 1,
|
||||
"registrationType": "normal",
|
||||
"registrationApprovalType": "normal",
|
||||
"allowAccountDelete": 1,
|
||||
"privateUploads": 0,
|
||||
"allowedFileExtensions": "png,jpg,bmp,txt",
|
||||
"uploadRateLimitThreshold": 10,
|
||||
"uploadRateLimitCooldown": 60,
|
||||
"allowUserHomePage": 1,
|
||||
"allowMultipleBadges": 0,
|
||||
"maximumFileSize": 2048,
|
||||
@@ -106,7 +101,6 @@
|
||||
"maxPostsPerPage": 20,
|
||||
"topicsPerPage": 20,
|
||||
"postsPerPage": 20,
|
||||
"categoriesPerPage": 50,
|
||||
"userSearchResultsPerPage": 50,
|
||||
"maximumGroupNameLength": 255,
|
||||
"maximumGroupTitleLength": 40,
|
||||
|
||||
@@ -14,7 +14,7 @@ const questions = {
|
||||
};
|
||||
|
||||
module.exports = async function (config) {
|
||||
winston.info(`\nNow configuring ${config.database} database:`);
|
||||
winston.info('\nNow configuring ' + config.database + ' database:');
|
||||
const databaseConfig = await getDatabaseConfig(config);
|
||||
return saveDatabaseConfig(config, databaseConfig);
|
||||
};
|
||||
@@ -40,7 +40,7 @@ async function getDatabaseConfig(config) {
|
||||
}
|
||||
return await promptGet(questions.postgres);
|
||||
}
|
||||
throw new Error(`unknown database : ${config.database}`);
|
||||
throw new Error('unknown database : ' + config.database);
|
||||
}
|
||||
|
||||
function saveDatabaseConfig(config, databaseConfig) {
|
||||
@@ -79,11 +79,11 @@ function saveDatabaseConfig(config, databaseConfig) {
|
||||
ssl: databaseConfig['postgres:ssl'],
|
||||
};
|
||||
} else {
|
||||
throw new Error(`unknown database : ${config.database}`);
|
||||
throw new Error('unknown database : ' + config.database);
|
||||
}
|
||||
|
||||
const allQuestions = questions.redis.concat(questions.mongo).concat(questions.postgres);
|
||||
for (let x = 0; x < allQuestions.length; x += 1) {
|
||||
for (var x = 0; x < allQuestions.length; x += 1) {
|
||||
delete config[allQuestions[x].name];
|
||||
}
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"name": "nodebb",
|
||||
"license": "GPL-3.0",
|
||||
"description": "NodeBB Forum",
|
||||
"version": "1.17.2",
|
||||
"version": "1.16.2-beta.2",
|
||||
"homepage": "http://www.nodebb.org",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -11,8 +11,8 @@
|
||||
"main": "app.js",
|
||||
"scripts": {
|
||||
"start": "node loader.js",
|
||||
"lint": "eslint --cache ./nodebb .",
|
||||
"test": "nyc --reporter=html --reporter=text-summary mocha",
|
||||
"lint": "npx eslint --cache ./nodebb .",
|
||||
"test": "npx nyc --reporter=html --reporter=text-summary npx mocha",
|
||||
"coverage": "nyc report --reporter=text-lcov > ./coverage/lcov.info",
|
||||
"coveralls": "nyc report --reporter=text-lcov | coveralls && rm -r coverage"
|
||||
},
|
||||
@@ -22,148 +22,156 @@
|
||||
"test/*"
|
||||
]
|
||||
},
|
||||
"husky": {
|
||||
"hooks": {
|
||||
"pre-commit": "npx lint-staged",
|
||||
"commit-msg": "npx commitlint -E HUSKY_GIT_PARAMS"
|
||||
}
|
||||
},
|
||||
"lint-staged": {
|
||||
"*.js": [
|
||||
"eslint --fix"
|
||||
"eslint --fix",
|
||||
"git add"
|
||||
]
|
||||
},
|
||||
"dependencies": {
|
||||
"@adactive/bootstrap-tagsinput": "^0.8.2",
|
||||
"ace-builds": "^1.4.12",
|
||||
"archiver": "^5.2.0",
|
||||
"ace-builds": "^1.4.9",
|
||||
"archiver": "^5.0.0",
|
||||
"async": "^3.2.0",
|
||||
"autoprefixer": "10.2.6",
|
||||
"autoprefixer": "10.2.1",
|
||||
"bcryptjs": "2.4.3",
|
||||
"benchpressjs": "2.4.3",
|
||||
"benchpressjs": "2.4.0",
|
||||
"body-parser": "^1.19.0",
|
||||
"bootbox": "5.5.2",
|
||||
"bootbox": "4.4.0",
|
||||
"bootstrap": "^3.4.1",
|
||||
"chart.js": "^2.9.4",
|
||||
"chart.js": "^2.9.3",
|
||||
"cli-graph": "^3.2.2",
|
||||
"clipboard": "^2.0.6",
|
||||
"colors": "^1.4.0",
|
||||
"commander": "^7.1.0",
|
||||
"commander": "^6.0.0",
|
||||
"compare-versions": "3.6.0",
|
||||
"compression": "^1.7.4",
|
||||
"connect-ensure-login": "^0.1.1",
|
||||
"connect-flash": "^0.1.1",
|
||||
"connect-mongo": "4.4.1",
|
||||
"connect-mongo": "3.2.0",
|
||||
"connect-multiparty": "^2.2.0",
|
||||
"connect-pg-simple": "^6.2.1",
|
||||
"connect-redis": "6.0.0",
|
||||
"connect-pg-simple": "^6.1.0",
|
||||
"connect-redis": "5.0.0",
|
||||
"cookie-parser": "^1.4.5",
|
||||
"cron": "^1.8.2",
|
||||
"cropperjs": "^1.5.11",
|
||||
"cropperjs": "^1.5.6",
|
||||
"csurf": "^1.11.0",
|
||||
"daemon": "^1.1.0",
|
||||
"diff": "^5.0.0",
|
||||
"express": "^4.17.1",
|
||||
"express-session": "^1.17.1",
|
||||
"express-useragent": "^1.0.15",
|
||||
"graceful-fs": "^4.2.6",
|
||||
"helmet": "^4.4.1",
|
||||
"html-to-text": "7.1.1",
|
||||
"express-session": "^1.17.0",
|
||||
"express-useragent": "^1.0.13",
|
||||
"graceful-fs": "^4.2.3",
|
||||
"helmet": "^4.0.0",
|
||||
"html-to-text": "6.0.0",
|
||||
"ipaddr.js": "^2.0.0",
|
||||
"jquery": "3.6.0",
|
||||
"jquery": "3.5.1",
|
||||
"jquery-deserialize": "2.0.0-rc1",
|
||||
"jquery-form": "4.3.0",
|
||||
"jquery-serializeobject": "1.0.0",
|
||||
"jquery-ui": "1.12.1",
|
||||
"jsesc": "3.0.2",
|
||||
"json2csv": "5.0.6",
|
||||
"json2csv": "5.0.5",
|
||||
"jsonwebtoken": "^8.5.1",
|
||||
"less": "^3.11.1",
|
||||
"lodash": "^4.17.21",
|
||||
"logrotate-stream": "^0.2.7",
|
||||
"lodash": "^4.17.15",
|
||||
"logrotate-stream": "^0.2.6",
|
||||
"lru-cache": "6.0.0",
|
||||
"material-design-lite": "^1.3.0",
|
||||
"mime": "^2.5.2",
|
||||
"mime": "^2.4.4",
|
||||
"mkdirp": "^1.0.4",
|
||||
"mongodb": "3.6.10",
|
||||
"mongodb": "3.6.3",
|
||||
"morgan": "^1.10.0",
|
||||
"mousetrap": "^1.6.5",
|
||||
"multiparty": "4.2.2",
|
||||
"@nodebb/bootswatch": "3.4.2",
|
||||
"nconf": "^0.11.2",
|
||||
"nodebb-plugin-composer-default": "6.5.33",
|
||||
"nodebb-plugin-dbsearch": "5.0.2",
|
||||
"nodebb-plugin-emoji": "^3.5.0",
|
||||
"nodebb-plugin-emoji-android": "2.0.5",
|
||||
"nodebb-plugin-markdown": "8.14.1",
|
||||
"nodebb-plugin-mentions": "2.13.11",
|
||||
"nodebb-plugin-spam-be-gone": "0.7.9",
|
||||
"nodebb-rewards-essentials": "0.1.5",
|
||||
"nodebb-theme-lavender": "5.2.1",
|
||||
"nodebb-theme-persona": "11.0.25",
|
||||
"nodebb-theme-slick": "1.4.7",
|
||||
"nodebb-theme-vanilla": "12.0.8",
|
||||
"nodebb-widget-essentials": "5.0.4",
|
||||
"nodemailer": "^6.5.0",
|
||||
"nconf": "^0.11.0",
|
||||
"nodebb-plugin-composer-default": "6.5.5",
|
||||
"nodebb-plugin-dbsearch": "4.1.2",
|
||||
"nodebb-plugin-emoji": "^3.3.0",
|
||||
"nodebb-plugin-emoji-android": "2.0.0",
|
||||
"nodebb-plugin-markdown": "8.12.4",
|
||||
"nodebb-plugin-mentions": "2.13.6",
|
||||
"nodebb-plugin-soundpack-default": "1.0.0",
|
||||
"nodebb-plugin-spam-be-gone": "0.7.7",
|
||||
"nodebb-rewards-essentials": "0.1.4",
|
||||
"nodebb-theme-lavender": "5.0.17",
|
||||
"nodebb-theme-persona": "10.3.18",
|
||||
"nodebb-theme-slick": "1.3.8",
|
||||
"nodebb-theme-vanilla": "11.3.10",
|
||||
"nodebb-widget-essentials": "5.0.2",
|
||||
"nodemailer": "^6.4.6",
|
||||
"nprogress": "0.2.0",
|
||||
"passport": "^0.4.1",
|
||||
"passport-http-bearer": "^1.0.1",
|
||||
"passport-local": "1.0.0",
|
||||
"pg": "^8.5.1",
|
||||
"pg-cursor": "^2.5.2",
|
||||
"postcss": "8.3.5",
|
||||
"postcss-clean": "1.2.0",
|
||||
"prompt": "^1.1.0",
|
||||
"ioredis": "4.27.6",
|
||||
"pg": "^8.0.2",
|
||||
"pg-cursor": "^2.1.9",
|
||||
"postcss": "8.1.10",
|
||||
"postcss-clean": "1.1.0",
|
||||
"promise-polyfill": "^8.1.3",
|
||||
"prompt": "^1.0.0",
|
||||
"redis": "3.0.2",
|
||||
"request": "2.88.2",
|
||||
"request-promise-native": "^1.0.9",
|
||||
"request-promise-native": "^1.0.8",
|
||||
"requirejs": "2.3.6",
|
||||
"rimraf": "3.0.2",
|
||||
"rss": "^1.2.2",
|
||||
"sanitize-html": "^2.3.2",
|
||||
"semver": "^7.3.4",
|
||||
"sanitize-html": "^2.0.0",
|
||||
"semver": "^7.2.1",
|
||||
"serve-favicon": "^2.5.0",
|
||||
"sharp": "0.28.3",
|
||||
"sitemap": "^7.0.0",
|
||||
"sharp": "0.27.0",
|
||||
"sitemap": "^6.1.0",
|
||||
"slideout": "1.0.1",
|
||||
"socket.io": "4.1.2",
|
||||
"socket.io": "3.1.0",
|
||||
"socket.io-adapter-cluster": "^1.0.1",
|
||||
"socket.io-client": "4.1.2",
|
||||
"@socket.io/redis-adapter": "7.0.0",
|
||||
"sortablejs": "1.14.0",
|
||||
"spdx-license-list": "^6.4.0",
|
||||
"socket.io-client": "3.1.0",
|
||||
"socket.io-redis": "6.0.1",
|
||||
"sortablejs": "1.13.0",
|
||||
"spdx-license-list": "^6.1.0",
|
||||
"spider-detector": "2.0.0",
|
||||
"textcomplete": "^0.18.0",
|
||||
"textcomplete": "^0.17.1",
|
||||
"textcomplete.contenteditable": "^0.1.1",
|
||||
"timeago": "^1.6.7",
|
||||
"tinycon": "0.6.8",
|
||||
"toobusy-js": "^0.5.1",
|
||||
"uglify-es": "^3.3.9",
|
||||
"validator": "13.6.0",
|
||||
"validator": "13.5.2",
|
||||
"visibilityjs": "2.0.2",
|
||||
"winston": "3.3.3",
|
||||
"xml": "^1.0.1",
|
||||
"xregexp": "^5.0.1",
|
||||
"xregexp": "^4.3.0",
|
||||
"yargs": "16.2.0",
|
||||
"zxcvbn": "^4.4.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@apidevtools/swagger-parser": "10.0.2",
|
||||
"@commitlint/cli": "12.1.4",
|
||||
"@commitlint/config-angular": "12.1.4",
|
||||
"coveralls": "3.1.1",
|
||||
"eslint": "7.30.0",
|
||||
"@commitlint/cli": "11.0.0",
|
||||
"@commitlint/config-angular": "11.0.0",
|
||||
"coveralls": "3.1.0",
|
||||
"eslint": "7.17.0",
|
||||
"eslint-config-airbnb-base": "14.2.1",
|
||||
"eslint-plugin-import": "2.23.4",
|
||||
"grunt": "1.4.1",
|
||||
"eslint-plugin-import": "2.22.1",
|
||||
"grunt": "1.3.0",
|
||||
"grunt-contrib-watch": "1.1.0",
|
||||
"husky": "6.0.0",
|
||||
"jsdom": "16.6.0",
|
||||
"lint-staged": "11.0.0",
|
||||
"mocha": "8.4.0",
|
||||
"husky": "4.3.7",
|
||||
"jsdom": "16.4.0",
|
||||
"lint-staged": "10.5.3",
|
||||
"mocha": "8.2.1",
|
||||
"mocha-lcov-reporter": "1.3.0",
|
||||
"mockdate": "3.0.5",
|
||||
"nyc": "15.1.0",
|
||||
"smtp-server": "3.9.0"
|
||||
"smtp-server": "3.8.0"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/NodeBB/NodeBB/issues"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
"node": ">=10"
|
||||
},
|
||||
"maintainers": [
|
||||
{
|
||||
@@ -182,4 +190,4 @@
|
||||
"url": "https://github.com/barisusakli"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,7 +8,6 @@ const path = require('path');
|
||||
const childProcess = require('child_process');
|
||||
const less = require('less');
|
||||
const util = require('util');
|
||||
|
||||
const lessRenderAsync = util.promisify(
|
||||
(style, opts, cb) => less.render(String(style), opts, cb)
|
||||
);
|
||||
@@ -27,8 +26,8 @@ const formats = [
|
||||
];
|
||||
|
||||
const timestampFormat = winston.format((info) => {
|
||||
const dateString = `${new Date().toISOString()} [${global.process.pid}]`;
|
||||
info.level = `${dateString} - ${info.level}`;
|
||||
var dateString = new Date().toISOString() + ' [' + global.process.pid + ']';
|
||||
info.level = dateString + ' - ' + info.level;
|
||||
return info;
|
||||
});
|
||||
formats.push(timestampFormat());
|
||||
@@ -69,10 +68,10 @@ const viewsDir = path.join(paths.baseDir, 'build/public/templates');
|
||||
|
||||
web.install = async function (port) {
|
||||
port = port || 4567;
|
||||
winston.info(`Launching web installer on port ${port}`);
|
||||
winston.info('Launching web installer on port ' + port);
|
||||
|
||||
app.use(express.static('public', {}));
|
||||
app.engine('tpl', (filepath, options, callback) => {
|
||||
app.engine('tpl', function (filepath, options, callback) {
|
||||
filepath = filepath.replace(/\.tpl$/, '.js');
|
||||
|
||||
Benchpress.__express(filepath, options, callback);
|
||||
@@ -99,7 +98,7 @@ web.install = async function (port) {
|
||||
|
||||
|
||||
function launchExpress(port) {
|
||||
server = app.listen(port, () => {
|
||||
server = app.listen(port, function () {
|
||||
winston.info('Web installer listening on http://%s:%s', '0.0.0.0', port);
|
||||
});
|
||||
}
|
||||
@@ -117,9 +116,11 @@ function ping(req, res) {
|
||||
}
|
||||
|
||||
function welcome(req, res) {
|
||||
const dbs = ['redis', 'mongo', 'postgres'];
|
||||
const databases = dbs.map((databaseName) => {
|
||||
const questions = require(`../src/database/${databaseName}`).questions.filter(question => question && !question.hideOnWebInstall);
|
||||
var dbs = ['redis', 'mongo', 'postgres'];
|
||||
var databases = dbs.map(function (databaseName) {
|
||||
var questions = require('../src/database/' + databaseName).questions.filter(function (question) {
|
||||
return question && !question.hideOnWebInstall;
|
||||
});
|
||||
|
||||
return {
|
||||
name: databaseName,
|
||||
@@ -127,10 +128,10 @@ function welcome(req, res) {
|
||||
};
|
||||
});
|
||||
|
||||
const defaults = require('./data/defaults.json');
|
||||
var defaults = require('./data/defaults');
|
||||
|
||||
res.render('install/index', {
|
||||
url: nconf.get('url') || (`${req.protocol}://${req.get('host')}`),
|
||||
url: nconf.get('url') || (req.protocol + '://' + req.get('host')),
|
||||
launchUrl: launchUrl,
|
||||
skipGeneralSetup: !!nconf.get('url'),
|
||||
databases: databases,
|
||||
@@ -150,23 +151,23 @@ function install(req, res) {
|
||||
}
|
||||
req.setTimeout(0);
|
||||
installing = true;
|
||||
const setupEnvVars = nconf.get();
|
||||
for (const [key, value] of Object.entries(req.body)) {
|
||||
if (!process.env.hasOwnProperty(key)) {
|
||||
setupEnvVars[key.replace(':', '__')] = value;
|
||||
var setupEnvVars = nconf.get();
|
||||
for (var i in req.body) {
|
||||
if (req.body.hasOwnProperty(i) && !process.env.hasOwnProperty(i)) {
|
||||
setupEnvVars[i.replace(':', '__')] = req.body[i];
|
||||
}
|
||||
}
|
||||
|
||||
// Flatten any objects in setupEnvVars
|
||||
const pushToRoot = function (parentKey, key) {
|
||||
setupEnvVars[`${parentKey}__${key}`] = setupEnvVars[parentKey][key];
|
||||
setupEnvVars[parentKey + '__' + key] = setupEnvVars[parentKey][key];
|
||||
};
|
||||
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);
|
||||
for (var j in setupEnvVars) {
|
||||
if (setupEnvVars.hasOwnProperty(j) && typeof setupEnvVars[j] === 'object' && setupEnvVars[j] !== null && !Array.isArray(setupEnvVars[j])) {
|
||||
Object.keys(setupEnvVars[j]).forEach(pushToRoot.bind(null, j));
|
||||
delete setupEnvVars[j];
|
||||
} else if (Array.isArray(setupEnvVars[j])) {
|
||||
setupEnvVars[j] = JSON.stringify(setupEnvVars[j]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -174,11 +175,11 @@ function install(req, res) {
|
||||
winston.info(setupEnvVars);
|
||||
launchUrl = setupEnvVars.url;
|
||||
|
||||
const child = require('child_process').fork('app', ['--setup'], {
|
||||
var child = require('child_process').fork('app', ['--setup'], {
|
||||
env: setupEnvVars,
|
||||
});
|
||||
|
||||
child.on('close', (data) => {
|
||||
child.on('close', function (data) {
|
||||
installing = false;
|
||||
success = data === 0;
|
||||
error = data !== 0;
|
||||
@@ -192,7 +193,7 @@ async function launch(req, res) {
|
||||
res.json({});
|
||||
server.close();
|
||||
req.setTimeout(0);
|
||||
let child;
|
||||
var child;
|
||||
|
||||
if (!nconf.get('launchCmd')) {
|
||||
child = childProcess.spawn('node', ['loader.js'], {
|
||||
@@ -256,7 +257,7 @@ async function compileLess() {
|
||||
const css = await lessRenderAsync(style, { filename: path.resolve(installSrc) });
|
||||
await fs.promises.writeFile(path.join(__dirname, '../public/installer.css'), css.css);
|
||||
} catch (err) {
|
||||
winston.error(`Unable to compile LESS: \n${err.stack}`);
|
||||
winston.error('Unable to compile LESS: \n' + err.stack);
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
@@ -288,7 +289,7 @@ async function copyCSS() {
|
||||
async function loadDefaults() {
|
||||
const setupDefaultsPath = path.join(__dirname, '../setup.json');
|
||||
try {
|
||||
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) {
|
||||
// setup.json not found or inaccessible, proceed with no defaults
|
||||
if (err.code !== 'ENOENT') {
|
||||
|
||||
93
loader.js
93
loader.js
@@ -1,45 +1,46 @@
|
||||
'use strict';
|
||||
|
||||
const nconf = require('nconf');
|
||||
const fs = require('fs');
|
||||
const url = require('url');
|
||||
const path = require('path');
|
||||
const { fork } = require('child_process');
|
||||
const async = require('async');
|
||||
const logrotate = require('logrotate-stream');
|
||||
const mkdirp = require('mkdirp');
|
||||
var nconf = require('nconf');
|
||||
var fs = require('fs');
|
||||
var url = require('url');
|
||||
var path = require('path');
|
||||
var fork = require('child_process').fork;
|
||||
var async = require('async');
|
||||
var logrotate = require('logrotate-stream');
|
||||
var mkdirp = require('mkdirp');
|
||||
|
||||
const file = require('./src/file');
|
||||
const pkg = require('./package.json');
|
||||
var file = require('./src/file');
|
||||
var pkg = require('./package.json');
|
||||
|
||||
const pathToConfig = path.resolve(__dirname, process.env.CONFIG || 'config.json');
|
||||
var pathToConfig = path.resolve(__dirname, process.env.CONFIG || 'config.json');
|
||||
|
||||
nconf.argv().env().file({
|
||||
file: pathToConfig,
|
||||
});
|
||||
|
||||
const pidFilePath = path.join(__dirname, 'pidfile');
|
||||
var pidFilePath = path.join(__dirname, 'pidfile');
|
||||
|
||||
const outputLogFilePath = path.join(__dirname, nconf.get('logFile') || 'logs/output.log');
|
||||
var outputLogFilePath = path.join(__dirname, nconf.get('logFile') || 'logs/output.log');
|
||||
|
||||
const logDir = path.dirname(outputLogFilePath);
|
||||
var logDir = path.dirname(outputLogFilePath);
|
||||
if (!fs.existsSync(logDir)) {
|
||||
mkdirp.sync(path.dirname(outputLogFilePath));
|
||||
}
|
||||
|
||||
const output = logrotate({ file: outputLogFilePath, size: '1m', keep: 3, compress: true });
|
||||
const silent = nconf.get('silent') === 'false' ? false : nconf.get('silent') !== false;
|
||||
let numProcs;
|
||||
const workers = [];
|
||||
const Loader = {
|
||||
var output = logrotate({ file: outputLogFilePath, size: '1m', keep: 3, compress: true });
|
||||
var silent = nconf.get('silent') === 'false' ? false : nconf.get('silent') !== false;
|
||||
var numProcs;
|
||||
var workers = [];
|
||||
var Loader = {
|
||||
timesStarted: 0,
|
||||
};
|
||||
const appPath = path.join(__dirname, 'app.js');
|
||||
var appPath = path.join(__dirname, 'app.js');
|
||||
|
||||
Loader.init = function (callback) {
|
||||
if (silent) {
|
||||
console.log = (...args) => {
|
||||
output.write(`${args.join(' ')}\n`);
|
||||
console.log = function () {
|
||||
var args = Array.prototype.slice.call(arguments);
|
||||
output.write(args.join(' ') + '\n');
|
||||
};
|
||||
}
|
||||
|
||||
@@ -50,7 +51,7 @@ Loader.init = function (callback) {
|
||||
|
||||
Loader.displayStartupMessages = function (callback) {
|
||||
console.log('');
|
||||
console.log(`NodeBB v${pkg.version} Copyright (C) 2013-2014 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 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');
|
||||
@@ -59,23 +60,23 @@ Loader.displayStartupMessages = function (callback) {
|
||||
};
|
||||
|
||||
Loader.addWorkerEvents = function (worker) {
|
||||
worker.on('exit', (code, signal) => {
|
||||
worker.on('exit', function (code, signal) {
|
||||
if (code !== 0) {
|
||||
if (Loader.timesStarted < numProcs * 3) {
|
||||
Loader.timesStarted += 1;
|
||||
if (Loader.crashTimer) {
|
||||
clearTimeout(Loader.crashTimer);
|
||||
}
|
||||
Loader.crashTimer = setTimeout(() => {
|
||||
Loader.crashTimer = setTimeout(function () {
|
||||
Loader.timesStarted = 0;
|
||||
}, 10000);
|
||||
} else {
|
||||
console.log(`${numProcs * 3} restarts in 10 seconds, most likely an error on startup. Halting.`);
|
||||
console.log((numProcs * 3) + ' restarts in 10 seconds, most likely an error on startup. Halting.');
|
||||
process.exit();
|
||||
}
|
||||
}
|
||||
|
||||
console.log(`[cluster] Child Process (${worker.pid}) has exited (code: ${code}, signal: ${signal})`);
|
||||
console.log('[cluster] Child Process (' + worker.pid + ') has exited (code: ' + code + ', signal: ' + signal + ')');
|
||||
if (!(worker.suicide || code === 0)) {
|
||||
console.log('[cluster] Spinning up another process...');
|
||||
|
||||
@@ -83,7 +84,7 @@ Loader.addWorkerEvents = function (worker) {
|
||||
}
|
||||
});
|
||||
|
||||
worker.on('message', (message) => {
|
||||
worker.on('message', function (message) {
|
||||
if (message && typeof message === 'object' && message.action) {
|
||||
switch (message.action) {
|
||||
case 'restart':
|
||||
@@ -91,12 +92,12 @@ Loader.addWorkerEvents = function (worker) {
|
||||
Loader.restart();
|
||||
break;
|
||||
case 'pubsub':
|
||||
workers.forEach((w) => {
|
||||
workers.forEach(function (w) {
|
||||
w.send(message);
|
||||
});
|
||||
break;
|
||||
case 'socket.io':
|
||||
workers.forEach((w) => {
|
||||
workers.forEach(function (w) {
|
||||
if (w !== worker) {
|
||||
w.send(message);
|
||||
}
|
||||
@@ -109,9 +110,9 @@ Loader.addWorkerEvents = function (worker) {
|
||||
|
||||
Loader.start = function (callback) {
|
||||
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 (var x = 0; x < numProcs; x += 1) {
|
||||
forkWorker(x, x === 0);
|
||||
}
|
||||
|
||||
@@ -121,18 +122,18 @@ Loader.start = function (callback) {
|
||||
};
|
||||
|
||||
function forkWorker(index, isPrimary) {
|
||||
const ports = getPorts();
|
||||
const args = [];
|
||||
var ports = getPorts();
|
||||
var args = [];
|
||||
|
||||
if (!ports[index]) {
|
||||
return console.log(`[cluster] invalid port for worker : ${index} ports: ${ports.length}`);
|
||||
return console.log('[cluster] invalid port for worker : ' + index + ' ports: ' + ports.length);
|
||||
}
|
||||
|
||||
process.env.isPrimary = isPrimary;
|
||||
process.env.isCluster = nconf.get('isCluster') || ports.length > 1;
|
||||
process.env.port = ports[index];
|
||||
|
||||
const worker = fork(appPath, args, {
|
||||
var worker = fork(appPath, args, {
|
||||
silent: silent,
|
||||
env: process.env,
|
||||
});
|
||||
@@ -145,20 +146,20 @@ function forkWorker(index, isPrimary) {
|
||||
Loader.addWorkerEvents(worker);
|
||||
|
||||
if (silent) {
|
||||
const output = logrotate({ file: outputLogFilePath, size: '1m', keep: 3, compress: true });
|
||||
var output = logrotate({ file: outputLogFilePath, size: '1m', keep: 3, compress: true });
|
||||
worker.stdout.pipe(output);
|
||||
worker.stderr.pipe(output);
|
||||
}
|
||||
}
|
||||
|
||||
function getPorts() {
|
||||
const _url = nconf.get('url');
|
||||
var _url = nconf.get('url');
|
||||
if (!_url) {
|
||||
console.log('[cluster] url is undefined, please check your config.json');
|
||||
process.exit();
|
||||
}
|
||||
const urlObject = url.parse(_url);
|
||||
let port = nconf.get('PORT') || nconf.get('port') || urlObject.port || 4567;
|
||||
var urlObject = url.parse(_url);
|
||||
var port = nconf.get('PORT') || nconf.get('port') || urlObject.port || 4567;
|
||||
if (!Array.isArray(port)) {
|
||||
port = [port];
|
||||
}
|
||||
@@ -171,13 +172,13 @@ Loader.restart = function () {
|
||||
nconf.remove('file');
|
||||
nconf.use('file', { file: pathToConfig });
|
||||
|
||||
fs.readFile(pathToConfig, { encoding: 'utf-8' }, (err, configFile) => {
|
||||
fs.readFile(pathToConfig, { encoding: 'utf-8' }, function (err, configFile) {
|
||||
if (err) {
|
||||
console.error('Error reading config');
|
||||
throw err;
|
||||
}
|
||||
|
||||
const conf = JSON.parse(configFile);
|
||||
var conf = JSON.parse(configFile);
|
||||
|
||||
nconf.stores.env.readOnly = false;
|
||||
nconf.set('url', conf.url);
|
||||
@@ -200,13 +201,13 @@ Loader.stop = function () {
|
||||
};
|
||||
|
||||
function killWorkers() {
|
||||
workers.forEach((worker) => {
|
||||
workers.forEach(function (worker) {
|
||||
worker.suicide = true;
|
||||
worker.kill();
|
||||
});
|
||||
}
|
||||
|
||||
fs.open(pathToConfig, 'r', (err) => {
|
||||
fs.open(pathToConfig, 'r', function (err) {
|
||||
if (err) {
|
||||
// No config detected, kickstart web installer
|
||||
fork('app');
|
||||
@@ -216,7 +217,7 @@ fs.open(pathToConfig, 'r', (err) => {
|
||||
if (nconf.get('daemon') !== 'false' && nconf.get('daemon') !== false) {
|
||||
if (file.existsSync(pidFilePath)) {
|
||||
try {
|
||||
const pid = fs.readFileSync(pidFilePath, { encoding: 'utf-8' });
|
||||
var pid = fs.readFileSync(pidFilePath, { encoding: 'utf-8' });
|
||||
process.kill(pid, 0);
|
||||
process.exit();
|
||||
} catch (e) {
|
||||
@@ -237,7 +238,7 @@ fs.open(pathToConfig, 'r', (err) => {
|
||||
Loader.init,
|
||||
Loader.displayStartupMessages,
|
||||
Loader.start,
|
||||
], (err) => {
|
||||
], function (err) {
|
||||
if (err) {
|
||||
console.error('[loader] Error during startup');
|
||||
throw err;
|
||||
|
||||
@@ -20,44 +20,15 @@
|
||||
"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."
|
||||
}
|
||||
]
|
||||
"prefer-arrow-callback": "off",
|
||||
"prefer-spread": "off",
|
||||
"prefer-object-spread": "off",
|
||||
"prefer-reflect": "off",
|
||||
"prefer-template": "off"
|
||||
},
|
||||
"parserOptions": {
|
||||
"ecmaVersion": 2018,
|
||||
|
||||
@@ -2,11 +2,11 @@
|
||||
"events": "أحداث",
|
||||
"no-events": "لا توجد أحداث",
|
||||
"control-panel": "لوحة تحكم الأحداث",
|
||||
"delete-events": "حذف الاحداث",
|
||||
"filters": "تصفية",
|
||||
"filters-apply": "تطبيق التصفية",
|
||||
"filter-type": "نوع الحدث",
|
||||
"filter-start": "تاريخ البدء",
|
||||
"filter-end": "تاريخ الانتهاء",
|
||||
"filter-perPage": "لكل صفحة"
|
||||
"delete-events": "Delete Events",
|
||||
"filters": "Filters",
|
||||
"filters-apply": "Apply Filters",
|
||||
"filter-type": "Event Type",
|
||||
"filter-start": "Start Date",
|
||||
"filter-end": "End Date",
|
||||
"filter-perPage": "Per Page"
|
||||
}
|
||||
@@ -2,7 +2,6 @@
|
||||
"forum-traffic": "Forum Traffic",
|
||||
"page-views": "مشاهدات الصفحات",
|
||||
"unique-visitors": "زائرين فريدين",
|
||||
"logins": "Logins",
|
||||
"new-users": "New Users",
|
||||
"posts": "مشاركات",
|
||||
"topics": "مواضيع",
|
||||
@@ -30,7 +29,6 @@
|
||||
"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>",
|
||||
"fallback-emailer-not-found": "Fallback emailer not found!",
|
||||
"running-in-development": "المنتدى قيد التشغيل في وضع \"المطورين\". وقد تكون هناك ثغرات أمنية مفتوحة؛ من فضلك تواصل مع مسؤول نظامك.",
|
||||
"latest-lookup-failed": "<p>Failed to look up latest available version of NodeBB</p>",
|
||||
|
||||
@@ -77,12 +75,5 @@
|
||||
"graphs.registered-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": "No users have joined within the selected timeframe",
|
||||
"details.no-topics": "No topics have been posted within the selected timeframe",
|
||||
"details.no-logins": "No logins have been recorded within the selected timeframe",
|
||||
"details.logins-static": "NodeBB only saves session data for %1 days, and so this table below will only show the most recently active sessions",
|
||||
"details.logins-login-time": "Login Time"
|
||||
"no-users-browsing": "No users browsing"
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
"alert.upgraded": "الإضافة مرقاة",
|
||||
"alert.installed": "الإضافة منصبة",
|
||||
"alert.uninstalled": "تم إلغاء تنصيب الإضافة",
|
||||
"alert.activate-success": "Please rebuild and restart your NodeBB to fully activate this plugin",
|
||||
"alert.activate-success": "يرجى إعادة تشغيل NodeBB لتنشيط الإضافة بشكل بالكامل",
|
||||
"alert.deactivate-success": "تم تعطيل الإضافة بنجاح",
|
||||
"alert.upgrade-success": "Please rebuild and restart your NodeBB to fully upgrade this plugin.",
|
||||
"alert.install-success": "تم تثبيت الإضافة بنجاح، يرجى تفعيلها.",
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
"custom-class": "Custom Class",
|
||||
"num-recent-replies": "# of Recent Replies",
|
||||
"ext-link": "External Link",
|
||||
"subcategories-per-page": "Subcategories per page",
|
||||
"is-section": "Treat this category as a section",
|
||||
"post-queue": "Post queue",
|
||||
"tag-whitelist": "Tag Whitelist",
|
||||
@@ -19,7 +18,6 @@
|
||||
"category-image": "Category Image",
|
||||
"parent-category": "Parent Category",
|
||||
"optional-parent-category": "(Optional) Parent Category",
|
||||
"top-level": "Top Level",
|
||||
"parent-category-none": "(None)",
|
||||
"copy-parent": "Copy Parent",
|
||||
"copy-settings": "Copy Settings From",
|
||||
@@ -32,8 +30,6 @@
|
||||
"edit": "Edit",
|
||||
"analytics": "Analytics",
|
||||
"view-category": "View category",
|
||||
"set-order": "Set order",
|
||||
"set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.",
|
||||
|
||||
"select-category": "Select Category",
|
||||
"set-parent-category": "Set Parent Category",
|
||||
@@ -50,8 +46,6 @@
|
||||
"privileges.no-users": "No user-specific privileges in this category.",
|
||||
"privileges.section-group": "Group",
|
||||
"privileges.group-private": "This group is private",
|
||||
"privileges.inheritance-exception": "This group does not inherit privileges from registered-users group",
|
||||
"privileges.banned-user-inheritance": "Banned users inherit privileges from banned-users group",
|
||||
"privileges.search-group": "Add Group",
|
||||
"privileges.copy-to-children": "Copy to Children",
|
||||
"privileges.copy-from-category": "Copy from Category",
|
||||
|
||||
@@ -25,7 +25,6 @@
|
||||
"access-topics": "Access Topics",
|
||||
"create-topics": "Create Topics",
|
||||
"reply-to-topics": "Reply to Topics",
|
||||
"schedule-topics": "Schedule Topics",
|
||||
"tag-topics": "Tag Topics",
|
||||
"edit-posts": "Edit Posts",
|
||||
"view-edit-history": "View Edit History",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"users": "المستخدمين",
|
||||
"edit": "Actions",
|
||||
"edit": "تحرير",
|
||||
"make-admin": "Make Admin",
|
||||
"remove-admin": "Remove Admin",
|
||||
"validate-email": "Validate Email",
|
||||
@@ -47,7 +47,6 @@
|
||||
"users.uid": "uid",
|
||||
"users.username": "username",
|
||||
"users.email": "email",
|
||||
"users.ip": "IP",
|
||||
"users.postcount": "postcount",
|
||||
"users.reputation": "reputation",
|
||||
"users.flags": "flags",
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
{
|
||||
"section-dashboard": "Dashboards",
|
||||
"dashboard/overview": "Overview",
|
||||
"dashboard/logins": "Logins",
|
||||
"dashboard/users": "Users",
|
||||
"dashboard/topics": "Topics",
|
||||
"dashboard": "Dashboard",
|
||||
"section-general": "عام",
|
||||
|
||||
"section-manage": "إدارة",
|
||||
|
||||
@@ -40,8 +40,5 @@
|
||||
"site-colors": "Site Color Metadata",
|
||||
"theme-color": "لون الثيم",
|
||||
"background-color": "لون الخلفية",
|
||||
"background-color-help": "Color used for splash screen background when website is installed as a PWA",
|
||||
"undo-timeout": "Undo Timeout",
|
||||
"undo-timeout-help": "Some operations such as moving topics will allow for the moderator to undo their action within a certain timeframe. Set to 0 to disable undo completely.",
|
||||
"topic-tools": "Topic Tools"
|
||||
"background-color-help": "Color used for splash screen background when website is installed as a PWA"
|
||||
}
|
||||
@@ -1,12 +1,10 @@
|
||||
{
|
||||
"pagination": "Pagination Settings",
|
||||
"enable": "Paginate topics and posts instead of using infinite scroll.",
|
||||
"posts": "Post Pagination",
|
||||
"topics": "Topic Pagination",
|
||||
"posts-per-page": "Posts per Page",
|
||||
"max-posts-per-page": "Maximum posts per page",
|
||||
"categories": "Category Pagination",
|
||||
"topics-per-page": "Topics per Page",
|
||||
"max-topics-per-page": "Maximum topics per page",
|
||||
"categories-per-page": "Categories per page"
|
||||
"max-topics-per-page": "Maximum topics per page"
|
||||
}
|
||||
@@ -16,7 +16,5 @@
|
||||
|
||||
"flags": "Flag Settings",
|
||||
"flags.limit-per-target": "Maximum number of times something can be flagged",
|
||||
"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 "report" and added to the original flag. Set this option to a number other than zero to limit the number of reports an item can receive.",
|
||||
"flags.auto-resolve-on-ban": "Automatically resolve all of a user's tickets when they are banned"
|
||||
"flags.limit-per-target-placeholder": "Default: 0"
|
||||
}
|
||||
@@ -1,8 +1,6 @@
|
||||
{
|
||||
"tag": "Tag Settings",
|
||||
"link-to-manage": "Manage Tags",
|
||||
"system-tags": "System Tags",
|
||||
"system-tags-help": "Only privileged users will be able to use these tags.",
|
||||
"min-per-topic": "Minimum Tags per Topic",
|
||||
"max-per-topic": "Maximum Tags per Topic",
|
||||
"min-length": "Minimum Tag Length",
|
||||
|
||||
@@ -21,9 +21,6 @@
|
||||
"topic-thumb-size": "حجم الصورة المصغرة للموضوع",
|
||||
"allowed-file-extensions": "إمتدادات الملفات المسموح بها",
|
||||
"allowed-file-extensions-help": "أدخل قائمة بامتدادات الملفات مفصولة بفواصل (مثال: <code>pdf,xls,doc</code>). القائمة الفارغة تعني أن كل الامتدادات مسموح بها.",
|
||||
"upload-limit-threshold": "Rate limit user uploads to:",
|
||||
"upload-limit-threshold-per-minute": "Per %1 Minute",
|
||||
"upload-limit-threshold-per-minutes": "Per %1 Minutes",
|
||||
"profile-avatars": "الصورة الرمزية للملف الشخصي",
|
||||
"allow-profile-image-uploads": "السماح للأعضاء برفع الصور الرمزية",
|
||||
"convert-profile-image-png": "تحويل إمتداد الصور الرمزية المرفوعه الى PNG",
|
||||
|
||||
@@ -18,6 +18,5 @@
|
||||
"watching.message": "You are now watching updates from this category and all subcategories",
|
||||
"notwatching.message": "You are not watching updates from this category and all subcategories",
|
||||
"ignoring.message": "You are now ignoring updates from this category and all subcategories",
|
||||
"watched-categories": "الأقسام المُتابعة",
|
||||
"x-more-categories": "%1 more categories"
|
||||
"watched-categories": "الأقسام المُتابعة"
|
||||
}
|
||||
@@ -22,7 +22,6 @@
|
||||
"invalid-username-or-password": "المرجود تحديد اسم مستخدم و كلمة مرور",
|
||||
"invalid-search-term": "كلمة البحث غير صحيحة",
|
||||
"invalid-url": "Invalid URL",
|
||||
"invalid-event": "Invalid event: %1",
|
||||
"local-login-disabled": "Local login system has been disabled for non-privileged accounts.",
|
||||
"csrf-invalid": "لم تتمكن من تسجيل الدخول. هنالك أحتمال ان جلستك انتهت. رجاءًا حاول مرة اخرى.",
|
||||
"invalid-pagination-value": "رقم الصفحة غير صحيح ، يجب أن يكون بين %1 و %2 .",
|
||||
@@ -84,19 +83,10 @@
|
||||
"tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)",
|
||||
"not-enough-tags": "Not enough tags. Topics must have at least %1 tag(s)",
|
||||
"too-many-tags": "Too many tags. Topics can't have more than %1 tag(s)",
|
||||
"cant-use-system-tag": "You can not use this system tag.",
|
||||
"cant-remove-system-tag": "You can not remove this system tag.",
|
||||
"still-uploading": "الرجاء الانتظار حتى يكتمل الرفع.",
|
||||
"file-too-big": "الحد الأقصى لرفع الملفات %1 كيلو بت. رجاءًا ارفع ملف أصغر",
|
||||
"guest-upload-disabled": "خاصية رفع الملفات غير مفعلة للزوار.",
|
||||
"cors-error": "Unable to upload image due to misconfigured CORS",
|
||||
"upload-ratelimit-reached": "You have uploaded too many files at one time. Please try again later.",
|
||||
"scheduling-to-past": "Please select a date in the future.",
|
||||
"invalid-schedule-date": "Please enter a valid date and time.",
|
||||
"cant-pin-scheduled": "Scheduled topics cannot be (un)pinned.",
|
||||
"cant-merge-scheduled": "Scheduled topics cannot be merged.",
|
||||
"cant-move-posts-to-scheduled": "Can't move posts to a scheduled topic.",
|
||||
"cant-move-from-scheduled-to-existing": "Can't move posts from a scheduled topic to an existing topic.",
|
||||
"already-bookmarked": "You have already bookmarked this post",
|
||||
"already-unbookmarked": "You have already unbookmarked this post",
|
||||
"cant-ban-other-admins": "لايمكن حظر مدبر نظام آخر.",
|
||||
@@ -175,10 +165,8 @@
|
||||
"cant-kick-self": "لا يمكنك طرد نفسك من المجموعة.",
|
||||
"no-users-selected": "لا يوجد مستخدم محدد.",
|
||||
"invalid-home-page-route": "Invalid home page route",
|
||||
"invalid-session": "Invalid Session",
|
||||
"invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.",
|
||||
"session-mismatch": "Session Mismatch",
|
||||
"session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.",
|
||||
"invalid-session": "Session Mismatch",
|
||||
"invalid-session-text": "يبدو أن فترة التسجيل لم تعد قائمة او هي غير مطابقة مع الخادم. يرجى إعادة تحميل هذه الصفحة.",
|
||||
"no-topics-selected": "No topics selected!",
|
||||
"cant-move-to-same-topic": "Can't move post to same topic!",
|
||||
"cant-move-topic-to-same-category": "Can't move topic to the same category!",
|
||||
@@ -189,8 +177,5 @@
|
||||
"already-unblocked": "This user is already unblocked",
|
||||
"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",
|
||||
"plugin-not-whitelisted": "Unable to install plugin – only plugins whitelisted by the NodeBB Package Manager can be installed via the ACP",
|
||||
"topic-event-unrecognized": "Topic event '%1' unrecognized",
|
||||
"cant-set-child-as-parent": "Can't set child as parent category",
|
||||
"cant-set-self-as-parent": "Can't set self as parent category"
|
||||
"plugin-not-whitelisted": "Unable to install plugin – only plugins whitelisted by the NodeBB Package Manager can be installed via the ACP"
|
||||
}
|
||||
@@ -6,7 +6,6 @@
|
||||
"assignee": "المحال إليه",
|
||||
"update": "تحديث",
|
||||
"updated": "تم التحديث",
|
||||
"resolved": "Resolved",
|
||||
"target-purged": "The content this flag referred to has been purged and is no longer available.",
|
||||
|
||||
"graph-label": "Daily Flags",
|
||||
@@ -27,7 +26,6 @@
|
||||
"filter-cid-all": "All categories",
|
||||
"apply-filters": "Apply Filters",
|
||||
"more-filters": "More Filters",
|
||||
"fewer-filters": "Fewer Filters",
|
||||
|
||||
"quick-actions": "اجراءات سريعه",
|
||||
"flagged-user": "Flagged User",
|
||||
|
||||
@@ -46,9 +46,7 @@
|
||||
"alert.success": "نجاح",
|
||||
"alert.error": "خطأ",
|
||||
"alert.banned": "محظور",
|
||||
"alert.banned.message": "You have just been banned, your access is now restricted.",
|
||||
"alert.unbanned": "Unbanned",
|
||||
"alert.unbanned.message": "Your ban has been lifted.",
|
||||
"alert.banned.message": "لقد تم حظر حسابك. سيتم تسجيل الخروج.",
|
||||
"alert.unfollow": "أنت لا تتابع %1 بعد الآن!",
|
||||
"alert.follow": "أنت الآن تتابع %1!",
|
||||
"users": "الأعضاء",
|
||||
@@ -95,8 +93,6 @@
|
||||
"guest": "زائر",
|
||||
"guests": "الزوار",
|
||||
"former_user": "A Former User",
|
||||
"system-user": "System",
|
||||
"unknown-user": "Unknown user",
|
||||
"updated.title": "تم تحديث المنتدى",
|
||||
"updated.message": "لقد تم تحديث المنتدى إلى آخر نسخة للتو. إضغط هنا لإعادة تحميل الصفحة.",
|
||||
"privacy": "الخصوصية",
|
||||
|
||||
@@ -35,7 +35,8 @@
|
||||
"details.member_count": "عدد اﻷعضاء",
|
||||
"details.creation_date": "تاريخ الإنشاء",
|
||||
"details.description": "الوصف",
|
||||
"details.member-post-cids": "Category IDs to display posts from",
|
||||
"details.member-post-cids": "Categories to display posts from",
|
||||
"details.member-post-cids-help": "<strong>Note</strong>: Selecting no categories will assume all categories are included. Use <code>ctrl</code> and <code>shift</code> to select multiple options.",
|
||||
"details.badge_preview": "معاينة الوسام",
|
||||
"details.change_icon": "تغيير الأيقونة",
|
||||
"details.change_label_colour": "Change Label Colour",
|
||||
|
||||
@@ -8,6 +8,5 @@
|
||||
"failed_login_attempt": "تسجيل الدخول غير ناجح",
|
||||
"login_successful": "قمت بتسجيل الدخول بنجاح!",
|
||||
"dont_have_account": "لا تملك حساب؟",
|
||||
"logged-out-due-to-inactivity": "لقد تم تسجيل خروجك من لوحة تحكم بسبب عدم نشاطك",
|
||||
"caps-lock-enabled": "Caps Lock is enabled"
|
||||
"logged-out-due-to-inactivity": "لقد تم تسجيل خروجك من لوحة تحكم بسبب عدم نشاطك"
|
||||
}
|
||||
@@ -60,11 +60,6 @@
|
||||
"composer.zen_mode": "Zen Mode",
|
||||
"composer.select_category": "Select a category",
|
||||
"composer.textarea.placeholder": "Enter your post content here, drag and drop images",
|
||||
"composer.schedule-for": "Schedule topic for",
|
||||
"composer.schedule-date": "Date",
|
||||
"composer.schedule-time": "Time",
|
||||
"composer.cancel-scheduling": "Cancel Scheduling",
|
||||
"composer.set-schedule-date": "Set Date",
|
||||
"bootbox.ok": "OK",
|
||||
"bootbox.cancel": "إلغاء",
|
||||
"bootbox.confirm": "تأكيد",
|
||||
|
||||
@@ -14,7 +14,6 @@
|
||||
"topics": "مواضيع",
|
||||
"replies": "ردود",
|
||||
"chat": "محادثات",
|
||||
"group-chat": "Group Chats",
|
||||
"follows": "متابعون",
|
||||
"upvote": "الموافقين",
|
||||
"new-flags": "New Flags",
|
||||
@@ -48,8 +47,6 @@
|
||||
"posts-exported": "<strong>%1</strong> posts exported, click to download",
|
||||
"uploads-exported": "<strong>%1</strong> uploads 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-rejected": "Your queued post has been rejected.",
|
||||
"email-confirmed": "تم التحقق من عنوان البريد الإلكتروني",
|
||||
"email-confirmed-message": "شكرًا على إثبات صحة عنوان بريدك الإلكتروني. صار حسابك مفعلًا بالكامل.",
|
||||
"email-confirm-error-message": "حدث خطأ أثناء التحقق من عنوان بريدك الإلكتروني. ربما رمز التفعيل خاطئ أو انتهت صلاحيته.",
|
||||
|
||||
@@ -24,8 +24,5 @@
|
||||
"interstitial.errors-found": "تعذر علينا إتمام عملية التسجيل:",
|
||||
"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_consent_denied": "You must give consent to this site to collect/process your information, and to send you emails.",
|
||||
"invite.error-admin-only": "Direct user registration has been disabled. Please contact an administrator for more details.",
|
||||
"invite.error-invite-only": "Direct user registration has been disabled. You must be invited by an existing user in order to access this forum.",
|
||||
"invite.error-invalid-data": "The registration data received does not correspond to our records. Please contact an administrator for more details"
|
||||
"gdpr_consent_denied": "You must give consent to this site to collect/process your information, and to send you emails."
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"success": "نجاح",
|
||||
"topic-post": "لقد تمت الإضافة بنجاح.",
|
||||
"post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.",
|
||||
"post-queued": "Your post is queued for approval.",
|
||||
"authentication-successful": "تم تسجيل الدخول بنجاح",
|
||||
"settings-saved": "تم حفظ التغييرات!"
|
||||
}
|
||||
@@ -1,6 +1,5 @@
|
||||
{
|
||||
"topic": "موضوع",
|
||||
"title": "Title",
|
||||
"no_topics_found": "لا توجد مواضيع !",
|
||||
"no_posts_found": "لا توجد مشاركات!",
|
||||
"post_is_deleted": "هذه المشاركة محذوفة!",
|
||||
@@ -31,25 +30,16 @@
|
||||
"locked": "مقفل",
|
||||
"pinned": "مثبت",
|
||||
"pinned-with-expiry": "Pinned until %1",
|
||||
"scheduled": "Scheduled",
|
||||
"moved": "منقول",
|
||||
"moved-from": "Moved from %1",
|
||||
"copy-ip": "Copy IP",
|
||||
"ban-ip": "Ban IP",
|
||||
"view-history": "Edit History",
|
||||
"locked-by": "Locked by",
|
||||
"unlocked-by": "Unlocked by",
|
||||
"pinned-by": "Pinned by",
|
||||
"unpinned-by": "Unpinned by",
|
||||
"deleted-by": "Deleted by",
|
||||
"restored-by": "Restored by",
|
||||
"queued-by": "Post queued for approval →",
|
||||
"bookmark_instructions": "اضغط هنا للعودة لأخر مشاركة مقروءة في الموضوع",
|
||||
"flag-post": "Flag this post",
|
||||
"flag-user": "Flag this user",
|
||||
"already-flagged": "Already Flagged",
|
||||
"view-flag-report": "View Flag Report",
|
||||
"resolve-flag": "Resolve Flag",
|
||||
"merged_message": "This topic has been merged into <a href=\"%1\">%2</a>",
|
||||
"deleted_message": "هذه المشاركة محذوفة. فقط من لهم صلاحية الإشراف على ا لمشاركات يمكنهم معاينتها.",
|
||||
"following_topic.message": "ستستلم تنبيها عند كل مشاركة جديدة في هذا الموضوع.",
|
||||
@@ -114,7 +104,6 @@
|
||||
"move_post": "نقل المشاركة",
|
||||
"post_moved": "تم نقل المشاركة",
|
||||
"fork_topic": "فرع الموضوع",
|
||||
"enter-new-topic-title": "Enter new topic title",
|
||||
"fork_topic_instruction": "إضغط على المشاركات التي تريد تفريعها",
|
||||
"fork_no_pids": "لم تختر أي مشاركة",
|
||||
"no-posts-selected": "No posts selected!",
|
||||
@@ -128,17 +117,14 @@
|
||||
"merge-options": "Merge options",
|
||||
"merge-select-main-topic": "Select the main topic",
|
||||
"merge-new-title-for-topic": "New title for topic",
|
||||
"topic-id": "Topic ID",
|
||||
"move_posts_instruction": "Click the posts you want to move then enter a topic ID or go to the target topic",
|
||||
"move_posts_instruction": "Click the posts you want to move then go to target topic and click move.",
|
||||
"change_owner_instruction": "Click the posts you want to assign to another user",
|
||||
"composer.title_placeholder": "أدخل عنوان موضوعك هنا...",
|
||||
"composer.handle_placeholder": "Enter your name/handle here",
|
||||
"composer.discard": "نبذ التغييرات",
|
||||
"composer.submit": "حفظ",
|
||||
"composer.schedule": "Schedule",
|
||||
"composer.replying_to": "الرد على %1",
|
||||
"composer.new_topic": "موضوع جديد",
|
||||
"composer.editing": "Editing",
|
||||
"composer.uploading": "جاري الرفع",
|
||||
"composer.thumb_url_label": "ألصق رابط الصورة المصغرة للموضوع",
|
||||
"composer.thumb_title": "إضافة صورة مصغرة للموضوع",
|
||||
@@ -166,10 +152,8 @@
|
||||
"diffs.current-revision": "current revision",
|
||||
"diffs.original-revision": "original revision",
|
||||
"diffs.restore": "Restore this revision",
|
||||
"diffs.restore-description": "A new revision will be appended to this post's edit history after restoring.",
|
||||
"diffs.restore-description": "A new revision will be appended to this post's edit history.",
|
||||
"diffs.post-restored": "Post successfully restored to earlier revision",
|
||||
"diffs.delete": "Delete this revision",
|
||||
"diffs.deleted": "Revision deleted",
|
||||
"timeago_later": "%1 later",
|
||||
"timeago_earlier": "%1 earlier",
|
||||
"first-post": "First post",
|
||||
|
||||
@@ -84,7 +84,6 @@
|
||||
"remove_cover_picture_confirm": "هل تريد بالتأكيد إزالة صورة الغلاف؟",
|
||||
"crop_picture": "إقتصاص الصورة",
|
||||
"upload_cropped_picture": "إقتصاص ورفع",
|
||||
"avatar-background-colour": "Avatar background colour",
|
||||
"settings": "خيارات",
|
||||
"show_email": "أظهر بريدي الإلكتروني",
|
||||
"show_fullname": "أظهر اسمي الكامل",
|
||||
@@ -136,7 +135,7 @@
|
||||
"homepage": "الصفحة الرئيسية",
|
||||
"homepage_description": "حدد صفحة لاستخدامها كصفحة رئيسية للمنتدى أو \"لا شيء\" لاستخدام الصفحة الرئيسية الافتراضية.",
|
||||
"custom_route": "مسار الصفحة الرئيسية المخصصة",
|
||||
"custom_route_help": "Enter a route name here, without any preceding slash (e.g. \"recent\" or \"category/2/general-discussion\")",
|
||||
"custom_route_help": "أدخل اسم مسار هنا، بدون أي شرطة مائلة (على سبيل المثال \"حديثة\" أو \"شائعة\")",
|
||||
"sso.title": "خدمات تسجيل الدخول الموحد",
|
||||
"sso.associated": "مرتبط مع",
|
||||
"sso.not-associated": "انقر هنا لربط مع",
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
"forum-traffic": "Трафик на форума",
|
||||
"page-views": "Преглеждания на страниците",
|
||||
"unique-visitors": "Уникални посетители",
|
||||
"logins": "Вписвания",
|
||||
"new-users": "Нови потребители",
|
||||
"posts": "Публикации",
|
||||
"topics": "Теми",
|
||||
@@ -30,7 +29,6 @@
|
||||
"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>",
|
||||
"fallback-emailer-not-found": "Не е намерен резервен изпращач на е-поща",
|
||||
"running-in-development": "<span>Форумът работи в режим за разработчици, така че може да бъде уязвим. Моля, свържете се със системния си администратор.</span>",
|
||||
"latest-lookup-failed": "<p>Не може да бъде извършена проверка за последната налична версия на NodeBB</p>",
|
||||
|
||||
@@ -77,12 +75,5 @@
|
||||
"graphs.registered-users": "Регистрирани потребители",
|
||||
"graphs.anonymous-users": "Анонимни потребители",
|
||||
"last-restarted-by": "Последно рестартиране от",
|
||||
"no-users-browsing": "Няма разглеждащи потребители",
|
||||
|
||||
"back-to-dashboard": "Назад към таблото",
|
||||
"details.no-users": "В избрания период не са се регистрирали нови потребители",
|
||||
"details.no-topics": "В избрания период не са публикувани нови теми",
|
||||
"details.no-logins": "В избрания период не са отчетени вписвания",
|
||||
"details.logins-static": "NodeBB запазва данни за сесията в продължение на %1 дни, така че в следната таблица могат да се видят само последните активни сесии",
|
||||
"details.logins-login-time": "Време на вписване"
|
||||
"no-users-browsing": "Няма разглеждащи потребители"
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
"alert.upgraded": "Добавката е обновена",
|
||||
"alert.installed": "Добавката е инсталирана",
|
||||
"alert.uninstalled": "Добавката е деинсталирана",
|
||||
"alert.activate-success": "Моля, изградете повторно и презаредете NodeBB, за да активирате напълно тази добавка.",
|
||||
"alert.activate-success": "Моля, рестартирайте NodeBB, за да включите тази добавка напълно.",
|
||||
"alert.deactivate-success": "Добавката е изключена успешно.",
|
||||
"alert.upgrade-success": "Моля, изградете повторно и презаредете NodeBB, за да обновите тази добавка напълно.",
|
||||
"alert.install-success": "Добавката е инсталирана успешно, моля, включете я",
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
"custom-class": "Персонализиран клас",
|
||||
"num-recent-replies": "Брой на скорошните отговори",
|
||||
"ext-link": "Външна връзка",
|
||||
"subcategories-per-page": "Брой подкатегории на страница",
|
||||
"is-section": "Използване на тази категория като раздел",
|
||||
"post-queue": "Опашка за публикации",
|
||||
"tag-whitelist": "Списък от разрешени етикети",
|
||||
@@ -19,7 +18,6 @@
|
||||
"category-image": "Изображение на категорията",
|
||||
"parent-category": "Базова категория",
|
||||
"optional-parent-category": "(Незадължително) Базова категория",
|
||||
"top-level": "Най-горно ниво",
|
||||
"parent-category-none": "(Няма)",
|
||||
"copy-parent": "Копиране на базовата",
|
||||
"copy-settings": "Копиране на настройките от",
|
||||
@@ -32,8 +30,6 @@
|
||||
"edit": "Редактиране",
|
||||
"analytics": "Анализи",
|
||||
"view-category": "Преглед на категорията",
|
||||
"set-order": "Запазване на реда",
|
||||
"set-order-help": "Задаването на позиция за категорията ще я премести на желаното място и ще промени местата на другите категории, ако е необходимо. Най-малкият възможен номер е 1, което ще постави категорията най-отгоре.",
|
||||
|
||||
"select-category": "Изберете категория",
|
||||
"set-parent-category": "Задайте базова категория",
|
||||
@@ -50,8 +46,6 @@
|
||||
"privileges.no-users": "В тази категория няма правомощия за отделни потребители.",
|
||||
"privileges.section-group": "Група",
|
||||
"privileges.group-private": "Тази група е частна",
|
||||
"privileges.inheritance-exception": "Тази група не наследява правомощията от групата на регистрираните потребители",
|
||||
"privileges.banned-user-inheritance": "Блокираните потребители наследяват правомощията от групата на блокираните потребители",
|
||||
"privileges.search-group": "Добавяне на група",
|
||||
"privileges.copy-to-children": "Копиране в наследниците",
|
||||
"privileges.copy-from-category": "Копиране от категория",
|
||||
|
||||
@@ -25,7 +25,6 @@
|
||||
"access-topics": "Достъп до теми",
|
||||
"create-topics": "Създаване на теми",
|
||||
"reply-to-topics": "Отговаряне в теми",
|
||||
"schedule-topics": "Насрочване на теми",
|
||||
"tag-topics": "Поставяне на етикети на теми",
|
||||
"edit-posts": "Редактиране на публикации",
|
||||
"view-edit-history": "Преглед на историята на редакциите",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"users": "Потребители",
|
||||
"edit": "Actions",
|
||||
"edit": "Редактиране",
|
||||
"make-admin": "Даване на администраторски права",
|
||||
"remove-admin": "Отнемане на администраторски права",
|
||||
"validate-email": "Проверка на е-пощата",
|
||||
@@ -47,7 +47,6 @@
|
||||
"users.uid": "потр. ид.",
|
||||
"users.username": "потребителско име",
|
||||
"users.email": "е-поща",
|
||||
"users.ip": "IP адрес",
|
||||
"users.postcount": "брой публикации",
|
||||
"users.reputation": "репутация",
|
||||
"users.flags": "доклади",
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
{
|
||||
"section-dashboard": "Табла",
|
||||
"dashboard/overview": "Общ преглед",
|
||||
"dashboard/logins": "Вписвания",
|
||||
"dashboard/users": "Потребители",
|
||||
"dashboard/topics": "Теми",
|
||||
"dashboard": "Табло",
|
||||
"section-general": "Общи",
|
||||
|
||||
"section-manage": "Управление",
|
||||
|
||||
@@ -40,8 +40,5 @@
|
||||
"site-colors": "Мета-данни за цвета на уеб сайта",
|
||||
"theme-color": "Цвят на темата",
|
||||
"background-color": "Фонов цвят",
|
||||
"background-color-help": "Цвят, който да се използва като фон за началния екран, когато уеб сайтът е инсталиран като приложение",
|
||||
"undo-timeout": "Време за отмяна",
|
||||
"undo-timeout-help": "Някои действия, като например преместването на теми, могат да бъдат отменени от модератора в рамките на определено време. Задайте 0, за да забраните изцяло отменянето.",
|
||||
"topic-tools": "Инструменти за темите"
|
||||
"background-color-help": "Цвят, който да се използва като фон за началния екран, когато уеб сайтът е инсталиран като приложение"
|
||||
}
|
||||
@@ -1,12 +1,10 @@
|
||||
{
|
||||
"pagination": "Настройки за страницирането",
|
||||
"enable": "Разделяне на темите и публикациите на страници, вместо да се превърта безкрайно.",
|
||||
"posts": "Странициране в публикациите",
|
||||
"topics": "Странициране в темите",
|
||||
"posts-per-page": "Публикации на страница",
|
||||
"max-posts-per-page": "Максимален брой публикации на страница",
|
||||
"categories": "Странициране на категориите",
|
||||
"topics-per-page": "Теми на страница",
|
||||
"max-topics-per-page": "Максимален брой теми на страница",
|
||||
"categories-per-page": "Брой категории на страница"
|
||||
"max-topics-per-page": "Максимален брой теми на страница"
|
||||
}
|
||||
@@ -16,7 +16,5 @@
|
||||
|
||||
"flags": "Настройки за докладите",
|
||||
"flags.limit-per-target": "Максимален брой докладвания на едно и също нещо",
|
||||
"flags.limit-per-target-placeholder": "По подразбиране: 0",
|
||||
"flags.limit-per-target-help": "Когато публикация или потребител бъде докладван няколко пъти, това се добавя към един общ доклад. Задайте на тази настройка стойност по-голяма от нула, за да ограничите броя на докладванията, които могат да бъдат натрупани към една публикация или потребител.",
|
||||
"flags.auto-resolve-on-ban": "Автоматично премахване на всички доклади за потребител, когато той бъде блокиран"
|
||||
"flags.limit-per-target-placeholder": "По подразбиране: 0"
|
||||
}
|
||||
@@ -1,8 +1,6 @@
|
||||
{
|
||||
"tag": "Настройки за етикетите",
|
||||
"link-to-manage": "Управление на етикетите",
|
||||
"system-tags": "Системни етикети",
|
||||
"system-tags-help": "Само потребителите с по-високи правомощия ще могат да използват тези етикети.",
|
||||
"min-per-topic": "Минимален брой етикети за тема",
|
||||
"max-per-topic": "Максимален брой етикети за тема",
|
||||
"min-length": "Минимална дължина на етикетите",
|
||||
|
||||
@@ -21,9 +21,6 @@
|
||||
"topic-thumb-size": "Размер на миниатюрите за темите",
|
||||
"allowed-file-extensions": "Разрешени файлови разширения",
|
||||
"allowed-file-extensions-help": "Въведете файловите разширения, разделени със запетаи (пример: <code>pdf,xls,doc</code>). Ако списъкът е празен, всички файлови разширения ще бъдат разрешени.",
|
||||
"upload-limit-threshold": "Ограничаване на качванията на потребителите до:",
|
||||
"upload-limit-threshold-per-minute": "За %1 минута",
|
||||
"upload-limit-threshold-per-minutes": "За %1 минути",
|
||||
"profile-avatars": "Профилни изображения",
|
||||
"allow-profile-image-uploads": "Позволяване на потребителите да качват профилни изображения",
|
||||
"convert-profile-image-png": "Превръщане на качените профилни изображения във формата „PNG“",
|
||||
|
||||
@@ -18,6 +18,5 @@
|
||||
"watching.message": "Вече следите новите неща в категорията и подкатегориите ѝ",
|
||||
"notwatching.message": "Вече не следите новите неща в категорията и подкатегориите ѝ",
|
||||
"ignoring.message": "Вече пренебрегвате новите неща в тази категория и всички нейни подкатегории",
|
||||
"watched-categories": "Следени категории",
|
||||
"x-more-categories": "Още %1 категории"
|
||||
"watched-categories": "Следени категории"
|
||||
}
|
||||
@@ -22,7 +22,6 @@
|
||||
"invalid-username-or-password": "Моля, въведете потребителско име и парола",
|
||||
"invalid-search-term": "Грешен текст за търсене",
|
||||
"invalid-url": "Грешен адрес",
|
||||
"invalid-event": "Грешно събитие: %1",
|
||||
"local-login-disabled": "Системата за местно вписване е изключена за непривилегированите акаунти.",
|
||||
"csrf-invalid": "Не успяхме да Ви впишем, най-вероятно защото сесията Ви е изтекла. Моля, опитайте отново",
|
||||
"invalid-pagination-value": "Грешен номер на странициране, трябва да бъде между %1 и %2",
|
||||
@@ -84,19 +83,10 @@
|
||||
"tag-too-long": "Моля, въведете по-кратък етикет. Етикетите трябва да съдържат не повече от %1 символ(а)",
|
||||
"not-enough-tags": "Недостатъчно етикети. Темите трябва да имат поне %1 етикет(а)",
|
||||
"too-many-tags": "Твърде много етикети. Темите не могат да имат повече от %1 етикет(а)",
|
||||
"cant-use-system-tag": "Не можете да използвате този системен етикет.",
|
||||
"cant-remove-system-tag": "Не можете да премахнете този системен етикет.",
|
||||
"still-uploading": "Моля, изчакайте качването да приключи.",
|
||||
"file-too-big": "Максималният разрешен размер на файл е %1 КБ – моля, качете по-малък файл",
|
||||
"guest-upload-disabled": "Качването не е разрешено за гости",
|
||||
"cors-error": "Изображението не може да бъде качено поради неправилни настройки на CORS",
|
||||
"upload-ratelimit-reached": "Качили сте твърде много файлове наведнъж. Моля, опитайте отново по-късно.",
|
||||
"scheduling-to-past": "Изберете дата в бъдещето.",
|
||||
"invalid-schedule-date": "Въведете правилна дата и час.",
|
||||
"cant-pin-scheduled": "Насрочените теми не могат да бъдат закачени или разкачени.",
|
||||
"cant-merge-scheduled": "Насрочените теми не могат да бъдат сливани.",
|
||||
"cant-move-posts-to-scheduled": "Публикации не могат да бъдат премествани в насрочена тема.",
|
||||
"cant-move-from-scheduled-to-existing": "Публикации от насрочена тема не могат да бъдат премествани в съществуваща тема.",
|
||||
"already-bookmarked": "Вече имате отметка към тази публикация",
|
||||
"already-unbookmarked": "Вече сте премахнали отметката си от тази публикация",
|
||||
"cant-ban-other-admins": "Не можете да блокирате другите администратори!",
|
||||
@@ -175,10 +165,8 @@
|
||||
"cant-kick-self": "Не можете да изритате себе си от групата",
|
||||
"no-users-selected": "Няма избран(и) потребител(и)",
|
||||
"invalid-home-page-route": "Грешен път към началната страница",
|
||||
"invalid-session": "Изтекла сесия",
|
||||
"invalid-session-text": "Изглежда сесията Ви на вписване вече е изтекла. Моля, опреснете страницата.",
|
||||
"session-mismatch": "Несъответствие в сесията",
|
||||
"session-mismatch-text": "Изглежда сесията Ви на вписване вече не съответства на сървъра. Моля, опреснете страницата.",
|
||||
"invalid-session": "Несъответствие в сесията",
|
||||
"invalid-session-text": "Изглежда сесията Ви на вписване вече е изтекла или не съответства на сървъра. Моля, опреснете страницата.",
|
||||
"no-topics-selected": "Няма избрани теми!",
|
||||
"cant-move-to-same-topic": "Публикацията не може да бъде преместена в същата тема!",
|
||||
"cant-move-topic-to-same-category": "Темата не може да бъде преместена в същата категория!",
|
||||
@@ -189,8 +177,5 @@
|
||||
"already-unblocked": "Този потребител вече е отблокиран",
|
||||
"no-connection": "Изглежда има проблем с връзката Ви с Интернет",
|
||||
"socket-reconnect-failed": "В момента сървърът е недостъпен. Натиснете тук, за да опитате отново, или опитайте пак по-късно.",
|
||||
"plugin-not-whitelisted": "Добавката не може да бъде инсталирана – само добавки, одобрени от пакетния мениджър на NodeBB могат да бъдат инсталирани чрез ACP",
|
||||
"topic-event-unrecognized": "Събитието „%1“ на темата е неизвестно",
|
||||
"cant-set-child-as-parent": "Дъщерна категория не може да се зададе като базова такава",
|
||||
"cant-set-self-as-parent": "Категорията не може да се зададе като базова категория на себе си"
|
||||
"plugin-not-whitelisted": "Добавката не може да бъде инсталирана – само добавки, одобрени от пакетния мениджър на NodeBB могат да бъдат инсталирани чрез ACP"
|
||||
}
|
||||
@@ -6,7 +6,6 @@
|
||||
"assignee": "Назначен",
|
||||
"update": "Обновяване",
|
||||
"updated": "Обновено",
|
||||
"resolved": "Разрешен",
|
||||
"target-purged": "Съдържанието, за което се отнася този доклад, е било изтрито и вече не е налично.",
|
||||
|
||||
"graph-label": "Дневни етикети",
|
||||
@@ -27,7 +26,6 @@
|
||||
"filter-cid-all": "Всички категории",
|
||||
"apply-filters": "Прилагане на филтрите",
|
||||
"more-filters": "Още филтри",
|
||||
"fewer-filters": "По-малко филтри",
|
||||
|
||||
"quick-actions": "Бързи действия",
|
||||
"flagged-user": "Докладван потребител",
|
||||
|
||||
@@ -46,9 +46,7 @@
|
||||
"alert.success": "Готово",
|
||||
"alert.error": "Грешка",
|
||||
"alert.banned": "Блокиран",
|
||||
"alert.banned.message": "Вие току-що бяхте блокиран. Достъпът Ви до системата е ограничен.",
|
||||
"alert.unbanned": "Деблокиран",
|
||||
"alert.unbanned.message": "Блокирането Ви беше премахнато",
|
||||
"alert.banned.message": "Вие току-що бяхте блокиран. Сега ще излезете от системата.",
|
||||
"alert.unfollow": "Вие вече не следвате %1!",
|
||||
"alert.follow": "Вие следвате %1!",
|
||||
"users": "Потребители",
|
||||
@@ -95,8 +93,6 @@
|
||||
"guest": "Гост",
|
||||
"guests": "Гости",
|
||||
"former_user": "Бивш потребител",
|
||||
"system-user": "Системен",
|
||||
"unknown-user": "Непознат потребител",
|
||||
"updated.title": "Форумът е актуализиран",
|
||||
"updated.message": "Този форум току-що беше актуализиран до най-новата версия. Натиснете тук, за да опресните страницата.",
|
||||
"privacy": "Поверителност",
|
||||
|
||||
@@ -35,7 +35,8 @@
|
||||
"details.member_count": "Брой на членовете",
|
||||
"details.creation_date": "Дата на създаване",
|
||||
"details.description": "Описание",
|
||||
"details.member-post-cids": "Идентификатори на категории, от които да се показват публикации",
|
||||
"details.member-post-cids": "Категории, от които да се показват публикации",
|
||||
"details.member-post-cids-help": "<strong>Забележка</strong>: Ако не изберете нито една категория, ще се смята, че са включени всички категории. Използвайте <code>CTRL</code> и <code>SHIFT</code>, за да изберете няколко възможности.",
|
||||
"details.badge_preview": "Преглед на емблемата",
|
||||
"details.change_icon": "Промяна на иконката",
|
||||
"details.change_label_colour": "Промяна на цвета на етикета",
|
||||
|
||||
@@ -8,6 +8,5 @@
|
||||
"failed_login_attempt": "Неуспешно вписване",
|
||||
"login_successful": "Вие влязохте успешно!",
|
||||
"dont_have_account": "Нямате регистрация?",
|
||||
"logged-out-due-to-inactivity": "Вие излязохте автоматично от администраторския контролен панел, поради бездействие.",
|
||||
"caps-lock-enabled": "Главните букви са включени"
|
||||
"logged-out-due-to-inactivity": "Вие излязохте автоматично от администраторския контролен панел, поради бездействие."
|
||||
}
|
||||
@@ -60,11 +60,6 @@
|
||||
"composer.zen_mode": "Режим Дзен",
|
||||
"composer.select_category": "Изберете категория",
|
||||
"composer.textarea.placeholder": "Въведете съдържанието на публикацията си тук. Можете също да влачите и пускате снимки.",
|
||||
"composer.schedule-for": "Насрочване на тема за",
|
||||
"composer.schedule-date": "Дата",
|
||||
"composer.schedule-time": "Час",
|
||||
"composer.cancel-scheduling": "Отмяна на насрочването",
|
||||
"composer.set-schedule-date": "Задаване на дата",
|
||||
"bootbox.ok": "Добре",
|
||||
"bootbox.cancel": "Отказ",
|
||||
"bootbox.confirm": "Потвърждаване",
|
||||
|
||||
@@ -14,7 +14,6 @@
|
||||
"topics": "Теми",
|
||||
"replies": "Отговори",
|
||||
"chat": "Разговори",
|
||||
"group-chat": "Групови разговори",
|
||||
"follows": "Следвания",
|
||||
"upvote": "Положителни гласове",
|
||||
"new-flags": "Нови докладвания",
|
||||
@@ -48,8 +47,6 @@
|
||||
"posts-exported": "Публикациите на <strong>%1</strong> са изнесени, щракнете за сваляне",
|
||||
"uploads-exported": "Качванията на <strong>%1</strong> са изнесени, щракнете за сваляне",
|
||||
"users-csv-exported": "Потребителите са изнесени във формат „csv“, щракнете за сваляне",
|
||||
"post-queue-accepted": "Вашата публикация, която чакаше в опашката, беше приета. Натиснете тук, за да я видите.",
|
||||
"post-queue-rejected": "Вашата публикация, която чакаше в опашката, беше отхвърлена.",
|
||||
"email-confirmed": "Е-пощата беше потвърдена",
|
||||
"email-confirmed-message": "Благодарим Ви, че потвърдихте е-пощата си. Акаунтът Ви е вече напълно активиран.",
|
||||
"email-confirm-error-message": "Възникна проблем при потвърждаването на е-пощата Ви. Може кодът да е грешен или давността му да е изтекла.",
|
||||
|
||||
@@ -24,8 +24,5 @@
|
||||
"interstitial.errors-found": "Не можем да завършим Вашата регистрация:",
|
||||
"gdpr_agree_data": "Съгласявам се това личната ми информация да се съхранява и обработва от този уеб сайт.",
|
||||
"gdpr_agree_email": "Съгласявам се да получавам е-писма с резюмета и известия от този уеб сайт.",
|
||||
"gdpr_consent_denied": "Трябва да се съгласите с това уеб сайтът да събира/обработва информацията Ви, и да Ви изпраща е-писма.",
|
||||
"invite.error-admin-only": "Директното регистриране е изключено. Моля, свържете се с администратор за повече подробности.",
|
||||
"invite.error-invite-only": "Директното регистриране е изключено. Трябва да получите покана от вече регистриран потребител, за да имате достъп до този форум.",
|
||||
"invite.error-invalid-data": "Получените данни за регистрация не съответстват на нашите записи. Моля, свържете се с администратор за повече подробности."
|
||||
"gdpr_consent_denied": "Трябва да се съгласите с това уеб сайтът да събира/обработва информацията Ви, и да Ви изпраща е-писма."
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"success": "Готово",
|
||||
"topic-post": "Вие публикувахте успешно.",
|
||||
"post-queued": "Публикацията Ви е поставена в опашка за одобрение. Ще получите известие, когато тя бъде одобрена или отхвърлена.",
|
||||
"post-queued": "Публикацията Ви е добавена в опашката за одобрение.",
|
||||
"authentication-successful": "Успешно удостоверяване",
|
||||
"settings-saved": "Настройките са запазени!"
|
||||
}
|
||||
@@ -1,6 +1,5 @@
|
||||
{
|
||||
"topic": "Тема",
|
||||
"title": "Заглавие",
|
||||
"no_topics_found": "Няма намерени теми!",
|
||||
"no_posts_found": "Няма намерени публикации!",
|
||||
"post_is_deleted": "Публикацията е изтрита!",
|
||||
@@ -31,25 +30,16 @@
|
||||
"locked": "Заключена",
|
||||
"pinned": "Закачена",
|
||||
"pinned-with-expiry": "Закачена до %1",
|
||||
"scheduled": "Насрочена",
|
||||
"moved": "Преместена",
|
||||
"moved-from": "Преместена от %1",
|
||||
"copy-ip": "Копиране на IP адреса",
|
||||
"ban-ip": "Блокиране на IP адреса",
|
||||
"view-history": "История на редакциите",
|
||||
"locked-by": "Заключена от",
|
||||
"unlocked-by": "Отключена от",
|
||||
"pinned-by": "Закачена от",
|
||||
"unpinned-by": "Откачена от",
|
||||
"deleted-by": "Изтрита от",
|
||||
"restored-by": "Възстановена от",
|
||||
"queued-by": "Публикацията е добавена в опашката за одобрение →",
|
||||
"bookmark_instructions": "Щракнете тук, за да се върнете към последно прочетената публикация в тази тема.",
|
||||
"flag-post": "Докладване на тази публикация",
|
||||
"flag-user": "Докладване на този потребител",
|
||||
"already-flagged": "Вече е докладвано",
|
||||
"view-flag-report": "Преглед на доклада",
|
||||
"resolve-flag": "Разрешаване на доклада",
|
||||
"merged_message": "Тази тема беше слята в <a href=\"%1\">%2</a>",
|
||||
"deleted_message": "Темата е изтрита. Само потребители с права за управление на темите могат да я видят.",
|
||||
"following_topic.message": "Вече ще получавате известия когато някой публикува коментар в тази тема.",
|
||||
@@ -114,7 +104,6 @@
|
||||
"move_post": "Преместване на публикацията",
|
||||
"post_moved": "Публикацията беше преместена!",
|
||||
"fork_topic": "Разделяне на темата",
|
||||
"enter-new-topic-title": "Въведете заглавието на новата тема",
|
||||
"fork_topic_instruction": "Натиснете публикациите, които искате да отделите",
|
||||
"fork_no_pids": "Няма избрани публикации!",
|
||||
"no-posts-selected": "Няма избрани публикации!",
|
||||
@@ -128,17 +117,14 @@
|
||||
"merge-options": "Настройки за сливането",
|
||||
"merge-select-main-topic": "Изберете основната тема",
|
||||
"merge-new-title-for-topic": "Ново заглавие за темата",
|
||||
"topic-id": "Ид. на темата",
|
||||
"move_posts_instruction": "Щракнете върху публикациите, които искате да преместите, а след това въведете ид. на тема или отидете в целевата тема",
|
||||
"move_posts_instruction": "Натиснете публикациите, които искате да преместите, а след това идете в желаната тема и натиснете „Преместване“.",
|
||||
"change_owner_instruction": "Натиснете публикациите, които искате да прехвърлите на друг потребител",
|
||||
"composer.title_placeholder": "Въведете заглавието на темата си тук...",
|
||||
"composer.handle_placeholder": "Въведете името тук",
|
||||
"composer.discard": "Отхвърляне",
|
||||
"composer.submit": "Публикуване",
|
||||
"composer.schedule": "Насрочване",
|
||||
"composer.replying_to": "Отговор на %1",
|
||||
"composer.new_topic": "Нова тема",
|
||||
"composer.editing": "Редактиране",
|
||||
"composer.uploading": "качване...",
|
||||
"composer.thumb_url_label": "Поставете адреса на иконка за темата",
|
||||
"composer.thumb_title": "Добавете иконка към тази тема",
|
||||
@@ -166,10 +152,8 @@
|
||||
"diffs.current-revision": "текуща версия",
|
||||
"diffs.original-revision": "оригинална версия",
|
||||
"diffs.restore": "Възстановяване на тази версия",
|
||||
"diffs.restore-description": "След възстановяването към историята на редакциите на тази публикация ще бъде добавена нова версия.",
|
||||
"diffs.restore-description": "Към историята на редакциите на тази публикация ще бъде добавена нова версия.",
|
||||
"diffs.post-restored": "Публикацията е възстановена успешно до по-ранна версия",
|
||||
"diffs.delete": "Изтриване на тази версия ",
|
||||
"diffs.deleted": "Версията е изтрита",
|
||||
"timeago_later": "%1 по-късно",
|
||||
"timeago_earlier": "%1 по-рано",
|
||||
"first-post": "Първа публикация",
|
||||
|
||||
@@ -84,7 +84,6 @@
|
||||
"remove_cover_picture_confirm": "Наистина ли искате да премахнете снимката на корицата?",
|
||||
"crop_picture": "Орязване на снимката",
|
||||
"upload_cropped_picture": "Орязване и качване",
|
||||
"avatar-background-colour": "Фонов цвят за изображението",
|
||||
"settings": "Настройки",
|
||||
"show_email": "Да се показва е-пощата ми",
|
||||
"show_fullname": "Да се показва цялото ми име",
|
||||
@@ -136,7 +135,7 @@
|
||||
"homepage": "Начална страница",
|
||||
"homepage_description": "Изберете страница, която да използвате като начална за форума, или „Нищо“, за да използвате тази по подразбиране.",
|
||||
"custom_route": "Път до персонализираната начална страница",
|
||||
"custom_route_help": "Въведете името на пътя тук, без наклонена черта пред него (пример: „recent“ или \"category/2/general-discussion\")",
|
||||
"custom_route_help": "Въведете името на пътя тук, без наклонена черта пред него (пример: „recent“ или „popular“)",
|
||||
"sso.title": "Услуги за еднократно вписване",
|
||||
"sso.associated": "Свързан с",
|
||||
"sso.not-associated": "Натиснете тук, за да свържете с",
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
"forum-traffic": "Forum Traffic",
|
||||
"page-views": "Page Views",
|
||||
"unique-visitors": "Unique Visitors",
|
||||
"logins": "Logins",
|
||||
"new-users": "New Users",
|
||||
"posts": "Posts",
|
||||
"topics": "Topics",
|
||||
@@ -30,7 +29,6 @@
|
||||
"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>This is a <strong>pre-release</strong> version of NodeBB. Unintended bugs may occur. <i class=\"fa fa-exclamation-triangle\"></i></p>",
|
||||
"fallback-emailer-not-found": "Fallback emailer not found!",
|
||||
"running-in-development": "<span>Forum is running in development mode. The forum may be open to potential vulnerabilities; please contact your system administrator.</span>",
|
||||
"latest-lookup-failed": "<p>Failed to look up latest available version of NodeBB</p>",
|
||||
|
||||
@@ -77,12 +75,5 @@
|
||||
"graphs.registered-users": "Registered Users",
|
||||
"graphs.anonymous-users": "Anonymous Users",
|
||||
"last-restarted-by": "Last restarted by",
|
||||
"no-users-browsing": "No users browsing",
|
||||
|
||||
"back-to-dashboard": "Back to Dashboard",
|
||||
"details.no-users": "No users have joined within the selected timeframe",
|
||||
"details.no-topics": "No topics have been posted within the selected timeframe",
|
||||
"details.no-logins": "No logins have been recorded within the selected timeframe",
|
||||
"details.logins-static": "NodeBB only saves session data for %1 days, and so this table below will only show the most recently active sessions",
|
||||
"details.logins-login-time": "Login Time"
|
||||
"no-users-browsing": "No users browsing"
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
"alert.upgraded": "Plugin Upgraded",
|
||||
"alert.installed": "Plugin Installed",
|
||||
"alert.uninstalled": "Plugin Uninstalled",
|
||||
"alert.activate-success": "Please rebuild and restart your NodeBB to fully activate this plugin",
|
||||
"alert.activate-success": "Please restart your NodeBB to fully activate this plugin",
|
||||
"alert.deactivate-success": "Plugin successfully deactivated",
|
||||
"alert.upgrade-success": "Please rebuild and restart your NodeBB to fully upgrade this plugin.",
|
||||
"alert.install-success": "Plugin successfully installed, please activate the plugin.",
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
"custom-class": "Custom Class",
|
||||
"num-recent-replies": "# of Recent Replies",
|
||||
"ext-link": "External Link",
|
||||
"subcategories-per-page": "Subcategories per page",
|
||||
"is-section": "Treat this category as a section",
|
||||
"post-queue": "Post queue",
|
||||
"tag-whitelist": "Tag Whitelist",
|
||||
@@ -19,7 +18,6 @@
|
||||
"category-image": "Category Image",
|
||||
"parent-category": "Parent Category",
|
||||
"optional-parent-category": "(Optional) Parent Category",
|
||||
"top-level": "Top Level",
|
||||
"parent-category-none": "(None)",
|
||||
"copy-parent": "Copy Parent",
|
||||
"copy-settings": "Copy Settings From",
|
||||
@@ -32,8 +30,6 @@
|
||||
"edit": "Edit",
|
||||
"analytics": "Analytics",
|
||||
"view-category": "View category",
|
||||
"set-order": "Set order",
|
||||
"set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.",
|
||||
|
||||
"select-category": "Select Category",
|
||||
"set-parent-category": "Set Parent Category",
|
||||
@@ -50,8 +46,6 @@
|
||||
"privileges.no-users": "No user-specific privileges in this category.",
|
||||
"privileges.section-group": "Group",
|
||||
"privileges.group-private": "This group is private",
|
||||
"privileges.inheritance-exception": "This group does not inherit privileges from registered-users group",
|
||||
"privileges.banned-user-inheritance": "Banned users inherit privileges from banned-users group",
|
||||
"privileges.search-group": "Add Group",
|
||||
"privileges.copy-to-children": "Copy to Children",
|
||||
"privileges.copy-from-category": "Copy from Category",
|
||||
|
||||
@@ -25,7 +25,6 @@
|
||||
"access-topics": "Access Topics",
|
||||
"create-topics": "Create Topics",
|
||||
"reply-to-topics": "Reply to Topics",
|
||||
"schedule-topics": "Schedule Topics",
|
||||
"tag-topics": "Tag Topics",
|
||||
"edit-posts": "Edit Posts",
|
||||
"view-edit-history": "View Edit History",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"users": "Users",
|
||||
"edit": "Actions",
|
||||
"edit": "Edit",
|
||||
"make-admin": "Make Admin",
|
||||
"remove-admin": "Remove Admin",
|
||||
"validate-email": "Validate Email",
|
||||
@@ -47,7 +47,6 @@
|
||||
"users.uid": "uid",
|
||||
"users.username": "username",
|
||||
"users.email": "email",
|
||||
"users.ip": "IP",
|
||||
"users.postcount": "postcount",
|
||||
"users.reputation": "reputation",
|
||||
"users.flags": "flags",
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
{
|
||||
"section-dashboard": "Dashboards",
|
||||
"dashboard/overview": "Overview",
|
||||
"dashboard/logins": "Logins",
|
||||
"dashboard/users": "Users",
|
||||
"dashboard/topics": "Topics",
|
||||
"dashboard": "Dashboard",
|
||||
"section-general": "General",
|
||||
|
||||
"section-manage": "Manage",
|
||||
|
||||
@@ -40,8 +40,5 @@
|
||||
"site-colors": "Site Color Metadata",
|
||||
"theme-color": "Theme Color",
|
||||
"background-color": "Background Color",
|
||||
"background-color-help": "Color used for splash screen background when website is installed as a PWA",
|
||||
"undo-timeout": "Undo Timeout",
|
||||
"undo-timeout-help": "Some operations such as moving topics will allow for the moderator to undo their action within a certain timeframe. Set to 0 to disable undo completely.",
|
||||
"topic-tools": "Topic Tools"
|
||||
"background-color-help": "Color used for splash screen background when website is installed as a PWA"
|
||||
}
|
||||
@@ -1,12 +1,10 @@
|
||||
{
|
||||
"pagination": "Pagination Settings",
|
||||
"enable": "Paginate topics and posts instead of using infinite scroll.",
|
||||
"posts": "Post Pagination",
|
||||
"topics": "Topic Pagination",
|
||||
"posts-per-page": "Posts per Page",
|
||||
"max-posts-per-page": "Maximum posts per page",
|
||||
"categories": "Category Pagination",
|
||||
"topics-per-page": "Topics per Page",
|
||||
"max-topics-per-page": "Maximum topics per page",
|
||||
"categories-per-page": "Categories per page"
|
||||
"max-topics-per-page": "Maximum topics per page"
|
||||
}
|
||||
@@ -16,7 +16,5 @@
|
||||
|
||||
"flags": "Flag Settings",
|
||||
"flags.limit-per-target": "Maximum number of times something can be flagged",
|
||||
"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 "report" and added to the original flag. Set this option to a number other than zero to limit the number of reports an item can receive.",
|
||||
"flags.auto-resolve-on-ban": "Automatically resolve all of a user's tickets when they are banned"
|
||||
"flags.limit-per-target-placeholder": "Default: 0"
|
||||
}
|
||||
@@ -1,8 +1,6 @@
|
||||
{
|
||||
"tag": "Tag Settings",
|
||||
"link-to-manage": "Manage Tags",
|
||||
"system-tags": "System Tags",
|
||||
"system-tags-help": "Only privileged users will be able to use these tags.",
|
||||
"min-per-topic": "Minimum Tags per Topic",
|
||||
"max-per-topic": "Maximum Tags per Topic",
|
||||
"min-length": "Minimum Tag Length",
|
||||
|
||||
@@ -21,9 +21,6 @@
|
||||
"topic-thumb-size": "Topic Thumb Size",
|
||||
"allowed-file-extensions": "Allowed File Extensions",
|
||||
"allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. <code>pdf,xls,doc</code>). An empty list means all extensions are allowed.",
|
||||
"upload-limit-threshold": "Rate limit user uploads to:",
|
||||
"upload-limit-threshold-per-minute": "Per %1 Minute",
|
||||
"upload-limit-threshold-per-minutes": "Per %1 Minutes",
|
||||
"profile-avatars": "Profile Avatars",
|
||||
"allow-profile-image-uploads": "Allow users to upload profile images",
|
||||
"convert-profile-image-png": "Convert profile image uploads to PNG",
|
||||
|
||||
@@ -9,15 +9,14 @@
|
||||
"no_new_posts": "নতুন কোন পোস্ট নাই",
|
||||
"watch": "নজর রাখুন",
|
||||
"ignore": "উপেক্ষা করুন",
|
||||
"watching": "দৃশ্যমান",
|
||||
"not-watching": "দেখা হচ্ছে না",
|
||||
"ignoring": "উপেক্ষারত",
|
||||
"watching.description": "অপঠিত এবং সাম্প্রতিক বিষয়গুলো দেখাও",
|
||||
"watching": "Watching",
|
||||
"not-watching": "Not Watching",
|
||||
"ignoring": "Ignoring",
|
||||
"watching.description": "Show topics in unread and recent",
|
||||
"not-watching.description": "Do not show topics in unread, show in recent",
|
||||
"ignoring.description": "Do not show topics in unread and recent",
|
||||
"watching.message": "You are now watching updates from this category and all subcategories",
|
||||
"notwatching.message": "You are not watching updates from this category and all subcategories",
|
||||
"ignoring.message": "You are now ignoring updates from this category and all subcategories",
|
||||
"watched-categories": "প্রেক্ষিত বিভাগসমূহ",
|
||||
"x-more-categories": "%1 more categories"
|
||||
"watched-categories": "প্রেক্ষিত বিভাগসমূহ"
|
||||
}
|
||||
@@ -22,7 +22,6 @@
|
||||
"invalid-username-or-password": "অনুগ্রহ পূর্বক ইউজারনেম এবং পাসওয়ার্ড উভয়ই প্রদান করুন",
|
||||
"invalid-search-term": "অগ্রহনযোগ্য সার্চ টার্ম",
|
||||
"invalid-url": "Invalid URL",
|
||||
"invalid-event": "Invalid event: %1",
|
||||
"local-login-disabled": "Local login system has been disabled for non-privileged accounts.",
|
||||
"csrf-invalid": "We were unable to log you in, likely due to an expired session. Please try again",
|
||||
"invalid-pagination-value": "Invalid pagination value, must be at least %1 and at most %2",
|
||||
@@ -84,19 +83,10 @@
|
||||
"tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)",
|
||||
"not-enough-tags": "Not enough tags. Topics must have at least %1 tag(s)",
|
||||
"too-many-tags": "Too many tags. Topics can't have more than %1 tag(s)",
|
||||
"cant-use-system-tag": "You can not use this system tag.",
|
||||
"cant-remove-system-tag": "You can not remove this system tag.",
|
||||
"still-uploading": "আপলোড সম্পূর্ণ জন্য অনুগ্রহ করে অপেক্ষা করুন",
|
||||
"file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file",
|
||||
"guest-upload-disabled": "Guest uploading has been disabled",
|
||||
"cors-error": "Unable to upload image due to misconfigured CORS",
|
||||
"upload-ratelimit-reached": "You have uploaded too many files at one time. Please try again later.",
|
||||
"scheduling-to-past": "Please select a date in the future.",
|
||||
"invalid-schedule-date": "Please enter a valid date and time.",
|
||||
"cant-pin-scheduled": "Scheduled topics cannot be (un)pinned.",
|
||||
"cant-merge-scheduled": "Scheduled topics cannot be merged.",
|
||||
"cant-move-posts-to-scheduled": "Can't move posts to a scheduled topic.",
|
||||
"cant-move-from-scheduled-to-existing": "Can't move posts from a scheduled topic to an existing topic.",
|
||||
"already-bookmarked": "You have already bookmarked this post",
|
||||
"already-unbookmarked": "You have already unbookmarked this post",
|
||||
"cant-ban-other-admins": "আপনি অন্য এ্যাডমিনদের নিষিদ্ধ করতে পারেন না!",
|
||||
@@ -175,10 +165,8 @@
|
||||
"cant-kick-self": "You can't kick yourself from the group",
|
||||
"no-users-selected": "No user(s) selected",
|
||||
"invalid-home-page-route": "Invalid home page route",
|
||||
"invalid-session": "Invalid Session",
|
||||
"invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.",
|
||||
"session-mismatch": "Session Mismatch",
|
||||
"session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.",
|
||||
"invalid-session": "Session Mismatch",
|
||||
"invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page.",
|
||||
"no-topics-selected": "No topics selected!",
|
||||
"cant-move-to-same-topic": "Can't move post to same topic!",
|
||||
"cant-move-topic-to-same-category": "Can't move topic to the same category!",
|
||||
@@ -189,8 +177,5 @@
|
||||
"already-unblocked": "This user is already unblocked",
|
||||
"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",
|
||||
"plugin-not-whitelisted": "Unable to install plugin – only plugins whitelisted by the NodeBB Package Manager can be installed via the ACP",
|
||||
"topic-event-unrecognized": "Topic event '%1' unrecognized",
|
||||
"cant-set-child-as-parent": "Can't set child as parent category",
|
||||
"cant-set-self-as-parent": "Can't set self as parent category"
|
||||
"plugin-not-whitelisted": "Unable to install plugin – only plugins whitelisted by the NodeBB Package Manager can be installed via the ACP"
|
||||
}
|
||||
@@ -6,7 +6,6 @@
|
||||
"assignee": "Assignee",
|
||||
"update": "Update",
|
||||
"updated": "Updated",
|
||||
"resolved": "Resolved",
|
||||
"target-purged": "The content this flag referred to has been purged and is no longer available.",
|
||||
|
||||
"graph-label": "Daily Flags",
|
||||
@@ -27,7 +26,6 @@
|
||||
"filter-cid-all": "All categories",
|
||||
"apply-filters": "Apply Filters",
|
||||
"more-filters": "More Filters",
|
||||
"fewer-filters": "Fewer Filters",
|
||||
|
||||
"quick-actions": "Quick Actions",
|
||||
"flagged-user": "Flagged User",
|
||||
|
||||
@@ -46,9 +46,7 @@
|
||||
"alert.success": "সফল",
|
||||
"alert.error": "ত্রুটি",
|
||||
"alert.banned": "নিষিদ্ধ",
|
||||
"alert.banned.message": "You have just been banned, your access is now restricted.",
|
||||
"alert.unbanned": "Unbanned",
|
||||
"alert.unbanned.message": "Your ban has been lifted.",
|
||||
"alert.banned.message": "আপনাকে কেবলই নিষিদ্ধ করা হয়েছে, আপনি এখন লগআউট হয়ে যাবেন।",
|
||||
"alert.unfollow": "আপনি আর %1 কে অনুসরণ করছেন না!",
|
||||
"alert.follow": "আপনি এখন %1 কে অনুসরণ করছেন!",
|
||||
"users": "ব্যবহারকারীগণ",
|
||||
@@ -95,8 +93,6 @@
|
||||
"guest": "অতিথি",
|
||||
"guests": "অতিথি",
|
||||
"former_user": "A Former User",
|
||||
"system-user": "System",
|
||||
"unknown-user": "Unknown user",
|
||||
"updated.title": "ফোরাম আপডেট করা হয়েছে",
|
||||
"updated.message": "এই ফোরামে এইমাত্র সর্বশেষ সংস্করণে আপডেট করা হয়েছে। পৃষ্ঠাটি রিফ্রেশ করতে এখানে ক্লিক করুন।",
|
||||
"privacy": "নিরাপত্তা",
|
||||
|
||||
@@ -35,7 +35,8 @@
|
||||
"details.member_count": "Member Count",
|
||||
"details.creation_date": "Creation Date",
|
||||
"details.description": "Description",
|
||||
"details.member-post-cids": "Category IDs to display posts from",
|
||||
"details.member-post-cids": "Categories to display posts from",
|
||||
"details.member-post-cids-help": "<strong>Note</strong>: Selecting no categories will assume all categories are included. Use <code>ctrl</code> and <code>shift</code> to select multiple options.",
|
||||
"details.badge_preview": "Badge Preview",
|
||||
"details.change_icon": "Change Icon",
|
||||
"details.change_label_colour": "Change Label Colour",
|
||||
|
||||
@@ -8,6 +8,5 @@
|
||||
"failed_login_attempt": "Login Unsuccessful",
|
||||
"login_successful": "আপনি সফলভাবে প্রবেশ করেছেন!",
|
||||
"dont_have_account": "কোন একাউন্ট নেই?",
|
||||
"logged-out-due-to-inactivity": "You have been logged out of the Admin Control Panel due to inactivity",
|
||||
"caps-lock-enabled": "Caps Lock is enabled"
|
||||
"logged-out-due-to-inactivity": "You have been logged out of the Admin Control Panel due to inactivity"
|
||||
}
|
||||
@@ -60,11 +60,6 @@
|
||||
"composer.zen_mode": "Zen Mode",
|
||||
"composer.select_category": "Select a category",
|
||||
"composer.textarea.placeholder": "Enter your post content here, drag and drop images",
|
||||
"composer.schedule-for": "Schedule topic for",
|
||||
"composer.schedule-date": "Date",
|
||||
"composer.schedule-time": "Time",
|
||||
"composer.cancel-scheduling": "Cancel Scheduling",
|
||||
"composer.set-schedule-date": "Set Date",
|
||||
"bootbox.ok": "OK",
|
||||
"bootbox.cancel": "Cancel",
|
||||
"bootbox.confirm": "Confirm",
|
||||
|
||||
@@ -14,7 +14,6 @@
|
||||
"topics": "Topics",
|
||||
"replies": "Replies",
|
||||
"chat": "Chats",
|
||||
"group-chat": "Group Chats",
|
||||
"follows": "Follows",
|
||||
"upvote": "Upvotes",
|
||||
"new-flags": "New Flags",
|
||||
@@ -48,8 +47,6 @@
|
||||
"posts-exported": "<strong>%1</strong> posts exported, click to download",
|
||||
"uploads-exported": "<strong>%1</strong> uploads 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-rejected": "Your queued post has been rejected.",
|
||||
"email-confirmed": "ইমেইল নিশ্চিত করা হয়েছে",
|
||||
"email-confirmed-message": "আপনার ইমেইল যাচাই করার জন্য আপনাকে ধন্যবাদ। আপনার অ্যাকাউন্টটি এখন সম্পূর্ণরূপে সক্রিয়।",
|
||||
"email-confirm-error-message": "আপনার ইমেল ঠিকানার বৈধতা যাচাইয়ে একটি সমস্যা হয়েছে। সম্ভবত কোডটি ভুল ছিল অথবা কোডের মেয়াদ শেষ হয়ে গিয়েছে।",
|
||||
|
||||
@@ -24,8 +24,5 @@
|
||||
"interstitial.errors-found": "আপনার নিবন্ধনটি সম্পূর্ণ করা সম্ভব হয় নি।",
|
||||
"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_consent_denied": "You must give consent to this site to collect/process your information, and to send you emails.",
|
||||
"invite.error-admin-only": "Direct user registration has been disabled. Please contact an administrator for more details.",
|
||||
"invite.error-invite-only": "Direct user registration has been disabled. You must be invited by an existing user in order to access this forum.",
|
||||
"invite.error-invalid-data": "The registration data received does not correspond to our records. Please contact an administrator for more details"
|
||||
"gdpr_consent_denied": "You must give consent to this site to collect/process your information, and to send you emails."
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"success": "সফল হয়েছে",
|
||||
"topic-post": "আপনি সফলভাবে পোষ্ট করেছেন। ",
|
||||
"post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.",
|
||||
"post-queued": "Your post is queued for approval.",
|
||||
"authentication-successful": "অথেন্টিকেশন সফল হয়েছে",
|
||||
"settings-saved": "সেটিংস সেভ করা হয়েছে। "
|
||||
}
|
||||
@@ -1,6 +1,5 @@
|
||||
{
|
||||
"topic": "টপিক",
|
||||
"title": "Title",
|
||||
"no_topics_found": "কোন টপিক পাওয়া যায়নি!",
|
||||
"no_posts_found": "কোন পোস্ট পাওয়া যায়নি",
|
||||
"post_is_deleted": "এই পোস্টটি মুছে ফেলা হয়েছে!",
|
||||
@@ -31,25 +30,16 @@
|
||||
"locked": "বন্ধ",
|
||||
"pinned": "Pinned",
|
||||
"pinned-with-expiry": "Pinned until %1",
|
||||
"scheduled": "Scheduled",
|
||||
"moved": "Moved",
|
||||
"moved-from": "Moved from %1",
|
||||
"copy-ip": "Copy IP",
|
||||
"ban-ip": "Ban IP",
|
||||
"view-history": "Edit History",
|
||||
"locked-by": "Locked by",
|
||||
"unlocked-by": "Unlocked by",
|
||||
"pinned-by": "Pinned by",
|
||||
"unpinned-by": "Unpinned by",
|
||||
"deleted-by": "Deleted by",
|
||||
"restored-by": "Restored by",
|
||||
"queued-by": "Post queued for approval →",
|
||||
"bookmark_instructions": "Click here to return to the last read post in this thread.",
|
||||
"flag-post": "Flag this post",
|
||||
"flag-user": "Flag this user",
|
||||
"already-flagged": "Already Flagged",
|
||||
"view-flag-report": "View Flag Report",
|
||||
"resolve-flag": "Resolve Flag",
|
||||
"merged_message": "This topic has been merged into <a href=\"%1\">%2</a>",
|
||||
"deleted_message": "এই টপিকটি মুছে ফেলা হয়েছে। শুধুমাত্র টপিক ব্যবস্থাপনার ক্ষমতাপ্রাপ্ত সদস্যগণ এটি দেখতে পারবেন।",
|
||||
"following_topic.message": "এখন থেকে এই টপিকে অন্যকেউ পোস্ট করলে আপনি নোটিফিকেশন পাবেন।",
|
||||
@@ -114,7 +104,6 @@
|
||||
"move_post": "পোষ্ট সরান",
|
||||
"post_moved": "পোষ্ট সরানো হয়েছে",
|
||||
"fork_topic": "টপিক ফর্ক করুন",
|
||||
"enter-new-topic-title": "Enter new topic title",
|
||||
"fork_topic_instruction": "যে পোষ্টটি ফর্ক করতে চান সেটি ক্লিক করুন",
|
||||
"fork_no_pids": "কোন পোষ্ট সিলেক্ট করা হয় নি",
|
||||
"no-posts-selected": "No posts selected!",
|
||||
@@ -128,17 +117,14 @@
|
||||
"merge-options": "Merge options",
|
||||
"merge-select-main-topic": "Select the main topic",
|
||||
"merge-new-title-for-topic": "New title for topic",
|
||||
"topic-id": "Topic ID",
|
||||
"move_posts_instruction": "Click the posts you want to move then enter a topic ID or go to the target topic",
|
||||
"move_posts_instruction": "Click the posts you want to move then go to target topic and click move.",
|
||||
"change_owner_instruction": "Click the posts you want to assign to another user",
|
||||
"composer.title_placeholder": "আপনার টপিকের শিরোনাম দিন",
|
||||
"composer.handle_placeholder": "Enter your name/handle here",
|
||||
"composer.discard": "বাতিল",
|
||||
"composer.submit": "সাবমিট",
|
||||
"composer.schedule": "Schedule",
|
||||
"composer.replying_to": "%1 এর উত্তরে:",
|
||||
"composer.new_topic": "নতুন টপিক",
|
||||
"composer.editing": "Editing",
|
||||
"composer.uploading": "আপলোডিং",
|
||||
"composer.thumb_url_label": "টপিকে থাম্বনেইল URL পেষ্ট করুন",
|
||||
"composer.thumb_title": "এই টপিকে থাম্বনেইল যোগ করুন",
|
||||
@@ -166,10 +152,8 @@
|
||||
"diffs.current-revision": "current revision",
|
||||
"diffs.original-revision": "original revision",
|
||||
"diffs.restore": "Restore this revision",
|
||||
"diffs.restore-description": "A new revision will be appended to this post's edit history after restoring.",
|
||||
"diffs.restore-description": "A new revision will be appended to this post's edit history.",
|
||||
"diffs.post-restored": "Post successfully restored to earlier revision",
|
||||
"diffs.delete": "Delete this revision",
|
||||
"diffs.deleted": "Revision deleted",
|
||||
"timeago_later": "%1 later",
|
||||
"timeago_earlier": "%1 earlier",
|
||||
"first-post": "First post",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"uploading-file": "ফাইল পাঠানো হচ্ছে...",
|
||||
"select-file-to-upload": "পাঠানোর জন্য নথি নির্বাচন",
|
||||
"uploading-file": "Uploading the file...",
|
||||
"select-file-to-upload": "Select a file to upload!",
|
||||
"upload-success": "File uploaded successfully!",
|
||||
"maximum-file-size": "Maximum %1 kb",
|
||||
"no-uploads-found": "No uploads found",
|
||||
|
||||
@@ -84,7 +84,6 @@
|
||||
"remove_cover_picture_confirm": "Are you sure you want to remove the cover picture?",
|
||||
"crop_picture": "Crop picture",
|
||||
"upload_cropped_picture": "Crop and upload",
|
||||
"avatar-background-colour": "Avatar background colour",
|
||||
"settings": "সেটিংস",
|
||||
"show_email": "আমার ইমেইল দেখাও",
|
||||
"show_fullname": "আমার সম্পূর্ণ নাম দেখাও",
|
||||
@@ -136,7 +135,7 @@
|
||||
"homepage": "Homepage",
|
||||
"homepage_description": "Select a page to use as the forum homepage or 'None' to use the default homepage.",
|
||||
"custom_route": "Custom Homepage Route",
|
||||
"custom_route_help": "Enter a route name here, without any preceding slash (e.g. \"recent\" or \"category/2/general-discussion\")",
|
||||
"custom_route_help": "Enter a route name here, without any preceding slash (e.g. \"recent\", or \"popular\")",
|
||||
"sso.title": "Single Sign-on Services",
|
||||
"sso.associated": "Associated with",
|
||||
"sso.not-associated": "Click here to associate with",
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
"forum-traffic": "Provoz fóra",
|
||||
"page-views": "Zobrazení stránky",
|
||||
"unique-visitors": "Jedineční návštěvníci",
|
||||
"logins": "Logins",
|
||||
"new-users": "Nový uživatelé",
|
||||
"posts": "Příspěvky",
|
||||
"topics": "Témata",
|
||||
@@ -30,7 +29,6 @@
|
||||
"upgrade-available": "<p>Nová verze (v%1) byla zveřejněna. Zvažte <a href=\"https://docs.nodebb.org/configuring/upgrade/\" target=\"_blank\">aktualizaci vašeho NodeBB</a>.</p>",
|
||||
"prerelease-upgrade-available": "<p>Toto je zastaralá testovací verze NodeBB. Nová verze (v%1) byla zveřejněna. Zvažte <a href=\"https://docs.nodebb.org/configuring/upgrade/\" target=\"_blank\">aktualizaci vaší verze NodeBB</a>.</p>",
|
||||
"prerelease-warning": "<p>Toto je <strong>zkušební</strong> verze NodeBB. Mohou se vyskytnout různé chyby.<i class=\"fa fa-exclamation-triangle\"></i></p>",
|
||||
"fallback-emailer-not-found": "Fallback emailer not found!",
|
||||
"running-in-development": "<span>Fórum běží ve vývojářském režimu a může být potencionálně zranitelné . Kontaktujte správce systému.</span>",
|
||||
"latest-lookup-failed": "<p>Náhled na poslední dostupnou verzi NodeBB</p>",
|
||||
|
||||
@@ -77,12 +75,5 @@
|
||||
"graphs.registered-users": "Registrovaní uživatelé",
|
||||
"graphs.anonymous-users": "Anonymní uživatelé",
|
||||
"last-restarted-by": "Poslední restart od",
|
||||
"no-users-browsing": "Nikdo si nic neprohlíží",
|
||||
|
||||
"back-to-dashboard": "Back to Dashboard",
|
||||
"details.no-users": "No users have joined within the selected timeframe",
|
||||
"details.no-topics": "No topics have been posted within the selected timeframe",
|
||||
"details.no-logins": "No logins have been recorded within the selected timeframe",
|
||||
"details.logins-static": "NodeBB only saves session data for %1 days, and so this table below will only show the most recently active sessions",
|
||||
"details.logins-login-time": "Login Time"
|
||||
"no-users-browsing": "Nikdo si nic neprohlíží"
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
"alert.upgraded": "Rozšíření bylo aktualizováno",
|
||||
"alert.installed": "Rozšíření bylo nainstalováno",
|
||||
"alert.uninstalled": "Rozšíření bylo odinstalováno",
|
||||
"alert.activate-success": "Please rebuild and restart your NodeBB to fully activate this plugin",
|
||||
"alert.activate-success": "Pro plnou aktivaci tohoto rozšíření, restartujte NodeBB",
|
||||
"alert.deactivate-success": "Rozšíření bylo úspěšně deaktivováno",
|
||||
"alert.upgrade-success": "Pro úplnou aktualizace tohoto rozšíření, znovu sestavte a restartujte NodeBB.",
|
||||
"alert.install-success": "Rozšíření bylo úspěšně nainstalováno, můžete ho aktivovat.",
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
"custom-class": "Upravit třídu",
|
||||
"num-recent-replies": "# posledních odpovědí",
|
||||
"ext-link": "Externí odkaz",
|
||||
"subcategories-per-page": "Subcategories per page",
|
||||
"is-section": "Zacházet s kategorii jako se sekcí",
|
||||
"post-queue": "Post queue",
|
||||
"tag-whitelist": "Seznam povolených značek",
|
||||
@@ -19,7 +18,6 @@
|
||||
"category-image": "Obrázek kategorie",
|
||||
"parent-category": "Nadřazená kategorie",
|
||||
"optional-parent-category": "Nadřazená kategorie (doporučeno)",
|
||||
"top-level": "Top Level",
|
||||
"parent-category-none": "(nic)",
|
||||
"copy-parent": "Kopírovat nadřazenou",
|
||||
"copy-settings": "Kopírovat nastavení z",
|
||||
@@ -32,8 +30,6 @@
|
||||
"edit": "Upravit",
|
||||
"analytics": "Analytika",
|
||||
"view-category": "Zobrazit kategorii",
|
||||
"set-order": "Set order",
|
||||
"set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.",
|
||||
|
||||
"select-category": "Vyberte kategorii",
|
||||
"set-parent-category": "Nastavit nadřazenou kategorii",
|
||||
@@ -50,8 +46,6 @@
|
||||
"privileges.no-users": "V této kategorii není nastaveno žádné oprávnění uživatele.",
|
||||
"privileges.section-group": "Skupina",
|
||||
"privileges.group-private": "Tato skupina je soukromá",
|
||||
"privileges.inheritance-exception": "This group does not inherit privileges from registered-users group",
|
||||
"privileges.banned-user-inheritance": "Banned users inherit privileges from banned-users group",
|
||||
"privileges.search-group": "Přidat skupinu",
|
||||
"privileges.copy-to-children": "Kopírovat do podřazené",
|
||||
"privileges.copy-from-category": "Kopírovat z kategorie",
|
||||
|
||||
@@ -25,7 +25,6 @@
|
||||
"access-topics": "Přístup k tématům",
|
||||
"create-topics": "Vytvořit téma",
|
||||
"reply-to-topics": "Odpovědět na téma",
|
||||
"schedule-topics": "Schedule Topics",
|
||||
"tag-topics": "Označit téma",
|
||||
"edit-posts": "Upravit příspěvek",
|
||||
"view-edit-history": "Zobrazit historii editace",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"users": "Uživatelé",
|
||||
"edit": "Actions",
|
||||
"edit": "Upravit",
|
||||
"make-admin": "Učinit správcem",
|
||||
"remove-admin": "Odebrat správce",
|
||||
"validate-email": "Ověřit e-mail",
|
||||
@@ -47,7 +47,6 @@
|
||||
"users.uid": "uid",
|
||||
"users.username": "jméno",
|
||||
"users.email": "e-mail",
|
||||
"users.ip": "IP",
|
||||
"users.postcount": "počet příspěvků",
|
||||
"users.reputation": "reputace",
|
||||
"users.flags": "označení",
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
{
|
||||
"section-dashboard": "Dashboards",
|
||||
"dashboard/overview": "Overview",
|
||||
"dashboard/logins": "Logins",
|
||||
"dashboard/users": "Users",
|
||||
"dashboard/topics": "Topics",
|
||||
"dashboard": "Dashboard",
|
||||
"section-general": "Všeobecné",
|
||||
|
||||
"section-manage": "Spravovat",
|
||||
|
||||
@@ -40,8 +40,5 @@
|
||||
"site-colors": "Site Color Metadata",
|
||||
"theme-color": "Theme Color",
|
||||
"background-color": "Background Color",
|
||||
"background-color-help": "Color used for splash screen background when website is installed as a PWA",
|
||||
"undo-timeout": "Undo Timeout",
|
||||
"undo-timeout-help": "Some operations such as moving topics will allow for the moderator to undo their action within a certain timeframe. Set to 0 to disable undo completely.",
|
||||
"topic-tools": "Topic Tools"
|
||||
"background-color-help": "Color used for splash screen background when website is installed as a PWA"
|
||||
}
|
||||
@@ -1,12 +1,10 @@
|
||||
{
|
||||
"pagination": "Nastavení stránkování",
|
||||
"enable": "Stránkovat témata a příspěvky namísto nekonečného posouvání",
|
||||
"posts": "Post Pagination",
|
||||
"topics": "Stránkování témat",
|
||||
"posts-per-page": "Příspěvků na stránku",
|
||||
"max-posts-per-page": "Maximální množství příspěvků na stránku",
|
||||
"categories": "Stránkování kategorii",
|
||||
"topics-per-page": "Témat na stránku",
|
||||
"max-topics-per-page": "Maximální množství témat na stránku",
|
||||
"categories-per-page": "Categories per page"
|
||||
"max-topics-per-page": "Maximální množství témat na stránku"
|
||||
}
|
||||
@@ -16,7 +16,5 @@
|
||||
|
||||
"flags": "Flag Settings",
|
||||
"flags.limit-per-target": "Maximum number of times something can be flagged",
|
||||
"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 "report" and added to the original flag. Set this option to a number other than zero to limit the number of reports an item can receive.",
|
||||
"flags.auto-resolve-on-ban": "Automatically resolve all of a user's tickets when they are banned"
|
||||
"flags.limit-per-target-placeholder": "Default: 0"
|
||||
}
|
||||
@@ -1,8 +1,6 @@
|
||||
{
|
||||
"tag": "Nastavení značky",
|
||||
"link-to-manage": "Manage Tags",
|
||||
"system-tags": "System Tags",
|
||||
"system-tags-help": "Only privileged users will be able to use these tags.",
|
||||
"min-per-topic": "Minimální počet značek/téma",
|
||||
"max-per-topic": "maximální počet značek/téma",
|
||||
"min-length": "Minimální délka značky",
|
||||
|
||||
@@ -21,9 +21,6 @@
|
||||
"topic-thumb-size": "Velikost miniatury tématu",
|
||||
"allowed-file-extensions": "Povolené přípony souborů",
|
||||
"allowed-file-extensions-help": "Zadejte seznam přípon souborů oddělených čárkou (např.: <code>pdf, xls, doc</code>). Prázdný seznam znamená, že všechny přípony jsou povoleny.",
|
||||
"upload-limit-threshold": "Rate limit user uploads to:",
|
||||
"upload-limit-threshold-per-minute": "Per %1 Minute",
|
||||
"upload-limit-threshold-per-minutes": "Per %1 Minutes",
|
||||
"profile-avatars": "Profilové obrázky",
|
||||
"allow-profile-image-uploads": "Povolit uživatelům nahrát profilové obrázky",
|
||||
"convert-profile-image-png": "Převést profilové obrázky do *.png",
|
||||
|
||||
@@ -18,6 +18,5 @@
|
||||
"watching.message": "Nyní sledujete aktualizace pro tuto kategorii a všech podkategorii",
|
||||
"notwatching.message": "Nyní nesledujete aktualizace z této kategorie a všech podkategorií",
|
||||
"ignoring.message": "Nyní ignorujete aktualizace této kategorie a všech jejich kategorii",
|
||||
"watched-categories": "Sledované kategorie",
|
||||
"x-more-categories": "%1 more categories"
|
||||
"watched-categories": "Sledované kategorie"
|
||||
}
|
||||
@@ -22,7 +22,6 @@
|
||||
"invalid-username-or-password": "Zadejte prosím uživatelské jméno a i heslo",
|
||||
"invalid-search-term": "Neplatný výraz pro vyhledávání",
|
||||
"invalid-url": "Neplatné URL",
|
||||
"invalid-event": "Invalid event: %1",
|
||||
"local-login-disabled": "Systém přihlášení pro místní účty byl zakázán pro neoprávněné účty.",
|
||||
"csrf-invalid": "Není možné vás přihlásit, díky vypršení relace. Zkuste to prosím znovu.",
|
||||
"invalid-pagination-value": "Neplatná hodnota stránkování, musí být alespoň %1 a nejvýše %2",
|
||||
@@ -68,9 +67,9 @@
|
||||
"post-delete-duration-expired-minutes": "Je vám umožněno odstranit příspěvky jen po %1 minut/y od jeho vytvoření",
|
||||
"post-delete-duration-expired-minutes-seconds": "Je vám umožněno odstranit příspěvky jen po %1 minut/y %2 sekund/y od jeho vytvoření",
|
||||
"post-delete-duration-expired-hours": "Je vám umožněno odstranit příspěvky jen po %1 hodin/y od jeho vytvoření",
|
||||
"post-delete-duration-expired-hours-minutes": "Je vám umožněno odstranit příspěvky jen po %1 hodin/y %2 minut/y od jeho vytvoření",
|
||||
"post-delete-duration-expired-days": "Je vám umožněno odstranit příspěvky jen po %1 den/y/ů od jeho vytvoření",
|
||||
"post-delete-duration-expired-days-hours": "Je vám umožněno odstranit příspěvky jen po %1 den/y/ů %2 hodin/y od jeho vytvoření",
|
||||
"post-delete-duration-expired-hours-minutes": "Je vám umožněno odstranit příspěvky jen po 1% hodin/y %2 minut/y od jeho vytvoření",
|
||||
"post-delete-duration-expired-days": "Je vám umožněno odstranit příspěvky jen po 1% den/y/ů od jeho vytvoření",
|
||||
"post-delete-duration-expired-days-hours": "Je vám umožněno odstranit příspěvky jen po 1% den/y/ů %2 hodin/y od jeho vytvoření",
|
||||
"cant-delete-topic-has-reply": "Nemůžete odstranit vaše téma, po tom co obsahuje odpověď",
|
||||
"cant-delete-topic-has-replies": "Téma nelze odstranit poté, co obsahuje %1 odpovědí",
|
||||
"content-too-short": "Zadejte prosím delší příspěvek. Každý příspěvek musí obsahovat alespoň %1 znaků.",
|
||||
@@ -84,19 +83,10 @@
|
||||
"tag-too-long": "Zadejte kratší značku. Značky nesmí být delší než %1 znaků",
|
||||
"not-enough-tags": "Málo značek. Téma musí obsahovat alespoň %1 značek",
|
||||
"too-many-tags": "Příliš mnoho značek. Téma nesmí mít více než %1 značek",
|
||||
"cant-use-system-tag": "You can not use this system tag.",
|
||||
"cant-remove-system-tag": "You can not remove this system tag.",
|
||||
"still-uploading": "Vyčkejte, než se vše kompletně nahraje.",
|
||||
"file-too-big": "Maximální povolená velikost je %1 kB – nahrajte menší soubor",
|
||||
"guest-upload-disabled": "Nahrávání od hostů nebylo povoleno",
|
||||
"cors-error": "Není možné nahrát obrázek díky špatně nakonfigurovanému „Cross-Origin Resource Sharing (CORS)”",
|
||||
"upload-ratelimit-reached": "You have uploaded too many files at one time. Please try again later.",
|
||||
"scheduling-to-past": "Please select a date in the future.",
|
||||
"invalid-schedule-date": "Please enter a valid date and time.",
|
||||
"cant-pin-scheduled": "Scheduled topics cannot be (un)pinned.",
|
||||
"cant-merge-scheduled": "Scheduled topics cannot be merged.",
|
||||
"cant-move-posts-to-scheduled": "Can't move posts to a scheduled topic.",
|
||||
"cant-move-from-scheduled-to-existing": "Can't move posts from a scheduled topic to an existing topic.",
|
||||
"already-bookmarked": "Již jste tento příspěvek zazáložkoval",
|
||||
"already-unbookmarked": "Již jste u tohoto příspěvku odebral záložku",
|
||||
"cant-ban-other-admins": "Nemůžete zablokovat jiné správce.",
|
||||
@@ -175,10 +165,8 @@
|
||||
"cant-kick-self": "Nemůžete vyhodit sami sebe ze skupiny",
|
||||
"no-users-selected": "Žádný uživatel/é nebyl/y vybrán/i",
|
||||
"invalid-home-page-route": "Neplatná cesta k domovské stránkce",
|
||||
"invalid-session": "Invalid Session",
|
||||
"invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.",
|
||||
"session-mismatch": "Session Mismatch",
|
||||
"session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.",
|
||||
"invalid-session": "Nesoulad v relacích",
|
||||
"invalid-session-text": "Zdá se, že vše relace s přihlášením již není aktivní nebo již neodpovídá s relací na serveru. Obnovte prosím tuto stránku.",
|
||||
"no-topics-selected": "Žádná vybraná témata.",
|
||||
"cant-move-to-same-topic": "Není možné přesunout příspěvek do stejného tématu!",
|
||||
"cant-move-topic-to-same-category": "Can't move topic to the same category!",
|
||||
@@ -189,8 +177,5 @@
|
||||
"already-unblocked": "Tento uživatel již byl odblokován",
|
||||
"no-connection": "Zdá se, že nastal problém s připojením k internetu",
|
||||
"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 – only plugins whitelisted by the NodeBB Package Manager can be installed via the ACP",
|
||||
"topic-event-unrecognized": "Topic event '%1' unrecognized",
|
||||
"cant-set-child-as-parent": "Can't set child as parent category",
|
||||
"cant-set-self-as-parent": "Can't set self as parent category"
|
||||
"plugin-not-whitelisted": "Unable to install plugin – only plugins whitelisted by the NodeBB Package Manager can be installed via the ACP"
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user