Compare commits

..

72 Commits

Author SHA1 Message Date
NodeBB Misty
fb2f857af2 Incremented version number - v1.4.6 2017-04-19 19:06:05 +00:00
NodeBB Misty
7181bb4e1a Merge commit 'de81a340ec374d7103287b446ce3081bb3a020cc' into v1.x.x 2017-04-19 19:06:05 +00:00
Misty (Bot)
d19e59f1e1 Incremented version number 2017-03-16 18:57:33 +00:00
Misty (Bot)
f5e8a40d79 Merge commit '449352d8996b4c98be67052fbb5b68fdc65cd0f2' into v1.x.x 2017-03-16 18:57:33 +00:00
Julian Lam
4713e0d81a Merge pull request #5514 from manolino/v1.x.x
apple-touch-icon for Web App on IOS
2017-03-09 14:22:40 -05:00
manolino
562b088423 apple-touch-icon for Web App on IOS
route apple-touch-icon not serving touchicon-orig.png. I made needed
correction to file path.
Now works with new /assets and strategy.
2017-03-08 16:32:50 -06:00
Misty (Bot)
92691782e6 Incremented version number 2017-02-24 15:45:36 +00:00
Misty (Bot)
fe582d8a7b Merge commit '048eb8a320a217c5e692c598c86a7661bd5eb2c5' into v1.x.x 2017-02-24 15:45:36 +00:00
Julian Lam
98f2fd62a5 Up markdown 2017-02-02 15:19:31 -05:00
Misty (Bot)
922620fe0a Incremented version number 2017-02-02 17:14:59 +00:00
Misty (Bot)
94b9d77118 Merge commit 'adb66c71b8aff297706056f69b1cf17b972c42af' into v1.x.x 2017-02-02 17:14:58 +00:00
Barış Soner Uşaklı
b1b9174479 backport #5333 2017-01-03 14:11:04 +02:00
Misty (Bot)
d5fb6dac38 Incremented version number 2016-12-22 16:58:30 +00:00
Misty (Bot)
deb9a9189d Merge commit '66d8c29d251231585986f72d30cd9b8d59ed92b3' into v1.x.x 2016-12-22 16:58:29 +00:00
Misty (Bot)
3309f2910d Incremented version number 2016-12-19 19:17:56 +00:00
Misty (Bot)
b600b9305e Merge commit '70f71888f1aaf7d88f58466d29265e43746e2bb0' into v1.x.x 2016-12-19 19:17:56 +00:00
Misty (Bot)
d120ee86cf Incremented version number 2016-12-01 21:28:53 +00:00
Misty (Bot)
f7ceace48f Merge commit 'bcb3903446e9b40be899d9606d26ca490afcc69e' into v1.x.x 2016-12-01 21:28:53 +00:00
psychobunny
fbbd0deaea Revert "testing"
This reverts commit aabe1c3a16.
2016-12-01 16:13:40 -05:00
psychobunny
aabe1c3a16 testing 2016-12-01 16:13:02 -05:00
Barış Soner Uşaklı
94fb6b9823 Merge pull request #5246 from AliasT/v1.x.x
wrong socket.io.js path
2016-12-01 12:12:32 +02:00
xiaobing
d6af2ae13b wrong socket.io.js path 2016-12-01 18:02:34 +08:00
NodeBB Misty
4db89407c4 Incremented version number 2016-11-11 15:17:14 -05:00
NodeBB Misty
ef14511e24 Merge commit 'ee75c69817e21974a93e3981ebd32f745db94e19' into v1.x.x 2016-11-11 15:17:13 -05:00
Julian Lam
37cdf9ce25 fixes #5144 2016-10-21 14:44:38 -04:00
Julian Lam
7454902678 remove conflicts 2016-10-21 13:43:54 -04:00
Julian Lam
d6a485a6cc exposing pid, username, and userslug to flag modal 2016-10-21 13:43:08 -04:00
barisusakli
301e62c3ba up composer 2016-10-19 12:55:22 -04:00
barisusakli
d6c2fc96f8 up composer 2016-10-19 12:55:16 -04:00
Barış Soner Uşaklı
a9d69c4779 backport #5080 2016-10-13 13:46:06 +03:00
Barış Soner Uşaklı
1cf07a6fc5 backport #5103 2016-10-11 23:24:53 +03:00
NodeBB Misty
dfc8ceef9e Incremented version number 2016-10-06 07:59:33 -04:00
NodeBB Misty
b666261602 Merge commit '9bd4ab9682191c71482c5778b450d532e9c40655' into v1.x.x 2016-10-06 07:59:33 -04:00
NodeBB Misty
3c5d7f36b2 Incremented version number 2016-09-30 14:18:18 -04:00
NodeBB Misty
fda10ea194 Merge commit '6aec61d7227b73b49f30ea912dcab5f299f240f9' into v1.x.x 2016-09-30 14:18:18 -04:00
Barış Soner Uşaklı
9cc13aaf16 fix /unread 2016-09-26 18:43:00 +03:00
Barış Soner Uşaklı
2dec354131 backport xss fix 2016-09-26 17:10:39 +03:00
Barış Soner Uşaklı
1fefc8d427 backport xss fix 2016-09-26 17:05:30 +03:00
Barış Soner Uşaklı
c3b6974779 backport 42a8346d2d 2016-09-26 17:02:17 +03:00
Barış Soner Uşaklı
fdd8514058 backport https://github.com/NodeBB/NodeBB/issues/4997 2016-08-30 13:18:40 +03:00
Barış Soner Uşaklı
550fa4717d backport missing return fix
fixes double topic creation if guest handles are allowed
2016-08-25 14:01:33 +03:00
NodeBB Misty
c0a4bf91f3 Incremented version number 2016-08-10 00:15:35 -04:00
NodeBB Misty
2cbdb886b1 Merge commit 'fd8f5f9415d17c646dfa7d0806050f4f38785c93' into v1.x.x 2016-08-10 00:15:34 -04:00
NodeBB Misty
ff70f36e1a Incremented version number 2016-08-08 07:47:04 -04:00
NodeBB Misty
60721ce75d Merge commit 'aac0313f2eb87123347c5925a134adcd57fb869e' into v1.x.x 2016-08-08 07:47:03 -04:00
NodeBB Misty
296dc77c7b Incremented version number 2016-07-12 12:27:22 -04:00
NodeBB Misty
79cd9b1bcb Merge commit '03208807e444e8583051ed8fd04dedcc491ba5c3' into v1.x.x 2016-07-12 12:27:21 -04:00
Barış Soner Uşaklı
a196c834d9 backport user delete fix 2016-05-10 11:42:03 +03:00
Barış Soner Uşaklı
427500fc04 backport clone category fix 2016-05-07 20:40:19 +03:00
Barış Soner Uşaklı
1a5b6d4839 backport crash fix 2016-05-05 21:01:15 +03:00
NodeBB Misty
61404be94b Incremented version number 2016-04-13 13:20:13 -04:00
NodeBB Misty
c40c64a9c5 Merge commit '3390b7d7f6e9b4f6bd5f0bc6a5d554c21eb2b9ff' into v1.x.x 2016-04-13 13:20:13 -04:00
NodeBB Misty
b81e395a26 Incremented version number 2016-03-21 09:06:33 -04:00
NodeBB Misty
c12963593d Merge commit '294171b07266706ac78850be8b85b3d27e332424' into v1.x.x 2016-03-21 09:06:33 -04:00
Julian Lam
1736b1c015 removing additional socket methods added via #4304
@barisusakli added these methods in 8d9f7d8e19
2016-03-18 15:35:38 -04:00
NodeBB Misty
3d815fff72 bumped up version 2016-03-18 13:46:58 -04:00
NodeBB Misty
f88b695d4c Merge commit 'f7e43877482f6efc276ea71e61d7c7524a8f5a44' into v1.x.x 2016-03-18 13:40:33 -04:00
NodeBB Misty
72940f7bdf 1.0.1-auto.0 2016-03-12 18:39:12 -05:00
NodeBB Misty
ffc9da97e3 Merge commit '263b09f11a9496b7ad498a5d698186b9d774ae23' into v1.x.x 2016-03-12 18:39:10 -05:00
Julian Lam
2be3054e94 removed shrinkwrap file from release branch 2016-03-12 13:12:28 -05:00
Barış Soner Uşaklı
fdf32a6ed4 backport cover fix 2016-03-12 19:55:22 +02:00
Barış Soner Uşaklı
19b3069ad0 backport global mod fix 2016-03-09 22:45:59 +02:00
Barış Soner Uşaklı
5765313b63 backport image.normalise fix 2016-03-09 14:24:12 +02:00
Barış Soner Uşaklı
cbbd254d33 Merge pull request #4304 from AccaliaDeElementia/v1.x.x
Add API endpoint analogs to websocket interface
2016-03-08 10:33:20 +02:00
Barış Soner Uşaklı
8f8fcc8416 backport upgradescript fix for global moderators 2016-03-05 11:46:11 +02:00
Julian Lam
55b43dca23 updated shrinkwrap file 2016-03-03 16:45:20 -05:00
accalia
c13aab39e7 fix formatting error 2016-03-03 16:42:10 -05:00
accalia
072fa38927 Add API endpoint analogs to websocket
includes post.getPost, topic.getTopic, category.getCategory, user.getUserBy*
2016-03-03 08:34:08 -05:00
psychobunny
0b35c81586 @barisusakli fixing minfile caching for multiple processes 2016-03-02 23:58:45 -05:00
psychobunny
cc6d4f5d43 https://github.com/NodeBB/NodeBB/issues/4287 2016-03-02 13:15:22 -05:00
psychobunny
d9474d5de2 closes #4296 2016-03-02 13:07:42 -05:00
Julian Lam
f6c60517db added shrinkwrap file 2016-02-29 11:43:04 -05:00
2268 changed files with 34755 additions and 47376 deletions

View File

@@ -17,4 +17,3 @@ logs/
/coverage
/build
.eslintrc
test/files

View File

@@ -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",

View File

@@ -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?

View File

@@ -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
View File

@@ -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

View File

@@ -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

File diff suppressed because it is too large Load Diff

View File

@@ -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

View File

@@ -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/**',
],

View File

@@ -3,7 +3,7 @@
[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/NodeBB/NodeBB?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
[![Build Status](https://travis-ci.org/NodeBB/NodeBB.svg?branch=master)](https://travis-ci.org/NodeBB/NodeBB)
[![Coverage Status](https://coveralls.io/repos/github/NodeBB/NodeBB/badge.svg?branch=master)](https://coveralls.io/github/NodeBB/NodeBB?branch=master)
[![Dependency Status](https://david-dm.org/nodebb/nodebb.svg?path=install)](https://david-dm.org/nodebb/nodebb?path=install)
[![Dependency Status](https://david-dm.org/nodebb/nodebb.svg)](https://david-dm.org/nodebb/nodebb)
[![Code Climate](https://codeclimate.com/github/NodeBB/NodeBB/badges/gpa.svg)](https://codeclimate.com/github/NodeBB/NodeBB)
[![Documentation Status](https://readthedocs.org/projects/nodebb/badge/?version=latest)](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
View File

@@ -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);
}
}

View File

@@ -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,
"privileges:flag": 0
"topicsPerList": 20
}

View File

@@ -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":""
}

View File

@@ -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));

View File

@@ -1,140 +0,0 @@
{
"name": "nodebb",
"license": "GPL-3.0",
"description": "NodeBB Forum",
"version": "1.7.3",
"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.1.6",
"bcryptjs": "2.4.3",
"benchpressjs": "^1.2.0",
"body-parser": "^1.18.2",
"bootstrap": "^3.3.7",
"chart.js": "^2.7.0",
"colors": "^1.1.2",
"compression": "^1.7.1",
"commander": "^2.11.0",
"connect-ensure-login": "^0.1.1",
"connect-flash": "^0.1.1",
"connect-mongo": "2.0.0",
"connect-multiparty": "^2.1.0",
"connect-redis": "3.3.2",
"cookie-parser": "^1.4.3",
"cron": "^1.3.0",
"cropperjs": "^1.1.3",
"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.2",
"lodash": "^4.17.4",
"logrotate-stream": "^0.2.5",
"lru-cache": "4.1.1",
"material-design-lite": "^1.3.0",
"mime": "^2.0.3",
"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.7",
"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.9",
"nodebb-theme-lavender": "5.0.0",
"nodebb-theme-persona": "7.2.8",
"nodebb-theme-slick": "1.1.2",
"nodebb-theme-vanilla": "8.1.4",
"nodebb-widget-essentials": "4.0.1",
"nodemailer": "4.4.0",
"passport": "^0.4.0",
"passport-local": "1.0.0",
"postcss": "6.0.14",
"postcss-clean": "1.1.0",
"promise-polyfill": "^6.0.2",
"prompt": "^1.0.0",
"redis": "2.8.0",
"request": "2.83.0",
"rimraf": "2.6.2",
"rss": "^1.2.2",
"sanitize-html": "^1.14.1",
"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.1.5",
"validator": "9.1.2",
"winston": "^2.4.0",
"xml": "^1.0.1",
"xregexp": "3.2.0",
"zxcvbn": "^4.4.2"
},
"devDependencies": {
"coveralls": "^3.0.0",
"eslint": "^4.9.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.3.0",
"mocha": "^4.0.1",
"mocha-lcov-reporter": "^1.3.0",
"nyc": "^11.2.1",
"smtp-server": "^3.3.0"
},
"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"
}
]
}

View File

@@ -5,13 +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 Benchpress = require('benchpressjs');
var app = express();
var server;
@@ -27,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',
@@ -39,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);
});
@@ -79,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,
};
});
@@ -128,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');
}
@@ -173,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;

View File

@@ -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
View File

@@ -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();
}

View File

@@ -1 +1 @@
@echo off && cd %~dp0 && node ./src/cli %*
node ./nodebb %*

139
package.json Normal file
View 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"
}
]
}

View File

@@ -10,6 +10,7 @@
"overrides": true,
"componentHandler": true,
"bootbox": true,
"templates": true,
"Visibility": true,
"Tinycon": true,
"Promise": true

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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",

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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!"
}

View File

@@ -1,16 +1,9 @@
{
"custom-css": "CSS مخصص",
"custom-css.description": "أدخل CSS الخاصة بك هنا، والتي سيتم تطبيقها بعد كل القوالب الأخرى.",
"custom-css.enable": "تفعيل CSS المخصص",
"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>&lt;head&gt;</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>&lt;head&gt;</code> section of your forum's markup.",
"custom-header.enable": "Enable Custom Header"
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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",

View File

@@ -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>"
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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:",

View File

@@ -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",

View 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?"
}

View File

@@ -1,7 +1,6 @@
{
"name": "Group Name",
"description": "Group Description",
"member-count": "Member Count",
"system": "System Group",
"edit": "Edit",
"search-placeholder": "Search",

View File

@@ -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> &ndash; Blacklist hits per hour",
"analytics.blacklist-daily": "<strong>Figure 2</strong> &ndash; Blacklist hits per day"
"alerts.applied-success": "Blacklist Applied"
}

View File

@@ -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 &rarr; Post &rarr; 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."
}

View File

@@ -1,34 +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/tags": "الكلمات المفتاحية",
"manage/users": "الأعضاء",
"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",
@@ -39,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",
@@ -65,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...",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -4,11 +4,8 @@
"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",
"restrictions": "Posting Restrictions",
"restrictions.post-queue": "Enable post queue",
"restrictions.post-queue-help": "Enabling post queue will put the posts of new users in a queue for approval.",
"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",
@@ -32,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",

View File

@@ -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"
}

View File

@@ -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&apos;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",

View File

@@ -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": "الفئات المتابعة"
}

View File

@@ -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": "شكرًا لك!"
}

View File

@@ -1,20 +1,17 @@
{
"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": "كلمة البحث غير صحيحة",
"csrf-invalid": "لم تتمكن من تسجيل الدخول. هنالك أحتمال ان جلستك انتهت. رجاءًا حاول مرة اخرى.",
@@ -33,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": "رجاءًا ضع تاريخ نهاية الحظر. ",
@@ -81,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",
@@ -109,7 +104,7 @@
"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": "غير مصرح لك بحذف الرسالة.",
@@ -119,13 +114,11 @@
"not-enough-reputation-to-downvote": "ليس لديك سمعة تكفي لإضافة صوت سلبي لهذا الموضوع",
"not-enough-reputation-to-flag": "ليس لديك سمعة تكفي للإشعار بموضوع مخل",
"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": "المستخدم غير موجود في الغرفة.",
@@ -134,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": "يبدو أن فترة التسجيل لم تعد قائمة او هي غير مطابقة مع الخادم. يرجى إعادة تحميل هذه الصفحة."
}

View File

@@ -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."
}

View File

@@ -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": "نجاح",
@@ -75,7 +75,7 @@
"norecenttopics": "لاوجود لمواضيع جديدة",
"recentposts": "آخر المشاركات",
"recentips": "آخر عناوين ال IP التي سجلت الدخول",
"moderator_tools": "أدوات المشرف",
"moderator_tools": "Moderator Tools",
"away": "غير متواجد",
"dnd": "عدم الإزعاج",
"invisible": "مخفي",
@@ -85,7 +85,7 @@
"guest": "زائر",
"guests": "الزوار",
"updated.title": "تم تحديث المنتدى",
"updated.message": "لقد تم تحديث المنتدى إلى آخر نسخة للتو. إضغط هنا لإعادة تحميل الصفحة.",
"updated.message": "لقد تم تحديث المنتدى إلى آخر نسخة للتو. المرجو إعادة تحميل الصفحة.",
"privacy": "الخصوصية",
"follow": "متابعة",
"unfollow": "إلغاء المتابعة",
@@ -97,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"
}

View File

@@ -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"
}

View File

@@ -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": "إخفاء المعاينة",

View File

@@ -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": "تم إرسال بريد التفعيل."
}

View File

@@ -6,10 +6,8 @@
"popular-month": "المواضيع الشائعة هذا الشهر",
"popular-alltime": "المواضيع الشائعة منذ القدم",
"recent": "المواضيع الحديثة",
"moderator-tools": "Moderator Tools",
"flagged-content": "Flagged Content",
"ip-blacklist": "IP Blacklist",
"post-queue": "Post Queue",
"users/online": "اﻷعضاء المتصلون",
"users/latest": "أحدث اﻷعضاء",
"users/sort-posts": "الأعضاء الأكثر نشاطاً",
@@ -44,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",

View File

@@ -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:"
}

View File

@@ -1,7 +1,6 @@
{
"success": "نجاح",
"topic-post": "لقد تمت الإضافة بنجاح.",
"post-queued": "Your post is queued for approval.",
"authentication-successful": "تم تسجيل الدخول بنجاح",
"settings-saved": "تم حفظ التغييرات!"
}

View File

@@ -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": "يجب عليك تسجيل الدخول للرد",
@@ -59,7 +58,6 @@
"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": "نبذ التغييرات",

View File

@@ -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": "المواضيع المتابعة"
}

View File

@@ -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": "إذا تم تمكينه، فلن يتم تحميل الصور في المواضيع حتى يتم تمريرها في الشاشة",
"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": "متابعة المواضيع التي تقوم بالرد عليها",
"follow_topics_you_create": "متابعة المواضيع التي تقوم بإنشائها",
"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"
}

View File

@@ -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!"
}

View File

@@ -1,7 +1,6 @@
{
"x-b": "%1 Б",
"x-mb": "%1 МБ",
"x-gb": "%1 ГБ",
"uptime-seconds": "Активно време в секунди",
"uptime-days": "Активно време в дни",

View File

@@ -3,14 +3,7 @@
"custom-css.description": "Въведете своите собствени декларации за стилове, те ще бъдат приложени след всички останали стилове.",
"custom-css.enable": "Включване на персонализиран CSS",
"custom-js": "Персонализиран код на Javascript",
"custom-js.description": "Въведете свой собствен код на javascript тук. Той ще бъде изпълнен след като страницата се зареди напълно.",
"custom-js.enable": "Включване на персонализирания код на Javascript",
"custom-header": "Персонализирана заглавна част",
"custom-header.description": "Въведете своя персонализиран код HTML тук (напр. елементи „meta“ и т.н.), те ще бъдат добавени към секцията <code>&lt;head&gt;</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>&lt;head&gt;</code> в кода на Вашия форум.",
"custom-header.enable": "Включване на персонализирана заглавна част"
}

View File

@@ -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": "активно време",

View File

@@ -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>"
}

View File

@@ -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>",

View File

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

View File

@@ -11,7 +11,6 @@
"only-admins": "Да е видимо само за администраторите",
"only-global-mods-and-admins": "Да е видимо само за глобалните модератори и администраторите",
"only-logged-in": "Да е видимо само за вписаните потребители",
"only-guest": "Да е видимо само за гостите",
"open-new-window": "Отваряне в нов прозорец",
"installed-plugins-required": "Нужни инсталирани добавки:",

View File

@@ -10,7 +10,6 @@
"custom-class": "Персонализиран клас",
"num-recent-replies": "Брой на скорошните отговори",
"ext-link": "Външна връзка",
"is-section": "Използване на тази категория като раздел",
"upload-image": "Качване на изображение",
"delete-image": "Премахване",
"category-image": "Изображение на категорията",

View 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": "Наистина ли искате да изтриете тази публикация?"
}

View File

@@ -1,7 +1,6 @@
{
"name": "Име на групата",
"description": "Описание на групата",
"member-count": "Брой на членовете",
"system": "Системна група",
"edit": "Редактиране",
"search-placeholder": "Търсене",

View File

@@ -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> &ndash; Попадения в черния списък за час",
"analytics.blacklist-daily": "<strong>Фигура 2</strong> &ndash; Попадения в черния списък за ден"
"alerts.applied-success": "Черният списък е приложен"
}

View File

@@ -1,11 +0,0 @@
{
"post-queue": "Опашка за публикации",
"description": "Няма публикации в опашката. <br> За да включите тази функционалност, идете в <a href=\"%1\">Настройки &rarr; Публикуване &rarr; Ограничения за публикуването</a> и включете <strong>Опашката за публикации</strong>.",
"user": "Потребител",
"category": "Категория",
"title": "Заглавие",
"content": "Съдържание",
"posted": "Публикувано",
"reply-to": "Отговор на „%1“",
"content-editable": "Можете да щракнете върху всеки от текстовете, за да ги редактирате преди публикуване."
}

View File

@@ -12,7 +12,6 @@
"manage/tags": "Етикети",
"manage/users": "Потребители",
"manage/registration": "Регистрационна опашка",
"manage/post-queue": "Опашка за публикации",
"manage/groups": "Групи",
"manage/ip-blacklist": "Черен списък за IP адреси",
@@ -39,7 +38,7 @@
"section-appearance": "Външен вид",
"appearance/themes": "Теми",
"appearance/skins": "Облици",
"appearance/customise": "Персонализирано съдържание (HTML/JS/CSS)",
"appearance/customise": "Персонализиран HTML и CSS",
"section-extend": "Разширяване",
"extend/plugins": "Добавки",
@@ -65,7 +64,7 @@
"logout": "Изход",
"view-forum": "Преглед на форума",
"search.placeholder": "Търсене на настройки",
"search.placeholder": "Търсене",
"search.no-results": "Няма резултати…",
"search.search-forum": "Търсене във форума за <strong></strong>",
"search.keep-typing": "Продължете да пишете, за да видите още резултати…",

View File

@@ -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": "Управление на трафика",

View File

@@ -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": "Връщане на оригинала",

View File

@@ -1,9 +1,6 @@
{
"site-settings": "Настройки на уеб сайта",
"title": "Заглавие на уеб сайта",
"title.url": "Адрес",
"title.url-placeholder": "Адресът на заглавието на уеб сайта",
"title.url-help": "При щракване върху заглавието, потребителите ще бъдат изпратени на този адрес. Ако бъде оставено празно, потребителите ще бъдат изпращани на началната страница на форума.",
"title.name": "Името на общността Ви",
"title.show-in-header": "Показване на заглавието на уеб сайта в заглавната част",
"browser-title": "Заглавие на браузъра",

View File

@@ -1,6 +1,5 @@
{
"notifications": "Известия",
"welcome-notification": "Приветствено известие",
"welcome-notification-link": "Връзка за приветственото известие",
"welcome-notification-uid": "Потр. ид. за приветственото известие"
"welcome-notification-link": "Връзка за приветственото известие"
}

View File

@@ -3,9 +3,7 @@
"enable": "Разделяне на темите и публикациите на страници, вместо да се превърта безкрайно.",
"topics": "Странициране в темите",
"posts-per-page": "Публикации на страница",
"max-posts-per-page": "Максимален брой публикации на страница",
"categories": "Странициране на категориите",
"topics-per-page": "Теми на страница",
"max-topics-per-page": "Максимален брой теми на страница",
"initial-num-load": "Начален брой теми, които да бъдат заредени за „непрочетени“, „скорошни“ и „популярни“"
}

View File

@@ -4,11 +4,8 @@
"sorting.oldest-to-newest": "Първо най-старите",
"sorting.newest-to-oldest": "Първо най-новите",
"sorting.most-votes": "Първо тези с най-много гласове",
"sorting.most-posts": "Първо тези с най-много публикации",
"sorting.topic-default": "Подредба по подразбиране на темите",
"restrictions": "Ограничения за публикуването",
"restrictions.post-queue": "Включване на опашката за публикации",
"restrictions.post-queue-help": "Ако опашката за публикации е включена, публикациите на новите потребители ще бъдат добавяни в опашка за одобрение.",
"restrictions.seconds-between": "Брой секунди между публикациите",
"restrictions.seconds-between-new": "Брой секунди между публикациите за нови потребители",
"restrictions.rep-threshold": "Необходима репутация за премахване на това ограничение",
@@ -32,8 +29,6 @@
"unread": "Настройки за непрочетените",
"unread.cutoff": "Възраст на публикациите, след която те не се показват в непрочетените (в брой дни)",
"unread.min-track-last": "Минимален брой публикации в темата, след което да започва следене на последно прочетената",
"recent": "Настройки за скорошните",
"recent.categoryFilter.disable": "Изключване на филтрирането на темите в пренебрегваните категории на страницата /recent",
"signature": "Настройки за подписите",
"signature.disable": "Забраняване на подписите",
"signature.no-links": "Забраняване на поставянето на връзки в подписите",

View File

@@ -13,14 +13,10 @@
"disable-email-changes": "Забраняване на промяната на е-пощата",
"disable-password-changes": "Забраняване на промяната на паролата",
"allow-account-deletion": "Позволяване на изтриването на профила",
"user-info-private": "Скриване на списъка от потребители и данните от гостите.",
"hide-fullname": "Скриване на пълното име от потребителите",
"hide-email": "Скриване на е-пощата от потребителите",
"user-info-private": "Потребителската информация да бъде частна",
"themes": "Теми",
"disable-user-skins": "Потребителите да не могат да избират собствен облик",
"account-protection": "Защита на акаунта",
"admin-relogin-duration": "Повторно вписване на администратора (в минути)",
"admin-relogin-duration-help": "След определено време достъпът до административния раздел ще изисква повторно вписване. Задайте 0, за да изключите това.",
"login-attempts": "Брой опити за вписване на час",
"login-attempts-help": "Ако опитите за вписване на потребител минат тази граница, акаунтът ще бъде заключен за определено време.",
"lockout-duration": "Продължителност на заключването на акаунта (в минути)",
@@ -38,12 +34,9 @@
"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": "Търсене на потребители",

View File

@@ -30,12 +30,7 @@
"notif.chat.unsub.info": "Това известие за разговор беше изпратено до Вас поради настройките Ви за абонаментите.",
"notif.post.cta": "Натиснете тук, за да прочетете цялата тема",
"notif.post.unsub.info": "Това известие за публикация беше изпратено до Вас поради настройките Ви за абонаментите.",
"notif.cta": "Натиснете тук, за да преминете към форума",
"test.text1": "Това е пробно е-писмо, за да потвърдим, че изпращачът на е-поща е правилно настроен за Вашия NodeBB.",
"unsub.cta": "Натиснете тук, за да промените тези настройки",
"banned.subject": "Вие бяхте блокиран(а) от %1",
"banned.text1": "Потребителят %1 беше блокиран от %2.",
"banned.text2": "Това блокиране ще е в сила до %1.",
"banned.text3": "Това е причината, поради която бяхте блокиран(а):",
"closing": "Благодарим Ви!"
}

View File

@@ -1,20 +1,17 @@
{
"invalid-data": "Грешни данни",
"invalid-json": "Неправилен JSON",
"not-logged-in": "Изглежда не сте се вписали в системата.",
"account-locked": "Вашият акаунт беше заключен временно",
"search-requires-login": "Търсенето изисква регистриран акаунт! Моля, впишете се или се регистрирайте!",
"goback": "Натиснете „Назад“, за да се върнете на предишната страница",
"invalid-cid": "Грешен идентификатор на категория",
"invalid-tid": "Грешен идентификатор на тема",
"invalid-pid": "Грешен идентификатор на публикация",
"invalid-uid": "Грешен идентификатор на потребител",
"invalid-username": "Грешно потребителско име",
"invalid-email": "Грешна е-поща",
"invalid-title": "Грешно заглавие",
"invalid-title": "Грешно заглавие!",
"invalid-user-data": "Грешни потребителски данни",
"invalid-password": "Грешна парола",
"invalid-login-credentials": "Неправилни данни за удостоверяване",
"invalid-username-or-password": "Моля, въведете потребителско име и парола",
"invalid-search-term": "Грешен текст за търсене",
"csrf-invalid": "Не успяхме да Ви впишем, най-вероятно защото сесията Ви е изтекла. Моля, опитайте отново",
@@ -33,7 +30,6 @@
"password-too-long": "Паролата е твърде дълга",
"user-banned": "Потребителят е блокиран",
"user-banned-reason": "За съжаление, този акаунт е блокиран (Причина: %1)",
"user-banned-reason-until": "За съжаление, този акаунт е блокиран до %1 (Причина: %2)",
"user-too-new": "Съжаляваме, но трябва да изчакате поне %1 секунда/и, преди да направите първата си публикация",
"blacklisted-ip": "Съжаляваме, но Вашият IP адрес е забранен за ползване в тази общност. Ако смятате, че това е грешка, моля, свържете се с администратор.",
"ban-expiry-missing": "Моля, задайте крайна дата за това блокиране",
@@ -81,7 +77,6 @@
"cant-ban-other-admins": "Не можете да блокирате другите администратори!",
"cant-remove-last-admin": "Вие сте единственият администратор. Добавете друг потребител като администратор, преди да премахнете себе си като администратор",
"cant-delete-admin": "Премахнете администраторските права от този акаунт, преди да го изтриете.",
"invalid-image": "Грешно изображение",
"invalid-image-type": "Грешен тип на изображение. Позволените типове са: %1",
"invalid-image-extension": "Грешно разширение на изображението",
"invalid-file-type": "Грешен тип на файл. Позволените типове са: %1",
@@ -109,7 +104,7 @@
"chat-disabled": "Системата за разговори е изключена",
"too-many-messages": "Изпратили сте твърде много съобщения. Моля, изчакайте малко.",
"invalid-chat-message": "Неправилно съобщение",
"chat-message-too-long": "Съобщенията в разговор не може да бъдат по-дълги от %1 знака.",
"chat-message-too-long": "Съобщението е твърде дълго",
"cant-edit-chat-message": "Нямате право да редактирате това съобщение",
"cant-remove-last-user": "Не можете да премахнете последния потребител",
"cant-delete-chat-message": "Нямате право да изтриете това съобщение",
@@ -119,13 +114,11 @@
"not-enough-reputation-to-downvote": "Нямате достатъчно репутация, за да гласувате отрицателно за тази публикация",
"not-enough-reputation-to-flag": "Нямате достатъчно репутация, за да докладвате тази публикация",
"already-flagged": "Вече сте докладвали тази публикация",
"self-vote": "Не можете да гласувате за собствената си публикация",
"reload-failed": "NodeBB срещна проблем при презареждането: „%1“. NodeBB ще продължи да поддържа съществуващите клиентски ресурси, но Вие трябва да отмените последните си действия преди презареждането.",
"registration-error": "Грешка при регистрацията",
"parse-error": "Нещо се обърка при прочитането на отговора на сървъра",
"wrong-login-type-email": "Моля, използвайте е-пощата си, за да се впишете",
"wrong-login-type-username": "Моля, използвайте потребителското си име, за да се впишете",
"sso-registration-disabled": "Регистрацията за акаунти от %1 беше забранена, моля, регистрирайте се първо с е-поща",
"invite-maximum-met": "Вие сте поканили максимално позволения брой хора (%1 от %2).",
"no-session-found": "Няма намерена сесия на вписване!",
"not-in-room": "Потребителят не е в стаята",
@@ -134,6 +127,5 @@
"no-users-selected": "Няма избран(и) потребител(и)",
"invalid-home-page-route": "Грешен път към началната страница",
"invalid-session": "Несъответствие в сесията",
"invalid-session-text": "Изглежда сесията Ви на вписване вече е изтекла или не съответства на сървъра. Моля, опреснете страницата.",
"no-topics-selected": "Няма избрани теми!"
"invalid-session-text": "Изглежда сесията Ви на вписване вече е изтекла или не съответства на сървъра. Моля, опреснете страницата."
}

View File

@@ -1,64 +0,0 @@
{
"state": "Състояние",
"reporter": "Докладвал",
"reported-at": "Докладвано на",
"description": "Описание",
"no-flags": "Ура! Няма намерени доклади.",
"assignee": "Назначен",
"update": "Обновяване",
"updated": "Обновено",
"target-purged": "Съдържанието, за което се отнася този доклад, е било изтрито и вече не е налично.",
"quick-filters": "Бързи филтри",
"filter-active": "В този списък с доклади има един или повече филтри",
"filter-reset": "Премахване на филтрите",
"filters": "Настройки на филтрите",
"filter-reporterId": "Потр. ид. на докладвалия",
"filter-targetUid": "Потр. ид. на докладвания",
"filter-type": "Вид на доклада",
"filter-type-all": "Всичко",
"filter-type-post": "Публикация",
"filter-state": "Състояние",
"filter-assignee": "Потр. ид. на назначения",
"filter-cid": "Категория",
"filter-quick-mine": "Назначени на мен",
"filter-cid-all": "Всички категории",
"apply-filters": "Прилагане на филтрите",
"quick-links": "Бързи връзки",
"flagged-user": "Докладван потребител",
"view-profile": "Преглед на профила",
"start-new-chat": "Започване на нов разговор",
"go-to-target": "Преглед на целта на доклада",
"user-view": "Преглед на профила",
"user-edit": "Редактиране на профила",
"notes": "Бележки към доклада",
"add-note": "Добавяне на бележка",
"no-notes": "Няма споделени бележки.",
"history": "История на доклада",
"back": "Обратно към списъка с доклади",
"no-history": "Няма история на доклада.",
"state-all": "Всички състояния",
"state-open": "Нов/отворен",
"state-wip": "В процес на работа",
"state-resolved": "Разрешен",
"state-rejected": "Отхвърлен",
"no-assignee": "Без назначение",
"note-added": "Бележката е добавена",
"modal-title": "Докладване на неуместно съдържание",
"modal-body": "Моля, посочете причината за докладването на %1 %2 за преглед. Или използвайте някой от бутоните за бързо докладване, ако са приложими.",
"modal-reason-spam": "Спам",
"modal-reason-offensive": "Обидно",
"modal-reason-other": "Друго (опишете по-долу)",
"modal-reason-custom": "Причина за докладването на това съдържание…",
"modal-submit": "Изпращане на доклада",
"modal-submit-success": "Съдържанието беше докладвано на модераторите.",
"modal-submit-confirm": "Потвърждаване на докладването",
"modal-submit-confirm-text": "Вече сте описали специалната си причина. Наистина ли искате да изпратите доклада си по бързата процедура?",
"modal-submit-confirm-text-help": "Изпращането на доклад по бързата процедура ще премахне описаната от Вас специалната причина."
}

View File

@@ -103,7 +103,5 @@
"cookies.message": "Този уеб сайт използва бисквитки, за да предостави услугите си по възможно най-добрия начин.",
"cookies.accept": "Разбрано!",
"cookies.learn_more": "Научете повече",
"edited": "Редактирано",
"disabled": "Изключено",
"select": "Избиране"
"edited": "Редактирано"
}

View File

@@ -20,7 +20,6 @@
"chat.three_months": "3 месеца",
"chat.delete_message_confirm": "Наистина ли искате да изтриете това съобщение?",
"chat.add-users-to-room": "Добавяне на потребители към стаята",
"chat.confirm-chat-with-dnd-user": "Този потребител е в състояние „не ме безпокойте“. Наистина ли искате да разговаряте с него?",
"composer.compose": "Писане",
"composer.show_preview": "Показване на прегледа",
"composer.hide_preview": "Скриване на прегледа",

View File

@@ -9,7 +9,6 @@
"continue_to": "Продължаване към %1",
"return_to": "Връщане към %1",
"new_notification": "Ново известие",
"new_notification_from": "Имате ново известие от %1",
"you_have_unread_notifications": "Имате непрочетени известия",
"all": "Всички",
"topics": "Теми",
@@ -42,23 +41,8 @@
"new_register": "<strong>%1</strong> изпрати заявка за регистрация.",
"new_register_multiple": "Има <strong>%1</strong> заявки за регистрация, които очакват да бъдат прегледани.",
"flag_assigned_to_you": "<strong>Докладът %1</strong> беше назначен на Вас",
"post_awaiting_review": "Публикацията чака да бъде прегледана",
"email-confirmed": "Е-пощата беше потвърдена",
"email-confirmed-message": "Благодарим Ви, че потвърдихте е-пощата си. Акаунтът Ви е вече напълно активиран.",
"email-confirm-error-message": "Възникна проблем при потвърждаването на е-пощата Ви. Може кодът да е грешен или давността му да е изтекла.",
"email-confirm-sent": "Изпратено е е-писмо за потвърждение.",
"none": "Нищо",
"notification_only": "Само известие",
"email_only": "Само е-писмо",
"notification_and_email": "Известие и е-писмо",
"notificationType_upvote": "Когато някой гласува положително за Ваша публикация",
"notificationType_new-topic": "Когато някой, когото следвате, публикува тема",
"notificationType_new-reply": "Когато бъде публикуван нов отговор в тема, която следвате",
"notificationType_follow": "Когато някой започне да Ви следва",
"notificationType_new-chat": "Когато получите съобщение в разговор",
"notificationType_group-invite": "Когато получите покана за група",
"notificationType_new-register": "Когато някой бъде добавен в опашката за регистрация",
"notificationType_post-queue": "Когато бъде добавена нова публикация в опашката",
"notificationType_new-post-flag": "Когато публикация бъде докладвана",
"notificationType_new-user-flag": "Когато потребител бъде докладван"
"email-confirm-sent": "Изпратено е е-писмо за потвърждение."
}

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