Compare commits
72 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fb2f857af2 | ||
|
|
7181bb4e1a | ||
|
|
d19e59f1e1 | ||
|
|
f5e8a40d79 | ||
|
|
4713e0d81a | ||
|
|
562b088423 | ||
|
|
92691782e6 | ||
|
|
fe582d8a7b | ||
|
|
98f2fd62a5 | ||
|
|
922620fe0a | ||
|
|
94b9d77118 | ||
|
|
b1b9174479 | ||
|
|
d5fb6dac38 | ||
|
|
deb9a9189d | ||
|
|
3309f2910d | ||
|
|
b600b9305e | ||
|
|
d120ee86cf | ||
|
|
f7ceace48f | ||
|
|
fbbd0deaea | ||
|
|
aabe1c3a16 | ||
|
|
94fb6b9823 | ||
|
|
d6af2ae13b | ||
|
|
4db89407c4 | ||
|
|
ef14511e24 | ||
|
|
37cdf9ce25 | ||
|
|
7454902678 | ||
|
|
d6a485a6cc | ||
|
|
301e62c3ba | ||
|
|
d6c2fc96f8 | ||
|
|
a9d69c4779 | ||
|
|
1cf07a6fc5 | ||
|
|
dfc8ceef9e | ||
|
|
b666261602 | ||
|
|
3c5d7f36b2 | ||
|
|
fda10ea194 | ||
|
|
9cc13aaf16 | ||
|
|
2dec354131 | ||
|
|
1fefc8d427 | ||
|
|
c3b6974779 | ||
|
|
fdd8514058 | ||
|
|
550fa4717d | ||
|
|
c0a4bf91f3 | ||
|
|
2cbdb886b1 | ||
|
|
ff70f36e1a | ||
|
|
60721ce75d | ||
|
|
296dc77c7b | ||
|
|
79cd9b1bcb | ||
|
|
a196c834d9 | ||
|
|
427500fc04 | ||
|
|
1a5b6d4839 | ||
|
|
61404be94b | ||
|
|
c40c64a9c5 | ||
|
|
b81e395a26 | ||
|
|
c12963593d | ||
|
|
1736b1c015 | ||
|
|
3d815fff72 | ||
|
|
f88b695d4c | ||
|
|
72940f7bdf | ||
|
|
ffc9da97e3 | ||
|
|
2be3054e94 | ||
|
|
fdf32a6ed4 | ||
|
|
19b3069ad0 | ||
|
|
5765313b63 | ||
|
|
cbbd254d33 | ||
|
|
8f8fcc8416 | ||
|
|
55b43dca23 | ||
|
|
c13aab39e7 | ||
|
|
072fa38927 | ||
|
|
0b35c81586 | ||
|
|
cc6d4f5d43 | ||
|
|
d9474d5de2 | ||
|
|
f6c60517db |
@@ -17,4 +17,3 @@ logs/
|
||||
/coverage
|
||||
/build
|
||||
.eslintrc
|
||||
test/files
|
||||
|
||||
@@ -32,9 +32,6 @@
|
||||
"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",
|
||||
|
||||
// ES6
|
||||
@@ -45,7 +42,6 @@
|
||||
"no-var": "off",
|
||||
"object-shorthand": "off",
|
||||
"vars-on-top": "off",
|
||||
"prefer-destructuring": "off",
|
||||
|
||||
// TODO
|
||||
"import/no-extraneous-dependencies": "off",
|
||||
@@ -58,9 +54,9 @@
|
||||
"no-restricted-syntax": "off",
|
||||
"no-script-url": "off",
|
||||
"default-case": "off",
|
||||
"linebreak-style": "off",
|
||||
|
||||
// "no-multi-assign": "off",
|
||||
// "linebreak-style": "off",
|
||||
// "one-var": "off",
|
||||
// "no-undef": "off",
|
||||
// "max-nested-callbacks": "off",
|
||||
|
||||
2
.github/CONTRIBUTING.md
vendored
@@ -15,7 +15,7 @@ If you are writing contributions as part of employment from another company / in
|
||||
|
||||
# Having problems installing NodeBB?
|
||||
|
||||
Chances are somebody has run into this problem before. After consulting our [documentation](https://docs.nodebb.org/installing/os/), please head over to our [community support forum](https://community.nodebb.org) for advice.
|
||||
Chances are somebody has run into this problem before. After consulting our [documentation](https://docs.nodebb.org/en/latest/installing/os.html), please head over to our [community support forum](https://community.nodebb.org) for advice.
|
||||
|
||||
# Found a Security Vulnerability?
|
||||
|
||||
|
||||
35
.github/ISSUE_TEMPLATE.md
vendored
@@ -1,26 +1,13 @@
|
||||
<!--
|
||||
== Github Issues are for bug reports and feature requests only ==
|
||||
== Please visit https://community.nodebb.org for other support ==
|
||||
== Found a security exploit? Please email us at security@nodebb.org instead for immediate attention ==
|
||||
== → DO NOT SUBMIT VULNERABILITIES TO THE PUBLIC BUG TRACKER ==
|
||||
-->
|
||||
Please include the following information when submitting a bug report/issue:
|
||||
|
||||
<!-- ++ Please include the following information when submitting a bug report ++ -->
|
||||
* NodeBB version and git hash (to find your git hash, execute `git rev-parse HEAD` from the main NodeBB directory)
|
||||
* Database (mongo or redis) and it's version.
|
||||
* Exact steps to cause this issue
|
||||
1. First I did this...
|
||||
2. Then, I clicked on this item...
|
||||
* What you expected
|
||||
* e.g. I expected *abc* to *xyz*
|
||||
* What happened instead
|
||||
* e.g. Instead, I got *zyx* and NodeBB set fire to my house
|
||||
|
||||
- **NodeBB version:**
|
||||
- **NodeBB git hash:**
|
||||
<!-- (to find your git hash, execute `git rev-parse HEAD` from the main NodeBB directory) -->
|
||||
- **Database type:** mongo or redis
|
||||
- **Database version:**
|
||||
<!-- `mongod --version` or `redis-server --version` -->
|
||||
- **Exact steps to cause this issue:**
|
||||
<!--
|
||||
1. First I did this...
|
||||
2. Then, I clicked on this item...
|
||||
-->
|
||||
- **What you expected:**
|
||||
<!-- e.g. I expected *abc* to *xyz* -->
|
||||
- **What happened instead:**
|
||||
<!-- e.g. Instead, I got *zyx* and NodeBB set fire to my house -->
|
||||
|
||||
<!-- Thank you! -->
|
||||
Thank you!
|
||||
|
||||
8
.gitignore
vendored
@@ -1,4 +1,3 @@
|
||||
yarn.lock
|
||||
npm-debug.log
|
||||
node_modules/
|
||||
sftp-config.json
|
||||
@@ -18,7 +17,6 @@ provision.sh
|
||||
.DS_Store
|
||||
feeds/recent.rss
|
||||
.eslintcache
|
||||
.svn
|
||||
|
||||
logs/
|
||||
|
||||
@@ -28,7 +26,6 @@ pidfile
|
||||
/public/templates
|
||||
|
||||
/public/sounds
|
||||
/public/uploads
|
||||
|
||||
# compiled files
|
||||
/public/stylesheet.css
|
||||
@@ -58,11 +55,6 @@ tx.exe
|
||||
|
||||
##Coverage output
|
||||
coverage
|
||||
.nyc_output
|
||||
|
||||
build
|
||||
*.log
|
||||
test/files/normalise.jpg.png
|
||||
test/files/normalise-resized.jpg
|
||||
package-lock.json
|
||||
/package.json
|
||||
|
||||
14
.travis.yml
@@ -1,17 +1,14 @@
|
||||
services:
|
||||
- redis-server
|
||||
before_install:
|
||||
- "sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6"
|
||||
- "echo 'deb [ arch=amd64 ] http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.4 multiverse' | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list"
|
||||
- "sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10"
|
||||
- "echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | sudo tee /etc/apt/sources.list.d/mongodb.list"
|
||||
- "sudo apt-get update"
|
||||
- "sudo apt-get install -y mongodb-org"
|
||||
- "sudo service mongod start"
|
||||
- "sudo apt-get install mongodb-org-server"
|
||||
before_script:
|
||||
- sleep 15 # wait for mongodb to be ready
|
||||
- cp install/package.json package.json
|
||||
- npm install
|
||||
- sh -c "if [ '$DB' = 'mongodb' ]; then node app --setup=\"{\\\"url\\\":\\\"http://127.0.0.1:4567\\\",\\\"secret\\\":\\\"abcdef\\\",\\\"database\\\":\\\"mongo\\\",\\\"mongo:host\\\":\\\"127.0.0.1\\\",\\\"mongo:port\\\":27017,\\\"mongo:username\\\":\\\"\\\",\\\"mongo:password\\\":\\\"\\\",\\\"mongo:database\\\":0,\\\"redis:host\\\":\\\"127.0.0.1\\\",\\\"redis:port\\\":6379,\\\"redis:password\\\":\\\"\\\",\\\"redis:database\\\":0,\\\"admin:username\\\":\\\"admin\\\",\\\"admin:email\\\":\\\"test@example.org\\\",\\\"admin:password\\\":\\\"abcdef\\\",\\\"admin:password:confirm\\\":\\\"abcdef\\\"}\" --ci=\"{\\\"host\\\":\\\"127.0.0.1\\\",\\\"port\\\":27017,\\\"database\\\":0}\"; fi"
|
||||
- sh -c "if [ '$DB' = 'redis' ]; then node app --setup=\"{\\\"url\\\":\\\"http://127.0.0.1:4567\\\",\\\"secret\\\":\\\"abcdef\\\",\\\"database\\\":\\\"redis\\\",\\\"mongo:host\\\":\\\"127.0.0.1\\\",\\\"mongo:port\\\":27017,\\\"mongo:username\\\":\\\"\\\",\\\"mongo:password\\\":\\\"\\\",\\\"mongo:database\\\":0,\\\"redis:host\\\":\\\"127.0.0.1\\\",\\\"redis:port\\\":6379,\\\"redis:password\\\":\\\"\\\",\\\"redis:database\\\":0,\\\"admin:username\\\":\\\"admin\\\",\\\"admin:email\\\":\\\"test@example.org\\\",\\\"admin:password\\\":\\\"abcdef\\\",\\\"admin:password:confirm\\\":\\\"abcdef\\\"}\" --ci=\"{\\\"host\\\":\\\"127.0.0.1\\\",\\\"port\\\":6379,\\\"database\\\":0}\"; fi"
|
||||
- "until nc -z localhost 27017; do echo Waiting for MongoDB; sleep 1; done"
|
||||
after_success:
|
||||
- "npm run coveralls"
|
||||
language: node_js
|
||||
@@ -25,9 +22,8 @@ addons:
|
||||
packages:
|
||||
- g++-4.8
|
||||
node_js:
|
||||
- "8"
|
||||
- "7"
|
||||
- "6"
|
||||
- "4"
|
||||
branches:
|
||||
only:
|
||||
- master
|
||||
|
||||
596
.tx/config
21
Dockerfile
@@ -1,20 +1,15 @@
|
||||
# The base image is the latest 8.x node (LTS)
|
||||
FROM node:8.9.0
|
||||
|
||||
RUN mkdir -p /usr/src/app
|
||||
WORKDIR /usr/src/app
|
||||
|
||||
ARG NODE_ENV
|
||||
ENV NODE_ENV $NODE_ENV
|
||||
COPY install/package.json /usr/src/app/package.json
|
||||
RUN npm install && npm cache clean --force
|
||||
COPY . /usr/src/app
|
||||
# The base image is the latest 4.x node (LTS) on jessie (debian)
|
||||
# -onbuild will install the node dependencies found in the project package.json
|
||||
# and copy its content in /usr/src/app, its WORKDIR
|
||||
FROM node:4-onbuild
|
||||
|
||||
ENV NODE_ENV=production \
|
||||
daemon=false \
|
||||
silent=false
|
||||
|
||||
CMD ./nodebb start
|
||||
# nodebb setup will ask you for connection information to a redis (default), mongodb then run the forum
|
||||
# nodebb upgrade is not included and might be desired
|
||||
CMD node app --setup && npm start
|
||||
|
||||
# the default port for NodeBB is exposed outside the container
|
||||
EXPOSE 4567
|
||||
EXPOSE 4567
|
||||
|
||||
24
Gruntfile.js
@@ -8,8 +8,6 @@ var initWorker;
|
||||
var incomplete = [];
|
||||
var running = 0;
|
||||
|
||||
env.NODE_ENV = env.NODE_ENV || 'development';
|
||||
|
||||
module.exports = function (grunt) {
|
||||
var args = [];
|
||||
var initArgs = ['--build'];
|
||||
@@ -20,7 +18,7 @@ module.exports = function (grunt) {
|
||||
|
||||
function update(action, filepath, target) {
|
||||
var updateArgs = args.slice();
|
||||
var compiling;
|
||||
var compiling = '';
|
||||
var time = Date.now();
|
||||
|
||||
if (target === 'lessUpdated_Client') {
|
||||
@@ -37,7 +35,7 @@ module.exports = function (grunt) {
|
||||
// Do nothing, just restart
|
||||
}
|
||||
|
||||
if (compiling && incomplete.indexOf(compiling) === -1) {
|
||||
if (incomplete.indexOf(compiling) === -1) {
|
||||
incomplete.push(compiling);
|
||||
}
|
||||
|
||||
@@ -73,9 +71,8 @@ module.exports = function (grunt) {
|
||||
watch: {
|
||||
lessUpdated_Client: {
|
||||
files: [
|
||||
'public/less/*.less',
|
||||
'!public/less/admin/**/*.less',
|
||||
'node_modules/nodebb-*/**/*.less',
|
||||
'public/*.less',
|
||||
'node_modules/nodebb-*/*.less', 'node_modules/nodebb-*/**/*.less',
|
||||
'!node_modules/nodebb-*/node_modules/**',
|
||||
'!node_modules/nodebb-*/.git/**',
|
||||
],
|
||||
@@ -84,12 +81,7 @@ module.exports = function (grunt) {
|
||||
},
|
||||
},
|
||||
lessUpdated_Admin: {
|
||||
files: [
|
||||
'public/less/admin/**/*.less',
|
||||
'node_modules/nodebb-*/**/*.less',
|
||||
'!node_modules/nodebb-*/node_modules/**',
|
||||
'!node_modules/nodebb-*/.git/**',
|
||||
],
|
||||
files: ['public/**/*.less'],
|
||||
options: {
|
||||
interval: 1000,
|
||||
},
|
||||
@@ -97,9 +89,9 @@ module.exports = function (grunt) {
|
||||
clientUpdated: {
|
||||
files: [
|
||||
'public/src/**/*.js',
|
||||
'node_modules/nodebb-*/**/*.js',
|
||||
'node_modules/nodebb-*/*.js', 'node_modules/nodebb-*/**/*.js',
|
||||
'!node_modules/nodebb-*/node_modules/**',
|
||||
'node_modules/benchpressjs/build/benchpress.js',
|
||||
'node_modules/templates.js/lib/templates.js',
|
||||
'!node_modules/nodebb-*/.git/**',
|
||||
],
|
||||
options: {
|
||||
@@ -115,7 +107,7 @@ module.exports = function (grunt) {
|
||||
templatesUpdated: {
|
||||
files: [
|
||||
'src/views/**/*.tpl',
|
||||
'node_modules/nodebb-*/**/*.tpl',
|
||||
'node_modules/nodebb-*/*.tpl', 'node_modules/nodebb-*/**/*.tpl',
|
||||
'!node_modules/nodebb-*/node_modules/**',
|
||||
'!node_modules/nodebb-*/.git/**',
|
||||
],
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
[](https://gitter.im/NodeBB/NodeBB?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
||||
[](https://travis-ci.org/NodeBB/NodeBB)
|
||||
[](https://coveralls.io/github/NodeBB/NodeBB?branch=master)
|
||||
[](https://david-dm.org/nodebb/nodebb?path=install)
|
||||
[](https://david-dm.org/nodebb/nodebb)
|
||||
[](https://codeclimate.com/github/NodeBB/NodeBB)
|
||||
[](https://readthedocs.org/projects/nodebb/?badge=latest)
|
||||
|
||||
@@ -50,13 +50,13 @@ Our minimalist "Persona" theme gets you going right away, no coding experience r
|
||||
|
||||
NodeBB requires the following software to be installed:
|
||||
|
||||
* A version of Node.js at least 6 or greater ([installation/upgrade instructions](https://github.com/nodesource/distributions))
|
||||
* A version of Node.js at least 4 or greater ([installation/upgrade instructions](https://github.com/nodesource/distributions))
|
||||
* Redis, version 2.8.9 or greater **or** MongoDB, version 2.6 or greater
|
||||
* nginx, version 1.3.13 or greater (**only if** intending to use nginx to proxy requests to a NodeBB)
|
||||
|
||||
## Installation
|
||||
|
||||
[Please refer to platform-specific installation documentation](https://docs.nodebb.org/installing/os)
|
||||
[Please refer to platform-specific installation documentation](http://docs.nodebb.org/en/latest/installing/os.html)
|
||||
|
||||
## Securing NodeBB
|
||||
|
||||
@@ -71,7 +71,7 @@ It is important to ensure that your NodeBB and database servers are secured. Bea
|
||||
|
||||
## Upgrading NodeBB
|
||||
|
||||
Detailed upgrade instructions are listed in [Upgrading NodeBB](https://docs.nodebb.org/configuring/upgrade/)
|
||||
Detailed upgrade instructions are listed in [Upgrading NodeBB](https://docs.nodebb.org/en/latest/upgrading/index.html)
|
||||
|
||||
## License
|
||||
|
||||
|
||||
238
app.js
@@ -26,20 +26,32 @@ if (require.main !== module) {
|
||||
}
|
||||
|
||||
var nconf = require('nconf');
|
||||
nconf.argv().env({
|
||||
separator: '__',
|
||||
});
|
||||
nconf.argv().env('__');
|
||||
|
||||
var url = require('url');
|
||||
var async = require('async');
|
||||
var winston = require('winston');
|
||||
var path = require('path');
|
||||
|
||||
var pkg = require('./package.json');
|
||||
var file = require('./src/file');
|
||||
|
||||
global.env = process.env.NODE_ENV || 'production';
|
||||
|
||||
winston.remove(winston.transports.Console);
|
||||
winston.add(winston.transports.Console, {
|
||||
colorize: true,
|
||||
timestamp: function () {
|
||||
var date = new Date();
|
||||
return nconf.get('json-logging') ? date.toJSON() : date.getDate() + '/' + (date.getMonth() + 1) + ' ' + date.toTimeString().substr(0, 8) + ' [' + global.process.pid + ']';
|
||||
},
|
||||
level: nconf.get('log-level') || (global.env === 'production' ? 'info' : 'verbose'),
|
||||
json: (!!nconf.get('json-logging')),
|
||||
stringify: (!!nconf.get('json-logging')),
|
||||
});
|
||||
|
||||
|
||||
// Alternate configuration file support
|
||||
var configFile = path.join(__dirname, 'config.json');
|
||||
var configFile = path.join(__dirname, '/config.json');
|
||||
|
||||
if (nconf.get('config')) {
|
||||
configFile = path.resolve(__dirname, nconf.get('config'));
|
||||
@@ -47,10 +59,8 @@ if (nconf.get('config')) {
|
||||
|
||||
var configExists = file.existsSync(configFile) || (nconf.get('url') && nconf.get('secret') && nconf.get('database'));
|
||||
|
||||
var prestart = require('./src/prestart');
|
||||
prestart.loadConfig(configFile);
|
||||
prestart.versionCheck();
|
||||
prestart.setupWinston();
|
||||
loadConfig();
|
||||
versionCheck();
|
||||
|
||||
if (!process.send) {
|
||||
// If run using `node app`, log GNU copyright info along with server info
|
||||
@@ -60,40 +70,206 @@ if (!process.send) {
|
||||
winston.info('');
|
||||
}
|
||||
|
||||
|
||||
if (nconf.get('setup') || nconf.get('install')) {
|
||||
require('./src/cli/setup').setup();
|
||||
setup();
|
||||
} else if (!configExists) {
|
||||
require('./install/web').install(nconf.get('port'));
|
||||
} else if (nconf.get('upgrade')) {
|
||||
require('./src/cli/upgrade').upgrade(true);
|
||||
upgrade();
|
||||
} else if (nconf.get('reset')) {
|
||||
var options = {
|
||||
theme: nconf.get('t'),
|
||||
plugin: nconf.get('p'),
|
||||
widgets: nconf.get('w'),
|
||||
settings: nconf.get('s'),
|
||||
all: nconf.get('a'),
|
||||
};
|
||||
|
||||
async.series([
|
||||
async.apply(require('./src/cli/reset').reset, options),
|
||||
require('./src/meta/build').buildAll,
|
||||
async.waterfall([
|
||||
async.apply(require('./src/reset').reset),
|
||||
async.apply(require('./src/meta/build').buildAll),
|
||||
], function (err) {
|
||||
if (err) {
|
||||
throw err;
|
||||
}
|
||||
|
||||
process.exit(0);
|
||||
process.exit(err ? 1 : 0);
|
||||
});
|
||||
} else if (nconf.get('activate')) {
|
||||
require('./src/cli/manage').activate(nconf.get('activate'));
|
||||
activate();
|
||||
} else if (nconf.get('plugins')) {
|
||||
require('./src/cli/manage').listPlugins();
|
||||
listPlugins();
|
||||
} else if (nconf.get('build')) {
|
||||
require('./src/meta/build').build(nconf.get('build'));
|
||||
} else if (nconf.get('events')) {
|
||||
require('./src/cli/manage').listEvents();
|
||||
} else {
|
||||
require('./src/start').start();
|
||||
}
|
||||
|
||||
function loadConfig(callback) {
|
||||
winston.verbose('* using configuration stored in: %s', configFile);
|
||||
|
||||
nconf.file({
|
||||
file: configFile,
|
||||
});
|
||||
|
||||
nconf.defaults({
|
||||
base_dir: __dirname,
|
||||
themes_path: path.join(__dirname, 'node_modules'),
|
||||
upload_path: 'public/uploads',
|
||||
views_dir: path.join(__dirname, 'build/public/templates'),
|
||||
version: pkg.version,
|
||||
});
|
||||
|
||||
if (!nconf.get('isCluster')) {
|
||||
nconf.set('isPrimary', 'true');
|
||||
nconf.set('isCluster', 'false');
|
||||
}
|
||||
|
||||
// Ensure themes_path is a full filepath
|
||||
nconf.set('themes_path', path.resolve(__dirname, nconf.get('themes_path')));
|
||||
nconf.set('core_templates_path', path.join(__dirname, 'src/views'));
|
||||
nconf.set('base_templates_path', path.join(nconf.get('themes_path'), 'nodebb-theme-persona/templates'));
|
||||
|
||||
nconf.set('upload_path', path.resolve(nconf.get('base_dir'), nconf.get('upload_path')));
|
||||
|
||||
if (nconf.get('url')) {
|
||||
nconf.set('url_parsed', url.parse(nconf.get('url')));
|
||||
}
|
||||
|
||||
// Explicitly cast 'jobsDisabled' as Bool
|
||||
var castAsBool = ['jobsDisabled'];
|
||||
nconf.stores.env.readOnly = false;
|
||||
castAsBool.forEach(function (prop) {
|
||||
var value = nconf.get(prop);
|
||||
if (value) {
|
||||
nconf.set(prop, typeof value === 'boolean' ? value : String(value).toLowerCase() === 'true');
|
||||
}
|
||||
});
|
||||
nconf.stores.env.readOnly = true;
|
||||
|
||||
if (typeof callback === 'function') {
|
||||
callback();
|
||||
}
|
||||
}
|
||||
|
||||
function setup() {
|
||||
winston.info('NodeBB Setup Triggered via Command Line');
|
||||
|
||||
var install = require('./src/install');
|
||||
var build = require('./src/meta/build');
|
||||
|
||||
process.stdout.write('\nWelcome to NodeBB!\n');
|
||||
process.stdout.write('\nThis looks like a new installation, so you\'ll have to answer a few questions about your environment before we can proceed.\n');
|
||||
process.stdout.write('Press enter to accept the default setting (shown in brackets).\n');
|
||||
|
||||
async.series([
|
||||
async.apply(install.setup),
|
||||
async.apply(loadConfig),
|
||||
async.apply(build.buildAll),
|
||||
], function (err, data) {
|
||||
// Disregard build step data
|
||||
data = data[0];
|
||||
|
||||
var separator = ' ';
|
||||
if (process.stdout.columns > 10) {
|
||||
for (var x = 0, cols = process.stdout.columns - 10; x < cols; x += 1) {
|
||||
separator += '=';
|
||||
}
|
||||
}
|
||||
process.stdout.write('\n' + separator + '\n\n');
|
||||
|
||||
if (err) {
|
||||
winston.error('There was a problem completing NodeBB setup: ', err.message);
|
||||
} else {
|
||||
if (data.hasOwnProperty('password')) {
|
||||
process.stdout.write('An administrative user was automatically created for you:\n');
|
||||
process.stdout.write(' Username: ' + data.username + '\n');
|
||||
process.stdout.write(' Password: ' + data.password + '\n');
|
||||
process.stdout.write('\n');
|
||||
}
|
||||
process.stdout.write('NodeBB Setup Completed. Run \'./nodebb start\' to manually start your NodeBB server.\n');
|
||||
|
||||
// If I am a child process, notify the parent of the returned data before exiting (useful for notifying
|
||||
// hosts of auto-generated username/password during headless setups)
|
||||
if (process.send) {
|
||||
process.send(data);
|
||||
}
|
||||
}
|
||||
|
||||
process.exit();
|
||||
});
|
||||
}
|
||||
|
||||
function upgrade() {
|
||||
var db = require('./src/database');
|
||||
var meta = require('./src/meta');
|
||||
var upgrade = require('./src/upgrade');
|
||||
var build = require('./src/meta/build');
|
||||
|
||||
async.series([
|
||||
async.apply(db.init),
|
||||
async.apply(meta.configs.init),
|
||||
async.apply(upgrade.upgrade),
|
||||
async.apply(build.buildAll),
|
||||
], function (err) {
|
||||
if (err) {
|
||||
winston.error(err.stack);
|
||||
process.exit(1);
|
||||
} else {
|
||||
process.exit(0);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function activate() {
|
||||
var db = require('./src/database');
|
||||
var plugins = require('./src/plugins');
|
||||
var plugin = nconf.get('activate');
|
||||
async.waterfall([
|
||||
function (next) {
|
||||
db.init(next);
|
||||
},
|
||||
function (next) {
|
||||
if (plugin.indexOf('nodebb-') !== 0) {
|
||||
// Allow omission of `nodebb-plugin-`
|
||||
plugin = 'nodebb-plugin-' + plugin;
|
||||
}
|
||||
plugins.isInstalled(plugin, next);
|
||||
},
|
||||
function (isInstalled, next) {
|
||||
if (!isInstalled) {
|
||||
return next(new Error('plugin not installed'));
|
||||
}
|
||||
|
||||
winston.info('Activating plugin `%s`', plugin);
|
||||
db.sortedSetAdd('plugins:active', 0, plugin, next);
|
||||
},
|
||||
], function (err) {
|
||||
if (err) {
|
||||
winston.error(err.message);
|
||||
}
|
||||
process.exit(err ? 1 : 0);
|
||||
});
|
||||
}
|
||||
|
||||
function listPlugins() {
|
||||
require('./src/database').init(function (err) {
|
||||
if (err) {
|
||||
winston.error(err.stack);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
var db = require('./src/database');
|
||||
|
||||
db.getSortedSetRange('plugins:active', 0, -1, function (err, plugins) {
|
||||
if (err) {
|
||||
winston.error(err.stack);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
winston.info('Active plugins: \n\t - ' + plugins.join('\n\t - '));
|
||||
process.exit();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function versionCheck() {
|
||||
var version = process.version.slice(1);
|
||||
var range = pkg.engines.node;
|
||||
var semver = require('semver');
|
||||
var compatible = semver.satisfies(version, range);
|
||||
|
||||
if (!compatible) {
|
||||
winston.warn('Your version of Node.js is too outdated for NodeBB. Please update your version of Node.js.');
|
||||
winston.warn('Recommended ' + range.green + ', '.reset + version.yellow + ' provided\n'.reset);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
"allowLocalLogin": 1,
|
||||
"allowAccountDelete": 1,
|
||||
"allowFileUploads": 0,
|
||||
"allowedFileExtensions": "png,jpg,bmp",
|
||||
"allowUserHomePage": 1,
|
||||
"maximumFileSize": 2048,
|
||||
"minimumTitleLength": 3,
|
||||
@@ -29,14 +28,12 @@
|
||||
"maximumAboutMeLength": 1000,
|
||||
"maximumProfileImageSize": 256,
|
||||
"maximumCoverImageSize": 2048,
|
||||
"profileImageDimension": 200,
|
||||
"profileImageDimension": 128,
|
||||
"requireEmailConfirmation": 0,
|
||||
"allowProfileImageUploads": 1,
|
||||
"teaserPost": "last-reply",
|
||||
"allowPrivateGroups": 1,
|
||||
"unreadCutoff": 2,
|
||||
"bookmarkThreshold": 5,
|
||||
"topicsPerList": 20,
|
||||
"autoDetectLang": 1,
|
||||
"min:rep:flag": 0
|
||||
"topicsPerList": 20
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
{
|
||||
"widget": "html",
|
||||
"data" : {
|
||||
"html": "<footer id=\"footer\" class=\"container footer\">\r\n\t<div>\r\n\t\tPowered by <a target=\"_blank\" href=\"https://nodebb.org\">NodeBB</a> | <a target=\"_blank\" href=\"//github.com/NodeBB/NodeBB/graphs/contributors\">Contributors</a>\r\n\t</div>\r\n</footer>",
|
||||
"html": "<footer id=\"footer\" class=\"container footer\">\r\n\t<div class=\"copyright\">\r\n\t\tCopyright © 2016 <a target=\"_blank\" href=\"https://nodebb.org\">NodeBB Forums</a> | <a target=\"_blank\" href=\"//github.com/NodeBB/NodeBB/graphs/contributors\">Contributors</a>\r\n\t</div>\r\n</footer>",
|
||||
"title":"",
|
||||
"container":""
|
||||
}
|
||||
|
||||
@@ -12,7 +12,8 @@ var questions = {
|
||||
module.exports = function (config, callback) {
|
||||
async.waterfall([
|
||||
function (next) {
|
||||
winston.info('\nNow configuring ' + config.database + ' database:');
|
||||
process.stdout.write('\n');
|
||||
winston.info('Now configuring ' + config.database + ' database:');
|
||||
getDatabaseConfig(config, next);
|
||||
},
|
||||
function (databaseConfig, next) {
|
||||
@@ -33,7 +34,7 @@ function getDatabaseConfig(config, callback) {
|
||||
prompt.get(questions.redis, callback);
|
||||
}
|
||||
} else if (config.database === 'mongo') {
|
||||
if ((config['mongo:host'] && config['mongo:port']) || config['mongo:uri']) {
|
||||
if (config['mongo:host'] && config['mongo:port']) {
|
||||
callback(null, config);
|
||||
} else {
|
||||
prompt.get(questions.mongo, callback);
|
||||
@@ -67,7 +68,6 @@ function saveDatabaseConfig(config, databaseConfig, callback) {
|
||||
username: databaseConfig['mongo:username'],
|
||||
password: databaseConfig['mongo:password'],
|
||||
database: databaseConfig['mongo:database'],
|
||||
uri: databaseConfig['mongo:uri'],
|
||||
};
|
||||
} else {
|
||||
return callback(new Error('unknown database : ' + config.database));
|
||||
|
||||
@@ -1,140 +0,0 @@
|
||||
{
|
||||
"name": "nodebb",
|
||||
"license": "GPL-3.0",
|
||||
"description": "NodeBB Forum",
|
||||
"version": "1.7.4",
|
||||
"homepage": "http://www.nodebb.org",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/NodeBB/NodeBB/"
|
||||
},
|
||||
"main": "app.js",
|
||||
"scripts": {
|
||||
"start": "node loader.js",
|
||||
"lint": "eslint --cache ./nodebb .",
|
||||
"pretest": "npm run lint",
|
||||
"test": "nyc --reporter=html --reporter=text-summary mocha",
|
||||
"coveralls": "nyc report --reporter=text-lcov | coveralls && rm -r coverage"
|
||||
},
|
||||
"dependencies": {
|
||||
"ace-builds": "^1.2.9",
|
||||
"async": "2.6.0",
|
||||
"autoprefixer": "7.2.4",
|
||||
"bcryptjs": "2.4.3",
|
||||
"benchpressjs": "^1.2.0",
|
||||
"body-parser": "^1.18.2",
|
||||
"bootstrap": "^3.3.7",
|
||||
"chart.js": "^2.7.1",
|
||||
"colors": "^1.1.2",
|
||||
"compression": "^1.7.1",
|
||||
"commander": "^2.12.2",
|
||||
"connect-ensure-login": "^0.1.1",
|
||||
"connect-flash": "^0.1.1",
|
||||
"connect-mongo": "2.0.1",
|
||||
"connect-multiparty": "^2.1.0",
|
||||
"connect-redis": "3.3.3",
|
||||
"cookie-parser": "^1.4.3",
|
||||
"cron": "^1.3.0",
|
||||
"cropperjs": "^1.2.2",
|
||||
"csurf": "^1.9.0",
|
||||
"daemon": "^1.1.0",
|
||||
"express": "^4.16.2",
|
||||
"express-session": "^1.15.6",
|
||||
"express-useragent": "1.0.8",
|
||||
"graceful-fs": "^4.1.11",
|
||||
"html-to-text": "3.3.0",
|
||||
"ipaddr.js": "^1.5.4",
|
||||
"jimp": "0.2.28",
|
||||
"jquery": "^3.2.1",
|
||||
"jsesc": "2.5.1",
|
||||
"json-2-csv": "^2.1.2",
|
||||
"less": "^2.7.3",
|
||||
"lodash": "^4.17.4",
|
||||
"logrotate-stream": "^0.2.5",
|
||||
"lru-cache": "4.1.1",
|
||||
"material-design-lite": "^1.3.0",
|
||||
"mime": "^2.2.0",
|
||||
"mkdirp": "^0.5.1",
|
||||
"mongodb": "2.2.33",
|
||||
"morgan": "^1.9.0",
|
||||
"mousetrap": "^1.6.1",
|
||||
"nconf": "^0.9.1",
|
||||
"nodebb-plugin-composer-default": "6.0.8",
|
||||
"nodebb-plugin-dbsearch": "2.0.9",
|
||||
"nodebb-plugin-emoji": "2.0.9",
|
||||
"nodebb-plugin-emoji-android": "2.0.0",
|
||||
"nodebb-plugin-markdown": "8.2.2",
|
||||
"nodebb-plugin-mentions": "2.2.2",
|
||||
"nodebb-plugin-soundpack-default": "1.0.0",
|
||||
"nodebb-plugin-spam-be-gone": "0.5.1",
|
||||
"nodebb-rewards-essentials": "0.0.11",
|
||||
"nodebb-theme-lavender": "5.0.1",
|
||||
"nodebb-theme-persona": "7.2.16",
|
||||
"nodebb-theme-slick": "1.1.4",
|
||||
"nodebb-theme-vanilla": "8.1.7",
|
||||
"nodebb-widget-essentials": "4.0.1",
|
||||
"nodemailer": "4.4.1",
|
||||
"passport": "^0.4.0",
|
||||
"passport-local": "1.0.0",
|
||||
"postcss": "6.0.15",
|
||||
"postcss-clean": "1.1.0",
|
||||
"promise-polyfill": "^7.0.0",
|
||||
"prompt": "^1.0.0",
|
||||
"redis": "2.8.0",
|
||||
"request": "2.83.0",
|
||||
"rimraf": "2.6.2",
|
||||
"rss": "^1.2.2",
|
||||
"sanitize-html": "^1.16.3",
|
||||
"semver": "^5.4.1",
|
||||
"serve-favicon": "^2.4.5",
|
||||
"sitemap": "^1.13.0",
|
||||
"socket.io": "2.0.4",
|
||||
"socket.io-client": "2.0.4",
|
||||
"socket.io-redis": "5.2.0",
|
||||
"socketio-wildcard": "2.0.0",
|
||||
"spdx-license-list": "^3.0.1",
|
||||
"toobusy-js": "^0.5.1",
|
||||
"uglify-js": "^3.3.4",
|
||||
"validator": "9.2.0",
|
||||
"winston": "^2.4.0",
|
||||
"xml": "^1.0.1",
|
||||
"xregexp": "3.2.0",
|
||||
"zxcvbn": "^4.4.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"coveralls": "^3.0.0",
|
||||
"eslint": "^4.14.0",
|
||||
"eslint-config-airbnb-base": "^12.1.0",
|
||||
"eslint-plugin-import": "^2.8.0",
|
||||
"grunt": "^1.0.1",
|
||||
"grunt-contrib-watch": "^1.0.0",
|
||||
"jsdom": "^11.5.1",
|
||||
"mocha": "^4.1.0",
|
||||
"mocha-lcov-reporter": "^1.3.0",
|
||||
"nyc": "^11.4.1",
|
||||
"smtp-server": "^3.4.1"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/NodeBB/NodeBB/issues"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
},
|
||||
"maintainers": [
|
||||
{
|
||||
"name": "Andrew Rodrigues",
|
||||
"email": "andrew@nodebb.org",
|
||||
"url": "https://github.com/psychobunny"
|
||||
},
|
||||
{
|
||||
"name": "Julian Lam",
|
||||
"email": "julian@nodebb.org",
|
||||
"url": "https://github.com/julianlam"
|
||||
},
|
||||
{
|
||||
"name": "Barış Soner Uşaklı",
|
||||
"email": "baris@nodebb.org",
|
||||
"url": "https://github.com/barisusakli"
|
||||
}
|
||||
]
|
||||
}
|
||||
100
install/web.js
@@ -5,14 +5,10 @@ var express = require('express');
|
||||
var bodyParser = require('body-parser');
|
||||
var fs = require('fs');
|
||||
var path = require('path');
|
||||
var childProcess = require('child_process');
|
||||
var less = require('less');
|
||||
var async = require('async');
|
||||
var uglify = require('uglify-js');
|
||||
var nconf = require('nconf');
|
||||
var _ = require('lodash');
|
||||
var Benchpress = require('benchpressjs');
|
||||
|
||||
var app = express();
|
||||
var server;
|
||||
|
||||
@@ -28,7 +24,6 @@ winston.add(winston.transports.File, {
|
||||
|
||||
var web = {};
|
||||
var scripts = [
|
||||
'node_modules/jquery/dist/jquery.js',
|
||||
'public/vendor/xregexp/xregexp.js',
|
||||
'public/vendor/xregexp/unicode/unicode-base.js',
|
||||
'public/src/utils.js',
|
||||
@@ -40,26 +35,14 @@ web.install = function (port) {
|
||||
winston.info('Launching web installer on port', port);
|
||||
|
||||
app.use(express.static('public', {}));
|
||||
app.engine('tpl', function (filepath, options, callback) {
|
||||
async.waterfall([
|
||||
function (next) {
|
||||
fs.readFile(filepath, 'utf-8', next);
|
||||
},
|
||||
function (buffer, next) {
|
||||
Benchpress.compileParse(buffer.toString(), options, next);
|
||||
},
|
||||
], callback);
|
||||
});
|
||||
app.engine('tpl', require('templates.js').__express);
|
||||
app.set('view engine', 'tpl');
|
||||
app.set('views', path.join(__dirname, '../src/views'));
|
||||
app.use(bodyParser.urlencoded({
|
||||
extended: true,
|
||||
}));
|
||||
|
||||
async.parallel([compileLess, compileJS, copyCSS], function (err) {
|
||||
if (err) {
|
||||
winston.error(err);
|
||||
}
|
||||
async.parallel([compileLess, compileJS], function () {
|
||||
setupRoutes();
|
||||
launchExpress(port);
|
||||
});
|
||||
@@ -80,14 +63,10 @@ function setupRoutes() {
|
||||
|
||||
function welcome(req, res) {
|
||||
var dbs = ['redis', 'mongo'];
|
||||
var databases = dbs.map(function (databaseName) {
|
||||
var questions = require('../src/database/' + databaseName).questions.filter(function (question) {
|
||||
return question && !question.hideOnWebInstall;
|
||||
});
|
||||
|
||||
var databases = dbs.map(function (el) {
|
||||
return {
|
||||
name: databaseName,
|
||||
questions: questions,
|
||||
name: el,
|
||||
questions: require('../src/database/' + el).questions,
|
||||
};
|
||||
});
|
||||
|
||||
@@ -104,16 +83,14 @@ function welcome(req, res) {
|
||||
}
|
||||
|
||||
function install(req, res) {
|
||||
req.setTimeout(0);
|
||||
var setupEnvVars = _.assign({}, process.env);
|
||||
for (var i in req.body) {
|
||||
if (req.body.hasOwnProperty(i) && !process.env.hasOwnProperty(i)) {
|
||||
setupEnvVars[i.replace(':', '__')] = req.body[i];
|
||||
process.env[i.replace(':', '__')] = req.body[i];
|
||||
}
|
||||
}
|
||||
|
||||
var child = require('child_process').fork('app', ['--setup'], {
|
||||
env: setupEnvVars,
|
||||
env: process.env,
|
||||
});
|
||||
|
||||
child.on('close', function (data) {
|
||||
@@ -131,25 +108,20 @@ function launch(req, res) {
|
||||
res.json({});
|
||||
server.close();
|
||||
|
||||
var child = childProcess.spawn('node', ['loader.js'], {
|
||||
var child = require('child_process').spawn('node', ['loader.js'], {
|
||||
detached: true,
|
||||
stdio: ['ignore', 'ignore', 'ignore'],
|
||||
});
|
||||
|
||||
console.log('\nStarting NodeBB');
|
||||
console.log(' "./nodebb stop" to stop the NodeBB server');
|
||||
console.log(' "./nodebb log" to view server output');
|
||||
console.log(' "./nodebb restart" to restart NodeBB');
|
||||
process.stdout.write('\nStarting NodeBB\n');
|
||||
process.stdout.write(' "./nodebb stop" to stop the NodeBB server\n');
|
||||
process.stdout.write(' "./nodebb log" to view server output\n');
|
||||
process.stdout.write(' "./nodebb restart" to restart NodeBB\n');
|
||||
|
||||
var filesToDelete = [
|
||||
'installer.css',
|
||||
'installer.min.js',
|
||||
'bootstrap.min.css',
|
||||
];
|
||||
|
||||
async.each(filesToDelete, function (filename, next) {
|
||||
fs.unlink(path.join(__dirname, '../public', filename), next);
|
||||
}, function (err) {
|
||||
async.parallel([
|
||||
async.apply(fs.unlink(path.join(__dirname, '../public/installer.css'))),
|
||||
async.apply(fs.unlink(path.join(__dirname, '../public/installer.min.js'))),
|
||||
], function (err) {
|
||||
if (err) {
|
||||
winston.warn('Unable to remove installer files');
|
||||
}
|
||||
@@ -176,43 +148,13 @@ function compileLess(callback) {
|
||||
}
|
||||
|
||||
function compileJS(callback) {
|
||||
var code = '';
|
||||
async.eachSeries(scripts, function (srcPath, next) {
|
||||
fs.readFile(path.join(__dirname, '..', srcPath), function (err, buffer) {
|
||||
if (err) {
|
||||
return next(err);
|
||||
}
|
||||
var scriptPath = path.join(__dirname, '..');
|
||||
var result = uglify.minify(scripts.map(function (script) {
|
||||
return path.join(scriptPath, script);
|
||||
}));
|
||||
|
||||
code += buffer.toString();
|
||||
next();
|
||||
});
|
||||
}, function (err) {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
try {
|
||||
var minified = uglify.minify(code, {
|
||||
compress: false,
|
||||
});
|
||||
if (!minified.code) {
|
||||
return callback(new Error('[[error:failed-to-minify]]'));
|
||||
}
|
||||
fs.writeFile(path.join(__dirname, '../public/installer.min.js'), minified.code, callback);
|
||||
} catch (e) {
|
||||
callback(e);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function copyCSS(next) {
|
||||
async.waterfall([
|
||||
function (next) {
|
||||
fs.readFile(path.join(__dirname, '../node_modules/bootstrap/dist/css/bootstrap.min.css'), 'utf8', next);
|
||||
},
|
||||
function (src, next) {
|
||||
fs.writeFile(path.join(__dirname, '../public/bootstrap.min.css'), src, next);
|
||||
},
|
||||
], next);
|
||||
fs.writeFile(path.join(__dirname, '../public/installer.min.js'), result.code, callback);
|
||||
}
|
||||
|
||||
module.exports = web;
|
||||
|
||||
19
loader.js
@@ -142,7 +142,7 @@ function getPorts() {
|
||||
process.exit();
|
||||
}
|
||||
var urlObject = url.parse(_url);
|
||||
var port = nconf.get('PORT') || nconf.get('port') || urlObject.port || 4567;
|
||||
var port = nconf.get('port') || nconf.get('PORT') || urlObject.port || 4567;
|
||||
if (!Array.isArray(port)) {
|
||||
port = [port];
|
||||
}
|
||||
@@ -158,8 +158,8 @@ Loader.restart = function () {
|
||||
|
||||
fs.readFile(pathToConfig, { encoding: 'utf-8' }, function (err, configFile) {
|
||||
if (err) {
|
||||
console.error('Error reading config');
|
||||
throw err;
|
||||
console.log('Error reading config : ' + err.message);
|
||||
process.exit();
|
||||
}
|
||||
|
||||
var conf = JSON.parse(configFile);
|
||||
@@ -168,9 +168,6 @@ Loader.restart = function () {
|
||||
nconf.set('url', conf.url);
|
||||
nconf.stores.env.readOnly = true;
|
||||
|
||||
if (process.env.url !== conf.url) {
|
||||
process.env.url = conf.url;
|
||||
}
|
||||
Loader.start();
|
||||
});
|
||||
};
|
||||
@@ -187,9 +184,7 @@ Loader.stop = function () {
|
||||
killWorkers();
|
||||
|
||||
// Clean up the pidfile
|
||||
if (nconf.get('daemon') !== 'false' && nconf.get('daemon') !== false) {
|
||||
fs.unlinkSync(pidFilePath);
|
||||
}
|
||||
fs.unlinkSync(pidFilePath);
|
||||
};
|
||||
|
||||
function killWorkers() {
|
||||
@@ -228,7 +223,6 @@ fs.open(path.join(__dirname, 'config.json'), 'r', function (err) {
|
||||
require('daemon')({
|
||||
stdout: process.stdout,
|
||||
stderr: process.stderr,
|
||||
cwd: process.cwd(),
|
||||
});
|
||||
|
||||
fs.writeFileSync(pidFilePath, process.pid);
|
||||
@@ -240,12 +234,11 @@ fs.open(path.join(__dirname, 'config.json'), 'r', function (err) {
|
||||
Loader.start,
|
||||
], function (err) {
|
||||
if (err) {
|
||||
console.error('[loader] Error during startup');
|
||||
throw err;
|
||||
console.log('[loader] Error during startup: ' + err.message);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
// No config detected, kickstart web installer
|
||||
fork('app');
|
||||
require('child_process').fork('app');
|
||||
}
|
||||
});
|
||||
|
||||
501
nodebb
@@ -2,4 +2,503 @@
|
||||
|
||||
'use strict';
|
||||
|
||||
require('./src/cli');
|
||||
var cproc;
|
||||
var args;
|
||||
var fs;
|
||||
var path;
|
||||
var request;
|
||||
var semver;
|
||||
var prompt;
|
||||
var async;
|
||||
|
||||
try {
|
||||
require('colors');
|
||||
cproc = require('child_process');
|
||||
args = require('minimist')(process.argv.slice(2));
|
||||
fs = require('fs');
|
||||
path = require('path');
|
||||
request = require('request');
|
||||
semver = require('semver');
|
||||
prompt = require('prompt');
|
||||
async = require('async');
|
||||
} catch (e) {
|
||||
if (e.code === 'MODULE_NOT_FOUND') {
|
||||
process.stdout.write('NodeBB could not be started because it\'s dependencies have not been installed.\n');
|
||||
process.stdout.write('Please ensure that you have executed "npm install --production" prior to running NodeBB.\n\n');
|
||||
process.stdout.write('For more information, please see: https://docs.nodebb.org/en/latest/installing/os.html\n\n');
|
||||
process.stdout.write('Could not start: ' + e.code + '\n');
|
||||
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
var loaderPath = path.join(__dirname, 'loader.js');
|
||||
var appPath = path.join(__dirname, 'app.js');
|
||||
|
||||
if (args.dev) {
|
||||
process.env.NODE_ENV = 'development';
|
||||
}
|
||||
|
||||
function getRunningPid(callback) {
|
||||
fs.readFile(path.join(__dirname, 'pidfile'), {
|
||||
encoding: 'utf-8',
|
||||
}, function (err, pid) {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
try {
|
||||
process.kill(parseInt(pid, 10), 0);
|
||||
callback(null, parseInt(pid, 10));
|
||||
} catch (e) {
|
||||
callback(e);
|
||||
}
|
||||
});
|
||||
}
|
||||
function getCurrentVersion(callback) {
|
||||
fs.readFile(path.join(__dirname, 'package.json'), { encoding: 'utf-8' }, function (err, pkg) {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
try {
|
||||
pkg = JSON.parse(pkg);
|
||||
return callback(null, pkg.version);
|
||||
} catch (err) {
|
||||
return callback(err);
|
||||
}
|
||||
});
|
||||
}
|
||||
function fork(args) {
|
||||
return cproc.fork(appPath, args, {
|
||||
cwd: __dirname,
|
||||
silent: false,
|
||||
});
|
||||
}
|
||||
function getInstalledPlugins(callback) {
|
||||
async.parallel({
|
||||
files: async.apply(fs.readdir, path.join(__dirname, 'node_modules')),
|
||||
deps: async.apply(fs.readFile, path.join(__dirname, 'package.json'), { encoding: 'utf-8' }),
|
||||
}, function (err, payload) {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
var isNbbModule = /^nodebb-(?:plugin|theme|widget|rewards)-[\w-]+$/;
|
||||
var moduleName;
|
||||
var isGitRepo;
|
||||
|
||||
payload.files = payload.files.filter(function (file) {
|
||||
return isNbbModule.test(file);
|
||||
});
|
||||
|
||||
try {
|
||||
payload.deps = JSON.parse(payload.deps).dependencies;
|
||||
payload.bundled = [];
|
||||
payload.installed = [];
|
||||
} catch (err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
for (moduleName in payload.deps) {
|
||||
if (isNbbModule.test(moduleName)) {
|
||||
payload.bundled.push(moduleName);
|
||||
}
|
||||
}
|
||||
|
||||
// Whittle down deps to send back only extraneously installed plugins/themes/etc
|
||||
payload.files.forEach(function (moduleName) {
|
||||
try {
|
||||
fs.accessSync(path.join(__dirname, 'node_modules/' + moduleName, '.git'));
|
||||
isGitRepo = true;
|
||||
} catch (e) {
|
||||
isGitRepo = false;
|
||||
}
|
||||
|
||||
if (
|
||||
payload.files.indexOf(moduleName) !== -1 && // found in `node_modules/`
|
||||
payload.bundled.indexOf(moduleName) === -1 && // not found in `package.json`
|
||||
!fs.lstatSync(path.join(__dirname, 'node_modules/' + moduleName)).isSymbolicLink() && // is not a symlink
|
||||
!isGitRepo // .git/ does not exist, so it is not a git repository
|
||||
) {
|
||||
payload.installed.push(moduleName);
|
||||
}
|
||||
});
|
||||
|
||||
getModuleVersions(payload.installed, callback);
|
||||
});
|
||||
}
|
||||
function getModuleVersions(modules, callback) {
|
||||
var versionHash = {};
|
||||
|
||||
async.eachLimit(modules, 50, function (module, next) {
|
||||
fs.readFile(path.join(__dirname, 'node_modules/' + module + '/package.json'), { encoding: 'utf-8' }, function (err, pkg) {
|
||||
if (err) {
|
||||
return next(err);
|
||||
}
|
||||
|
||||
try {
|
||||
pkg = JSON.parse(pkg);
|
||||
versionHash[module] = pkg.version;
|
||||
next();
|
||||
} catch (err) {
|
||||
next(err);
|
||||
}
|
||||
});
|
||||
}, function (err) {
|
||||
callback(err, versionHash);
|
||||
});
|
||||
}
|
||||
function checkPlugins(standalone, callback) {
|
||||
if (standalone) {
|
||||
process.stdout.write('Checking installed plugins and themes for updates... ');
|
||||
}
|
||||
|
||||
async.waterfall([
|
||||
async.apply(async.parallel, {
|
||||
plugins: async.apply(getInstalledPlugins),
|
||||
version: async.apply(getCurrentVersion),
|
||||
}),
|
||||
function (payload, next) {
|
||||
var toCheck = Object.keys(payload.plugins);
|
||||
|
||||
if (!toCheck.length) {
|
||||
process.stdout.write('OK'.green + '\n'.reset);
|
||||
return next(null, []); // no extraneous plugins installed
|
||||
}
|
||||
|
||||
request({
|
||||
method: 'GET',
|
||||
url: 'https://packages.nodebb.org/api/v1/suggest?version=' + payload.version + '&package[]=' + toCheck.join('&package[]='),
|
||||
json: true,
|
||||
}, function (err, res, body) {
|
||||
if (err) {
|
||||
process.stdout.write('error'.red + '\n'.reset);
|
||||
return next(err);
|
||||
}
|
||||
process.stdout.write('OK'.green + '\n'.reset);
|
||||
|
||||
if (!Array.isArray(body) && toCheck.length === 1) {
|
||||
body = [body];
|
||||
}
|
||||
|
||||
var current;
|
||||
var suggested;
|
||||
var upgradable = body.map(function (suggestObj) {
|
||||
current = payload.plugins[suggestObj.package];
|
||||
suggested = suggestObj.version;
|
||||
|
||||
if (suggestObj.code === 'match-found' && semver.gt(suggested, current)) {
|
||||
return {
|
||||
name: suggestObj.package,
|
||||
current: current,
|
||||
suggested: suggested,
|
||||
};
|
||||
}
|
||||
return null;
|
||||
}).filter(Boolean);
|
||||
|
||||
next(null, upgradable);
|
||||
});
|
||||
},
|
||||
], callback);
|
||||
}
|
||||
function upgradePlugins(callback) {
|
||||
var standalone = false;
|
||||
if (typeof callback !== 'function') {
|
||||
callback = function () {};
|
||||
standalone = true;
|
||||
}
|
||||
|
||||
checkPlugins(standalone, function (err, found) {
|
||||
if (err) {
|
||||
process.stdout.write('Warning'.yellow + ': An unexpected error occured when attempting to verify plugin upgradability\n'.reset);
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
if (found && found.length) {
|
||||
process.stdout.write('\nA total of ' + String(found.length).bold + ' package(s) can be upgraded:\n');
|
||||
found.forEach(function (suggestObj) {
|
||||
process.stdout.write(' * '.yellow + suggestObj.name.reset + ' (' + suggestObj.current.yellow + ' -> '.reset + suggestObj.suggested.green + ')\n'.reset);
|
||||
});
|
||||
process.stdout.write('\n');
|
||||
} else {
|
||||
if (standalone) {
|
||||
process.stdout.write('\nAll packages up-to-date!'.green + '\n'.reset);
|
||||
}
|
||||
return callback();
|
||||
}
|
||||
|
||||
prompt.message = '';
|
||||
prompt.delimiter = '';
|
||||
|
||||
prompt.start();
|
||||
prompt.get({
|
||||
name: 'upgrade',
|
||||
description: 'Proceed with upgrade (y|n)?'.reset,
|
||||
type: 'string',
|
||||
}, function (err, result) {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
if (['y', 'Y', 'yes', 'YES'].indexOf(result.upgrade) !== -1) {
|
||||
process.stdout.write('\nUpgrading packages...');
|
||||
var args = ['i'];
|
||||
found.forEach(function (suggestObj) {
|
||||
args.push(suggestObj.name + '@' + suggestObj.suggested);
|
||||
});
|
||||
|
||||
cproc.execFile((process.platform === 'win32') ? 'npm.cmd' : 'npm', args, { stdio: 'ignore' }, function (err) {
|
||||
if (!err) {
|
||||
process.stdout.write(' OK\n'.green);
|
||||
}
|
||||
|
||||
callback(err);
|
||||
});
|
||||
} else {
|
||||
process.stdout.write('\nPackage upgrades skipped'.yellow + '. Check for upgrades at any time by running "'.reset + './nodebb upgrade-plugins'.green + '".\n'.reset);
|
||||
callback();
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
var commands = {
|
||||
status: {
|
||||
description: 'View the status of the NodeBB server',
|
||||
usage: 'Usage: ' + './nodebb status'.yellow,
|
||||
handler: function () {
|
||||
getRunningPid(function (err, pid) {
|
||||
if (!err) {
|
||||
process.stdout.write('\nNodeBB Running '.bold + '(pid '.cyan + pid.toString().cyan + ')\n'.cyan);
|
||||
process.stdout.write('\t"' + './nodebb stop'.yellow + '" to stop the NodeBB server\n');
|
||||
process.stdout.write('\t"' + './nodebb log'.yellow + '" to view server output\n');
|
||||
process.stdout.write('\t"' + './nodebb restart'.yellow + '" to restart NodeBB\n\n');
|
||||
} else {
|
||||
process.stdout.write('\nNodeBB is not running\n'.bold);
|
||||
process.stdout.write('\t"' + './nodebb start'.yellow + '" to launch the NodeBB server\n\n'.reset);
|
||||
}
|
||||
});
|
||||
},
|
||||
},
|
||||
start: {
|
||||
description: 'Start the NodeBB server',
|
||||
usage: 'Usage: ' + './nodebb start'.yellow,
|
||||
handler: function () {
|
||||
process.stdout.write('\nStarting NodeBB\n'.bold);
|
||||
process.stdout.write(' "' + './nodebb stop'.yellow + '" to stop the NodeBB server\n');
|
||||
process.stdout.write(' "' + './nodebb log'.yellow + '" to view server output\n');
|
||||
process.stdout.write(' "' + './nodebb restart'.yellow + '" to restart NodeBB\n\n'.reset);
|
||||
|
||||
// Spawn a new NodeBB process
|
||||
cproc.fork(loaderPath, {
|
||||
env: process.env,
|
||||
});
|
||||
},
|
||||
},
|
||||
stop: {
|
||||
description: 'Stop the NodeBB server',
|
||||
usage: 'Usage: ' + './nodebb stop'.yellow,
|
||||
handler: function () {
|
||||
getRunningPid(function (err, pid) {
|
||||
if (!err) {
|
||||
process.kill(pid, 'SIGTERM');
|
||||
process.stdout.write('Stopping NodeBB. Goodbye!\n');
|
||||
} else {
|
||||
process.stdout.write('NodeBB is already stopped.\n');
|
||||
}
|
||||
});
|
||||
},
|
||||
},
|
||||
restart: {
|
||||
description: 'Restart the NodeBB server',
|
||||
usage: 'Usage: ' + './nodebb restart'.yellow,
|
||||
handler: function () {
|
||||
getRunningPid(function (err, pid) {
|
||||
if (!err) {
|
||||
process.kill(pid, 'SIGHUP');
|
||||
process.stdout.write('\nRestarting NodeBB\n'.bold);
|
||||
} else {
|
||||
process.stdout.write('NodeBB could not be restarted, as a running instance could not be found.\n');
|
||||
}
|
||||
});
|
||||
},
|
||||
},
|
||||
log: {
|
||||
description: 'Open the output log (useful for debugging)',
|
||||
usage: 'Usage: ' + './nodebb log'.yellow,
|
||||
handler: function () {
|
||||
process.stdout.write('\nHit '.red + 'Ctrl-C '.bold + 'to exit'.red);
|
||||
process.stdout.write('\n\n'.reset);
|
||||
cproc.spawn('tail', ['-F', './logs/output.log'], {
|
||||
cwd: __dirname,
|
||||
stdio: 'inherit',
|
||||
});
|
||||
},
|
||||
},
|
||||
slog: {
|
||||
description: 'Start the NodeBB server and view the live output log',
|
||||
usage: 'Usage: ' + './nodebb slog'.yellow,
|
||||
handler: function () {
|
||||
process.stdout.write('\nStarting NodeBB with logging output\n'.bold);
|
||||
process.stdout.write('\nHit '.red + 'Ctrl-C '.bold + 'to exit'.red);
|
||||
process.stdout.write('\n\n'.reset);
|
||||
|
||||
// Spawn a new NodeBB process
|
||||
cproc.fork(loaderPath, {
|
||||
env: process.env,
|
||||
});
|
||||
cproc.spawn('tail', ['-F', './logs/output.log'], {
|
||||
cwd: __dirname,
|
||||
stdio: 'inherit',
|
||||
});
|
||||
},
|
||||
},
|
||||
dev: {
|
||||
description: 'Start NodeBB in verbose development mode',
|
||||
usage: 'Usage: ' + './nodebb dev'.yellow,
|
||||
handler: function () {
|
||||
process.env.NODE_ENV = 'development';
|
||||
cproc.fork(loaderPath, ['--no-daemon', '--no-silent'], {
|
||||
env: process.env,
|
||||
});
|
||||
},
|
||||
},
|
||||
build: {
|
||||
description: 'Compile static assets (CSS, Javascript, etc)',
|
||||
usage: 'Usage: ' + './nodebb build'.yellow + ' [js,clientCSS,acpCSS,tpl,lang]'.red + '\n' +
|
||||
' e.g. ' + './nodebb build js,tpl'.yellow + '\tbuilds JS and templates\n' +
|
||||
' ' + './nodebb build'.yellow + '\t\tbuilds all targets\n',
|
||||
handler: function () {
|
||||
var arr = ['--build'].concat(process.argv.slice(3));
|
||||
fork(arr);
|
||||
},
|
||||
},
|
||||
setup: {
|
||||
description: 'Run the NodeBB setup script',
|
||||
usage: 'Usage: ' + './nodebb setup'.yellow,
|
||||
handler: function () {
|
||||
var arr = ['--setup'].concat(process.argv.slice(3));
|
||||
fork(arr);
|
||||
},
|
||||
},
|
||||
reset: {
|
||||
description: 'Disable plugins and restore the default theme',
|
||||
usage: 'Usage: ' + './nodebb reset '.yellow + '{-t|-p|-w|-s|-a}'.red + '\n' +
|
||||
' -t <theme>\tuse specified theme\n' +
|
||||
' -p <plugin>\tdisable specified plugin\n' +
|
||||
'\n' +
|
||||
' -t\t\tuse default theme\n' +
|
||||
' -p\t\tdisable all but core plugins\n' +
|
||||
' -w\t\twidgets\n' +
|
||||
' -s\t\tsettings\n' +
|
||||
' -a\t\tall of the above\n',
|
||||
handler: function () {
|
||||
var arr = ['--reset'].concat(process.argv.slice(3));
|
||||
fork(arr);
|
||||
},
|
||||
},
|
||||
activate: {
|
||||
description: 'Activate a plugin for the next startup of NodeBB',
|
||||
usage: 'Usage: ' + './nodebb activate <plugin>'.yellow,
|
||||
handler: function () {
|
||||
var name = args._[1];
|
||||
if (!name) {
|
||||
process.stdout.write(commands.activate.usage + '\n');
|
||||
process.exit();
|
||||
}
|
||||
if (name.startsWith('nodebb-theme')) {
|
||||
fork(['--reset', '-t', name]);
|
||||
return;
|
||||
}
|
||||
var arr = ['--activate=' + name].concat(process.argv.slice(4));
|
||||
fork(arr);
|
||||
},
|
||||
},
|
||||
plugins: {
|
||||
description: 'List all installed plugins',
|
||||
usage: 'Usage: ' + './nodebb plugins'.yellow,
|
||||
handler: function () {
|
||||
var arr = ['--plugins'].concat(process.argv.slice(3));
|
||||
fork(arr);
|
||||
},
|
||||
},
|
||||
upgrade: {
|
||||
description: 'Run NodeBB upgrade scripts, ensure packages are up-to-date',
|
||||
usage: 'Usage: ' + './nodebb upgrade'.yellow,
|
||||
handler: function () {
|
||||
async.series([
|
||||
function (next) {
|
||||
process.stdout.write('1. '.bold + 'Bringing base dependencies up to date... '.yellow);
|
||||
cproc.exec('npm i --production', { cwd: __dirname, stdio: 'ignore' }, next);
|
||||
},
|
||||
function (next) {
|
||||
process.stdout.write('OK\n'.green);
|
||||
process.stdout.write('2. '.bold + 'Checking installed plugins for updates... '.yellow);
|
||||
upgradePlugins(next);
|
||||
},
|
||||
function (next) {
|
||||
process.stdout.write('3. '.bold + 'Updating NodeBB data store schema...\n'.yellow);
|
||||
var arr = ['--upgrade'].concat(process.argv.slice(3));
|
||||
var upgradeProc = fork(arr);
|
||||
|
||||
upgradeProc.on('close', next);
|
||||
},
|
||||
], function (err) {
|
||||
if (err) {
|
||||
process.stdout.write('\nError'.red + ': ' + err.message + '\n');
|
||||
} else {
|
||||
var message = 'NodeBB Upgrade Complete!';
|
||||
// some consoles will return undefined/zero columns, so just use 2 spaces in upgrade script if we can't get our column count
|
||||
var columns = process.stdout.columns;
|
||||
var spaces = columns ? new Array(Math.floor(columns / 2) - (message.length / 2) + 1).join(' ') : ' ';
|
||||
|
||||
process.stdout.write('OK\n'.green);
|
||||
process.stdout.write('\n' + spaces + message.green.bold + '\n\n'.reset);
|
||||
}
|
||||
});
|
||||
},
|
||||
},
|
||||
upgradePlugins: {
|
||||
hidden: true,
|
||||
description: '',
|
||||
handler: function () {
|
||||
upgradePlugins();
|
||||
},
|
||||
},
|
||||
help: {
|
||||
description: 'Display the help message for a given command',
|
||||
usage: 'Usage: ' + './nodebb help <command>'.yellow,
|
||||
handler: function () {
|
||||
var command = commands[args._[1]];
|
||||
if (command) {
|
||||
process.stdout.write(command.description + '\n'.reset);
|
||||
process.stdout.write(command.usage + '\n'.reset);
|
||||
|
||||
return;
|
||||
}
|
||||
var keys = Object.keys(commands).filter(function (key) {
|
||||
return !commands[key].hidden;
|
||||
});
|
||||
|
||||
process.stdout.write('\nWelcome to NodeBB\n\n'.bold);
|
||||
process.stdout.write('Usage: ./nodebb {' + keys.join('|') + '}\n\n');
|
||||
|
||||
var usage = keys.map(function (key) {
|
||||
var line = '\t' + key.yellow + (key.length < 8 ? '\t\t' : '\t');
|
||||
return line + commands[key].description;
|
||||
}).join('\n');
|
||||
|
||||
process.stdout.write(usage + '\n'.reset);
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
commands['upgrade-plugins'] = commands.upgradePlugins;
|
||||
|
||||
if (!commands[args._[0]]) {
|
||||
commands.help.handler();
|
||||
} else {
|
||||
commands[args._[0]].handler();
|
||||
}
|
||||
|
||||
@@ -1 +1 @@
|
||||
@echo off && cd %~dp0 && node ./src/cli %*
|
||||
node ./nodebb %*
|
||||
|
||||
139
package.json
Normal file
@@ -0,0 +1,139 @@
|
||||
{
|
||||
"name": "nodebb",
|
||||
"license": "GPL-3.0",
|
||||
"description": "NodeBB Forum",
|
||||
"version": "1.4.6",
|
||||
"homepage": "http://www.nodebb.org",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/NodeBB/NodeBB/"
|
||||
},
|
||||
"main": "app.js",
|
||||
"scripts": {
|
||||
"start": "node loader.js",
|
||||
"lint": "eslint --cache ./nodebb .",
|
||||
"pretest": "npm run lint",
|
||||
"test": "istanbul cover node_modules/mocha/bin/_mocha -- -R dot",
|
||||
"coveralls": "istanbul cover _mocha --report lcovonly -- -R dot && cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js && rm -rf ./coverage"
|
||||
},
|
||||
"dependencies": {
|
||||
"ace-builds": "^1.2.6",
|
||||
"async": "~1.5.0",
|
||||
"autoprefixer": "^6.2.3",
|
||||
"bcryptjs": "~2.3.0",
|
||||
"body-parser": "^1.9.0",
|
||||
"bootstrap": "^3.3.7",
|
||||
"chart.js": "^2.4.0",
|
||||
"colors": "^1.1.0",
|
||||
"compression": "^1.1.0",
|
||||
"connect-ensure-login": "^0.1.1",
|
||||
"connect-flash": "^0.1.1",
|
||||
"connect-mongo": "1.3.2",
|
||||
"connect-multiparty": "^2.0.0",
|
||||
"connect-redis": "~3.1.0",
|
||||
"cookie-parser": "^1.3.3",
|
||||
"cron": "^1.0.5",
|
||||
"cropperjs": "^0.8.1",
|
||||
"csurf": "^1.6.1",
|
||||
"daemon": "~1.1.0",
|
||||
"express": "^4.14.0",
|
||||
"express-session": "^1.8.2",
|
||||
"express-useragent": "1.0.7",
|
||||
"html-to-text": "2.1.3",
|
||||
"ip": "1.1.3",
|
||||
"jimp": "0.2.27",
|
||||
"jquery": "^3.1.0",
|
||||
"json-2-csv": "^2.0.22",
|
||||
"less": "^2.0.0",
|
||||
"logrotate-stream": "^0.2.3",
|
||||
"lru-cache": "4.0.1",
|
||||
"mime": "^1.3.4",
|
||||
"minimist": "^1.1.1",
|
||||
"mkdirp": "~0.5.0",
|
||||
"mongodb": "2.2.25",
|
||||
"morgan": "^1.3.2",
|
||||
"mousetrap": "^1.5.3",
|
||||
"nconf": "~0.8.2",
|
||||
"nodebb-plugin-composer-default": "4.4.6",
|
||||
"nodebb-plugin-dbsearch": "1.0.5",
|
||||
"nodebb-plugin-emoji-extended": "1.1.1",
|
||||
"nodebb-plugin-emoji-one": "1.1.5",
|
||||
"nodebb-plugin-markdown": "7.1.1",
|
||||
"nodebb-plugin-mentions": "1.1.3",
|
||||
"nodebb-plugin-soundpack-default": "1.0.0",
|
||||
"nodebb-plugin-spam-be-gone": "0.4.13",
|
||||
"nodebb-rewards-essentials": "0.0.9",
|
||||
"nodebb-theme-lavender": "4.0.0",
|
||||
"nodebb-theme-persona": "4.2.10",
|
||||
"nodebb-theme-vanilla": "5.2.1",
|
||||
"nodebb-widget-essentials": "2.0.13",
|
||||
"nodemailer": "2.6.4",
|
||||
"nodemailer-sendmail-transport": "1.0.0",
|
||||
"nodemailer-smtp-transport": "^2.4.1",
|
||||
"passport": "^0.3.0",
|
||||
"passport-local": "1.0.0",
|
||||
"postcss": "^5.0.13",
|
||||
"postcss-clean": "^1.0.0",
|
||||
"promise-polyfill": "^6.0.2",
|
||||
"prompt": "^1.0.0",
|
||||
"redis": "~2.6.2",
|
||||
"request": "^2.44.0",
|
||||
"rimraf": "~2.5.0",
|
||||
"rss": "^1.0.0",
|
||||
"sanitize-html": "^1.13.0",
|
||||
"semver": "^5.1.0",
|
||||
"serve-favicon": "^2.1.5",
|
||||
"sitemap": "^1.4.0",
|
||||
"socket.io": "1.7.2",
|
||||
"socket.io-client": "1.7.2",
|
||||
"socket.io-redis": "3.1.0",
|
||||
"socketio-wildcard": "~0.3.0",
|
||||
"string": "^3.0.0",
|
||||
"templates.js": "0.3.10",
|
||||
"toobusy-js": "^0.5.1",
|
||||
"uglify-js": "^2.6.0",
|
||||
"underscore": "^1.8.3",
|
||||
"underscore.deep": "^0.5.1",
|
||||
"validator": "^6.1.0",
|
||||
"winston": "^2.1.0",
|
||||
"xml": "^1.0.1",
|
||||
"xregexp": "~3.1.0",
|
||||
"zxcvbn": "^4.4.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"coveralls": "^2.11.14",
|
||||
"eslint": "^3.12.0",
|
||||
"eslint-config-airbnb-base": "^11.1.0",
|
||||
"eslint-plugin-import": "^2.2.0",
|
||||
"grunt": "~1.0.0",
|
||||
"grunt-contrib-watch": "^1.0.0",
|
||||
"istanbul": "^0.4.2",
|
||||
"mocha": "~3.2.0",
|
||||
"mocha-lcov-reporter": "^1.2.0",
|
||||
"xmlhttprequest": "1.8.0",
|
||||
"xmlhttprequest-ssl": "1.5.3"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/NodeBB/NodeBB/issues"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=4"
|
||||
},
|
||||
"maintainers": [
|
||||
{
|
||||
"name": "Andrew Rodrigues",
|
||||
"email": "andrew@nodebb.org",
|
||||
"url": "https://github.com/psychobunny"
|
||||
},
|
||||
{
|
||||
"name": "Julian Lam",
|
||||
"email": "julian@nodebb.org",
|
||||
"url": "https://github.com/julianlam"
|
||||
},
|
||||
{
|
||||
"name": "Barış Soner Uşaklı",
|
||||
"email": "baris@nodebb.org",
|
||||
"url": "https://github.com/barisusakli"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -10,6 +10,7 @@
|
||||
"overrides": true,
|
||||
"componentHandler": true,
|
||||
"bootbox": true,
|
||||
"templates": true,
|
||||
"Visibility": true,
|
||||
"Tinycon": true,
|
||||
"Promise": true
|
||||
|
||||
|
Before Width: | Height: | Size: 6.1 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 4.6 KiB |
|
Before Width: | Height: | Size: 4.7 KiB |
|
Before Width: | Height: | Size: 4.9 KiB |
|
Before Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 4.6 KiB |
|
Before Width: | Height: | Size: 4.9 KiB |
|
Before Width: | Height: | Size: 47 KiB |
|
Before Width: | Height: | Size: 3.6 KiB |
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"alert.confirm-reload": "هل تريد بالتأكيد إعادة تحميل NodeBB؟",
|
||||
"alert.confirm-restart": "هل تريد بالتأكيد إعادة تشغيل NodeBB؟",
|
||||
"alert.confirm-reload": "Are you sure you wish to reload NodeBB?",
|
||||
"alert.confirm-restart": "Are you sure you wish to restart NodeBB?",
|
||||
|
||||
"acp-title": "لوحة تحكم إدارة NodeBB | %1",
|
||||
"settings-header-contents": "محتويات"
|
||||
"acp-title": "%1 | NodeBB Admin Control Panel",
|
||||
"settings-header-contents": "Contents"
|
||||
}
|
||||
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"post-cache": "التخزين المؤقت للمشاركات",
|
||||
"posts-in-cache": "المشاركات المخزنة مؤقتاً",
|
||||
"average-post-size": "متوسط حجم المشاركة",
|
||||
"length-to-max": "الطول / أقصى حد",
|
||||
"post-cache": "Post Cache",
|
||||
"posts-in-cache": "Posts in Cache",
|
||||
"average-post-size": "Average Post Size",
|
||||
"length-to-max": "Length / Max",
|
||||
"percent-full": "%1% Full",
|
||||
"post-cache-size": "حجم التخزين المؤقت للمشاركات",
|
||||
"items-in-cache": "العناصر في التخزين المؤقت",
|
||||
"control-panel": "لوحة التحكم",
|
||||
"update-settings": "تحديث إعدادات التخزين المؤقت"
|
||||
"post-cache-size": "Post Cache Size",
|
||||
"items-in-cache": "Items in Cache",
|
||||
"control-panel": "Control Panel",
|
||||
"update-settings": "Update Cache Settings"
|
||||
}
|
||||
@@ -1,7 +1,6 @@
|
||||
{
|
||||
"x-b": "%1 b",
|
||||
"x-mb": "%1 mb",
|
||||
"x-gb": "%1 gb",
|
||||
"uptime-seconds": "Uptime in Seconds",
|
||||
"uptime-days": "Uptime in Days",
|
||||
|
||||
@@ -16,7 +15,7 @@
|
||||
"mongo.index-size": "Index Size",
|
||||
"mongo.file-size": "File Size",
|
||||
"mongo.resident-memory": "Resident Memory",
|
||||
"mongo.virtual-memory": "الذاكرة الإفتراضية",
|
||||
"mongo.virtual-memory": "Virtual Memory",
|
||||
"mongo.mapped-memory": "Mapped Memory",
|
||||
"mongo.raw-info": "MongoDB Raw Info",
|
||||
|
||||
@@ -25,10 +24,10 @@
|
||||
"redis.connected-clients": "Connected Clients",
|
||||
"redis.connected-slaves": "Connected Slaves",
|
||||
"redis.blocked-clients": "Blocked Clients",
|
||||
"redis.used-memory": "الذاكرة المستخدمة",
|
||||
"redis.used-memory": "Used Memory",
|
||||
"redis.memory-frag-ratio": "Memory Fragmentation Ratio",
|
||||
"redis.total-connections-recieved": "إجمالي الاتصالات المستلمة",
|
||||
"redis.total-commands-processed": "إجمالي الأوامر التي تمت معالجتها",
|
||||
"redis.total-connections-recieved": "Total Connections Received",
|
||||
"redis.total-commands-processed": "Total Commands Processed",
|
||||
"redis.iops": "Instantaneous Ops. Per Second",
|
||||
"redis.keyspace-hits": "Keyspace Hits",
|
||||
"redis.keyspace-misses": "Keyspace Misses",
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
{
|
||||
"figure-x": "شكل %1",
|
||||
"error-events-per-day": "<code>%1</code> حدث كل يوم ",
|
||||
"error.404": "404 لم يتم العثور",
|
||||
"error.503": "503 الخدمة غير متوفرة",
|
||||
"manage-error-log": "إدارة سجل الأخطاء",
|
||||
"export-error-log": "تصدير سجل الأخطاء (CSV)",
|
||||
"clear-error-log": "محو سجل الأخطاء",
|
||||
"route": "مسار",
|
||||
"count": "عدد",
|
||||
"no-routes-not-found": "لا توجد اخطاء 404!",
|
||||
"clear404-confirm": "هل تريد بالتأكيد محو سجلات الخطأ 404؟",
|
||||
"clear404-success": "أخطاء \"404 لم يتم العثور\" تم محوها بنجاح"
|
||||
"figure-x": "Figure %1",
|
||||
"error-events-per-day": "<code>%1</code> events per day",
|
||||
"error.404": "404 Not Found",
|
||||
"error.503": "503 Service Unavailable",
|
||||
"manage-error-log": "Manage Error Log",
|
||||
"export-error-log": "Export Error Log (CSV)",
|
||||
"clear-error-log": "Clear Error Log",
|
||||
"route": "Route",
|
||||
"count": "Count",
|
||||
"no-routes-not-found": "Hooray! No 404 errors!",
|
||||
"clear404-confirm": "Are you sure you wish to clear the 404 error logs?",
|
||||
"clear404-success": "\"404 Not Found\" errors cleared"
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"events": "أحداث",
|
||||
"no-events": "لا توجد أحداث",
|
||||
"control-panel": "لوحة تحكم الأحداث",
|
||||
"delete-events": "حذف الأحداث"
|
||||
"events": "Events",
|
||||
"no-events": "There are no events",
|
||||
"control-panel": "Events Control Panel",
|
||||
"delete-events": "Delete Events"
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"logs": "السجلات",
|
||||
"control-panel": "لوحة تحكم السجلات",
|
||||
"reload": "إعادة تحميل السجلات",
|
||||
"clear": "محو السجلات",
|
||||
"clear-success": "تم محو السجلات!"
|
||||
"logs": "Logs",
|
||||
"control-panel": "Logs Control Panel",
|
||||
"reload": "Reload Logs",
|
||||
"clear": "Clear Logs",
|
||||
"clear-success": "Logs Cleared!"
|
||||
}
|
||||
@@ -1,16 +1,9 @@
|
||||
{
|
||||
"custom-css": "Custom CSS/LESS",
|
||||
"custom-css.description": "Enter your own CSS/LESS declarations here, which will be applied after all other styles.",
|
||||
"custom-css.enable": "Enable Custom CSS/LESS",
|
||||
"custom-css": "Custom CSS",
|
||||
"custom-css.description": "Enter your own CSS declarations here, which will be applied after all other styles.",
|
||||
"custom-css.enable": "Enable Custom CSS",
|
||||
|
||||
"custom-js": "Javascript مخصصة",
|
||||
"custom-js.description": "أدخل Javascript الخاص بك هنا. سيتم تنفيذها بعد تحميل الصفحة بالكامل.",
|
||||
"custom-js.enable": "تفعيل Javascript المخصصة",
|
||||
|
||||
"custom-header": "ترويسة مخصصة",
|
||||
"custom-header.description": "أدخل HTML الخاصة بك هنا (مثل العلامات الوصفية، وما إلى ذلك)، والتي سيتم إلحاقها الى<code><head></code> في تصميم المنتدى. يسمح باستخدام علامات النص البرمجي، ولكن سيتم تعطيلها؛ لتوفر تبويبة\n<a href=\"#custom-header\" data-toggle=\"tab\">Javascript المخصصة</a>",
|
||||
"custom-header.enable": "تفعيل الترويسة المخصصة",
|
||||
|
||||
"custom-css.livereload": "تفعيل إعادة التحميل المباشرة",
|
||||
"custom-css.livereload.description": "فعل هذا الخيار لإجبار جميع الجلسات في الأجهزة التي قمت بتسجيل الدخول فيها بحسابك على التحديث عند النقر على زر الحفظ"
|
||||
"custom-header": "Custom Header",
|
||||
"custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <code><head></code> section of your forum's markup.",
|
||||
"custom-header.enable": "Enable Custom Header"
|
||||
}
|
||||
@@ -1,9 +1,9 @@
|
||||
{
|
||||
"loading": "جاري تحميل السمات...",
|
||||
"homepage": "الصفحة الرئيسية",
|
||||
"select-skin": "إختيار السمة",
|
||||
"current-skin": "السمة الحالية",
|
||||
"skin-updated": "تم تحديث السمة",
|
||||
"applied-success": "تم تطبيق السمة %1 بنجاح",
|
||||
"revert-success": "تم إستعادة الألوان الاساسية للسمة"
|
||||
"loading": "Loading Skins...",
|
||||
"homepage": "Homepage",
|
||||
"select-skin": "Select Skin",
|
||||
"current-skin": "Current Skin",
|
||||
"skin-updated": "Skin Updated",
|
||||
"applied-success": "%1 skin was succesfully applied",
|
||||
"revert-success": "Skin reverted to base colours"
|
||||
}
|
||||
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"checking-for-installed": "جاري التحقق من القوالب المثبتة...",
|
||||
"homepage": "الصفحة الرئيسية",
|
||||
"select-theme": "إختيار القالب",
|
||||
"current-theme": "القالب المستخدم حالياً",
|
||||
"no-themes": "لم يتم العثور على قوالب مثبتة",
|
||||
"revert-confirm": "هل أنت متأكد من أنك ترغب في استعادة قااب NodeBB الافتراضي؟",
|
||||
"theme-changed": "تم تغيير القالب",
|
||||
"revert-success": "لقد قمت بنجاح بإستعادة القالب الأساسي لـNodeBB",
|
||||
"restart-to-activate": "الرجاء إعادة تشغيل NodeBB لتنشيط هذا القالب بشكل كامل"
|
||||
"checking-for-installed": "Checking for installed themes...",
|
||||
"homepage": "Homepage",
|
||||
"select-theme": "Select Theme",
|
||||
"current-theme": "Current Theme",
|
||||
"no-themes": "No installed themes found",
|
||||
"revert-confirm": "Are you sure you wish to restore the default NodeBB theme?",
|
||||
"theme-changed": "Theme Changed",
|
||||
"revert-success": "You have successfully reverted your NodeBB back to it's default theme.",
|
||||
"restart-to-activate": "Please restart your NodeBB to fully activate this theme"
|
||||
}
|
||||
@@ -1,12 +1,10 @@
|
||||
{
|
||||
"you-are-on": "Info - You are on <strong>%1:%2</strong>",
|
||||
"nodes-responded": "%1 nodes responded within %2ms!",
|
||||
"host": "host",
|
||||
"pid": "pid",
|
||||
"nodejs": "nodejs",
|
||||
"online": "online",
|
||||
"git": "git",
|
||||
"memory": "memory",
|
||||
"load": "load",
|
||||
"uptime": "uptime",
|
||||
|
||||
|
||||
@@ -1,51 +1,47 @@
|
||||
{
|
||||
"installed": "منصبة",
|
||||
"active": "مفعلة",
|
||||
"inactive": "معطلة",
|
||||
"out-of-date": "غير محدثة",
|
||||
"none-found": "لم يتم العثور على إضافات",
|
||||
"none-active": "لا توجد إضافات مفعلة",
|
||||
"find-plugins": "العثور على الإضافات",
|
||||
"installed": "Installed",
|
||||
"active": "Active",
|
||||
"inactive": "Inactive",
|
||||
"out-of-date": "Out of Date",
|
||||
"none-found": "No plugins found.",
|
||||
"none-active": "No Active Plugins",
|
||||
"find-plugins": "Find Plugins",
|
||||
|
||||
"plugin-search": "البحث عن الإضافات",
|
||||
"plugin-search-placeholder": "جاري البحث عن الإضافات...",
|
||||
"reorder-plugins": "إعادة ترتيب الإضافات",
|
||||
"order-active": "ترتيب الإضافات المفعلة",
|
||||
"dev-interested": "هل انته مهتم ببرمجة إضافات لـNodeBB؟",
|
||||
"docs-info": "دليل كامل حول برمجة الإضافات بالإمكان العثور عليه في <a target=\"_blank\" href=\"https://docs.nodebb.org/development/plugins/\"> NodeBB Docs Portal</a>.",
|
||||
"plugin-search": "Plugin Search",
|
||||
"plugin-search-placeholder": "Search for plugin...",
|
||||
"reorder-plugins": "Re-order Plugins",
|
||||
"order-active": "Order Active Plugins",
|
||||
"dev-interested": "Interested in writing plugins for NodeBB?",
|
||||
"docs-info": "Full documentation regarding plugin authoring can be found in the <a target=\"_blank\" href=\"https://docs.nodebb.org/en/latest/plugins/create.html\">NodeBB Docs Portal</a>.",
|
||||
|
||||
"order.description": "بعض الإضافات تعمل بشكل مثالي عندما يتم تفعيلها قبل أو بعد الإضافات الأخرى.",
|
||||
"order.explanation": "يتم تحميل الإضافات حسب الترتيب المحدد هنا، من الأعلى إلى الأسفل",
|
||||
"order.description": "Certain plugins work ideally when they are initialised before/after other plugins.",
|
||||
"order.explanation": "Plugins load in the order specified here, from top to bottom",
|
||||
|
||||
"plugin-item.themes": "Themes",
|
||||
"plugin-item.deactivate": "Deactivate",
|
||||
"plugin-item.activate": "Activate",
|
||||
"plugin-item.install": "Install",
|
||||
"plugin-item.uninstall": "Uninstall",
|
||||
"plugin-item.settings": "Settings",
|
||||
"plugin-item.installed": "Installed",
|
||||
"plugin-item.latest": "Latest",
|
||||
"plugin-item.upgrade": "Upgrade",
|
||||
"plugin-item.more-info": "For more information:",
|
||||
"plugin-item.unknown": "Unknown",
|
||||
"plugin-item.unknown-explanation": "The state of this plugin could not be determined, possibly due to a misconfiguration error.",
|
||||
|
||||
"plugin-item.themes": "القوالب",
|
||||
"plugin-item.deactivate": "تعطيل",
|
||||
"plugin-item.activate": "تفعيل",
|
||||
"plugin-item.install": "تنصيب",
|
||||
"plugin-item.uninstall": "إلغاء التنصيب",
|
||||
"plugin-item.settings": "الإعدادات",
|
||||
"plugin-item.installed": "المنصبة",
|
||||
"plugin-item.latest": "الأحدث",
|
||||
"plugin-item.upgrade": "ترقية",
|
||||
"plugin-item.more-info": "لمزيد من المعلومات:",
|
||||
"plugin-item.unknown": "غير معروف",
|
||||
"plugin-item.unknown-explanation": "تعذر تحديد حالة هذه الإضافة، ربما بسبب خطأ في الإعدادات.",
|
||||
|
||||
"alert.enabled": "الإضافة مفعلة",
|
||||
"alert.disabled": "الإضافة معطلة",
|
||||
"alert.upgraded": "الإضافة مرقاة",
|
||||
"alert.installed": "الإضافة منصبة",
|
||||
"alert.uninstalled": "تم إلغاء تنصيب الإضافة",
|
||||
"alert.activate-success": "يرجى إعادة تشغيل NodeBB لتنشيط الإضافة بشكل بالكامل",
|
||||
"alert.deactivate-success": "تم تعطيل الإضافة بنجاح",
|
||||
"alert.upgrade-success": "يرجى إعادة تحميل NodeBB لترقية هذه الإضافة بشكل كامل",
|
||||
"alert.install-success": "تم تثبيت الإضافة بنجاح، يرجى تفعيلها.",
|
||||
"alert.uninstall-success": "تم تعطيل الإضافة وإلغاء تنصيبها بنجاح.",
|
||||
"alert.enabled": "Plugin Enabled",
|
||||
"alert.disabled": "Plugin Disabled",
|
||||
"alert.upgraded": "Plugin Upgraded",
|
||||
"alert.installed": "Plugin Installed",
|
||||
"alert.uninstalled": "Plugin Uninstalled",
|
||||
"alert.activate-success": "Please restart your NodeBB to fully activate this plugin",
|
||||
"alert.deactivate-success": "Plugin successfully deactivated",
|
||||
"alert.upgrade-success": "Please reload your NodeBB to fully upgrade this plugin",
|
||||
"alert.install-success": "Plugin successfully installed, please activate the plugin.",
|
||||
"alert.uninstall-success": "The plugin has been successfully deactivated and uninstalled.",
|
||||
"alert.suggest-error": "<p>NodeBB could not reach the package manager, proceed with installation of latest version?</p><div class=\"alert alert-danger\"><strong>Server returned (%1)</strong>: %2</div>",
|
||||
"alert.package-manager-unreachable": "<p>NodeBB could not reach the package manager, an upgrade is not suggested at this time.</p>",
|
||||
"alert.incompatible": "<p>Your version of NodeBB (v%1) is only cleared to upgrade to v%2 of this plugin. Please update your NodeBB if you wish to install a newer version of this plugin.</p>",
|
||||
"alert.possibly-incompatible": "<div class=\"alert alert-warning\"><p><strong>No Compatibility Information Found</strong></p><p>This plugin did not specify a specific version for installation given your NodeBB version. Full compatibility cannot be guaranteed, and may cause your NodeBB to no longer start properly.</p></div><p>In the event that NodeBB cannot boot properly:</p><pre><code>$ ./nodebb reset plugin=\"%1\"</code></pre><p>Continue installation of latest version of this plugin?</p>",
|
||||
|
||||
"license.title": "معلومات ترخيص الإضافة",
|
||||
"license.intro": "The plugin <strong>%1</strong> is licensed under the %2. Please read and understand the license terms prior to activating this plugin.",
|
||||
"license.cta": "هل ترغب بالاستمرار في تفعيل هذه الإضافة؟"
|
||||
"alert.possibly-incompatible": "<div class=\"alert alert-warning\"><p><strong>No Compatibility Information Found</strong></p><p>This plugin did not specify a specific version for installation given your NodeBB version. Full compatibility cannot be guaranteed, and may cause your NodeBB to no longer start properly.</p></div><p>In the event that NodeBB cannot boot properly:</p><pre><code>$ ./nodebb reset plugin=\"%1\"</code></pre><p>Continue installation of latest version of this plugin?</p>"
|
||||
}
|
||||
|
||||
@@ -1,69 +1,64 @@
|
||||
{
|
||||
"forum-traffic": "Forum Traffic",
|
||||
"page-views": "مشاهدات الصفحات",
|
||||
"unique-visitors": "زائرين فريدين",
|
||||
"users": "أعضاء",
|
||||
"posts": "مشاركات",
|
||||
"topics": "مواضيع",
|
||||
"page-views-seven": "آخر 7 ايام",
|
||||
"page-views-thirty": "آخر 30 يوماً",
|
||||
"page-views-last-day": "آخر 24 ساعة",
|
||||
"page-views-custom": "مدة زمنية مخصصة",
|
||||
"page-views-custom-start": "بداية المدة",
|
||||
"page-views-custom-end": "نهاية المده",
|
||||
"page-views-custom-help": "أدخل نطاقا زمنيا لمرات مشاهدة الصفحات التي ترغب في عرضها. إذا لم يظهر منتقي التاريخ، فإن التنسيق المقبول هو <code>YYYY-MM-DD</code>",
|
||||
"page-views-custom-error": "الرجاء إدخال نطاق تاريخ صالح بالتنسيق <code>YYYY-MM-DD</code>",
|
||||
"page-views": "Page Views",
|
||||
"unique-visitors": "Unique Visitors",
|
||||
"users": "Users",
|
||||
"posts": "Posts",
|
||||
"topics": "Topics",
|
||||
"page-views-last-month": "Page views Last Month",
|
||||
"page-views-this-month": "Page views This Month",
|
||||
"page-views-last-day": "Page views in last 24 hours",
|
||||
|
||||
"stats.day": "يوم",
|
||||
"stats.week": "إسبوع",
|
||||
"stats.month": "شهر",
|
||||
"stats.all": "كل الوقت",
|
||||
"stats.day": "Day",
|
||||
"stats.week": "Week",
|
||||
"stats.month": "Month",
|
||||
"stats.all": "All Time",
|
||||
|
||||
"updates": "Updates",
|
||||
"running-version": "You are running <strong>NodeBB v<span id=\"version\">%1</span></strong>.",
|
||||
"keep-updated": "Always make sure that your NodeBB is up to date for the latest security patches and bug fixes.",
|
||||
"up-to-date": "<p>You are <strong>up-to-date</strong> <i class=\"fa fa-check\"></i></p>",
|
||||
"upgrade-available": "<p>A new version (v%1) has been released. Consider <a href=\"https://docs.nodebb.org/en/latest/upgrading/index.html\">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/en/latest/upgrading/index.html\">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>",
|
||||
"running-in-development": "<span>Forum is running in development mode. The forum may be open to potential vulnerabilities; please contact your system administrator.</span>",
|
||||
|
||||
"updates": "تحديثات",
|
||||
"running-version": "المنتدى يعمل حاليا على <strong>NodeBB الإصدار<span id=\"version\">%1</span></strong>.",
|
||||
"keep-updated": "تأكد دائما من أن NodeBB يعمل على احدث إصدار للحصول على أحدث التصحيحات الأمنية وإصلاحات الأخطاء.",
|
||||
"up-to-date": "<p>المنتدى <strong>يعمل على أحدث إصدار</strong> <i class=\"fa fa-check\"></i></p>",
|
||||
"upgrade-available": "<p>نسخة جديدة (الإصدار %1) تم إصدارها. خذ بعين الاعتبار <a href=\"https://docs.nodebb.org/configuring/upgrade/\">ترقية NodeBB الخاص بك</a>.</p>",
|
||||
"prerelease-upgrade-available": "<p>نسخة ما قبل الإصدار من NodeBB هذه قديمة. إصدار أحدث (الإصدار %1) تم إصداره. خذ بعين الاعتبار <a href=\"https://docs.nodebb.org/configuring/upgrade/\">ترقية NodeBB الخاص بك</a>.</p>",
|
||||
"prerelease-warning": "<p>هذه نسخة <strong>ماقبل الإصدار</strong> من NodeBB. قد تحدث أخطاء غير مقصودة. <i class=\"fa fa-exclamation-triangle\"></i></p>",
|
||||
"running-in-development": "المنتدى قيد التشغيل في وضع \"المطورين\". وقد تكون هناك ثغرات أمنية مفتوحة؛ من فضلك تواصل مع مسؤول نظامك.",
|
||||
"notices": "Notices",
|
||||
"restart-not-required": "Restart not required",
|
||||
"restart-required": "Restart required",
|
||||
"search-plugin-installed": "Search Plugin installed",
|
||||
"search-plugin-not-installed": "Search Plugin not installed",
|
||||
"search-plugin-tooltip": "Install a search plugin from the plugin page in order to activate search functionality",
|
||||
|
||||
"notices": "إشعارات",
|
||||
"restart-not-required": "إعادة التشغيل غير مطلوب",
|
||||
"restart-required": "إعادة التشغيل مطلوبة",
|
||||
"search-plugin-installed": "إضافة البحث منصبة",
|
||||
"search-plugin-not-installed": "إضافة البحث غير منصبة",
|
||||
"search-plugin-tooltip": "نصب إضافة البحث من صفحة الإضافات البرمجية لتنشيط وظيفة البحث",
|
||||
"control-panel": "System Control",
|
||||
"reload": "Reload",
|
||||
"restart": "Restart",
|
||||
"restart-warning": "Reloading or Restarting your NodeBB will drop all existing connections for a few seconds.",
|
||||
"maintenance-mode": "Maintenance Mode",
|
||||
"maintenance-mode-title": "Click here to set up maintenance mode for NodeBB",
|
||||
"realtime-chart-updates": "Realtime Chart Updates",
|
||||
|
||||
"control-panel": "التحكم بالنظام",
|
||||
"reload": "إعادة تحمبل",
|
||||
"restart": "إعادة تشغيل",
|
||||
"restart-warning": "إعادة تحميل او تشغيل NodeBB سوف يؤدي لقطع جميع الإتصالات لبضع ثواني.",
|
||||
"maintenance-mode": "وضع الصيانة",
|
||||
"maintenance-mode-title": "انقر هنا لإعداد وضع الصيانة لـNodeBB",
|
||||
"realtime-chart-updates": "التحديث الفوري للرسم البياني",
|
||||
|
||||
"active-users": "المستخدمين النشطين",
|
||||
"active-users.users": "الأعضاء",
|
||||
"active-users.guests": "الزوار",
|
||||
"active-users.total": "المجموع",
|
||||
"active-users": "Active Users",
|
||||
"active-users.users": "Users",
|
||||
"active-users.guests": "Guests",
|
||||
"active-users.total": "Total",
|
||||
"active-users.connections": "Connections",
|
||||
|
||||
"anonymous-registered-users": "المجهولين مقابل المستخدمين المسجلين",
|
||||
"anonymous": "مجهول",
|
||||
"registered": "مسجل",
|
||||
"anonymous-registered-users": "Anonymous vs Registered Users",
|
||||
"anonymous": "Anonymous",
|
||||
"registered": "Registered",
|
||||
|
||||
"user-presence": "تواجد المستخدمين",
|
||||
"on-categories": "في قائمة الأقسام",
|
||||
"reading-posts": "قراءة المشاركات",
|
||||
"browsing-topics": "تصفح المواضيع",
|
||||
"recent": "الأخيرة",
|
||||
"unread": "غير مقروء",
|
||||
"user-presence": "User Presence",
|
||||
"on-categories": "On categories list",
|
||||
"reading-posts": "Reading posts",
|
||||
"browsing-topics": "Browsing topics",
|
||||
"recent": "Recent",
|
||||
"unread": "Unread",
|
||||
|
||||
"high-presence-topics": "مواضيع ذات حضور قوي",
|
||||
"high-presence-topics": "High Presence Topics",
|
||||
|
||||
"graphs.page-views": "مشاهدات الصفحة",
|
||||
"graphs.unique-visitors": "زوار فريدين",
|
||||
"graphs.registered-users": "مستخدمين مسجلين",
|
||||
"graphs.anonymous-users": "مستخدمين مجهولين"
|
||||
"graphs.page-views": "Page Views",
|
||||
"graphs.unique-visitors": "Unique Visitors",
|
||||
"graphs.registered-users": "Registered Users",
|
||||
"graphs.anonymous-users": "Anonymous Users"
|
||||
}
|
||||
|
||||
@@ -3,6 +3,5 @@
|
||||
"description": "Choose what page is shown when users navigate to the root URL of your forum.",
|
||||
"home-page-route": "Home Page Route",
|
||||
"custom-route": "Custom Route",
|
||||
"allow-user-home-pages": "Allow User Home Pages",
|
||||
"home-page-title": "Title of the home page (default \"Home\")"
|
||||
"allow-user-home-pages": "Allow User Home Pages"
|
||||
}
|
||||
@@ -1,6 +1,5 @@
|
||||
{
|
||||
"language-settings": "اعدادات اللغة",
|
||||
"description": "تُحدد اللغة الافتراضية إعدادات اللغة لجميع المستخدمين الذين يزورون المنتدى. <br />يمكن للأعضاء تجاوز اللغة الافتراضية من خلال صفحة إعدادات الحساب الخاصة بهم.",
|
||||
"default-language": "اللغة الافتراضية",
|
||||
"auto-detect": "الكشف عن إعدادات اللغة للزوار بشكل آلي"
|
||||
"language-settings": "Language Settings",
|
||||
"description": "The default language determines the language settings for all users who are visiting your forum. <br />Individual users can override the default language on their account settings page.",
|
||||
"default-language": "Default Language"
|
||||
}
|
||||
@@ -11,7 +11,6 @@
|
||||
"only-admins": "Only display to Admins",
|
||||
"only-global-mods-and-admins": "Only display to Global Moderators and Admins",
|
||||
"only-logged-in": "Only display to logged in users",
|
||||
"only-guest": "Only display to guests",
|
||||
"open-new-window": "Open in a new window",
|
||||
|
||||
"installed-plugins-required": "Installed Plugins Required:",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"notifications": "التنبيهات",
|
||||
"notifications": "Notifications",
|
||||
"chat-messages": "Chat Messages",
|
||||
"play-sound": "Play",
|
||||
"incoming-message": "Incoming Message",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"settings": "اعدادات القسم",
|
||||
"privileges": "الصلاحيات",
|
||||
"settings": "Category Settings",
|
||||
"privileges": "Privileges",
|
||||
|
||||
"name": "Category Name",
|
||||
"description": "Category Description",
|
||||
@@ -10,7 +10,6 @@
|
||||
"custom-class": "Custom Class",
|
||||
"num-recent-replies": "# of Recent Replies",
|
||||
"ext-link": "External Link",
|
||||
"is-section": "Treat this category as a section",
|
||||
"upload-image": "Upload Image",
|
||||
"delete-image": "Remove",
|
||||
"category-image": "Category Image",
|
||||
|
||||
19
public/language/ar/admin/manage/flags.json
Normal file
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"daily": "Daily flags",
|
||||
"by-user": "Flags by user",
|
||||
"by-user-search": "Search flagged posts by username",
|
||||
"category": "Category",
|
||||
"sort-by": "Sort By",
|
||||
"sort-by.most-flags": "Most Flags",
|
||||
"sort-by.most-recent": "Most Recent",
|
||||
"search": "Search",
|
||||
"dismiss-all": "Dismiss All",
|
||||
"none-flagged": "No flagged posts!",
|
||||
"posted-in": "Posted in %1",
|
||||
"read-more": "Read More",
|
||||
"flagged-x-times": "This post has been flagged %1 time(s):",
|
||||
"dismiss": "Dismiss this Flag",
|
||||
"delete-post": "Delete the Post",
|
||||
|
||||
"alerts.confirm-delete-post": "Do you really want to delete this post?"
|
||||
}
|
||||
@@ -1,7 +1,6 @@
|
||||
{
|
||||
"name": "اسم المجموعة",
|
||||
"name": "Group Name",
|
||||
"description": "Group Description",
|
||||
"member-count": "Member Count",
|
||||
"system": "System Group",
|
||||
"edit": "Edit",
|
||||
"search-placeholder": "Search",
|
||||
|
||||
@@ -11,8 +11,5 @@
|
||||
"validate.x-valid": "<strong>%1</strong> out of <strong>%2</strong> rule(s) valid.",
|
||||
"validate.x-invalid": "The following <strong>%1</strong> rules are invalid:",
|
||||
|
||||
"alerts.applied-success": "Blacklist Applied",
|
||||
|
||||
"analytics.blacklist-hourly": "<strong>Figure 1</strong> – Blacklist hits per hour",
|
||||
"analytics.blacklist-daily": "<strong>Figure 2</strong> – Blacklist hits per day"
|
||||
"alerts.applied-success": "Blacklist Applied"
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
{
|
||||
"post-queue": "Post Queue",
|
||||
"description": "There are no posts in the post queue. <br> To enable this feature, go to <a href=\"%1\">Settings → Post → Posting Restrictions</a> and enable <strong>Post Queue</strong>.",
|
||||
"user": "User",
|
||||
"category": "Category",
|
||||
"title": "Title",
|
||||
"content": "Content",
|
||||
"posted": "Posted",
|
||||
"reply-to": "Reply to \"%1\"",
|
||||
"content-editable": "You can click on individual content to edit before posting."
|
||||
}
|
||||
@@ -6,7 +6,6 @@
|
||||
"description": "Select tags via clicking and/or dragging, use shift to select multiple.",
|
||||
"create": "Create Tag",
|
||||
"modify": "Modify Tags",
|
||||
"rename": "Rename Tags",
|
||||
"delete": "Delete Selected Tags",
|
||||
"search": "Search for tags...",
|
||||
"settings": "Click <a href=\"%1\">here</a> to visit the tag settings page.",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"users": "المستخدمين",
|
||||
"edit": "تحرير",
|
||||
"users": "Users",
|
||||
"edit": "Edit",
|
||||
"make-admin": "Make Admin",
|
||||
"remove-admin": "Remove Admin",
|
||||
"validate-email": "Validate Email",
|
||||
@@ -27,8 +27,6 @@
|
||||
"pills.banned": "Banned",
|
||||
"pills.search": "User Search",
|
||||
|
||||
"search.uid": "By User ID",
|
||||
"search.uid-placeholder": "Enter a user ID to search",
|
||||
"search.username": "By User Name",
|
||||
"search.username-placeholder": "Enter a username to search",
|
||||
"search.email": "By Email",
|
||||
@@ -71,15 +69,9 @@
|
||||
"alerts.lockout-reset-success": "Lockout(s) reset!",
|
||||
"alerts.flag-reset-success": "Flags(s) reset!",
|
||||
"alerts.no-remove-yourself-admin": "You can't remove yourself as Administrator!",
|
||||
"alerts.make-admin-success": "User is now administrator.",
|
||||
"alerts.confirm-remove-admin": "Do you really want to remove this administrator?",
|
||||
"alerts.remove-admin-success": "User is no longer administrator.",
|
||||
"alerts.make-global-mod-success": "User is now global moderator.",
|
||||
"alerts.confirm-remove-global-mod": "Do you really want to remove this global moderator?",
|
||||
"alerts.remove-global-mod-success": "User is no longer global moderator.",
|
||||
"alerts.make-moderator-success": "User is now moderator.",
|
||||
"alerts.confirm-remove-moderator": "Do you really want to remove this moderator?",
|
||||
"alerts.remove-moderator-success": "User is no longer moderator.",
|
||||
"alerts.make-admin-success": "User(s) are now administrators.",
|
||||
"alerts.confirm-remove-admin": "Do you really want to remove admins?",
|
||||
"alerts.remove-admin-success": "User(s) are no longer administrators.",
|
||||
"alerts.confirm-validate-email": "Do you want to validate email(s) of these user(s)?",
|
||||
"alerts.validate-email-success": "Emails validated",
|
||||
"alerts.password-reset-confirm": "Do you want to send password reset email(s) to these user(s)?",
|
||||
|
||||
@@ -1,36 +1,33 @@
|
||||
{
|
||||
"section-general": "عام",
|
||||
"general/dashboard": "اللوحة الرئيسية",
|
||||
"general/homepage": "الصفحة الرئيسية",
|
||||
"general/navigation": "التصفح",
|
||||
"general/languages": "اللغات",
|
||||
"general/sounds": "الأصوات",
|
||||
"general/social": "شبكات التواصل",
|
||||
"section-general": "General",
|
||||
"general/dashboard": "Dashboard",
|
||||
"general/homepage": "Home Page",
|
||||
"general/navigation": "Navigation",
|
||||
"general/languages": "Languages",
|
||||
"general/sounds": "Sounds",
|
||||
"general/social": "Social",
|
||||
|
||||
"section-manage": "إدارة",
|
||||
"manage/categories": "الأقسام",
|
||||
"manage/privileges": "Privileges",
|
||||
"manage/tags": "الكلمات المفتاحية",
|
||||
"manage/users": "الأعضاء",
|
||||
"manage/admins-mods": "Admins & Mods",
|
||||
"manage/registration": "قائمة انتظار التسجيل",
|
||||
"manage/post-queue": "قائمة انتظار المشاركة",
|
||||
"manage/groups": "المجموعات",
|
||||
"manage/ip-blacklist": "قائمة حظر عناوين IP",
|
||||
"section-manage": "Manage",
|
||||
"manage/categories": "Categories",
|
||||
"manage/tags": "Tags",
|
||||
"manage/users": "Users",
|
||||
"manage/registration": "Registration Queue",
|
||||
"manage/groups": "Groups",
|
||||
"manage/ip-blacklist": "IP Blacklist",
|
||||
|
||||
"section-settings": "إعدادات",
|
||||
"settings/general": "عامة",
|
||||
"settings/reputation": "السمعة",
|
||||
"settings/email": "البريد الإلكتروني",
|
||||
"settings/user": "الأعضاء",
|
||||
"settings/group": "المجموعات",
|
||||
"settings/guest": "الزوار",
|
||||
"settings/uploads": "الرفع",
|
||||
"settings/post": "المشاركة",
|
||||
"settings/chat": "الدردشة",
|
||||
"settings/pagination": "ترقيم الصفحات",
|
||||
"settings/tags": "الكلمات المفتاحية",
|
||||
"settings/notifications": "التنبيهات",
|
||||
"section-settings": "Settings",
|
||||
"settings/general": "General",
|
||||
"settings/reputation": "Reputation",
|
||||
"settings/email": "Email",
|
||||
"settings/user": "User",
|
||||
"settings/group": "Group",
|
||||
"settings/guest": "Guests",
|
||||
"settings/uploads": "Uploads",
|
||||
"settings/post": "Post",
|
||||
"settings/chat": "Chat",
|
||||
"settings/pagination": "Pagination",
|
||||
"settings/tags": "Tags",
|
||||
"settings/notifications": "Notifications",
|
||||
"settings/cookies": "Cookies",
|
||||
"settings/web-crawler": "Web Crawler",
|
||||
"settings/sockets": "Sockets",
|
||||
@@ -41,7 +38,7 @@
|
||||
"section-appearance": "Appearance",
|
||||
"appearance/themes": "Themes",
|
||||
"appearance/skins": "Skins",
|
||||
"appearance/customise": "Custom Content (HTML/JS/CSS)",
|
||||
"appearance/customise": "Custom HTML & CSS",
|
||||
|
||||
"section-extend": "Extend",
|
||||
"extend/plugins": "Plugins",
|
||||
@@ -67,7 +64,7 @@
|
||||
"logout": "Log out",
|
||||
"view-forum": "View Forum",
|
||||
|
||||
"search.placeholder": "Search for settings",
|
||||
"search.placeholder": "Search...",
|
||||
"search.no-results": "No results...",
|
||||
"search.search-forum": "Search the forum for <strong></strong>",
|
||||
"search.keep-typing": "Type more to see results...",
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"headers.allow-from": "Set ALLOW-FROM to Place NodeBB in an iFrame",
|
||||
"headers.powered-by": "Customise the \"Powered By\" header sent by NodeBB",
|
||||
"headers.acao": "Access-Control-Allow-Origin",
|
||||
"headers.acao-help": "To deny access to all sites, leave empty",
|
||||
"headers.acao-help": "To deny access to all sites, leave empty or set to <code>null</code>",
|
||||
"headers.acam": "Access-Control-Allow-Methods",
|
||||
"headers.acah": "Access-Control-Allow-Headers",
|
||||
"traffic-management": "Traffic Management",
|
||||
|
||||
@@ -5,7 +5,5 @@
|
||||
"disable-editing-help": "Administrators and global moderators are exempt from this restriction",
|
||||
"max-length": "Maximum length of chat messages",
|
||||
"max-room-size": "Maximum number of users in chat rooms",
|
||||
"delay": "Time between chat messages in milliseconds",
|
||||
"restrictions.seconds-edit-after": "Number of seconds before users are allowed to edit chat messages after posting. (0 disabled)",
|
||||
"restrictions.seconds-delete-after": "Number of seconds before users are allowed to delete chat messages after posting. (0 disabled)"
|
||||
"delay": "Time between chat messages in milliseconds"
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"eu-consent": "EU Consent",
|
||||
"consent.enabled": "تفعيل",
|
||||
"consent.enabled": "Enabled",
|
||||
"consent.message": "Notification message",
|
||||
"consent.acceptance": "Acceptance message",
|
||||
"consent.link-text": "Policy Link Text",
|
||||
|
||||
@@ -4,25 +4,13 @@
|
||||
"address-help": "The following email address refers to the email that the recipient will see in the \"From\" and \"Reply To\" fields.",
|
||||
"from": "From Name",
|
||||
"from-help": "The from name to display in the email.",
|
||||
|
||||
"smtp-transport": "SMTP Transport",
|
||||
"smtp-transport.enabled": "Use an external email server to send emails",
|
||||
"smtp-transport-help": "You can select from a list of well-known services or enter a custom one.",
|
||||
"smtp-transport.service": "Select a service",
|
||||
"smtp-transport.service-custom": "Custom Service",
|
||||
"smtp-transport.service-help": "Select a service name above in order to use the known information about it. Alternatively, select 'Custom Service' and enter the details below.",
|
||||
"smtp-transport.gmail-warning1": "There have been reports of the Gmail service not working on accounts with heightened security. In those scenarios, you will have to <a href=\"https://www.google.com/settings/security/lesssecureapps\">configure your GMail account to allow less secure apps</a>.",
|
||||
"smtp-transport.gmail-warning2": "For more information about this workaround, <a href=\"https://nodemailer.com/usage/using-gmail/\">please consult this NodeMailer article on the issue.</a> An alternative would be to utilise a third-party emailer plugin such as SendGrid, Mailgun, etc. <a href=\"../extend/plugins\">Browse available plugins here</a>.",
|
||||
"smtp-transport.host": "SMTP Host",
|
||||
"smtp-transport.port": "SMTP Port",
|
||||
"smtp-transport.security": "Connection security",
|
||||
"smtp-transport.security-encrypted": "Encrypted",
|
||||
"smtp-transport.security-starttls": "StartTLS",
|
||||
"smtp-transport.security-none": "None",
|
||||
"smtp-transport.username": "Username",
|
||||
"smtp-transport.username-help": "<b>For the Gmail service,</b> enter the full email address here, especially if you are using a Google Apps managed domain.",
|
||||
"smtp-transport.password": "Password",
|
||||
|
||||
"gmail-routing": "Gmail Routing",
|
||||
"gmail-routing-help1": "There have been reports of Gmail Routing not working on accounts with heightened security. In those scenarios, you will have to <a href=\"https://www.google.com/settings/security/lesssecureapps\">configure your GMail account to allow less secure apps</a>.",
|
||||
"gmail-routing-help2": "For more information about this workaround, <a href=\"https://nodemailer.com/using-gmail/\">please consult this NodeMailer article on the issue.</a> An alternative would be to utilise a third-party emailer plugin such as SendGrid, Mailgun, etc. <a href=\"{config.relative_path}/admin/extend/plugins\">Browse available plugins here</a>.",
|
||||
"gmail-transport": "Route emails through a Gmail/Google Apps account",
|
||||
"gmail-transport.username": "Username",
|
||||
"gmail-transport.username-help": "Enter the full email address here, especially if you are using a Google Apps managed domain.",
|
||||
"gmail-transport.password": "Password",
|
||||
"template": "Edit Email Template",
|
||||
"template.select": "Select Email Template",
|
||||
"template.revert": "Revert to Original",
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
{
|
||||
"site-settings": "Site Settings",
|
||||
"title": "Site Title",
|
||||
"title.url": "URL",
|
||||
"title.url-placeholder": "The URL of the site title",
|
||||
"title.url-help": "When the title is clicked, send users to this address. If left blank, user will be sent to the forum index.",
|
||||
"title.name": "Your Community Name",
|
||||
"title.show-in-header": "Show Site Title in Header",
|
||||
"browser-title": "Browser Title",
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
{
|
||||
"notifications": "Notifications",
|
||||
"welcome-notification": "Welcome Notification",
|
||||
"welcome-notification-link": "Welcome Notification Link",
|
||||
"welcome-notification-uid": "Welcome Notification User (UID)"
|
||||
"welcome-notification-link": "Welcome Notification Link"
|
||||
}
|
||||
@@ -3,9 +3,7 @@
|
||||
"enable": "Paginate topics and posts instead of using infinite scroll.",
|
||||
"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",
|
||||
"initial-num-load": "Initial Number of Topics to Load on Unread, Recent, and Popular"
|
||||
}
|
||||
@@ -4,27 +4,20 @@
|
||||
"sorting.oldest-to-newest": "Oldest to Newest",
|
||||
"sorting.newest-to-oldest": "Newest to Oldest",
|
||||
"sorting.most-votes": "Most Votes",
|
||||
"sorting.most-posts": "Most Posts",
|
||||
"sorting.topic-default": "Default Topic Sorting",
|
||||
"length": "Post Length",
|
||||
"restrictions": "Posting Restrictions",
|
||||
"restrictions-new": "New User Restrictions",
|
||||
"restrictions.post-queue": "Enable post queue",
|
||||
"restrictions-new.post-queue": "Enable new user restrictions",
|
||||
"restrictions.post-queue-help": "Enabling post queue will put the posts of new users in a queue for approval.",
|
||||
"restrictions-new.post-queue-help": "Enabling new user restrictions will set restrictions on posts created by new users.",
|
||||
"restrictions.seconds-between": "Seconds between posts",
|
||||
"restrictions.seconds-between-new": "Seconds between posts for new users",
|
||||
"restrictions.rep-threshold": "Reputation threshold before these restrictions are lifted",
|
||||
"restrictions.seconds-between": "Seconds between Posts",
|
||||
"restrictions.seconds-between-new": "Seconds between Posts for New Users",
|
||||
"restrictions.rep-threshold": "Reputation threshold before this restriction is lifted",
|
||||
"restrictions.seconds-defore-new": "Seconds before new user can post",
|
||||
"restrictions.seconds-edit-after": "Number of seconds before users are allowed to edit posts after posting. (0 disabled)",
|
||||
"restrictions.seconds-delete-after": "Number of seconds before users are allowed to delete posts after posting. (0 disabled)",
|
||||
"restrictions.seconds-edit-after": "Number of seconds users are allowed to edit posts after posting. (0 disabled)",
|
||||
"restrictions.seconds-delete-after": "Number of seconds users are allowed to delete posts after posting. (0 disabled)",
|
||||
"restrictions.replies-no-delete": "Number of replies after users are disallowed to delete their own topics. (0 disabled)",
|
||||
"restrictions.min-title-length": "Minimum Title Length",
|
||||
"restrictions.max-title-length": "Maximum Title Length",
|
||||
"restrictions.min-post-length": "Minimum Post Length",
|
||||
"restrictions.max-post-length": "Maximum Post Length",
|
||||
"restrictions.days-until-stale": "Days until topic is considered stale",
|
||||
"restrictions.days-until-stale": "Days until Topic is considered stale",
|
||||
"restrictions.stale-help": "If a topic is considered \"stale\", then a warning will be shown to users who attempt to reply to that topic.",
|
||||
"timestamp": "Timestamp",
|
||||
"timestamp.cut-off": "Date cut-off (in days)",
|
||||
@@ -36,8 +29,6 @@
|
||||
"unread": "Unread Settings",
|
||||
"unread.cutoff": "Unread cutoff days",
|
||||
"unread.min-track-last": "Minimum posts in topic before tracking last read",
|
||||
"recent": "Recent Settings",
|
||||
"recent.categoryFilter.disable": "Disable filtering of topics in ignored categories on the /recent page",
|
||||
"signature": "Signature Settings",
|
||||
"signature.disable": "Disable signatures",
|
||||
"signature.no-links": "Disable links in signatures",
|
||||
|
||||
@@ -5,8 +5,5 @@
|
||||
"votes-are-public": "All Votes Are Public",
|
||||
"thresholds": "Activity Thresholds",
|
||||
"min-rep-downvote": "Minimum reputation to downvote posts",
|
||||
"min-rep-flag": "Minimum reputation to flag posts",
|
||||
"min-rep-website": "Minimum reputation to add \"Website\" to user profile",
|
||||
"min-rep-aboutme": "Minimum reputation to add \"About me\" to user profile",
|
||||
"min-rep-signature": "Minimum reputation to add \"Signature\" to user profile"
|
||||
"min-rep-flag": "Minimum reputation to flag posts"
|
||||
}
|
||||
@@ -1,28 +1,28 @@
|
||||
{
|
||||
"posts": "المشاركات",
|
||||
"allow-files": "السماح للأعضاء بتحميل الملفات الإعتيادية",
|
||||
"private": "جعل الملفات التي تم رفعها خاصة",
|
||||
"max-image-width": "تغيير حجم الصور إلى عرض محدد (بالبكسل)",
|
||||
"max-image-width-help": "(بالبكسل، الافتراضي: 760 بكسل، ضع إلى 0 لتعطيل الخاصية)",
|
||||
"max-file-size": "الحد الأقصى لحجم الملف (بالكيبيبايت)",
|
||||
"max-file-size-help": "(بالكيبيبايت، الافتراضي: 2048)",
|
||||
"allow-topic-thumbnails": "السماح للاعضاء برفع الصور المصغرة للموضوع",
|
||||
"topic-thumb-size": "حجم الصورة المصغرة للموضوع",
|
||||
"allowed-file-extensions": "إمتدادات الملفات المسموح بها",
|
||||
"allowed-file-extensions-help": "أدخل قائمة بامتدادات الملفات مفصولة بفواصل (مثال: <code>pdf,xls,doc</code>). القائمة الفارغة تعني أن كل الامتدادات مسموح بها.",
|
||||
"profile-avatars": "الصورة الرمزية للملف الشخصي",
|
||||
"allow-profile-image-uploads": "السماح للأعضاء برفع الصور الرمزية",
|
||||
"convert-profile-image-png": "تحويل إمتداد الصور الرمزية المرفوعه الى PNG",
|
||||
"default-avatar": "الصورة الرمزية الافتراضية",
|
||||
"upload": "رفع",
|
||||
"profile-image-dimension": "أبعاد الصورة الرمزية",
|
||||
"profile-image-dimension-help": "(بالبكسل، الافتراضي: 128 بكسل)",
|
||||
"max-profile-image-size": "الحد الأقصى لحجم الصورة الرمزية",
|
||||
"max-profile-image-size-help": "(بالكيبيبايت، الافتراضي: 256)",
|
||||
"max-cover-image-size": "الحد الأقصى لحجم صورة الغلاف",
|
||||
"max-cover-image-size-help": "(بالكيبيبايت، الافتراضي: 2,048)",
|
||||
"keep-all-user-images": "الاحتفاظ بالنسخ القديمة من الصور الرمزية وصور الغلاف في السيرفر",
|
||||
"profile-covers": "غلاف الملف الشخصي",
|
||||
"default-covers": "صورة الغلاف الافتراضية",
|
||||
"default-covers-help": "اضف صور الغلاف الافتراضية متبوعة بفواصل لاستخدامها في الحسابات التي لا تحتوي على صور غلاف مرفوعة"
|
||||
"posts": "Posts",
|
||||
"allow-files": "Allow users to upload regular files",
|
||||
"private": "Make uploaded files private",
|
||||
"max-image-width": "Resize images down to specified width (in pixels)",
|
||||
"max-image-width-help": "(in pixels, default: 760 pixels, set to 0 to disable)",
|
||||
"max-file-size": "Maximum File Size (in KiB)",
|
||||
"max-file-size-help": "(in kilobytes, default: 2048 KiB)",
|
||||
"allow-topic-thumbnails": "Allow users to upload topic thumbnails",
|
||||
"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.",
|
||||
"profile-avatars": "Profile Avatars",
|
||||
"allow-profile-image-uploads": "Allow users to upload profile images",
|
||||
"convert-profile-image-png": "Convert profile image uploads to PNG",
|
||||
"default-avatar": "Custom Default Avatar",
|
||||
"upload": "Upload",
|
||||
"profile-image-dimension": "Profile Image Dimension",
|
||||
"profile-image-dimension-help": "(in pixels, default: 128 pixels)",
|
||||
"max-profile-image-size": "Maximum Profile Image File Size",
|
||||
"max-profile-image-size-help": "(in kilobytes, default: 256 KiB)",
|
||||
"max-cover-image-size": "Maximum Cover Image File Size",
|
||||
"max-cover-image-size-help": "(in kilobytes, default: 2,048 KiB)",
|
||||
"keep-all-user-images": "Keep old versions of avatars and profile covers on the server",
|
||||
"profile-covers": "Profile Covers",
|
||||
"default-covers": "Default Cover Images",
|
||||
"default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image"
|
||||
}
|
||||
|
||||
@@ -1,57 +1,50 @@
|
||||
{
|
||||
"authentication": "المصادقة",
|
||||
"allow-local-login": "السماح بتسجيل الدخول المحلي",
|
||||
"require-email-confirmation": "يطلب تأكيد البريد الإلكتروني",
|
||||
"email-confirm-interval": "لا يمكن للمستخدم إعادة إرسال رسالة تأكيد البريد الالكتروني حتى مرور",
|
||||
"email-confirm-email2": "دقائق",
|
||||
"allow-login-with": "السماح بتسجيل الدخول باستخدام",
|
||||
"allow-login-with.username-email": "اسم المستخدم أو البريد الالكتروني",
|
||||
"allow-login-with.username": "اسم المستخدم فقط",
|
||||
"allow-login-with.email": "البريد الالكتروني فقط",
|
||||
"account-settings": "إعدادت الحساب",
|
||||
"disable-username-changes": "عدم السماح بتغيير اسم المستخدم",
|
||||
"disable-email-changes": "عدم السماح بتغيير البريد الالكتروني",
|
||||
"disable-password-changes": "عدم السماح بتغيير كلمة المرور",
|
||||
"allow-account-deletion": "السماح بحذف الحساب",
|
||||
"user-info-private": "إخفاء قائمة المستخدم والبيانات عن الزوار",
|
||||
"hide-fullname": "إخفاء الإسم الكامل عن المستخدمين",
|
||||
"hide-email": "إخفاء البريد الإلكتروني عن المستخدمين",
|
||||
"themes": "القوالب",
|
||||
"disable-user-skins": "منع المستخدمين من اختيار سمة مخصص",
|
||||
"account-protection": "حماية الحساب",
|
||||
"admin-relogin-duration": "المدة حتى طلب إعادة تسجيل الدخول للإدارة (دقائق)",
|
||||
"admin-relogin-duration-help": "بعد مرور وقت معين، يتوجب إعادة تسجيل الدخول للوصول إلى قسم الإدارة، قم بتعيين القيمة الى 0 لتعطيل الخيار",
|
||||
"login-attempts": "عدد محاولات تسجيل الدخول في الساعة",
|
||||
"login-attempts-help": "إذا تجاوزت محاولات تسجيل الدخول لمستخدم معين العدد المحدد، فسوف يتم تأمين الحساب ومنعه من الدخول لمدة من الوقت",
|
||||
"lockout-duration": "مدة تأمين الحساب (دقائق)",
|
||||
"login-days": "عدد الأيام لتذكر جلسات تسجيل دخول المستخدم",
|
||||
"password-expiry-days": "فرض عملية تغيير كلمة المرور بعد مرور عدد محدد من الأيام",
|
||||
"registration": "تسجيل المستخدم",
|
||||
"registration-type": "نوع التسجيل",
|
||||
"registration-type.normal": "عادي",
|
||||
"registration-type.admin-approval": "بموافقة الإدارة",
|
||||
"registration-type.admin-approval-ip": "بموافقة الإدارة لعناوين IP",
|
||||
"registration-type.invite-only": "بالدعوات فقط",
|
||||
"registration-type.admin-invite-only": "بالدعوات من قبل الإدارة فقط",
|
||||
"registration-type.disabled": "لا يوجد تسجيل",
|
||||
"registration-type.help": "عادي - بإمكان المستخدمين التسجيل من خلال صفحة /التسجيل.<br/>\nبموافقة الإدارة - يتم وضع قائمة تسجيلات المستخدمين في <a href=\"%1/admin/manage/registration\">قائمة إنتظار موافقة</a> الإدارة.<br/>\nبموافقة الإدارة لعناوين IP - عادي بالنسبة للمستخدمين الجدد، ويتطلب موافقة الإدارة للتسجيل من عناوين IP تم التسجيل بإستخدامها مسبقاً.<br/>\nبالدعوات فقط - بإمكان المستخدمين إرسال دعوات من خلال صفحة <a href=\"%1/users\" target=\"_blank\">الأعضاء</a>.<br/>\nبالدعوات من قبل الإدارة فقط - فقط المراء بإمكانهم إرسال الدعوات من خلال صفحة <a href=\"%1/users\" target=\"_blank\">الأعضاء</a> و صفحات <a href=\"%1/admin/manage/users\">الإدارة/المشرفين/الأعضاء</a>.<br/>\nلا يوجد تسجيل - إغلاق خيار التسجيل بالكامل.<br/>",
|
||||
"registration.max-invites": "الحد الأقصى للدعوات لكل عضو",
|
||||
"max-invites": "الحد الأقصى للدعوات لكل عضو",
|
||||
"max-invites-help": "0 لعدم تحديد قيود، الإدارة تحصل على دعوات لامحدودة <br> هذا الخيار يعمل فقط عند تحديد خيار \"بالدعوات فقط\"",
|
||||
"invite-expiration": "مدة صلاحية الدعوة",
|
||||
"invite-expiration-help": "عدد الأيام حتى انتهاء صلاحية الدعوة.",
|
||||
"min-username-length": "الحد الأدنى لطول اسم المستخدم",
|
||||
"max-username-length": "الحد الأقصى لطول اسم المستخدم",
|
||||
"min-password-length": "الحد الأدنى لطول كلمة المرور",
|
||||
"min-password-strength": "الحد الأدنى لقوة كلمة المرور",
|
||||
"max-about-me-length": "الحد الأعلى من الأحرف في حقل \"عني\"",
|
||||
"terms-of-use": "شروط استخدام المنتدى <small>(تترك فارغة لتعطيلها)</small>",
|
||||
"user-search": "بحث الأعضاء",
|
||||
"user-search-results-per-page": "عدد النتائج المراد عرضها",
|
||||
"default-user-settings": "إعدادات الأعضاء الافتراضية",
|
||||
"show-email": "عرض البريد الإلكتروني",
|
||||
"show-fullname": "عرض الاسم الكامل",
|
||||
"restrict-chat": "السماح فقط برسائل الدردشة من المستخدمين الذين أتبعهم",
|
||||
"authentication": "Authentication",
|
||||
"allow-local-login": "Allow local login",
|
||||
"require-email-confirmation": "Require Email Confirmation",
|
||||
"email-confirm-interval": "User may not resend a confirmation email until",
|
||||
"email-confirm-email2": "minutes have elapsed",
|
||||
"allow-login-with": "Allow login with",
|
||||
"allow-login-with.username-email": "Username or Email",
|
||||
"allow-login-with.username": "Username Only",
|
||||
"allow-login-with.email": "Email Only",
|
||||
"account-settings": "Account Settings",
|
||||
"disable-username-changes": "Disable username changes",
|
||||
"disable-email-changes": "Disable email changes",
|
||||
"disable-password-changes": "Disable password changes",
|
||||
"allow-account-deletion": "Allow account deletion",
|
||||
"user-info-private": "Make user info private",
|
||||
"themes": "Themes",
|
||||
"disable-user-skins": "Prevent users from choosing a custom skin",
|
||||
"account-protection": "Account Protection",
|
||||
"login-attempts": "Login attempts per hour",
|
||||
"login-attempts-help": "If login attempts to a user's account exceeds this threshold, that account will be locked for a pre-configured amount of time",
|
||||
"lockout-duration": "Account Lockout Duration (minutes)",
|
||||
"login-days": "Days to remember user login sessions",
|
||||
"password-expiry-days": "Force password reset after a set number of days",
|
||||
"registration": "User Registration",
|
||||
"registration-type": "Registration Type",
|
||||
"registration-type.normal": "Normal",
|
||||
"registration-type.admin-approval": "Admin Approval",
|
||||
"registration-type.admin-approval-ip": "Admin Approval for IPs",
|
||||
"registration-type.invite-only": "Invite Only",
|
||||
"registration-type.admin-invite-only": "Admin Invite Only",
|
||||
"registration-type.disabled": "No registration",
|
||||
"registration-type.help": "Normal - Users can register from the /register page.<br/>\nAdmin Approval - User registrations are placed in an <a href=\"%1/admin/manage/registration\">approval queue</a> for administrators.<br/>\nAdmin Approval for IPs - Normal for new users, Admin Approval for IP addresses that already have an account.<br/>\nInvite Only - Users can invite others from the <a href=\"%1/users\" target=\"_blank\">users</a> page.<br/>\nAdmin Invite Only - Only administrators can invite others from <a href=\"%1/users\" target=\"_blank\">users</a> and <a href=\"%1/admin/manage/users\">admin/manage/users</a> pages.<br/>\nNo registration - No user registration.<br/>",
|
||||
"registration.max-invites": "Maximum Invitations per User",
|
||||
"max-invites": "Maximum Invitations per User",
|
||||
"max-invites-help": "0 for no restriction. Admins get infinite invitations<br>Only applicable for \"Invite Only\"",
|
||||
"min-username-length": "Minimum Username Length",
|
||||
"max-username-length": "Maximum Username Length",
|
||||
"min-password-length": "Minimum Password Length",
|
||||
"max-about-me-length": "Maximum About Me Length",
|
||||
"terms-of-use": "Forum Terms of Use <small>(Leave blank to disable)</small>",
|
||||
"user-search": "User Search",
|
||||
"user-search-results-per-page": "Number of results to display",
|
||||
"default-user-settings": "Default User Settings",
|
||||
"show-email": "Show email",
|
||||
"show-fullname": "Show fullname",
|
||||
"restrict-chat": "Only allow chat messages from users I follow",
|
||||
"outgoing-new-tab": "Open outgoing links in new tab",
|
||||
"topic-search": "Enable In-Topic Searching",
|
||||
"digest-freq": "Subscribe to Digest",
|
||||
|
||||
@@ -1,20 +1,20 @@
|
||||
{
|
||||
"category": "قسم",
|
||||
"subcategories": "قسم فرعي",
|
||||
"category": "فئة",
|
||||
"subcategories": "فئة فرعية",
|
||||
"new_topic_button": "موضوع جديد",
|
||||
"guest-login-post": "سجل الدخول للمشاركة",
|
||||
"no_topics": "<strong>لا توجد مواضيع في هذه القسم</strong>لم لا تحاول إنشاء موضوع؟<br />",
|
||||
"guest-login-post": "سجل بالدخول للرد",
|
||||
"no_topics": "<strong>لا توجد مواضيع في هذه الفئة</strong>لم لا تحاول إنشاء موضوع؟<br />",
|
||||
"browsing": "تصفح",
|
||||
"no_replies": "لم يرد أحد",
|
||||
"no_new_posts": "لا توجد مشاركات جديدة.",
|
||||
"share_this_category": "شارك هذا القسم",
|
||||
"share_this_category": "انشر هذه الفئة",
|
||||
"watch": "تابع",
|
||||
"ignore": "تجاهل",
|
||||
"watching": "متابع",
|
||||
"ignoring": "متجاهل",
|
||||
"watching.description": "أظهر المواضيع في غير مقروء",
|
||||
"ignoring.description": "لا تظهر المواضيع في غير مقروء",
|
||||
"watch.message": "أنت الآن تتابع التحديثات من هذا القسم وجميع الأقسام الفرعية",
|
||||
"ignore.message": "أنت الآن تتجاهل التحديثات من هذا القسم وجميع الأقسام الفرعية",
|
||||
"watched-categories": "الأقسام المُتابعة"
|
||||
"watch.message": "You are now watching updates from this category and all subcategories",
|
||||
"ignore.message": "You are now ignoring updates from this category and all subcategories",
|
||||
"watched-categories": "الفئات المتابعة"
|
||||
}
|
||||
@@ -30,12 +30,7 @@
|
||||
"notif.chat.unsub.info": "تم إرسال هذا الإشعار بوجودة محادثة جديدة وفقا لخيارات تسجيلك.",
|
||||
"notif.post.cta": "انقر هنا لقراءة الموضوع بأكمله",
|
||||
"notif.post.unsub.info": "تم إشعارك بهذه المشاركة بناءً على الخيارات التي سبق وأن حددتها.",
|
||||
"notif.cta": "Click here to go to forum",
|
||||
"test.text1": "هذه رسالة تجريبية للتأكد من صحة إعدادت الرسائل الإلكترونية في منتدى NodeBB خاصتك.",
|
||||
"unsub.cta": "انقر هنا لتغيير تلك الإعدادات",
|
||||
"banned.subject": "You have been banned from %1",
|
||||
"banned.text1": "The user %1 has been banned from %2.",
|
||||
"banned.text2": "This ban will last until %1.",
|
||||
"banned.text3": "This is the reason why you have been banned:",
|
||||
"closing": "شكرًا لك!"
|
||||
}
|
||||
@@ -1,23 +1,19 @@
|
||||
{
|
||||
"invalid-data": "بيانات غير صحيحة",
|
||||
"invalid-json": "Invalid JSON",
|
||||
"not-logged-in": "لم تقم بتسجيل الدخول",
|
||||
"account-locked": "تم حظر حسابك مؤقتًا.",
|
||||
"search-requires-login": "البحث في المنتدى يتطلب حساب - الرجاء تسجيل الدخول أو التسجيل",
|
||||
"goback": "Press back to return to the previous page",
|
||||
"invalid-cid": "قائمة غير موجودة",
|
||||
"invalid-tid": "موضوع غير متواجد",
|
||||
"invalid-pid": "رد غير موجود",
|
||||
"invalid-uid": "مستخدم غير موجود",
|
||||
"invalid-username": "اسم المستخدم غير مقبول",
|
||||
"invalid-email": "البريد الاكتروني غير مقبول",
|
||||
"invalid-title": "Invalid title",
|
||||
"invalid-title": "عنوان غير صحيح",
|
||||
"invalid-user-data": "بيانات المستخدم غير صحيحة",
|
||||
"invalid-password": "كلمة السر غير مقبولة",
|
||||
"invalid-login-credentials": "Invalid login credentials",
|
||||
"invalid-username-or-password": "المرجود تحديد اسم مستخدم و كلمة مرور",
|
||||
"invalid-search-term": "كلمة البحث غير صحيحة",
|
||||
"invalid-url": "Invalid URL",
|
||||
"csrf-invalid": "لم تتمكن من تسجيل الدخول. هنالك أحتمال ان جلستك انتهت. رجاءًا حاول مرة اخرى.",
|
||||
"invalid-pagination-value": "رقم الصفحة غير صحيح ، يجب أن يكون بين %1 و %2 .",
|
||||
"username-taken": "اسم المستخدم مأخوذ",
|
||||
@@ -34,7 +30,6 @@
|
||||
"password-too-long": "كلمة السر طويلة ",
|
||||
"user-banned": "المستخدم محظور",
|
||||
"user-banned-reason": "Sorry, this account has been banned (Reason: %1)",
|
||||
"user-banned-reason-until": "Sorry, this account has been banned until %1 (Reason: %2)",
|
||||
"user-too-new": "عذرا, يجب أن تنتظر 1% ثواني قبل قيامك بأول مشاركة",
|
||||
"blacklisted-ip": "نأسف، لقد تم حظرك من استخدام وتصفح المنتدى. إذا كنت تعتقد أن هذا خطأ رجاءًا اتصل بالإدارة. ",
|
||||
"ban-expiry-missing": "رجاءًا ضع تاريخ نهاية الحظر. ",
|
||||
@@ -82,7 +77,6 @@
|
||||
"cant-ban-other-admins": "لايمكن حظر مدبر نظام آخر.",
|
||||
"cant-remove-last-admin": "رجاءًا ، أضف مدير أخر قبل حذف صلاحيات الإدارة من حسابك.",
|
||||
"cant-delete-admin": "رجاءًا أزل صلاحيات الإدارة قبل حذف الحساب. ",
|
||||
"invalid-image": "Invalid image",
|
||||
"invalid-image-type": "نوع الصورة غير مدعوم. الأنواع المدعومة هي : %1",
|
||||
"invalid-image-extension": "امتداد الصورة غير مدعوم.",
|
||||
"invalid-file-type": "صيغة الملف غير مدعومة. الأنواع المدعومة هي: %1",
|
||||
@@ -110,28 +104,21 @@
|
||||
"chat-disabled": "نظام المحادثة معطل.",
|
||||
"too-many-messages": "لقد أرسلت الكثير من الرسائل، الرجاء اﻹنتظار قليلاً",
|
||||
"invalid-chat-message": "الرسالة غير صالحة.",
|
||||
"chat-message-too-long": "Chat messages can not be longer than %1 characters.",
|
||||
"chat-message-too-long": "الرسالة طويلة.",
|
||||
"cant-edit-chat-message": "غير مصرح لك بتعديل الرسالة.",
|
||||
"cant-remove-last-user": "لأيمكنك إزالت اخر مستخدم.",
|
||||
"cant-delete-chat-message": "غير مصرح لك بحذف الرسالة.",
|
||||
"chat-edit-duration-expired": "You are only allowed to edit chat messages for %1 second(s) after posting",
|
||||
"chat-delete-duration-expired": "You are only allowed to delete chat messages for %1 second(s) after posting",
|
||||
"already-voting-for-this-post": "لقد شاركت بالتصويت ، ألا تذكر؟",
|
||||
"reputation-system-disabled": "نظام السمعة معطل",
|
||||
"downvoting-disabled": "التصويتات السلبية معطلة",
|
||||
"not-enough-reputation-to-downvote": "ليس لديك سمعة تكفي لإضافة صوت سلبي لهذا الموضوع",
|
||||
"not-enough-reputation-to-flag": "ليس لديك سمعة تكفي للإشعار بموضوع مخل",
|
||||
"not-enough-reputation-min-rep-website": "You do not have enough reputation to add a website",
|
||||
"not-enough-reputation-min-rep-aboutme": "You do not have enough reputation to add an about me",
|
||||
"not-enough-reputation-min-rep-signature": "You do not have enough reputation to add a signature",
|
||||
"already-flagged": "لقد بلغت عن هذه المشاركة من قبل.",
|
||||
"self-vote": "You cannot vote on your own post",
|
||||
"reload-failed": "المنتدى واجه مشكلة أثناء إعادة التحميل: \"%1\". سيواصل المنتدى خدمة العملاء السابقين لكن يجب عليك إلغاء أي تغيير قمت به قبل إعادة التحميل.",
|
||||
"registration-error": "حدث خطأ أثناء التسجيل",
|
||||
"parse-error": "حدث خطأ ما أثناء تحليل استجابة الخادم",
|
||||
"wrong-login-type-email": "الرجاء استعمال بريدك اﻹلكتروني للدخول",
|
||||
"wrong-login-type-username": "الرجاء استعمال اسم المستخدم الخاص بك للدخول",
|
||||
"sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first",
|
||||
"invite-maximum-met": "لقد قمت بدعوة الحد الأقصى من الأشخاص (%1 من %2)",
|
||||
"no-session-found": "لم دخول مسجل!",
|
||||
"not-in-room": "المستخدم غير موجود في الغرفة.",
|
||||
@@ -140,6 +127,5 @@
|
||||
"no-users-selected": "لا يوجد مستخدم محدد.",
|
||||
"invalid-home-page-route": "Invalid home page route",
|
||||
"invalid-session": "Session Mismatch",
|
||||
"invalid-session-text": "يبدو أن فترة التسجيل لم تعد قائمة او هي غير مطابقة مع الخادم. يرجى إعادة تحميل هذه الصفحة.",
|
||||
"no-topics-selected": "No topics selected!"
|
||||
"invalid-session-text": "يبدو أن فترة التسجيل لم تعد قائمة او هي غير مطابقة مع الخادم. يرجى إعادة تحميل هذه الصفحة."
|
||||
}
|
||||
@@ -1,64 +0,0 @@
|
||||
{
|
||||
"state": "State",
|
||||
"reporter": "Reporter",
|
||||
"reported-at": "Reported At",
|
||||
"description": "Description",
|
||||
"no-flags": "Hooray! No flags found.",
|
||||
"assignee": "Assignee",
|
||||
"update": "Update",
|
||||
"updated": "Updated",
|
||||
"target-purged": "The content this flag referred to has been purged and is no longer available.",
|
||||
|
||||
"quick-filters": "Quick Filters",
|
||||
"filter-active": "There are one or more filters active in this list of flags",
|
||||
"filter-reset": "Remove Filters",
|
||||
"filters": "Filter Options",
|
||||
"filter-reporterId": "Reporter UID",
|
||||
"filter-targetUid": "Flagged UID",
|
||||
"filter-type": "Flag Type",
|
||||
"filter-type-all": "All Content",
|
||||
"filter-type-post": "Post",
|
||||
"filter-state": "State",
|
||||
"filter-assignee": "Assignee UID",
|
||||
"filter-cid": "Category",
|
||||
"filter-quick-mine": "Assigned to me",
|
||||
"filter-cid-all": "All categories",
|
||||
"apply-filters": "Apply Filters",
|
||||
|
||||
"quick-links": "Quick Links",
|
||||
"flagged-user": "Flagged User",
|
||||
"view-profile": "View Profile",
|
||||
"start-new-chat": "Start New Chat",
|
||||
"go-to-target": "View Flag Target",
|
||||
|
||||
"user-view": "View Profile",
|
||||
"user-edit": "Edit Profile",
|
||||
|
||||
"notes": "Flag Notes",
|
||||
"add-note": "Add Note",
|
||||
"no-notes": "No shared notes.",
|
||||
|
||||
"history": "Flag History",
|
||||
"back": "Back to Flags List",
|
||||
"no-history": "No flag history.",
|
||||
|
||||
"state-all": "All states",
|
||||
"state-open": "New/Open",
|
||||
"state-wip": "Work in Progress",
|
||||
"state-resolved": "Resolved",
|
||||
"state-rejected": "Rejected",
|
||||
"no-assignee": "Not Assigned",
|
||||
"note-added": "Note Added",
|
||||
|
||||
"modal-title": "Report Inappropriate Content",
|
||||
"modal-body": "Please specify your reason for flagging %1 %2 for review. Alternatively, use one of the quick report buttons if applicable.",
|
||||
"modal-reason-spam": "Spam",
|
||||
"modal-reason-offensive": "Offensive",
|
||||
"modal-reason-other": "Other (specify below)",
|
||||
"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."
|
||||
}
|
||||
@@ -4,7 +4,7 @@
|
||||
"buttons.close": "أغلق",
|
||||
"403.title": "غير مسموح بالدخول",
|
||||
"403.message": "يبدو أنك قد تعثرت على صفحة لا تمتلك الصلاحية للدخول إليها",
|
||||
"403.login": "ربما يجب عليك <a href='%1/login'>تسجل دخولك</a>.",
|
||||
"403.login": "حاول أن <a href='%1/login'>تسجل دخولك</a>.",
|
||||
"404.title": "لم يتم العثور",
|
||||
"404.message": "الصفحة غير موجودة. العودة لـ <a href='%1/'>الرئيسية</a>",
|
||||
"500.title": "خطأ داخلي",
|
||||
@@ -13,19 +13,19 @@
|
||||
"400.message": "الرابط غير صحيح. رجاءًا تأكد من الرابط أو ارجع لـ <a href='%1/'>الرئيسية</a>",
|
||||
"register": "تسجيل",
|
||||
"login": "دخول",
|
||||
"please_log_in": "الرجاء تسجيل الدخول",
|
||||
"please_log_in": "المرجو تسجيل الدخول",
|
||||
"logout": "تسجيل الخروج",
|
||||
"posting_restriction_info": "إضافة مشاركات جديد حكر على الأعضاء المسجلين، انقر هنا لتسجيل الدخول.",
|
||||
"welcome_back": "مرحبًا بعودتك",
|
||||
"you_have_successfully_logged_in": "تم سجيل الدخول بنجاح",
|
||||
"save_changes": "حفظ التغييرات",
|
||||
"save": "حفظ",
|
||||
"save": "Save",
|
||||
"close": "أغلق",
|
||||
"pagination": "الصفحات",
|
||||
"pagination.out_of": "%1 من %2",
|
||||
"pagination.enter_index": "أدخل الرقم التسلسلي",
|
||||
"header.admin": "مدير النظام",
|
||||
"header.categories": "الأقسام",
|
||||
"header.admin": "مدبر نظام",
|
||||
"header.categories": "الفئات",
|
||||
"header.recent": "حديث",
|
||||
"header.unread": "غير مقروء",
|
||||
"header.tags": "وسم",
|
||||
@@ -37,9 +37,9 @@
|
||||
"header.search": "بحث",
|
||||
"header.profile": "ملف",
|
||||
"header.navigation": "الاستكشاف",
|
||||
"notifications.loading": "تحميل التنبيهات",
|
||||
"notifications.loading": "تحميل التبليغات",
|
||||
"chats.loading": "تحميل الدردشات",
|
||||
"motd.welcome": "مرحبا بكم في NodeBB، منصة المناقشة المستقبلية.",
|
||||
"motd.welcome": "مرحبا بكم NodeBB، منصة مناقشة المستقبل",
|
||||
"previouspage": "الصفحة السابقة",
|
||||
"nextpage": "الصفحة التالية",
|
||||
"alert.success": "نجاح",
|
||||
@@ -53,7 +53,6 @@
|
||||
"topics": "المواضيع",
|
||||
"posts": "المشاركات",
|
||||
"best": "الأفضل",
|
||||
"votes": "Votes",
|
||||
"upvoters": "الموافقين",
|
||||
"upvoted": "مصوت بالموجب",
|
||||
"downvoters": "مصوتين بالسالب",
|
||||
@@ -76,7 +75,7 @@
|
||||
"norecenttopics": "لاوجود لمواضيع جديدة",
|
||||
"recentposts": "آخر المشاركات",
|
||||
"recentips": "آخر عناوين ال IP التي سجلت الدخول",
|
||||
"moderator_tools": "أدوات المشرف",
|
||||
"moderator_tools": "Moderator Tools",
|
||||
"away": "غير متواجد",
|
||||
"dnd": "عدم الإزعاج",
|
||||
"invisible": "مخفي",
|
||||
@@ -86,7 +85,7 @@
|
||||
"guest": "زائر",
|
||||
"guests": "الزوار",
|
||||
"updated.title": "تم تحديث المنتدى",
|
||||
"updated.message": "لقد تم تحديث المنتدى إلى آخر نسخة للتو. إضغط هنا لإعادة تحميل الصفحة.",
|
||||
"updated.message": "لقد تم تحديث المنتدى إلى آخر نسخة للتو. المرجو إعادة تحميل الصفحة.",
|
||||
"privacy": "الخصوصية",
|
||||
"follow": "متابعة",
|
||||
"unfollow": "إلغاء المتابعة",
|
||||
@@ -98,13 +97,11 @@
|
||||
"upload_file": "ارفع ملف",
|
||||
"upload": "ارفع",
|
||||
"allowed-file-types": "صيغ الملفات المدعومة هي 1%",
|
||||
"unsaved-changes": "لديك تغييرات لم تحفظ. هل أنت متأكد من رغبتك بمغادرة الصفحة؟",
|
||||
"unsaved-changes": "لديك تغييرات لم تحفظ. هل أنت متأكد من تغيير الصفحة؟",
|
||||
"reconnecting-message": "يبدو أن اتصالك لـ %1 قد فقد. رجاءًا أنتظر ثم حاول الإتصال مرة اخرى.",
|
||||
"play": "تشغيل",
|
||||
"cookies.message": "هذا الموقع يستخدم ملفات تعريف الارتباط لضمان حصولك على أفضل تجربة على موقعنا.",
|
||||
"cookies.accept": "فهمت الأمر!",
|
||||
"cookies.learn_more": "أعرف المزيد",
|
||||
"edited": "حُرِر",
|
||||
"disabled": "معطل",
|
||||
"select": "تحديد"
|
||||
"play": "Play",
|
||||
"cookies.message": "This website uses cookies to ensure you get the best experience on our website.",
|
||||
"cookies.accept": "Got it!",
|
||||
"cookies.learn_more": "Learn More",
|
||||
"edited": "Edited"
|
||||
}
|
||||
@@ -5,8 +5,8 @@
|
||||
"remember_me": "تذكرني؟",
|
||||
"forgot_password": "نسيت كلمة المرور؟",
|
||||
"alternative_logins": "تسجيلات الدخول البديلة",
|
||||
"failed_login_attempt": "تسجيل الدخول غير ناجح",
|
||||
"failed_login_attempt": "Login Unsuccessful",
|
||||
"login_successful": "قمت بتسجيل الدخول بنجاح!",
|
||||
"dont_have_account": "لا تملك حساب؟",
|
||||
"logged-out-due-to-inactivity": "لقد تم تسجيل خروجك من لوحة تحكم بسبب عدم نشاطك"
|
||||
"logged-out-due-to-inactivity": "You have been logged out of the Admin Control Panel due to inactivity"
|
||||
}
|
||||
@@ -20,7 +20,6 @@
|
||||
"chat.three_months": "3 أشهر",
|
||||
"chat.delete_message_confirm": "هل أنت متأكد من أنك تريد حذف هذه الرسالة؟",
|
||||
"chat.add-users-to-room": "Add users to room",
|
||||
"chat.confirm-chat-with-dnd-user": "This user has set their status to DnD(Do not disturb). Do you still want to chat with them?",
|
||||
"composer.compose": "اكتب",
|
||||
"composer.show_preview": "عرض المعاينة",
|
||||
"composer.hide_preview": "إخفاء المعاينة",
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
"continue_to": "استمر إلى %1",
|
||||
"return_to": "عودة إى %1",
|
||||
"new_notification": "تنبيه جديد",
|
||||
"new_notification_from": "You have a new Notification from %1",
|
||||
"you_have_unread_notifications": "لديك تنبيهات غير مقروءة.",
|
||||
"all": "All",
|
||||
"topics": "Topics",
|
||||
@@ -42,23 +41,8 @@
|
||||
"new_register": "<strong>%1</strong> sent a registration request.",
|
||||
"new_register_multiple": "There are <strong>%1</strong> registration requests awaiting review.",
|
||||
"flag_assigned_to_you": "<strong>Flag %1</strong> has been assigned to you",
|
||||
"post_awaiting_review": "Post awaiting review",
|
||||
"email-confirmed": "تم التحقق من عنوان البريد الإلكتروني",
|
||||
"email-confirmed-message": "شكرًا على إثبات صحة عنوان بريدك الإلكتروني. صار حسابك مفعلًا بالكامل.",
|
||||
"email-confirm-error-message": "حدث خطأ أثناء التحقق من عنوان بريدك الإلكتروني. ربما رمز التفعيل خاطئ أو انتهت صلاحيته.",
|
||||
"email-confirm-sent": "تم إرسال بريد التفعيل.",
|
||||
"none": "None",
|
||||
"notification_only": "Notification Only",
|
||||
"email_only": "Email Only",
|
||||
"notification_and_email": "Notification & Email",
|
||||
"notificationType_upvote": "When someone upvotes your post",
|
||||
"notificationType_new-topic": "When someone you follow posts a topic",
|
||||
"notificationType_new-reply": "When a new reply is posted in a topic you are watching",
|
||||
"notificationType_follow": "When someone starts following you",
|
||||
"notificationType_new-chat": "When you receive a chat message",
|
||||
"notificationType_group-invite": "When you receive a group invite",
|
||||
"notificationType_new-register": "When someone gets added to registration queue",
|
||||
"notificationType_post-queue": "When a new post is queued",
|
||||
"notificationType_new-post-flag": "When a post is flagged",
|
||||
"notificationType_new-user-flag": "When a user is flagged"
|
||||
"email-confirm-sent": "تم إرسال بريد التفعيل."
|
||||
}
|
||||
@@ -6,11 +6,8 @@
|
||||
"popular-month": "المواضيع الشائعة هذا الشهر",
|
||||
"popular-alltime": "المواضيع الشائعة منذ القدم",
|
||||
"recent": "المواضيع الحديثة",
|
||||
"top": "Top Voted Topics",
|
||||
"moderator-tools": "Moderator Tools",
|
||||
"flagged-content": "Flagged Content",
|
||||
"ip-blacklist": "IP Blacklist",
|
||||
"post-queue": "Post Queue",
|
||||
"users/online": "اﻷعضاء المتصلون",
|
||||
"users/latest": "أحدث اﻷعضاء",
|
||||
"users/sort-posts": "الأعضاء الأكثر نشاطاً",
|
||||
@@ -20,7 +17,7 @@
|
||||
"users/search": "بحث عن مستخدم",
|
||||
"notifications": "التنبيهات",
|
||||
"tags": "الكلمات الدلالية",
|
||||
"tag": "Topics tagged under "%1"",
|
||||
"tag": "المواضيع المرتبطة بالوسم %1",
|
||||
"register": "تسجيل حساب",
|
||||
"registration-complete": "Registration complete",
|
||||
"login": "سجل الدخول الى حسابك",
|
||||
@@ -45,7 +42,6 @@
|
||||
"account/bookmarks": "%1's Bookmarked Posts",
|
||||
"account/settings": "خيارات المستخدم",
|
||||
"account/watched": "Topics watched by %1",
|
||||
"account/ignored": "Topics ignored by %1",
|
||||
"account/upvoted": "Posts upvoted by %1",
|
||||
"account/downvoted": "Posts downvoted by %1",
|
||||
"account/best": "Best posts made by %1",
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
"register": "تسجيل",
|
||||
"cancel_registration": "إلغاء التسجيل",
|
||||
"help.email": "افتراضيا، سيتم إخفاء بريدك الإلكتروني من العامة.",
|
||||
"help.username_restrictions": "اسم مستخدم فريدة من نوعها بين 1% و 2% حرفا. بإمكان الآخرين مناداتك بـ @<span id='yourUsername'>اسم المستخدم</span>.",
|
||||
"help.minimum_password_length": "كلمة المرور يجب أن تتكون على الأقل من 1% أحرف/حروف",
|
||||
"help.username_restrictions": "اسم مستخدم فريدة من نوعها بين1% و2% حرفا. يمكن للآخرين ذكرك @ <'span id='your-username> اسم المستخدم </span>.",
|
||||
"help.minimum_password_length": "كلمة المرور يجب أن تكون على الأقل بها 1% أحرف",
|
||||
"email_address": "عنوان البريد الإلكتروني",
|
||||
"email_address_placeholder": "ادخل عنوان البريد الإلكتروني",
|
||||
"username": "اسم المستخدم",
|
||||
@@ -16,8 +16,8 @@
|
||||
"alternative_registration": "طريقة تسجيل بديلة",
|
||||
"terms_of_use": "شروط الاستخدام",
|
||||
"agree_to_terms_of_use": "أوافق على شروط الاستخدام",
|
||||
"terms_of_use_error": "يجب عليك الموافقة على شروط الاستخدام",
|
||||
"registration-added-to-queue": "تمت إضافتك في قائمة الإنتضار. ستتلقى رسالة إلكترونية عند الموافقة على تسجيلك من قبل الإدارة.",
|
||||
"interstitial.intro": "نحتاج إلى بعض المعلومات الإضافية قبل أن نتمكن من إنشاء حسابك.",
|
||||
"interstitial.errors-found": "تعذر علينا إتمام عملية التسجيل:"
|
||||
"terms_of_use_error": "You must agree to the Terms of Use",
|
||||
"registration-added-to-queue": "Your registration has been added to the approval queue. You will receive an email when it is accepted by an administrator.",
|
||||
"interstitial.intro": "We require some additional information before we can create your account.",
|
||||
"interstitial.errors-found": "We could not complete your registration:"
|
||||
}
|
||||
@@ -1,7 +1,6 @@
|
||||
{
|
||||
"success": "نجاح",
|
||||
"topic-post": "لقد تمت الإضافة بنجاح.",
|
||||
"post-queued": "Your post is queued for approval.",
|
||||
"authentication-successful": "تم تسجيل الدخول بنجاح",
|
||||
"settings-saved": "تم حفظ التغييرات!"
|
||||
}
|
||||
@@ -14,7 +14,6 @@
|
||||
"quote": "اقتبس",
|
||||
"reply": "رد",
|
||||
"replies_to_this_post": "%1 Replies",
|
||||
"one_reply_to_this_post": "1 Reply",
|
||||
"last_reply_time": "Last reply",
|
||||
"reply-as-topic": "رد بموضوع",
|
||||
"guest-login-reply": "يجب عليك تسجيل الدخول للرد",
|
||||
@@ -52,14 +51,13 @@
|
||||
"not-watching.description": "Do not notify me of new replies.<br/>Show topic in unread if category is not ignored.",
|
||||
"ignoring.description": "Do not notify me of new replies.<br/>Do not show topic in unread.",
|
||||
"thread_tools.title": "أدوات الموضوع",
|
||||
"thread_tools.markAsUnreadForAll": "Mark Unread For All",
|
||||
"thread_tools.markAsUnreadForAll": "Mark unread for all",
|
||||
"thread_tools.pin": "علق الموضوع",
|
||||
"thread_tools.unpin": "إلغاء تعليق الموضوع",
|
||||
"thread_tools.lock": "أقفل الموضوع",
|
||||
"thread_tools.unlock": "إلغاء إقفال الموضوع",
|
||||
"thread_tools.move": "نقل الموضوع",
|
||||
"thread_tools.move_all": "نقل الكل",
|
||||
"thread_tools.select_category": "Select Category",
|
||||
"thread_tools.fork": "إنشاء فرع الموضوع",
|
||||
"thread_tools.delete": "حذف الموضوع",
|
||||
"thread_tools.delete-posts": "مشاركات محذوفة",
|
||||
@@ -68,13 +66,12 @@
|
||||
"thread_tools.restore_confirm": "هل أنت متأكد أنك تريد استعادة هذا الموضوع؟",
|
||||
"thread_tools.purge": "تطهير الموضوع",
|
||||
"thread_tools.purge_confirm": "هل أنت متأكد أنك تريد تطهير هذا الموضوع؟",
|
||||
"thread_tools.merge_topics": "Merge Topics",
|
||||
"thread_tools.merge": "Merge",
|
||||
"topic_move_success": "تم نقل هذا الموضوع إلى %1 بنجاح",
|
||||
"post_delete_confirm": "هل أنت متأكد أنك تريد حذف هذه المشاركة؟",
|
||||
"post_restore_confirm": "هل أنت متأكد أنك تريد استعادة هذه المشاركة؟",
|
||||
"post_purge_confirm": "هل أنت متأكد أنك تريد تطهير هذه المشاركة؟",
|
||||
"load_categories": "تحميل الفئات",
|
||||
"disabled_categories_note": "الفئات المعطلة رمادية",
|
||||
"confirm_move": "انقل",
|
||||
"confirm_fork": "فرع",
|
||||
"bookmark": "Bookmark",
|
||||
@@ -86,12 +83,12 @@
|
||||
"move_post": "نقل المشاركة",
|
||||
"post_moved": "تم نقل المشاركة",
|
||||
"fork_topic": "فرع الموضوع",
|
||||
"topic_will_be_moved_to": "هذا الموضوع سوف ينقل إلى فئة",
|
||||
"fork_topic_instruction": "إضغط على المشاركات التي تريد تفريعها",
|
||||
"fork_no_pids": "لم تختر أي مشاركة",
|
||||
"fork_pid_count": "1% مشاركة محددة",
|
||||
"fork_success": "تم إنشاء فرع للموضوع بنجاح! إضغط هنا لمعاينة الفرع.",
|
||||
"delete_posts_instruction": "Click the posts you want to delete/purge",
|
||||
"merge_topics_instruction": "Click the topics you want to merge",
|
||||
"composer.title_placeholder": "أدخل عنوان موضوعك هنا...",
|
||||
"composer.handle_placeholder": "اﻹسم",
|
||||
"composer.discard": "نبذ التغييرات",
|
||||
|
||||
@@ -9,7 +9,5 @@
|
||||
"topics_marked_as_read.success": "تم تحديد المواضيع على أنها مقروءة!",
|
||||
"all-topics": "كل المواضيع",
|
||||
"new-topics": "مواضيع جديدة",
|
||||
"watched-topics": "المواضيع المتابعة",
|
||||
"unreplied-topics": "Unreplied Topics",
|
||||
"multiple-categories-selected": "Multiple Selected"
|
||||
"watched-topics": "المواضيع المتابعة"
|
||||
}
|
||||
@@ -7,13 +7,13 @@
|
||||
"email": "البريد الإلكتروني",
|
||||
"confirm_email": "تأكيد عنوان البريد الإلكتروني",
|
||||
"account_info": "معلومات الحساب",
|
||||
"ban_account": "حظر الحساب",
|
||||
"ban_account": "Ban Account",
|
||||
"ban_account_confirm": "هل تريد حقاً حظر هاذا العضو؟",
|
||||
"unban_account": "إزالة حظر الحساب",
|
||||
"unban_account": "Unban Account",
|
||||
"delete_account": "حذف الحساب",
|
||||
"delete_account_confirm": "هل أن متأكد أنك تريد حذف حسابك؟<br /><strong> هذه العملية غير قابلة للإلغاء ولن يكون بالإمكان استعادة بياناتك</strong><br /><br />أدخل اسم المستخدم الخاص بك لتأكيد عملية الحذف",
|
||||
"delete_this_account_confirm": "هل انت متأكد من رغبتك بحذف هذا الحساب؟ <br /> <strong>هذا الإجراء لا رجعة فيه ولن تتمكن من استرداد أي بيانات</strong><br /><br />",
|
||||
"account-deleted": "تم حذف الحساب",
|
||||
"delete_this_account_confirm": "Are you sure you want to delete this account? <br /><strong>This action is irreversible and you will not be able to recover any data</strong><br /><br />",
|
||||
"account-deleted": "Account deleted",
|
||||
"fullname": "الاسم الكامل",
|
||||
"website": "الموقع الإلكتروني",
|
||||
"location": "الموقع",
|
||||
@@ -25,15 +25,14 @@
|
||||
"reputation": "السمعة",
|
||||
"bookmarks": "Bookmarks",
|
||||
"watched": "متابع",
|
||||
"ignored": "تم تجاهله",
|
||||
"followers": "المتابعون",
|
||||
"following": "يتابع",
|
||||
"aboutme": "معلومة عنك او السيرة الذاتية",
|
||||
"signature": "توقيع",
|
||||
"birthday": "عيد ميلاد",
|
||||
"chat": "محادثة",
|
||||
"chat_with": "متابعة الدردشة مع %1",
|
||||
"new_chat_with": "بدء دردشة جديدة مع %1",
|
||||
"chat_with": "Continue chat with %1",
|
||||
"new_chat_with": "Start new chat with %1",
|
||||
"flag-profile": "Flag Profile",
|
||||
"follow": "تابع",
|
||||
"unfollow": "إلغاء المتابعة",
|
||||
@@ -44,7 +43,7 @@
|
||||
"change_email": "تغيير البريد اﻹلكتروني",
|
||||
"edit": "تعديل",
|
||||
"edit-profile": "تعديل الملف الشخصي",
|
||||
"default_picture": "أيقونة افتراضية",
|
||||
"default_picture": "Default Icon",
|
||||
"uploaded_picture": "الصورة المرفوعة",
|
||||
"upload_new_picture": "رفع صورة جديدة",
|
||||
"upload_new_picture_from_url": "رفع صورة جديدة من رابط",
|
||||
@@ -58,17 +57,16 @@
|
||||
"change_password_success": "تم تحديث كلمة السر خاصتك.",
|
||||
"confirm_password": "تأكيد كلمة السر",
|
||||
"password": "كلمة السر",
|
||||
"username_taken_workaround": "اسم المستخدم الذي اخترته مستخدم سابقا، لذلك قمنا بتغييره لك قليلا. أنت الآن مسجل بالاسم <strong>%1</strong>",
|
||||
"password_same_as_username": "كلمة المرور مطابقة لاسم المستخدم الخاص بك، يرجى تحديد كلمة مرور أخرى.",
|
||||
"password_same_as_email": "كلمة المرور مطابقة لبريدك الإلكتروني، يرجى تحديد كلمة مرور أخرى.",
|
||||
"weak_password": "كلمة مرور ضعيفة.",
|
||||
"username_taken_workaround": "اسم المستخدم الذي اخترته سبق أخذه، لذا تم تغييره قليلا. أن الآن مسجل تحت الاسم <strong>%1</strong>",
|
||||
"password_same_as_username": "Your password is the same as your username, please select another password.",
|
||||
"password_same_as_email": "Your password is the same as your email, please select another password.",
|
||||
"upload_picture": "ارفع الصورة",
|
||||
"upload_a_picture": "رفع صورة",
|
||||
"remove_uploaded_picture": "إزالة الصورة المرفوعة",
|
||||
"upload_cover_picture": "رفع صورة الغلاف",
|
||||
"remove_cover_picture_confirm": "هل تريد بالتأكيد إزالة صورة الغلاف؟",
|
||||
"crop_picture": "إقتصاص الصورة",
|
||||
"upload_cropped_picture": "إقتصاص ورفع",
|
||||
"remove_uploaded_picture": "Remove Uploaded Picture",
|
||||
"upload_cover_picture": "Upload cover picture",
|
||||
"remove_cover_picture_confirm": "Are you sure you want to remove the cover picture?",
|
||||
"crop_picture": "Crop picture",
|
||||
"upload_cropped_picture": "Crop and upload",
|
||||
"settings": "خيارات",
|
||||
"show_email": "أظهر بريدي الإلكتروني",
|
||||
"show_fullname": "أظهر اسمي الكامل",
|
||||
@@ -79,67 +77,59 @@
|
||||
"digest_daily": "يوميا",
|
||||
"digest_weekly": "أسبوعيًّا",
|
||||
"digest_monthly": "شهريًّا",
|
||||
"send_chat_notifications": "استلام رسالة إلكترونية عند ورود محادثة وأنا غير متصل.",
|
||||
"send_post_notifications": "Send an email when replies are made to topics I am subscribed to",
|
||||
"settings-require-reload": "تغيير بعض اﻹعدادات يتطلب تحديث الصفحة. إضغط هنا لتحديث الصفحة",
|
||||
"has_no_follower": "هذا المستخدم ليس لديه أية متابعين :(",
|
||||
"has_no_follower": "هذا المستخدم ليس لديه أي متابع :(",
|
||||
"follows_no_one": "هذا المستخدم لا يتابع أحد :(",
|
||||
"has_no_posts": "هذا المستخدم لم يشارك حتى الآن.",
|
||||
"has_no_topics": "هذا المستخدم لم يكتب أي موضوع حتى الآن.",
|
||||
"has_no_watched_topics": "هذا المستخدم لم يقم بمراقبة اية مواضيع حتى الآن.",
|
||||
"has_no_ignored_topics": "هذا المستخدم لم يقم بتجاهل اية مواضيع حتى الآن.",
|
||||
"has_no_upvoted_posts": "هذا المستخدم لم يقم بالتصويت للأعلى لأي مشاركة حتى الآن.",
|
||||
"has_no_downvoted_posts": "هذا المستخدم لم يقم بالتصويت للأسفل لأي مشاركة حتى الآن.",
|
||||
"has_no_voted_posts": "هذا المستخدم لا يمتلك اية مشاركات تم التصويت عليها",
|
||||
"has_no_posts": "This user hasn't posted anything yet.",
|
||||
"has_no_topics": "This user hasn't posted any topics yet.",
|
||||
"has_no_watched_topics": "This user hasn't watched any topics yet.",
|
||||
"has_no_upvoted_posts": "This user hasn't upvoted any posts yet.",
|
||||
"has_no_downvoted_posts": "This user hasn't downvoted any posts yet.",
|
||||
"has_no_voted_posts": "This user has no voted posts",
|
||||
"email_hidden": "البريد الإلكتروني مخفي",
|
||||
"hidden": "مخفي",
|
||||
"paginate_description": "عرض المواضيع والردود موزعة على صفحات عوضاً عن التمرير اللانهائي.",
|
||||
"paginate_description": "Paginate topics and posts instead of using infinite scroll",
|
||||
"topics_per_page": "المواضيع في كل صفحة",
|
||||
"posts_per_page": "الردود في كل صفحة",
|
||||
"max_items_per_page": "أقصى %1",
|
||||
"notification_sounds": "تشغيل صوت عند تلقي تنبيه",
|
||||
"notifications_and_sounds": "التنبيهات والأصوات",
|
||||
"incoming-message-sound": "صوت الرسالة الواردة",
|
||||
"outgoing-message-sound": "صوت الرسائل الصادرة",
|
||||
"notification-sound": "صوت التنبيهات",
|
||||
"no-sound": "بدون صوت",
|
||||
"upvote-notif-freq": "معدل تكرار تنبيهات التصويت للأعلى",
|
||||
"upvote-notif-freq.all": "كل التصويتات للأعلى",
|
||||
"upvote-notif-freq.everyTen": "كل عشر تصويتات للأعلى",
|
||||
"upvote-notif-freq.logarithmic": "On 10, 100, 1000...",
|
||||
"upvote-notif-freq.disabled": "معطل",
|
||||
"notifications_and_sounds": "Notifications & Sounds",
|
||||
"incoming-message-sound": "Incoming message sound",
|
||||
"outgoing-message-sound": "Outgoing message sound",
|
||||
"notification-sound": "Notification sound",
|
||||
"no-sound": "No sound",
|
||||
"browsing": "خيارات التصفح",
|
||||
"open_links_in_new_tab": "فتح الروابط الخارجية في نافدة جديدة",
|
||||
"enable_topic_searching": "تفعيل خاصية البحث داخل المواضيع",
|
||||
"topic_search_help": "إذا قمت بتفعيل ميزة البحث في-الموضوع، سيتم تجاوز الخيار الافتراضي للمتصفح مما يؤدي للبحث بكامل الموضوع بدلا عن البحث في الجزء الظاهر في الشاشة.",
|
||||
"delay_image_loading": "تأخير عرض الصور",
|
||||
"image_load_delay_help": "إذا تم تمكينه، فلن يتم تحميل الصور في المواضيع حتى يتم تمريرها في الشاشة",
|
||||
"scroll_to_my_post": "بعد اضافة رد على المشاركة, قم بإظهار المشاركة",
|
||||
"follow_topics_you_reply_to": "متابعة المواضيع التي تقوم بالرد عليها",
|
||||
"follow_topics_you_create": "متابعة المواضيع التي تقوم بإنشائها",
|
||||
"topic_search_help": "If enabled, in-topic searching will override the browser's default page search behaviour and allow you to search through the entire topic, instead of what is only shown on screen",
|
||||
"delay_image_loading": "Delay Image Loading",
|
||||
"image_load_delay_help": "If enabled, images in topics will not load until they are scrolled into view",
|
||||
"scroll_to_my_post": "After posting a reply, show the new post",
|
||||
"follow_topics_you_reply_to": "Watch topics that you reply to",
|
||||
"follow_topics_you_create": "Watch topics you create",
|
||||
"grouptitle": "عنوان المجموعة",
|
||||
"no-group-title": "لا يوجد عنوان للمجموعة",
|
||||
"select-skin": "إختر سمة",
|
||||
"select-homepage": "إختر الصفحة الرئيسية",
|
||||
"select-skin": "Select a Skin",
|
||||
"select-homepage": "Select a Homepage",
|
||||
"homepage": "الصفحة الرئيسية",
|
||||
"homepage_description": "حدد صفحة لاستخدامها كصفحة رئيسية للمنتدى أو \"لا شيء\" لاستخدام الصفحة الرئيسية الافتراضية.",
|
||||
"custom_route": "مسار الصفحة الرئيسية المخصصة",
|
||||
"custom_route_help": "أدخل اسم مسار هنا، بدون أي شرطة مائلة (على سبيل المثال \"حديثة\" أو \"شائعة\")",
|
||||
"sso.title": "خدمات تسجيل الدخول الموحد",
|
||||
"sso.associated": "مرتبط مع",
|
||||
"sso.not-associated": "انقر هنا لربط مع",
|
||||
"sso.dissociate": "فصل",
|
||||
"sso.dissociate-confirm-title": "تأكيد الفصل",
|
||||
"sso.dissociate-confirm": "هل تريد بالتأكيد فصل حسابك عن %1؟",
|
||||
"info.latest-flags": "أحدث العلامات",
|
||||
"info.no-flags": "لم يتم العثور على مشاركات معلمة",
|
||||
"info.ban-history": "سجل الحظر الأحدث",
|
||||
"info.no-ban-history": "هذا المستخدم لم يتم حظره مطلقا",
|
||||
"info.banned-until": "محظور حتى %1",
|
||||
"info.banned-permanently": "محظور بشكل دائم",
|
||||
"info.banned-reason-label": "سبب",
|
||||
"info.banned-no-reason": "لم يتم إعطاء سبب.",
|
||||
"info.username-history": "سجل اسم المستخدم",
|
||||
"info.email-history": "سجل البريد الإلكتروني",
|
||||
"info.moderation-note": "ملاحظة الإشراف",
|
||||
"info.moderation-note.success": "تم حفظ ملاحظة الإشراف",
|
||||
"info.moderation-note.add": "إضافة ملاحظة"
|
||||
"homepage_description": "Select a page to use as the forum homepage or 'None' to use the default homepage.",
|
||||
"custom_route": "Custom Homepage Route",
|
||||
"custom_route_help": "Enter a route name here, without any preceding slash (e.g. \"recent\", or \"popular\")",
|
||||
"sso.title": "Single Sign-on Services",
|
||||
"sso.associated": "Associated with",
|
||||
"sso.not-associated": "Click here to associate with",
|
||||
"info.latest-flags": "Latest Flags",
|
||||
"info.no-flags": "No Flagged Posts Found",
|
||||
"info.ban-history": "Recent Ban History",
|
||||
"info.no-ban-history": "This user has never been banned",
|
||||
"info.banned-until": "Banned until %1",
|
||||
"info.banned-permanently": "Banned permanently",
|
||||
"info.banned-reason-label": "Reason",
|
||||
"info.banned-no-reason": "No reason given.",
|
||||
"info.username-history": "Username History",
|
||||
"info.email-history": "Email History",
|
||||
"info.moderation-note": "Moderation Note",
|
||||
"info.moderation-note.success": "Moderation note saved",
|
||||
"info.moderation-note.add": "Add note"
|
||||
}
|
||||
@@ -10,12 +10,12 @@
|
||||
"filter-by": "Filter By",
|
||||
"online-only": "المتصلون فقط",
|
||||
"invite": "دعوة",
|
||||
"invitation-email-sent": "تم إرسال دعوة بالبريد الإلكتروني إلى %1",
|
||||
"invitation-email-sent": "An invitation email has been sent to %1",
|
||||
"user_list": "قائمة اﻷعضاء",
|
||||
"recent_topics": "أحدث المواضيع",
|
||||
"popular_topics": "المواضيع الأكثر شهرة",
|
||||
"popular_topics": "Popular Topics",
|
||||
"unread_topics": "المواضيع الغير مقروءة",
|
||||
"categories": "الأقسام",
|
||||
"tags": "الوسوم",
|
||||
"no-users-found": "لم يتم العثور على مستخدمين!"
|
||||
"categories": "الفئات",
|
||||
"tags": "الكلمات الدلالية",
|
||||
"no-users-found": "No users found!"
|
||||
}
|
||||
@@ -1,7 +1,6 @@
|
||||
{
|
||||
"x-b": "%1 Б",
|
||||
"x-mb": "%1 МБ",
|
||||
"x-gb": "%1 ГБ",
|
||||
"uptime-seconds": "Активно време в секунди",
|
||||
"uptime-days": "Активно време в дни",
|
||||
|
||||
|
||||
@@ -1,16 +1,9 @@
|
||||
{
|
||||
"custom-css": "Персонализиран CSS/LESS",
|
||||
"custom-css.description": "Въведете своите собствени декларации на CSS/LESS, те ще бъдат приложени след всички останали стилове.",
|
||||
"custom-css.enable": "Включване на персонализиран CSS/LESS",
|
||||
|
||||
"custom-js": "Персонализиран код на Javascript",
|
||||
"custom-js.description": "Въведете свой собствен код на javascript тук. Той ще бъде изпълнен след като страницата се зареди напълно.",
|
||||
"custom-js.enable": "Включване на персонализирания код на Javascript",
|
||||
"custom-css": "Персонализиран CSS",
|
||||
"custom-css.description": "Въведете своите собствени декларации за стилове, те ще бъдат приложени след всички останали стилове.",
|
||||
"custom-css.enable": "Включване на персонализиран CSS",
|
||||
|
||||
"custom-header": "Персонализирана заглавна част",
|
||||
"custom-header.description": "Въведете своя персонализиран код HTML тук (напр. елементи „meta“ и т.н.), те ще бъдат добавени към секцията <code><head></code> в кода на Вашия форум. Ползването на елементи „script“ е позволено, но непрепоръчително, тъй като за това можете да ползвате раздела <a href=\"#custom-header\" data-toggle=\"tab\">Персонализиран код на Javascript</a>.",
|
||||
"custom-header.enable": "Включване на персонализирана заглавна част",
|
||||
|
||||
"custom-css.livereload": "Включване на моменталното презареждане",
|
||||
"custom-css.livereload.description": "Ако включите това, всички сесии на всяко устройство, където използвате акаунта си, ще се презареждат, когато натискате „Запазване“."
|
||||
"custom-header.description": "Въведете своя персонализиран код HTML тук (напр. JavaScript, елементи „meta“ и т.н.), те ще бъдат добавени към секцията <code><head></code> в кода на Вашия форум.",
|
||||
"custom-header.enable": "Включване на персонализирана заглавна част"
|
||||
}
|
||||
@@ -1,12 +1,10 @@
|
||||
{
|
||||
"you-are-on": "Информация — Вие сте на <strong>%1:%2</strong>",
|
||||
"nodes-responded": "%1 възела отговориха в рамките на %2мсек!",
|
||||
"host": "сървър",
|
||||
"pid": "ид. на процеса",
|
||||
"nodejs": "nodejs",
|
||||
"online": "на линия",
|
||||
"git": "git",
|
||||
"memory": "памет",
|
||||
"load": "натоварване",
|
||||
"uptime": "активно време",
|
||||
|
||||
|
||||
@@ -12,11 +12,11 @@
|
||||
"reorder-plugins": "Пренареждане на добавките",
|
||||
"order-active": "Подреждане на включените добавки",
|
||||
"dev-interested": "Искате ли да пишете добавки за NodeBB?",
|
||||
"docs-info": "Пълната документация относно създаването на добавки може да бъде намерена в <a target=\"_blank\" href=\"https://docs.nodebb.org/development/plugins/\">портала за документация на NodeBB</a>.",
|
||||
"docs-info": "Документацията за създаване на добавки може да бъде открита в <a target=\"_blank\" href=\"https://docs.nodebb.org/en/latest/plugins/create.html\">страницата с документация на NodeBB</a>.",
|
||||
|
||||
"order.description": "Някои добавки работят най-добре, ако бъдат инсталирани преди или след други добавки.",
|
||||
"order.explanation": "Добавките се зареждат в реда, посочен тук, от горе надолу.",
|
||||
|
||||
|
||||
"plugin-item.themes": "Теми",
|
||||
"plugin-item.deactivate": "Изключване",
|
||||
"plugin-item.activate": "Включване",
|
||||
@@ -43,9 +43,5 @@
|
||||
"alert.suggest-error": "<p>NodeBB не може да се свърже с пакетния мениджър. Искате ли да продължите с инсталацията на най-новата версия?</p><div class=\"alert alert-danger\"><strong>Сървърът върна (%1)</strong>: %2</div>",
|
||||
"alert.package-manager-unreachable": "<p>NodeBB не може да се свърже с пакетния мениджър. Не се препоръчва обновяване в момента.</p>",
|
||||
"alert.incompatible": "<p>Вашата версия на NodeBB (версия %1) може да използва най-много версия %2 на тази добавка. Моля, обновете NodeBB, ако искате да инсталирате по-нова версия на тази добавка.</p>",
|
||||
"alert.possibly-incompatible": "<div class=\"alert alert-warning\"><p><strong>Няма информация за съвместимостта</strong></p><p>Тази добавка не е посочила конкретна версия за инсталация, съвместима с Вашата версия на NodeBB. Не можем да гарантираме пълна съвместимост и има възможност Вашият NodeBB да не може да стартира правилно.</p></div><p>Ако NodeBB не може да стартира, използвайте следната команда:</p><pre><code>$ ./nodebb reset plugin=\"%1\"</code></pre><p>Искате ли да продължите с инсталацията на най-новата версия на тази добавка?</p>",
|
||||
|
||||
"license.title": "Информация за лиценза на добавката",
|
||||
"license.intro": "Добавката „<strong>%1</strong>“ използва лиценза „%2“. Моля, прочетете условията на лиценза и се уверете, че ги разбирате, преди да включите добавката.",
|
||||
"license.cta": "Искате ли да продължите с включването на тази добавка?"
|
||||
"alert.possibly-incompatible": "<div class=\"alert alert-warning\"><p><strong>Няма информация за съвместимостта</strong></p><p>Тази добавка не е посочила конкретна версия за инсталация, съвместима с Вашата версия на NodeBB. Не можем да гарантираме пълна съвместимост и има възможност Вашият NodeBB да не може да стартира правилно.</p></div><p>Ако NodeBB не може да стартира, използвайте следната команда:</p><pre><code>$ ./nodebb reset plugin=\"%1\"</code></pre><p>Искате ли да продължите с инсталацията на най-новата версия на тази добавка?</p>"
|
||||
}
|
||||
|
||||
@@ -5,26 +5,21 @@
|
||||
"users": "Потребители",
|
||||
"posts": "Публикации",
|
||||
"topics": "Теми",
|
||||
"page-views-seven": "Последните 7 дни",
|
||||
"page-views-thirty": "Последните 30 дни",
|
||||
"page-views-last-day": "Последните 24 часа",
|
||||
"page-views-custom": "Интервал по избор",
|
||||
"page-views-custom-start": "Начална дата",
|
||||
"page-views-custom-end": "Крайна дата",
|
||||
"page-views-custom-help": "Въведете интервал от дати, за които искате да видите преглежданията на страниците. Ако не се появи календар за избор, можете да въведете датите във формат: <code>ГГГГ-ММ-ДД</code>",
|
||||
"page-views-custom-error": "Моля, въведете правилен интервал от дати във формата: <code>ГГГГ-ММ-ДД</code>",
|
||||
"page-views-last-month": "Преглеждания на страниците през последния месец",
|
||||
"page-views-this-month": "Преглеждания на страниците този месец",
|
||||
"page-views-last-day": "Преглеждания на страниците през последните 24 часа",
|
||||
|
||||
"stats.day": "Ден",
|
||||
"stats.week": "Седмица",
|
||||
"stats.month": "Месец",
|
||||
"stats.all": "От началото",
|
||||
|
||||
|
||||
"updates": "Обновления",
|
||||
"running-version": "Вие използвате <strong>NodeBB версия <span id=\"version\">%1</span></strong>.",
|
||||
"keep-updated": "Стремете се винаги да използвате най-новата версия на NodeBB, за да се възползвате от последните подобрения на сигурността и поправки на проблеми.",
|
||||
"up-to-date": "<p>Вие използвате <strong>най-новата версия</strong> <i class=\"fa fa-check\"></i></p>",
|
||||
"upgrade-available": "<p>Има нова версия (версия %1). Ако имате възможност, <a href=\"https://docs.nodebb.org/configuring/upgrade/\">обновете NodeBB</a>.</p>",
|
||||
"prerelease-upgrade-available": "<p>Това е остаряла предварителна версия на NodeBB. Има нова версия (версия %1). Ако имате възможност, <a href=\"https://docs.nodebb.org/configuring/upgrade/\">обновете NodeBB</a>.</p>",
|
||||
"upgrade-available": "<p>Има нова версия (версия %1). Ако имате възможност, <a href=\"https://docs.nodebb.org/en/latest/upgrading/index.html\">обновете NodeBB</a>.</p>",
|
||||
"prerelease-upgrade-available": "<p>Това е остаряла версия за предварителен преглед на NodeBB. Има нова версия (версия %1). Ако имате възможност, <a href=\"https://docs.nodebb.org/en/latest/upgrading/index.html\">обновете NodeBB</a>.</p>",
|
||||
"prerelease-warning": "<p>Това е версия за <strong>предварителен преглед</strong> на NodeBB. Възможно е да има неочаквани неизправности. <i class=\"fa fa-exclamation-triangle\"></i></p>",
|
||||
"running-in-development": "<span>Форумът работи в режим за разработчици, така че може да бъде уязвим. Моля, свържете се със системния си администратор.</span>",
|
||||
|
||||
|
||||
@@ -3,6 +3,5 @@
|
||||
"description": "Изберете коя страница да бъде показана, когато потребителите отидат на главния адрес на форума.",
|
||||
"home-page-route": "Път на началната страница",
|
||||
"custom-route": "Персонализиран път",
|
||||
"allow-user-home-pages": "Разрешаване на потребителските начални страници",
|
||||
"home-page-title": "Заглавие на началната страница (по подразбиране: „Начало“)"
|
||||
"allow-user-home-pages": "Разрешаване на потребителските начални страници"
|
||||
}
|
||||
@@ -1,6 +1,5 @@
|
||||
{
|
||||
"language-settings": "Езикови настройки",
|
||||
"description": "Езикът по подразбиране определя езиковите настройки за всички потребители, които посещават Вашия форум. <br />Отделните потребители могат да сменят езика си от страницата с настройки на профила си.",
|
||||
"default-language": "Език по подразбиране",
|
||||
"auto-detect": "Автоматично разпознаване на езика за гостите"
|
||||
"default-language": "Език по подразбиране"
|
||||
}
|
||||
@@ -11,7 +11,6 @@
|
||||
"only-admins": "Да е видимо само за администраторите",
|
||||
"only-global-mods-and-admins": "Да е видимо само за глобалните модератори и администраторите",
|
||||
"only-logged-in": "Да е видимо само за вписаните потребители",
|
||||
"only-guest": "Да е видимо само за гостите",
|
||||
"open-new-window": "Отваряне в нов прозорец",
|
||||
|
||||
"installed-plugins-required": "Нужни инсталирани добавки:",
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
"custom-class": "Персонализиран клас",
|
||||
"num-recent-replies": "Брой на скорошните отговори",
|
||||
"ext-link": "Външна връзка",
|
||||
"is-section": "Използване на тази категория като раздел",
|
||||
"upload-image": "Качване на изображение",
|
||||
"delete-image": "Премахване",
|
||||
"category-image": "Изображение на категорията",
|
||||
|
||||
19
public/language/bg/admin/manage/flags.json
Normal file
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"daily": "Дневни доклади",
|
||||
"by-user": "Доклади по потребител",
|
||||
"by-user-search": "Търсене на докладвани публикации по потребителско име",
|
||||
"category": "Категория",
|
||||
"sort-by": "Подреждане по",
|
||||
"sort-by.most-flags": "Най-много доклади",
|
||||
"sort-by.most-recent": "Най-скорошни",
|
||||
"search": "Търсене",
|
||||
"dismiss-all": "Премахване на всички",
|
||||
"none-flagged": "Няма докладвани публикации!",
|
||||
"posted-in": "Публикувано в %1",
|
||||
"read-more": "Прочетете повече",
|
||||
"flagged-x-times": "Тази публикация е докладвана %1 път(и):",
|
||||
"dismiss": "Премахване на този доклад",
|
||||
"delete-post": "Изтриване на публикацията",
|
||||
|
||||
"alerts.confirm-delete-post": "Наистина ли искате да изтриете тази публикация?"
|
||||
}
|
||||
@@ -1,7 +1,6 @@
|
||||
{
|
||||
"name": "Име на групата",
|
||||
"description": "Описание на групата",
|
||||
"member-count": "Брой на членовете",
|
||||
"system": "Системна група",
|
||||
"edit": "Редактиране",
|
||||
"search-placeholder": "Търсене",
|
||||
|
||||
@@ -11,8 +11,5 @@
|
||||
"validate.x-valid": "Правилни правила: <strong>%1</strong> от <strong>%2</strong>.",
|
||||
"validate.x-invalid": "Следните <strong>%1</strong> правила са грешни:",
|
||||
|
||||
"alerts.applied-success": "Черният списък е приложен",
|
||||
|
||||
"analytics.blacklist-hourly": "<strong>Фигура 1</strong> – Попадения в черния списък за час",
|
||||
"analytics.blacklist-daily": "<strong>Фигура 2</strong> – Попадения в черния списък за ден"
|
||||
"alerts.applied-success": "Черният списък е приложен"
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
{
|
||||
"post-queue": "Опашка за публикации",
|
||||
"description": "Няма публикации в опашката. <br> За да включите тази функционалност, идете в <a href=\"%1\">Настройки → Публикуване → Ограничения за публикуването</a> и включете <strong>Опашката за публикации</strong>.",
|
||||
"user": "Потребител",
|
||||
"category": "Категория",
|
||||
"title": "Заглавие",
|
||||
"content": "Съдържание",
|
||||
"posted": "Публикувано",
|
||||
"reply-to": "Отговор на „%1“",
|
||||
"content-editable": "Можете да щракнете върху всеки от текстовете, за да ги редактирате преди публикуване."
|
||||
}
|
||||
@@ -6,7 +6,6 @@
|
||||
"description": "Изберете етикетите чрез щракване и/или влачене. Използвайте „Shift“, за да изберете няколко етикета.",
|
||||
"create": "Създаване на етикет",
|
||||
"modify": "Редактиране на етикети",
|
||||
"rename": "Преименуване на етикети",
|
||||
"delete": "Изтриване на избраните етикети",
|
||||
"search": "Търсене на етикети…",
|
||||
"settings": "Натиснете <a href=\"%1\">тук</a>, за да отворите страницата с настройки на етикета.",
|
||||
|
||||
@@ -27,8 +27,6 @@
|
||||
"pills.banned": "Блокиран",
|
||||
"pills.search": "Търсене на потребители",
|
||||
|
||||
"search.uid": "По потребителски идентификатор",
|
||||
"search.uid-placeholder": "Въведете потребителски идентификатор, който да потърсите",
|
||||
"search.username": "По име на потребител",
|
||||
"search.username-placeholder": "Въведете потребителско име, което да потърсите",
|
||||
"search.email": "По е-поща",
|
||||
@@ -71,15 +69,9 @@
|
||||
"alerts.lockout-reset-success": "Заключването/ията е/са нулирано/и!",
|
||||
"alerts.flag-reset-success": "Докладът/ите е/са анулиран(и)!",
|
||||
"alerts.no-remove-yourself-admin": "Не можете да отнемете собствените си права на администратор!",
|
||||
"alerts.make-admin-success": "Потребителят вече ще бъде администратор.",
|
||||
"alerts.confirm-remove-admin": "Наистина ли искате да премахнете този администратор?",
|
||||
"alerts.remove-admin-success": "Потребителят вече няма да бъде администратор.",
|
||||
"alerts.make-global-mod-success": "Потребителят вече ще бъде глобален модератор.",
|
||||
"alerts.confirm-remove-global-mod": "Наистина ли искате да премахнете този глобален модератор?",
|
||||
"alerts.remove-global-mod-success": "Потребителят вече няма да бъде глобален модератор.",
|
||||
"alerts.make-moderator-success": "Потребителят вече ще бъде модератор.",
|
||||
"alerts.confirm-remove-moderator": "Наистина ли искате да премахнете този модератор?",
|
||||
"alerts.remove-moderator-success": "Потребителят вече няма да бъде модератор.",
|
||||
"alerts.make-admin-success": "Потребителят/ите вече е/са администратор(и).",
|
||||
"alerts.confirm-remove-admin": "Наистина ли искате да премахнете администраторите?",
|
||||
"alerts.remove-admin-success": "Потребителят/ите вече не е/са администратор(и)",
|
||||
"alerts.confirm-validate-email": "Искате ли да проверите е-пощата/ите на този/тези потребител(и)?",
|
||||
"alerts.validate-email-success": "Е-пощите са проверени",
|
||||
"alerts.password-reset-confirm": "Искате ли да изпратите е-писмо/а за възстановяване на паролата на този/тези потребител(и)?",
|
||||
|
||||
@@ -9,12 +9,9 @@
|
||||
|
||||
"section-manage": "Управление",
|
||||
"manage/categories": "Категории",
|
||||
"manage/privileges": "Правомощия",
|
||||
"manage/tags": "Етикети",
|
||||
"manage/users": "Потребители",
|
||||
"manage/admins-mods": "Администратори и модератори",
|
||||
"manage/registration": "Регистрационна опашка",
|
||||
"manage/post-queue": "Опашка за публикации",
|
||||
"manage/groups": "Групи",
|
||||
"manage/ip-blacklist": "Черен списък за IP адреси",
|
||||
|
||||
@@ -41,7 +38,7 @@
|
||||
"section-appearance": "Външен вид",
|
||||
"appearance/themes": "Теми",
|
||||
"appearance/skins": "Облици",
|
||||
"appearance/customise": "Персонализирано съдържание (HTML/JS/CSS)",
|
||||
"appearance/customise": "Персонализиран HTML и CSS",
|
||||
|
||||
"section-extend": "Разширяване",
|
||||
"extend/plugins": "Добавки",
|
||||
@@ -67,7 +64,7 @@
|
||||
"logout": "Изход",
|
||||
"view-forum": "Преглед на форума",
|
||||
|
||||
"search.placeholder": "Търсене на настройки",
|
||||
"search.placeholder": "Търсене…",
|
||||
"search.no-results": "Няма резултати…",
|
||||
"search.search-forum": "Търсене във форума за <strong></strong>",
|
||||
"search.keep-typing": "Продължете да пишете, за да видите още резултати…",
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"headers.allow-from": "Задайте „ALLOW-FROM“, за да поставите NodeBB в „iFrame“",
|
||||
"headers.powered-by": "Персонализиране на заглавната част „Захранван от“, която се изпраща от NodeBB",
|
||||
"headers.acao": "Произход за разрешаване на управлението на достъпа",
|
||||
"headers.acao-help": "За да забраните достъпа до всички уеб сайтове, оставете празно",
|
||||
"headers.acao-help": "За да забраните достъпа до всички уеб сайтове, оставете празно или задайте <code>null</code>",
|
||||
"headers.acam": "Методи за разрешаване на управлението на достъпа",
|
||||
"headers.acah": "Заглавки за разрешаване на управлението на достъпа",
|
||||
"traffic-management": "Управление на трафика",
|
||||
|
||||
@@ -5,7 +5,5 @@
|
||||
"disable-editing-help": "Това ограничение не засяга администраторите и глобалните модератори",
|
||||
"max-length": "Максимална дължина на съобщенията в разговорите",
|
||||
"max-room-size": "Максимален брой потребители в стая за разговор",
|
||||
"delay": "Време между съобщеният в разговорите (в милисекунди)",
|
||||
"restrictions.seconds-edit-after": "Брой секунди, в които потребителите не могат да редактират съобщенията си в разговорите след публикуването им. (0 = изключено)",
|
||||
"restrictions.seconds-delete-after": "Брой секунди, в които потребителите не могат да изтрият съобщенията си в разговорите след публикуването им. (0 = изключено)"
|
||||
"delay": "Време между съобщеният в разговорите (в милисекунди)"
|
||||
}
|
||||
@@ -4,25 +4,13 @@
|
||||
"address-help": "Следният адрес на е-поща е този, който получателят ще види в полетата „От“ и “Отговор до“.",
|
||||
"from": "Име за полето „От“",
|
||||
"from-help": "Името на изпращача, което да бъде показано в е-писмото.",
|
||||
|
||||
"smtp-transport": "Транспорт чрез SMTP",
|
||||
"smtp-transport.enabled": "Използване на външен сървър за е-поща за изпращане на е-писма",
|
||||
"smtp-transport-help": "Можете да изберете от списък от познати услуги, или да въведете такава ръчно.",
|
||||
"smtp-transport.service": "Изберете услуга",
|
||||
"smtp-transport.service-custom": "Персонализирана услуга",
|
||||
"smtp-transport.service-help": "Изберете името на услугата по-горе, за да използвате известните данни за нея. Или изберете „Персонализирана услуга“ и въведете данните ѝ по-долу.",
|
||||
"smtp-transport.gmail-warning1": "Има доклади, че услугата на Gmail не работи за акаунти с подсилена защита. В тези случаи ще трябва да <a href=\"https://www.google.com/settings/security/lesssecureapps\">настроите своя акаунт в GMail така, че да позволява използването на по-малко защитени приложения</a>.",
|
||||
"smtp-transport.gmail-warning2": "За повече информация относно това обиколно решение, <a href=\"https://nodemailer.com/usage/using-gmail/\">моля, прегледайте тази статия за проблема в „NodeMailer“.</a> Друго решение би било използването на добавка за е-поща от трета страна, като например „SendGrid“, „Mailgun“ и т.н. <a href=\"../extend/plugins\">Вижте наличните добавки тук</a>.",
|
||||
"smtp-transport.host": "SMTP сървър",
|
||||
"smtp-transport.port": "SMTP порт",
|
||||
"smtp-transport.security": "Сигурност на връзката",
|
||||
"smtp-transport.security-encrypted": "Шифрована",
|
||||
"smtp-transport.security-starttls": "StartTLS",
|
||||
"smtp-transport.security-none": "Няма",
|
||||
"smtp-transport.username": "Потребителско име",
|
||||
"smtp-transport.username-help": "<b>За услугата на Gmail</b>, въведете пълния адрес на е-пощата тук, особено ако използвате управляван домейн на „Google Apps“.",
|
||||
"smtp-transport.password": "Парола",
|
||||
|
||||
"gmail-routing": "Препращане на Gmail",
|
||||
"gmail-routing-help1": "Има доклади, че препращането на Gmail не работи за акаунти с подсилена защита. В тези случаи ще трябва да <a href=\"https://www.google.com/settings/security/lesssecureapps\">настроите своя акаунт в GMail така, че да позволява използването на по-малко защитени приложения</a>.",
|
||||
"gmail-routing-help2": "За повече информация относно това обиколно решение, <a href=\"https://nodemailer.com/using-gmail/\">моля, прегледайте тази статия за проблема в „NodeMailer“.</a> Друго решение би било използването на добавка за е-поща от трета страна, като например „SendGrid“, „Mailgun“ и т.н. <a href=\"{config.relative_path}/admin/extend/plugins\">Вижте наличните добавки тук</a>.",
|
||||
"gmail-transport": "Препращане на е-писмата през акаунта в Gmail/Google Apps",
|
||||
"gmail-transport.username": "Потребителско име",
|
||||
"gmail-transport.username-help": "Въведете пълния адрес на е-пощата тук, особено ако използвате управляван домейн на „Google Apps“.",
|
||||
"gmail-transport.password": "Парола",
|
||||
"template": "Редактирана не шаблона за е-писма",
|
||||
"template.select": "Изберете шаблон за е-писма",
|
||||
"template.revert": "Връщане на оригинала",
|
||||
|
||||