mirror of
https://github.com/NodeBB/NodeBB.git
synced 2026-05-07 04:16:53 +02:00
Merge commit 'a19537dc25e406a98048a561f45b3b321c9d3509' into v1.7.x
This commit is contained in:
1
.github/ISSUE_TEMPLATE.md
vendored
1
.github/ISSUE_TEMPLATE.md
vendored
@@ -2,6 +2,7 @@
|
||||
== 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 ++ -->
|
||||
|
||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -65,4 +65,4 @@ build
|
||||
test/files/normalise.jpg.png
|
||||
test/files/normalise-resized.jpg
|
||||
package-lock.json
|
||||
package.json
|
||||
/package.json
|
||||
|
||||
@@ -8,7 +8,7 @@ before_install:
|
||||
- "sudo service mongod start"
|
||||
before_script:
|
||||
- sleep 15 # wait for mongodb to be ready
|
||||
- cp package.default.json package.json
|
||||
- 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"
|
||||
|
||||
@@ -6,7 +6,7 @@ WORKDIR /usr/src/app
|
||||
|
||||
ARG NODE_ENV
|
||||
ENV NODE_ENV $NODE_ENV
|
||||
COPY package.default.json /usr/src/app/package.json
|
||||
COPY install/package.json /usr/src/app/package.json
|
||||
RUN npm install && npm cache clean --force
|
||||
COPY . /usr/src/app
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
[](https://gitter.im/NodeBB/NodeBB?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
||||
[](https://travis-ci.org/NodeBB/NodeBB)
|
||||
[](https://coveralls.io/github/NodeBB/NodeBB?branch=master)
|
||||
[](https://david-dm.org/nodebb/nodebb)
|
||||
[](https://david-dm.org/nodebb/nodebb?path=install)
|
||||
[](https://codeclimate.com/github/NodeBB/NodeBB)
|
||||
[](https://readthedocs.org/projects/nodebb/?badge=latest)
|
||||
|
||||
|
||||
267
app.js
267
app.js
@@ -30,47 +30,16 @@ nconf.argv().env({
|
||||
separator: '__',
|
||||
});
|
||||
|
||||
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');
|
||||
var debug = require('./src/meta/debugFork').debugging;
|
||||
|
||||
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')),
|
||||
});
|
||||
|
||||
if (debug) {
|
||||
var winstonCommon = require('winston/lib/winston/common');
|
||||
// Override to use real console.log etc for VSCode debugger
|
||||
winston.transports.Console.prototype.log = function (level, message, meta, callback) {
|
||||
const output = winstonCommon.log(Object.assign({}, this, {
|
||||
level,
|
||||
message,
|
||||
meta,
|
||||
}));
|
||||
|
||||
console[level in console ? level : 'log'](output);
|
||||
|
||||
setImmediate(callback, null, true);
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
// 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'));
|
||||
@@ -78,8 +47,10 @@ if (nconf.get('config')) {
|
||||
|
||||
var configExists = file.existsSync(configFile) || (nconf.get('url') && nconf.get('secret') && nconf.get('database'));
|
||||
|
||||
loadConfig();
|
||||
versionCheck();
|
||||
var prestart = require('./src/prestart');
|
||||
prestart.loadConfig(configFile);
|
||||
prestart.versionCheck();
|
||||
prestart.setupWinston();
|
||||
|
||||
if (!process.send) {
|
||||
// If run using `node app`, log GNU copyright info along with server info
|
||||
@@ -89,224 +60,40 @@ if (!process.send) {
|
||||
winston.info('');
|
||||
}
|
||||
|
||||
|
||||
if (nconf.get('setup') || nconf.get('install')) {
|
||||
setup();
|
||||
require('./src/cli/setup').setup();
|
||||
} else if (!configExists) {
|
||||
require('./install/web').install(nconf.get('port'));
|
||||
} else if (nconf.get('upgrade')) {
|
||||
upgrade();
|
||||
require('./src/cli/upgrade').upgrade(true);
|
||||
} else if (nconf.get('reset')) {
|
||||
async.waterfall([
|
||||
async.apply(require('./src/reset').reset),
|
||||
async.apply(require('./src/meta/build').buildAll),
|
||||
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,
|
||||
], function (err) {
|
||||
process.exit(err ? 1 : 0);
|
||||
if (err) {
|
||||
throw err;
|
||||
}
|
||||
|
||||
process.exit(0);
|
||||
});
|
||||
} else if (nconf.get('activate')) {
|
||||
activate();
|
||||
require('./src/cli/manage').activate(nconf.get('activate'));
|
||||
} else if (nconf.get('plugins')) {
|
||||
listPlugins();
|
||||
require('./src/cli/manage').listPlugins();
|
||||
} else if (nconf.get('build')) {
|
||||
require('./src/meta/build').build(nconf.get('build'));
|
||||
} else if (nconf.get('events')) {
|
||||
async.series([
|
||||
async.apply(require('./src/database').init),
|
||||
async.apply(require('./src/events').output),
|
||||
]);
|
||||
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);
|
||||
throw err;
|
||||
} 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');
|
||||
var tasks = [db.init, meta.configs.init];
|
||||
|
||||
if (nconf.get('upgrade') !== true) {
|
||||
// Likely an upgrade script name passed in
|
||||
tasks.push(async.apply(upgrade.runParticular, nconf.get('upgrade').split(',')));
|
||||
} else {
|
||||
tasks.push(upgrade.run, build.buildAll);
|
||||
}
|
||||
// disable mongo timeouts during upgrade
|
||||
nconf.set('mongo:options:socketTimeoutMS', 0);
|
||||
async.series(tasks, 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 events = require('./src/events');
|
||||
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 (next) {
|
||||
events.log({
|
||||
type: 'plugin-activate',
|
||||
text: plugin,
|
||||
}, next);
|
||||
},
|
||||
], function (err) {
|
||||
if (err) {
|
||||
winston.error('An error occurred during plugin activation', err);
|
||||
throw err;
|
||||
}
|
||||
process.exit(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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,5 +37,6 @@
|
||||
"unreadCutoff": 2,
|
||||
"bookmarkThreshold": 5,
|
||||
"topicsPerList": 20,
|
||||
"autoDetectLang": 1
|
||||
"autoDetectLang": 1,
|
||||
"privileges:flag": 0
|
||||
}
|
||||
|
||||
@@ -12,8 +12,7 @@ var questions = {
|
||||
module.exports = function (config, callback) {
|
||||
async.waterfall([
|
||||
function (next) {
|
||||
process.stdout.write('\n');
|
||||
winston.info('Now configuring ' + config.database + ' database:');
|
||||
winston.info('\nNow configuring ' + config.database + ' database:');
|
||||
getDatabaseConfig(config, next);
|
||||
},
|
||||
function (databaseConfig, next) {
|
||||
|
||||
140
install/package.json
Normal file
140
install/package.json
Normal file
@@ -0,0 +1,140 @@
|
||||
{
|
||||
"name": "nodebb",
|
||||
"license": "GPL-3.0",
|
||||
"description": "NodeBB Forum",
|
||||
"version": "1.7.0",
|
||||
"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.5.0",
|
||||
"autoprefixer": "7.1.6",
|
||||
"bcryptjs": "2.4.3",
|
||||
"benchpressjs": "^1.1.2",
|
||||
"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.8.5",
|
||||
"nodebb-plugin-composer-default": "6.0.6",
|
||||
"nodebb-plugin-dbsearch": "2.0.9",
|
||||
"nodebb-plugin-emoji": "2.0.5",
|
||||
"nodebb-plugin-emoji-android": "2.0.0",
|
||||
"nodebb-plugin-markdown": "8.2.0",
|
||||
"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.1",
|
||||
"nodebb-theme-slick": "1.1.2",
|
||||
"nodebb-theme-vanilla": "8.1.1",
|
||||
"nodebb-widget-essentials": "4.0.1",
|
||||
"nodemailer": "4.3.0",
|
||||
"passport": "^0.4.0",
|
||||
"passport-local": "1.0.0",
|
||||
"postcss": "6.0.13",
|
||||
"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.0.0",
|
||||
"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"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -5,6 +5,7 @@ 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');
|
||||
@@ -26,6 +27,7 @@ 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',
|
||||
@@ -53,7 +55,7 @@ web.install = function (port) {
|
||||
extended: true,
|
||||
}));
|
||||
|
||||
async.parallel([compileLess, compileJS], function (err) {
|
||||
async.parallel([compileLess, compileJS, copyCSS], function (err) {
|
||||
if (err) {
|
||||
winston.error(err);
|
||||
}
|
||||
@@ -77,10 +79,14 @@ function setupRoutes() {
|
||||
|
||||
function welcome(req, res) {
|
||||
var dbs = ['redis', 'mongo'];
|
||||
var databases = dbs.map(function (el) {
|
||||
var databases = dbs.map(function (databaseName) {
|
||||
var questions = require('../src/database/' + databaseName).questions.filter(function (question) {
|
||||
return question && !question.hideOnWebInstall;
|
||||
});
|
||||
|
||||
return {
|
||||
name: el,
|
||||
questions: require('../src/database/' + el).questions,
|
||||
name: databaseName,
|
||||
questions: questions,
|
||||
};
|
||||
});
|
||||
|
||||
@@ -122,24 +128,25 @@ function launch(req, res) {
|
||||
res.json({});
|
||||
server.close();
|
||||
|
||||
var child = require('child_process').spawn('node', ['loader.js'], {
|
||||
var child = childProcess.spawn('node', ['loader.js'], {
|
||||
detached: true,
|
||||
stdio: ['ignore', 'ignore', 'ignore'],
|
||||
});
|
||||
|
||||
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');
|
||||
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');
|
||||
|
||||
async.parallel([
|
||||
function (next) {
|
||||
fs.unlink(path.join(__dirname, '../public/installer.css'), next);
|
||||
},
|
||||
function (next) {
|
||||
fs.unlink(path.join(__dirname, '../public/installer.min.js'), next);
|
||||
},
|
||||
], function (err) {
|
||||
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) {
|
||||
if (err) {
|
||||
winston.warn('Unable to remove installer files');
|
||||
}
|
||||
@@ -194,4 +201,15 @@ function compileJS(callback) {
|
||||
});
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
module.exports = web;
|
||||
|
||||
547
nodebb
547
nodebb
@@ -2,549 +2,4 @@
|
||||
|
||||
'use strict';
|
||||
|
||||
var fs = require('fs');
|
||||
var path = require('path');
|
||||
var cproc = require('child_process');
|
||||
|
||||
var packageInstall = require('./src/meta/package-install');
|
||||
|
||||
// check to make sure dependencies are installed
|
||||
try {
|
||||
fs.readFileSync(path.join(__dirname, './package.json'));
|
||||
fs.readFileSync(path.join(__dirname, 'node_modules/async/package.json'));
|
||||
} catch (e) {
|
||||
if (e.code === 'ENOENT') {
|
||||
process.stdout.write('Dependencies not yet installed.\n');
|
||||
process.stdout.write('Installing them now...\n\n');
|
||||
|
||||
packageInstall.updatePackageFile();
|
||||
packageInstall.preserveExtraneousPlugins();
|
||||
packageInstall.npmInstallProduction();
|
||||
} else {
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
var minimist;
|
||||
var request;
|
||||
var semver;
|
||||
var prompt;
|
||||
var async;
|
||||
|
||||
try {
|
||||
require('colors');
|
||||
minimist = require('minimist');
|
||||
request = require('request');
|
||||
semver = require('semver');
|
||||
prompt = require('prompt');
|
||||
async = require('async');
|
||||
} catch (e) {
|
||||
process.stdout.write(
|
||||
'\x1b[31mNodeBB could not be initialised because there was an error while loading dependencies.\n' +
|
||||
'Please run "\x1b[33mnpm install --production\x1b[31m" and try again.\x1b[0m\n\n' +
|
||||
'For more information, please see: https://docs.nodebb.org/installing/os/\n\n'
|
||||
);
|
||||
|
||||
throw e;
|
||||
}
|
||||
|
||||
var args = minimist(process.argv.slice(2));
|
||||
|
||||
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, process.argv.slice(3), {
|
||||
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 () {
|
||||
if (process.argv[3]) {
|
||||
process.stdout.write('\nUpdating NodeBB data store schema...\n'.yellow);
|
||||
var arr = ['--upgrade'].concat(process.argv.slice(3));
|
||||
var upgradeProc = fork(arr);
|
||||
|
||||
return upgradeProc.on('close', function (err) {
|
||||
if (err) {
|
||||
process.stdout.write('Error occurred during upgrade');
|
||||
throw err;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
async.series([
|
||||
function (next) {
|
||||
packageInstall.updatePackageFile();
|
||||
packageInstall.preserveExtraneousPlugins();
|
||||
next();
|
||||
},
|
||||
function (next) {
|
||||
process.stdout.write('1. '.bold + 'Bringing base dependencies up to date... \n'.yellow);
|
||||
packageInstall.npmInstallProduction();
|
||||
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);
|
||||
upgradeProc.on('error', next);
|
||||
},
|
||||
], function (err) {
|
||||
if (err) {
|
||||
process.stdout.write('Error occurred during upgrade');
|
||||
throw err;
|
||||
}
|
||||
|
||||
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();
|
||||
},
|
||||
},
|
||||
events: {
|
||||
description: 'Outputs the last ten (10) administrative events recorded by NodeBB',
|
||||
usage: 'Usage: ' + './nodebb events'.yellow,
|
||||
handler: function () {
|
||||
fork(['--events']);
|
||||
},
|
||||
},
|
||||
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();
|
||||
}
|
||||
require('./src/cli');
|
||||
|
||||
@@ -1 +1 @@
|
||||
node ./nodebb %*
|
||||
@echo off && cd %~dp0 && node ./src/cli %*
|
||||
|
||||
@@ -1,137 +0,0 @@
|
||||
{
|
||||
"name": "nodebb",
|
||||
"license": "GPL-3.0",
|
||||
"description": "NodeBB Forum",
|
||||
"version": "1.7.0",
|
||||
"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.5.0",
|
||||
"autoprefixer": "7.1.6",
|
||||
"bcryptjs": "2.4.3",
|
||||
"benchpressjs": "^1.1.2",
|
||||
"body-parser": "^1.18.2",
|
||||
"bootstrap": "^3.3.7",
|
||||
"chart.js": "^2.7.0",
|
||||
"colors": "^1.1.2",
|
||||
"compression": "^1.7.1",
|
||||
"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",
|
||||
"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",
|
||||
"mime": "^2.0.3",
|
||||
"minimist": "^1.2.0",
|
||||
"mkdirp": "^0.5.1",
|
||||
"mongodb": "2.2.33",
|
||||
"morgan": "^1.9.0",
|
||||
"mousetrap": "^1.6.1",
|
||||
"nconf": "^0.8.5",
|
||||
"nodebb-plugin-composer-default": "6.0.5",
|
||||
"nodebb-plugin-dbsearch": "2.0.9",
|
||||
"nodebb-plugin-emoji-extended": "1.1.1",
|
||||
"nodebb-plugin-emoji-one": "1.2.1",
|
||||
"nodebb-plugin-markdown": "8.2.0",
|
||||
"nodebb-plugin-mentions": "2.2.0",
|
||||
"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.0.1",
|
||||
"nodebb-theme-slick": "1.1.2",
|
||||
"nodebb-theme-vanilla": "8.0.1",
|
||||
"nodebb-widget-essentials": "4.0.1",
|
||||
"nodemailer": "4.3.0",
|
||||
"passport": "^0.4.0",
|
||||
"passport-local": "1.0.0",
|
||||
"postcss": "6.0.13",
|
||||
"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.0.0",
|
||||
"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"
|
||||
},
|
||||
"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"
|
||||
}
|
||||
]
|
||||
}
|
||||
BIN
public/images/emails/digestheader.jpg
Normal file
BIN
public/images/emails/digestheader.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 12 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 8.2 KiB |
BIN
public/images/emails/notification.png
Normal file
BIN
public/images/emails/notification.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.6 KiB |
@@ -3,8 +3,12 @@
|
||||
"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": "Custom Javascript",
|
||||
"custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.",
|
||||
"custom-js.enable": "Enable Custom Javascript",
|
||||
|
||||
"custom-header": "Custom Header",
|
||||
"custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <code><head></code> section of your forum's markup.",
|
||||
"custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <code><head></code> section of your forum's markup. Script tags are allowed, but are discouraged, as the <a href=\"#custom-header\" data-toggle=\"tab\">Custom Javascript</a> tab is available.",
|
||||
"custom-header.enable": "Enable Custom Header",
|
||||
|
||||
"custom-css.livereload": "Enable Live Reload",
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
"section-appearance": "Appearance",
|
||||
"appearance/themes": "Themes",
|
||||
"appearance/skins": "Skins",
|
||||
"appearance/customise": "Custom HTML & CSS",
|
||||
"appearance/customise": "Custom Content (HTML/JS/CSS)",
|
||||
|
||||
"section-extend": "Extend",
|
||||
"extend/plugins": "Plugins",
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"notifications": "Notifications",
|
||||
"welcome-notification": "Welcome Notification",
|
||||
"welcome-notification-link": "Welcome Notification Link"
|
||||
"welcome-notification-link": "Welcome Notification Link",
|
||||
"welcome-notification-uid": "Welcome Notification User (UID)"
|
||||
}
|
||||
@@ -4,6 +4,7 @@
|
||||
"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",
|
||||
|
||||
@@ -19,6 +19,8 @@
|
||||
"themes": "Themes",
|
||||
"disable-user-skins": "Prevent users from choosing a custom skin",
|
||||
"account-protection": "Account Protection",
|
||||
"admin-relogin-duration": "Admin relogin duration (minutes)",
|
||||
"admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable",
|
||||
"login-attempts": "Login attempts per hour",
|
||||
"login-attempts-help": "If login attempts to a user's account exceeds this threshold, that account will be locked for a pre-configured amount of time",
|
||||
"lockout-duration": "Account Lockout Duration (minutes)",
|
||||
|
||||
@@ -30,6 +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",
|
||||
|
||||
@@ -119,6 +119,7 @@
|
||||
"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": "حدث خطأ ما أثناء تحليل استجابة الخادم",
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
"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",
|
||||
@@ -45,5 +46,19 @@
|
||||
"email-confirmed": "تم التحقق من عنوان البريد الإلكتروني",
|
||||
"email-confirmed-message": "شكرًا على إثبات صحة عنوان بريدك الإلكتروني. صار حسابك مفعلًا بالكامل.",
|
||||
"email-confirm-error-message": "حدث خطأ أثناء التحقق من عنوان بريدك الإلكتروني. ربما رمز التفعيل خاطئ أو انتهت صلاحيته.",
|
||||
"email-confirm-sent": "تم إرسال بريد التفعيل."
|
||||
"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"
|
||||
}
|
||||
@@ -79,8 +79,6 @@
|
||||
"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": "هذا المستخدم ليس لديه أي متابع :(",
|
||||
"follows_no_one": "هذا المستخدم لا يتابع أحد :(",
|
||||
@@ -103,6 +101,11 @@
|
||||
"outgoing-message-sound": "Outgoing message sound",
|
||||
"notification-sound": "Notification sound",
|
||||
"no-sound": "No sound",
|
||||
"upvote-notif-freq": "Upvote Notification Frequency",
|
||||
"upvote-notif-freq.all": "All Upvotes",
|
||||
"upvote-notif-freq.everyTen": "Every Ten Upvotes",
|
||||
"upvote-notif-freq.logarithmic": "On 10, 100, 1000...",
|
||||
"upvote-notif-freq.disabled": "Disabled",
|
||||
"browsing": "خيارات التصفح",
|
||||
"open_links_in_new_tab": "فتح الروابط الخارجية في نافدة جديدة",
|
||||
"enable_topic_searching": "تفعيل خاصية البحث داخل المواضيع",
|
||||
@@ -123,6 +126,9 @@
|
||||
"sso.title": "Single Sign-on Services",
|
||||
"sso.associated": "Associated with",
|
||||
"sso.not-associated": "Click here to associate with",
|
||||
"sso.dissociate": "Dissociate",
|
||||
"sso.dissociate-confirm-title": "Confirm Dissociation",
|
||||
"sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?",
|
||||
"info.latest-flags": "Latest Flags",
|
||||
"info.no-flags": "No Flagged Posts Found",
|
||||
"info.ban-history": "Recent Ban History",
|
||||
|
||||
@@ -3,8 +3,12 @@
|
||||
"custom-css.description": "Въведете своите собствени декларации за стилове, те ще бъдат приложени след всички останали стилове.",
|
||||
"custom-css.enable": "Включване на персонализиран CSS",
|
||||
|
||||
"custom-js": "Персонализиран код на Javascript",
|
||||
"custom-js.description": "Въведете свой собствен код на javascript тук. Той ще бъде изпълнен след като страницата се зареди напълно.",
|
||||
"custom-js.enable": "Включване на персонализирания код на Javascript",
|
||||
|
||||
"custom-header": "Персонализирана заглавна част",
|
||||
"custom-header.description": "Въведете своя персонализиран код HTML тук (напр. JavaScript, елементи „meta“ и т.н.), те ще бъдат добавени към секцията <code><head></code> в кода на Вашия форум.",
|
||||
"custom-header.description": "Въведете своя персонализиран код HTML тук (напр. елементи „meta“ и т.н.), те ще бъдат добавени към секцията <code><head></code> в кода на Вашия форум. Ползването на елементи „script“ е позволено, но непрепоръчително, тъй като за това можете да ползвате раздела <a href=\"#custom-header\" data-toggle=\"tab\">Персонализиран код на Javascript</a>.",
|
||||
"custom-header.enable": "Включване на персонализирана заглавна част",
|
||||
|
||||
"custom-css.livereload": "Включване на моменталното презареждане",
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
"section-appearance": "Външен вид",
|
||||
"appearance/themes": "Теми",
|
||||
"appearance/skins": "Облици",
|
||||
"appearance/customise": "Персонализиран HTML и CSS",
|
||||
"appearance/customise": "Персонализирано съдържание (HTML/JS/CSS)",
|
||||
|
||||
"section-extend": "Разширяване",
|
||||
"extend/plugins": "Добавки",
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"notifications": "Известия",
|
||||
"welcome-notification": "Приветствено известие",
|
||||
"welcome-notification-link": "Връзка за приветственото известие"
|
||||
"welcome-notification-link": "Връзка за приветственото известие",
|
||||
"welcome-notification-uid": "Потр. ид. за приветственото известие"
|
||||
}
|
||||
@@ -4,6 +4,7 @@
|
||||
"sorting.oldest-to-newest": "Първо най-старите",
|
||||
"sorting.newest-to-oldest": "Първо най-новите",
|
||||
"sorting.most-votes": "Първо тези с най-много гласове",
|
||||
"sorting.most-posts": "Първо тези с най-много публикации",
|
||||
"sorting.topic-default": "Подредба по подразбиране на темите",
|
||||
"restrictions": "Ограничения за публикуването",
|
||||
"restrictions.post-queue": "Включване на опашката за публикации",
|
||||
|
||||
@@ -19,6 +19,8 @@
|
||||
"themes": "Теми",
|
||||
"disable-user-skins": "Потребителите да не могат да избират собствен облик",
|
||||
"account-protection": "Защита на акаунта",
|
||||
"admin-relogin-duration": "Повторно вписване на администратора (в минути)",
|
||||
"admin-relogin-duration-help": "След определено време достъпът до административния раздел ще изисква повторно вписване. Задайте 0, за да изключите това.",
|
||||
"login-attempts": "Брой опити за вписване на час",
|
||||
"login-attempts-help": "Ако опитите за вписване на потребител минат тази граница, акаунтът ще бъде заключен за определено време.",
|
||||
"lockout-duration": "Продължителност на заключването на акаунта (в минути)",
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
"notif.chat.unsub.info": "Това известие за разговор беше изпратено до Вас поради настройките Ви за абонаментите.",
|
||||
"notif.post.cta": "Натиснете тук, за да прочетете цялата тема",
|
||||
"notif.post.unsub.info": "Това известие за публикация беше изпратено до Вас поради настройките Ви за абонаментите.",
|
||||
"notif.cta": "Натиснете тук, за да преминете към форума",
|
||||
"test.text1": "Това е пробно е-писмо, за да потвърдим, че изпращачът на е-поща е правилно настроен за Вашия NodeBB.",
|
||||
"unsub.cta": "Натиснете тук, за да промените тези настройки",
|
||||
"banned.subject": "Вие бяхте блокиран(а) от %1",
|
||||
|
||||
@@ -119,6 +119,7 @@
|
||||
"not-enough-reputation-to-downvote": "Нямате достатъчно репутация, за да гласувате отрицателно за тази публикация",
|
||||
"not-enough-reputation-to-flag": "Нямате достатъчно репутация, за да докладвате тази публикация",
|
||||
"already-flagged": "Вече сте докладвали тази публикация",
|
||||
"self-vote": "Не можете да гласувате за собствената си публикация",
|
||||
"reload-failed": "NodeBB срещна проблем при презареждането: „%1“. NodeBB ще продължи да поддържа съществуващите клиентски ресурси, но Вие трябва да отмените последните си действия преди презареждането.",
|
||||
"registration-error": "Грешка при регистрацията",
|
||||
"parse-error": "Нещо се обърка при прочитането на отговора на сървъра",
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
"continue_to": "Продължаване към %1",
|
||||
"return_to": "Връщане към %1",
|
||||
"new_notification": "Ново известие",
|
||||
"new_notification_from": "Имате ново известие от %1",
|
||||
"you_have_unread_notifications": "Имате непрочетени известия",
|
||||
"all": "Всички",
|
||||
"topics": "Теми",
|
||||
@@ -45,5 +46,19 @@
|
||||
"email-confirmed": "Е-пощата беше потвърдена",
|
||||
"email-confirmed-message": "Благодарим Ви, че потвърдихте е-пощата си. Акаунтът Ви е вече напълно активиран.",
|
||||
"email-confirm-error-message": "Възникна проблем при потвърждаването на е-пощата Ви. Може кодът да е грешен или давността му да е изтекла.",
|
||||
"email-confirm-sent": "Изпратено е е-писмо за потвърждение."
|
||||
"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": "Когато потребител бъде докладван"
|
||||
}
|
||||
@@ -79,15 +79,13 @@
|
||||
"digest_daily": "Ежедневно",
|
||||
"digest_weekly": "Ежеседмично",
|
||||
"digest_monthly": "Ежемесечно",
|
||||
"send_chat_notifications": "Изпращане на е-писмо, ако получа ново съобщение в разговор, а не съм на линия",
|
||||
"send_post_notifications": "Изпращане на е-писмо, когато се появи отговор в темите, за които съм абониран(а).",
|
||||
"settings-require-reload": "Някои промени в настройките изискват презареждане. Натиснете тук, за да презаредите страницата.",
|
||||
"has_no_follower": "Този потребител няма последователи :(",
|
||||
"follows_no_one": "Този потребител не следва никого :(",
|
||||
"has_no_posts": "Този потребител не е публикувал нищо досега.",
|
||||
"has_no_topics": "Този потребител не е създавал теми досега.",
|
||||
"has_no_watched_topics": "Този потребител не е следил нито една тема досега.",
|
||||
"has_no_ignored_topics": "Този потребител не е пренебрегнали нито една тема досега.",
|
||||
"has_no_ignored_topics": "Този потребител не е пренебрегнал нито една тема досега.",
|
||||
"has_no_upvoted_posts": "Този потребител не е гласувал положително досега.",
|
||||
"has_no_downvoted_posts": "Този потребител не е гласувал отрицателно досега.",
|
||||
"has_no_voted_posts": "Този потребител не е гласувал досега.",
|
||||
@@ -103,6 +101,11 @@
|
||||
"outgoing-message-sound": "Звук за изходящо съобщение",
|
||||
"notification-sound": "Звук за известие",
|
||||
"no-sound": "Без звук",
|
||||
"upvote-notif-freq": "Честота на известията за положителни гласове",
|
||||
"upvote-notif-freq.all": "Всички положителни гласове",
|
||||
"upvote-notif-freq.everyTen": "На всеки десет положителни гласа",
|
||||
"upvote-notif-freq.logarithmic": "На 10, 100, 1000…",
|
||||
"upvote-notif-freq.disabled": "Изключено",
|
||||
"browsing": "Настройки за страниците",
|
||||
"open_links_in_new_tab": "Отваряне на външните връзки в нов подпрозорец",
|
||||
"enable_topic_searching": "Включване на търсенето в темите",
|
||||
@@ -123,6 +126,9 @@
|
||||
"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": "Скорошна история на блокиранията",
|
||||
|
||||
@@ -3,8 +3,12 @@
|
||||
"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": "Custom Javascript",
|
||||
"custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.",
|
||||
"custom-js.enable": "Enable Custom Javascript",
|
||||
|
||||
"custom-header": "Custom Header",
|
||||
"custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <code><head></code> section of your forum's markup.",
|
||||
"custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <code><head></code> section of your forum's markup. Script tags are allowed, but are discouraged, as the <a href=\"#custom-header\" data-toggle=\"tab\">Custom Javascript</a> tab is available.",
|
||||
"custom-header.enable": "Enable Custom Header",
|
||||
|
||||
"custom-css.livereload": "Enable Live Reload",
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
"section-appearance": "Appearance",
|
||||
"appearance/themes": "Themes",
|
||||
"appearance/skins": "Skins",
|
||||
"appearance/customise": "Custom HTML & CSS",
|
||||
"appearance/customise": "Custom Content (HTML/JS/CSS)",
|
||||
|
||||
"section-extend": "Extend",
|
||||
"extend/plugins": "Plugins",
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"notifications": "Notifications",
|
||||
"welcome-notification": "Welcome Notification",
|
||||
"welcome-notification-link": "Welcome Notification Link"
|
||||
"welcome-notification-link": "Welcome Notification Link",
|
||||
"welcome-notification-uid": "Welcome Notification User (UID)"
|
||||
}
|
||||
@@ -4,6 +4,7 @@
|
||||
"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",
|
||||
|
||||
@@ -19,6 +19,8 @@
|
||||
"themes": "Themes",
|
||||
"disable-user-skins": "Prevent users from choosing a custom skin",
|
||||
"account-protection": "Account Protection",
|
||||
"admin-relogin-duration": "Admin relogin duration (minutes)",
|
||||
"admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable",
|
||||
"login-attempts": "Login attempts per hour",
|
||||
"login-attempts-help": "If login attempts to a user's account exceeds this threshold, that account will be locked for a pre-configured amount of time",
|
||||
"lockout-duration": "Account Lockout Duration (minutes)",
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
"notif.chat.unsub.info": "আপনার সাবস্ক্রীপশন সেটিংসের কারনে আপনার এই নোটিফিকেশন পাঠানো হয়েছে",
|
||||
"notif.post.cta": "পুরো বিষয়টি পড়তে এখানে ক্লিক করুন",
|
||||
"notif.post.unsub.info": "আপনার সাবস্ক্রিপশন সেটিংসের কারনে আপনার এই বার্তাটি পাঠানো হয়েছে",
|
||||
"notif.cta": "Click here to go to forum",
|
||||
"test.text1": "আপনি সঠিকভাবে নোডবিবির জন্য মেইলার সেটাপ করেছেন কিনা নিশ্চিত করার জন্য এই টেষ্ট ইমেইল পাঠানো হয়েছে",
|
||||
"unsub.cta": "সেটিংসগুলো পরিবর্তন করতে এখানে ক্লিক করুন",
|
||||
"banned.subject": "You have been banned from %1",
|
||||
|
||||
@@ -119,6 +119,7 @@
|
||||
"not-enough-reputation-to-downvote": "আপনার এই পোস্ট downvote করার জন্য পর্যাপ্ত সম্মাননা নেই",
|
||||
"not-enough-reputation-to-flag": "এই পোষ্টকে ফ্লাগ করার জন্য আপনার পর্যাপ্ত সম্মাননা নেই",
|
||||
"already-flagged": "You have already flagged this post",
|
||||
"self-vote": "You cannot vote on your own post",
|
||||
"reload-failed": "\"%1\" রিলোড করতে সমস্যা হয়েছে। রিলোডের পূর্বে যা করা হয়েছিল সেটি আনডু করা সমীচীন। ",
|
||||
"registration-error": "নিবন্ধন এরর!",
|
||||
"parse-error": "Something went wrong while parsing server response",
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
"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",
|
||||
@@ -45,5 +46,19 @@
|
||||
"email-confirmed": "ইমেইল নিশ্চিত করা হয়েছে",
|
||||
"email-confirmed-message": "আপনার ইমেইল যাচাই করার জন্য আপনাকে ধন্যবাদ। আপনার অ্যাকাউন্টটি এখন সম্পূর্ণরূপে সক্রিয়।",
|
||||
"email-confirm-error-message": "আপনার ইমেল ঠিকানার বৈধতা যাচাইয়ে একটি সমস্যা হয়েছে। সম্ভবত কোডটি ভুল ছিল অথবা কোডের মেয়াদ শেষ হয়ে গিয়েছে।",
|
||||
"email-confirm-sent": "নিশ্চিতকরণ ইমেইল পাঠানো হয়েছে।"
|
||||
"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"
|
||||
}
|
||||
@@ -79,8 +79,6 @@
|
||||
"digest_daily": "দৈনিক",
|
||||
"digest_weekly": "সাপ্তাহিক",
|
||||
"digest_monthly": "মাসিক",
|
||||
"send_chat_notifications": "যদি আমি অনলাইনে না থাকি, সেক্ষেত্রে নতুন চ্যাট মেসেজ আসলে আমাকে ইমেইল করুন",
|
||||
"send_post_notifications": "আমার সাবস্ক্রাইব করা টপিকগুলোতে রিপ্লাই করা হলে আমাকে মেইল করা হোক",
|
||||
"settings-require-reload": "কিছু কিছু পরিবর্তনের জন্য রিলোড করা আবশ্যক। পেজটি রিলোড করতে এখানে ক্লিক করুন",
|
||||
"has_no_follower": "এই সদস্যের কোন ফলোয়ার নেই :(",
|
||||
"follows_no_one": "এই সদস্য কাউকে ফলো করছেন না :(",
|
||||
@@ -103,6 +101,11 @@
|
||||
"outgoing-message-sound": "Outgoing message sound",
|
||||
"notification-sound": "Notification sound",
|
||||
"no-sound": "No sound",
|
||||
"upvote-notif-freq": "Upvote Notification Frequency",
|
||||
"upvote-notif-freq.all": "All Upvotes",
|
||||
"upvote-notif-freq.everyTen": "Every Ten Upvotes",
|
||||
"upvote-notif-freq.logarithmic": "On 10, 100, 1000...",
|
||||
"upvote-notif-freq.disabled": "Disabled",
|
||||
"browsing": "Browsing সেটিংস",
|
||||
"open_links_in_new_tab": "আউটগোয়িং লিংকগুলো নতুন ট্যাবে খুলুন",
|
||||
"enable_topic_searching": "In-Topic সার্চ সক্রীয় করো",
|
||||
@@ -123,6 +126,9 @@
|
||||
"sso.title": "Single Sign-on Services",
|
||||
"sso.associated": "Associated with",
|
||||
"sso.not-associated": "Click here to associate with",
|
||||
"sso.dissociate": "Dissociate",
|
||||
"sso.dissociate-confirm-title": "Confirm Dissociation",
|
||||
"sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?",
|
||||
"info.latest-flags": "Latest Flags",
|
||||
"info.no-flags": "No Flagged Posts Found",
|
||||
"info.ban-history": "Recent Ban History",
|
||||
|
||||
@@ -3,8 +3,12 @@
|
||||
"custom-css.description": "Zadejte vlastní deklarace CSS, které budou použity na všechny ostatních styly.",
|
||||
"custom-css.enable": "Povolit uživatelské CSS",
|
||||
|
||||
"custom-js": "Custom Javascript",
|
||||
"custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.",
|
||||
"custom-js.enable": "Enable Custom Javascript",
|
||||
|
||||
"custom-header": "Uživatelská hlavička",
|
||||
"custom-header.description": "Zadejte zde uživatelské HTML (např.: javascript, meta značky, atp.), které bude přiřazeno k <code><head></code> části značek vašeho fóra.",
|
||||
"custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <code><head></code> section of your forum's markup. Script tags are allowed, but are discouraged, as the <a href=\"#custom-header\" data-toggle=\"tab\">Custom Javascript</a> tab is available.",
|
||||
"custom-header.enable": "Povolit uživatelskou hlavičku",
|
||||
|
||||
"custom-css.livereload": "Povolit aktuální znovu načtení",
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
"section-appearance": "Vzhled",
|
||||
"appearance/themes": "Motivy",
|
||||
"appearance/skins": "Vzhledy",
|
||||
"appearance/customise": "Uživatelské HTML a CSS",
|
||||
"appearance/customise": "Custom Content (HTML/JS/CSS)",
|
||||
|
||||
"section-extend": "Rozšířit",
|
||||
"extend/plugins": "Rozšíření",
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"notifications": "Oznámení",
|
||||
"welcome-notification": "Uvítání",
|
||||
"welcome-notification-link": "Odkaz na uvítání"
|
||||
"welcome-notification-link": "Odkaz na uvítání",
|
||||
"welcome-notification-uid": "Welcome Notification User (UID)"
|
||||
}
|
||||
@@ -4,6 +4,7 @@
|
||||
"sorting.oldest-to-newest": "Od nejstarších po nejnovější",
|
||||
"sorting.newest-to-oldest": "Od nejnovějších po nejstarší",
|
||||
"sorting.most-votes": "Dle hlasování",
|
||||
"sorting.most-posts": "Most Posts",
|
||||
"sorting.topic-default": "Výchozí třídění tématu",
|
||||
"restrictions": "Omezení příspěvků",
|
||||
"restrictions.post-queue": "Povolit frontu pro příspěvky",
|
||||
|
||||
@@ -19,6 +19,8 @@
|
||||
"themes": "Motivy",
|
||||
"disable-user-skins": "Zabránit uživateli ve výběru vlastního vzhledu",
|
||||
"account-protection": "Ochrana účtu",
|
||||
"admin-relogin-duration": "Admin relogin duration (minutes)",
|
||||
"admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable",
|
||||
"login-attempts": "Počet pokusů o přihlášení za hodinu",
|
||||
"login-attempts-help": "Překročí-li pokusy o přihlášení uživatele/ů tuto hranici, účet bude uzamknut na určený čas",
|
||||
"lockout-duration": "Délka blokování účtu (v minutách)",
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
"notif.chat.unsub.info": "Toto upozornění na chat vám bylo odesláno na základě vašeho nastavení odběru.",
|
||||
"notif.post.cta": "Klikněte zde pro přečtené celého tématu",
|
||||
"notif.post.unsub.info": "Toto upozornění na příspěvek vám bylo odesláno na základě vašeho nastavení odběru.",
|
||||
"notif.cta": "Click here to go to forum",
|
||||
"test.text1": "Tento testovací e-mail slouží k ověření, že je e-mailer správně nastaven pro práci s NodeBB.",
|
||||
"unsub.cta": "Chcete-li změnit tyto nastavení, klikněte zde.",
|
||||
"banned.subject": "Byl jste zablokován od %1",
|
||||
|
||||
@@ -119,6 +119,7 @@
|
||||
"not-enough-reputation-to-downvote": "Nemáte dostatečnou reputaci pro vyjádření nesouhlasu u tohoto příspěvku",
|
||||
"not-enough-reputation-to-flag": "Pro označení tohoto příspěvku nemáte dostatečnou reputaci",
|
||||
"already-flagged": "Tento příspěvek jste již označil",
|
||||
"self-vote": "You cannot vote on your own post",
|
||||
"reload-failed": "Vyskytla se chyba v NodeBB při znovu načtení: \"%1\". NodeBB bude pokračovat v běhu na straně klienta, nicméně byste měl/a přenastavit zpět to, co jste udělal/a před opětovným načtením.",
|
||||
"registration-error": "Chyba při registraci",
|
||||
"parse-error": "Při analýze odpovědi serveru nastala chyba",
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
"continue_to": "Pokračovat na %1",
|
||||
"return_to": "Vrátit se na %1",
|
||||
"new_notification": "Nové upozornění",
|
||||
"new_notification_from": "You have a new Notification from %1",
|
||||
"you_have_unread_notifications": "Máte nepřečtená upozornění.",
|
||||
"all": "Vše",
|
||||
"topics": "Témata",
|
||||
@@ -45,5 +46,19 @@
|
||||
"email-confirmed": "E-mail potvrzen",
|
||||
"email-confirmed-message": "Děkujeme za ověření vaší e-mailové adresy. Váš účet je nyní aktivní.",
|
||||
"email-confirm-error-message": "Nastal problém s ověřením vaší e-mailové adresy. Kód je pravděpodobně neplatný nebo jeho platnost vypršela.",
|
||||
"email-confirm-sent": "Ověřovací e-mail odeslán."
|
||||
"email-confirm-sent": "Ověřovací e-mail odeslán.",
|
||||
"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"
|
||||
}
|
||||
@@ -79,8 +79,6 @@
|
||||
"digest_daily": "Denně",
|
||||
"digest_weekly": "Týdně",
|
||||
"digest_monthly": "Měsíčně",
|
||||
"send_chat_notifications": "Odeslat e-mail, dorazí-li nová zpráva chatu a já nejsem připojen",
|
||||
"send_post_notifications": "Zaslat e-mail, přibudou-li nové odpovědi k tématu, kde mám přihlášen odběr",
|
||||
"settings-require-reload": "Některá nastavení vyžadují znovu načtení. Pro znovu načtení stránky, klikněte zde.",
|
||||
"has_no_follower": "Tohoto uživatele nikdo nesleduje :(",
|
||||
"follows_no_one": "Tento uživatel nikoho nesleduje :(",
|
||||
@@ -103,6 +101,11 @@
|
||||
"outgoing-message-sound": "Zvuk odchozí zprávy",
|
||||
"notification-sound": "Zvuk oznámení",
|
||||
"no-sound": "Bez zvuku",
|
||||
"upvote-notif-freq": "Upvote Notification Frequency",
|
||||
"upvote-notif-freq.all": "All Upvotes",
|
||||
"upvote-notif-freq.everyTen": "Every Ten Upvotes",
|
||||
"upvote-notif-freq.logarithmic": "On 10, 100, 1000...",
|
||||
"upvote-notif-freq.disabled": "Disabled",
|
||||
"browsing": "Nastavení prohlížení",
|
||||
"open_links_in_new_tab": "Otevřít odchozí odkaz v nové záložce",
|
||||
"enable_topic_searching": "Povolit vyhledávání v tématu",
|
||||
@@ -123,6 +126,9 @@
|
||||
"sso.title": "Služby jednotného přihlášení",
|
||||
"sso.associated": "Přiřazeno k",
|
||||
"sso.not-associated": "Zde klikněte pro přiřazení k",
|
||||
"sso.dissociate": "Dissociate",
|
||||
"sso.dissociate-confirm-title": "Confirm Dissociation",
|
||||
"sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?",
|
||||
"info.latest-flags": "Poslední označené",
|
||||
"info.no-flags": "Nebyly nalezeny žádné označené příspěvky",
|
||||
"info.ban-history": "Poslední historie blokovaných",
|
||||
|
||||
@@ -3,8 +3,12 @@
|
||||
"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": "Custom Javascript",
|
||||
"custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.",
|
||||
"custom-js.enable": "Enable Custom Javascript",
|
||||
|
||||
"custom-header": "Custom Header",
|
||||
"custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <code><head></code> section of your forum's markup.",
|
||||
"custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <code><head></code> section of your forum's markup. Script tags are allowed, but are discouraged, as the <a href=\"#custom-header\" data-toggle=\"tab\">Custom Javascript</a> tab is available.",
|
||||
"custom-header.enable": "Enable Custom Header",
|
||||
|
||||
"custom-css.livereload": "Enable Live Reload",
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
"section-appearance": "Appearance",
|
||||
"appearance/themes": "Themes",
|
||||
"appearance/skins": "Skins",
|
||||
"appearance/customise": "Custom HTML & CSS",
|
||||
"appearance/customise": "Custom Content (HTML/JS/CSS)",
|
||||
|
||||
"section-extend": "Extend",
|
||||
"extend/plugins": "Plugins",
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"notifications": "Notifications",
|
||||
"welcome-notification": "Welcome Notification",
|
||||
"welcome-notification-link": "Welcome Notification Link"
|
||||
"welcome-notification-link": "Welcome Notification Link",
|
||||
"welcome-notification-uid": "Welcome Notification User (UID)"
|
||||
}
|
||||
@@ -4,6 +4,7 @@
|
||||
"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",
|
||||
|
||||
@@ -19,6 +19,8 @@
|
||||
"themes": "Themes",
|
||||
"disable-user-skins": "Prevent users from choosing a custom skin",
|
||||
"account-protection": "Account Protection",
|
||||
"admin-relogin-duration": "Admin relogin duration (minutes)",
|
||||
"admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable",
|
||||
"login-attempts": "Login attempts per hour",
|
||||
"login-attempts-help": "If login attempts to a user's account exceeds this threshold, that account will be locked for a pre-configured amount of time",
|
||||
"lockout-duration": "Account Lockout Duration (minutes)",
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
"notif.chat.unsub.info": "Denne chat notifikation blev sendt til dig pga. indstillingerne i dit abonnement.",
|
||||
"notif.post.cta": "Klik her for a læse hele emnet",
|
||||
"notif.post.unsub.info": "Denne indlægs notifikation var sendt pga. dine abonnering indstillinger.",
|
||||
"notif.cta": "Click here to go to forum",
|
||||
"test.text1": "Dette er en test email for at kontrollere, at den udgående email server er opsat korrekt i forhold til din NodeBB installation.",
|
||||
"unsub.cta": "Klik her for at ændre disse indstillinger",
|
||||
"banned.subject": "You have been banned from %1",
|
||||
|
||||
@@ -119,6 +119,7 @@
|
||||
"not-enough-reputation-to-downvote": "Du har ikke nok omdømme til at nedstemme dette indlæg",
|
||||
"not-enough-reputation-to-flag": "Du har ikke nok omdømme til at vurdere dette indlæg",
|
||||
"already-flagged": "Du har allerede vurderet dette indlæg",
|
||||
"self-vote": "You cannot vote on your own post",
|
||||
"reload-failed": "NodeBB stødte på et problem under genindlæsningen : \"%1\". NodeBB vil fortsætte med en ældre version, og det er nok god ide at genoptage fra lige før du genindlæste siden.",
|
||||
"registration-error": "Registeringsfejl",
|
||||
"parse-error": "Noget gik galt under fortolknings er serverens respons",
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
"continue_to": "Fortsæt til %1",
|
||||
"return_to": "Returnere til %t",
|
||||
"new_notification": "Ny notifikation",
|
||||
"new_notification_from": "You have a new Notification from %1",
|
||||
"you_have_unread_notifications": "Du har ulæste notifikationer.",
|
||||
"all": "All",
|
||||
"topics": "Topics",
|
||||
@@ -45,5 +46,19 @@
|
||||
"email-confirmed": "Email bekræftet",
|
||||
"email-confirmed-message": "Tak fordi du validerede din email. Din konto er nu fuldt ud aktiveret.",
|
||||
"email-confirm-error-message": "Der var et problem med valideringen af din emailadresse. Bekræftelses koden var muligvis forkert eller udløbet.",
|
||||
"email-confirm-sent": "Bekræftelses email afsendt."
|
||||
"email-confirm-sent": "Bekræftelses email afsendt.",
|
||||
"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"
|
||||
}
|
||||
@@ -79,8 +79,6 @@
|
||||
"digest_daily": "Daglig",
|
||||
"digest_weekly": "Ugentlig",
|
||||
"digest_monthly": "Månedlig",
|
||||
"send_chat_notifications": "Send en email hvis en ny chat besked er modtaget og jeg ikke er online",
|
||||
"send_post_notifications": "Send en email når der er skrevet svar til indlæg jeg abonnere på",
|
||||
"settings-require-reload": "Nogle indstillinger kræver en genindlæsning. Klik her for at genindlæse siden.",
|
||||
"has_no_follower": "Denne bruger har ingen følgere :(",
|
||||
"follows_no_one": "Denne bruger følger ikke nogen :(",
|
||||
@@ -103,6 +101,11 @@
|
||||
"outgoing-message-sound": "Udgående besked lyd",
|
||||
"notification-sound": "Meddelelse lyd",
|
||||
"no-sound": "Ingen lyd",
|
||||
"upvote-notif-freq": "Upvote Notification Frequency",
|
||||
"upvote-notif-freq.all": "All Upvotes",
|
||||
"upvote-notif-freq.everyTen": "Every Ten Upvotes",
|
||||
"upvote-notif-freq.logarithmic": "On 10, 100, 1000...",
|
||||
"upvote-notif-freq.disabled": "Disabled",
|
||||
"browsing": "Gennemsenings indstillinger",
|
||||
"open_links_in_new_tab": "Åben udgående link i en ny tab",
|
||||
"enable_topic_searching": "Slå In-Topic søgning til",
|
||||
@@ -123,6 +126,9 @@
|
||||
"sso.title": "Enkeltgangs Sign-on Servicer",
|
||||
"sso.associated": "Forbundet med",
|
||||
"sso.not-associated": "Klik her for at forbinde med",
|
||||
"sso.dissociate": "Dissociate",
|
||||
"sso.dissociate-confirm-title": "Confirm Dissociation",
|
||||
"sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?",
|
||||
"info.latest-flags": "Latest Flags",
|
||||
"info.no-flags": "No Flagged Posts Found",
|
||||
"info.ban-history": "Recent Ban History",
|
||||
|
||||
@@ -3,8 +3,12 @@
|
||||
"custom-css.description": "Füge hier deine eigenen CSS-Eigenschaften ein, sie werden als letztes angewendet.",
|
||||
"custom-css.enable": "Benutzerdefiniertes CSS aktivieren",
|
||||
|
||||
"custom-js": "Custom Javascript",
|
||||
"custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.",
|
||||
"custom-js.enable": "Enable Custom Javascript",
|
||||
|
||||
"custom-header": "Benutzerdefinierter Header",
|
||||
"custom-header.description": "Füge hier dein benutzerdefiniertes HTML (z.B. Javascript, Meta Tags, usw.) ein, welches in den <code><head></code> Tag eingefügt werden soll.",
|
||||
"custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <code><head></code> section of your forum's markup. Script tags are allowed, but are discouraged, as the <a href=\"#custom-header\" data-toggle=\"tab\">Custom Javascript</a> tab is available.",
|
||||
"custom-header.enable": "Benutzerdefinierten Header aktivieren",
|
||||
|
||||
"custom-css.livereload": "Live-Aktualisierung aktivieren",
|
||||
|
||||
@@ -7,5 +7,5 @@
|
||||
"content": "Inhalt",
|
||||
"posted": "Gepostet",
|
||||
"reply-to": "Auf \"%1\" antworten",
|
||||
"content-editable": "You can click on individual content to edit before posting."
|
||||
"content-editable": "Du kannst auf den einzelnen Inhalt klicken um ihn zu ändern bevor du ihn postest."
|
||||
}
|
||||
@@ -39,7 +39,7 @@
|
||||
"section-appearance": "Aussehen",
|
||||
"appearance/themes": "Themes",
|
||||
"appearance/skins": "Skins",
|
||||
"appearance/customise": "Benutzerdefiniertes HTML & CSS",
|
||||
"appearance/customise": "Custom Content (HTML/JS/CSS)",
|
||||
|
||||
"section-extend": "Erweitert",
|
||||
"extend/plugins": "Plugins",
|
||||
@@ -65,7 +65,7 @@
|
||||
"logout": "Abmelden",
|
||||
"view-forum": "Forum anzeigen",
|
||||
|
||||
"search.placeholder": "Search for settings",
|
||||
"search.placeholder": "Nach Einstellungen suchen",
|
||||
"search.no-results": "Keine Ergebnisse...",
|
||||
"search.search-forum": "Suche im Forum nach <strong></strong>",
|
||||
"search.keep-typing": "Gib mehr ein, um die Ergebnisse zu sehen...",
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"notifications": "Benachrichtigungen",
|
||||
"welcome-notification": "Wilkommensnachricht",
|
||||
"welcome-notification-link": "Wilkommensnachricht-Link"
|
||||
"welcome-notification-link": "Wilkommensnachricht-Link",
|
||||
"welcome-notification-uid": "Welcome Notification User (UID)"
|
||||
}
|
||||
@@ -3,9 +3,9 @@
|
||||
"enable": "Themen in Seiten einteilen anstatt endlos zu scrollen",
|
||||
"topics": "Themen Seitennummerierung",
|
||||
"posts-per-page": "Beiträge pro Seite",
|
||||
"max-posts-per-page": "Maximum posts per page",
|
||||
"max-posts-per-page": "Maximale Anzahl von Beiträgen pro Seite",
|
||||
"categories": "Kategorie Seitennummerierung",
|
||||
"topics-per-page": "Themen pro Seite",
|
||||
"max-topics-per-page": "Maximum topics per page",
|
||||
"max-topics-per-page": "Maximale Anzahl von Themen pro Seite",
|
||||
"initial-num-load": "Ursprüngliche Anzahl an Themen, die bei ungelesen, aktuell und beliebt geladen werden sollen"
|
||||
}
|
||||
@@ -4,6 +4,7 @@
|
||||
"sorting.oldest-to-newest": "Von Alt bis Neu",
|
||||
"sorting.newest-to-oldest": "Von Neu zu Alt",
|
||||
"sorting.most-votes": "Meiste Bewertungen",
|
||||
"sorting.most-posts": "Most Posts",
|
||||
"sorting.topic-default": "Standardmäßige Themensortierung",
|
||||
"restrictions": "Posting beschränkungen",
|
||||
"restrictions.post-queue": "Beitragswarteschlange verwenden",
|
||||
|
||||
@@ -19,6 +19,8 @@
|
||||
"themes": "Themes",
|
||||
"disable-user-skins": "Verhindere das Benutzer eigene Skins verwenden",
|
||||
"account-protection": "Kontosicherheit",
|
||||
"admin-relogin-duration": "Admin relogin duration (minutes)",
|
||||
"admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable",
|
||||
"login-attempts": "Login-Versuche pro Stunde",
|
||||
"login-attempts-help": "Wenn die loginversuche zu einem Account diese Schwelle überschreiten, wird dieser Account für eine festgelegte Zeit gesperrt",
|
||||
"lockout-duration": "Account Aussperrzeitraum (Minuten)",
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
"notif.chat.unsub.info": "Diese Chat-Benachrichtigung wurde dir aufgrund deiner Abonnement-Einstellungen gesendet.",
|
||||
"notif.post.cta": "Hier klicken, um das gesamte Thema zu lesen",
|
||||
"notif.post.unsub.info": "Diese Mitteilung wurde dir aufgrund deiner Abonnement-Einstellungen gesendet.",
|
||||
"notif.cta": "Click here to go to forum",
|
||||
"test.text1": "Dies ist eine Test-E-Mail, um zu überprüfen, ob der E-Mailer deines NodeBB korrekt eingestellt wurde.",
|
||||
"unsub.cta": "Klicke hier, um diese Einstellungen zu ändern",
|
||||
"banned.subject": "Du wurdest von %1 gebannt.",
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
"invalid-uid": "Ungültige Benutzer-ID",
|
||||
"invalid-username": "Ungültiger Benutzername",
|
||||
"invalid-email": "Ungültige E-Mail-Adresse",
|
||||
"invalid-title": "Invalid title",
|
||||
"invalid-title": "Ungültiger Titel",
|
||||
"invalid-user-data": "Ungültige Benutzerdaten",
|
||||
"invalid-password": "Ungültiges Passwort",
|
||||
"invalid-login-credentials": "Ungültige Zugangsdaten",
|
||||
@@ -81,7 +81,7 @@
|
||||
"cant-ban-other-admins": "Du kannst andere Administratoren nicht sperren!",
|
||||
"cant-remove-last-admin": "Du bist der einzige Administrator. Füge zuerst einen anderen Administrator hinzu, bevor du dich selbst als Administrator entfernst",
|
||||
"cant-delete-admin": "Bevor du versuchst dieses Konto zu löschen, entferne die zugehörigen Administratorrechte.",
|
||||
"invalid-image": "Invalid image",
|
||||
"invalid-image": "Ungültiges Bild",
|
||||
"invalid-image-type": "Falsche Bildart. Erlaubte Arten sind: %1",
|
||||
"invalid-image-extension": "Ungültige Dateinamenerweiterung",
|
||||
"invalid-file-type": "Ungültiger Dateityp. Erlaubte Typen sind: %1",
|
||||
@@ -119,6 +119,7 @@
|
||||
"not-enough-reputation-to-downvote": "Dein Ansehen ist zu niedrig, um diesen Beitrag negativ zu bewerten.",
|
||||
"not-enough-reputation-to-flag": "Dein Ansehen ist zu niedrig, um diesen Beitrag zu melden",
|
||||
"already-flagged": "Du hast diesen Beitrag bereits gemeldet",
|
||||
"self-vote": "Du kannst deine eigenen Beiträge nicht bewerten",
|
||||
"reload-failed": "Es ist ein Problem während des Reloads von NodeBB aufgetreten: \"%1\". NodeBB wird weiterhin clientseitige Assets bereitstellen, allerdings solltest du das, was du vor dem Reload gemacht hast, rückgängig machen.",
|
||||
"registration-error": "Registrierungsfehler",
|
||||
"parse-error": "Beim auswerten der Serverantwort ist etwas schiefgegangen",
|
||||
|
||||
@@ -54,11 +54,11 @@
|
||||
"modal-body": "Bitte geben Sie den Grund an, weshalb Sie %1 %2 melden wollen. Alternativ können Sie einen der Schnell-Meldungs-Knöpfe verwenden, wenn anwendbar.",
|
||||
"modal-reason-spam": "Spam",
|
||||
"modal-reason-offensive": "Beleidigend",
|
||||
"modal-reason-other": "Other (specify below)",
|
||||
"modal-reason-other": "Anderer (unten Angegeben)",
|
||||
"modal-reason-custom": "Grund für die Meldung dieses Inhalts...",
|
||||
"modal-submit": "Meldung abschicken",
|
||||
"modal-submit-success": "Der Inhalt wurde gemeldet.",
|
||||
"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."
|
||||
"modal-submit-confirm": "Einreichung bestätigen",
|
||||
"modal-submit-confirm-text": "Du hast bereits einen benutzerdefinierten Grund angegeben. Bis du sicher, dass du per schnell-funktion abschicken willst?",
|
||||
"modal-submit-confirm-text-help": "Das einreichen per schnell-funktion werden alle näher angegebenen Gründe ignoriert."
|
||||
}
|
||||
@@ -9,6 +9,7 @@
|
||||
"continue_to": "Fortfahren zu %1",
|
||||
"return_to": "Kehre zurück zu %1",
|
||||
"new_notification": "Neue Benachrichtigung",
|
||||
"new_notification_from": "You have a new Notification from %1",
|
||||
"you_have_unread_notifications": "Du hast ungelesene Benachrichtigungen.",
|
||||
"all": "Alle",
|
||||
"topics": "Themen",
|
||||
@@ -45,5 +46,19 @@
|
||||
"email-confirmed": "E-Mail bestätigt",
|
||||
"email-confirmed-message": "Vielen Dank für Ihre E-Mail-Validierung. Ihr Konto ist nun vollständig aktiviert.",
|
||||
"email-confirm-error-message": "Es gab ein Problem bei der Validierung Ihrer E-Mail-Adresse. Möglicherweise ist der Code ungültig oder abgelaufen.",
|
||||
"email-confirm-sent": "Bestätigungs-E-Mail gesendet."
|
||||
"email-confirm-sent": "Bestätigungs-E-Mail gesendet.",
|
||||
"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"
|
||||
}
|
||||
@@ -44,7 +44,7 @@
|
||||
"account/bookmarks": "Lesezeichen von %1",
|
||||
"account/settings": "Benutzer-Einstellungen",
|
||||
"account/watched": "Von %1 beobachtete Themen",
|
||||
"account/ignored": "Topics ignored by %1",
|
||||
"account/ignored": "Ignorierte Themen von %1",
|
||||
"account/upvoted": "Von %1 positiv bewertete Beiträge",
|
||||
"account/downvoted": "Von %1 negativ bewertete Beiträge",
|
||||
"account/best": "Bestbewertete Beiträge von %1",
|
||||
|
||||
@@ -10,6 +10,6 @@
|
||||
"all-topics": "Alle Themen",
|
||||
"new-topics": "Neue Themen",
|
||||
"watched-topics": "Beobachtete Themen",
|
||||
"unreplied-topics": "Unreplied Topics",
|
||||
"multiple-categories-selected": "Multiple Selected"
|
||||
"unreplied-topics": "Unbeantwortete Themen",
|
||||
"multiple-categories-selected": "Mehrere ausgewählt"
|
||||
}
|
||||
@@ -25,7 +25,7 @@
|
||||
"reputation": "Ansehen",
|
||||
"bookmarks": "Lesezeichen",
|
||||
"watched": "Beobachtet",
|
||||
"ignored": "Ignored",
|
||||
"ignored": "Ignoriert",
|
||||
"followers": "Follower",
|
||||
"following": "Folge ich",
|
||||
"aboutme": "Über mich",
|
||||
@@ -79,15 +79,13 @@
|
||||
"digest_daily": "Täglich",
|
||||
"digest_weekly": "Wöchentlich",
|
||||
"digest_monthly": "Monatlich",
|
||||
"send_chat_notifications": "Sende eine E-Mail, wenn eine neue Chat-Nachricht eingeht während ich nicht online bin",
|
||||
"send_post_notifications": "Sende eine E-Mail bei Antworten auf Themen die ich abonniert habe.",
|
||||
"settings-require-reload": "Einige Einstellungsänderung benötigen eine Aktualisierung. Hier klicken um die Seite neu zu laden.",
|
||||
"has_no_follower": "Diesem Benutzer folgt noch niemand. :(",
|
||||
"follows_no_one": "Dieser Benutzer folgt noch niemandem. :(",
|
||||
"has_no_posts": "Dieser Benutzer hat noch nichts geschrieben.",
|
||||
"has_no_topics": "Dieser Benutzer hat noch keine Themen erstellt.",
|
||||
"has_no_watched_topics": "Dieser Benutzer beobachtet keine Themen.",
|
||||
"has_no_ignored_topics": "This user hasn't ignored any topics yet.",
|
||||
"has_no_ignored_topics": "Dieser Benutzer ignoriert bisher keine Themen.",
|
||||
"has_no_upvoted_posts": "Dieser Benutzer hat bisher keine Beiträge positiv bewertet.",
|
||||
"has_no_downvoted_posts": "Dieser Benutzer hat bisher keine Beiträge negativ bewertet.",
|
||||
"has_no_voted_posts": "Dieser Benutzer hat keine bewerteten Beiträge.",
|
||||
@@ -96,13 +94,18 @@
|
||||
"paginate_description": "Themen und Beiträge in Seiten aufteilen, anstatt unendlich zu scrollen",
|
||||
"topics_per_page": "Themen pro Seite",
|
||||
"posts_per_page": "Beiträge pro Seite",
|
||||
"max_items_per_page": "Maximum %1",
|
||||
"max_items_per_page": "Maximal %1",
|
||||
"notification_sounds": "Ton abspielen, wenn du eine Benachrichtigung erhältst",
|
||||
"notifications_and_sounds": "Benachrichtigungen & Klänge",
|
||||
"incoming-message-sound": "Ton bei empfangener Nachricht",
|
||||
"outgoing-message-sound": "Ton bei versendeter Nachricht",
|
||||
"notification-sound": "Benachrichtigungston ",
|
||||
"no-sound": "Kein Ton",
|
||||
"upvote-notif-freq": "Benachrichtigungshäufigkeit für positive Bewertungen",
|
||||
"upvote-notif-freq.all": "Alle positiven Bewertungen",
|
||||
"upvote-notif-freq.everyTen": "Alle 10 positiven Bewertungen",
|
||||
"upvote-notif-freq.logarithmic": "Bei 10, 100, 1000...",
|
||||
"upvote-notif-freq.disabled": "Deaktiviert",
|
||||
"browsing": "Browsing",
|
||||
"open_links_in_new_tab": "Ausgehende Links in neuem Tab öffnen",
|
||||
"enable_topic_searching": "Suchen innerhalb von Themen aktivieren",
|
||||
@@ -123,6 +126,9 @@
|
||||
"sso.title": "Single Sign-on Dienste",
|
||||
"sso.associated": "Verbunden mit",
|
||||
"sso.not-associated": "Verbinde dich mit",
|
||||
"sso.dissociate": "Trennen",
|
||||
"sso.dissociate-confirm-title": "Trennung bestätigen",
|
||||
"sso.dissociate-confirm": "Bist du sicher, dass du deinen Account von %1 trennen willst?",
|
||||
"info.latest-flags": "Neuste Meldungen",
|
||||
"info.no-flags": "Keine gemeldeten Beiträge gefunden",
|
||||
"info.ban-history": "Sperrungsverlauf",
|
||||
|
||||
@@ -3,8 +3,12 @@
|
||||
"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": "Custom Javascript",
|
||||
"custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.",
|
||||
"custom-js.enable": "Enable Custom Javascript",
|
||||
|
||||
"custom-header": "Custom Header",
|
||||
"custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <code><head></code> section of your forum's markup.",
|
||||
"custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <code><head></code> section of your forum's markup. Script tags are allowed, but are discouraged, as the <a href=\"#custom-header\" data-toggle=\"tab\">Custom Javascript</a> tab is available.",
|
||||
"custom-header.enable": "Enable Custom Header",
|
||||
|
||||
"custom-css.livereload": "Enable Live Reload",
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
"section-appearance": "Appearance",
|
||||
"appearance/themes": "Themes",
|
||||
"appearance/skins": "Skins",
|
||||
"appearance/customise": "Custom HTML & CSS",
|
||||
"appearance/customise": "Custom Content (HTML/JS/CSS)",
|
||||
|
||||
"section-extend": "Extend",
|
||||
"extend/plugins": "Plugins",
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"notifications": "Ειδοποιήσεις",
|
||||
"welcome-notification": "Ειδοποίηση καλωσορίσματος",
|
||||
"welcome-notification-link": "Welcome Notification Link"
|
||||
"welcome-notification-link": "Welcome Notification Link",
|
||||
"welcome-notification-uid": "Welcome Notification User (UID)"
|
||||
}
|
||||
@@ -4,6 +4,7 @@
|
||||
"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",
|
||||
|
||||
@@ -19,6 +19,8 @@
|
||||
"themes": "Themes",
|
||||
"disable-user-skins": "Prevent users from choosing a custom skin",
|
||||
"account-protection": "Account Protection",
|
||||
"admin-relogin-duration": "Admin relogin duration (minutes)",
|
||||
"admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable",
|
||||
"login-attempts": "Login attempts per hour",
|
||||
"login-attempts-help": "If login attempts to a user's account exceeds this threshold, that account will be locked for a pre-configured amount of time",
|
||||
"lockout-duration": "Account Lockout Duration (minutes)",
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
"notif.chat.unsub.info": "Αυτή η ειδοποίηση για συνομιλία σου στάλθηκε λόγω των ρυθμίσεών σου. ",
|
||||
"notif.post.cta": "Click here to read the full topic",
|
||||
"notif.post.unsub.info": "This post notification was sent to you due to your subscription settings.",
|
||||
"notif.cta": "Click here to go to forum",
|
||||
"test.text1": "Αυτό είναι ένα δοκιμαστικό email για να επιβεβαιώσουμε ότι ο emailer έχει στηθεί σωστά για το NodeBB.",
|
||||
"unsub.cta": "Κάνε κλικ εδώ για να αλλάξεις αυτές τις ρυθμίσεις",
|
||||
"banned.subject": "You have been banned from %1",
|
||||
|
||||
@@ -119,6 +119,7 @@
|
||||
"not-enough-reputation-to-downvote": "Δεν έχεις αρκετή φήμη για να καταψηφίσεις αυτή την δημοσίευση",
|
||||
"not-enough-reputation-to-flag": "You do not have enough reputation to flag this post",
|
||||
"already-flagged": "You have already flagged this post",
|
||||
"self-vote": "You cannot vote on your own post",
|
||||
"reload-failed": "Το NodeBB συνάντησε ένα πρόβλημα καθώς γινόταν η ανανέωση: \"%1\". Το NodeBB θα συνεχίσει να προσφέρει τα στοιχεία του χρήστη, αν και θα ήταν καλή ιδέα να επαναφέρεις ότι έκανες πριν την ανανέωση.",
|
||||
"registration-error": "Registration Error",
|
||||
"parse-error": "Something went wrong while parsing server response",
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
"continue_to": "Continue to %1",
|
||||
"return_to": "Return to %1",
|
||||
"new_notification": "New Notification",
|
||||
"new_notification_from": "You have a new Notification from %1",
|
||||
"you_have_unread_notifications": "You have unread notifications.",
|
||||
"all": "All",
|
||||
"topics": "Topics",
|
||||
@@ -45,5 +46,19 @@
|
||||
"email-confirmed": "Email Confirmed",
|
||||
"email-confirmed-message": "Thank you for validating your email. Your account is now fully activated.",
|
||||
"email-confirm-error-message": "There was a problem validating your email address. Perhaps the code was invalid or has expired.",
|
||||
"email-confirm-sent": "Στάλθηκε email επιβεβαίωσης."
|
||||
"email-confirm-sent": "Στάλθηκε email επιβεβαίωσης.",
|
||||
"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"
|
||||
}
|
||||
@@ -79,8 +79,6 @@
|
||||
"digest_daily": "Ημερήσια",
|
||||
"digest_weekly": "Εβδομαδιαίως",
|
||||
"digest_monthly": "Μηνιαία",
|
||||
"send_chat_notifications": "Αποστολή email αν μου έρθει μήνυμα συνομιλίας και δεν είμαι συνδεδεμένος",
|
||||
"send_post_notifications": "Send an email when replies are made to topics I am subscribed to",
|
||||
"settings-require-reload": "Some setting changes require a reload. Click here to reload the page.",
|
||||
"has_no_follower": "Αυτός ο χρήστης δεν έχει κανέναν ακόλουθο :(",
|
||||
"follows_no_one": "Αυτός ο χρήστης δεν ακολουθεί κανέναν :(",
|
||||
@@ -103,6 +101,11 @@
|
||||
"outgoing-message-sound": "Outgoing message sound",
|
||||
"notification-sound": "Notification sound",
|
||||
"no-sound": "No sound",
|
||||
"upvote-notif-freq": "Upvote Notification Frequency",
|
||||
"upvote-notif-freq.all": "All Upvotes",
|
||||
"upvote-notif-freq.everyTen": "Every Ten Upvotes",
|
||||
"upvote-notif-freq.logarithmic": "On 10, 100, 1000...",
|
||||
"upvote-notif-freq.disabled": "Disabled",
|
||||
"browsing": "Επιλογές Περιήγησης",
|
||||
"open_links_in_new_tab": "Open outgoing links in new tab",
|
||||
"enable_topic_searching": "Enable In-Topic Searching",
|
||||
@@ -123,6 +126,9 @@
|
||||
"sso.title": "Single Sign-on Services",
|
||||
"sso.associated": "Associated with",
|
||||
"sso.not-associated": "Click here to associate with",
|
||||
"sso.dissociate": "Dissociate",
|
||||
"sso.dissociate-confirm-title": "Confirm Dissociation",
|
||||
"sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?",
|
||||
"info.latest-flags": "Latest Flags",
|
||||
"info.no-flags": "No Flagged Posts Found",
|
||||
"info.ban-history": "Recent Ban History",
|
||||
|
||||
@@ -19,6 +19,8 @@
|
||||
"themes": "Themes",
|
||||
"disable-user-skins": "Prevent users from choosing a custom skin",
|
||||
"account-protection": "Account Protection",
|
||||
"admin-relogin-duration": "Admin relogin duration (minutes)",
|
||||
"admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable",
|
||||
"login-attempts": "Login attempts per hour",
|
||||
"login-attempts-help": "If login attempts to a user's account exceeds this threshold, that account will be locked for a pre-configured amount of time",
|
||||
"lockout-duration": "Account Lockout Duration (minutes)",
|
||||
|
||||
@@ -40,6 +40,8 @@
|
||||
"notif.post.cta": "Click here to read the full topic",
|
||||
"notif.post.unsub.info": "This post notification was sent to you due to your subscription settings.",
|
||||
|
||||
"notif.cta": "Click here to go to forum",
|
||||
|
||||
"test.text1": "This is a test email to verify that the emailer is set up correctly for your NodeBB.",
|
||||
|
||||
"unsub.cta": "Click here to alter those settings",
|
||||
|
||||
@@ -144,6 +144,7 @@
|
||||
"not-enough-reputation-to-downvote": "You do not have enough reputation to downvote this post",
|
||||
"not-enough-reputation-to-flag": "You do not have enough reputation to flag this post",
|
||||
"already-flagged": "You have already flagged this post",
|
||||
"self-vote": "You cannot vote on your own post",
|
||||
|
||||
"reload-failed": "NodeBB encountered a problem while reloading: \"%1\". NodeBB will continue to serve the existing client-side assets, although you should undo what you did just prior to reloading.",
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
"continue_to": "Continue to %1",
|
||||
"return_to": "Return to %1",
|
||||
"new_notification": "New Notification",
|
||||
"new_notification_from": "You have a new Notification from %1",
|
||||
"you_have_unread_notifications": "You have unread notifications.",
|
||||
|
||||
"all": "All",
|
||||
@@ -50,5 +51,20 @@
|
||||
"email-confirmed": "Email Confirmed",
|
||||
"email-confirmed-message": "Thank you for validating your email. Your account is now fully activated.",
|
||||
"email-confirm-error-message": "There was a problem validating your email address. Perhaps the code was invalid or has expired.",
|
||||
"email-confirm-sent": "Confirmation email sent."
|
||||
"email-confirm-sent": "Confirmation email 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"
|
||||
}
|
||||
|
||||
@@ -84,8 +84,6 @@
|
||||
"digest_daily": "Daily",
|
||||
"digest_weekly": "Weekly",
|
||||
"digest_monthly": "Monthly",
|
||||
"send_chat_notifications": "Send an email if a new chat message arrives and I am not online",
|
||||
"send_post_notifications": "Send an email when replies are made to topics I am subscribed to",
|
||||
"settings-require-reload": "Some setting changes require a reload. Click here to reload the page.",
|
||||
|
||||
"has_no_follower": "This user doesn't have any followers :(",
|
||||
@@ -112,6 +110,11 @@
|
||||
"outgoing-message-sound": "Outgoing message sound",
|
||||
"notification-sound": "Notification sound",
|
||||
"no-sound": "No sound",
|
||||
"upvote-notif-freq": "Upvote Notification Frequency",
|
||||
"upvote-notif-freq.all": "All Upvotes",
|
||||
"upvote-notif-freq.everyTen": "Every Ten Upvotes",
|
||||
"upvote-notif-freq.logarithmic": "On 10, 100, 1000...",
|
||||
"upvote-notif-freq.disabled": "Disabled",
|
||||
|
||||
"browsing": "Browsing Settings",
|
||||
"open_links_in_new_tab": "Open outgoing links in new tab",
|
||||
@@ -141,6 +144,9 @@
|
||||
"sso.title": "Single Sign-on Services",
|
||||
"sso.associated": "Associated with",
|
||||
"sso.not-associated": "Click here to associate with",
|
||||
"sso.dissociate": "Dissociate",
|
||||
"sso.dissociate-confirm-title": "Confirm Dissociation",
|
||||
"sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?",
|
||||
|
||||
"info.latest-flags": "Latest Flags",
|
||||
"info.no-flags": "No Flagged Posts Found",
|
||||
|
||||
@@ -3,8 +3,12 @@
|
||||
"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": "Custom Javascript",
|
||||
"custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.",
|
||||
"custom-js.enable": "Enable Custom Javascript",
|
||||
|
||||
"custom-header": "Custom Header",
|
||||
"custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <code><head></code> section of your forum's markup.",
|
||||
"custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <code><head></code> section of your forum's markup. Script tags are allowed, but are discouraged, as the <a href=\"#custom-header\" data-toggle=\"tab\">Custom Javascript</a> tab is available.",
|
||||
"custom-header.enable": "Enable Custom Header",
|
||||
|
||||
"custom-css.livereload": "Enable Live Reload",
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
"section-appearance": "Appearance",
|
||||
"appearance/themes": "Themes",
|
||||
"appearance/skins": "Skins",
|
||||
"appearance/customise": "Custom HTML & CSS",
|
||||
"appearance/customise": "Custom Content (HTML/JS/CSS)",
|
||||
|
||||
"section-extend": "Extend",
|
||||
"extend/plugins": "Plugins",
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"notifications": "Notifications",
|
||||
"welcome-notification": "Welcome Notification",
|
||||
"welcome-notification-link": "Welcome Notification Link"
|
||||
"welcome-notification-link": "Welcome Notification Link",
|
||||
"welcome-notification-uid": "Welcome Notification User (UID)"
|
||||
}
|
||||
@@ -4,6 +4,7 @@
|
||||
"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",
|
||||
|
||||
@@ -19,6 +19,8 @@
|
||||
"themes": "Themes",
|
||||
"disable-user-skins": "Prevent users from choosing a custom skin",
|
||||
"account-protection": "Account Protection",
|
||||
"admin-relogin-duration": "Admin relogin duration (minutes)",
|
||||
"admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable",
|
||||
"login-attempts": "Login attempts per hour",
|
||||
"login-attempts-help": "If login attempts to a user's account exceeds this threshold, that account will be locked for a pre-configured amount of time",
|
||||
"lockout-duration": "Account Lockout Duration (minutes)",
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
"notif.chat.unsub.info": "This chat notification was sent to you due to your subscription settings.",
|
||||
"notif.post.cta": "Click here to read the full topic",
|
||||
"notif.post.unsub.info": "This post notification was sent to you due to your subscription settings.",
|
||||
"notif.cta": "Click here to go to forum",
|
||||
"test.text1": "This is a test email to verify that the emailer is set up correctly for your NodeBB.",
|
||||
"unsub.cta": "Click here to alter those settings",
|
||||
"banned.subject": "You have been banned from %1",
|
||||
|
||||
@@ -119,6 +119,7 @@
|
||||
"not-enough-reputation-to-downvote": "You do not have enough reputation to downvote this post",
|
||||
"not-enough-reputation-to-flag": "You do not have enough reputation to flag this post",
|
||||
"already-flagged": "You have already flagged this post",
|
||||
"self-vote": "You cannot vote on your own post",
|
||||
"reload-failed": "NodeBB encountered a problem while reloading: \"%1\". NodeBB will continue to serve the existing client-side assets, although you should undo what you did just prior to reloading.",
|
||||
"registration-error": "Registration Error",
|
||||
"parse-error": "Something went wrong while parsing server response",
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
"continue_to": "Continue to %1",
|
||||
"return_to": "Return to %1",
|
||||
"new_notification": "New Notification",
|
||||
"new_notification_from": "You have a new Notification from %1",
|
||||
"you_have_unread_notifications": "You have unread notifications.",
|
||||
"all": "All",
|
||||
"topics": "Topics",
|
||||
@@ -45,5 +46,19 @@
|
||||
"email-confirmed": "Email Confirmed",
|
||||
"email-confirmed-message": "Thank you for validating your email. Your account is now fully activated.",
|
||||
"email-confirm-error-message": "There was a problem validating your email address. Perhaps the code was invalid or has expired.",
|
||||
"email-confirm-sent": "Confirmation email sent."
|
||||
"email-confirm-sent": "Confirmation email 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"
|
||||
}
|
||||
@@ -79,8 +79,6 @@
|
||||
"digest_daily": "Daily",
|
||||
"digest_weekly": "Weekly",
|
||||
"digest_monthly": "Monthly",
|
||||
"send_chat_notifications": "Send an email if a new chat message arrives and I am not online",
|
||||
"send_post_notifications": "Send an email when replies are made to topics I am subscribed to",
|
||||
"settings-require-reload": "Some setting changes require a reload. Click here to reload the page.",
|
||||
"has_no_follower": "This user doesn't have any followers :(",
|
||||
"follows_no_one": "This user isn't following anyone :(",
|
||||
@@ -103,6 +101,11 @@
|
||||
"outgoing-message-sound": "Outgoing message sound",
|
||||
"notification-sound": "Notification sound",
|
||||
"no-sound": "No sound",
|
||||
"upvote-notif-freq": "Upvote Notification Frequency",
|
||||
"upvote-notif-freq.all": "All Upvotes",
|
||||
"upvote-notif-freq.everyTen": "Every Ten Upvotes",
|
||||
"upvote-notif-freq.logarithmic": "On 10, 100, 1000...",
|
||||
"upvote-notif-freq.disabled": "Disabled",
|
||||
"browsing": "Browsing Settings",
|
||||
"open_links_in_new_tab": "Open outgoing links in new tab",
|
||||
"enable_topic_searching": "Enable In-Topic Searching",
|
||||
@@ -123,6 +126,9 @@
|
||||
"sso.title": "Single Sign-on Services",
|
||||
"sso.associated": "Associated with",
|
||||
"sso.not-associated": "Click here to associate with",
|
||||
"sso.dissociate": "Dissociate",
|
||||
"sso.dissociate-confirm-title": "Confirm Dissociation",
|
||||
"sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?",
|
||||
"info.latest-flags": "Latest Flags",
|
||||
"info.no-flags": "No Flagged Posts Found",
|
||||
"info.ban-history": "Recent Ban History",
|
||||
|
||||
@@ -3,8 +3,12 @@
|
||||
"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": "Custom Javascript",
|
||||
"custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.",
|
||||
"custom-js.enable": "Enable Custom Javascript",
|
||||
|
||||
"custom-header": "Custom Header",
|
||||
"custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <code><head></code> section of your forum's markup.",
|
||||
"custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <code><head></code> section of your forum's markup. Script tags are allowed, but are discouraged, as the <a href=\"#custom-header\" data-toggle=\"tab\">Custom Javascript</a> tab is available.",
|
||||
"custom-header.enable": "Enable Custom Header",
|
||||
|
||||
"custom-css.livereload": "Enable Live Reload",
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
"section-appearance": "Appearance",
|
||||
"appearance/themes": "Themes",
|
||||
"appearance/skins": "Skins",
|
||||
"appearance/customise": "Custom HTML & CSS",
|
||||
"appearance/customise": "Custom Content (HTML/JS/CSS)",
|
||||
|
||||
"section-extend": "Extend",
|
||||
"extend/plugins": "Plugins",
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user