mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-12-24 09:20:32 +01:00
Compare commits
21 Commits
v1.18.4
...
v1.16.2-be
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9f6ad7637e | ||
|
|
fdf7e65331 | ||
|
|
1cc32705fe | ||
|
|
a60ea2ec7a | ||
|
|
4066d994ff | ||
|
|
de9bec2bb1 | ||
|
|
3aecd20096 | ||
|
|
54804d4789 | ||
|
|
55cefcba35 | ||
|
|
3da8b93578 | ||
|
|
b265e6f68b | ||
|
|
a6a02fb773 | ||
|
|
49583fe48b | ||
|
|
14e211fb68 | ||
|
|
7b98fab95c | ||
|
|
a373731570 | ||
|
|
a76b5d15e0 | ||
|
|
a06b84d258 | ||
|
|
ecf212d307 | ||
|
|
dc6fc65322 | ||
|
|
27b481765b |
@@ -10,7 +10,7 @@ checks:
|
||||
threshold: 500
|
||||
method-lines:
|
||||
config:
|
||||
threshold: 75
|
||||
threshold: 50
|
||||
method-complexity:
|
||||
config:
|
||||
threshold: 10
|
||||
|
||||
139
.eslintrc
139
.eslintrc
@@ -1,3 +1,140 @@
|
||||
{
|
||||
"extends": "nodebb"
|
||||
"extends": "airbnb-base",
|
||||
"parserOptions": {
|
||||
"sourceType": "script"
|
||||
},
|
||||
|
||||
"rules": {
|
||||
// Customized
|
||||
"handle-callback-err": [ "error","^(e$|(e|(.*(_e|E)))rr)" ],
|
||||
"comma-dangle": ["error", {
|
||||
"arrays": "always-multiline",
|
||||
"objects": "always-multiline",
|
||||
"imports": "always-multiline",
|
||||
"exports": "always-multiline",
|
||||
"functions": "never"
|
||||
}],
|
||||
"no-return-await": "off",
|
||||
"no-constant-condition": "off",
|
||||
"no-empty": ["error", { "allowEmptyCatch": true }],
|
||||
"no-underscore-dangle": "off",
|
||||
"no-console": "off",
|
||||
"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",
|
||||
"no-shadow": "off",
|
||||
"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
|
||||
"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",
|
||||
"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"
|
||||
}
|
||||
}
|
||||
|
||||
6
.github/dependabot.yml
vendored
6
.github/dependabot.yml
vendored
@@ -1,6 +0,0 @@
|
||||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: npm
|
||||
directory: "/install"
|
||||
schedule:
|
||||
interval: daily
|
||||
51
.github/workflows/docker.yml
vendored
51
.github/workflows/docker.yml
vendored
@@ -1,51 +0,0 @@
|
||||
name: Run Docker
|
||||
|
||||
# Controls when the workflow will run
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- 'master'
|
||||
- 'v*.x'
|
||||
tags:
|
||||
- 'v*'
|
||||
workflow_dispatch:
|
||||
|
||||
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
|
||||
jobs:
|
||||
release:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v1
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v1
|
||||
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@v1
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
|
||||
- name: Docker meta
|
||||
id: meta
|
||||
uses: docker/metadata-action@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
|
||||
1254
CHANGELOG.md
1254
CHANGELOG.md
File diff suppressed because it is too large
Load Diff
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);
|
||||
}
|
||||
|
||||
@@ -15,7 +15,6 @@ Additional functionality is enabled through the use of third-party plugins.
|
||||
* [Help translate NodeBB](https://www.transifex.com/projects/p/nodebb/)
|
||||
* [NodeBB Blog](http://blog.nodebb.org)
|
||||
* [Premium Hosting for NodeBB](http://www.nodebb.org/ "NodeBB")
|
||||
* Unofficial IRC community – channel `#nodebb` on Libera.chat
|
||||
* [Follow us on Twitter](http://www.twitter.com/NodeBB/ "NodeBB Twitter")
|
||||
* [Like us on Facebook](http://www.facebook.com/NodeBB/ "NodeBB Facebook")
|
||||
|
||||
|
||||
4
app.js
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
|
||||
}
|
||||
|
||||
@@ -14,33 +14,27 @@
|
||||
"newbiePostEditDuration": 3600,
|
||||
"postDeleteDuration": 0,
|
||||
"enablePostHistory": 1,
|
||||
"topicBacklinks": 1,
|
||||
"postCacheSize": 10485760,
|
||||
"disableChat": 0,
|
||||
"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,
|
||||
@@ -66,6 +60,7 @@
|
||||
"profileImageDimension": 200,
|
||||
"profile:convertProfileImageToPNG": 0,
|
||||
"profile:keepAllUserImages": 0,
|
||||
"requireEmailConfirmation": 0,
|
||||
"gdpr_enabled": 1,
|
||||
"allowProfileImageUploads": 1,
|
||||
"teaserPost": "last-reply",
|
||||
@@ -106,11 +101,7 @@
|
||||
"maxPostsPerPage": 20,
|
||||
"topicsPerPage": 20,
|
||||
"postsPerPage": 20,
|
||||
"categoriesPerPage": 50,
|
||||
"userSearchResultsPerPage": 50,
|
||||
"searchDefaultSortBy": "relevance",
|
||||
"searchDefaultIn": "titlesposts",
|
||||
"searchDefaultInQuick": "titles",
|
||||
"maximumGroupNameLength": 255,
|
||||
"maximumGroupTitleLength": 40,
|
||||
"preventTopicDeleteAfterReplies": 0,
|
||||
@@ -137,7 +128,6 @@
|
||||
"disableEmailSubscriptions": 0,
|
||||
"emailConfirmInterval": 10,
|
||||
"removeEmailNotificationImages": 0,
|
||||
"includeUnverifiedEmails": 0,
|
||||
"inviteExpiration": 7,
|
||||
"dailyDigestFreq": "off",
|
||||
"digestHour": 17,
|
||||
|
||||
@@ -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.18.4",
|
||||
"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.3.7",
|
||||
"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.6.0",
|
||||
"connect-mongo": "3.2.0",
|
||||
"connect-multiparty": "^2.2.0",
|
||||
"connect-pg-simple": "^7.0.0",
|
||||
"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": "8.0.0",
|
||||
"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-deserialize": "2.0.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": "4.1.3",
|
||||
"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": "7.0.8",
|
||||
"nodebb-plugin-dbsearch": "5.0.5",
|
||||
"nodebb-plugin-emoji": "^3.5.0",
|
||||
"nodebb-plugin-emoji-android": "2.0.5",
|
||||
"nodebb-plugin-markdown": "8.14.3",
|
||||
"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.2.11",
|
||||
"nodebb-theme-slick": "1.4.13",
|
||||
"nodebb-theme-vanilla": "12.1.3",
|
||||
"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.5.0",
|
||||
"passport": "^0.4.1",
|
||||
"passport-http-bearer": "^1.0.1",
|
||||
"passport-local": "1.0.0",
|
||||
"pg": "^8.7.1",
|
||||
"pg-cursor": "^2.7.1",
|
||||
"postcss": "8.3.9",
|
||||
"postcss-clean": "1.2.0",
|
||||
"prompt": "^1.1.0",
|
||||
"ioredis": "4.27.10",
|
||||
"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.29.1",
|
||||
"sitemap": "^7.0.0",
|
||||
"sharp": "0.27.0",
|
||||
"sitemap": "^6.1.0",
|
||||
"slideout": "1.0.1",
|
||||
"socket.io": "4.2.0",
|
||||
"socket.io": "3.1.0",
|
||||
"socket.io-adapter-cluster": "^1.0.1",
|
||||
"socket.io-client": "4.2.0",
|
||||
"@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",
|
||||
"yargs": "17.2.1",
|
||||
"xregexp": "^4.3.0",
|
||||
"yargs": "16.2.0",
|
||||
"zxcvbn": "^4.4.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@apidevtools/swagger-parser": "10.0.3",
|
||||
"@commitlint/cli": "13.2.0",
|
||||
"@commitlint/config-angular": "13.2.0",
|
||||
"coveralls": "3.1.1",
|
||||
"eslint": "7.32.0",
|
||||
"eslint-config-nodebb": "0.0.2",
|
||||
"eslint-plugin-import": "2.24.2",
|
||||
"grunt": "1.4.1",
|
||||
"@apidevtools/swagger-parser": "10.0.2",
|
||||
"@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.22.1",
|
||||
"grunt": "1.3.0",
|
||||
"grunt-contrib-watch": "1.1.0",
|
||||
"husky": "7.0.2",
|
||||
"jsdom": "17.0.0",
|
||||
"lint-staged": "11.2.0",
|
||||
"mocha": "9.1.2",
|
||||
"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;
|
||||
|
||||
@@ -1,3 +1,53 @@
|
||||
{
|
||||
"extends": "nodebb/public"
|
||||
"globals": {
|
||||
"app": true,
|
||||
"io": true,
|
||||
"socket": true,
|
||||
"ajaxify": true,
|
||||
"config": true,
|
||||
"utils": true,
|
||||
"overrides": true,
|
||||
"componentHandler": true,
|
||||
"bootbox": true,
|
||||
"Visibility": true,
|
||||
"Tinycon": true,
|
||||
"Promise": true
|
||||
},
|
||||
"env": {
|
||||
"jquery": true,
|
||||
"amd": true,
|
||||
"browser": true,
|
||||
"es6": true
|
||||
},
|
||||
"rules": {
|
||||
"block-scoped-var": "off",
|
||||
"no-dupe-class-members": "off",
|
||||
"no-var": "off",
|
||||
"object-shorthand": "off",
|
||||
"prefer-arrow-callback": "off",
|
||||
"prefer-spread": "off",
|
||||
"prefer-object-spread": "off",
|
||||
"prefer-reflect": "off",
|
||||
"prefer-template": "off"
|
||||
},
|
||||
"parserOptions": {
|
||||
"ecmaVersion": 2018,
|
||||
"ecmaFeatures": {
|
||||
"classes": false,
|
||||
"defaultParams": false,
|
||||
"blockBindings": false,
|
||||
"forOf": false,
|
||||
"generators": false,
|
||||
"globalReturn": false,
|
||||
"jsx": false,
|
||||
"modules": false,
|
||||
"objectLiteralComputedProperties": false,
|
||||
"objectLiteralDuplicateProperties": false,
|
||||
"objectLiteralShorthandMethods": false,
|
||||
"objectLiteralShorthandProperties": false,
|
||||
"impliedStrict": false,
|
||||
"restParams": false,
|
||||
"superInFunctions": false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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": "تم تثبيت الإضافة بنجاح، يرجى تفعيلها.",
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
"delete": "Delete",
|
||||
"enable": "Enable",
|
||||
"disable": "Disable",
|
||||
"control-panel": "Rewards Control",
|
||||
"new-reward": "New Reward",
|
||||
|
||||
"alert.delete-success": "Successfully deleted reward",
|
||||
"alert.no-inputs-found": "Illegal reward - no inputs found!",
|
||||
|
||||
@@ -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",
|
||||
@@ -51,13 +50,10 @@
|
||||
"alert.saved": "Privilege changes saved and applied",
|
||||
"alert.confirm-discard": "Are you sure you wish to discard your privilege changes?",
|
||||
"alert.discarded": "Privilege changes discarded",
|
||||
"alert.confirm-copyToAll": "Are you sure you wish to apply this set of <strong>%1</strong> to <strong>all categories</strong>?",
|
||||
"alert.confirm-copyToAllGroup": "Are you sure you wish to apply this group's set of <strong>%1</strong> to <strong>all categories</strong>?",
|
||||
"alert.confirm-copyToChildren": "Are you sure you wish to apply this set of <strong>%1</strong> to <strong>all descendant (child) categories</strong>?",
|
||||
"alert.confirm-copyToChildrenGroup": "Are you sure you wish to apply this group's set of <strong>%1</strong> to <strong>all descendant (child) categories</strong>?",
|
||||
"alert.confirm-copyToAll": "Are you sure you wish to apply this privilege set to <strong>all categories</strong>?",
|
||||
"alert.confirm-copyToAllGroup": "Are you sure you wish to apply this group's privilege set to <strong>all categories</strong>?",
|
||||
"alert.confirm-copyToChildren": "Are you sure you wish to apply this privilege set to <strong>all descendant (child) categories</strong>?",
|
||||
"alert.confirm-copyToChildrenGroup": "Are you sure you wish to apply this group's privilege set to <strong>all descendant (child) categories</strong>?",
|
||||
"alert.no-undo": "<em>This action cannot be undone.</em>",
|
||||
"alert.admin-warning": "Administrators implicitly get all privileges",
|
||||
"alert.copyPrivilegesFrom-title": "Select a category to copy from",
|
||||
"alert.copyPrivilegesFrom-warning": "This will copy <strong>%1</strong> from the selected category.",
|
||||
"alert.copyPrivilegesFromGroup-warning": "This will copy this group's set of <strong>%1</strong> from the selected category."
|
||||
"alert.admin-warning": "Administrators implicitly get all privileges"
|
||||
}
|
||||
@@ -2,6 +2,7 @@
|
||||
"none": "Your forum does not have any topics with tags yet.",
|
||||
"bg-color": "Background Colour",
|
||||
"text-color": "Text Colour",
|
||||
"create-modify": "Create & Modify Tags",
|
||||
"description": "Select tags by clicking or dragging, use <code>CTRL</code> to select multiple tags.",
|
||||
"create": "Create Tag",
|
||||
"modify": "Modify Tags",
|
||||
|
||||
@@ -5,7 +5,5 @@
|
||||
"orphaned": "Orphaned",
|
||||
"size/filecount": "Size / Filecount",
|
||||
"confirm-delete": "Do you really want to delete this file?",
|
||||
"filecount": "%1 files",
|
||||
"new-folder": "New Folder",
|
||||
"name-new-folder": "Enter a name for new the folder"
|
||||
"filecount": "%1 files"
|
||||
}
|
||||
@@ -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": "إدارة",
|
||||
|
||||
@@ -36,9 +36,6 @@
|
||||
"subscriptions.disable": "Disable email digests",
|
||||
"subscriptions.hour": "Digest Hour",
|
||||
"subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. <code>0</code> for midnight, <code>17</code> for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.<br /> The approximate server time is: <span id=\"serverTime\"></span><br /> The next daily digest is scheduled to be sent <span id=\"nextDigestTime\"></span>",
|
||||
"notifications.remove-images": "Remove images from email notifications",
|
||||
"require-email-address": "Require new users to specify an email address",
|
||||
"require-email-address-warning": "By default, users can opt-out of entering an email address. Enabling this option means they have to enter an email address in order to proceed with registration. <strong>It does not ensure user will enter a real email address, nor even an address they own.</strong>",
|
||||
"include-unverified-emails": "Send emails to recipients who have not explicitly confirmed their emails",
|
||||
"include-unverified-warning": "By default, users with emails associated with their account have already been verified, but there are situations where this is not the case (e.g. SSO logins, grandfathered users, etc). <strong>Enable this setting at your own risk</strong> – sending emails to unverified addresses may be a violation of regional anti-spam laws."
|
||||
"notifications.settings": "Email notification settings",
|
||||
"notifications.remove-images": "Remove images from email notifications"
|
||||
}
|
||||
@@ -35,16 +35,10 @@
|
||||
"maskable-icon.help": "Recommended size and format: 512x512, PNG format only. If no maskable icon is specified, NodeBB will fall back to the Touch Icon.",
|
||||
"outgoing-links": "Outgoing Links",
|
||||
"outgoing-links.warning-page": "Use Outgoing Links Warning Page",
|
||||
"search": "Search",
|
||||
"search-default-in": "Search In",
|
||||
"search-default-in-quick": "Quick Search In",
|
||||
"search-default-sort-by": "Sort by",
|
||||
"search-default-sort-by": "الترتيب الافتراضي للبحث",
|
||||
"outgoing-links.whitelist": "Domains to whitelist for bypassing the warning page",
|
||||
"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"
|
||||
}
|
||||
@@ -2,6 +2,5 @@
|
||||
"notifications": "Notifications",
|
||||
"welcome-notification": "Welcome Notification",
|
||||
"welcome-notification-link": "Welcome Notification Link",
|
||||
"welcome-notification-uid": "Welcome Notification User (UID)",
|
||||
"post-queue-notification-uid": "Post Queue User (UID)"
|
||||
"welcome-notification-uid": "Welcome Notification User (UID)"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -56,9 +56,6 @@
|
||||
"composer.show-help": "Show \"Help\" tab",
|
||||
"composer.enable-plugin-help": "Allow plugins to add content to the help tab",
|
||||
"composer.custom-help": "Custom Help Text",
|
||||
"backlinks": "Backlinks",
|
||||
"backlinks.enabled": "Enable topic backlinks",
|
||||
"backlinks.help": "If a post references another topic, a link back to the post will be inserted into the referenced topic at that point in time.",
|
||||
"ip-tracking": "IP Tracking",
|
||||
"ip-tracking.each-post": "Track IP Address for each post",
|
||||
"enable-post-history": "Enable Post History"
|
||||
|
||||
@@ -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": "الأقسام المُتابعة"
|
||||
}
|
||||
@@ -6,9 +6,7 @@
|
||||
"greeting_no_name": "مرحبًا",
|
||||
"greeting_with_name": "مرحبًا بك يا %1",
|
||||
"email.verify-your-email.subject": "Please verify your email",
|
||||
"email.verify.text1": "You've requested that we change or confirm your email address",
|
||||
"email.verify.text2": "For security purposes, we only change or confirm the email address on file once its ownership has been confirmed via email. <strong>If you did not request this, no action is required on your part.</strong>",
|
||||
"email.verify.text3": "Once you confirm this email address, we will replace your current email address with this one (%1).",
|
||||
"email.verify.text1": "Your email address has changed!",
|
||||
"welcome.text1": "شكرًا على تسجيلك في %1!",
|
||||
"welcome.text2": "لتفعيل حسابك، نحتاج إلى التأكد من صحة عنوان البريد الإلكتروني الذي سجلت به.",
|
||||
"welcome.text3": "تم قبول نتسجيلك ، يمكنك الدخول باتسخدام اسم المستخدم و كلمة المرور.",
|
||||
|
||||
@@ -22,20 +22,16 @@
|
||||
"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-path": "Invalid path",
|
||||
"folder-exists": "Folder exists",
|
||||
"invalid-pagination-value": "رقم الصفحة غير صحيح ، يجب أن يكون بين %1 و %2 .",
|
||||
"username-taken": "اسم المستخدم مأخوذ",
|
||||
"email-taken": "البريد الالكتروني مأخوذ",
|
||||
"email-nochange": "The email entered is the same as the email already on file.",
|
||||
"email-invited": "Email was already invited",
|
||||
"email-not-confirmed": "Posting in some categories or topics is enabled once your email is confirmed, please click here to send a confirmation email.",
|
||||
"email-not-confirmed": "You are unable to post until your email is confirmed, please click here to confirm your email.",
|
||||
"email-not-confirmed-chat": "لا يمكنك الدردشة حتى تقوم بتأكيد بريدك الإلكتروني، الرجاء إضغط هنا لتأكيد بريدك اﻹلكتروني.",
|
||||
"email-not-confirmed-email-sent": "Your email has not been confirmed yet, please check your inbox for the confirmation email. You won't be able to post or chat until your email is confirmed.",
|
||||
"no-email-to-confirm": "Your account does not have an email set. An email is necessary for account recovery. Please click here to enter an email.",
|
||||
"no-email-to-confirm": "هذا المنتدى يستلزم تفعيل بريدك الإلكتروني، انقر هنا من فضلك لإدخاله.",
|
||||
"email-confirm-failed": "لم نستطع تفعيل بريدك الإلكتروني، المرجو المحاولة لاحقًا.",
|
||||
"confirm-email-already-sent": "لقد تم ارسال بريد التأكيد، الرجاء اﻹنتظار 1% دقائق لإعادة اﻹرسال",
|
||||
"sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.",
|
||||
@@ -87,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": "لايمكن حظر مدبر نظام آخر.",
|
||||
@@ -178,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!",
|
||||
@@ -192,18 +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",
|
||||
"api.master-token-no-uid": "A master token was received without a corresponding `_uid` in the request body",
|
||||
"api.400": "Something was wrong with the request payload you passed in.",
|
||||
"api.401": "A valid login session was not found. Please log in and try again.",
|
||||
"api.403": "You are not authorised to make this call",
|
||||
"api.404": "Invalid API call",
|
||||
"api.426": "HTTPS is required for requests to the write api, please re-send your request via HTTPS",
|
||||
"api.429": "You have made too many requests, please try again later",
|
||||
"api.500": "An unexpected error was encountered while attempting to service your request.",
|
||||
"api.501": "The route you are trying to call is not implemented yet, please try again tomorrow",
|
||||
"api.503": "The route you are trying to call is not currently available due to a server configuration"
|
||||
"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",
|
||||
@@ -77,6 +75,9 @@
|
||||
"modal-reason-custom": "Reason for reporting this content...",
|
||||
"modal-submit": "Submit Report",
|
||||
"modal-submit-success": "Content has been flagged for moderation.",
|
||||
"modal-submit-confirm": "Confirm Submission",
|
||||
"modal-submit-confirm-text": "You have a custom reason specified already. Are you sure you wish to submit via quick-report?",
|
||||
"modal-submit-confirm-text-help": "Submitting a quick report will overwrite any custom reasons defined.",
|
||||
|
||||
"bulk-actions": "Bulk Actions",
|
||||
"bulk-resolve": "Resolve Flag(s)",
|
||||
|
||||
@@ -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": "الأعضاء",
|
||||
@@ -70,7 +68,6 @@
|
||||
"firstpost": "First post",
|
||||
"read_more": "اقرأ المزيد",
|
||||
"more": "المزيد",
|
||||
"none": "None",
|
||||
"posted_ago_by_guest": "كتب %1 بواسطة زائر",
|
||||
"posted_ago_by": "كتب %1 بواسطة %2",
|
||||
"posted_ago": "كتب %1",
|
||||
@@ -96,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": "لقد تم تسجيل خروجك من لوحة تحكم بسبب عدم نشاطك"
|
||||
}
|
||||
@@ -54,17 +54,12 @@
|
||||
"composer.formatting.strikethrough": "Strikethrough",
|
||||
"composer.formatting.code": "Code",
|
||||
"composer.formatting.link": "Link",
|
||||
"composer.formatting.picture": "Image Link",
|
||||
"composer.formatting.picture": "Picture",
|
||||
"composer.upload-picture": "Upload Image",
|
||||
"composer.upload-file": "Upload File",
|
||||
"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": "حدث خطأ أثناء التحقق من عنوان بريدك الإلكتروني. ربما رمز التفعيل خاطئ أو انتهت صلاحيته.",
|
||||
|
||||
@@ -20,13 +20,9 @@
|
||||
"registration-added-to-queue": "تمت إضافتك في قائمة الإنتضار. ستتلقى رسالة إلكترونية عند الموافقة على تسجيلك من قبل الإدارة.",
|
||||
"registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.",
|
||||
"registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.",
|
||||
"interstitial.intro": "We'd like some additional information in order to update your account…",
|
||||
"interstitial.intro-new": "We'd like some additional information before we can create your account…",
|
||||
"interstitial.errors-found": "Please review the entered information:",
|
||||
"interstitial.intro": "نحتاج إلى بعض المعلومات الإضافية قبل أن نتمكن من إنشاء حسابك.",
|
||||
"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": "هذه المشاركة محذوفة!",
|
||||
@@ -20,8 +19,6 @@
|
||||
"login-to-view": "🔒 Log in to view",
|
||||
"edit": "تعديل",
|
||||
"delete": "حذف",
|
||||
"delete-event": "Delete Event",
|
||||
"delete-event-confirm": "Are you sure you want to delete this event?",
|
||||
"purge": "تطهير",
|
||||
"restore": "استعادة",
|
||||
"move": "نقل",
|
||||
@@ -33,27 +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",
|
||||
"moved-from-by": "Moved from %1 by",
|
||||
"queued-by": "Post queued for approval →",
|
||||
"backlink": "Referenced by",
|
||||
"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": "ستستلم تنبيها عند كل مشاركة جديدة في هذا الموضوع.",
|
||||
@@ -118,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!",
|
||||
@@ -132,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": "إضافة صورة مصغرة للموضوع",
|
||||
@@ -159,7 +141,6 @@
|
||||
"newest_to_oldest": "من الأحدث إلى الأقدم",
|
||||
"most_votes": "Most Votes",
|
||||
"most_posts": "Most Posts",
|
||||
"most_views": "Most Views",
|
||||
"stale.title": "Create new topic instead?",
|
||||
"stale.warning": "The topic you are replying to is quite old. Would you like to create a new topic instead, and reference this one in your reply?",
|
||||
"stale.create": "موضوع جديد",
|
||||
@@ -171,13 +152,10 @@
|
||||
"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",
|
||||
"last-post": "Last post",
|
||||
"post-quick-reply": "Post quick reply"
|
||||
"last-post": "Last 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": "أظهر اسمي الكامل",
|
||||
@@ -98,7 +97,6 @@
|
||||
"has_no_follower": "هذا المستخدم ليس لديه أية متابعين :(",
|
||||
"follows_no_one": "هذا المستخدم لا يتابع أحد :(",
|
||||
"has_no_posts": "هذا المستخدم لم يشارك حتى الآن.",
|
||||
"has_no_best_posts": "This user does not have any upvoted posts yet.",
|
||||
"has_no_topics": "هذا المستخدم لم يكتب أي موضوع حتى الآن.",
|
||||
"has_no_watched_topics": "هذا المستخدم لم يقم بمراقبة اية مواضيع حتى الآن.",
|
||||
"has_no_ignored_topics": "هذا المستخدم لم يقم بتجاهل اية مواضيع حتى الآن.",
|
||||
@@ -137,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": "انقر هنا لربط مع",
|
||||
@@ -181,8 +179,5 @@
|
||||
"consent.export_uploads": "Export Uploaded Content (.zip)",
|
||||
"consent.export-uploads-success": "Exporting uploads, you will get a notification when it is complete.",
|
||||
"consent.export_posts": "Export Posts (.csv)",
|
||||
"consent.export-posts-success": "Exporting posts, you will get a notification when it is complete.",
|
||||
"emailUpdate.intro": "Please enter your email address below. This forum uses your email address for scheduled digest and notifications, as well as for account recovery in the event of a lost password.",
|
||||
"emailUpdate.optional": "<strong>This field is optional</strong>. You are not obligated to provide your email address, but without a validated email, you will not be able to recover your account.",
|
||||
"emailUpdate.change-instructions": "A confirmation email will be sent to the entered email address with a unique link. Accessing that link will confirm your ownership of the email address and it will become active on your account. At any time, you are able to update your email on file from within your account page."
|
||||
"consent.export-posts-success": "Exporting posts, you will get a notification when it is complete."
|
||||
}
|
||||
@@ -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": "Добавката е инсталирана успешно, моля, включете я",
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
"delete": "Изтриване",
|
||||
"enable": "Включване",
|
||||
"disable": "Изключване",
|
||||
"control-panel": "Управление на наградите",
|
||||
"new-reward": "Нова награда",
|
||||
|
||||
"alert.delete-success": "Наградата е изтрита успешно",
|
||||
"alert.no-inputs-found": "Неправомерна награда — няма нищо въведено!",
|
||||
|
||||
@@ -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": "Преглед на историята на редакциите",
|
||||
@@ -51,13 +50,10 @@
|
||||
"alert.saved": "Промените по правомощията са запазени и приложени",
|
||||
"alert.confirm-discard": "Наистина ли искате да отхвърлите промените по правомощията?",
|
||||
"alert.discarded": "Промените по правомощията са отхвърлени",
|
||||
"alert.confirm-copyToAll": "Наистина ли искате да приложите този набор от <strong>%1</strong> към <strong>всички категории</strong>?",
|
||||
"alert.confirm-copyToAllGroup": "Наистина ли искате да приложите набора от <strong>%1</strong> на тази група към <strong>всички категории</strong>?",
|
||||
"alert.confirm-copyToChildren": "Наистина ли искате да приложите този набор от <strong>%1</strong> към <strong>всички по-долни (дъщерни) категории</strong>?",
|
||||
"alert.confirm-copyToChildrenGroup": "Наистина ли искате да приложите набора от <strong>%1</strong> на тази група към <strong>всички по-долни (дъщерни) категории</strong>?",
|
||||
"alert.confirm-copyToAll": "Наистина ли искате да приложите този набор от правомощия към <strong>всички категории</strong>?",
|
||||
"alert.confirm-copyToAllGroup": "Наистина ли искате да приложите набора от правомощия на таи група към <strong>всички категории</strong>?",
|
||||
"alert.confirm-copyToChildren": "Наистина ли искате да приложите този набор от правомощия към <strong>всички по-долни (дъщерни) категории</strong>?",
|
||||
"alert.confirm-copyToChildrenGroup": "Наистина ли искате да приложите набора от правомощия на таи група към <strong>всички по-долни (дъщерни) категории</strong>?",
|
||||
"alert.no-undo": "<em>Това действие е необратимо.</em>",
|
||||
"alert.admin-warning": "Администраторите имат всички правомощия по подразбиране",
|
||||
"alert.copyPrivilegesFrom-title": "Изберете категория, от която да се копира",
|
||||
"alert.copyPrivilegesFrom-warning": "Това ще копира <strong>%1</strong> от избраната категория.",
|
||||
"alert.copyPrivilegesFromGroup-warning": "Това ще копира набора от <strong>%1</strong> на тези група от избраната категория."
|
||||
"alert.admin-warning": "Администраторите имат всички правомощия по подразбиране"
|
||||
}
|
||||
@@ -2,6 +2,7 @@
|
||||
"none": "Форумът все още няма теми с етикети.",
|
||||
"bg-color": "Цвят на фона",
|
||||
"text-color": "Цвят на текста",
|
||||
"create-modify": "Създаване и редактиране на етикети",
|
||||
"description": "Изберете етикетите чрез щракване или влачене. Използвайте <code>CTRL</code>, за да изберете няколко етикета.",
|
||||
"create": "Създаване на етикет",
|
||||
"modify": "Редактиране на етикети",
|
||||
|
||||
@@ -5,7 +5,5 @@
|
||||
"orphaned": "Без ползвания",
|
||||
"size/filecount": "Размер / брой файлове",
|
||||
"confirm-delete": "Наистина ли искате да изтриете този файл?",
|
||||
"filecount": "%1 файла",
|
||||
"new-folder": "Нова папка",
|
||||
"name-new-folder": "Въведете име за новата папка"
|
||||
"filecount": "%1 файла"
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"users": "Потребители",
|
||||
"edit": "Действия",
|
||||
"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": "Управление",
|
||||
|
||||
@@ -36,9 +36,6 @@
|
||||
"subscriptions.disable": "Изключване на резюметата по е-пощата",
|
||||
"subscriptions.hour": "Време за разпращане",
|
||||
"subscriptions.hour-help": "Моля, въведете число, представляващо часа, в който да се разпращат е-писма с подготвеното резюме (напр.. <code>0</code> за полунощ, <code>17</code> за 5 следобед). Имайте предвид, че този час е според часовата зона на сървъра и може да не съвпада с часовника на системата Ви.<br /> Приблизителното време на сървъра е: <span id=\"serverTime\"></span><br /> Изпращането на следващия ежедневен бюлетин е планирано за <span id=\"nextDigestTime\"></span>",
|
||||
"notifications.remove-images": "Премахване на изображенията от известията по е-поща",
|
||||
"require-email-address": "Новите потребители задължително трябва да предоставят е-поща",
|
||||
"require-email-address-warning": "По подразбиране потребителите могат да не въвеждат адрес на е-поща. Ако включите това, те задължително ще трябва да предоставят е-поща, за да могат да се регистрират. <strong>Това не означава, че потребителят ще въведе съществуваща е-поща, нито че тя ще е негова.</strong>",
|
||||
"include-unverified-emails": "Изпращане на е-писма към получатели, които не са потвърдили изрично е-пощата си",
|
||||
"include-unverified-warning": "За потребителите, които имат свързана е-поща с регистрацията си, тя се смята за потвърдена. Но има ситуации, в които това не е така (например при ползване на регистрация от друга система, но и в други случаи), <strong>Включете тази настройка на собствен риск</strong> – изпращането на е-писма към непотвърдени адреси може да нарушава определени местни закони против нежеланата поща."
|
||||
"notifications.settings": "Настройки за известията по е-поща",
|
||||
"notifications.remove-images": "Премахване на изображенията от известията по е-поща"
|
||||
}
|
||||
@@ -35,16 +35,10 @@
|
||||
"maskable-icon.help": "Препоръчителен размер и формат: 512x512, само във формат „PNG“. Ако не е посочена маскируема иконка, NodeBB ще използва иконката за сензорен екран.",
|
||||
"outgoing-links": "Изходящи връзки",
|
||||
"outgoing-links.warning-page": "Показване на предупредителна страница при щракване върху външни връзки",
|
||||
"search": "Търсене",
|
||||
"search-default-in": "Търсене в",
|
||||
"search-default-in-quick": "Бързо търсене в",
|
||||
"search-default-sort-by": "Подреждане по",
|
||||
"search-default-sort-by": "Подредба по подразбиране при търсене",
|
||||
"outgoing-links.whitelist": "Домейни, за които да не се показва предупредителната страница",
|
||||
"site-colors": "Мета-данни за цвета на уеб сайта",
|
||||
"theme-color": "Цвят на темата",
|
||||
"background-color": "Фонов цвят",
|
||||
"background-color-help": "Цвят, който да се използва като фон за началния екран, когато уеб сайтът е инсталиран като приложение",
|
||||
"undo-timeout": "Време за отмяна",
|
||||
"undo-timeout-help": "Някои действия, като например преместването на теми, могат да бъдат отменени от модератора в рамките на определено време. Задайте 0, за да забраните изцяло отменянето.",
|
||||
"topic-tools": "Инструменти за темите"
|
||||
"background-color-help": "Цвят, който да се използва като фон за началния екран, когато уеб сайтът е инсталиран като приложение"
|
||||
}
|
||||
@@ -2,6 +2,5 @@
|
||||
"notifications": "Известия",
|
||||
"welcome-notification": "Приветствено известие",
|
||||
"welcome-notification-link": "Връзка за приветственото известие",
|
||||
"welcome-notification-uid": "Потр. ид. за приветственото известие",
|
||||
"post-queue-notification-uid": "Потр. ид. за опашката с публикации"
|
||||
"welcome-notification-uid": "Потр. ид. за приветственото известие"
|
||||
}
|
||||
@@ -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": "Максимален брой теми на страница"
|
||||
}
|
||||
@@ -56,9 +56,6 @@
|
||||
"composer.show-help": "Показване на раздела „Помощ“",
|
||||
"composer.enable-plugin-help": "Позволяване на добавките да добавят съдържание в раздела за помощ",
|
||||
"composer.custom-help": "Персонализиран текст за помощ",
|
||||
"backlinks": "Обратни връзки",
|
||||
"backlinks.enabled": "Включване на обратните връзки в темите",
|
||||
"backlinks.help": "Ако в публикацията има препратка към друга тема, там ще бъде поставена връзка към публикацията, с конкретното време.",
|
||||
"ip-tracking": "Записване на IP адреса",
|
||||
"ip-tracking.each-post": "Записване на IP адреса за всяка публикация",
|
||||
"enable-post-history": "Включване на историята на публикациите"
|
||||
|
||||
@@ -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": "Следени категории"
|
||||
}
|
||||
@@ -6,9 +6,7 @@
|
||||
"greeting_no_name": "Здравейте",
|
||||
"greeting_with_name": "Здравейте, %1",
|
||||
"email.verify-your-email.subject": "Моля, потвърдете е-пощата си",
|
||||
"email.verify.text1": "Вие поискахте да променим или потвърдим адреса на е-пощата Ви",
|
||||
"email.verify.text2": "Поради причини, свързани със сигурността, можем да променим или потвърдим адреса на е-поща, само когато притежанието ѝ вече е било установено чрез е-писмо. <strong>Ако не сте поискали това, няма нужда да правите нищо.</strong>",
|
||||
"email.verify.text3": "След като потвърдите адреса на тази е-поща, ще променим текущия Ви адрес с този (%1).",
|
||||
"email.verify.text1": "Адресът на е-пощата Ви е променен!",
|
||||
"welcome.text1": "Благодарим Ви, че се регистрирахте в %1",
|
||||
"welcome.text2": "За да активирате напълно акаунта си, трябва да потвърдите е-пощата, с която сте се регистрирали.",
|
||||
"welcome.text3": "Вашата заявка за регистрация беше приета от администратор. Вече можете да се впишете със своето потребителско име и парола.",
|
||||
|
||||
@@ -22,20 +22,16 @@
|
||||
"invalid-username-or-password": "Моля, въведете потребителско име и парола",
|
||||
"invalid-search-term": "Грешен текст за търсене",
|
||||
"invalid-url": "Грешен адрес",
|
||||
"invalid-event": "Грешно събитие: %1",
|
||||
"local-login-disabled": "Системата за местно вписване е изключена за непривилегированите акаунти.",
|
||||
"csrf-invalid": "Не успяхме да Ви впишем, най-вероятно защото сесията Ви е изтекла. Моля, опитайте отново",
|
||||
"invalid-path": "Грешен път",
|
||||
"folder-exists": "Вече има папка с това име",
|
||||
"invalid-pagination-value": "Грешен номер на странициране, трябва да бъде между %1 и %2",
|
||||
"username-taken": "Потребителското име е заето",
|
||||
"email-taken": "Е-пощата е заета",
|
||||
"email-nochange": "Въведената е-поща е същата като съществуващата.",
|
||||
"email-invited": "На тази е-поща вече е била изпратена покана",
|
||||
"email-not-confirmed": "Публикуването в някои категории и теми ще бъде възможно едва след като е-пощата Ви бъде потвърдена. Щръкнете тук, за да Ви изпратим е-писмо за потвърждение.",
|
||||
"email-not-confirmed": "Няма да можете да публикувате съобщения, докато е-пощата Ви не бъде потвърдена. Моля, натиснете тук, за да потвърдите е-пощата си.",
|
||||
"email-not-confirmed-chat": "Няма да можете да пишете в разговори, докато е-пощата Ви не бъде потвърдена. Моля, натиснете тук, за да потвърдите е-пощата си.",
|
||||
"email-not-confirmed-email-sent": "Вашата е-поща все още не е потвърдена. Моля, проверете входящата си кутия за писмото за потвърждение. Няма да можете да публикувате съобщения или да пишете в разговори, докато е-пощата Ви не бъде потвърдена.",
|
||||
"no-email-to-confirm": "Нямате зададена е-поща. Тя е необходима за възстановяването на акаунта в случай на проблем. Натиснете тук, за да въведете е-поща.",
|
||||
"no-email-to-confirm": "Този форум изисква потвърдена е-поща. Моля, натиснете тук, за да въведете е-поща",
|
||||
"email-confirm-failed": "Не успяхме да потвърдим е-пощата Ви. Моля, опитайте отново по-късно.",
|
||||
"confirm-email-already-sent": "Е-писмото за потвърждение вече е изпратено. Моля, почакайте още %1 минута/и, преди да изпратите ново.",
|
||||
"sendmail-not-found": "Изпълнимият файл на „sendmail“ не може да бъде намерен. Моля, уверете се, че е инсталиран и изпълним за потребителя, чрез който е пуснат NodeBB.",
|
||||
@@ -87,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": "Не можете да блокирате другите администратори!",
|
||||
@@ -178,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": "Темата не може да бъде преместена в същата категория!",
|
||||
@@ -192,18 +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": "Категорията не може да се зададе като базова категория на себе си",
|
||||
"api.master-token-no-uid": "Беше получен главен код без съответстващо поле `_uid` в тялото на заявката",
|
||||
"api.400": "Нещо не беше наред с данните в заявката, които подадохте.",
|
||||
"api.401": "Няма намерена сесия. Моля, впишете се и опитайте отново.",
|
||||
"api.403": "Нямате право да изпълните тази команда",
|
||||
"api.404": "Неправилна команда към ППИ",
|
||||
"api.426": "Заявките към ППИ за писане изискват HTTPS. Изпратете отново заявката си чрез HTTPS",
|
||||
"api.429": "Направили сте твърде много заявки. Моля, опитайте отново по-късно.",
|
||||
"api.500": "При обработката на заявката Ви възникна неочаквана грешка.",
|
||||
"api.501": "Пътят, който се опитвате да извикате, все още не съществува. Моля, опитайте отново утре.",
|
||||
"api.503": "Пътят, който се опитвате да извикате, в момента не е достъпен, поради настройките на сървъра."
|
||||
"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": "Докладван потребител",
|
||||
@@ -77,6 +75,9 @@
|
||||
"modal-reason-custom": "Причина за докладването на това съдържание…",
|
||||
"modal-submit": "Изпращане на доклада",
|
||||
"modal-submit-success": "Съдържанието беше докладвано на модераторите.",
|
||||
"modal-submit-confirm": "Потвърждаване на докладването",
|
||||
"modal-submit-confirm-text": "Вече сте описали специалната си причина. Наистина ли искате да изпратите доклада си по бързата процедура?",
|
||||
"modal-submit-confirm-text-help": "Изпращането на доклад по бързата процедура ще премахне описаната от Вас специалната причина.",
|
||||
|
||||
"bulk-actions": "Групови действия",
|
||||
"bulk-resolve": "Разрешаване на доклад(и)",
|
||||
|
||||
@@ -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": "Потребители",
|
||||
@@ -70,7 +68,6 @@
|
||||
"firstpost": "Първа публикация",
|
||||
"read_more": "още",
|
||||
"more": "Още",
|
||||
"none": "Нищо",
|
||||
"posted_ago_by_guest": "публикувано %1 от гост",
|
||||
"posted_ago_by": "публикувано %1 от %2",
|
||||
"posted_ago": "публикувано %1",
|
||||
@@ -96,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": "Вие излязохте автоматично от администраторския контролен панел, поради бездействие."
|
||||
}
|
||||
@@ -54,17 +54,12 @@
|
||||
"composer.formatting.strikethrough": "Зачертан",
|
||||
"composer.formatting.code": "Код",
|
||||
"composer.formatting.link": "Връзка",
|
||||
"composer.formatting.picture": "Връзка към изображение",
|
||||
"composer.formatting.picture": "Снимка",
|
||||
"composer.upload-picture": "Качване на изображение",
|
||||
"composer.upload-file": "Качване на файл",
|
||||
"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": "Възникна проблем при потвърждаването на е-пощата Ви. Може кодът да е грешен или давността му да е изтекла.",
|
||||
|
||||
@@ -20,13 +20,9 @@
|
||||
"registration-added-to-queue": "Вашата регистрация беше добавена в опашката за одобрение. Ще получите е-писмо, когато тя бъде одобрена от администратор.",
|
||||
"registration-queue-average-time": "Средното време за одобрение на нови членове е %1 часа и %2 минути.",
|
||||
"registration-queue-auto-approve-time": "Членството Ви в този форум ще бъде напълно активирано след около %1 часа.",
|
||||
"interstitial.intro": "Нуждаем се от малко допълнителна информация, преди да можем да актуализираме акаунта Ви…",
|
||||
"interstitial.intro-new": "Нуждаем се от малко допълнителна информация, преди да можем да създадем акаунта Ви…",
|
||||
"interstitial.errors-found": "Моля, прегледайте въведената информация:",
|
||||
"interstitial.intro": "Нуждаем се от малко допълнителна информация, преди да можем да създадем акаунта Ви.",
|
||||
"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": "Публикацията е изтрита!",
|
||||
@@ -20,8 +19,6 @@
|
||||
"login-to-view": "🔒 Впишете се, за да видите това",
|
||||
"edit": "Редактиране",
|
||||
"delete": "Изтриване",
|
||||
"delete-event": "Изтриване на събитието",
|
||||
"delete-event-confirm": "Наистина ли искате да изтриете това събитие?",
|
||||
"purge": "Изчистване",
|
||||
"restore": "Възстановяване",
|
||||
"move": "Преместване",
|
||||
@@ -33,27 +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": "Възстановена от",
|
||||
"moved-from-by": "Преместена от %1 от",
|
||||
"queued-by": "Публикацията е добавена в опашката за одобрение →",
|
||||
"backlink": "Спомената от",
|
||||
"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": "Вече ще получавате известия когато някой публикува коментар в тази тема.",
|
||||
@@ -118,7 +104,6 @@
|
||||
"move_post": "Преместване на публикацията",
|
||||
"post_moved": "Публикацията беше преместена!",
|
||||
"fork_topic": "Разделяне на темата",
|
||||
"enter-new-topic-title": "Въведете заглавието на новата тема",
|
||||
"fork_topic_instruction": "Натиснете публикациите, които искате да отделите",
|
||||
"fork_no_pids": "Няма избрани публикации!",
|
||||
"no-posts-selected": "Няма избрани публикации!",
|
||||
@@ -132,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": "Добавете иконка към тази тема",
|
||||
@@ -159,7 +141,6 @@
|
||||
"newest_to_oldest": "Първо най-новите",
|
||||
"most_votes": "Първо тези с най-много гласове",
|
||||
"most_posts": "Първо тези с най-много публикации",
|
||||
"most_views": "Първо тези с най-много преглеждания",
|
||||
"stale.title": "Създаване на нова тема вместо това?",
|
||||
"stale.warning": "Темата, в която отговаряте, е доста стара. Искате ли вместо това да създадете нова и да направите препратка към тази в отговора си?",
|
||||
"stale.create": "Създаване на нова тема",
|
||||
@@ -171,13 +152,10 @@
|
||||
"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": "Първа публикация",
|
||||
"last-post": "Последна публикация",
|
||||
"post-quick-reply": "Пускане на бърза публикация"
|
||||
"last-post": "Последна публикация"
|
||||
}
|
||||
@@ -84,7 +84,6 @@
|
||||
"remove_cover_picture_confirm": "Наистина ли искате да премахнете снимката на корицата?",
|
||||
"crop_picture": "Орязване на снимката",
|
||||
"upload_cropped_picture": "Орязване и качване",
|
||||
"avatar-background-colour": "Фонов цвят за изображението",
|
||||
"settings": "Настройки",
|
||||
"show_email": "Да се показва е-пощата ми",
|
||||
"show_fullname": "Да се показва цялото ми име",
|
||||
@@ -98,7 +97,6 @@
|
||||
"has_no_follower": "Този потребител няма последователи :(",
|
||||
"follows_no_one": "Този потребител не следва никого :(",
|
||||
"has_no_posts": "Този потребител не е публикувал нищо досега.",
|
||||
"has_no_best_posts": "Този потребител не е получавал положителни гласове за публикациите си досега.",
|
||||
"has_no_topics": "Този потребител не е създавал теми досега.",
|
||||
"has_no_watched_topics": "Този потребител не е следил нито една тема досега.",
|
||||
"has_no_ignored_topics": "Този потребител не е пренебрегнал нито една тема досега.",
|
||||
@@ -137,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": "Натиснете тук, за да свържете с",
|
||||
@@ -181,8 +179,5 @@
|
||||
"consent.export_uploads": "Изнасяне на каченото съдържание (.zip)",
|
||||
"consent.export-uploads-success": "Изнасяне на каченото съдържание… Ще получите известие, когато е готово.",
|
||||
"consent.export_posts": "Изнасяне на публикациите (.csv)",
|
||||
"consent.export-posts-success": "Изнасяне на публикациите… Ще получите известие, когато е готово.",
|
||||
"emailUpdate.intro": "Въведете е-пощата си по-долу. Този форум използва е-пощата за планирани резюмета и известия, както и за възстановяване на акаунта, в случай на забравена парола.",
|
||||
"emailUpdate.optional": "<strong>Това поле не е задължително</strong>. Не сте длъжен/на да ни давате адреса на е-пощата си, но ако нямате потвърдена е-поща, няма да можете да възстановите достъпа до акаунта си в случай на проблем.",
|
||||
"emailUpdate.change-instructions": "Ще Ви изпратим е-писмо за потвърждение на посочената е-поща, което ще съдържа уникална връзка. Щом последвате тази връзка, притежанието Ви на тази е-поща ще бъде потвърдено и тя ще бъде свързана с акаунта Ви. Ще можете да промените тази е-поща по всяко време, от страницата на акаунта си."
|
||||
"consent.export-posts-success": "Изнасяне на публикациите… Ще получите известие, когато е готово."
|
||||
}
|
||||
@@ -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.",
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
"delete": "Delete",
|
||||
"enable": "Enable",
|
||||
"disable": "Disable",
|
||||
"control-panel": "Rewards Control",
|
||||
"new-reward": "New Reward",
|
||||
|
||||
"alert.delete-success": "Successfully deleted reward",
|
||||
"alert.no-inputs-found": "Illegal reward - no inputs found!",
|
||||
|
||||
@@ -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",
|
||||
@@ -51,13 +50,10 @@
|
||||
"alert.saved": "Privilege changes saved and applied",
|
||||
"alert.confirm-discard": "Are you sure you wish to discard your privilege changes?",
|
||||
"alert.discarded": "Privilege changes discarded",
|
||||
"alert.confirm-copyToAll": "Are you sure you wish to apply this set of <strong>%1</strong> to <strong>all categories</strong>?",
|
||||
"alert.confirm-copyToAllGroup": "Are you sure you wish to apply this group's set of <strong>%1</strong> to <strong>all categories</strong>?",
|
||||
"alert.confirm-copyToChildren": "Are you sure you wish to apply this set of <strong>%1</strong> to <strong>all descendant (child) categories</strong>?",
|
||||
"alert.confirm-copyToChildrenGroup": "Are you sure you wish to apply this group's set of <strong>%1</strong> to <strong>all descendant (child) categories</strong>?",
|
||||
"alert.confirm-copyToAll": "Are you sure you wish to apply this privilege set to <strong>all categories</strong>?",
|
||||
"alert.confirm-copyToAllGroup": "Are you sure you wish to apply this group's privilege set to <strong>all categories</strong>?",
|
||||
"alert.confirm-copyToChildren": "Are you sure you wish to apply this privilege set to <strong>all descendant (child) categories</strong>?",
|
||||
"alert.confirm-copyToChildrenGroup": "Are you sure you wish to apply this group's privilege set to <strong>all descendant (child) categories</strong>?",
|
||||
"alert.no-undo": "<em>This action cannot be undone.</em>",
|
||||
"alert.admin-warning": "Administrators implicitly get all privileges",
|
||||
"alert.copyPrivilegesFrom-title": "Select a category to copy from",
|
||||
"alert.copyPrivilegesFrom-warning": "This will copy <strong>%1</strong> from the selected category.",
|
||||
"alert.copyPrivilegesFromGroup-warning": "This will copy this group's set of <strong>%1</strong> from the selected category."
|
||||
"alert.admin-warning": "Administrators implicitly get all privileges"
|
||||
}
|
||||
@@ -2,6 +2,7 @@
|
||||
"none": "Your forum does not have any topics with tags yet.",
|
||||
"bg-color": "Background Colour",
|
||||
"text-color": "Text Colour",
|
||||
"create-modify": "Create & Modify Tags",
|
||||
"description": "Select tags by clicking or dragging, use <code>CTRL</code> to select multiple tags.",
|
||||
"create": "Create Tag",
|
||||
"modify": "Modify Tags",
|
||||
|
||||
@@ -5,7 +5,5 @@
|
||||
"orphaned": "Orphaned",
|
||||
"size/filecount": "Size / Filecount",
|
||||
"confirm-delete": "Do you really want to delete this file?",
|
||||
"filecount": "%1 files",
|
||||
"new-folder": "New Folder",
|
||||
"name-new-folder": "Enter a name for new the folder"
|
||||
"filecount": "%1 files"
|
||||
}
|
||||
@@ -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",
|
||||
|
||||
@@ -36,9 +36,6 @@
|
||||
"subscriptions.disable": "ইমেইল ডাইজেস্ট নিষ্ক্রিয়",
|
||||
"subscriptions.hour": "Digest Hour",
|
||||
"subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. <code>0</code> for midnight, <code>17</code> for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.<br /> The approximate server time is: <span id=\"serverTime\"></span><br /> The next daily digest is scheduled to be sent <span id=\"nextDigestTime\"></span>",
|
||||
"notifications.remove-images": "Remove images from email notifications",
|
||||
"require-email-address": "Require new users to specify an email address",
|
||||
"require-email-address-warning": "By default, users can opt-out of entering an email address. Enabling this option means they have to enter an email address in order to proceed with registration. <strong>It does not ensure user will enter a real email address, nor even an address they own.</strong>",
|
||||
"include-unverified-emails": "Send emails to recipients who have not explicitly confirmed their emails",
|
||||
"include-unverified-warning": "By default, users with emails associated with their account have already been verified, but there are situations where this is not the case (e.g. SSO logins, grandfathered users, etc). <strong>Enable this setting at your own risk</strong> – sending emails to unverified addresses may be a violation of regional anti-spam laws."
|
||||
"notifications.settings": "Email notification settings",
|
||||
"notifications.remove-images": "Remove images from email notifications"
|
||||
}
|
||||
@@ -35,16 +35,10 @@
|
||||
"maskable-icon.help": "Recommended size and format: 512x512, PNG format only. If no maskable icon is specified, NodeBB will fall back to the Touch Icon.",
|
||||
"outgoing-links": "Outgoing Links",
|
||||
"outgoing-links.warning-page": "Use Outgoing Links Warning Page",
|
||||
"search": "Search",
|
||||
"search-default-in": "Search In",
|
||||
"search-default-in-quick": "Quick Search In",
|
||||
"search-default-sort-by": "Sort by",
|
||||
"search-default-sort-by": "Search default sort by",
|
||||
"outgoing-links.whitelist": "Domains to whitelist for bypassing the warning page",
|
||||
"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"
|
||||
}
|
||||
@@ -2,6 +2,5 @@
|
||||
"notifications": "Notifications",
|
||||
"welcome-notification": "Welcome Notification",
|
||||
"welcome-notification-link": "Welcome Notification Link",
|
||||
"welcome-notification-uid": "Welcome Notification User (UID)",
|
||||
"post-queue-notification-uid": "Post Queue User (UID)"
|
||||
"welcome-notification-uid": "Welcome Notification User (UID)"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -56,9 +56,6 @@
|
||||
"composer.show-help": "Show \"Help\" tab",
|
||||
"composer.enable-plugin-help": "Allow plugins to add content to the help tab",
|
||||
"composer.custom-help": "Custom Help Text",
|
||||
"backlinks": "Backlinks",
|
||||
"backlinks.enabled": "Enable topic backlinks",
|
||||
"backlinks.help": "If a post references another topic, a link back to the post will be inserted into the referenced topic at that point in time.",
|
||||
"ip-tracking": "IP Tracking",
|
||||
"ip-tracking.each-post": "Track IP Address for each post",
|
||||
"enable-post-history": "Enable Post History"
|
||||
|
||||
@@ -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": "প্রেক্ষিত বিভাগসমূহ"
|
||||
}
|
||||
@@ -6,9 +6,7 @@
|
||||
"greeting_no_name": "স্বাগতম",
|
||||
"greeting_with_name": "স্বাগতম %1",
|
||||
"email.verify-your-email.subject": "দয়া করে ইমেইল যাচাই করুন",
|
||||
"email.verify.text1": "You've requested that we change or confirm your email address",
|
||||
"email.verify.text2": "For security purposes, we only change or confirm the email address on file once its ownership has been confirmed via email. <strong>If you did not request this, no action is required on your part.</strong>",
|
||||
"email.verify.text3": "Once you confirm this email address, we will replace your current email address with this one (%1).",
|
||||
"email.verify.text1": "আপনার ইমেইল পরিবর্তন হয়েছে!",
|
||||
"welcome.text1": "%1 এ নিবন্ধন করার জন্য আপনাকে ধন্যবাদ!",
|
||||
"welcome.text2": "আপনার একাউন্ট এ্যাক্টিভেট করার জন্য, আপনি যে ইমেইল এড্রেস ব্যাবহার করে নিবন্ধন করেছেন তা যাচাই করতে হবে",
|
||||
"welcome.text3": "An administrator has accepted your registration application. You can login with your username/password now.",
|
||||
|
||||
@@ -22,20 +22,16 @@
|
||||
"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-path": "Invalid path",
|
||||
"folder-exists": "Folder exists",
|
||||
"invalid-pagination-value": "Invalid pagination value, must be at least %1 and at most %2",
|
||||
"username-taken": "ইউজারনেম আগেই ব্যবহৃত",
|
||||
"email-taken": "ইমেইল আগেই ব্যবহৃত",
|
||||
"email-nochange": "The email entered is the same as the email already on file.",
|
||||
"email-invited": "Email was already invited",
|
||||
"email-not-confirmed": "Posting in some categories or topics is enabled once your email is confirmed, please click here to send a confirmation email.",
|
||||
"email-not-confirmed": "You are unable to post until your email is confirmed, please click here to confirm your email.",
|
||||
"email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.",
|
||||
"email-not-confirmed-email-sent": "Your email has not been confirmed yet, please check your inbox for the confirmation email. You won't be able to post or chat until your email is confirmed.",
|
||||
"no-email-to-confirm": "Your account does not have an email set. An email is necessary for account recovery. Please click here to enter an email.",
|
||||
"no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email",
|
||||
"email-confirm-failed": "We could not confirm your email, please try again later.",
|
||||
"confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.",
|
||||
"sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.",
|
||||
@@ -87,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": "আপনি অন্য এ্যাডমিনদের নিষিদ্ধ করতে পারেন না!",
|
||||
@@ -178,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!",
|
||||
@@ -192,18 +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",
|
||||
"api.master-token-no-uid": "A master token was received without a corresponding `_uid` in the request body",
|
||||
"api.400": "Something was wrong with the request payload you passed in.",
|
||||
"api.401": "A valid login session was not found. Please log in and try again.",
|
||||
"api.403": "You are not authorised to make this call",
|
||||
"api.404": "Invalid API call",
|
||||
"api.426": "HTTPS is required for requests to the write api, please re-send your request via HTTPS",
|
||||
"api.429": "You have made too many requests, please try again later",
|
||||
"api.500": "An unexpected error was encountered while attempting to service your request.",
|
||||
"api.501": "The route you are trying to call is not implemented yet, please try again tomorrow",
|
||||
"api.503": "The route you are trying to call is not currently available due to a server configuration"
|
||||
"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