Compare commits

..

12 Commits

Author SHA1 Message Date
Julian Lam
d341428ca1 0.5.2 2014-10-18 00:27:37 -04:00
Julian Lam
b81b5fdf50 updated shrinkwrap file 2014-10-18 00:22:29 -04:00
Julian Lam
964e2b09a9 Merge branch 'master' into v0.5.x 2014-10-18 00:18:57 -04:00
Julian Lam
62477c7d9b fixed #2214 - each individual thread will create its own logrotate write handler, because if one is closed, everything crashes in a cascade effect because we're calling .write() after .end(), bleh. 2014-10-13 14:20:23 -04:00
Barış Soner Uşaklı
c3c560a48a Merge pull request #2216 from kazrudys/v0.5.x
Fix for Outgoing Links Warning page being displayed in IE for internal links
2014-10-03 11:38:11 -04:00
Kaz Rudys
740fae7fd8 Fix for Outgoing Links Warning page being displayed in IE for internal links.
IE appears to set the 'host' property of anchor tags to "" for internal links, this was causing all internal links to be treated as external and therefore being rewritten to point at the Outgoing Link Warning page at /outgoing/
2014-10-03 09:04:38 +01:00
Julian Lam
598784b909 Merge pull request #2192 from Fusselwurm/patch-1
fix 403 handling in ajaxify.js
2014-10-01 02:16:39 -04:00
Moritz Schmidt
bc44aeac4b fix 403 handling in ajaxify.js
Fix typo from dedf7a6715
2014-10-01 08:14:48 +02:00
Julian Lam
0b806e16d5 Revert "bumping to 0.5.2 for dev purposes"
This reverts commit e6824fd727.
2014-10-01 00:31:09 -04:00
Julian Lam
575ce47d52 Merge branch 'master' into v0.5.x 2014-10-01 00:30:29 -04:00
Julian Lam
7c14e6f894 added shrinkwrap file 2014-10-01 00:00:52 -04:00
Julian Lam
8bf3c484cc removing console.log 2014-09-30 23:58:52 -04:00
1424 changed files with 30504 additions and 79106 deletions

View File

@@ -1,8 +0,0 @@
# Save as .codeclimate.yml (note leading .) in project root directory
languages:
Ruby: true
JavaScript: true
PHP: true
exclude_paths:
- "public/vendor/*"
- "tests/*"

View File

@@ -1,8 +1,4 @@
root = true root = true
[{*.js, *.css, *.tpl, *.json}] [*.js, *.css, *.tpl]
indent_style = tab indent_style = tab
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = false

13
.gitattributes vendored
View File

@@ -1,13 +0,0 @@
# These files are text and should be normalized (convert crlf => lf)
*.json text
*.css text
*.less text
*.tpl text
*.html text
*.js text
*.md text
# Images should be treated as binary
# (binary is a macro for -text -diff)
*.png binary
*.jpg binary

View File

@@ -1,66 +0,0 @@
# Submitting a Pull Request to NodeBB?
First of all, thank you! Please consider this [style guide](https://docs.nodebb.org/en/latest/contributing/style-guide.html) when submitting your changes. Also, please join our [community](https://community.nodebb.org) to meet other NodeBB developers and designers :)
## Contributor License Agreement
Thank you for considering contributing to NodeBB. **Before you are able to submit a pull request, please take a moment to read our [contributor license agreement](https://gist.github.com/psychobunny/65946d7aa8854b12fab9)** and agree to it on the pull request page on GitHub. In summary, signing this document means that 1) you own the code that you are contributing and 2) you give permission to NodeBB Inc. to license the code to others. This agreement applies to any repository under the NodeBB organization.
If you are writing contributions as part of employment from another company / individual, then your employer will need to sign a separate agreement. Please [contact us](mailto:accounts@nodebb.org) so that we can send this additional agreement to your employer.
# Having problems installing NodeBB?
Chances are somebody has run into this problem before. After consulting our [documentation](https://docs.nodebb.org/en/latest/installing/os.html), please head over to our [community support forum](https://community.nodebb.org) for advice.
# Found a Security Vulnerability?
If you believe you have identified a security vulnerability with NodeBB, report it as soon as possible via email to **security@nodebb.org**.
A member of the NodeBB security team will respond to the issue.
Please do not post it to the public bug tracker.
# Issues & Bugs
Thanks for reporting an issue with NodeBB! Please follow these guidelines in order to streamline the debugging process. The more guidelines you follow, the easier it will be for us to reproduce your problem.
In general, if we can't reproduce it, we can't fix it!
## Try the latest version of NodeBB
There is a chance that the issue you are experiencing may have already been fixed.
## Provide the NodeBB version number and git hash
You can find the NodeBB version number in the Admin Control Panel (ACP), as well as the first line output to the shell when running NodeBB
``` plaintext
info: NodeBB v0.5.2-dev Copyright (C) 2013-2014 NodeBB Inc.
info: This program comes with ABSOLUTELY NO WARRANTY.
info: This is free software, and you are welcome to redistribute it under certain conditions.
info:
info: Time: Tue Oct 07 2014 20:25:20 GMT-0400 (EDT)
```
If you are running NodeBB via git, it is also helpful to let the maintainers know what commit hash you are on. To find the commit hash, execute the following command:
``` bash
$ cd /path/to/my/nodebb
$ git rev-parse HEAD
```
If you have downloaded the `.zip` or `.tar.gz` packages from GitHub (or elsewhere), please let us know.
## Provide theme versions if issue is related to the theme/display
``` bash
$ npm ls nodebb-theme-vanilla nodebb-theme-lavender
nodebb@0.7.0-dev /home/julian/Projects/nodebb/forum
├── nodebb-theme-lavender@0.2.13
└── nodebb-theme-vanilla@0.2.35
```
## Attempt to use `git bisect`
If you have installed NodeBB via GitHub clone, are familiar with utilising git, and are willing to help us narrow down the specific commit that causes a bug, consider running `git bisect`.
A full guide can be found here: [Debugging with Git/Binary Search](http://git-scm.com/book/en/Git-Tools-Debugging-with-Git#Binary-Search)

24
.gitignore vendored
View File

@@ -8,6 +8,7 @@ public/css/*.css
*.sublime-project *.sublime-project
*.sublime-workspace *.sublime-workspace
.project .project
.idea
*.swp *.swp
Vagrantfile Vagrantfile
.vagrant .vagrant
@@ -16,35 +17,20 @@ provision.sh
.DS_Store .DS_Store
feeds/recent.rss feeds/recent.rss
logs/ # winston?
error.log
events.log
pidfile pidfile
# templates # templates
/public/templates /public/templates
/public/sounds
/public/uploads /public/uploads
/public/sounds
# compiled files # compiled files
/public/stylesheet.css /public/stylesheet.css
/public/admin.css /public/admin.css
/public/nodebb.min.js /public/nodebb.min.js
/public/nodebb.min.js.map /public/nodebb.min.js.map
/public/acp.min.js
/public/acp.min.js.map
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio
*.iml
## Directory-based project format:
.idea/
.vscode/
## File-based project format:
*.ipr
*.iws
## Transifex
tx.exe
.transifexrc

View File

@@ -24,7 +24,7 @@
// "single" : require single quotes // "single" : require single quotes
// "double" : require double quotes // "double" : require double quotes
"undef" : true, // true: Require all non-global variables to be declared (prevents global leaks) "undef" : true, // true: Require all non-global variables to be declared (prevents global leaks)
"unused" : true, // true: Require all defined variables be used "unused" : false, // true: Require all defined variables be used TODO: Set this to true, update codebase.
"strict" : true, // true: Requires all functions run in ES5 Strict Mode "strict" : true, // true: Requires all functions run in ES5 Strict Mode
"trailing" : false, // true: Prohibit trailing whitespaces "trailing" : false, // true: Prohibit trailing whitespaces
"maxparams" : false, // {int} Max number of formal params allowed per function "maxparams" : false, // {int} Max number of formal params allowed per function

View File

@@ -1,29 +1,12 @@
services: services:
- redis-server - redis-server
before_install: before_install:
- "sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10" - npm i --production
- "echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | sudo tee /etc/apt/sources.list.d/mongodb.list" - node app --setup="{\"base_url\":\"http://127.0.0.1\",\"port\":4567,\"use_port\":false,\"secret\":\"abcdef\",\"bind_address\":\"0.0.0.0\",\"database\":\"redis\",\"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}"
- "sudo apt-get update"
- "sudo apt-get install mongodb-org-server"
- npm i --production
- 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}"
before_script:
- "until nc -z localhost 27017; do echo Waiting for MongoDB; sleep 1; done"
language: node_js language: node_js
env:
- CXX=g++-4.8
addons:
apt:
sources:
- ubuntu-toolchain-r-test
packages:
- g++-4.8
node_js: node_js:
- "4.2" - "0.11"
- "4.1" - "0.10"
- "4.0"
- "0.11"
- "0.10"
branches: branches:
only: only:
- master - master

View File

@@ -6,12 +6,8 @@ file_filter = public/language/<lang>/category.json
source_file = public/language/en_GB/category.json source_file = public/language/en_GB/category.json
source_lang = en_GB source_lang = en_GB
trans.ar = public/language/ar/category.json trans.ar = public/language/ar/category.json
trans.bn = public/language/bn/category.json
trans.bg = public/language/bg/category.json
trans.cs = public/language/cs/category.json trans.cs = public/language/cs/category.json
trans.da = public/language/da/category.json
trans.de = public/language/de/category.json trans.de = public/language/de/category.json
trans.el = public/language/el/category.json
trans.en_US = public/language/en_US/category.json trans.en_US = public/language/en_US/category.json
trans.en@pirate = public/language/en@pirate/category.json trans.en@pirate = public/language/en@pirate/category.json
trans.es = public/language/es/category.json trans.es = public/language/es/category.json
@@ -19,10 +15,8 @@ trans.et = public/language/et/category.json
trans.fa_IR = public/language/fa_IR/category.json trans.fa_IR = public/language/fa_IR/category.json
trans.fi = public/language/fi/category.json trans.fi = public/language/fi/category.json
trans.fr = public/language/fr/category.json trans.fr = public/language/fr/category.json
trans.gl = public/language/gl/category.json
trans.he = public/language/he/category.json trans.he = public/language/he/category.json
trans.hu = public/language/hu/category.json trans.hu = public/language/hu/category.json
trans.id = public/language/id/category.json
trans.it = public/language/it/category.json trans.it = public/language/it/category.json
trans.ja = public/language/ja/category.json trans.ja = public/language/ja/category.json
trans.ko = public/language/ko/category.json trans.ko = public/language/ko/category.json
@@ -34,11 +28,8 @@ trans.pl = public/language/pl/category.json
trans.pt_BR = public/language/pt_BR/category.json trans.pt_BR = public/language/pt_BR/category.json
trans.ru = public/language/ru/category.json trans.ru = public/language/ru/category.json
trans.ro = public/language/ro/category.json trans.ro = public/language/ro/category.json
trans.rw = public/language/rw/category.json
trans.sc = public/language/sc/category.json trans.sc = public/language/sc/category.json
trans.sk = public/language/sk/category.json trans.sk = public/language/sk/category.json
trans.sl = public/language/sl/category.json
trans.sr = public/language/sr/category.json
trans.sv = public/language/sv/category.json trans.sv = public/language/sv/category.json
trans.th = public/language/th/category.json trans.th = public/language/th/category.json
trans.tr = public/language/tr/category.json trans.tr = public/language/tr/category.json
@@ -52,12 +43,8 @@ file_filter = public/language/<lang>/login.json
source_file = public/language/en_GB/login.json source_file = public/language/en_GB/login.json
source_lang = en_GB source_lang = en_GB
trans.ar = public/language/ar/login.json trans.ar = public/language/ar/login.json
trans.bn = public/language/bn/login.json
trans.bg = public/language/bg/login.json
trans.cs = public/language/cs/login.json trans.cs = public/language/cs/login.json
trans.da = public/language/da/login.json
trans.de = public/language/de/login.json trans.de = public/language/de/login.json
trans.el = public/language/el/login.json
trans.en_US = public/language/en_US/login.json trans.en_US = public/language/en_US/login.json
trans.en@pirate = public/language/en@pirate/login.json trans.en@pirate = public/language/en@pirate/login.json
trans.es = public/language/es/login.json trans.es = public/language/es/login.json
@@ -65,10 +52,8 @@ trans.et = public/language/et/login.json
trans.fa_IR = public/language/fa_IR/login.json trans.fa_IR = public/language/fa_IR/login.json
trans.fi = public/language/fi/login.json trans.fi = public/language/fi/login.json
trans.fr = public/language/fr/login.json trans.fr = public/language/fr/login.json
trans.gl = public/language/gl/login.json
trans.he = public/language/he/login.json trans.he = public/language/he/login.json
trans.hu = public/language/hu/login.json trans.hu = public/language/hu/login.json
trans.id = public/language/id/login.json
trans.it = public/language/it/login.json trans.it = public/language/it/login.json
trans.ja = public/language/ja/login.json trans.ja = public/language/ja/login.json
trans.ko = public/language/ko/login.json trans.ko = public/language/ko/login.json
@@ -80,11 +65,8 @@ trans.pl = public/language/pl/login.json
trans.pt_BR = public/language/pt_BR/login.json trans.pt_BR = public/language/pt_BR/login.json
trans.ru = public/language/ru/login.json trans.ru = public/language/ru/login.json
trans.ro = public/language/ro/login.json trans.ro = public/language/ro/login.json
trans.rw = public/language/rw/login.json
trans.sc = public/language/sc/login.json trans.sc = public/language/sc/login.json
trans.sk = public/language/sk/login.json trans.sk = public/language/sk/login.json
trans.sl = public/language/sl/login.json
trans.sr = public/language/sr/login.json
trans.sv = public/language/sv/login.json trans.sv = public/language/sv/login.json
trans.th = public/language/th/login.json trans.th = public/language/th/login.json
trans.tr = public/language/tr/login.json trans.tr = public/language/tr/login.json
@@ -94,16 +76,11 @@ trans.zh_TW = public/language/zh_TW/login.json
type = KEYVALUEJSON type = KEYVALUEJSON
[nodebb.recent] [nodebb.recent]
file_filter = public/language/<lang>/recent.json
source_file = public/language/en_GB/recent.json source_file = public/language/en_GB/recent.json
source_lang = en_GB source_lang = en_GB
trans.ar = public/language/ar/recent.json trans.ar = public/language/ar/recent.json
trans.bn = public/language/bn/recent.json
trans.bg = public/language/bg/recent.json
trans.cs = public/language/cs/recent.json trans.cs = public/language/cs/recent.json
trans.da = public/language/da/recent.json
trans.de = public/language/de/recent.json trans.de = public/language/de/recent.json
trans.el = public/language/el/recent.json
trans.en_US = public/language/en_US/recent.json trans.en_US = public/language/en_US/recent.json
trans.en@pirate = public/language/en@pirate/recent.json trans.en@pirate = public/language/en@pirate/recent.json
trans.es = public/language/es/recent.json trans.es = public/language/es/recent.json
@@ -111,10 +88,8 @@ trans.et = public/language/et/recent.json
trans.fa_IR = public/language/fa_IR/recent.json trans.fa_IR = public/language/fa_IR/recent.json
trans.fi = public/language/fi/recent.json trans.fi = public/language/fi/recent.json
trans.fr = public/language/fr/recent.json trans.fr = public/language/fr/recent.json
trans.gl = public/language/gl/recent.json
trans.he = public/language/he/recent.json trans.he = public/language/he/recent.json
trans.hu = public/language/hu/recent.json trans.hu = public/language/hu/recent.json
trans.id = public/language/id/recent.json
trans.it = public/language/it/recent.json trans.it = public/language/it/recent.json
trans.ja = public/language/ja/recent.json trans.ja = public/language/ja/recent.json
trans.ko = public/language/ko/recent.json trans.ko = public/language/ko/recent.json
@@ -126,11 +101,8 @@ trans.pl = public/language/pl/recent.json
trans.pt_BR = public/language/pt_BR/recent.json trans.pt_BR = public/language/pt_BR/recent.json
trans.ru = public/language/ru/recent.json trans.ru = public/language/ru/recent.json
trans.ro = public/language/ro/recent.json trans.ro = public/language/ro/recent.json
trans.rw = public/language/rw/recent.json
trans.sc = public/language/sc/recent.json trans.sc = public/language/sc/recent.json
trans.sk = public/language/sk/recent.json trans.sk = public/language/sk/recent.json
trans.sl = public/language/sl/recent.json
trans.sr = public/language/sr/recent.json
trans.sv = public/language/sv/recent.json trans.sv = public/language/sv/recent.json
trans.th = public/language/th/recent.json trans.th = public/language/th/recent.json
trans.tr = public/language/tr/recent.json trans.tr = public/language/tr/recent.json
@@ -140,16 +112,11 @@ trans.zh_TW = public/language/zh_TW/recent.json
type = KEYVALUEJSON type = KEYVALUEJSON
[nodebb.unread] [nodebb.unread]
file_filter = public/language/<lang>/unread.json
source_file = public/language/en_GB/unread.json source_file = public/language/en_GB/unread.json
source_lang = en_GB source_lang = en_GB
trans.ar = public/language/ar/unread.json trans.ar = public/language/ar/unread.json
trans.bn = public/language/bn/unread.json
trans.bg = public/language/bg/unread.json
trans.cs = public/language/cs/unread.json trans.cs = public/language/cs/unread.json
trans.da = public/language/da/unread.json
trans.de = public/language/de/unread.json trans.de = public/language/de/unread.json
trans.el = public/language/el/unread.json
trans.en_US = public/language/en_US/unread.json trans.en_US = public/language/en_US/unread.json
trans.en@pirate = public/language/en@pirate/unread.json trans.en@pirate = public/language/en@pirate/unread.json
trans.es = public/language/es/unread.json trans.es = public/language/es/unread.json
@@ -157,10 +124,8 @@ trans.et = public/language/et/unread.json
trans.fa_IR = public/language/fa_IR/unread.json trans.fa_IR = public/language/fa_IR/unread.json
trans.fi = public/language/fi/unread.json trans.fi = public/language/fi/unread.json
trans.fr = public/language/fr/unread.json trans.fr = public/language/fr/unread.json
trans.gl = public/language/gl/unread.json
trans.he = public/language/he/unread.json trans.he = public/language/he/unread.json
trans.hu = public/language/hu/unread.json trans.hu = public/language/hu/unread.json
trans.id = public/language/id/unread.json
trans.it = public/language/it/unread.json trans.it = public/language/it/unread.json
trans.ja = public/language/ja/unread.json trans.ja = public/language/ja/unread.json
trans.ko = public/language/ko/unread.json trans.ko = public/language/ko/unread.json
@@ -172,11 +137,8 @@ trans.pl = public/language/pl/unread.json
trans.pt_BR = public/language/pt_BR/unread.json trans.pt_BR = public/language/pt_BR/unread.json
trans.ru = public/language/ru/unread.json trans.ru = public/language/ru/unread.json
trans.ro = public/language/ro/unread.json trans.ro = public/language/ro/unread.json
trans.rw = public/language/rw/unread.json
trans.sc = public/language/sc/unread.json trans.sc = public/language/sc/unread.json
trans.sk = public/language/sk/unread.json trans.sk = public/language/sk/unread.json
trans.sl = public/language/sl/unread.json
trans.sr = public/language/sr/unread.json
trans.sv = public/language/sv/unread.json trans.sv = public/language/sv/unread.json
trans.th = public/language/th/unread.json trans.th = public/language/th/unread.json
trans.tr = public/language/tr/unread.json trans.tr = public/language/tr/unread.json
@@ -186,16 +148,11 @@ trans.zh_TW = public/language/zh_TW/unread.json
type = KEYVALUEJSON type = KEYVALUEJSON
[nodebb.modules] [nodebb.modules]
file_filter = public/language/<lang>/modules.json
source_file = public/language/en_GB/modules.json source_file = public/language/en_GB/modules.json
source_lang = en_GB source_lang = en_GB
trans.ar = public/language/ar/modules.json trans.ar = public/language/ar/modules.json
trans.bn = public/language/bn/modules.json
trans.bg = public/language/bg/modules.json
trans.cs = public/language/cs/modules.json trans.cs = public/language/cs/modules.json
trans.da = public/language/da/modules.json
trans.de = public/language/de/modules.json trans.de = public/language/de/modules.json
trans.el = public/language/el/modules.json
trans.en_US = public/language/en_US/modules.json trans.en_US = public/language/en_US/modules.json
trans.en@pirate = public/language/en@pirate/modules.json trans.en@pirate = public/language/en@pirate/modules.json
trans.es = public/language/es/modules.json trans.es = public/language/es/modules.json
@@ -203,10 +160,8 @@ trans.et = public/language/et/modules.json
trans.fa_IR = public/language/fa_IR/modules.json trans.fa_IR = public/language/fa_IR/modules.json
trans.fi = public/language/fi/modules.json trans.fi = public/language/fi/modules.json
trans.fr = public/language/fr/modules.json trans.fr = public/language/fr/modules.json
trans.gl = public/language/gl/modules.json
trans.he = public/language/he/modules.json trans.he = public/language/he/modules.json
trans.hu = public/language/hu/modules.json trans.hu = public/language/hu/modules.json
trans.id = public/language/id/modules.json
trans.it = public/language/it/modules.json trans.it = public/language/it/modules.json
trans.ja = public/language/ja/modules.json trans.ja = public/language/ja/modules.json
trans.ko = public/language/ko/modules.json trans.ko = public/language/ko/modules.json
@@ -218,11 +173,8 @@ trans.pl = public/language/pl/modules.json
trans.pt_BR = public/language/pt_BR/modules.json trans.pt_BR = public/language/pt_BR/modules.json
trans.ru = public/language/ru/modules.json trans.ru = public/language/ru/modules.json
trans.ro = public/language/ro/modules.json trans.ro = public/language/ro/modules.json
trans.rw = public/language/rw/modules.json
trans.sc = public/language/sc/modules.json trans.sc = public/language/sc/modules.json
trans.sk = public/language/sk/modules.json trans.sk = public/language/sk/modules.json
trans.sl = public/language/sl/modules.json
trans.sr = public/language/sr/modules.json
trans.sv = public/language/sv/modules.json trans.sv = public/language/sv/modules.json
trans.th = public/language/th/modules.json trans.th = public/language/th/modules.json
trans.tr = public/language/tr/modules.json trans.tr = public/language/tr/modules.json
@@ -232,16 +184,11 @@ trans.zh_TW = public/language/zh_TW/modules.json
type = KEYVALUEJSON type = KEYVALUEJSON
[nodebb.register] [nodebb.register]
file_filter = public/language/<lang>/register.json
source_file = public/language/en_GB/register.json source_file = public/language/en_GB/register.json
source_lang = en_GB source_lang = en_GB
trans.ar = public/language/ar/register.json trans.ar = public/language/ar/register.json
trans.bn = public/language/bn/register.json
trans.bg = public/language/bg/register.json
trans.cs = public/language/cs/register.json trans.cs = public/language/cs/register.json
trans.da = public/language/da/register.json
trans.de = public/language/de/register.json trans.de = public/language/de/register.json
trans.el = public/language/el/register.json
trans.en_US = public/language/en_US/register.json trans.en_US = public/language/en_US/register.json
trans.en@pirate = public/language/en@pirate/register.json trans.en@pirate = public/language/en@pirate/register.json
trans.es = public/language/es/register.json trans.es = public/language/es/register.json
@@ -249,10 +196,8 @@ trans.et = public/language/et/register.json
trans.fa_IR = public/language/fa_IR/register.json trans.fa_IR = public/language/fa_IR/register.json
trans.fi = public/language/fi/register.json trans.fi = public/language/fi/register.json
trans.fr = public/language/fr/register.json trans.fr = public/language/fr/register.json
trans.gl = public/language/gl/register.json
trans.he = public/language/he/register.json trans.he = public/language/he/register.json
trans.hu = public/language/hu/register.json trans.hu = public/language/hu/register.json
trans.id = public/language/id/register.json
trans.it = public/language/it/register.json trans.it = public/language/it/register.json
trans.ja = public/language/ja/register.json trans.ja = public/language/ja/register.json
trans.ko = public/language/ko/register.json trans.ko = public/language/ko/register.json
@@ -264,11 +209,8 @@ trans.pl = public/language/pl/register.json
trans.pt_BR = public/language/pt_BR/register.json trans.pt_BR = public/language/pt_BR/register.json
trans.ru = public/language/ru/register.json trans.ru = public/language/ru/register.json
trans.ro = public/language/ro/register.json trans.ro = public/language/ro/register.json
trans.rw = public/language/rw/register.json
trans.sc = public/language/sc/register.json trans.sc = public/language/sc/register.json
trans.sk = public/language/sk/register.json trans.sk = public/language/sk/register.json
trans.sl = public/language/sl/register.json
trans.sr = public/language/sr/register.json
trans.sv = public/language/sv/register.json trans.sv = public/language/sv/register.json
trans.th = public/language/th/register.json trans.th = public/language/th/register.json
trans.tr = public/language/tr/register.json trans.tr = public/language/tr/register.json
@@ -278,16 +220,11 @@ trans.zh_TW = public/language/zh_TW/register.json
type = KEYVALUEJSON type = KEYVALUEJSON
[nodebb.user] [nodebb.user]
file_filter = public/language/<lang>/user.json
source_file = public/language/en_GB/user.json source_file = public/language/en_GB/user.json
source_lang = en_GB source_lang = en_GB
trans.ar = public/language/ar/user.json trans.ar = public/language/ar/user.json
trans.bn = public/language/bn/user.json
trans.bg = public/language/bg/user.json
trans.cs = public/language/cs/user.json trans.cs = public/language/cs/user.json
trans.da = public/language/da/user.json
trans.de = public/language/de/user.json trans.de = public/language/de/user.json
trans.el = public/language/el/user.json
trans.en_US = public/language/en_US/user.json trans.en_US = public/language/en_US/user.json
trans.en@pirate = public/language/en@pirate/user.json trans.en@pirate = public/language/en@pirate/user.json
trans.es = public/language/es/user.json trans.es = public/language/es/user.json
@@ -295,10 +232,8 @@ trans.et = public/language/et/user.json
trans.fa_IR = public/language/fa_IR/user.json trans.fa_IR = public/language/fa_IR/user.json
trans.fi = public/language/fi/user.json trans.fi = public/language/fi/user.json
trans.fr = public/language/fr/user.json trans.fr = public/language/fr/user.json
trans.gl = public/language/gl/user.json
trans.he = public/language/he/user.json trans.he = public/language/he/user.json
trans.hu = public/language/hu/user.json trans.hu = public/language/hu/user.json
trans.id = public/language/id/user.json
trans.it = public/language/it/user.json trans.it = public/language/it/user.json
trans.ja = public/language/ja/user.json trans.ja = public/language/ja/user.json
trans.ko = public/language/ko/user.json trans.ko = public/language/ko/user.json
@@ -310,11 +245,8 @@ trans.pl = public/language/pl/user.json
trans.pt_BR = public/language/pt_BR/user.json trans.pt_BR = public/language/pt_BR/user.json
trans.ru = public/language/ru/user.json trans.ru = public/language/ru/user.json
trans.ro = public/language/ro/user.json trans.ro = public/language/ro/user.json
trans.rw = public/language/rw/user.json
trans.sc = public/language/sc/user.json trans.sc = public/language/sc/user.json
trans.sk = public/language/sk/user.json trans.sk = public/language/sk/user.json
trans.sl = public/language/sl/user.json
trans.sr = public/language/sr/user.json
trans.sv = public/language/sv/user.json trans.sv = public/language/sv/user.json
trans.th = public/language/th/user.json trans.th = public/language/th/user.json
trans.tr = public/language/tr/user.json trans.tr = public/language/tr/user.json
@@ -324,16 +256,11 @@ trans.zh_TW = public/language/zh_TW/user.json
type = KEYVALUEJSON type = KEYVALUEJSON
[nodebb.global] [nodebb.global]
file_filter = public/language/<lang>/global.json
source_file = public/language/en_GB/global.json source_file = public/language/en_GB/global.json
source_lang = en_GB source_lang = en_GB
trans.ar = public/language/ar/global.json trans.ar = public/language/ar/global.json
trans.bn = public/language/bn/global.json
trans.bg = public/language/bg/global.json
trans.cs = public/language/cs/global.json trans.cs = public/language/cs/global.json
trans.da = public/language/da/global.json
trans.de = public/language/de/global.json trans.de = public/language/de/global.json
trans.el = public/language/el/global.json
trans.en_US = public/language/en_US/global.json trans.en_US = public/language/en_US/global.json
trans.en@pirate = public/language/en@pirate/global.json trans.en@pirate = public/language/en@pirate/global.json
trans.es = public/language/es/global.json trans.es = public/language/es/global.json
@@ -341,10 +268,8 @@ trans.et = public/language/et/global.json
trans.fa_IR = public/language/fa_IR/global.json trans.fa_IR = public/language/fa_IR/global.json
trans.fi = public/language/fi/global.json trans.fi = public/language/fi/global.json
trans.fr = public/language/fr/global.json trans.fr = public/language/fr/global.json
trans.gl = public/language/gl/global.json
trans.he = public/language/he/global.json trans.he = public/language/he/global.json
trans.hu = public/language/hu/global.json trans.hu = public/language/hu/global.json
trans.id = public/language/id/global.json
trans.it = public/language/it/global.json trans.it = public/language/it/global.json
trans.ja = public/language/ja/global.json trans.ja = public/language/ja/global.json
trans.ko = public/language/ko/global.json trans.ko = public/language/ko/global.json
@@ -356,11 +281,8 @@ trans.pl = public/language/pl/global.json
trans.pt_BR = public/language/pt_BR/global.json trans.pt_BR = public/language/pt_BR/global.json
trans.ru = public/language/ru/global.json trans.ru = public/language/ru/global.json
trans.ro = public/language/ro/global.json trans.ro = public/language/ro/global.json
trans.rw = public/language/rw/global.json
trans.sc = public/language/sc/global.json trans.sc = public/language/sc/global.json
trans.sk = public/language/sk/global.json trans.sk = public/language/sk/global.json
trans.sl = public/language/sl/global.json
trans.sr = public/language/sr/global.json
trans.sv = public/language/sv/global.json trans.sv = public/language/sv/global.json
trans.th = public/language/th/global.json trans.th = public/language/th/global.json
trans.tr = public/language/tr/global.json trans.tr = public/language/tr/global.json
@@ -370,16 +292,11 @@ trans.zh_TW = public/language/zh_TW/global.json
type = KEYVALUEJSON type = KEYVALUEJSON
[nodebb.notifications] [nodebb.notifications]
file_filter = public/language/<lang>/notifications.json
source_file = public/language/en_GB/notifications.json source_file = public/language/en_GB/notifications.json
source_lang = en_GB source_lang = en_GB
trans.ar = public/language/ar/notifications.json trans.ar = public/language/ar/notifications.json
trans.bn = public/language/bn/notifications.json
trans.bg = public/language/bg/notifications.json
trans.cs = public/language/cs/notifications.json trans.cs = public/language/cs/notifications.json
trans.da = public/language/da/notifications.json
trans.de = public/language/de/notifications.json trans.de = public/language/de/notifications.json
trans.el = public/language/el/notifications.json
trans.en_US = public/language/en_US/notifications.json trans.en_US = public/language/en_US/notifications.json
trans.en@pirate = public/language/en@pirate/notifications.json trans.en@pirate = public/language/en@pirate/notifications.json
trans.es = public/language/es/notifications.json trans.es = public/language/es/notifications.json
@@ -387,10 +304,8 @@ trans.et = public/language/et/notifications.json
trans.fa_IR = public/language/fa_IR/notifications.json trans.fa_IR = public/language/fa_IR/notifications.json
trans.fi = public/language/fi/notifications.json trans.fi = public/language/fi/notifications.json
trans.fr = public/language/fr/notifications.json trans.fr = public/language/fr/notifications.json
trans.gl = public/language/gl/notifications.json
trans.he = public/language/he/notifications.json trans.he = public/language/he/notifications.json
trans.hu = public/language/hu/notifications.json trans.hu = public/language/hu/notifications.json
trans.id = public/language/id/notifications.json
trans.it = public/language/it/notifications.json trans.it = public/language/it/notifications.json
trans.ja = public/language/ja/notifications.json trans.ja = public/language/ja/notifications.json
trans.ko = public/language/ko/notifications.json trans.ko = public/language/ko/notifications.json
@@ -402,11 +317,8 @@ trans.pl = public/language/pl/notifications.json
trans.pt_BR = public/language/pt_BR/notifications.json trans.pt_BR = public/language/pt_BR/notifications.json
trans.ru = public/language/ru/notifications.json trans.ru = public/language/ru/notifications.json
trans.ro = public/language/ro/notifications.json trans.ro = public/language/ro/notifications.json
trans.rw = public/language/rw/notifications.json
trans.sc = public/language/sc/notifications.json trans.sc = public/language/sc/notifications.json
trans.sk = public/language/sk/notifications.json trans.sk = public/language/sk/notifications.json
trans.sl = public/language/sl/notifications.json
trans.sr = public/language/sr/notifications.json
trans.sv = public/language/sv/notifications.json trans.sv = public/language/sv/notifications.json
trans.th = public/language/th/notifications.json trans.th = public/language/th/notifications.json
trans.tr = public/language/tr/notifications.json trans.tr = public/language/tr/notifications.json
@@ -416,16 +328,11 @@ trans.zh_TW = public/language/zh_TW/notifications.json
type = KEYVALUEJSON type = KEYVALUEJSON
[nodebb.reset_password] [nodebb.reset_password]
file_filter = public/language/<lang>/reset_password.json
source_file = public/language/en_GB/reset_password.json source_file = public/language/en_GB/reset_password.json
source_lang = en_GB source_lang = en_GB
trans.ar = public/language/ar/reset_password.json trans.ar = public/language/ar/reset_password.json
trans.bn = public/language/bn/reset_password.json
trans.bg = public/language/bg/reset_password.json
trans.cs = public/language/cs/reset_password.json trans.cs = public/language/cs/reset_password.json
trans.da = public/language/da/reset_password.json
trans.de = public/language/de/reset_password.json trans.de = public/language/de/reset_password.json
trans.el = public/language/el/reset_password.json
trans.en_US = public/language/en_US/reset_password.json trans.en_US = public/language/en_US/reset_password.json
trans.en@pirate = public/language/en@pirate/reset_password.json trans.en@pirate = public/language/en@pirate/reset_password.json
trans.es = public/language/es/reset_password.json trans.es = public/language/es/reset_password.json
@@ -433,10 +340,8 @@ trans.et = public/language/et/reset_password.json
trans.fa_IR = public/language/fa_IR/reset_password.json trans.fa_IR = public/language/fa_IR/reset_password.json
trans.fi = public/language/fi/reset_password.json trans.fi = public/language/fi/reset_password.json
trans.fr = public/language/fr/reset_password.json trans.fr = public/language/fr/reset_password.json
trans.gl = public/language/gl/reset_password.json
trans.he = public/language/he/reset_password.json trans.he = public/language/he/reset_password.json
trans.hu = public/language/hu/reset_password.json trans.hu = public/language/hu/reset_password.json
trans.id = public/language/id/reset_password.json
trans.it = public/language/it/reset_password.json trans.it = public/language/it/reset_password.json
trans.ja = public/language/ja/reset_password.json trans.ja = public/language/ja/reset_password.json
trans.ko = public/language/ko/reset_password.json trans.ko = public/language/ko/reset_password.json
@@ -448,11 +353,8 @@ trans.pl = public/language/pl/reset_password.json
trans.pt_BR = public/language/pt_BR/reset_password.json trans.pt_BR = public/language/pt_BR/reset_password.json
trans.ru = public/language/ru/reset_password.json trans.ru = public/language/ru/reset_password.json
trans.ro = public/language/ro/reset_password.json trans.ro = public/language/ro/reset_password.json
trans.rw = public/language/rw/reset_password.json
trans.sc = public/language/sc/reset_password.json trans.sc = public/language/sc/reset_password.json
trans.sk = public/language/sk/reset_password.json trans.sk = public/language/sk/reset_password.json
trans.sl = public/language/sl/reset_password.json
trans.sr = public/language/sr/reset_password.json
trans.sv = public/language/sv/reset_password.json trans.sv = public/language/sv/reset_password.json
trans.th = public/language/th/reset_password.json trans.th = public/language/th/reset_password.json
trans.tr = public/language/tr/reset_password.json trans.tr = public/language/tr/reset_password.json
@@ -462,16 +364,11 @@ trans.zh_TW = public/language/zh_TW/reset_password.json
type = KEYVALUEJSON type = KEYVALUEJSON
[nodebb.users] [nodebb.users]
file_filter = public/language/<lang>/users.json
source_file = public/language/en_GB/users.json source_file = public/language/en_GB/users.json
source_lang = en_GB source_lang = en_GB
trans.ar = public/language/ar/users.json trans.ar = public/language/ar/users.json
trans.bn = public/language/bn/users.json
trans.bg = public/language/bg/users.json
trans.cs = public/language/cs/users.json trans.cs = public/language/cs/users.json
trans.da = public/language/da/users.json
trans.de = public/language/de/users.json trans.de = public/language/de/users.json
trans.el = public/language/el/users.json
trans.en_US = public/language/en_US/users.json trans.en_US = public/language/en_US/users.json
trans.en@pirate = public/language/en@pirate/users.json trans.en@pirate = public/language/en@pirate/users.json
trans.es = public/language/es/users.json trans.es = public/language/es/users.json
@@ -479,10 +376,8 @@ trans.et = public/language/et/users.json
trans.fa_IR = public/language/fa_IR/users.json trans.fa_IR = public/language/fa_IR/users.json
trans.fi = public/language/fi/users.json trans.fi = public/language/fi/users.json
trans.fr = public/language/fr/users.json trans.fr = public/language/fr/users.json
trans.gl = public/language/gl/users.json
trans.he = public/language/he/users.json trans.he = public/language/he/users.json
trans.hu = public/language/hu/users.json trans.hu = public/language/hu/users.json
trans.id = public/language/id/users.json
trans.it = public/language/it/users.json trans.it = public/language/it/users.json
trans.ja = public/language/ja/users.json trans.ja = public/language/ja/users.json
trans.ko = public/language/ko/users.json trans.ko = public/language/ko/users.json
@@ -494,11 +389,8 @@ trans.pl = public/language/pl/users.json
trans.pt_BR = public/language/pt_BR/users.json trans.pt_BR = public/language/pt_BR/users.json
trans.ru = public/language/ru/users.json trans.ru = public/language/ru/users.json
trans.ro = public/language/ro/users.json trans.ro = public/language/ro/users.json
trans.rw = public/language/rw/users.json
trans.sc = public/language/sc/users.json trans.sc = public/language/sc/users.json
trans.sk = public/language/sk/users.json trans.sk = public/language/sk/users.json
trans.sl = public/language/sl/users.json
trans.sr = public/language/sr/users.json
trans.sv = public/language/sv/users.json trans.sv = public/language/sv/users.json
trans.th = public/language/th/users.json trans.th = public/language/th/users.json
trans.tr = public/language/tr/users.json trans.tr = public/language/tr/users.json
@@ -507,17 +399,12 @@ trans.zh_CN = public/language/zh_CN/users.json
trans.zh_TW = public/language/zh_TW/users.json trans.zh_TW = public/language/zh_TW/users.json
type = KEYVALUEJSON type = KEYVALUEJSON
[nodebb.language-1] [nodebb.language]
file_filter = public/language/<lang>/language.json
source_file = public/language/en_GB/language.json source_file = public/language/en_GB/language.json
source_lang = en_GB source_lang = en_GB
trans.ar = public/language/ar/language.json trans.ar = public/language/ar/language.json
trans.bn = public/language/bn/language.json
trans.bg = public/language/bg/language.json
trans.cs = public/language/cs/language.json trans.cs = public/language/cs/language.json
trans.da = public/language/da/language.json
trans.de = public/language/de/language.json trans.de = public/language/de/language.json
trans.el = public/language/el/language.json
trans.en_US = public/language/en_US/language.json trans.en_US = public/language/en_US/language.json
trans.en@pirate = public/language/en@pirate/language.json trans.en@pirate = public/language/en@pirate/language.json
trans.es = public/language/es/language.json trans.es = public/language/es/language.json
@@ -525,10 +412,8 @@ trans.et = public/language/et/language.json
trans.fa_IR = public/language/fa_IR/language.json trans.fa_IR = public/language/fa_IR/language.json
trans.fi = public/language/fi/language.json trans.fi = public/language/fi/language.json
trans.fr = public/language/fr/language.json trans.fr = public/language/fr/language.json
trans.gl = public/language/gl/language.json
trans.he = public/language/he/language.json trans.he = public/language/he/language.json
trans.hu = public/language/hu/language.json trans.hu = public/language/hu/language.json
trans.id = public/language/id/language.json
trans.it = public/language/it/language.json trans.it = public/language/it/language.json
trans.ja = public/language/ja/language.json trans.ja = public/language/ja/language.json
trans.ko = public/language/ko/language.json trans.ko = public/language/ko/language.json
@@ -540,11 +425,8 @@ trans.pl = public/language/pl/language.json
trans.pt_BR = public/language/pt_BR/language.json trans.pt_BR = public/language/pt_BR/language.json
trans.ru = public/language/ru/language.json trans.ru = public/language/ru/language.json
trans.ro = public/language/ro/language.json trans.ro = public/language/ro/language.json
trans.rw = public/language/rw/language.json
trans.sc = public/language/sc/language.json trans.sc = public/language/sc/language.json
trans.sk = public/language/sk/language.json trans.sk = public/language/sk/language.json
trans.sl = public/language/sl/language.json
trans.sr = public/language/sr/language.json
trans.sv = public/language/sv/language.json trans.sv = public/language/sv/language.json
trans.th = public/language/th/language.json trans.th = public/language/th/language.json
trans.tr = public/language/tr/language.json trans.tr = public/language/tr/language.json
@@ -554,16 +436,11 @@ trans.zh_TW = public/language/zh_TW/language.json
type = KEYVALUEJSON type = KEYVALUEJSON
[nodebb.pages] [nodebb.pages]
file_filter = public/language/<lang>/pages.json
source_file = public/language/en_GB/pages.json source_file = public/language/en_GB/pages.json
source_lang = en_GB source_lang = en_GB
trans.ar = public/language/ar/pages.json trans.ar = public/language/ar/pages.json
trans.bn = public/language/bn/pages.json
trans.bg = public/language/bg/pages.json
trans.cs = public/language/cs/pages.json trans.cs = public/language/cs/pages.json
trans.da = public/language/da/pages.json
trans.de = public/language/de/pages.json trans.de = public/language/de/pages.json
trans.el = public/language/el/pages.json
trans.en_US = public/language/en_US/pages.json trans.en_US = public/language/en_US/pages.json
trans.en@pirate = public/language/en@pirate/pages.json trans.en@pirate = public/language/en@pirate/pages.json
trans.es = public/language/es/pages.json trans.es = public/language/es/pages.json
@@ -571,10 +448,8 @@ trans.et = public/language/et/pages.json
trans.fa_IR = public/language/fa_IR/pages.json trans.fa_IR = public/language/fa_IR/pages.json
trans.fi = public/language/fi/pages.json trans.fi = public/language/fi/pages.json
trans.fr = public/language/fr/pages.json trans.fr = public/language/fr/pages.json
trans.gl = public/language/gl/pages.json
trans.he = public/language/he/pages.json trans.he = public/language/he/pages.json
trans.hu = public/language/hu/pages.json trans.hu = public/language/hu/pages.json
trans.id = public/language/id/pages.json
trans.it = public/language/it/pages.json trans.it = public/language/it/pages.json
trans.ja = public/language/ja/pages.json trans.ja = public/language/ja/pages.json
trans.ko = public/language/ko/pages.json trans.ko = public/language/ko/pages.json
@@ -586,11 +461,8 @@ trans.pl = public/language/pl/pages.json
trans.pt_BR = public/language/pt_BR/pages.json trans.pt_BR = public/language/pt_BR/pages.json
trans.ru = public/language/ru/pages.json trans.ru = public/language/ru/pages.json
trans.ro = public/language/ro/pages.json trans.ro = public/language/ro/pages.json
trans.rw = public/language/rw/pages.json
trans.sc = public/language/sc/pages.json trans.sc = public/language/sc/pages.json
trans.sk = public/language/sk/pages.json trans.sk = public/language/sk/pages.json
trans.sl = public/language/sl/pages.json
trans.sr = public/language/sr/pages.json
trans.sv = public/language/sv/pages.json trans.sv = public/language/sv/pages.json
trans.th = public/language/th/pages.json trans.th = public/language/th/pages.json
trans.tr = public/language/tr/pages.json trans.tr = public/language/tr/pages.json
@@ -600,16 +472,11 @@ trans.zh_TW = public/language/zh_TW/pages.json
type = KEYVALUEJSON type = KEYVALUEJSON
[nodebb.topic] [nodebb.topic]
file_filter = public/language/<lang>/topic.json
source_file = public/language/en_GB/topic.json source_file = public/language/en_GB/topic.json
source_lang = en_GB source_lang = en_GB
trans.ar = public/language/ar/topic.json trans.ar = public/language/ar/topic.json
trans.bn = public/language/bn/topic.json
trans.bg = public/language/bg/topic.json
trans.cs = public/language/cs/topic.json trans.cs = public/language/cs/topic.json
trans.da = public/language/da/topic.json
trans.de = public/language/de/topic.json trans.de = public/language/de/topic.json
trans.el = public/language/el/topic.json
trans.en_US = public/language/en_US/topic.json trans.en_US = public/language/en_US/topic.json
trans.en@pirate = public/language/en@pirate/topic.json trans.en@pirate = public/language/en@pirate/topic.json
trans.es = public/language/es/topic.json trans.es = public/language/es/topic.json
@@ -617,10 +484,8 @@ trans.et = public/language/et/topic.json
trans.fa_IR = public/language/fa_IR/topic.json trans.fa_IR = public/language/fa_IR/topic.json
trans.fi = public/language/fi/topic.json trans.fi = public/language/fi/topic.json
trans.fr = public/language/fr/topic.json trans.fr = public/language/fr/topic.json
trans.gl = public/language/gl/topic.json
trans.he = public/language/he/topic.json trans.he = public/language/he/topic.json
trans.hu = public/language/hu/topic.json trans.hu = public/language/hu/topic.json
trans.id = public/language/id/topic.json
trans.it = public/language/it/topic.json trans.it = public/language/it/topic.json
trans.ja = public/language/ja/topic.json trans.ja = public/language/ja/topic.json
trans.ko = public/language/ko/topic.json trans.ko = public/language/ko/topic.json
@@ -632,11 +497,8 @@ trans.pl = public/language/pl/topic.json
trans.pt_BR = public/language/pt_BR/topic.json trans.pt_BR = public/language/pt_BR/topic.json
trans.ru = public/language/ru/topic.json trans.ru = public/language/ru/topic.json
trans.ro = public/language/ro/topic.json trans.ro = public/language/ro/topic.json
trans.rw = public/language/rw/topic.json
trans.sc = public/language/sc/topic.json trans.sc = public/language/sc/topic.json
trans.sk = public/language/sk/topic.json trans.sk = public/language/sk/topic.json
trans.sl = public/language/sl/topic.json
trans.sr = public/language/sr/topic.json
trans.sv = public/language/sv/topic.json trans.sv = public/language/sv/topic.json
trans.th = public/language/th/topic.json trans.th = public/language/th/topic.json
trans.tr = public/language/tr/topic.json trans.tr = public/language/tr/topic.json
@@ -646,16 +508,11 @@ trans.zh_TW = public/language/zh_TW/topic.json
type = KEYVALUEJSON type = KEYVALUEJSON
[nodebb.success] [nodebb.success]
file_filter = public/language/<lang>/success.json
source_file = public/language/en_GB/success.json source_file = public/language/en_GB/success.json
source_lang = en_GB source_lang = en_GB
trans.ar = public/language/ar/success.json trans.ar = public/language/ar/success.json
trans.bn = public/language/bn/success.json
trans.bg = public/language/bg/success.json
trans.cs = public/language/cs/success.json trans.cs = public/language/cs/success.json
trans.da = public/language/da/success.json
trans.de = public/language/de/success.json trans.de = public/language/de/success.json
trans.el = public/language/el/success.json
trans.en_US = public/language/en_US/success.json trans.en_US = public/language/en_US/success.json
trans.en@pirate = public/language/en@pirate/success.json trans.en@pirate = public/language/en@pirate/success.json
trans.es = public/language/es/success.json trans.es = public/language/es/success.json
@@ -663,10 +520,8 @@ trans.et = public/language/et/success.json
trans.fa_IR = public/language/fa_IR/success.json trans.fa_IR = public/language/fa_IR/success.json
trans.fi = public/language/fi/success.json trans.fi = public/language/fi/success.json
trans.fr = public/language/fr/success.json trans.fr = public/language/fr/success.json
trans.gl = public/language/gl/success.json
trans.he = public/language/he/success.json trans.he = public/language/he/success.json
trans.hu = public/language/hu/success.json trans.hu = public/language/hu/success.json
trans.id = public/language/id/success.json
trans.it = public/language/it/success.json trans.it = public/language/it/success.json
trans.ja = public/language/ja/success.json trans.ja = public/language/ja/success.json
trans.ko = public/language/ko/success.json trans.ko = public/language/ko/success.json
@@ -678,11 +533,8 @@ trans.pl = public/language/pl/success.json
trans.pt_BR = public/language/pt_BR/success.json trans.pt_BR = public/language/pt_BR/success.json
trans.ru = public/language/ru/success.json trans.ru = public/language/ru/success.json
trans.ro = public/language/ro/success.json trans.ro = public/language/ro/success.json
trans.rw = public/language/rw/success.json
trans.sc = public/language/sc/success.json trans.sc = public/language/sc/success.json
trans.sk = public/language/sk/success.json trans.sk = public/language/sk/success.json
trans.sl = public/language/sl/success.json
trans.sr = public/language/sr/success.json
trans.sv = public/language/sv/success.json trans.sv = public/language/sv/success.json
trans.th = public/language/th/success.json trans.th = public/language/th/success.json
trans.tr = public/language/tr/success.json trans.tr = public/language/tr/success.json
@@ -692,16 +544,11 @@ trans.zh_TW = public/language/zh_TW/success.json
type = KEYVALUEJSON type = KEYVALUEJSON
[nodebb.error] [nodebb.error]
file_filter = public/language/<lang>/error.json
source_file = public/language/en_GB/error.json source_file = public/language/en_GB/error.json
source_lang = en_GB source_lang = en_GB
trans.ar = public/language/ar/error.json trans.ar = public/language/ar/error.json
trans.bn = public/language/bn/error.json
trans.bg = public/language/bg/error.json
trans.cs = public/language/cs/error.json trans.cs = public/language/cs/error.json
trans.da = public/language/da/error.json
trans.de = public/language/de/error.json trans.de = public/language/de/error.json
trans.el = public/language/el/error.json
trans.en_US = public/language/en_US/error.json trans.en_US = public/language/en_US/error.json
trans.en@pirate = public/language/en@pirate/error.json trans.en@pirate = public/language/en@pirate/error.json
trans.es = public/language/es/error.json trans.es = public/language/es/error.json
@@ -709,10 +556,8 @@ trans.et = public/language/et/error.json
trans.fa_IR = public/language/fa_IR/error.json trans.fa_IR = public/language/fa_IR/error.json
trans.fi = public/language/fi/error.json trans.fi = public/language/fi/error.json
trans.fr = public/language/fr/error.json trans.fr = public/language/fr/error.json
trans.gl = public/language/gl/error.json
trans.he = public/language/he/error.json trans.he = public/language/he/error.json
trans.hu = public/language/hu/error.json trans.hu = public/language/hu/error.json
trans.id = public/language/id/error.json
trans.it = public/language/it/error.json trans.it = public/language/it/error.json
trans.ja = public/language/ja/error.json trans.ja = public/language/ja/error.json
trans.ko = public/language/ko/error.json trans.ko = public/language/ko/error.json
@@ -724,11 +569,8 @@ trans.pl = public/language/pl/error.json
trans.pt_BR = public/language/pt_BR/error.json trans.pt_BR = public/language/pt_BR/error.json
trans.ru = public/language/ru/error.json trans.ru = public/language/ru/error.json
trans.ro = public/language/ro/error.json trans.ro = public/language/ro/error.json
trans.rw = public/language/rw/error.json
trans.sc = public/language/sc/error.json trans.sc = public/language/sc/error.json
trans.sk = public/language/sk/error.json trans.sk = public/language/sk/error.json
trans.sl = public/language/sl/error.json
trans.sr = public/language/sr/error.json
trans.sv = public/language/sv/error.json trans.sv = public/language/sv/error.json
trans.th = public/language/th/error.json trans.th = public/language/th/error.json
trans.tr = public/language/tr/error.json trans.tr = public/language/tr/error.json
@@ -738,16 +580,11 @@ trans.zh_TW = public/language/zh_TW/error.json
type = KEYVALUEJSON type = KEYVALUEJSON
[nodebb.tags] [nodebb.tags]
file_filter = public/language/<lang>/tags.json
source_file = public/language/en_GB/tags.json source_file = public/language/en_GB/tags.json
source_lang = en_GB source_lang = en_GB
trans.ar = public/language/ar/tags.json trans.ar = public/language/ar/tags.json
trans.bn = public/language/bn/tags.json
trans.bg = public/language/bg/tags.json
trans.cs = public/language/cs/tags.json trans.cs = public/language/cs/tags.json
trans.da = public/language/da/tags.json
trans.de = public/language/de/tags.json trans.de = public/language/de/tags.json
trans.el = public/language/el/tags.json
trans.en_US = public/language/en_US/tags.json trans.en_US = public/language/en_US/tags.json
trans.en@pirate = public/language/en@pirate/tags.json trans.en@pirate = public/language/en@pirate/tags.json
trans.es = public/language/es/tags.json trans.es = public/language/es/tags.json
@@ -755,10 +592,8 @@ trans.et = public/language/et/tags.json
trans.fa_IR = public/language/fa_IR/tags.json trans.fa_IR = public/language/fa_IR/tags.json
trans.fi = public/language/fi/tags.json trans.fi = public/language/fi/tags.json
trans.fr = public/language/fr/tags.json trans.fr = public/language/fr/tags.json
trans.gl = public/language/gl/tags.json
trans.he = public/language/he/tags.json trans.he = public/language/he/tags.json
trans.hu = public/language/hu/tags.json trans.hu = public/language/hu/tags.json
trans.id = public/language/id/tags.json
trans.it = public/language/it/tags.json trans.it = public/language/it/tags.json
trans.ja = public/language/ja/tags.json trans.ja = public/language/ja/tags.json
trans.ko = public/language/ko/tags.json trans.ko = public/language/ko/tags.json
@@ -770,11 +605,8 @@ trans.pl = public/language/pl/tags.json
trans.pt_BR = public/language/pt_BR/tags.json trans.pt_BR = public/language/pt_BR/tags.json
trans.ru = public/language/ru/tags.json trans.ru = public/language/ru/tags.json
trans.ro = public/language/ro/tags.json trans.ro = public/language/ro/tags.json
trans.rw = public/language/rw/tags.json
trans.sc = public/language/sc/tags.json trans.sc = public/language/sc/tags.json
trans.sk = public/language/sk/tags.json trans.sk = public/language/sk/tags.json
trans.sl = public/language/sl/tags.json
trans.sr = public/language/sr/tags.json
trans.sv = public/language/sv/tags.json trans.sv = public/language/sv/tags.json
trans.th = public/language/th/tags.json trans.th = public/language/th/tags.json
trans.tr = public/language/tr/tags.json trans.tr = public/language/tr/tags.json
@@ -784,16 +616,11 @@ trans.zh_TW = public/language/zh_TW/tags.json
type = KEYVALUEJSON type = KEYVALUEJSON
[nodebb.email] [nodebb.email]
file_filter = public/language/<lang>/email.json
source_file = public/language/en_GB/email.json source_file = public/language/en_GB/email.json
source_lang = en_GB source_lang = en_GB
trans.ar = public/language/ar/email.json trans.ar = public/language/ar/email.json
trans.bn = public/language/bn/email.json
trans.bg = public/language/bg/email.json
trans.cs = public/language/cs/email.json trans.cs = public/language/cs/email.json
trans.da = public/language/da/email.json
trans.de = public/language/de/email.json trans.de = public/language/de/email.json
trans.el = public/language/el/email.json
trans.en_US = public/language/en_US/email.json trans.en_US = public/language/en_US/email.json
trans.en@pirate = public/language/en@pirate/email.json trans.en@pirate = public/language/en@pirate/email.json
trans.es = public/language/es/email.json trans.es = public/language/es/email.json
@@ -801,10 +628,8 @@ trans.et = public/language/et/email.json
trans.fa_IR = public/language/fa_IR/email.json trans.fa_IR = public/language/fa_IR/email.json
trans.fi = public/language/fi/email.json trans.fi = public/language/fi/email.json
trans.fr = public/language/fr/email.json trans.fr = public/language/fr/email.json
trans.gl = public/language/gl/email.json
trans.he = public/language/he/email.json trans.he = public/language/he/email.json
trans.hu = public/language/hu/email.json trans.hu = public/language/hu/email.json
trans.id = public/language/id/email.json
trans.it = public/language/it/email.json trans.it = public/language/it/email.json
trans.ja = public/language/ja/email.json trans.ja = public/language/ja/email.json
trans.ko = public/language/ko/email.json trans.ko = public/language/ko/email.json
@@ -816,11 +641,8 @@ trans.pl = public/language/pl/email.json
trans.pt_BR = public/language/pt_BR/email.json trans.pt_BR = public/language/pt_BR/email.json
trans.ru = public/language/ru/email.json trans.ru = public/language/ru/email.json
trans.ro = public/language/ro/email.json trans.ro = public/language/ro/email.json
trans.rw = public/language/rw/email.json
trans.sc = public/language/sc/email.json trans.sc = public/language/sc/email.json
trans.sk = public/language/sk/email.json trans.sk = public/language/sk/email.json
trans.sl = public/language/sl/email.json
trans.sr = public/language/sr/email.json
trans.sv = public/language/sv/email.json trans.sv = public/language/sv/email.json
trans.th = public/language/th/email.json trans.th = public/language/th/email.json
trans.tr = public/language/tr/email.json trans.tr = public/language/tr/email.json
@@ -830,16 +652,11 @@ trans.zh_TW = public/language/zh_TW/email.json
type = KEYVALUEJSON type = KEYVALUEJSON
[nodebb.search] [nodebb.search]
file_filter = public/language/<lang>/search.json
source_file = public/language/en_GB/search.json source_file = public/language/en_GB/search.json
source_lang = en_GB source_lang = en_GB
trans.ar = public/language/ar/search.json trans.ar = public/language/ar/search.json
trans.bn = public/language/bn/search.json
trans.bg = public/language/bg/search.json
trans.cs = public/language/cs/search.json trans.cs = public/language/cs/search.json
trans.da = public/language/da/search.json
trans.de = public/language/de/search.json trans.de = public/language/de/search.json
trans.el = public/language/el/search.json
trans.en_US = public/language/en_US/search.json trans.en_US = public/language/en_US/search.json
trans.en@pirate = public/language/en@pirate/search.json trans.en@pirate = public/language/en@pirate/search.json
trans.es = public/language/es/search.json trans.es = public/language/es/search.json
@@ -847,10 +664,8 @@ trans.et = public/language/et/search.json
trans.fa_IR = public/language/fa_IR/search.json trans.fa_IR = public/language/fa_IR/search.json
trans.fi = public/language/fi/search.json trans.fi = public/language/fi/search.json
trans.fr = public/language/fr/search.json trans.fr = public/language/fr/search.json
trans.gl = public/language/gl/search.json
trans.he = public/language/he/search.json trans.he = public/language/he/search.json
trans.hu = public/language/hu/search.json trans.hu = public/language/hu/search.json
trans.id = public/language/id/search.json
trans.it = public/language/it/search.json trans.it = public/language/it/search.json
trans.ja = public/language/ja/search.json trans.ja = public/language/ja/search.json
trans.ko = public/language/ko/search.json trans.ko = public/language/ko/search.json
@@ -862,11 +677,8 @@ trans.pl = public/language/pl/search.json
trans.pt_BR = public/language/pt_BR/search.json trans.pt_BR = public/language/pt_BR/search.json
trans.ru = public/language/ru/search.json trans.ru = public/language/ru/search.json
trans.ro = public/language/ro/search.json trans.ro = public/language/ro/search.json
trans.rw = public/language/rw/search.json
trans.sc = public/language/sc/search.json trans.sc = public/language/sc/search.json
trans.sk = public/language/sk/search.json trans.sk = public/language/sk/search.json
trans.sl = public/language/sl/search.json
trans.sr = public/language/sr/search.json
trans.sv = public/language/sv/search.json trans.sv = public/language/sv/search.json
trans.th = public/language/th/search.json trans.th = public/language/th/search.json
trans.tr = public/language/tr/search.json trans.tr = public/language/tr/search.json
@@ -876,16 +688,11 @@ trans.zh_TW = public/language/zh_TW/search.json
type = KEYVALUEJSON type = KEYVALUEJSON
[nodebb.groups] [nodebb.groups]
file_filter = public/language/<lang>/groups.json
source_file = public/language/en_GB/groups.json source_file = public/language/en_GB/groups.json
source_lang = en_GB source_lang = en_GB
trans.ar = public/language/ar/groups.json trans.ar = public/language/ar/groups.json
trans.bn = public/language/bn/groups.json
trans.bg = public/language/bg/groups.json
trans.cs = public/language/cs/groups.json trans.cs = public/language/cs/groups.json
trans.da = public/language/da/groups.json
trans.de = public/language/de/groups.json trans.de = public/language/de/groups.json
trans.el = public/language/el/groups.json
trans.en_US = public/language/en_US/groups.json trans.en_US = public/language/en_US/groups.json
trans.en@pirate = public/language/en@pirate/groups.json trans.en@pirate = public/language/en@pirate/groups.json
trans.es = public/language/es/groups.json trans.es = public/language/es/groups.json
@@ -893,10 +700,8 @@ trans.et = public/language/et/groups.json
trans.fa_IR = public/language/fa_IR/groups.json trans.fa_IR = public/language/fa_IR/groups.json
trans.fi = public/language/fi/groups.json trans.fi = public/language/fi/groups.json
trans.fr = public/language/fr/groups.json trans.fr = public/language/fr/groups.json
trans.gl = public/language/gl/groups.json
trans.he = public/language/he/groups.json trans.he = public/language/he/groups.json
trans.hu = public/language/hu/groups.json trans.hu = public/language/hu/groups.json
trans.id = public/language/id/groups.json
trans.it = public/language/it/groups.json trans.it = public/language/it/groups.json
trans.ja = public/language/ja/groups.json trans.ja = public/language/ja/groups.json
trans.ko = public/language/ko/groups.json trans.ko = public/language/ko/groups.json
@@ -908,11 +713,8 @@ trans.pl = public/language/pl/groups.json
trans.pt_BR = public/language/pt_BR/groups.json trans.pt_BR = public/language/pt_BR/groups.json
trans.ru = public/language/ru/groups.json trans.ru = public/language/ru/groups.json
trans.ro = public/language/ro/groups.json trans.ro = public/language/ro/groups.json
trans.rw = public/language/rw/groups.json
trans.sc = public/language/sc/groups.json trans.sc = public/language/sc/groups.json
trans.sk = public/language/sk/groups.json trans.sk = public/language/sk/groups.json
trans.sl = public/language/sl/groups.json
trans.sr = public/language/sr/groups.json
trans.sv = public/language/sv/groups.json trans.sv = public/language/sv/groups.json
trans.th = public/language/th/groups.json trans.th = public/language/th/groups.json
trans.tr = public/language/tr/groups.json trans.tr = public/language/tr/groups.json

30
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,30 @@
# Issues & Bugs
Thanks for reporting an issue with NodeBB! Please follow these guidelines in order to streamline the debugging process. The more guidelines you follow, the easier it will be for us to reproduce your problem.
In general, if we can't reproduce it, we can't fix it!
## Try the latest version of NodeBB
There is a chance that the issue you are experiencing may have already been fixed.
## Provide the NodeBB version number and git hash
You can find the NodeBB version number in the Admin Control Panel (ACP), as well as the first line output to the shell when running NodeBB
``` plaintext
info: NodeBB v0.5.2-dev Copyright (C) 2013-2014 NodeBB Inc.
info: This program comes with ABSOLUTELY NO WARRANTY.
info: This is free software, and you are welcome to redistribute it under certain conditions.
info:
info: Time: Tue Oct 07 2014 20:25:20 GMT-0400 (EDT)
```
If you are running NodeBB via git, it is also helpful to let the maintainers know what commit hash you are on. To find the commit hash, execute the following command:
``` bash
$ cd /path/to/my/nodebb
$ git rev-parse HEAD
```
If you have downloaded the `.zip` or `.tar.gz` packages from GitHub (or elsewhere), please let us know.

View File

@@ -1,15 +0,0 @@
# The base image is the latest 4.x node (LTS) on jessie (debian)
# -onbuild will install the node dependencies found in the project package.json
# and copy its content in /usr/src/app, its WORKDIR
FROM node:4-onbuild
ENV NODE_ENV=production \
daemon=false \
silent=false
# nodebb setup will ask you for connection information to a redis (default), mongodb then run the forum
# nodebb upgrade is not included and might be desired
CMD node app --setup && npm start
# the default port for NodeBB is exposed outside the container
EXPOSE 4567

View File

@@ -1,84 +0,0 @@
"use strict";
var fork = require('child_process').fork,
env = process.env,
worker,
incomplete = [];
module.exports = function(grunt) {
function update(action, filepath, target) {
var args = [],
fromFile = '',
compiling = '',
time = Date.now();
if (!grunt.option('verbose')) {
args.push('--log-level=info');
}
if (target === 'lessUpdated') {
fromFile = ['js','tpl'];
compiling = 'less';
} else if (target === 'clientUpdated') {
fromFile = ['less','tpl'];
compiling = 'js';
} else if (target === 'templatesUpdated') {
fromFile = ['js','less'];
compiling = 'tpl';
} else if (target === 'serverUpdated') {
fromFile = ['less','js','tpl'];
}
fromFile = fromFile.filter(function(ext) {
return incomplete.indexOf(ext) === -1;
});
args.push('--from-file=' + fromFile.join(','));
incomplete.push(compiling);
worker.kill();
worker = fork('app.js', args, { env: env });
worker.on('message', function() {
if (incomplete.length) {
incomplete = [];
if (grunt.option('verbose')) {
grunt.log.writeln('NodeBB restarted in ' + (Date.now() - time) + ' ms');
}
}
});
}
grunt.initConfig({
watch: {
lessUpdated: {
files: ['public/**/*.less', 'node_modules/nodebb-*/*.less', 'node_modules/nodebb-*/*/*.less', 'node_modules/nodebb-*/*/*/*.less', 'node_modules/nodebb-*/*/*/*/*.less']
},
clientUpdated: {
files: ['public/src/**/*.js', 'node_modules/nodebb-*/*.js', 'node_modules/nodebb-*/*/*.js', 'node_modules/nodebb-*/*/*/*.js', 'node_modules/nodebb-*/*/*/*/*.js', 'node_modules/templates.js/lib/templates.js']
},
serverUpdated: {
files: ['*.js', 'install/*.js', 'src/**/*.js']
},
templatesUpdated: {
files: ['src/views/**/*.tpl', 'node_modules/nodebb-*/*.tpl', 'node_modules/nodebb-*/*/*.tpl', 'node_modules/nodebb-*/*/*/*.tpl', 'node_modules/nodebb-*/*/*/*/*.tpl', 'node_modules/nodebb-*/*/*/*/*/*.tpl']
}
}
});
grunt.loadNpmTasks('grunt-contrib-watch');
if (grunt.option('skip')) {
grunt.registerTask('default', ['watch:serverUpdated']);
} else {
grunt.registerTask('default', ['watch']);
}
env.NODE_ENV = 'development';
worker = fork('app.js', [], { env: env });
grunt.event.on('watch', update);
};

View File

@@ -1,37 +1,28 @@
# <img alt="NodeBB" src="http://i.imgur.com/mYxPPtB.png" /> # <img alt="NodeBB" src="http://i.imgur.com/mYxPPtB.png" />
[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/NodeBB/NodeBB?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
[![Build Status](https://travis-ci.org/NodeBB/NodeBB.svg?branch=master)](https://travis-ci.org/NodeBB/NodeBB) [![Build Status](https://travis-ci.org/NodeBB/NodeBB.svg?branch=master)](https://travis-ci.org/NodeBB/NodeBB)
[![Dependency Status](https://david-dm.org/nodebb/nodebb.svg)](https://david-dm.org/nodebb/nodebb) [![Dependency Status](https://david-dm.org/nodebb/nodebb.svg)](https://david-dm.org/nodebb/nodebb)
[![Code Climate](https://codeclimate.com/github/NodeBB/NodeBB/badges/gpa.svg)](https://codeclimate.com/github/NodeBB/NodeBB) [![Code Climate](https://codeclimate.com/github/NodeBB/NodeBB/badges/gpa.svg)](https://codeclimate.com/github/NodeBB/NodeBB)
[![Documentation Status](https://readthedocs.org/projects/nodebb/badge/?version=latest)](https://readthedocs.org/projects/nodebb/?badge=latest) [![Documentation Status](https://readthedocs.org/projects/nodebb/badge/?version=latest)](https://readthedocs.org/projects/nodebb/?badge=latest)
[**NodeBB Forum Software**](https://nodebb.org) is powered by Node.js and built on either a Redis or MongoDB database. It utilizes web sockets for instant interactions and real-time notifications. NodeBB has many modern features out of the box such as social network integration and streaming discussions, while still making sure to be compatible with older browsers. **NodeBB Forum Software** is powered by Node.js and built on a Redis database. It utilizes web sockets for instant interactions and real-time notifications. NodeBB is compatible down to IE8 and has many modern features out of the box such as social network integration and streaming discussions.
Additional functionality is enabled through the use of third-party plugins.
* [Get NodeBB](http://www.nodebb.org/ "NodeBB") * [Get NodeBB](http://www.nodebb.org/ "NodeBB")
* [Demo & Meta Discussion](http://community.nodebb.org) * [Demo & Meta Discussion](http://community.nodebb.org)
* [Documentation & Installation Instructions](http://docs.nodebb.org)
* [Help translate NodeBB](https://www.transifex.com/projects/p/nodebb/)
* [NodeBB Blog](http://blog.nodebb.org) * [NodeBB Blog](http://blog.nodebb.org)
* [Documentation](http://docs.nodebb.org) - includes setup instructions for other platforms
* [Join us on IRC](https://kiwiirc.com/client/irc.freenode.net/nodebb) - #nodebb on Freenode * [Join us on IRC](https://kiwiirc.com/client/irc.freenode.net/nodebb) - #nodebb on Freenode
* [Follow us on Twitter](http://www.twitter.com/NodeBB/ "NodeBB Twitter") * [Follow us on Twitter](http://www.twitter.com/NodeBB/ "NodeBB Twitter")
* [Like us on Facebook](http://www.facebook.com/NodeBB/ "NodeBB Facebook") * [Like us on Facebook](http://www.facebook.com/NodeBB/ "NodeBB Facebook")
* [Get Plugins](http://community.nodebb.org/category/7/nodebb-plugins "NodeBB Plugins")
* [Get Themes](http://community.nodebb.org/category/10/nodebb-themes "NodeBB Themes")
* [Help translate NodeBB](https://www.transifex.com/projects/p/nodebb/)
## Screenshots ## Screenshots
[![](http://i.imgur.com/VCoOFyqb.png)](http://i.imgur.com/VCoOFyq.png) [<img src="http://i.imgur.com/FLOUuIqb.png" />](http://i.imgur.com/FLOUuIq.png)&nbsp;[<img src="http://i.imgur.com/Ud1LrfIb.png" />](http://i.imgur.com/Ud1LrfI.png)&nbsp;[<img src="http://i.imgur.com/ZC8W39ab.png" />](http://i.imgur.com/ZC8W39a.png)&nbsp;[<img src="http://i.imgur.com/o90kVPib.png" />](http://i.imgur.com/o90kVPi.png)&nbsp;[<img src="http://i.imgur.com/AaRRrU2b.png" />](http://i.imgur.com/AaRRrU2.png)&nbsp;[<img src="http://i.imgur.com/LmHtPhob.png" />](http://i.imgur.com/LmHtPho.png)&nbsp;[<img src="http://i.imgur.com/paiJPJkb.jpg" />](http://i.imgur.com/paiJPJk.jpg)&nbsp;[<img src="http://i.imgur.com/ZfavPHDb.png" />](http://i.imgur.com/ZfavPHD.png)&nbsp;[<img src="http://i.imgur.com/8OLssij.png" />](http://i.imgur.com/8OLssij.png)&nbsp;[<img src="http://i.imgur.com/JKOc0LZ.png"/>](http://i.imgur.com/JKOc0LZ.png)
[![](http://i.imgur.com/FLOUuIqb.png)](http://i.imgur.com/FLOUuIq.png)
[![](http://i.imgur.com/Ud1LrfIb.png)](http://i.imgur.com/Ud1LrfI.png) Credit: [Convoe](http://www.convoe.com), [Kano](http://www.kano.me), [Manchester United Forum](http://manutdforums.com/).
[![](http://i.imgur.com/h6yZ66sb.png)](http://i.imgur.com/h6yZ66s.png)
[![](http://i.imgur.com/o90kVPib.png)](http://i.imgur.com/o90kVPi.png)
[![](http://i.imgur.com/AaRRrU2b.png)](http://i.imgur.com/AaRRrU2.png)
[![](http://i.imgur.com/LmHtPhob.png)](http://i.imgur.com/LmHtPho.png)
[![](http://i.imgur.com/paiJPJkb.jpg)](http://i.imgur.com/paiJPJk.jpg)
[![](http://i.imgur.com/8OLssij.png)](http://i.imgur.com/8OLssij.png)
[![](http://i.imgur.com/JKOc0LZ.png)](http://i.imgur.com/JKOc0LZ.png)
## How can I follow along/contribute? ## How can I follow along/contribute?
@@ -46,7 +37,7 @@ Additional functionality is enabled through the use of third-party plugins.
NodeBB requires the following software to be installed: NodeBB requires the following software to be installed:
* A version of Node.js at least 0.10 or greater * A version of Node.js at least 0.10 or greater
* Redis, version 2.8.9 or greater **or** MongoDB, version 2.6 or greater * Redis, version 2.6 or greater **or** MongoDB, version 2.6 or greater
* nginx, version 1.3.13 or greater (**only if** intending to use nginx to proxy requests to a NodeBB) * nginx, version 1.3.13 or greater (**only if** intending to use nginx to proxy requests to a NodeBB)
## Installation ## Installation
@@ -70,6 +61,4 @@ Detailed upgrade instructions are listed in [Upgrading NodeBB](https://docs.node
## License ## License
NodeBB is licensed under the **GNU General Public License v3 (GPL-3)** (http://www.gnu.org/copyleft/gpl.html). NodeBB is licensed under the **GNU General Public License v3 (GPL-3)** (http://www.gnu.org/copyleft/gpl.html)
Interested in a sublicense agreement for use of NodeBB in a non-free/restrictive environment? Contact us at sales@nodebb.org.

413
app.js
View File

@@ -21,68 +21,71 @@
/*global require, global, process*/ /*global require, global, process*/
var nconf = require('nconf'); var nconf = require('nconf');
nconf.argv().env('__'); nconf.argv().env();
var url = require('url'), var fs = require('fs'),
async = require('async'), os = require('os'),
semver = require('semver'),
winston = require('winston'), winston = require('winston'),
colors = require('colors'),
path = require('path'), path = require('path'),
cluster = require('cluster'),
pkg = require('./package.json'), pkg = require('./package.json'),
file = require('./src/file'); utils = require('./public/src/utils.js');
global.env = process.env.NODE_ENV || 'production'; global.env = process.env.NODE_ENV || 'production';
winston.remove(winston.transports.Console); winston.remove(winston.transports.Console);
winston.add(winston.transports.Console, { winston.add(winston.transports.Console, {
colorize: true, colorize: true
timestamp: function() {
var date = new Date();
return date.getDate() + '/' + (date.getMonth() + 1) + ' ' + date.toTimeString().substr(0,5) + ' [' + global.process.pid + ']';
},
level: nconf.get('log-level') || (global.env === 'production' ? 'info' : 'verbose')
}); });
winston.add(winston.transports.File, {
filename: 'logs/error.log',
level: 'error'
});
// Alternate configuration file support // TODO: remove once https://github.com/flatiron/winston/issues/280 is fixed
var configFile = path.join(__dirname, '/config.json'); winston.err = function (err) {
winston.error(err.stack);
};
if (nconf.get('config')) { if(os.platform() === 'linux') {
configFile = path.resolve(__dirname, nconf.get('config')); require('child_process').exec('/usr/bin/which convert', function(err, stdout, stderr) {
if(err || !stdout) {
winston.warn('Couldn\'t find convert. Did you install imagemagick?');
}
});
} }
var configExists = file.existsSync(configFile); if (!cluster.isWorker) {
loadConfig();
if (!process.send) {
// If run using `node app`, log GNU copyright info along with server info // If run using `node app`, log GNU copyright info along with server info
winston.info('NodeBB v' + nconf.get('version') + ' Copyright (C) 2013-2014 NodeBB Inc.'); winston.info('NodeBB v' + pkg.version + ' Copyright (C) 2013-2014 NodeBB Inc.');
winston.info('This program comes with ABSOLUTELY NO WARRANTY.'); winston.info('This program comes with ABSOLUTELY NO WARRANTY.');
winston.info('This is free software, and you are welcome to redistribute it under certain conditions.'); winston.info('This is free software, and you are welcome to redistribute it under certain conditions.');
winston.info(''); winston.info('');
} }
// Alternate configuration file support
var configFile = path.join(__dirname, '/config.json'),
configExists;
if (nconf.get('setup') || nconf.get('install')) { if (nconf.get('config')) {
configFile = path.resolve(__dirname, nconf.get('config'));
}
configExists = fs.existsSync(configFile);
if (!nconf.get('setup') && !nconf.get('install') && !nconf.get('upgrade') && !nconf.get('reset') && configExists) {
start();
} else if (nconf.get('setup') || nconf.get('install') || !configExists) {
setup(); setup();
} else if (!configExists) {
require('./install/web').install(nconf.get('port'));
} else if (nconf.get('upgrade')) { } else if (nconf.get('upgrade')) {
upgrade(); upgrade();
} else if (nconf.get('reset')) { } else if (nconf.get('reset')) {
require('./src/reset').reset(); reset();
} else if (nconf.get('activate')) {
activate();
} else if (nconf.get('plugins')) {
listPlugins();
} else {
start();
} }
function loadConfig() { function loadConfig() {
winston.verbose('* using configuration stored in: %s', configFile);
nconf.file({ nconf.file({
file: configFile file: configFile
}); });
@@ -90,174 +93,126 @@ function loadConfig() {
nconf.defaults({ nconf.defaults({
base_dir: __dirname, base_dir: __dirname,
themes_path: path.join(__dirname, 'node_modules'), themes_path: path.join(__dirname, 'node_modules'),
views_dir: path.join(__dirname, 'public/templates'), upload_url: '/uploads/',
version: pkg.version views_dir: path.join(__dirname, 'public/templates')
}); });
if (!nconf.get('isCluster')) {
nconf.set('isPrimary', 'true');
nconf.set('isCluster', 'false');
}
// Ensure themes_path is a full filepath // Ensure themes_path is a full filepath
nconf.set('themes_path', path.resolve(__dirname, nconf.get('themes_path'))); nconf.set('themes_path', path.resolve(__dirname, nconf.get('themes_path')));
nconf.set('core_templates_path', path.join(__dirname, 'src/views')); 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('base_templates_path', path.join(nconf.get('themes_path'), 'nodebb-theme-vanilla/templates'));
} }
function start() { function start() {
var db = require('./src/database'); loadConfig();
// nconf defaults, if not set in config if (!cluster.isWorker) {
if (!nconf.get('upload_path')) { winston.info('Time: ' + new Date());
nconf.set('upload_path', '/public/uploads'); winston.info('Initializing NodeBB v' + pkg.version);
winston.info('* using configuration stored in: ' + configFile);
} }
// Parse out the relative_url and other goodies from the configured URL
var urlObject = url.parse(nconf.get('url'));
var relativePath = urlObject.pathname !== '/' ? urlObject.pathname : '';
nconf.set('base_url', urlObject.protocol + '//' + urlObject.host);
nconf.set('secure', urlObject.protocol === 'https');
nconf.set('use_port', !!urlObject.port);
nconf.set('relative_path', relativePath);
nconf.set('port', urlObject.port || nconf.get('port') || nconf.get('PORT') || 4567);
nconf.set('upload_url', '/uploads/');
if (nconf.get('isPrimary') === 'true') {
winston.info('Time: %s', (new Date()).toString());
winston.info('Initializing NodeBB v%s', nconf.get('version'));
if (cluster.isWorker && process.env.cluster_setup === 'true') {
var host = nconf.get(nconf.get('database') + ':host'), var host = nconf.get(nconf.get('database') + ':host'),
storeLocation = host ? 'at ' + host + (host.indexOf('/') === -1 ? ':' + nconf.get(nconf.get('database') + ':port') : '') : ''; storeLocation = host ? 'at ' + host + (host.indexOf('/') === -1 ? ':' + nconf.get(nconf.get('database') + ':port') : '') : '';
winston.verbose('* using %s store %s', nconf.get('database'), storeLocation); winston.info('* using ' + nconf.get('database') +' store ' + storeLocation);
winston.verbose('* using themes stored in: %s', nconf.get('themes_path')); winston.info('* using themes stored in: ' + nconf.get('themes_path'));
} }
process.on('SIGTERM', shutdown); require('./src/database').init(function(err) {
process.on('SIGINT', shutdown);
process.on('SIGHUP', restart);
process.on('message', function(message) {
if (typeof message !== 'object') {
return;
}
var meta = require('./src/meta');
var emitter = require('./src/emitter');
switch (message.action) {
case 'reload':
meta.reload();
break;
case 'js-propagate':
meta.js.target[message.target] = meta.js.target[message.target] || {};
meta.js.target[message.target].cache = message.cache;
meta.js.target[message.target].map = message.map;
emitter.emit('meta:js.compiled');
winston.verbose('[cluster] Client-side javascript and mapping propagated to worker %s', process.pid);
break;
case 'css-propagate':
meta.css.cache = message.cache;
meta.css.acpCache = message.acpCache;
emitter.emit('meta:css.compiled');
winston.verbose('[cluster] Stylesheets propagated to worker %s', process.pid);
break;
case 'templates:compiled':
emitter.emit('templates:compiled');
break;
}
});
process.on('uncaughtException', function(err) {
winston.error(err.stack);
console.log(err.stack);
require('./src/meta').js.killMinifier();
shutdown(1);
});
async.waterfall([
async.apply(db.init),
async.apply(db.checkCompatibility),
function(next) {
require('./src/meta').configs.init(next);
},
function(next) {
require('./src/meta').dependencies.check(next);
},
function(next) {
require('./src/upgrade').check(next);
},
function(next) {
var webserver = require('./src/webserver');
require('./src/socket.io').init(webserver.server);
if (nconf.get('isPrimary') === 'true' && !nconf.get('jobsDisabled')) {
require('./src/notifications').init();
require('./src/user').startJobs();
}
webserver.listen();
}
], function(err) {
if (err) { if (err) {
switch(err.message) { winston.error(err.stack);
case 'schema-out-of-date':
winston.warn('Your NodeBB schema is out-of-date. Please run the following command to bring your dataset up to spec:');
winston.warn(' ./nodebb upgrade');
break;
case 'dependencies-out-of-date':
winston.warn('One or more of NodeBB\'s dependent packages are out-of-date. Please run the following command to update them:');
winston.warn(' ./nodebb upgrade');
break;
default:
if (err.stacktrace !== false) {
winston.error(err.stack);
} else {
winston.error(err.message);
}
break;
}
// Either way, bad stuff happened. Abort start.
process.exit(); process.exit();
} }
var meta = require('./src/meta');
meta.configs.init(function () {
var templates = require('templates.js'),
webserver = require('./src/webserver'),
sockets = require('./src/socket.io'),
plugins = require('./src/plugins'),
upgrade = require('./src/upgrade');
templates.setGlobal('relative_path', nconf.get('relative_path'));
upgrade.check(function(schema_ok) {
if (schema_ok || nconf.get('check-schema') === false) {
sockets.init(webserver.server);
nconf.set('url', nconf.get('base_url') + (nconf.get('use_port') ? ':' + nconf.get('port') : '') + nconf.get('relative_path'));
plugins.ready(function() {
webserver.init(function() {
webserver.listen(function() {
process.send({
action: 'ready'
});
});
});
});
process.on('SIGTERM', shutdown);
process.on('SIGINT', shutdown);
process.on('SIGHUP', restart);
process.on('message', function(message) {
switch(message.action) {
case 'reload':
meta.reload();
break;
case 'js-propagate':
meta.js.cache = message.cache;
meta.js.map = message.map;
winston.info('[cluster] Client-side javascript and mapping propagated to worker ' + cluster.worker.id);
break;
case 'css-propagate':
meta.css.cache = message.cache;
meta.css.acpCache = message.acpCache;
winston.info('[cluster] Stylesheets propagated to worker ' + cluster.worker.id);
break;
}
});
process.on('uncaughtException', function(err) {
winston.error(err.stack);
console.log(err.stack);
meta.js.killMinifier();
shutdown(1);
});
} else {
winston.warn('Your NodeBB schema is out-of-date. Please run the following command to bring your dataset up to spec:');
winston.warn(' ./nodebb upgrade');
if (cluster.isWorker) {
cluster.worker.kill();
} else {
process.exit();
}
}
});
});
}); });
} }
function setup() { function setup() {
winston.info('NodeBB Setup Triggered via Command Line'); loadConfig();
if (nconf.get('setup')) {
winston.info('NodeBB Setup Triggered via Command Line');
} else {
winston.warn('Configuration not found, starting NodeBB setup');
}
var install = require('./src/install'); var install = require('./src/install');
process.stdout.write('\nWelcome to NodeBB!\n'); winston.info('Welcome to NodeBB!');
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'); winston.info('This looks like a new installation, so you\'ll have to answer a few questions about your environment before we can proceed.');
process.stdout.write('Press enter to accept the default setting (shown in brackets).\n'); winston.info('Press enter to accept the default setting (shown in brackets).');
install.setup(function (err, data) {
var separator = ' ';
if (process.stdout.columns > 10) {
for(var x=0,cols=process.stdout.columns-10;x<cols;x++) {
separator += '=';
}
}
process.stdout.write('\n' + separator + '\n\n');
install.setup(function (err) {
if (err) { if (err) {
winston.error('There was a problem completing NodeBB setup: ', err.message); winston.error('There was a problem completing NodeBB setup: ', err.message);
} else { } else {
if (data.hasOwnProperty('password')) { winston.info('NodeBB Setup Completed. Run \'./nodebb start\' to manually start your NodeBB server.');
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(); process.exit();
@@ -265,6 +220,8 @@ function setup() {
} }
function upgrade() { function upgrade() {
loadConfig();
require('./src/database').init(function(err) { require('./src/database').init(function(err) {
if (err) { if (err) {
winston.error(err.stack); winston.error(err.stack);
@@ -276,28 +233,108 @@ function upgrade() {
}); });
} }
function activate() { function reset() {
loadConfig();
require('./src/database').init(function(err) { require('./src/database').init(function(err) {
var plugin = nconf.get('_')[1] ? nconf.get('_')[1] : nconf.get('activate'), if (err) {
db = require('./src/database'); winston.error(err.message);
winston.info('Activating plugin %s', plugin);
db.sortedSetAdd('plugins:active', 0, plugin, start);
});
}
function listPlugins() {
require('./src/database').init(function(err) {
var db = require('./src/database');
db.getSortedSetRange('plugins:active', 0, -1, function(err, plugins) {
winston.info('Active plugins: \n\t - ' + plugins.join('\n\t - '));
process.exit(); process.exit();
}); }
if (nconf.get('themes')) {
resetThemes();
} else if (nconf.get('plugin')) {
resetPlugin(nconf.get('plugin'));
} else if (nconf.get('plugins')) {
resetPlugins();
} else if (nconf.get('widgets')) {
resetWidgets();
} else if (nconf.get('settings')) {
resetSettings();
} else if (nconf.get('all')) {
require('async').series([resetWidgets, resetThemes, resetPlugins, resetSettings], function(err) {
if (!err) {
winston.info('[reset] Reset complete.');
} else {
winston.error('[reset] Errors were encountered while resetting your forum settings: ' + err.message);
}
process.exit();
});
} else {
winston.warn('[reset] Nothing reset.');
}
}); });
} }
function resetSettings(callback) {
var meta = require('./src/meta');
meta.configs.set('allowLocalLogin', 1, function(err) {
winston.info('[reset] Settings reset to default');
if (typeof callback === 'function') {
callback(err);
} else {
process.exit();
}
});
}
function resetThemes(callback) {
var meta = require('./src/meta');
meta.themes.set({
type: 'local',
id: 'nodebb-theme-vanilla'
}, function(err) {
winston.info('[reset] Theme reset to Vanilla');
if (typeof callback === 'function') {
callback(err);
} else {
process.exit();
}
});
}
function resetPlugin(pluginId) {
var db = require('./src/database');
db.setRemove('plugins:active', pluginId, function(err, result) {
if (err || result !== 1) {
winston.error('[reset] Could not disable plugin: ' + pluginId);
if (err) {
winston.error('[reset] Encountered error: ' + err.message);
} else {
winston.info('[reset] Perhaps it has already been disabled?');
}
} else {
winston.info('[reset] Plugin `' + pluginId + '` disabled');
}
process.exit();
});
}
function resetPlugins(callback) {
var db = require('./src/database');
db.delete('plugins:active', function(err) {
winston.info('[reset] All Plugins De-activated');
if (typeof callback === 'function') {
callback(err);
} else {
process.exit();
}
});
}
function resetWidgets(callback) {
require('./src/widgets').reset(function(err) {
winston.info('[reset] All Widgets moved to Draft Zone');
if (typeof callback === 'function') {
callback(err);
} else {
process.exit();
}
});
}
function shutdown(code) { function shutdown(code) {
winston.info('[app] Shutdown (SIGTERM/SIGINT) Initialised.'); winston.info('[app] Shutdown (SIGTERM/SIGINT) Initialised.');

View File

@@ -2,33 +2,28 @@
'use strict'; 'use strict';
var bcrypt = require('bcryptjs'), var bcrypt = require('bcryptjs'),
async = require('async'); async = require('async'),
action = process.argv[2];
switch(action) {
case 'compare':
bcrypt.compare(process.argv[3], process.argv[4], function(err, res) {
process.stdout.write(res ? 'true' : 'false');
});
break;
process.on('message', function(msg) { case 'hash':
if (msg.type === 'hash') { async.waterfall([
hashPassword(msg.password, msg.rounds); async.apply(bcrypt.genSalt, parseInt(process.argv[3], 10)),
} else if (msg.type === 'compare') { function(salt, next) {
bcrypt.compare(msg.password, msg.hash, done); bcrypt.hash(process.argv[4], salt, next);
} }
}); ], function(err, hash) {
if (!err) {
function hashPassword(password, rounds) { process.stdout.write(hash);
async.waterfall([ } else {
function(next) { process.stderr.write(err.message);
bcrypt.genSalt(parseInt(rounds, 10), next); }
}, });
function(salt, next) { break;
bcrypt.hash(password, salt, next);
}
], done);
}
function done(err, result) {
if (err) {
process.send({err: err.message});
return process.disconnect();
}
process.send({result: result});
process.disconnect();
} }

View File

@@ -2,33 +2,97 @@
{ {
"name": "Announcements", "name": "Announcements",
"description": "Announcements regarding our community", "description": "Announcements regarding our community",
"bgColor": "#fda34b", "bgColor": "#0059B2",
"color": "#fff", "color": "#fff",
"icon" : "fa-bullhorn", "icon" : "fa-bullhorn",
"order": 1 "order": 1
}, },
{ {
"name": "General Discussion", "name": "General Discussion",
"description": "A place to talk about whatever you want", "description": "A place to talk about whateeeever you want",
"bgColor": "#59b3d0", "bgColor": "#0059B2",
"color": "#fff", "color": "#fff",
"icon" : "fa-comments-o", "icon" : "fa-comment",
"order": 2 "order": 2
}, },
{
"name": "NodeBB Development",
"description": "NodeBB development news and announcements",
"bgColor": "#0059B2",
"color": "#fff",
"icon" : "fa-github",
"order": 3
},
{ {
"name": "Blogs", "name": "Blogs",
"description": "Blog posts from individual members", "description": "Blog posts from individual members",
"bgColor": "#86ba4b", "bgColor": "#0059B2",
"color": "#fff", "color": "#fff",
"icon" : "fa-newspaper-o", "icon" : "fa-pencil",
"order": 4 "order": 4
}, },
{ {
"name": "Comments & Feedback", "name": "Feature Requests",
"description": "Got a question? Ask away!", "description": "Got a feature request you'd like to see? Give us a shout here.",
"bgColor": "#e95c5a", "bgColor": "#ab1290",
"color": "#fff", "color": "#fff",
"icon" : "fa-question", "icon" : "fa-lightbulb-o",
"order": 3 "order": 5
},
{
"name": "Bug Reports",
"description": "Having trouble with NodeBB? Let us know...",
"bgColor": "#ab1290",
"color": "#fff",
"icon" : "fa-cogs",
"order": 6
},
{
"name": "NodeBB Plugins",
"description": "Enhance your NodeBB with plugins!",
"bgColor": "#ab1290",
"color": "#fff",
"icon" : "fa-plus-square",
"order": 7
},
{
"name": "NodeBB Link Exchange",
"description": "Link exchange",
"bgColor": "#ab1290",
"color": "#fff",
"icon" : "fa-exchange",
"order": 8
},
{
"name": "News",
"description": "News from around the world",
"bgColor": "#004C66",
"color": "#fff",
"icon" : "fa-globe",
"order": 9
},
{
"name": "Movies",
"description": "Discuss the latest movies here",
"bgColor": "#004C66",
"color": "#fff",
"icon" : "fa-film",
"order": 10
},
{
"name": "Games",
"description": "Discuss the latest games here",
"bgColor": "#004C66",
"color": "#fff",
"icon" : "fa-crosshairs",
"order": 11
},
{
"name": "Random",
"description": "Anything and (almost) everything welcome!",
"bgColor": "#004C66",
"color": "#fff",
"icon" : "fa-beer",
"order": 12
} }
] ]

View File

@@ -1,34 +1,86 @@
{ [
"title": "NodeBB", {
"showSiteTitle": 1, "field": "title",
"postDelay": 10, "value": "NodeBB"
"initialPostDelay": 10, },
"newbiePostDelay": 120, {
"newbiePostDelayThreshold": 3, "field": "showSiteTitle",
"minimumPostLength": 8, "value": "1"
"maximumPostLength": 32767, },
"minimumTagsPerTopic": 0, {
"maximumTagsPerTopic": 5, "field": "postDelay",
"allowGuestSearching": 0, "value": 10
"allowTopicsThumbnail": 0, },
"registrationType": "normal", {
"allowLocalLogin": 1, "field": "initialPostDelay",
"allowAccountDelete": 1, "value": 10
"allowFileUploads": 0, },
"allowUserHomePage": 1, {
"maximumFileSize": 2048, "field": "minimumPostLength",
"minimumTitleLength": 3, "value": 8
"maximumTitleLength": 255, },
"minimumUsernameLength": 2, {
"maximumUsernameLength": 16, "field": "allowGuestSearching",
"minimumPasswordLength": 6, "value": 0
"maximumSignatureLength": 255, },
"maximumAboutMeLength": 1000, {
"maximumProfileImageSize": 256, "field": "allowTopicsThumbnail",
"maximumCoverImageSize": 2048, "value": 0
"profileImageDimension": 128, },
"requireEmailConfirmation": 0, {
"allowProfileImageUploads": 1, "field": "allowRegistration",
"teaserPost": "last", "value": 1
"allowPrivateGroups": 1 },
} {
"field": "allowLocalLogin",
"value": 1
},
{
"field": "allowAccountDelete",
"value": 1
},
{
"field": "allowFileUploads",
"value": 0
},
{
"field": "maximumFileSize",
"value": 2048
},
{
"field": "minimumTitleLength",
"value": 3
},
{
"field": "maximumTitleLength",
"value": 255
},
{
"field": "minimumUsernameLength",
"value": 2
},
{
"field": "maximumUsernameLength",
"value": 16
},
{
"field": "minimumPasswordLength",
"value": 6
},
{
"field": "maximumSignatureLength",
"value": 255
},
{
"field": "maximumProfileImageSize",
"value": 256
},
{
"field": "profileImageDimension",
"value": 128
},
{
"field": "requireEmailConfirmation",
"value": 0
}
]

View File

@@ -1,10 +0,0 @@
[
{
"widget": "html",
"data" : {
"html": "<footer id=\"footer\" class=\"container footer\">\r\n\t<div class=\"copyright\">\r\n\t\tCopyright © 2015 <a target=\"_blank\" href=\"https://nodebb.org\">NodeBB Forums</a> | <a target=\"_blank\" href=\"//github.com/NodeBB/NodeBB/graphs/contributors\">Contributors</a>\r\n\t</div>\r\n</footer>",
"title":"",
"container":""
}
}
]

View File

@@ -1,87 +0,0 @@
[
{
"route": "/categories",
"title": "\\[\\[global:header.categories\\]\\]",
"enabled": true,
"iconClass": "fa-list",
"textClass": "visible-xs-inline",
"text": "\\[\\[global:header.categories\\]\\]"
},
{
"id": "unread-count",
"route": "/unread",
"title": "\\[\\[global:header.unread\\]\\]",
"enabled": true,
"iconClass": "fa-inbox",
"textClass": "visible-xs-inline",
"text": "\\[\\[global:header.unread\\]\\]",
"properties": {
"loggedIn": true
}
},
{
"route": "/recent",
"title": "\\[\\[global:header.recent\\]\\]",
"enabled": true,
"iconClass": "fa-clock-o",
"textClass": "visible-xs-inline",
"text": "\\[\\[global:header.recent\\]\\]"
},
{
"route": "/tags",
"title": "\\[\\[global:header.tags\\]\\]",
"enabled": true,
"iconClass": "fa-tags",
"textClass": "visible-xs-inline",
"text": "\\[\\[global:header.tags\\]\\]"
},
{
"route": "/popular",
"title": "\\[\\[global:header.popular\\]\\]",
"enabled": true,
"iconClass": "fa-fire",
"textClass": "visible-xs-inline",
"text": "\\[\\[global:header.popular\\]\\]"
},
{
"route": "/users",
"title": "\\[\\[global:header.users\\]\\]",
"enabled": true,
"iconClass": "fa-user",
"textClass": "visible-xs-inline",
"text": "\\[\\[global:header.users\\]\\]"
},
{
"route": "/groups",
"title": "\\[\\[global:header.groups\\]\\]",
"enabled": true,
"iconClass": "fa-group",
"textClass": "visible-xs-inline",
"text": "\\[\\[global:header.groups\\]\\]"
},
{
"route": "/admin",
"title": "\\[\\[global:header.admin\\]\\]",
"enabled": true,
"iconClass": "fa-cogs",
"textClass": "visible-xs-inline",
"text": "\\[\\[global:header.admin\\]\\]",
"properties": {
"targetBlank": false,
"adminOnly": true
}
},
{
"route": "/search",
"title": "\\[\\[global:header.search\\]\\]",
"enabled": true,
"iconClass": "fa-search",
"textClass": "visible-xs-inline",
"text": "\\[\\[global:header.search\\]\\]",
"properties": {
"installed": {
"search": true
}
}
}
]

View File

@@ -1,10 +0,0 @@
# Welcome to your brand new NodeBB forum!
This is what a topic and post looks like. As an administrator, you can edit the post\'s title and content.
To customise your forum, go to the [Administrator Control Panel](../../admin). You can modify all aspects of your forum there, including installation of third-party plugins.
## Additional Resources
* [NodeBB Documentation](https://docs.nodebb.org)
* [Community Support Forum](https://community.nodebb.org)
* [Project repository](https://github.com/nodebb/nodebb)

View File

@@ -1,82 +1,104 @@
"use strict"; "use strict";
var async = require('async'); var async = require('async'),
var prompt = require('prompt'); prompt = require('prompt'),
var winston = require('winston'); nconf = require('nconf'),
winston = require('winston'),
var questions = { questions = {};
redis: require('../src/database/redis').questions,
mongo: require('../src/database/mongo').questions
};
module.exports = function(config, callback) { function success(err, config, callback) {
async.waterfall([
function (next) {
process.stdout.write('\n');
winston.info('Now configuring ' + config.database + ' database:');
getDatabaseConfig(config, next);
},
function (databaseConfig, next) {
saveDatabaseConfig(config, databaseConfig, next);
}
], callback);
};
function getDatabaseConfig(config, callback) {
if (!config) { if (!config) {
return callback(new Error('aborted')); return callback(new Error('aborted'));
} }
if (config.database === 'redis') { var database = (config.redis || config.mongo) ? config.secondary_database : config.database;
function dbQuestionsSuccess(err, databaseConfig) {
if (!databaseConfig) {
return callback(new Error('aborted'));
}
// Translate redis properties into redis object
if(database === 'redis') {
config.redis = {
host: databaseConfig['redis:host'],
port: databaseConfig['redis:port'],
password: databaseConfig['redis:password'],
database: databaseConfig['redis:database']
};
if (config.redis.host.slice(0, 1) === '/') {
delete config.redis.port;
}
} else if (database === 'mongo') {
config.mongo = {
host: databaseConfig['mongo:host'],
port: databaseConfig['mongo:port'],
username: databaseConfig['mongo:username'],
password: databaseConfig['mongo:password'],
database: databaseConfig['mongo:database']
};
} else {
return callback(new Error('unknown database : ' + database));
}
var allQuestions = questions.redis.concat(questions.mongo);
for(var x=0;x<allQuestions.length;x++) {
delete config[allQuestions[x].name];
}
callback(err, config);
}
if(database === 'redis') {
if (config['redis:host'] && config['redis:port']) { if (config['redis:host'] && config['redis:port']) {
callback(null, config); dbQuestionsSuccess(null, config);
} else { } else {
prompt.get(questions.redis, callback); prompt.get(questions.redis, dbQuestionsSuccess);
} }
} else if (config.database === 'mongo') { } else if(database === 'mongo') {
if (config['mongo:host'] && config['mongo:port']) { if (config['mongo:host'] && config['mongo:port']) {
callback(null, config); dbQuestionsSuccess(null, config);
} else { } else {
prompt.get(questions.mongo, callback); prompt.get(questions.mongo, dbQuestionsSuccess);
} }
} else { } else {
return callback(new Error('unknown database : ' + config.database)); return callback(new Error('unknown database : ' + database));
} }
} }
function saveDatabaseConfig(config, databaseConfig, callback) { function getSecondaryDatabaseModules(config, next) {
if (!databaseConfig) { prompt.get({
return callback(new Error('aborted')); "name": "secondary_db_modules",
} "description": "Which database modules should " + config.secondary_database + " store?",
"default": nconf.get('secondary_db_modules') || "hash, list, sets, sorted"
// Translate redis properties into redis object }, function(err, db) {
if (config.database === 'redis') { config.secondary_db_modules = db.secondary_db_modules;
config.redis = { success(err, config, next);
host: databaseConfig['redis:host'], });
port: databaseConfig['redis:port'],
password: databaseConfig['redis:password'],
database: databaseConfig['redis:database']
};
if (config.redis.host.slice(0, 1) === '/') {
delete config.redis.port;
}
} else if (config.database === 'mongo') {
config.mongo = {
host: databaseConfig['mongo:host'],
port: databaseConfig['mongo:port'],
username: databaseConfig['mongo:username'],
password: databaseConfig['mongo:password'],
database: databaseConfig['mongo:database']
};
} else {
return callback(new Error('unknown database : ' + config.database));
}
var allQuestions = questions.redis.concat(questions.mongo);
for (var x=0; x<allQuestions.length; x++) {
delete config[allQuestions[x].name];
}
callback(null, config);
} }
module.exports = function(err, config, databases, callback) {
var allowedDBs = Object.keys(databases);
allowedDBs.forEach(function(db) {
questions[db] = require('./../src/database/' + db).questions;
});
async.waterfall([
function(next) {
process.stdout.write('\n');
winston.info('Now configuring ' + config.database + ' database:');
success(err, config, next);
},
function(config, next) {
if (config.secondary_database && allowedDBs.indexOf(config.secondary_database) !== -1) {
winston.info('Now configuring ' + config.secondary_database + ' database:');
getSecondaryDatabaseModules(config, next);
} else {
next(err, config);
}
}
], callback);
};

View File

@@ -1,158 +0,0 @@
"use strict";
var winston = require('winston'),
express = require('express'),
bodyParser = require('body-parser'),
fs = require('fs'),
path = require('path'),
less = require('less'),
async = require('async'),
uglify = require('uglify-js'),
nconf = require('nconf'),
app = express(),
server;
winston.add(winston.transports.File, {
filename: 'logs/webinstall.log',
colorize: true,
timestamp: function() {
var date = new Date();
return date.getDate() + '/' + (date.getMonth() + 1) + ' ' + date.toTimeString().substr(0,5) + ' [' + global.process.pid + ']';
},
level: 'verbose'
});
var web = {},
scripts = [
'public/vendor/xregexp/xregexp.js',
'public/vendor/xregexp/unicode/unicode-base.js',
'public/src/utils.js',
'public/src/installer/install.js'
];
web.install = function(port) {
port = port || 4567;
winston.info('Launching web installer on port', port);
app.use(express.static('public', {}));
app.engine('tpl', require('templates.js').__express);
app.set('view engine', 'tpl');
app.set('views', path.join(__dirname, '../src/views'));
app.use(bodyParser.urlencoded({
extended: true
}));
async.parallel([compileLess, compileJS], function() {
setupRoutes();
launchExpress(port);
});
};
function launchExpress(port) {
server = app.listen(port, function() {
winston.info('Web installer listening on http://%s:%s', '0.0.0.0', port);
});
}
function setupRoutes() {
app.get('/', welcome);
app.post('/', install);
app.post('/launch', launch);
}
function welcome(req, res) {
var dbs = ['redis', 'mongo'],
databases = [];
dbs.forEach(function(el) {
databases.push({
name: el,
questions: require('../src/database/' + el).questions
});
});
res.render('install/index', {
databases: databases,
skipDatabaseSetup: !!nconf.get('database'),
error: res.locals.error ? true : false,
success: res.locals.success ? true : false,
values: req.body
});
}
function install(req, res) {
for (var i in req.body) {
if (req.body.hasOwnProperty(i) && !process.env.hasOwnProperty(i)) {
process.env[i.replace(':', '__')] = req.body[i];
}
}
var child = require('child_process').fork('app', ['--setup'], {
env: process.env
});
child.on('close', function(data) {
if (data === 0) {
res.locals.success = true;
} else {
res.locals.error = true;
}
welcome(req, res);
});
}
function launch(req, res) {
var pidFilePath = __dirname + '../pidfile';
res.json({});
server.close();
var child = require('child_process').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');
child.unref();
process.exit(0);
}
function compileLess(callback) {
if ((nconf.get('from-file') || '').indexOf('less') !== -1) {
winston.info('LESS compilation skipped');
return callback(false);
}
fs.readFile(path.join(__dirname, '../public/less/install.less'), function(err, style) {
less.render(style.toString(), function(err, css) {
if(err) {
return winston.error('Unable to compile LESS: ', err);
}
fs.writeFile(path.join(__dirname, '../public/stylesheet.css'), css.css, callback);
});
});
}
function compileJS(callback) {
if ((nconf.get('from-file') || '').indexOf('js') !== -1) {
winston.info('Client-side JS compilation skipped');
return callback(false);
}
var scriptPath = path.join(__dirname, '..'),
result = uglify.minify(scripts.map(function(script) {
return path.join(scriptPath, script);
}));
fs.writeFile(path.join(__dirname, '../public/nodebb.min.js'), result.code, callback);
}
module.exports = web;

366
loader.js
View File

@@ -1,30 +1,25 @@
'use strict'; "use strict";
var nconf = require('nconf'), var nconf = require('nconf'),
fs = require('fs'), fs = require('fs'),
url = require('url'),
path = require('path'), path = require('path'),
fork = require('child_process').fork, cluster = require('cluster'),
async = require('async'), async = require('async'),
logrotate = require('logrotate-stream'), logrotate = require('logrotate-stream'),
file = require('./src/file'),
pkg = require('./package.json');
nconf.argv().env().file({ pkg = require('./package.json'),
file: path.join(__dirname, '/config.json')
});
var pidFilePath = __dirname + '/pidfile', pidFilePath = __dirname + '/pidfile',
output = logrotate({ file: __dirname + '/logs/output.log', size: '1m', keep: 3, compress: true }), output = logrotate({ file: __dirname + '/logs/output.log', size: '1m', keep: 3, compress: true }),
silent = nconf.get('silent') === 'false' ? false : nconf.get('silent') !== false, silent = process.env.NODE_ENV !== 'development' ? true : false,
numProcs, numProcs,
workers = [],
Loader = { Loader = {
timesStarted: 0, timesStarted: 0,
shutdown_queue: [],
js: { js: {
target: {} cache: undefined,
map: undefined
}, },
css: { css: {
cache: undefined, cache: undefined,
@@ -33,6 +28,12 @@ var pidFilePath = __dirname + '/pidfile',
}; };
Loader.init = function(callback) { Loader.init = function(callback) {
cluster.setupMaster({
exec: "app.js",
silent: silent
});
Loader.primaryWorker = 1;
if (silent) { if (silent) {
console.log = function(value) { console.log = function(value) {
output.write(value + '\n'); output.write(value + '\n');
@@ -40,13 +41,10 @@ Loader.init = function(callback) {
} }
process.on('SIGHUP', Loader.restart); process.on('SIGHUP', Loader.restart);
process.on('SIGUSR2', Loader.reload);
process.on('SIGTERM', Loader.stop);
callback(); callback();
}; };
Loader.displayStartupMessages = function(callback) { Loader.displayStartupMessages = function(callback) {
console.log('');
console.log('NodeBB v' + pkg.version + ' Copyright (C) 2013-2014 NodeBB Inc.'); console.log('NodeBB v' + pkg.version + ' Copyright (C) 2013-2014 NodeBB Inc.');
console.log('This program comes with ABSOLUTELY NO WARRANTY.'); console.log('This program comes with ABSOLUTELY NO WARRANTY.');
console.log('This is free software, and you are welcome to redistribute it under certain conditions.'); console.log('This is free software, and you are welcome to redistribute it under certain conditions.');
@@ -55,9 +53,98 @@ Loader.displayStartupMessages = function(callback) {
callback(); callback();
}; };
Loader.addWorkerEvents = function(worker) { Loader.addClusterEvents = function(callback) {
cluster.on('fork', function(worker) {
worker.on('message', function(message) {
if (message && typeof message === 'object' && message.action) {
var otherWorkers;
worker.on('exit', function(code, signal) { switch (message.action) {
case 'ready':
if (Loader.js.cache) {
worker.send({
action: 'js-propagate',
cache: Loader.js.cache,
map: Loader.js.map
});
}
if (Loader.css.cache) {
worker.send({
action: 'css-propagate',
cache: Loader.css.cache,
acpCache: Loader.css.acpCache
});
}
// Kill an instance in the shutdown queue
var workerToKill = Loader.shutdown_queue.pop();
if (workerToKill) {
cluster.workers[workerToKill].kill();
}
break;
case 'restart':
console.log('[cluster] Restarting...');
Loader.restart(function(err) {
console.log('[cluster] Restarting...');
});
break;
case 'reload':
console.log('[cluster] Reloading...');
Loader.reload();
break;
case 'js-propagate':
Loader.js.cache = message.cache;
Loader.js.map = message.map;
otherWorkers = Object.keys(cluster.workers).filter(function(worker_id) {
return parseInt(worker_id, 10) !== parseInt(worker.id, 10);
});
otherWorkers.forEach(function(worker_id) {
cluster.workers[worker_id].send({
action: 'js-propagate',
cache: message.cache,
map: message.map
});
});
break;
case 'css-propagate':
Loader.css.cache = message.cache;
Loader.css.acpCache = message.acpCache;
otherWorkers = Object.keys(cluster.workers).filter(function(worker_id) {
return parseInt(worker_id, 10) !== parseInt(worker.id, 10);
});
otherWorkers.forEach(function(worker_id) {
cluster.workers[worker_id].send({
action: 'css-propagate',
cache: message.cache,
acpCache: message.acpCache
});
});
break;
case 'listening':
if (message.primary) {
Loader.primaryWorker = parseInt(worker.id, 10);
}
break;
case 'user:connect':
case 'user:disconnect':
case 'config:update':
Loader.notifyWorkers(message);
break;
}
}
});
});
cluster.on('listening', function(worker) {
console.log('[cluster] Child Process (' + worker.process.pid + ') listening for connections.');
});
cluster.on('exit', function(worker, code, signal) {
if (code !== 0) { if (code !== 0) {
if (Loader.timesStarted < numProcs*3) { if (Loader.timesStarted < numProcs*3) {
Loader.timesStarted++; Loader.timesStarted++;
@@ -66,223 +153,100 @@ Loader.addWorkerEvents = function(worker) {
} }
Loader.crashTimer = setTimeout(function() { Loader.crashTimer = setTimeout(function() {
Loader.timesStarted = 0; Loader.timesStarted = 0;
}, 10000); });
} else { } else {
console.log(numProcs*3 + ' restarts in 10 seconds, most likely an error on startup. Halting.'); console.log(numProcs*3 + ' restarts in 10 seconds, most likely an error on startup. Halting.');
process.exit(); process.exit();
} }
} }
console.log('[cluster] Child Process (' + worker.pid + ') has exited (code: ' + code + ', signal: ' + signal +')'); console.log('[cluster] Child Process (' + worker.process.pid + ') has exited (code: ' + code + ')');
if (!(worker.suicide || code === 0)) { if (!worker.suicide) {
console.log('[cluster] Spinning up another process...'); console.log('[cluster] Spinning up another process...');
forkWorker(worker.index, worker.isPrimary); var wasPrimary = parseInt(worker.id, 10) === Loader.primaryWorker;
cluster.fork({
handle_jobs: wasPrimary
});
} }
}); });
worker.on('message', function(message) { callback();
if (message && typeof message === 'object' && message.action) { }
switch (message.action) {
case 'ready':
if (Loader.js.target['nodebb.min.js'] && Loader.js.target['nodebb.min.js'].cache && !worker.isPrimary) {
worker.send({
action: 'js-propagate',
cache: Loader.js.target['nodebb.min.js'].cache,
map: Loader.js.target['nodebb.min.js'].map,
target: 'nodebb.min.js'
});
}
if (Loader.js.target['acp.min.js'] && Loader.js.target['acp.min.js'].cache && !worker.isPrimary) {
worker.send({
action: 'js-propagate',
cache: Loader.js.target['acp.min.js'].cache,
map: Loader.js.target['acp.min.js'].map,
target: 'acp.min.js'
});
}
if (Loader.css.cache && !worker.isPrimary) {
worker.send({
action: 'css-propagate',
cache: Loader.css.cache,
acpCache: Loader.css.acpCache
});
}
break;
case 'restart':
console.log('[cluster] Restarting...');
Loader.restart();
break;
case 'reload':
console.log('[cluster] Reloading...');
Loader.reload();
break;
case 'js-propagate':
Loader.js.target[message.target] = Loader.js.target[message.target] || {};
Loader.js.target[message.target].cache = message.cache;
Loader.js.target[message.target].map = message.map;
Loader.notifyWorkers({
action: 'js-propagate',
cache: message.cache,
map: message.map,
target: message.target
}, worker.pid);
break;
case 'css-propagate':
Loader.css.cache = message.cache;
Loader.css.acpCache = message.acpCache;
Loader.notifyWorkers({
action: 'css-propagate',
cache: message.cache,
acpCache: message.acpCache
}, worker.pid);
break;
case 'templates:compiled':
Loader.notifyWorkers({
action: 'templates:compiled',
}, worker.pid);
break;
}
}
});
};
Loader.start = function(callback) { Loader.start = function(callback) {
numProcs = getPorts().length; var output = logrotate({ file: __dirname + '/logs/output.log', size: '1m', keep: 3, compress: true }),
worker;
console.log('Clustering enabled: Spinning up ' + numProcs + ' process(es).\n'); console.log('Clustering enabled: Spinning up ' + numProcs + ' process(es).\n');
for (var x=0; x<numProcs; ++x) { for(var x=0;x<numProcs;x++) {
forkWorker(x, x === 0); // Only the first worker sets up templates/sounds/jobs/etc
worker = cluster.fork({
cluster_setup: x === 0,
handle_jobs: x === 0
});
// Logging
if (silent) {
worker.process.stdout.pipe(output);
}
} }
if (callback) { if (callback) callback();
callback();
}
}; };
function forkWorker(index, isPrimary) { Loader.restart = function(callback) {
var ports = getPorts(); // Slate existing workers for termination -- welcome to death row.
Loader.shutdown_queue = Loader.shutdown_queue.concat(Object.keys(cluster.workers));
if(!ports[index]) {
return console.log('[cluster] invalid port for worker : ' + index + ' ports: ' + ports.length);
}
process.env.isPrimary = isPrimary;
process.env.isCluster = true;
process.env.port = ports[index];
var worker = fork('app.js', [], {
silent: silent,
env: process.env
});
worker.index = index;
worker.isPrimary = isPrimary;
workers[index] = worker;
Loader.addWorkerEvents(worker);
if (silent) {
var output = logrotate({ file: __dirname + '/logs/output.log', size: '1m', keep: 3, compress: true });
worker.stdout.pipe(output);
worker.stderr.pipe(output);
}
}
function getPorts() {
var _url = nconf.get('url');
if (!_url) {
console.log('[cluster] url is undefined, please check your config.json');
process.exit();
}
var urlObject = url.parse(_url);
var port = nconf.get('port') || nconf.get('PORT') || urlObject.port || 4567;
if (!Array.isArray(port)) {
port = [port];
}
return port;
}
Loader.restart = function() {
killWorkers();
Loader.start(); Loader.start();
}; };
Loader.reload = function() { Loader.reload = function() {
workers.forEach(function(worker) { Object.keys(cluster.workers).forEach(function(worker_id) {
worker.send({ cluster.workers[worker_id].send({
action: 'reload' action: 'reload'
}); });
}); });
}; };
Loader.stop = function() { Loader.notifyWorkers = function (msg) {
killWorkers(); Object.keys(cluster.workers).forEach(function(id) {
cluster.workers[id].send(msg);
// Clean up the pidfile
fs.unlinkSync(__dirname + '/pidfile');
};
function killWorkers() {
workers.forEach(function(worker) {
worker.suicide = true;
worker.kill();
}); });
} }
Loader.notifyWorkers = function(msg, worker_pid) {
worker_pid = parseInt(worker_pid, 10); nconf.argv().file({
workers.forEach(function(worker) { file: path.join(__dirname, '/config.json')
if (parseInt(worker.pid, 10) !== worker_pid) { });
try {
worker.send(msg); numProcs = nconf.get('cluster') || 1;
} catch (e) { numProcs = (numProcs === true) ? require('os').cpus().length : numProcs;
console.log('[cluster/notifyWorkers] Failed to reach pid ' + worker_pid);
} if (nconf.get('daemon') !== false) {
if (fs.existsSync(pidFilePath)) {
try {
var pid = fs.readFileSync(pidFilePath, { encoding: 'utf-8' });
process.kill(pid, 0);
process.exit();
} catch (e) {
fs.unlinkSync(pidFilePath);
} }
}); }
};
fs.open(path.join(__dirname, 'config.json'), 'r', function(err) { require('daemon')();
if (!err) {
if (nconf.get('daemon') !== 'false' && nconf.get('daemon') !== false) {
if (file.existsSync(pidFilePath)) {
try {
var pid = fs.readFileSync(pidFilePath, { encoding: 'utf-8' });
process.kill(pid, 0);
process.exit();
} catch (e) {
fs.unlinkSync(pidFilePath);
}
}
require('daemon')({ fs.writeFile(__dirname + '/pidfile', process.pid);
stdout: process.stdout, }
stderr: process.stderr
});
fs.writeFile(__dirname + '/pidfile', process.pid); async.series([
} Loader.init,
Loader.displayStartupMessages,
async.series([ Loader.addClusterEvents,
Loader.init, Loader.start
Loader.displayStartupMessages, ], function(err) {
Loader.start if (err) {
], function(err) { console.log('[loader] Error during startup: ' + err.message);
if (err) {
console.log('[loader] Error during startup: ' + err.message);
}
});
} else {
// No config detected, kickstart web installer
var child = require('child_process').fork('app');
} }
}); });

View File

@@ -1,81 +1,68 @@
"use strict"; "use strict";
var uglifyjs = require('uglify-js'); var uglifyjs = require('uglify-js'),
var async = require('async'); less = require('less'),
var fs = require('fs'); async = require('async'),
var file = require('./src/file'); fs = require('fs'),
path = require('path'),
crypto = require('crypto'),
var Minifier = { Minifier = {
js: {} js: {}
}; };
/* Javascript */ /* Javascript */
Minifier.js.minify = function (scripts, minify, callback) { Minifier.js.minify = function (scripts, relativePath, minify, callback) {
var options = {
compress: false
};
scripts = scripts.filter(function(file) { scripts = scripts.filter(function(file) {
return file && file.endsWith('.js'); return fs.existsSync(file);
}); });
async.filter(scripts, function(script, next) { if (!minify) {
file.exists(script, function(exists) { options.sourceMapURL = '/nodebb.min.js.map';
if (!exists) { options.outSourceMap = 'nodebb.min.js.map';
console.warn('[minifier] file not found, ' + script); options.sourceRoot = relativePath;
} options.mangle = false;
next(exists); options.prefix = 1;
}
try {
var minified = uglifyjs.minify(scripts, options),
hasher = crypto.createHash('md5'),
hash;
// Calculate js hash
hasher.update(minified.code, 'utf-8');
hash = hasher.digest('hex');
process.send({
type: 'hash',
payload: hash.slice(0, 8)
}); });
}, function(scripts) {
if (minify) { callback({
minifyScripts(scripts, callback); js: minified.code,
} else { map: minified.map
concatenateScripts(scripts, callback); });
} } catch(err) {
}); process.send({
type: 'error',
payload: err
});
}
}; };
process.on('message', function(payload) { process.on('message', function(payload) {
switch(payload.action) { switch(payload.action) {
case 'js': case 'js':
Minifier.js.minify(payload.scripts, payload.minify, function(minified/*, sourceMap*/) { Minifier.js.minify(payload.scripts, payload.relativePath, payload.minify, function(data) {
process.send({ process.send({
type: 'end', type: 'end',
// sourceMap: sourceMap, data: data
minified: minified
}); });
}); });
break; break;
} }
}); });
function minifyScripts(scripts, callback) {
// The portions of code involving the source map are commented out as they're broken in UglifyJS2
// Follow along here: https://github.com/mishoo/UglifyJS2/issues/700
try {
var minified = uglifyjs.minify(scripts, {
// outSourceMap: "nodebb.min.js.map",
compress: false
});
callback(minified.code/*, minified.map*/);
} catch(err) {
process.send({
type: 'error',
message: err.message
});
}
}
function concatenateScripts(scripts, callback) {
async.map(scripts, fs.readFile, function(err, scripts) {
if (err) {
process.send({
type: 'error',
message: err.message
});
return;
}
scripts = scripts.join(require('os').EOL + ';');
callback(scripts);
});
}

492
nodebb
View File

@@ -1,375 +1,125 @@
#!/usr/bin/env node #!/bin/bash
var colors = require('colors'), # $0 script path
cproc = require('child_process'), # $1 action
argv = require('minimist')(process.argv.slice(2)), # $2 subaction
fs = require('fs'),
path = require('path'),
request = require('request'),
semver = require('semver'),
prompt = require('prompt'),
async = require('async');
var getRunningPid = function(callback) { node="$(which nodejs 2>/dev/null)";
fs.readFile(__dirname + '/pidfile', { if [ $? -gt 0 ];
encoding: 'utf-8' then node="$(which node)";
}, function(err, pid) { fi
if (err) {
return callback(err);
}
try { function pidExists() {
process.kill(parseInt(pid, 10), 0); if [ -e "pidfile" ];
callback(null, parseInt(pid, 10)); then
} catch(e) { kill -s 0 $(cat pidfile);
callback(e); if [ !$? ];
} then return 1;
}); else return 0;
}, fi
getCurrentVersion = function(callback) { else
fs.readFile(path.join(__dirname, 'package.json'), { encoding: 'utf-8' }, function(err, pkg) { return 0;
try { fi
pkg = JSON.parse(pkg);
return callback(null, pkg.version);
} catch(err) {
return callback(err);
}
})
},
fork = function (args) {
cproc.fork('app.js', args, {
cwd: __dirname,
silent: false
});
},
getInstalledPlugins = function(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) {
var isNbbModule = /^nodebb-(?:plugin|theme|widget|rewards)-[\w\-]+$/,
moduleName, 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);
});
},
getModuleVersions = function(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) {
try {
pkg = JSON.parse(pkg);
versionHash[module] = pkg.version;
next();
} catch (err) {
next(err);
}
});
}, function(err) {
callback(err, versionHash);
});
},
checkPlugins = function(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) {
if (!payload.plugins.length) {
process.stdout.write('OK'.green + '\n'.reset);
return next(null, []); // no extraneous plugins installed
}
var toCheck = Object.keys(payload.plugins);
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, suggested,
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
}
} else {
return null;
}
}).filter(Boolean);
next(null, upgradable);
})
}
], callback);
},
upgradePlugins = function(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 ' + new 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 (result.upgrade === 'y' || result.upgrade === 'yes') {
process.stdout.write('\nUpgrading packages...');
var args = ['npm', 'i'];
found.forEach(function(suggestObj) {
args.push(suggestObj.name + '@' + suggestObj.suggested);
});
require('child_process').execFile('/usr/bin/env', 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();
}
})
});
};
switch(process.argv[2]) {
case 'status':
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);
}
})
break;
case 'start':
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(__dirname + '/loader.js', {
env: process.env
});
break;
case 'stop':
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');
}
});
break;
case 'restart':
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');
}
});
break;
case 'reload':
getRunningPid(function(err, pid) {
if (!err) {
process.kill(pid, 'SIGUSR2');
} else {
process.stdout.write('NodeBB could not be reloaded, as a running instance could not be found.\n');
}
});
break;
case 'dev':
process.env.NODE_ENV = 'development';
cproc.fork(__dirname + '/loader.js', ['--no-daemon', '--no-silent'], {
env: process.env
});
break;
case 'log':
process.stdout.write('\nType '.red + 'Ctrl-C '.bold + 'to exit'.red);
process.stdout.write('\n\n'.reset);
cproc.spawn('tail', ['-F', './logs/output.log'], {
cwd: __dirname,
stdio: 'inherit'
});
break;
case 'setup':
cproc.fork('app.js', ['--setup'], {
cwd: __dirname,
silent: false
});
break;
case 'reset':
var args = process.argv.slice(0);
args.unshift('--reset');
fork(args);
break;
case 'activate':
var args = process.argv.slice(0);
args.unshift('--activate');
fork(args);
break;
case 'plugins':
var args = process.argv.slice(0);
args.unshift('--plugins');
fork(args);
break;
case 'upgrade-plugins':
upgradePlugins();
break;
case 'upgrade':
async.series([
function(next) {
process.stdout.write('1. '.bold + 'Bringing base dependencies up to date... '.yellow);
require('child_process').execFile('/usr/bin/env', ['npm', 'i', '--production'], { stdio: 'ignore' }, next);
},
function(next) {
process.stdout.write('OK\n'.green);
process.stdout.write('2. '.bold + 'Checking installed plugins for updates... '.yellow);
upgradePlugins(next);
},
function(next) {
process.stdout.write('3. '.bold + 'Updating NodeBB data store schema...\n'.yellow);
var upgradeProc = cproc.fork('app.js', ['--upgrade'], {
cwd: __dirname,
silent: false
});
upgradeProc.on('close', next)
}
], function(err) {
if (err) {
process.stdout.write('\nError'.red + ': ' + err.message + '\n');
} else {
var message = 'NodeBB Upgrade Complete!';
// some consoles will return undefined/zero columns, so just use 2 spaces in upgrade script if we can't get our column count
var columns = process.stdout.columns;
var spaces = columns ? new Array(Math.floor(columns / 2) - (message.length / 2) + 1).join(' ') : " ";
process.stdout.write('OK\n'.green);
process.stdout.write('\n' + spaces + message.green.bold + '\n\n'.reset);
}
});
break;
default:
process.stdout.write('\nWelcome to NodeBB\n\n'.bold);
process.stdout.write('Usage: ./nodebb {start|stop|reload|restart|log|setup|reset|upgrade|dev}\n\n');
process.stdout.write('\t' + 'start'.yellow + '\tStart the NodeBB server\n');
process.stdout.write('\t' + 'stop'.yellow + '\tStops the NodeBB server\n');
process.stdout.write('\t' + 'reload'.yellow + '\tRestarts NodeBB\n');
process.stdout.write('\t' + 'restart'.yellow + '\tRestarts NodeBB\n');
process.stdout.write('\t' + 'log'.yellow + '\tOpens the logging interface (useful for debugging)\n');
process.stdout.write('\t' + 'setup'.yellow + '\tRuns the NodeBB setup script\n');
process.stdout.write('\t' + 'reset'.yellow + '\tDisables all plugins, restores the default theme.\n');
process.stdout.write('\t' + 'activate'.yellow + '\tActivate a plugin on start up.\n');
process.stdout.write('\t' + 'plugins'.yellow + '\tList all plugins that have been installed.\n');
process.stdout.write('\t' + 'upgrade'.yellow + '\tRun NodeBB upgrade scripts, ensure packages are up-to-date\n');
process.stdout.write('\t' + 'dev'.yellow + '\tStart NodeBB in interactive development mode\n');
process.stdout.write('\n'.reset);
break;
} }
case "$1" in
start)
echo "Starting NodeBB";
echo " \"./nodebb stop\" to stop the NodeBB server";
echo " \"./nodebb log\" to view server output";
# Start the loader daemon
"$node" loader -d "$@"
;;
stop)
pidExists;
if [ 0 -eq $? ];
then
echo "NodeBB is already stopped.";
else
echo "Stopping NodeBB. Goodbye!";
kill $(cat pidfile);
fi
;;
reload|restart)
pidExists;
if [ 0 -eq $? ];
then
echo "NodeBB could not be restarted, as a running instance could not be found.";
else
echo "Restarting NodeBB.";
kill -1 $(cat pidfile);
fi
;;
status)
pidExists;
if [ 0 -eq $? ];
then
echo "NodeBB is not running";
echo " \"./nodebb start\" to launch the NodeBB server";
else
echo "NodeBB Running (pid $(cat pidfile))";
echo " \"./nodebb stop\" to stop the NodeBB server";
echo " \"./nodebb log\" to view server output";
echo " \"./nodebb restart\" to restart NodeBB";
fi
;;
log)
clear;
tail -F ./logs/output.log;
;;
upgrade)
npm install
# ls -d node_modules/nodebb* | xargs -n1 basename | xargs npm install
# ls -d node_modules/nodebb* | xargs -n1 basename | xargs npm update
npm i nodebb-theme-vanilla nodebb-theme-lavender nodebb-widget-essentials
"$node" app --upgrade
touch package.json
echo -e "\n\e[00;32mNodeBB Dependencies up-to-date!\e[00;00m";
;;
setup)
"$node" app --setup "$@"
;;
reset)
"$node" app --reset --$2
;;
dev)
echo "Launching NodeBB in \"development\" mode."
echo "To run the production build of NodeBB, please use \"forever\"."
echo "More Information: https://docs.nodebb.org/en/latest/running/index.html"
NODE_ENV=development "$node" loader --no-daemon "$@"
;;
watch)
echo "Launching NodeBB in \"development\" mode."
echo "To run the production build of NodeBB, please use \"forever\"."
echo "More Information: https://docs.nodebb.org/en/latest/running/index.html"
NODE_ENV=development supervisor -q --ignore public/templates,public/nodebb.min.js,public/nodebb.min.js.map --extensions 'node|js|tpl|less' -- app "$@"
;;
*)
echo "Welcome to NodeBB"
echo $"Usage: $0 {start|stop|reload|restart|log|setup|reset|upgrade|dev|watch}"
echo ''
column -s ' ' -t <<< '
start Start the NodeBB server
stop Stops the NodeBB server
reload Restarts NodeBB
restart Restarts NodeBB
log Opens the logging interface (useful for debugging)
setup Runs the NodeBB setup script
reset Disables all plugins, restores the default theme.
upgrade Run NodeBB upgrade scripts, ensure packages are up-to-date
dev Start NodeBB in interactive development mode
watch Start NodeBB in development mode and watch for changes
'
exit 1
esac

View File

@@ -1,122 +0,0 @@
@echo off
rem %1 action
rem %2 subaction
setlocal enabledelayedexpansion
2>nul call :CASE_%1
if ERRORLEVEL 1 call :DEFAULT_CASE
exit /B
:CASE_start
echo Starting NodeBB
echo "nodebb.bat stop" to stop the NodeBB server
echo "nodebb.bat log" to view server output
rem Start the loader daemon
node loader %*
goto END_CASE
:CASE_stop
call :pidexists
if %_result%==0 (
echo NodeBB is already stopped.
) else (
echo Stopping NodeBB. Goodbye!
rem Doing this forcefully is probably not the best method
taskkill /PID !_pid! /f>nul
)
goto END_CASE
:CASE_restart
echo Unsupported
goto END_CASE
:CASE_reload
echo Unsupported
goto END_CASE
:CASE_status
call :pidexists
if %_result%==0 (
echo NodeBB is not running
echo "nodebb.bat start" to launch the NodeBB server
) else (
echo NodeBB Running ^(pid !_pid!^)
echo "nodebb.bat stop" to stop the NodeBB server
echo "nodebb.bat log" to view server output
echo "nodebb.bat restart" to restart NodeBB
)
goto END_CASE
:CASE_log
cls
type .\logs\output.log
goto END_CASE
:CASE_upgrade
call npm install
call npm i nodebb-theme-vanilla nodebb-theme-lavender nodebb-widget-essentials
node app --upgrade
copy /b package.json +,,>nul
goto END_CASE
:CASE_setup
node app --setup %*
goto END_CASE
:CASE_reset
node app --reset --%2
goto END_CASE
:CASE_dev
echo Launching NodeBB in "development" mode.
echo To run the production build of NodeBB, please use "forever".
echo More Information: https://docs.nodebb.org/en/latest/running/index.html
set NODE_ENV=development
node loader --no-daemon %*
goto END_CASE
:CASE_watch
echo Not supported
goto END_CASE
:DEFAULT_CASE
echo Welcome to NodeBB
echo Usage: nodebb.bat ^{start^|stop^|reload^|restart^|log^|setup^|reset^|upgrade^|dev^|watch^}
goto END_CASE
:END_CASE
endlocal
VER > NUL
goto :EOF
:pidexists
if exist %~dp0pidfile (
set /p _pid=<pidfile
for /f "usebackq" %%Z in (`tasklist /nh /fi "PID eq !_pid!"`) do (
if %%Z==INFO: (
del pidfile
set _result=0
) else (
set _result=1
)
)
) else (
set _result=0
)

View File

@@ -1,8 +1,8 @@
{ {
"name": "nodebb", "name": "nodebb",
"license": "GPL-3.0", "license": "GPLv3 or later",
"description": "NodeBB Forum", "description": "NodeBB Forum",
"version": "1.0.2", "version": "0.5.2",
"homepage": "http://www.nodebb.org", "homepage": "http://www.nodebb.org",
"repository": { "repository": {
"type": "git", "type": "git",
@@ -10,84 +10,61 @@
}, },
"main": "app.js", "main": "app.js",
"scripts": { "scripts": {
"start": "node loader.js", "start": "./nodebb start",
"stop": "./nodebb stop",
"test": "mocha ./tests -t 10000" "test": "mocha ./tests -t 10000"
}, },
"dependencies": { "dependencies": {
"async": "~1.5.0", "async": "~0.9.0",
"autoprefixer": "^6.2.3", "bcryptjs": "~2.0.1",
"bcryptjs": "~2.3.0",
"body-parser": "^1.9.0", "body-parser": "^1.9.0",
"colors": "^1.1.0",
"compression": "^1.1.0", "compression": "^1.1.0",
"connect-ensure-login": "^0.1.1", "connect-ensure-login": "^0.1.1",
"connect-flash": "^0.1.1", "connect-flash": "^0.1.1",
"connect-mongo": "~1.1.0", "connect-multiparty": "^1.2.4",
"connect-multiparty": "^2.0.0",
"connect-redis": "~3.0.2",
"cookie-parser": "^1.3.3", "cookie-parser": "^1.3.3",
"cron": "^1.0.5", "cron": "^1.0.5",
"csurf": "^1.6.1", "csurf": "^1.6.1",
"daemon": "~1.1.0", "daemon": "~1.1.0",
"express": "^4.9.5", "express": "^4.9.5",
"express-session": "^1.8.2", "express-session": "^1.8.2",
"express-useragent": "0.2.4", "gm": "1.16.0",
"html-to-text": "2.0.0", "gravatar": "^1.1.0",
"ip": "1.1.2", "less": "^1.7.5",
"jimp": "0.2.21",
"less": "^2.0.0",
"logrotate-stream": "^0.2.3", "logrotate-stream": "^0.2.3",
"lru-cache": "4.0.0",
"mime": "^1.3.4",
"minimist": "^1.1.1",
"mkdirp": "~0.5.0", "mkdirp": "~0.5.0",
"mongodb": "~2.1.3",
"morgan": "^1.3.2", "morgan": "^1.3.2",
"nconf": "~0.8.2", "nconf": "~0.6.7",
"nodebb-plugin-composer-default": "3.0.11", "nodebb-plugin-dbsearch": "0.0.15",
"nodebb-plugin-dbsearch": "1.0.0", "nodebb-plugin-markdown": "^0.7.0",
"nodebb-plugin-emoji-extended": "1.0.3", "nodebb-plugin-mentions": "~0.6.0",
"nodebb-plugin-markdown": "4.0.17", "nodebb-plugin-soundpack-default": "~0.1.1",
"nodebb-plugin-mentions": "1.0.20", "nodebb-theme-lavender": "~0.1.0",
"nodebb-plugin-soundpack-default": "0.1.6", "nodebb-theme-vanilla": "~0.1.0",
"nodebb-plugin-spam-be-gone": "0.4.5", "nodebb-widget-essentials": "~0.1.1",
"nodebb-rewards-essentials": "0.0.8", "npm": "^2.1.4",
"nodebb-theme-lavender": "3.0.9", "passport": "^0.2.1",
"nodebb-theme-persona": "4.0.100",
"nodebb-theme-vanilla": "5.0.56",
"nodebb-widget-essentials": "2.0.8",
"nodemailer": "2.0.0",
"nodemailer-sendmail-transport": "1.0.0",
"nodemailer-smtp-transport": "^2.4.1",
"passport": "^0.3.0",
"passport-local": "1.0.0", "passport-local": "1.0.0",
"postcss": "^5.0.13", "prompt": "^0.2.14",
"prompt": "^1.0.0",
"redis": "~2.4.2",
"request": "^2.44.0", "request": "^2.44.0",
"rimraf": "~2.5.0", "rimraf": "~2.2.6",
"rss": "^1.0.0", "rss": "^1.0.0",
"semver": "^5.0.1", "semver": "^4.0.3",
"serve-favicon": "^2.1.5", "serve-favicon": "^2.1.5",
"sitemap": "^1.4.0", "sitemap": "^0.7.4",
"socket.io": "^1.4.0", "socket.io": "^0.9.17",
"socket.io-client": "^1.4.0", "socket.io-client": "^0.9.17",
"socket.io-redis": "^1.0.0", "socket.io-wildcard": "~0.1.1",
"socketio-wildcard": "~0.3.0", "string": "^2.1.0",
"string": "^3.0.0", "templates.js": "0.1.2",
"templates.js": "0.3.3", "uglify-js": "git+https://github.com/julianlam/UglifyJS2.git",
"toobusy-js": "^0.4.2", "underscore": "~1.7.0",
"uglify-js": "^2.6.0", "validator": "~3.21.0",
"underscore": "^1.8.3", "winston": "^0.8.0",
"underscore.deep": "^0.5.1", "xregexp": "~2.0.0"
"validator": "^5.0.0",
"winston": "^2.1.0",
"xregexp": "~3.1.0"
}, },
"devDependencies": { "devDependencies": {
"mocha": "~1.13.0", "mocha": "~1.13.0"
"grunt": "~0.4.5",
"grunt-contrib-watch": "^0.6.1"
}, },
"bugs": { "bugs": {
"url": "https://github.com/NodeBB/NodeBB/issues" "url": "https://github.com/NodeBB/NodeBB/issues"
@@ -98,17 +75,17 @@
"maintainers": [ "maintainers": [
{ {
"name": "Andrew Rodrigues", "name": "Andrew Rodrigues",
"email": "andrew@nodebb.org", "email": "andrew@designcreateplay.com",
"url": "https://github.com/psychobunny" "url": "https://github.com/psychobunny"
}, },
{ {
"name": "Julian Lam", "name": "Julian Lam",
"email": "julian@nodebb.org", "email": "julian@designcreateplay.com",
"url": "https://github.com/julianlam" "url": "https://github.com/julianlam"
}, },
{ {
"name": "Barış Soner Uşaklı", "name": "Barış Soner Uşaklı",
"email": "baris@nodebb.org", "email": "baris@designcreateplay.com",
"url": "https://github.com/barisusakli" "url": "https://github.com/barisusakli"
} }
] ]

View File

@@ -1,160 +0,0 @@
<html>
<head>
<title>Excessive Load Warning</title>
<link href='http://fonts.googleapis.com/css?family=Ubuntu:400,500,700' rel='stylesheet' type='text/css'>
<style type="text/css">
body {
background: #00A9EA;
color: white;
font-family: 'Ubuntu', sans-serif;
text-align: center;
-webkit-transform-style: preserve-3d;
-moz-transform-style: preserve-3d;
transform-style: preserve-3d;
}
h1 {
font-size: 250px;
color: #fff;
opacity: 0.5;
margin: 10px;
cursor: pointer;
-moz-user-select: none;
-khtml-user-select: none;
-webkit-user-select: none;
}
p {
font-size: 20px;
}
p strong {
font-size: 28px;
}
.center {
position: relative;
top: 50%;
-webkit-transform: translateY(50%);
-ms-transform: translateY(50%);
transform: translateY(50%);
}
@-webkit-keyframes bounce {
0%, 20%, 53%, 80%, 100% {
-webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
-webkit-transform: translate3d(0,0,0);
transform: translate3d(0,0,0);
}
40%, 43% {
-webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
-webkit-transform: translate3d(0, -30px, 0);
transform: translate3d(0, -30px, 0);
}
70% {
-webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
-webkit-transform: translate3d(0, -15px, 0);
transform: translate3d(0, -15px, 0);
}
90% {
-webkit-transform: translate3d(0,-4px,0);
transform: translate3d(0,-4px,0);
}
}
@keyframes bounce {
0%, 20%, 53%, 80%, 100% {
-webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
-webkit-transform: translate3d(0,0,0);
transform: translate3d(0,0,0);
}
40%, 43% {
-webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
-webkit-transform: translate3d(0, -30px, 0);
transform: translate3d(0, -30px, 0);
}
70% {
-webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
-webkit-transform: translate3d(0, -15px, 0);
transform: translate3d(0, -15px, 0);
}
90% {
-webkit-transform: translate3d(0,-4px,0);
transform: translate3d(0,-4px,0);
}
}
.bounce {
-webkit-animation-name: bounce;
animation-name: bounce;
-webkit-transform-origin: center bottom;
-ms-transform-origin: center bottom;
transform-origin: center bottom;
}
.animated {
-webkit-animation-duration: 1s;
animation-duration: 1s;
-webkit-animation-fill-mode: both;
animation-fill-mode: both;
}
.animated.infinite {
-webkit-animation-iteration-count: infinite;
animation-iteration-count: infinite;
}
.animated.hinge {
-webkit-animation-duration: 2s;
animation-duration: 2s;
}
.hide {
display: none;
}
</style>
<script type="text/javascript">
window.onload = function() {
var count = 0,
bounce = document.getElementById('click-me');
bounce.onclick = function() {
count++;
bounce.className = '';
setTimeout(function() {
bounce.className = 'animated bounce';
}, 50);
if (count > 5) {
document.getElementById('hide').className = '';
}
};
}
</script>
</head>
<body>
<div class="wrapper">
<div class="center">
<h1 id="click-me" class="animated bounce">503</h1>
<p>
<strong>This forum is temporarily unavailable due to excessive load.</strong> <br />
We shouldn't be down for long. Please check back shortly. Sorry for the inconvenience!
</p>
<p id="hide" class="hide">
<small>Alright. You can stop clicking... it's not going to make the site come back sooner!</small>
</p>
</div>
</div>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 521 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

View File

@@ -1,16 +1,8 @@
{ {
"category": "فئة",
"subcategories": "فئة فرعية",
"new_topic_button": "موضوع جديد", "new_topic_button": "موضوع جديد",
"guest-login-post": "يجب عليك تسجيل الدخول للرد", "no_topics": "<strong>لا توجد مواضيع في هذه الفئة</strong>لماذا لا تحاول نشر موضوع؟<br />",
"no_topics": "<strong>لا توجد مواضيع في هذه الفئة</strong>لم لا تحاول إنشاء موضوع؟<br />",
"browsing": "تصفح", "browsing": "تصفح",
"no_replies": ا توجد ردود.", "no_replies": م يرد أحد",
"no_new_posts": "لا يوجد مشاركات جديدة.",
"share_this_category": "انشر هذه الفئة", "share_this_category": "انشر هذه الفئة",
"watch": "متابعة", "ignore": "Ignore"
"ignore": "تجاهل",
"watch.message": "أنت اﻷن متابع لتحديثات هذه الفئة",
"ignore.message": "أنت اﻷن تتجاهل تحديثات هذه الفئة",
"watched-categories": "Watched categories"
} }

View File

@@ -1,35 +1,23 @@
{ {
"password-reset-requested": "تم طلب إعادة تعيين كلمة المرور - %1!", "password-reset-requested": "Password Reset Requested - %1!",
"welcome-to": "مرحبًا بك في %1", "welcome-to": "Welcome to %1",
"invite": "دعوة من %1", "greeting_no_name": "Hello",
"greeting_no_name": "مرحبًا", "greeting_with_name": "Hello %1",
"greeting_with_name": "مرحبًا بك يا %1", "welcome.text1": "Thank you for registering with %1!",
"welcome.text1": "شكرًا على تسجيلك في %1!", "welcome.text2": "To fully activate your account, we need to verify that you own the email address you registered with.",
"welcome.text2": "لتفعيل حسابك، نحتاج إلى التأكد من صحة عنوان البريد الإلكتروني الذي سجلت به.", "welcome.cta": "Click here to confirm your email address",
"welcome.text3": "تم قبول نتسجيلك ، يمكنك الدخول باتسخدام اسم المستخدم و كلمة المرور.", "reset.text1": "We received a request to reset your password, possibly because you have forgotten it. If this is not the case, please ignore this email.",
"welcome.cta": "انقر هنا لتفعيل عنوان بريدك الإلكتروني", "reset.text2": "To continue with the password reset, please click on the following link:",
"invitation.text1": "%1 قام بدعوتك للانضمام لـ %2", "reset.cta": "Click here to reset your password",
"invitation.ctr": "إضغط هنا لإنشاء حسابك", "digest.notifications": "You have some unread notifications from %1:",
"reset.text1": "لقد توصلنا بطلب إعادة تعيين كلمة المرور الخاصة بك، ربما لكونك قد نسيتها, إن لم يكن الأمر كذلك، المرجو تجاهل هذه الرسالة.", "digest.latest_topics": "Latest topics from %1",
"reset.text2": "لمواصلة طلب إعاة تعيين كلمة المرور، الرجاء تتبع هذا الرابط.", "digest.cta": "Click here to visit %1",
"reset.cta": "انقر هنا لإعادة تعيين كلمة السر الخاصة بك.", "digest.unsub.info": "This digest was sent to you due to your subscription settings.",
"reset.notify.subject": "تم تغيير كلمة المرور بنجاح", "digest.daily.no_topics": "There have been no active topics in the past day",
"reset.notify.text1": "نحيطك علما أن كلمة مرورك قد تم تغييرها في %1", "notif.chat.subject": "New chat message received from %1",
"reset.notify.text2": "إن لم يكن لديك علم بهذا، المرجو إشعار مدبر النظام بأسرع مايمكن.", "notif.chat.cta": "Click here to continue the conversation",
"digest.notifications": "لديك تنبيهات غير مقروءة من طرف %1:", "notif.chat.unsub.info": "This chat notification was sent to you due to your subscription settings.",
"digest.latest_topics": "آخر المستجدات من %1", "test.text1": "This is a test email to verify that the emailer is set up correctly for your NodeBB.",
"digest.cta": "انقر هنا لمشاهدة %1", "unsub.cta": "Click here to alter those settings",
"digest.unsub.info": "تم إرسال هذا الإشعار بآخر المستجدات وفقا لخيارات تسجيلكم.", "closing": "Thanks!"
"digest.no_topics": "ليس هناك مواضيع نشيطة في %1 الماضي",
"digest.day": "day",
"digest.week": "week",
"digest.month": "month",
"notif.chat.subject": "هناك محادثة جديدة من %1",
"notif.chat.cta": "انقر هنا لمتابعة المحادثة",
"notif.chat.unsub.info": "تم إرسال هذا الإشعار بوجودة محادثة جديدة وفقا لخيارات تسجيلك.",
"notif.post.cta": "انقر هنا لقراءة الموضوع بأكمله",
"notif.post.unsub.info": "تم إشعارك بهذه المشاركة بناءً على الخيارات التي سبق وأن حددتها.",
"test.text1": "هذه رسالة تجريبية للتأكد من صحة إعدادت الرسائل الإلكترونية في منتدى NodeBB خاصتك.",
"unsub.cta": "انقر هنا لتغيير تلك الإعدادات",
"closing": "شكرًا لك!"
} }

View File

@@ -1,101 +1,64 @@
{ {
"invalid-data": "بيانات غير صالحة", "invalid-data": "بيانات غير صالحة",
"not-logged-in": "لم تقم بتسجيل الدخول", "not-logged-in": "لم تقم بتسجيل الدخول",
"account-locked": "تم حظر حسابك مؤقتًا.", "account-locked": "Your account has been locked temporarily",
"search-requires-login": "البحث في المنتدى يتطلب حساب - الرجاء تسجيل الدخول أو التسجيل", "search-requires-login": "Searching requires an account! Please login or register!",
"invalid-cid": "قائمة غير موجودة", "invalid-cid": "Invalid Category ID",
"invalid-tid": "موضوع غير متواجد", "invalid-tid": "Invalid Topic ID",
"invalid-pid": "رد غير موجود", "invalid-pid": "Invalid Post ID",
"invalid-uid": "مستخدم غير موجود", "invalid-uid": "Invalid User ID",
"invalid-username": "اسم المستخدم غير مقبول", "invalid-username": "اسم المستخدم غير مقبول",
"invalid-email": "البريد الاكتروني غير مقبول", "invalid-email": "البريد الاكتروني غير مقبول",
"invalid-title": "عنوان غير صحيح", "invalid-title": "Invalid title!",
"invalid-user-data": "بيانات المستخدم غير صحيحة", "invalid-user-data": "Invalid User Data",
"invalid-password": "كلمة السر غير مقبولة", "invalid-password": "كلمة السر غير مقبولة",
"invalid-username-or-password": "المرجود تحديد اسم مستخدم و كلمة مرور", "invalid-username-or-password": "Please specify both a username and password",
"invalid-search-term": "كلمة البحث غير صحيحة", "invalid-search-term": "Invalid search term",
"invalid-pagination-value": "Invalid pagination value, must be at least %1 and at most %2", "invalid-pagination-value": "Invalid pagination value",
"username-taken": "اسم المستخدم مأخوذ", "username-taken": "اسم المستخدم ماخوذ",
"email-taken": "البريد الالكتروني مأخوذ", "email-taken": "البريد الالكتروني ماخوذ",
"email-not-confirmed": "عنوان بريدك الإلكتروني غير مفعل بعد. انقر هنا لتفعيله من فضلك.", "email-not-confirmed": "Your email is not confirmed, please click here to confirm your email.",
"email-not-confirmed-chat": "لا يمكنك الدردشة حتى تقوم بتأكيد بريدك الإلكتروني، الرجاء إضغط هنا لتأكيد بريدك اﻹلكتروني.", "username-too-short": "Username too short",
"no-email-to-confirm": "هذا المنتدى يستلزم تفعيل بريدك الإلكتروني، انقر هنا من فضلك لإدخاله.", "username-too-long": "Username too long",
"email-confirm-failed": "لم نستطع تفعيل بريدك الإلكتروني، المرجو المحاولة لاحقًا.",
"confirm-email-already-sent": "لقد تم ارسال بريد التأكيد، الرجاء اﻹنتظار 1% دقائق لإعادة اﻹرسال",
"username-too-short": "اسم المستخدم قصير.",
"username-too-long": "اسم المستخدم طويل",
"password-too-long": "Password too long",
"user-banned": "المستخدم محظور", "user-banned": "المستخدم محظور",
"user-too-new": "عذرا, يجب أن تنتظر 1% ثواني قبل قيامك بأول مشاركة", "user-too-new": "You need to wait %1 seconds before making your first post!",
"no-category": "قائمة غير موجودة", "no-category": "Category doesn't exist",
"no-topic": "موضوع غير موجود", "no-topic": "Topic doesn't exist",
"no-post": "رد غير موجود", "no-post": "Post doesn't exist",
"no-group": "مجموعة غير موجودة", "no-group": "Group doesn't exist",
"no-user": "اسم مستخدم غير موجود", "no-user": "المستخدم لا يوجد",
"no-teaser": "مقتطف غير موجود", "no-teaser": "Teaser doesn't exist",
"no-privileges": "لاتملك الصلاحيات اللازمة للقيام بهذه العملية", "no-privileges": "You don't have enough privileges for this action.",
"category-disabled": "قائمة معطلة", "no-emailers-configured": "No email plugins were loaded, so a test email could not be sent",
"category-disabled": "Category disabled",
"topic-locked": "الموضوع مقفول", "topic-locked": "الموضوع مقفول",
"post-edit-duration-expired": "You are only allowed to edit posts for %1 second(s) after posting",
"content-too-short": "Please enter a longer post. Posts should contain at least %1 character(s).",
"content-too-long": "Please enter a shorter post. Posts can't be longer than %1 character(s).",
"title-too-short": "Please enter a longer title. Titles should contain at least %1 character(s).",
"title-too-long": "Please enter a shorter title. Titles can't be longer than %1 character(s).",
"too-many-posts": "You can only post once every %1 second(s) - please wait before posting again",
"too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again",
"tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)",
"tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)",
"not-enough-tags": "Not enough tags. Topics must have at least %1 tag(s)",
"too-many-tags": "Too many tags. Topics can't have more than %1 tag(s)",
"still-uploading": "الرجاء انتظار الرفع", "still-uploading": "الرجاء انتظار الرفع",
"file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "content-too-short": "Please enter a longer post. At least %1 characters.",
"guest-upload-disabled": "Guest uploading has been disabled", "title-too-short": "Please enter a longer title. At least %1 characters.",
"already-favourited": "You have already bookmarked this post", "title-too-long": "Please enter a shorter title. Titles can't be longer than %1 characters.",
"already-unfavourited": "You have already unbookmarked this post", "too-many-posts": "You can only post every %1 seconds.",
"cant-ban-other-admins": "لايمكن حظر مدبر نظام آخر.", "file-too-big": "Maximum allowed file size is %1 kbs",
"cant-remove-last-admin": "You are the only administrator. Add another user as an administrator before removing yourself as admin", "cant-vote-self-post": "You cannot vote for your own post",
"invalid-image-type": "Invalid image type. Allowed types are: %1", "already-favourited": "You already favourited this post",
"invalid-image-extension": "Invalid image extension", "already-unfavourited": "You already unfavourited this post",
"invalid-file-type": "Invalid file type. Allowed types are: %1", "cant-ban-other-admins": "You can't ban other admins!",
"group-name-too-short": "اسم المجموعة قصير", "invalid-image-type": "نوع الصورة ممنوع",
"group-already-exists": "المجموعة موجودة مسبقا", "group-name-too-short": "Group name too short",
"group-name-change-not-allowed": "لايسمح بتغيير أسماء المجموعات", "group-already-exists": "Group already exists",
"group-already-member": "Already part of this group", "group-name-change-not-allowed": "Group name change not allowed",
"group-not-member": "Not a member of this group", "post-already-deleted": "Post already deleted",
"group-needs-owner": "هذه المجموعة تتطلب مالك واحد على اﻷقل", "post-already-restored": "Post already restored",
"group-already-invited": "This user has already been invited", "topic-already-deleted": "Topic already deleted",
"group-already-requested": "Your membership request has already been submitted", "topic-already-restored": "Topic already restored",
"post-already-deleted": "سبق وتم حذف هذا الرد", "topic-thumbnails-are-disabled": "Topic thumbnails are disabled.",
"post-already-restored": "سبق وتم إلغاء حذف هذا الرد", "invalid-file": "Invalid File",
"topic-already-deleted": "سبق وتم حذف هذا الموضوع", "uploads-are-disabled": "Uploads are disabled",
"topic-already-restored": "سبق وتم إلغاء حذف هذا الرد", "upload-error": "مشكلة في الرفع: 1%",
"cant-purge-main-post": "You can't purge the main post, please delete the topic instead", "signature-too-long": "Signature can't be longer than %1 characters!",
"topic-thumbnails-are-disabled": "الصور المصغرة غير مفعلة.", "cant-chat-with-yourself": "You can't chat with yourself!",
"invalid-file": "ملف غير مقبول", "reputation-system-disabled": "Reputation system is disabled.",
"uploads-are-disabled": "رفع الملفات غير مفعل", "downvoting-disabled": "Downvoting is disabled",
"signature-too-long": "عذرا، توقيعك يجب ألا يتجاوز %1 حرفًا.", "not-enough-reputation-to-downvote": "You do not have enough reputation to downvote this post",
"about-me-too-long": "Sorry, your about me cannot be longer than %1 character(s).", "not-enough-reputation-to-flag": "Yo do not have enough reputation to flag this post",
"cant-chat-with-yourself": "لايمكنك فتح محادثة مع نفسك", "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."
"chat-restricted": "هذا المستخدم عطل المحادثات الواردة عليه. يجب أن يتبعك حتى تتمكن من فتح محادثة معه.",
"chat-disabled": "Chat system disabled",
"too-many-messages": "لقد أرسلت الكثير من الرسائل، الرجاء اﻹنتظار قليلاً",
"invalid-chat-message": "Invalid chat message",
"chat-message-too-long": "Chat message is too long",
"cant-edit-chat-message": "You are not allowed to edit this message",
"cant-remove-last-user": "You can't remove the last user",
"cant-delete-chat-message": "You are not allowed to delete this message",
"reputation-system-disabled": "نظام السمعة معطل",
"downvoting-disabled": "التصويتات السلبية معطلة",
"not-enough-reputation-to-downvote": "ليس لديك سمعة تكفي لإضافة صوت سلبي لهذا الموضوع",
"not-enough-reputation-to-flag": "ليس لديك سمعة تكفي للإشعار بموضوع مخل",
"already-flagged": "You have already flagged this post",
"reload-failed": "المنتدى واجه مشكلة أثناء إعادة التحميل: \"%1\". سيواصل المنتدى خدمة العملاء السابقين لكن يجب عليك إلغاء أي تغيير قمت به قبل إعادة التحميل.",
"registration-error": "حدث خطأ أثناء التسجيل",
"parse-error": "حدث خطأ ما أثناء تحليل استجابة الخادم",
"wrong-login-type-email": "الرجاء استعمال بريدك اﻹلكتروني للدخول",
"wrong-login-type-username": "الرجاء استعمال اسم المستخدم الخاص بك للدخول",
"invite-maximum-met": "You have invited the maximum amount of people (%1 out of %2).",
"no-session-found": "No login session found!",
"not-in-room": "User not in room",
"no-users-in-room": "No users in this room"
} }

View File

@@ -3,92 +3,73 @@
"search": "بحث", "search": "بحث",
"buttons.close": "أغلق", "buttons.close": "أغلق",
"403.title": "غير مسموح بالدخول", "403.title": "غير مسموح بالدخول",
"403.message": "يبدو أنك قد تعثرت على صفحة لا تمتلك الصلاحية للدخول إليها", "403.message": "يبدو أنك قد تعثر على الصفحة التي لم يكن لديك الوصول إليها. ربما يجب عليك <a href='/login'> تسجيل الدخول </a> ",
"403.login": "Perhaps you should <a href='%1/login'>try logging in</a>?",
"404.title": "لم يتم العثور", "404.title": "لم يتم العثور",
"404.message": "You seem to have stumbled upon a page that does not exist. Return to the <a href='%1/'>home page</a>.", "404.message": "يبدو أنك قد تعثرت على صفحة غير موجودة. عودة إلى الصفحة الرئيسية.",
"500.title": "خطأ داخلي.", "500.title": "خطأ داخلي.",
"500.message": "عفوا! يبدو وكأنه شيء ذهب على نحو خاطئ!", "500.message": "عفوا! يبدو وكأنه شيء ذهب على نحو خاطئ!",
"register": "تسجيل", "register": "تسجيل",
"login": "دخول", "login": "دخول",
"please_log_in": "المرجو تسجيل الدخول", "please_log_in": "Please Log In",
"logout": "تسجيل الخروج", "logout": "تسجيل الخروج",
"posting_restriction_info": "إضافة مشاركات جديد حكر على الأعضاء المسجلين، انقر هنا لتسجيل الدخول.", "posting_restriction_info": "Posting is currently restricted to registered members only, click here to log in.",
"welcome_back": "مرحبًا بعودتك", "welcome_back": "Welcome Back",
"you_have_successfully_logged_in": "تم سجيل الدخول بنجاح", "you_have_successfully_logged_in": "You have successfully logged in",
"save_changes": "حفظ التغييرات", "save_changes": "حفظ التغييرات",
"close": "أغلق", "close": "أغلق",
"pagination": "الصفحات", "pagination": "Pagination",
"pagination.out_of": "%1 من %2", "pagination.out_of": "%1 out of %2",
"pagination.enter_index": "أدخل الرقم التسلسلي", "pagination.enter_index": "Enter index",
"header.admin": دبر نظام", "header.admin": شرف",
"header.categories": "الفئات",
"header.recent": "حديث", "header.recent": "حديث",
"header.unread": "غير مقروء", "header.unread": "غير مقروء",
"header.tags": "وسم", "header.tags": "Tags",
"header.popular": "الأكثر شهرة", "header.popular": "Popular",
"header.users": "المستخدمين", "header.users": "المستخدمين",
"header.groups": "المجموعات", "header.chats": "Chats",
"header.chats": "المحادثات", "header.notifications": "Notifications",
"header.notifications": "التنبيهات",
"header.search": "بحث", "header.search": "بحث",
"header.profile": "ملف", "header.profile": "ملف",
"header.navigation": "Navigation",
"notifications.loading": "تحميل التبليغات", "notifications.loading": "تحميل التبليغات",
"chats.loading": "تحميل الدردشات", "chats.loading": "تحميل الدردشات",
"motd.welcome": "مرحبا بكم NodeBB، منصة مناقشة المستقبل", "motd.welcome": "مرحبا بكم NodeBB، منصة مناقشة المستقبل",
"previouspage": "الصفحة السابقة", "previouspage": "Previous Page",
"nextpage": "الصفحة التالية", "nextpage": "Next Page",
"alert.success": "نجاح", "alert.success": "Success",
"alert.error": "خطأ", "alert.error": "Error",
"alert.banned": "محظور", "alert.banned": "Banned",
"alert.banned.message": "لقد تم حظر حسابك. سيتم تسجيل الخروج.", "alert.banned.message": "You have just been banned, you will now be logged out.",
"alert.unfollow": "أنت لا تتابع %1 بعد الآن!", "alert.unfollow": "You are no longer following %1!",
"alert.follow": "أنت الآن تتابع %1!", "alert.follow": "You are now following %1!",
"online": "المتواجدون حاليًّا", "online": "Online",
"users": "الأعضاء", "users": "Users",
"topics": "المواضيع", "topics": "Topics",
"posts": "المشاركات", "posts": "Posts",
"best": "Best", "views": "Views",
"upvoted": "Upvoted", "reputation": "Reputation",
"downvoted": "Downvoted", "read_more": "read more",
"views": "المشاهدات", "posted_ago_by_guest": "posted %1 by Guest",
"reputation": "السمعة", "posted_ago_by": "posted %1 by %2",
"read_more": "اقرأ المزيد", "posted_ago": "posted %1",
"more": "المزيد", "posted_in_ago_by_guest": "posted in %1 %2 by Guest",
"posted_ago_by_guest": "كتب %1 من طرف زائر", "posted_in_ago_by": "posted in %1 %2 by %3",
"posted_ago_by": "كتب %1 من طرف %2", "posted_in_ago": "posted in %1 %2",
"posted_ago": "كتب %1", "replied_ago": "replied %1",
"posted_in": "posted in %1", "user_posted_ago": "%1 posted %2",
"posted_in_by": "posted in %1 by %2", "guest_posted_ago": "Guest posted %1",
"posted_in_ago": "كتب في %1 %2", "last_edited_by_ago": "last edited by %1 %2",
"posted_in_ago_by": "كتب في %1 %2 من طرف %3", "norecentposts": "No Recent Posts",
"user_posted_ago": "%1 كتب %2", "norecenttopics": "No Recent Topics",
"guest_posted_ago": "كتب زائر %1", "recentposts": "Recent Posts",
"last_edited_by": "last edited by %1", "recentips": "Recently Logged In IPs",
"norecentposts": "لاوجود لمشاركات جديدة", "away": "Away",
"norecenttopics": "لاوجود لمواضيع جديدة", "dnd": "Do not Disturb",
"recentposts": "آخر المشاركات", "invisible": "Invisible",
"recentips": "آخر عناوين ال IP التي سجلت الدخول", "offline": "Offline",
"away": "غير متواجد", "email": "Email",
"dnd": "Do not disturb", "language": "Language",
"invisible": "مخفي", "guest": "Guest",
"offline": "غير متصل", "guests": "Guests",
"email": "عنوان البريد الإلكتروني", "updated.title": "Forum Updated",
"language": "اللغة", "updated.message": "This forum has just been updated to the latest version. Click here to refresh the page."
"guest": "زائر",
"guests": "الزوار",
"updated.title": "تم تحديث المنتدى",
"updated.message": "لقد تم تحديث المنتدى إلى آخر نسخة للتو. المرجو إعادة تحميل الصفحة.",
"privacy": "الخصوصية",
"follow": "متابعة",
"unfollow": "إلغاء المتابعة",
"delete_all": "حذف الكل",
"map": "Map",
"sessions": "Login Sessions",
"ip_address": "IP Address",
"enter_page_number": "Enter page number",
"upload_file": "Upload file",
"upload": "Upload",
"allowed-file-types": "Allowed file types are %1"
} }

View File

@@ -1,53 +1,7 @@
{ {
"groups": "المجموعات", "view_group": "View Group",
"view_group": "معاينة المجموعة", "details.title": "Group Details",
"owner": "مالك المجموعة", "details.members": "Member List",
"new_group": "أنشئ مجموعة جديدة", "details.has_no_posts": "This group's members have not made any posts.",
"no_groups_found": "لاوجدود لمجموعات يمكن معاينتها", "details.latest_posts": "Latest Posts"
"pending.accept": "موافق",
"pending.reject": "رفض",
"pending.accept_all": "قبول الكل",
"pending.reject_all": "رفض الكل",
"pending.none": "لايوجد أعضاء ينتظرون التفعيل حالياً",
"invited.none": "لايوجد أعضاء مدعوون في حالياً",
"invited.uninvite": "إلغ الدعوة",
"invited.search": "ابحث عن أعضاء لدعوتهم للمجموعة",
"invited.notification_title": "You have been invited to join <strong>%1</strong>",
"request.notification_title": "Group Membership Request from <strong>%1</strong>",
"request.notification_text": "<strong>%1</strong> has requested to become a member of <strong>%2</strong>",
"cover-save": "حفظ",
"cover-saving": "جاري الحفظ",
"details.title": "تفاصيل المجموعة",
"details.members": "لائحة الأعضاء",
"details.pending": "المستخدمون في الانتظار",
"details.invited": "اﻷعضار المدعوون",
"details.has_no_posts": "أعضاء هذه المجموعة لم يضيفوا أية مشاركة",
"details.latest_posts": "آخر المشاركات",
"details.private": "خاص",
"details.disableJoinRequests": "Disable join requests",
"details.grant": "منح/سحب المِلكية",
"details.kick": "طرد",
"details.owner_options": "إدارة المجموعة",
"details.group_name": "اسم المجموعة",
"details.member_count": "عدد اﻷعضاء",
"details.creation_date": "تاريخ الإنشاء",
"details.description": "الوصف",
"details.badge_preview": "معاينة الوسام",
"details.change_icon": "تغيير الأيقونة",
"details.change_colour": "تغيير اللون",
"details.badge_text": "نص الوسام",
"details.userTitleEnabled": "إظهار الوسام",
"details.private_help": "في حالة تفعيل الخيار، الانضمام إلى المجموعة يستلزم قبول مالكها",
"details.hidden": "مخفي",
"details.hidden_help": "في حالة تفعيل الخيار، لن تظهر المجموعة للعموم والإنضمام إليها سيتلزم دعوة.",
"details.delete_group": "حذف المجموعة",
"event.updated": "تم تحديث بيانات المجموعة",
"event.deleted": "تم حذف المجموعة %1",
"membership.accept-invitation": "اقبل الدعوة",
"membership.invitation-pending": "الدعوة بانتظار القبول",
"membership.join-group": "انظم للمجموعة",
"membership.leave-group": "غادر المجموعة",
"membership.reject": "رفض",
"new-group.group_name": "اسم المجموعة",
"upload-group-cover": "Upload group cover"
} }

View File

@@ -1,11 +1,9 @@
{ {
"username-email": "اسم المستخدم / البريد الإلكتروني", "username": "Username / Email",
"username": "اسم المستخدم",
"email": "البريد الإلكتروني",
"remember_me": "تذكرني؟", "remember_me": "تذكرني؟",
"forgot_password": "نسيت كلمة المرور؟", "forgot_password": "نسيت كلمة المرور؟",
"alternative_logins": "تسجيلات الدخول البديلة", "alternative_logins": "تسجيلات الدخول البديلة",
"failed_login_attempt": "فشلت محاولة تسجيل الدخول، يرجى المحاولة مرة أخرى.", "failed_login_attempt": "فشلت محاولة تسجيل الدخول، يرجى المحاولة مرة أخرى.",
"login_successful": "قمت بتسجيل الدخول بنجاح!", "login_successful": "قمت بتسجيل الدخول بنجاح!",
"dont_have_account": "لا تملك حساب؟" "dont_have_account": "Don't have an account?"
} }

View File

@@ -1,37 +1,22 @@
{ {
"chat.chatting_with": "الدردشة مع <span id=\"chat-with-name\"></span>", "chat.chatting_with": "الدردشة مع <span id=\"chat-with-name\"></span>",
"chat.placeholder": "أكتب رسالة دردشة هنا، اضغط ENTER للإرسال", "chat.placeholder": "Type chat message here, press enter to send",
"chat.send": "أرسل", "chat.send": "أرسل",
"chat.no_active": "لا يوجد لديك دردشات نشطة.", "chat.no_active": "لا يوجد لديك دردشات نشطة.",
"chat.user_typing": "%1 يكتب رسالة...", "chat.user_typing": "%1 is typing ...",
"chat.user_has_messaged_you": "%1 أرسل لك رسالة.", "chat.user_has_messaged_you": "%1 has messaged you.",
"chat.see_all": "عرض كل المحادثات", "chat.see_all": "See all Chats",
"chat.no-messages": "المرجو اختيار مرسل إليه لمعاينة تاريخ الدردشات", "chat.no-messages": "Please select a recipient to view chat message history",
"chat.no-users-in-room": "No users in this room", "chat.recent-chats": "Recent Chats",
"chat.recent-chats": "آخر الدردشات", "chat.contacts": "Contacts",
"chat.contacts": "الأصدقاء", "chat.message-history": "Message History",
"chat.message-history": "تاريخ الرسائل", "chat.pop-out": "Pop out chat",
"chat.pop-out": "افتح الدردشة في نافذة خاصة", "chat.maximize": "Maximize",
"chat.maximize": "تكبير", "chat.yesterday": "Yesterday",
"chat.seven_days": "7 أيام", "chat.seven_days": "7 Days",
"chat.thirty_days": "30 يومًا", "chat.thirty_days": "30 Days",
"chat.three_months": "3 أشهر", "chat.three_months": "3 Months",
"chat.delete_message_confirm": "Are you sure you wish to delete this message?", "composer.user_said_in": "%1 said in %2:",
"chat.roomname": "Chat Room %1", "composer.user_said": "%1 said:",
"chat.add-users-to-room": "Add users to room", "composer.discard": "Are you sure you wish to discard this post?"
"composer.compose": "اكتب",
"composer.show_preview": "عرض المعاينة",
"composer.hide_preview": "إخفاء المعاينة",
"composer.user_said_in": "%1 كتب في %2",
"composer.user_said": "%1 كتب:",
"composer.discard": "هل أنت متأكد أنك تريد التخلي عن التغييرات؟",
"composer.submit_and_lock": "Submit and Lock",
"composer.toggle_dropdown": "Toggle Dropdown",
"composer.uploading": "Uploading %1",
"bootbox.ok": "OK",
"bootbox.cancel": "إلغاء",
"bootbox.confirm": "تأكيد",
"cover.dragging_title": "Cover Photo Positioning",
"cover.dragging_message": "Drag the cover photo to the desired position and click \"Save\"",
"cover.saved": "Cover photo image and position saved"
} }

View File

@@ -1,38 +1,26 @@
{ {
"title": "التنبيهات", "title": "إعلام",
"no_notifs": "ليس لديك أية تنبيهات جديدة", "no_notifs": "You have no new notifications",
"see_all": "عرض كل التنبيهات", "see_all": "See all Notifications",
"mark_all_read": "اجعل كل التنبيهات مقروءة", "back_to_home": "Back to %1",
"back_to_home": "عودة إلى %1",
"outgoing_link": "رابط خارجي", "outgoing_link": "رابط خارجي",
"outgoing_link_message": "You are now leaving %1", "outgoing_link_message": "You are now leaving %1.",
"continue_to": "استمر إلى %1", "continue_to": "Continue to %1",
"return_to": "عودة إى %1", "return_to": "Return to %1",
"new_notification": "تنبيه جديد", "new_notification": "New Notification",
"you_have_unread_notifications": "لديك تنبيهات غير مقروءة.", "you_have_unread_notifications": "You have unread notifications.",
"new_message_from": "رسالة جديدة من <strong>%1</strong>", "new_message_from": "New message from <strong>%1</strong>",
"upvoted_your_post_in": "<strong>%1</strong> أضاف صوتًا إيجابيا إلى مشاركتك في <strong>%2</strong>.", "upvoted_your_post_in": "<strong>%1</strong> has upvoted your post in <strong>%2</strong>.",
"upvoted_your_post_in_dual": "<strong>%1</strong> and <strong>%2</strong> have upvoted your post in <strong>%3</strong>.", "moved_your_post": "<strong>%1</strong> has moved your post.",
"upvoted_your_post_in_multiple": "<strong>%1</strong> and %2 others have upvoted your post in <strong>%3</strong>.", "moved_your_topic": "<strong>%1</strong> has moved your topic.",
"moved_your_post": "<strong>%1</strong> has moved your post to <strong>%2</strong>", "favourited_your_post_in": "<strong>%1</strong> has favourited your post in <strong>%2</strong>.",
"moved_your_topic": "<strong>%1</strong> has moved <strong>%2</strong>", "user_flagged_post_in": "<strong>%1</strong> flagged a post in <strong>%2</strong>",
"favourited_your_post_in": "<strong>%1</strong> has bookmarked your post in <strong>%2</strong>.", "user_posted_to": "<strong>%1</strong> has posted a reply to: <strong>%2</strong>",
"favourited_your_post_in_dual": "<strong>%1</strong> and <strong>%2</strong> have bookmarked your post in <strong>%3</strong>.", "user_mentioned_you_in": "<strong>%1</strong> mentioned you in <strong>%2</strong>",
"favourited_your_post_in_multiple": "<strong>%1</strong> and %2 others have bookmarked your post in <strong>%3</strong>.", "user_started_following_you": "<strong>%1</strong> started following you.",
"user_flagged_post_in": "<strong>%1</strong> أشعَرَ بمشاركة مخلة في <strong>%2</strong>", "email-confirmed": "Email Confirmed",
"user_flagged_post_in_dual": "<strong>%1</strong> and <strong>%2</strong> flagged a post in <strong>%3</strong>", "email-confirmed-message": "Thank you for validating your email. Your account is now fully activated.",
"user_flagged_post_in_multiple": "<strong>%1</strong> and %2 others flagged a post in <strong>%3</strong>", "email-confirm-error": "An error occurred...",
"user_posted_to": "<strong>%1</strong> أضاف ردا إلى: <strong>%2</strong>", "email-confirm-error-message": "There was a problem validating your email address. Perhaps the code was invalid or has expired.",
"user_posted_to_dual": "<strong>%1</strong> and <strong>%2</strong> have posted replies to: <strong>%3</strong>", "email-confirm-sent": "Confirmation email sent."
"user_posted_to_multiple": "<strong>%1</strong> and %2 others have posted replies to: <strong>%3</strong>",
"user_posted_topic": "<strong>%1</strong> أنشأ موضوعًا جديدًا: <strong>%2</strong>",
"user_started_following_you": "<strong>%1</strong> صار يتابعك.",
"user_started_following_you_dual": "<strong>%1</strong> and <strong>%2</strong> started following you.",
"user_started_following_you_multiple": "<strong>%1</strong> and %2 others started following you.",
"new_register": "<strong>%1</strong> sent a registration request.",
"new_register_multiple": "There are <strong>%1</strong> registration requests awaiting review.",
"email-confirmed": "تم التحقق من عنوان البريد الإلكتروني",
"email-confirmed-message": "شكرًا على إثبات صحة عنوان بريدك الإلكتروني. صار حسابك مفعلًا بالكامل.",
"email-confirm-error-message": "حدث خطأ أثناء التحقق من عنوان بريدك الإلكتروني. ربما رمز التفعيل خاطئ أو انتهت صلاحيته.",
"email-confirm-sent": "تم إرسال بريد التفعيل."
} }

View File

@@ -1,46 +1,18 @@
{ {
"home": "الصفحة الرئيسية", "home": "Home",
"unread": "المواضيع الغير مقروءة", "unread": "Unread Topics",
"popular-day": "Popular topics today", "popular": "Popular Topics",
"popular-week": "Popular topics this week", "recent": "Recent Topics",
"popular-month": "Popular topics this month", "users": "Registered Users",
"popular-alltime": "All time popular topics", "notifications": "Notifications",
"recent": "المواضيع الحديثة", "tags": "Topics tagged under \"%1\"",
"flagged-posts": "Flagged Posts", "user.edit": "Editing \"%1\"",
"users/online": "اﻷعضاء المتصلون", "user.following": "People %1 Follows",
"users/latest": "أحدث اﻷعضاء", "user.followers": "People who Follow %1",
"users/sort-posts": "Users with the most posts", "user.posts": "Posts made by %1",
"users/sort-reputation": "Users with the most reputation", "user.topics": "Topics created by %1",
"users/banned": "Banned Users", "user.favourites": "%1's Favourite Posts",
"users/search": "User Search", "user.settings": "User Settings",
"notifications": "التنبيهات", "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.",
"tags": "الكلمات الدلالية", "maintenance.messageIntro": "Additionally, the administator has left this message:"
"tag": "Topics tagged under \"%1\"",
"register": "Register an account",
"login": "Login to your account",
"reset": "Reset your account password",
"categories": "الفئات",
"groups": "المجموعات",
"group": "%1 group",
"chats": "Chats",
"chat": "Chatting with %1",
"account/edit": "Editing \"%1\"",
"account/edit/password": "Editing password of \"%1\"",
"account/edit/username": "Editing username of \"%1\"",
"account/edit/email": "Editing email of \"%1\"",
"account/following": "People %1 follows",
"account/followers": "People who follow %1",
"account/posts": "Posts made by %1",
"account/topics": "Topics created by %1",
"account/groups": "%1's Groups",
"account/favourites": "%1's Bookmarked Posts",
"account/settings": "User Settings",
"account/watched": "Topics watched by %1",
"account/upvoted": "Posts upvoted by %1",
"account/downvoted": "Posts downvoted by %1",
"account/best": "Best posts made by %1",
"confirm": "Email Confirmed",
"maintenance.text": "جاري صيانة %1. المرجو العودة لاحقًا.",
"maintenance.messageIntro": "بالإضافة إلى ذلك، قام مدبر النظام بترك هذه الرسالة:",
"throttled.text": "%1 is currently unavailable due to excessive load. Please come back another time."
} }

View File

@@ -1,19 +1,9 @@
{ {
"title": "الحديثة", "title": "Recent",
"day": "يوم", "day": "يوم",
"week": "أسبوع", "week": "أسبوع",
"month": "شهر", "month": "شهر",
"year": "سنة", "year": "Year",
"alltime": "دائمًا", "alltime": "All Time",
"no_recent_topics": "لايوجد مواضيع جديدة", "no_recent_topics": "There are no recent topics."
"no_popular_topics": "There are no popular topics.",
"there-is-a-new-topic": "يوجد موضوع جديد",
"there-is-a-new-topic-and-a-new-post": "يوجد موضوع جديد و رد جديد",
"there-is-a-new-topic-and-new-posts": "يوجد موضوع جديد و %1 ردود جديدة ",
"there-are-new-topics": "يوجد %1 مواضيع جديدة",
"there-are-new-topics-and-a-new-post": "يوجد %1 مواضيع جديدة و رد جديد",
"there-are-new-topics-and-new-posts": "يوجد %1 مواضيع جديدة و %2 مشاركات جديدة",
"there-is-a-new-post": "يوجد مشاركة جديدة",
"there-are-new-posts": "يوجد %1 مشاركات جديدة",
"click-here-to-reload": "إضغط هنا لإعادة التحميل"
} }

View File

@@ -1,19 +1,18 @@
{ {
"register": "تسجيل", "register": "تسجيل",
"help.email": "افتراضيا، سيتم إخفاء بريدك الإلكتروني من العامة.", "help.email": "افتراضيا، سيتم إخفاء بريدك الإلكتروني من الجمهور.",
"help.username_restrictions": "اسم مستخدم فريدة من نوعها بين1% و2% حرفا. يمكن للآخرين ذكرك @ <'span id='your-username> اسم المستخدم </span>.", "help.username_restrictions": "اسم مستخدم فريدة من نوعها بين1% و2% حرفا. يمكن للآخرين ذكرك @ <'span id='your-username> اسم المستخدم </span>.",
"help.minimum_password_length": "كلمة المرور يجب أن تكون على الأقل بها 1% أحرف", "help.minimum_password_length": "كلمتك السر يجب أن تكون على الأقل متألفة من 1% أحرف",
"email_address": "عنوان البريد الإلكتروني", "email_address": "عنوان البريد الإلكتروني",
"email_address_placeholder": "ادخل عنوان البريد الإلكتروني", "email_address_placeholder": "ادخل عنوان البريد الإلكتروني",
"username": "اسم المستخدم", "username": "اسم المستخدم",
"username_placeholder": "أدخل اسم المستخدم", "username_placeholder": "أدخل اسم المستخدم",
"password": "كلمة المرور", "password": "كلمة السر",
"password_placeholder": "أدخل كلمة المرور", "password_placeholder": "أدخل كلمة السر",
"confirm_password": "تأكيد كلمة المرور", "confirm_password": "تأكيد كلمة السر",
"confirm_password_placeholder": "تأكيد كلمة المرور", "confirm_password_placeholder": "تأكيد كلمة السر",
"register_now_button": "قم بالتسجيل الآن", "register_now_button": "قم بالتسجيل الآن",
"alternative_registration": "طريقة تسجيل بديلة", "alternative_registration": "التسجيل البديلة",
"terms_of_use": "شروط الاستخدام", "terms_of_use": "Terms of Use",
"agree_to_terms_of_use": "أوافق على شروط الاستخدام", "agree_to_terms_of_use": "I agree to the Terms of Use"
"registration-added-to-queue": "Your registration has been added to the approval queue. You will receive an email when it is accepted by an administrator."
} }

View File

@@ -1,17 +1,14 @@
{ {
"reset_password": "إعادة تعيين كلمة المرور", "reset_password": "إعادة تعيين كلمة السر",
"update_password": "تحديث كلمة المرور", "update_password": "تحديث كلمة السر",
"password_changed.title": "تم تغير كلمة المرور", "password_changed.title": "تم تغير كلمة السر",
"password_changed.message": "<p>تم تغير كلمة المرور بنجاح، الرجاء <a href='/login'>إعادة الدخول</a></p>", "password_changed.message": "<p>تم تغير كلمة السر بنجاح. يرجى <a href='/login'>إعادة الدخول</a></p>",
"wrong_reset_code.title": "رمز إعادة التعيين غير صحيح", "wrong_reset_code.title": "إعادة تعيين رمز غير صحيح",
"wrong_reset_code.message": "رمز إعادة التعين غير صحيح، يرجى المحاولة مرة أخرى أو <a href='/reset'>اطلب رمزا جديدا</a>", "wrong_reset_code.message": امز إعادة التعين غير صحيح، يرجى المحاولة مرة أخرى أو <a href='/reset'>اطلب رمز جديد</a>",
"new_password": "كلمة المرور الجديدة", "new_password": "كلمة السر الجديدة",
"repeat_password": "تأكيد كلمة المرور", "repeat_password": "تأكيد كلمة السر",
"enter_email": "يرجى إدخال <strong>عنوان البريد الإلكتروني</strong> الخاص بك وسوف نرسل لك رسالة بالبريد الالكتروني مع تعليمات حول كيفية إستعادة حسابك.", "enter_email": "يرجى إدخال <strong>عنوان البريد الإلكتروني</strong> الخاص بك وسوف نرسل لك رسالة بالبريد الالكتروني مع تعليمات حول كيفية إستعادة حسابك.",
"enter_email_address": "ادخل عنوان البريد الإلكتروني", "enter_email_address": "Enter Email Address",
"password_reset_sent": "إعادة تعيين كلمة السر أرسلت", "password_reset_sent": "إعادة تعيين كلمة السر أرسلت",
"invalid_email": "بريد إلكتروني غير صالح أو غير موجود", "invalid_email": "بريد إلكتروني غير صالح أو غير موجود"
"password_too_short": "كلمة المرور التي أدخلتها قصيرة، الرجاء اختر كلمة مرور مختلفة",
"passwords_do_not_match": "كلمتا السر التي أدخلتهما غير متطابقتان",
"password_expired": "لقد انتهت صلاحية كلمة المرور الخاصة بك، الرجاء اختيار كلمة مرور جديدة"
} }

View File

@@ -1,40 +1,4 @@
{ {
"results_matching": "%1 نتيجة (نتائج) موافقة لـ \"%2\", (%3 ثواني)", "results_matching": "%1 result(s) matching \"%2\", (%3 seconds)",
"no-matches": "لم يتم العثور على نتائج.", "no-matches": "No posts found"
"advanced-search": "بحث متقدم",
"in": "في",
"titles": "العناوين",
"titles-posts": "العناوين والمشاركات",
"posted-by": "مشاركة من طرف",
"in-categories": "في الفئات",
"search-child-categories": "بحث في الفئات الفرعية",
"reply-count": "عدد المشاركات",
"at-least": "على اﻷقل",
"at-most": "على اﻷكثر",
"post-time": "تاريخ المشاركة",
"newer-than": "أحدث من",
"older-than": "أقدم من",
"any-date": "أي وقت",
"yesterday": "أمس",
"one-week": "أسبوع",
"two-weeks": "أسبوعان",
"one-month": "شهر",
"three-months": "ثلاثة أشهر",
"six-months": "ستة أشهر",
"one-year": "عام",
"sort-by": "عرض حسب",
"last-reply-time": "تاريخ آخر رد",
"topic-title": "عنوان الموضوع",
"number-of-replies": "عدد الردود",
"number-of-views": "عدد المشاهدات",
"topic-start-date": "تاريخ بدأ الموضوع",
"username": "اسم المستخدم",
"category": "فئة",
"descending": "في ترتيب تنازلي",
"ascending": "في ترتيب تصاعدي",
"save-preferences": "حفظ التفضيلات",
"clear-preferences": "ازالة التفضيلات",
"search-preferences-saved": "تم حفظ تفضيلات البحث",
"search-preferences-cleared": "تم ازالة تفضيلات البحث",
"show-results-as": "عرض النتائج كـ"
} }

View File

@@ -1,6 +1,6 @@
{ {
"success": "نجاح", "success": "Success",
"topic-post": "لقد تمت الإضافة بنجاح.", "topic-post": "You have successfully posted.",
"authentication-successful": "تم تسجيل الدخول بنجاح", "authentication-successful": "Authentication Successful",
"settings-saved": "تم حفظ التغييرات!" "settings-saved": "Settings saved!"
} }

View File

@@ -1,7 +1,7 @@
{ {
"no_tag_topics": "لا يوجد مواضيع بهذه الكلمة الدلالية.", "no_tag_topics": "There are no topics with this tag.",
"tags": "الكلمات الدلالية", "tags": "Tags",
"enter_tags_here": "Enter tags here, between %1 and %2 characters each.", "enter_tags_here": "Enter tags here. Press enter after each tag.",
"enter_tags_here_short": "أدخل الكلمات الدلالية...", "enter_tags_here_short": "Enter tags...",
"no_tags": "لا يوجد كلمات دلالية بعد." "no_tags": "There are no tags yet."
} }

View File

@@ -1,112 +1,97 @@
{ {
"topic": "موضوع", "topic": "موضوع",
"topic_id": "معرف الموضوع", "topic_id": "Topic ID",
"topic_id_placeholder": "أدخل معرف الموضوع", "topic_id_placeholder": "Enter topic ID",
"no_topics_found": "لا توجد مواضيع !", "no_topics_found": "لا توجد مواضيع !",
"no_posts_found": "لا توجد مشاركات!", "no_posts_found": "No posts found!",
"post_is_deleted": "هذه المشاركة محذوفة!", "post_is_deleted": "This post is deleted!",
"topic_is_deleted": "هذا الموضوع محذوف", "profile": "ملف",
"profile": "الملف الشخصي", "posted_by": "Posted by %1",
"posted_by": "كتب من طرف %1", "posted_by_guest": "Posted by Guest",
"posted_by_guest": "كتب من طرف زائر",
"chat": "دردشة", "chat": "دردشة",
"notify_me": لق تنبيهات بالردود الجديدة في هذا الموضوع", "notify_me": نبه من ردود جديدة في هذا الموضوع",
"quote": "اقتبس", "quote": "اقتبس",
"reply": "رد", "reply": "رد",
"reply-as-topic": "Reply as topic", "edit": "صحح",
"guest-login-reply": "يجب عليك تسجيل الدخول للرد",
"edit": "تعديل",
"delete": "حذف", "delete": "حذف",
"purge": "تطهير", "purge": "Purge",
"restore": "استعادة", "restore": "Restore",
"move": "نقل", "move": "انقل",
"fork": "فرع", "fork": "فرع",
"banned": "محظور",
"link": "رابط", "link": "رابط",
"share": "نشر", "share": "شارك",
"tools": "أدوات", "tools": "أدوات",
"flag": "تبليغ", "flag": "Flag",
"locked": "مقفل", "locked": "Locked",
"bookmark_instructions": "Click here to return to the last unread post in this thread.", "bookmark_instructions": "Click here to return to your last position or close to discard.",
"flag_title": "إشعار بمشاركة مخلة.", "flag_title": "Flag this post for moderation",
"flag_success": "تم الإشعار بهذه المشاركة على أنها مخلة", "flag_confirm": "Are you sure you want to flag this post?",
"deleted_message": "هذه المشاركة محذوفة. فقط من لهم صلاحية الإشراف على ا لمشاركات يمكنهم معاينتها.", "flag_success": "This post has been flagged for moderation.",
"following_topic.message": "ستستلم تنبيها عند كل مشاركة جديدة في هذا الموضوع.", "deleted_message": "This topic has been deleted. Only users with topic management privileges can see it.",
"not_following_topic.message": "لن تستلم أي تنبيه بخصوص عذا الموضوع بعد الآن.", "following_topic.message": "You will now be receiving notifications when somebody posts to this topic.",
"login_to_subscribe": "المرجو إنشاء حساب أو تسجيل الدخول حتى يمكنك متابعة هذا الموضوع.", "not_following_topic.message": "You will no longer receive notifications from this topic.",
"markAsUnreadForAll.success": "تم تحديد الموضوع على أنه غير مقروء.", "login_to_subscribe": "Please register or log in in order to subscribe to this topic.",
"mark_unread": "Mark unread", "markAsUnreadForAll.success": "Topic marked as unread for all.",
"mark_unread.success": "Topic marked as unread.", "watch": "Watch",
"watch": "مراقبة", "unwatch": "Unwatch",
"unwatch": "الغاء المراقبة", "watch.title": "Be notified of new replies in this topic",
"watch.title": "استلم تنبيها بالردود الجديدة في هذا الموضوع", "unwatch.title": "Stop watching this topic",
"unwatch.title": "ألغ مراقبة هذا الموضوع", "share_this_post": "Share this Post",
"share_this_post": "انشر هذا الموضوع", "thread_tools.title": "Topic Tools",
"thread_tools.title": "أدوات الموضوع",
"thread_tools.markAsUnreadForAll": "علم غير مقروء", "thread_tools.markAsUnreadForAll": "علم غير مقروء",
"thread_tools.pin": "علق الموضوع", "thread_tools.pin": "علق الموضوع",
"thread_tools.unpin": "إلغاء تعليق الموضوع", "thread_tools.unpin": "Unpin Topic",
"thread_tools.lock": "أقفل الموضوع", "thread_tools.lock": "قفل الموضوع",
"thread_tools.unlock": "إلغاء إقفال الموضوع", "thread_tools.unlock": "Unlock Topic",
"thread_tools.move": "نقل الموضوع", "thread_tools.move": "نقل الموضوع",
"thread_tools.move_all": "نقل الكل", "thread_tools.move_all": "Move All",
"thread_tools.fork": "إنشاء فرع الموضوع", "thread_tools.fork": "تفرع الموضوع",
"thread_tools.delete": "حذف الموضوع", "thread_tools.delete": "حذف الموضوع",
"thread_tools.delete-posts": "Delete Posts", "thread_tools.delete_confirm": "Are you sure you want to delete this topic?",
"thread_tools.delete_confirm": "هل أنت متأكد أنك تريد حذف هذا الموضوع؟", "thread_tools.restore": "Restore Topic",
"thread_tools.restore": "استعادة الموضوع", "thread_tools.restore_confirm": "Are you sure you want to restore this topic?",
"thread_tools.restore_confirm": "هل أنت متأكد أنك تريد استعادة هذا الموضوع؟", "thread_tools.purge": "Purge Topic",
"thread_tools.purge": "تطهير الموضوع", "thread_tools.purge_confirm": "Are you sure you want to purge this topic?",
"thread_tools.purge_confirm": "هل أنت متأكد أنك تريد تطهير هذا الموضوع؟", "topic_move_success": "This topic has been successfully moved to %1",
"topic_move_success": "تم نقل هذا الموضوع إلى %1 بنجاح", "post_delete_confirm": "Are you sure you want to delete this post?",
"post_delete_confirm": "هل أنت متأكد أنك تريد حذف هذه المشاركة؟", "post_restore_confirm": "Are you sure you want to restore this post?",
"post_restore_confirm": "هل أنت متأكد أنك تريد استعادة هذه المشاركة؟", "post_purge_confirm": "Are you sure you want to purge this post?",
"post_purge_confirm": "هل أنت متأكد أنك تريد تطهير هذه المشاركة؟",
"load_categories": "تحميل الفئات", "load_categories": "تحميل الفئات",
"disabled_categories_note": "الفئات المعطلة رمادية", "disabled_categories_note": "الفئات المجلدة رمادية",
"confirm_move": "انقل", "confirm_move": "انقل",
"confirm_fork": "فرع", "confirm_fork": "فرع",
"favourite": "Bookmark", "favourite": "المفضل",
"favourites": "Bookmarks", "favourites": "المفضلة",
"favourites.has_no_favourites": "You haven't bookmarked any posts yet.", "favourites.has_no_favourites": "ليس لديك أي ردود مفضلة. فضل بعد الردود لرؤيتهم هنا",
"loading_more_posts": "تحميل المزيد من المشاركات", "loading_more_posts": "تحميل المزيد من المشاركات",
"move_topic": "نقل الموضوع", "move_topic": "نقل الموضوع",
"move_topics": "نقل المواضيع", "move_topics": "Move Topics",
"move_post": "نقل المشاركة", "move_post": "نقل الرد",
"post_moved": "تم نقل المشاركة", "post_moved": "Post moved!",
"fork_topic": "فرع الموضوع", "fork_topic": "فرع الموضوع",
"topic_will_be_moved_to": "هذا الموضوع سوف ينقل إلى فئة", "topic_will_be_moved_to": "هذا الموضوع سوف ينقل إلى فئة",
"fork_topic_instruction": "إضغط على المشاركات التي تريد تفريعها", "fork_topic_instruction": "إضغط على الردود لتفريعهم",
"fork_no_pids": "لم تختر أي مشاركة", "fork_no_pids": "لم تختار أي رد",
"fork_success": "تم إنشاء فرع للموضوع بنجاح! إضغط هنا لمعاينة الفرع.", "fork_success": "Succesfully forked topic! Click here to go to the forked topic.",
"delete_posts_instruction": "Click the posts you want to delete/purge", "composer.title_placeholder": "Enter your topic title here...",
"composer.title_placeholder": "أدخل عنوان موضوعك هنا...", "composer.discard": "Discard",
"composer.handle_placeholder": "اﻹسم", "composer.submit": "Submit",
"composer.discard": "نبذ التغييرات", "composer.replying_to": "Replying to %1",
"composer.submit": "حفظ", "composer.new_topic": "New Topic",
"composer.replying_to": "الرد على %1", "composer.uploading": "uploading...",
"composer.new_topic": "موضوع جديد", "composer.thumb_url_label": "Paste a topic thumbnail URL",
"composer.uploading": "جاري الرفع", "composer.thumb_title": "Add a thumbnail to this topic",
"composer.thumb_url_label": "ألصق رابط الصورة المصغرة للموضوع",
"composer.thumb_title": "إضافة صورة مصغرة للموضوع",
"composer.thumb_url_placeholder": "http://example.com/thumb.png", "composer.thumb_url_placeholder": "http://example.com/thumb.png",
"composer.thumb_file_label": "أو قم برفع ملف", "composer.thumb_file_label": "Or upload a file",
"composer.thumb_remove": "تفريغ الخانات", "composer.thumb_remove": "Clear fields",
"composer.drag_and_drop_images": "اسحب وأسقص الصور هنا", "composer.drag_and_drop_images": "Drag and Drop Images Here",
"more_users_and_guests": "%1 مستخدم(ين) و %2 زائر(ين)", "more_users_and_guests": "%1 more user(s) and %2 guest(s)",
"more_users": "%1 مستخدم(ين)", "more_users": "%1 more user(s)",
"more_guests": "%1 زائر(ين)", "more_guests": "%1 more guest(s)",
"users_and_others": "%1 و %2 آخرين", "users_and_others": "%1 and %2 others",
"sort_by": "ترتيب حسب", "sort_by": "Sort by",
"oldest_to_newest": "من الأقدم إلى الأحدث", "oldest_to_newest": "Oldest to Newest",
"newest_to_oldest": "من الأحدث إلى الأقدم", "newest_to_oldest": "Newest to Oldest",
"most_votes": "الأكثر تصويتًا", "most_votes": "Most votes"
"most_posts": "اﻷكثر رداً",
"stale.title": "Create new topic instead?",
"stale.warning": "The topic you are replying to is quite old. Would you like to create a new topic instead, and reference this one in your reply?",
"stale.create": "Create a new topic",
"stale.reply_anyway": "Reply to this topic anyway",
"link_back": "Re: [%1](%2)",
"spam": "Spam",
"offensive": "Offensive",
"custom-flag-reason": "Enter a flagging reason"
} }

View File

@@ -1,10 +1,9 @@
{ {
"title": "غير مقروء", "title": "Unread",
"no_unread_topics": "ليس هناك أي موضوع غير مقروء", "no_unread_topics": "ليس هناك أي موضوع غير مقروء",
"load_more": "حمل المزيد", "load_more": "حمل المزيد",
"mark_as_read": "حدد غير مقروء", "mark_as_read": "Mark as Read",
"selected": "المحددة", "selected": "Selected",
"all": "الكل", "all": "All",
"all_categories": "كل الفئات", "topics_marked_as_read.success": "Topics marked as read!"
"topics_marked_as_read.success": "تم تحديد المواضيع على أنها مقروءة!"
} }

View File

@@ -1,107 +1,71 @@
{ {
"banned": "محظور", "banned": "محظور",
"offline": "غير متصل", "offline": "ليس موجود حالياً",
"username": "إسم المستخدم", "username": "إسم المستخدم",
"joindate": "تاريخ الإنضمام",
"postcount": "عدد المشاركات",
"email": "البريد الإلكتروني", "email": "البريد الإلكتروني",
"confirm_email": "تأكيد عنوان البريد الإلكتروني", "confirm_email": "Confirm Email",
"ban_account": "Ban Account", "delete_account": "Delete Account",
"ban_account_confirm": "هل تريد حقاً حظر هاذا العضو؟", "delete_account_confirm": "Are you sure you want to delete your account? <br /><strong>This action is irreversible and you will not be able to recover any of your data</strong><br /><br />Enter your username to confirm that you wish to destroy this account.",
"unban_account": "Unban Account",
"delete_account": "حذف الحساب",
"delete_account_confirm": "هل أن متأكد أنك تريد حذف حسابك؟<br /><strong> هذه العملية غير قابلة للإلغاء ولن يكون بالإمكان استعادة بياناتك</strong><br /><br />أدخل اسم المستخدم الخاص بك لتأكيد عملية الحذف",
"delete_this_account_confirm": "Are you sure you want to delete this account? <br /><strong>This action is irreversible and you will not be able to recover any data</strong><br /><br />",
"account-deleted": "Account deleted",
"fullname": "الاسم الكامل", "fullname": "الاسم الكامل",
"website": "الموقع الإلكتروني", "website": "الموقع الإلكتروني",
"location": "الموقع", "location": "موقع",
"age": "السن", "age": "عمر",
"joined": "تاريخ التسجيل", "joined": "تاريخ التسجيل",
"lastonline": "تاريخ آخر دخول", "lastonline": "تاريخ أخر دخول",
"profile": "الملف الشخصي", "profile": "Profile",
"profile_views": "عدد المشاهدات", "profile_views": "مشاهد الملف",
"reputation": "السمعة", "reputation": "سمعة",
"favourites": "Bookmarks", "favourites": "Favourites",
"watched": "متابع", "followers": "أتباع",
"followers": "المتابعون", "following": "يتبع",
"following": "يتابع",
"aboutme": "معلومة عنك او السيرة الذاتية",
"signature": "توقيع", "signature": "توقيع",
"gravatar": "Gravatar",
"birthday": "عيد ميلاد", "birthday": "عيد ميلاد",
"chat": "محادثة", "chat": "Chat",
"chat_with": "Chat with %1", "follow": "Follow",
"follow": "تابع", "unfollow": "Unfollow",
"unfollow": "إلغاء المتابعة", "profile_update_success": "Profile has been updated successfully!",
"more": "المزيد",
"profile_update_success": "تم تحديث الملف الشخصي بنجاح",
"change_picture": "تغيير الصورة", "change_picture": "تغيير الصورة",
"change_username": "Change Username", "edit": "صحح",
"change_email": "Change Email", "uploaded_picture": "صورة تم تحميلها",
"edit": "تعديل", "upload_new_picture": "تحميل صورة جديدة",
"default_picture": "Default Icon", "upload_new_picture_from_url": "Upload New Picture From URL",
"uploaded_picture": "الصورة المرفوعة", "current_password": "Current Password",
"upload_new_picture": "رفع صورة جديدة",
"upload_new_picture_from_url": "رفع صورة جديدة من رابط",
"current_password": "كلمة السر الحالية",
"change_password": "تغيير كلمة السر", "change_password": "تغيير كلمة السر",
"change_password_error": "كلمة سر غير صحيحة", "change_password_error": "Invalid Password!",
"change_password_error_wrong_current": "كلمة السر الحالية ليست صحيحة", "change_password_error_wrong_current": "Your current password is not correct!",
"change_password_error_length": "كلمة السر قصيرة", "change_password_error_length": "Password too short!",
"change_password_error_match": "كلمة السر غير مطابقة لتأكيد كلمة السر", "change_password_error_match": "Passwords must match!",
"change_password_error_privileges": "ليس لديك الصلاحيات الكافية لتغيير كلمة السر هذه.", "change_password_error_privileges": "You do not have the rights to change this password.",
"change_password_success": "تم تحديث كلمة السر خاصتك.", "change_password_success": "Your password is updated!",
"confirm_password": "تأكيد كلمة السر", "confirm_password": "تأكيد كلمة السر",
"password": "كلمة السر", "password": "كلمة السر",
"username_taken_workaround": "اسم المستخدم الذي اخترته سبق أخذه، لذا تم تغييره قليلا. أن الآن مسجل تحت الاسم <strong>%1</strong>", "username_taken_workaround": "The username you requested was already taken, so we have altered it slightly. You are now known as <strong>%1</strong>",
"password_same_as_username": "Your password is the same as your username, please select another password.", "upload_picture": "تحميل الصورة",
"password_same_as_email": "Your password is the same as your email, please select another password.", "upload_a_picture": "تحميل صورة",
"upload_picture": "ارفع الصورة", "image_spec": "You may only upload PNG, JPG, or GIF files",
"upload_a_picture": "رفع صورة", "max": "max.",
"remove_uploaded_picture": "Remove Uploaded Picture", "settings": "Settings",
"upload_cover_picture": "Upload cover picture",
"settings": "خيارات",
"show_email": "أظهر بريدي الإلكتروني", "show_email": "أظهر بريدي الإلكتروني",
"show_fullname": "أظهر اسمي الكامل", "digest_label": "Subscribe to Digest",
"restrict_chats": "لاتسمح بورود محادثات إلا من طرف المستخدمين الذين أتابعهم.", "digest_description": "Subscribe to email updates for this forum (new notifications and topics) according to a set schedule",
"digest_label": "اشترك في النشرة الدورية", "digest_off": "Off",
"digest_description": "استلام اشعارات بآخر مستجدات هذا القسم (التنبيهات والمواضيع الجديدة) عبر البريد الإلكتروني وفقا لجدول زمني محدد.", "digest_daily": "Daily",
"digest_off": "غير مفعل", "digest_weekly": "Weekly",
"digest_daily": "يوميا", "digest_monthly": "Monthly",
"digest_weekly": "أسبوعيًّا", "send_chat_notifications": "Send an email if a new chat message arrives and I am not online",
"digest_monthly": "شهريًّا", "has_no_follower": "هذا المستخدم ليس لديه أي أتباع :(",
"send_chat_notifications": "استلام رسالة إلكترونية عند ورود محادثة وأنا غير متصل.", "follows_no_one": "هذا المستخدم لا يتبع أحد :(",
"send_post_notifications": "Send an email when replies are made to topics I am subscribed to", "has_no_posts": "This user didn't post anything yet.",
"settings-require-reload": "تغيير بعض اﻹعدادات يتطلب تحديث الصفحة. إضغط هنا لتحديث الصفحة", "has_no_topics": "This user didn't post any topics yet.",
"has_no_follower": "هذا المستخدم ليس لديه أي متابع :(",
"follows_no_one": "هذا المستخدم لا يتابع أحد :(",
"has_no_posts": "This user hasn't posted anything yet.",
"has_no_topics": "This user hasn't posted any topics yet.",
"has_no_watched_topics": "This user hasn't watched any topics yet.",
"has_no_upvoted_posts": "This user hasn't upvoted any posts yet.",
"has_no_downvoted_posts": "This user hasn't downvoted any posts yet.",
"has_no_voted_posts": "This user has no voted posts",
"email_hidden": "البريد الإلكتروني مخفي", "email_hidden": "البريد الإلكتروني مخفي",
"hidden": "مخفي", "hidden": "مخفي",
"paginate_description": "Paginate topics and posts instead of using infinite scroll", "paginate_description": "Paginate topics and posts instead of using infinite scroll.",
"topics_per_page": "المواضيع في كل صفحة", "topics_per_page": "Topics per Page",
"posts_per_page": "الردود في كل صفحة", "posts_per_page": "Posts per Page",
"notification_sounds": "تشغيل صوت عند تلقي تنبيه", "notification_sounds": "Play a sound when you receive a notification.",
"browsing": "خيارات التصفح", "browsing": "Browsing Settings",
"open_links_in_new_tab": "فتح الروابط الخارجية في نافدة جديدة", "open_links_in_new_tab": "Open outgoing links in new tab?",
"enable_topic_searching": "تفعيل خاصية البحث داخل المواضيع", "follow_topics_you_reply_to": "Follow topics that you reply to.",
"topic_search_help": "If enabled, in-topic searching will override the browser's default page search behaviour and allow you to search through the entire topic, instead of what is only shown on screen", "follow_topics_you_create": "Follow topics you create."
"follow_topics_you_reply_to": "متابعة المواضيع التي تقوم بالرد فيها",
"follow_topics_you_create": "متابعة المواضيع التي تنشئها",
"grouptitle": "حدد عنوان المجموعة الذي تريد عرضه",
"no-group-title": "لا يوجد عنوان للمجموعة",
"select-skin": "Select a Skin",
"select-homepage": "Select a Homepage",
"homepage": "Homepage",
"homepage_description": "Select a page to use as the forum homepage or 'None' to use the default homepage.",
"custom_route": "Custom Homepage Route",
"custom_route_help": "Enter a route name here, without any preceding slash (e.g. \"recent\", or \"popular\")",
"sso.title": "Single Sign-on Services",
"sso.associated": "Associated with",
"sso.not-associated": "Click here to associate with"
} }

View File

@@ -1,20 +1,10 @@
{ {
"latest_users": "أحدث الأعضاء", "latest_users": "أحدث المستخدمين",
"top_posters": "اﻷكثر مشاركة", "top_posters": "أكثر المشتركين",
"most_reputation": "أعلى سمعة", "most_reputation": "أعلى سمعة",
"search": "بحث", "search": "بحث",
"enter_username": "أدخل اسم مستخدم للبحث", "enter_username": "أدخل اسم مستخدم للبحث",
"load_more": "حمل المزيد", "load_more": "حمل المزيد",
"users-found-search-took": "تم إيجاد %1 مستخدمـ(ين)! استغرق البحث %2 ثانية.", "user-not-found": "User not found!",
"filter-by": "Filter By", "users-found-search-took": "%1 user(s) found! Search took %2 ms."
"online-only": "المتصلون فقط",
"invite": "دعوة",
"invitation-email-sent": "An invitation email has been sent to %1",
"user_list": "قائمة اﻷعضاء",
"recent_topics": "أحدث المواضيع",
"popular_topics": "Popular Topics",
"unread_topics": "المواضيع الغير مقروءة",
"categories": "الفئات",
"tags": "الكلمات الدلالية",
"no-users-found": "No users found!"
} }

View File

@@ -1,16 +0,0 @@
{
"category": "Категория",
"subcategories": "Подкатегории",
"new_topic_button": "Нова тема",
"guest-login-post": "Влезте, за да можете да публикувате",
"no_topics": "<strong>Все още няма теми в тази категория.</strong><br />Защо не създадеш една?",
"browsing": "Разглежда",
"no_replies": "Все още никой не е отговорил",
"no_new_posts": "Няма нови публикации.",
"share_this_category": "Споделяне на тази категория",
"watch": "Следене",
"ignore": "Игнориране",
"watch.message": "Вече следите обновленията в тази категория",
"ignore.message": "Вече не следите обновленията в тази категория",
"watched-categories": "Следени категории"
}

View File

@@ -1,35 +0,0 @@
{
"password-reset-requested": "Изпратена е заявка за подновяване на паролата %1!",
"welcome-to": "Добре дошли в %1",
"invite": "Покана от %1",
"greeting_no_name": "Здравейте",
"greeting_with_name": "Здравейте, %1",
"welcome.text1": "Благодарим Ви, че се регистрирахте с %1",
"welcome.text2": "За да активирате напълно Вашия акаунт, трябва да потвърдите е-пощата, с която сте се регистрирали.",
"welcome.text3": "Вашата заявка за регистрация беше приета от администратор. Вече можете да се впишете с Вашето потребителско име и парола.",
"welcome.cta": "Натиснете тук, за да потвърдите Вашата е-поща.",
"invitation.text1": "%1 Ви покани да се присъедините към %2",
"invitation.ctr": "Натиснете тук, за да си създадете акаунт.",
"reset.text1": "Получихме заявка за подновяване на Вашата парола, най-вероятно защото сте я забравили. Ако това не е така, моля не обръщайте внимание на това е-писмо.",
"reset.text2": "За да продължите с процедурата по подновяване на паролата, моля последвайте следната връзка:",
"reset.cta": "Натиснете тук, за да подновите паролата си",
"reset.notify.subject": "Паролата беше променена успешно",
"reset.notify.text1": "Известяваме Ви, че на %1, Вашата парола беше променена успешно.",
"reset.notify.text2": "Ако не сте поискали това, моля, свържете се незабавно с администратор.",
"digest.notifications": "Имате непрочетени известия от %1:",
"digest.latest_topics": "Последни теми от %1",
"digest.cta": "Натиснете тук, за да посетите %1",
"digest.unsub.info": "Това резюме беше изпратено до Вас поради настройките Ви за абонаментите.",
"digest.no_topics": "Не е имало дейност по темите в последните %1",
"digest.day": "ден",
"digest.week": "месец",
"digest.month": "година",
"notif.chat.subject": "Получено е ново съобщение от %1",
"notif.chat.cta": "Натиснете тук, за да продължите разговора",
"notif.chat.unsub.info": "Това известие за разговор беше изпратено до Вас поради настройките Ви за абонаментите.",
"notif.post.cta": "Натиснете тук, за да прочетете цялата тема",
"notif.post.unsub.info": "Това известие за публикация беше изпратено до Вас поради настройките Ви за абонаментите.",
"test.text1": "Това е пробно е-писмо, за да потвърдим, че изпращачът на е-поща е правилно настроен за Вашия NodeBB.",
"unsub.cta": "Натиснете тук, за да промените тези настройки",
"closing": "Благодарим Ви!"
}

View File

@@ -1,101 +0,0 @@
{
"invalid-data": "Невалидни данни",
"not-logged-in": "Изглежда не сте влезли в системата.",
"account-locked": "Вашият акаунт беше заключен временно",
"search-requires-login": "Търсенето изисква акаунт моля, влезте или се регистрирайте.",
"invalid-cid": "Грешен идентификатор на категория",
"invalid-tid": "Грешен идентификатор на тема",
"invalid-pid": "Грешен идентификатор на публикация",
"invalid-uid": "Грешен идентификатор на потребител",
"invalid-username": "Грешно потребителско име",
"invalid-email": "Грешна е-поща",
"invalid-title": "Грешно заглавие!",
"invalid-user-data": "Грешни потребителски данни",
"invalid-password": "Грешна парола",
"invalid-username-or-password": "Моля, посочете потребителско име и парола",
"invalid-search-term": "Грешен текст за търсене",
"invalid-pagination-value": "Грешен номер на страница, трябва да бъде между %1 и %2",
"username-taken": "Потребителското име е заето",
"email-taken": "Е-пощата е заета",
"email-not-confirmed": "Вашата е-поща все още не е потвърдена. Моля, натиснете тук, за да потвърдите е-пощата си.",
"email-not-confirmed-chat": "Няма да можете да пишете в разговори, докато е-пощата Ви не бъде потвърдена. Моля, натиснете тук, за да потвърдите е-пощата си.",
"no-email-to-confirm": "Този форум изисква потвърдена е-поща. Моля, натиснете тук, за да въведете е-поща",
"email-confirm-failed": "Не успяхме да потвърдим е-пощата Ви. Моля, опитайте отново по-късно.",
"confirm-email-already-sent": "Е-писмото за потвърждение вече е изпратено. Моля, почакайте още %1 минута/и, преди да изпратите ново.",
"username-too-short": "Потребителското име е твърде кратко",
"username-too-long": "Потребителското име е твърде дълго",
"password-too-long": "Паролата е твърде дълга",
"user-banned": "Потребителят е блокиран",
"user-too-new": "Съжаляваме, но трябва да изчакате поне %1 секунда/и, преди да направите първата си публикация",
"no-category": "Категорията не съществува",
"no-topic": "Темата не съществува",
"no-post": "Публикацията не съществува",
"no-group": "Групата не съществува",
"no-user": "Потребителят не съществува",
"no-teaser": "Резюмето не съществува",
"no-privileges": "Нямате достатъчно права за това действие.",
"category-disabled": "Категорията е изключена",
"topic-locked": "Темата е заключена",
"post-edit-duration-expired": "Можете да редактирате публикациите си до %1 секунда/и, след като ги пуснете",
"content-too-short": "Моля, въведете по-дълъг текст на публикацията. Публикациите трябва да съдържат поне %1 символ(а).",
"content-too-long": "Моля, въведете по-кратък текст на публикацията. Публикациите трябва да съдържат не повече от %1 символ(а).",
"title-too-short": "Моля, въведете по-дълго заглавие. Заглавията трябва да съдържат поне %1 символ(а).",
"title-too-long": "Моля, въведете по-кратко заглавие. Заглавията трябва да съдържат не повече от %1 символ(а).",
"too-many-posts": "Можете да публикувате веднъж на %1 секунда/и моля, изчакайте малко, преди да опитате да публикувате отново",
"too-many-posts-newbie": "Като нов потребител, Вие можете да публикувате веднъж на %1 секунда/и, докато не натрупате %2 репутация моля, изчакайте малко, преди да опитате да публикувате отново",
"tag-too-short": "Моля, въведете по-дълъг етикет. Етикетите трябва да съдържат поне %1 символ(а)",
"tag-too-long": "Моля, въведете по-кратък етикет. Етикетите трябва да съдържат не повече от %1 символ(а)",
"not-enough-tags": "Недостатъчно етикети. Темите трябва да имат поне %1 етикет(а)",
"too-many-tags": "Твърде много етикети. Темите не могат да имат повече от %1 етикет(а)",
"still-uploading": "Моля, изчакайте качването да приключи.",
"file-too-big": "Максималният разрешен размер на файл е %1 КБ моля, качете по-малък файл",
"guest-upload-disabled": "Качването не е разрешено за гости",
"already-favourited": "Вече имате отметка към тази публикация",
"already-unfavourited": "Вече сте премахнали отметката си към тази публикация",
"cant-ban-other-admins": "Не можете да блокирате другите администратори!",
"cant-remove-last-admin": "Вие сте единственият администратор. Добавете друг потребител като администратор, преди да премахнете себе си като администратор",
"invalid-image-type": "Грешен тип на изображение. Позволените типове са: %1",
"invalid-image-extension": "Грешно разширение на изображението",
"invalid-file-type": "Грешен тип на файл. Позволените типове са: %1",
"group-name-too-short": "Името на групата е твърде кратко",
"group-already-exists": "Вече съществува такава група",
"group-name-change-not-allowed": "Промяната на името на групата не е разрешено",
"group-already-member": "Вече членувате в тази група",
"group-not-member": "Не членувате в тази група",
"group-needs-owner": "Тази група се нуждае от поне един собственик",
"group-already-invited": "Този потребител вече е бил поканен",
"group-already-requested": "Вашата заявка за членство вече е била изпратена",
"post-already-deleted": "Тази публикация вече е изтрита",
"post-already-restored": "Тази публикация вече е възстановена",
"topic-already-deleted": "Тази тема вече е изтрита",
"topic-already-restored": "Тази тема вече е възстановена",
"cant-purge-main-post": "Не можете да изчистите първоначалната публикация. Моля, вместо това изтрийте темата.",
"topic-thumbnails-are-disabled": "Иконките на темите са изключени.",
"invalid-file": "Грешен файл",
"uploads-are-disabled": "Качването не е разрешено",
"signature-too-long": "Съжаляваме, но подписът Ви трябва да съдържа не повече от %1 символ(а).",
"about-me-too-long": "Съжаляваме, но информацията за Вас трябва да съдържа не повече от %1 символ(а).",
"cant-chat-with-yourself": "Не можете да пишете съобщение на себе си!",
"chat-restricted": "Този потребител е ограничил съобщенията до себе си. Той трябва първо да Ви последва, преди да можете да си пишете с него.",
"chat-disabled": "Системата за разговори е изключена",
"too-many-messages": "Изпратили сте твърде много съобщения. Моля, изчакайте малко.",
"invalid-chat-message": "Невалидно съобщение",
"chat-message-too-long": "Съобщението е твърде дълго",
"cant-edit-chat-message": "Нямате право да редактирате това съобщение",
"cant-remove-last-user": "Не можете да премахнете последния потребител",
"cant-delete-chat-message": "Нямате право да изтриете това съобщение",
"reputation-system-disabled": "Системата за репутация е изключена.",
"downvoting-disabled": "Отрицателното гласуване е изключено",
"not-enough-reputation-to-downvote": "Нямате достатъчно репутация, за да гласувате отрицателно за тази публикация",
"not-enough-reputation-to-flag": "Нямате достатъчно репутация, за да докладвате тази публикация",
"already-flagged": "Вече сте докладвали тази публикация",
"reload-failed": "NodeBB срещна проблем при презареждането: „%1“. NodeBB ще продължи да поддържа съществуващите клиентски ресурси, но Вие трябва да отмените последните си действия преди презареждането.",
"registration-error": "Грешка при регистрацията",
"parse-error": "Нещо се обърка при прочитането на отговора на сървъра",
"wrong-login-type-email": "Моля, използвайте е-пощата си, за да влезете",
"wrong-login-type-username": "Моля, използвайте потребителското си име, за да влезете",
"invite-maximum-met": "Вие сте поканили максимално позволения брой хора (%1 от %2).",
"no-session-found": "Не е открита сесия за вход!",
"not-in-room": "Потребителят не е в стаята",
"no-users-in-room": "Няма потребители в тази стая"
}

View File

@@ -1,94 +0,0 @@
{
"home": "Начало",
"search": "Търсене",
"buttons.close": "Затваряне",
"403.title": "Достъпът е отказан",
"403.message": "Изглежда сте посетили страница, до която нямате достъп.",
"403.login": "Може би трябва да <a href='%1/login'>опитате да влезете</a>?",
"404.title": "Не е открита",
"404.message": "Изглежда сте се опитали да посетите страница, която не съществува. Върнете се към <a href='%1/'>началната страница</a>.",
"500.title": "Вътрешна грешка.",
"500.message": "Опа! Изглежда нещо се обърка!",
"register": "Регистрация",
"login": "Вход",
"please_log_in": "Моля, влезте",
"logout": "Изход",
"posting_restriction_info": "Публикуването в момента е позволено само за регистрираните потребители. Натиснете тук, за да влезете.",
"welcome_back": "Добре дошли отново",
"you_have_successfully_logged_in": "Вие влязохте успешно",
"save_changes": "Запазване на промените",
"close": "Затваряне",
"pagination": "Страници",
"pagination.out_of": "%1 от %2",
"pagination.enter_index": "Въведете номер",
"header.admin": "Администратор",
"header.categories": "Категории",
"header.recent": "Скорошни",
"header.unread": "Непрочетени",
"header.tags": "Етикети",
"header.popular": "Популярни",
"header.users": "Потребители",
"header.groups": "Групи",
"header.chats": "Разговори",
"header.notifications": "Известия",
"header.search": "Търсене",
"header.profile": "Профил",
"header.navigation": "Навигация",
"notifications.loading": "Зареждане на известията",
"chats.loading": "Зареждане на разговорите",
"motd.welcome": "Добре дошли в NodeBB, системата за дискусии на бъдещето.",
"previouspage": "Предишна страница",
"nextpage": "Следваща страница",
"alert.success": "Готово",
"alert.error": "Грешка",
"alert.banned": "Блокиран",
"alert.banned.message": "Вие току-що бяхте блокиран. Сега ще излезете от системата.",
"alert.unfollow": "Вие вече не следвате %1!",
"alert.follow": "Вие следвате %1!",
"online": "На линия",
"users": "Потребители",
"topics": "Теми",
"posts": "Публ.",
"best": "Най-добри",
"upvoted": "С положителни гласове",
"downvoted": "С отрицателни гласове",
"views": "Прегл.",
"reputation": "Репутация",
"read_more": "още",
"more": "Още",
"posted_ago_by_guest": "публикувано %1 от гост",
"posted_ago_by": "публикувано %1 от %2",
"posted_ago": "публикувано %1",
"posted_in": "публикувано в %1",
"posted_in_by": "публикувано в %1 от %2",
"posted_in_ago": "публикувано в %1 %2",
"posted_in_ago_by": "публикувано в %1 %2 от %3",
"user_posted_ago": "%1 публикува %2",
"guest_posted_ago": "гост публикува %1",
"last_edited_by": "последно редактирано от %1",
"norecentposts": "Няма скорошни публикации",
"norecenttopics": "Няма скорошни теми",
"recentposts": "Скорошни публикации",
"recentips": "Наскоро ползвани IP адреси",
"away": "Отсъстващ",
"dnd": "Отпочиващ",
"invisible": "Невидим",
"offline": "Извън линия",
"email": "Е-поща",
"language": "Език",
"guest": "Гост",
"guests": "Гости",
"updated.title": "Форумът е актуализиран",
"updated.message": "Този форум току-що беше актуализиран до най-новата версия. Натиснете тук, за да опресните страницата.",
"privacy": "Поверителност",
"follow": "Следване",
"unfollow": "Прекратяване на следването",
"delete_all": "Изтриване на всичко",
"map": "Карта",
"sessions": "Сесии за вход",
"ip_address": "IP адрес",
"enter_page_number": "Въведете номер на страница",
"upload_file": "Качване на файл",
"upload": "Качване",
"allowed-file-types": "Разрешените файлови типове са: %1"
}

View File

@@ -1,53 +0,0 @@
{
"groups": "Групи",
"view_group": "Преглед на групата",
"owner": "Собственик на групата",
"new_group": "Създаване на нова група",
"no_groups_found": "Няма групи",
"pending.accept": "Приемане",
"pending.reject": "Отхвърляне",
"pending.accept_all": "Приемане на всички",
"pending.reject_all": "Отхвърляне на всички",
"pending.none": "В момента няма чакащи членове",
"invited.none": "В момента няма поканени членове",
"invited.uninvite": "Отмяна на поканата",
"invited.search": "Потърсете потребител, когото да поканите в тази група",
"invited.notification_title": "Вие бяхте поканен/а да се присъедините към <strong>%1</strong>",
"request.notification_title": "Заявка за членство в групата от <strong>%1</strong>",
"request.notification_text": "<strong>%1</strong> поиска да стане член на <strong>%2</strong>",
"cover-save": "Запазване",
"cover-saving": "Запазване",
"details.title": "Подробности за групата",
"details.members": "Списък на членовете",
"details.pending": "Кандидатстващи членове",
"details.invited": "Поканени членове",
"details.has_no_posts": "Членовете на тази група не са публикували нищо.",
"details.latest_posts": "Скорошни публикации",
"details.private": "Частна",
"details.disableJoinRequests": "Забраняване на заявките за присъединяване",
"details.grant": "Даване/отнемане на собственост",
"details.kick": "Изгонване",
"details.owner_options": "Администрация на групата",
"details.group_name": "Име на групата",
"details.member_count": "Брой на членовете",
"details.creation_date": "Дата на създаване",
"details.description": "Описание",
"details.badge_preview": "Преглед на емблемата",
"details.change_icon": "Промяна на иконката",
"details.change_colour": "Промяна на цвета",
"details.badge_text": "Текст на емблемата",
"details.userTitleEnabled": "Показване на емблемата",
"details.private_help": "Ако е включено, присъединяването към група изисква одобрението на собственика ѝ",
"details.hidden": "Скрита",
"details.hidden_help": "Ако е включено, тази група няма да бъде извеждана в списъка от групи и потребителите ще трябва да бъдат поканени лично",
"details.delete_group": "Изтриване на групата",
"event.updated": "Подробностите за групата бяха обновени",
"event.deleted": "Групата „%1“ беше изтрита",
"membership.accept-invitation": "Приемане на поканата",
"membership.invitation-pending": "Чакаща покана",
"membership.join-group": "Присъединяване към групата",
"membership.leave-group": "Напускане на групата",
"membership.reject": "Отхвърляне",
"new-group.group_name": "Име на групата:",
"upload-group-cover": "Качване на снимка за показване на групата"
}

View File

@@ -1,5 +0,0 @@
{
"name": "Български",
"code": "bg",
"dir": "ltr"
}

View File

@@ -1,11 +0,0 @@
{
"username-email": "Потребителско име / е-поща",
"username": "Потребителско име",
"email": "Е-поща",
"remember_me": "Запомнете ме?",
"forgot_password": "Забравена парола?",
"alternative_logins": "Други начини за влизане",
"failed_login_attempt": "Неуспешно влизане. Моля, опитайте отново.",
"login_successful": "Вие влязохте успешно!",
"dont_have_account": "Нямате акаунт?"
}

View File

@@ -1,37 +0,0 @@
{
"chat.chatting_with": "Разговор с <span id=\"chat-with-name\"></span>",
"chat.placeholder": "Въведете съобщението тук и натиснете Ентер за изпращане",
"chat.send": "Изпращане",
"chat.no_active": "Нямате текущи разговори.",
"chat.user_typing": "%1 пише...",
"chat.user_has_messaged_you": "%1 Ви написа съобщение.",
"chat.see_all": "Вижте всички разговори",
"chat.no-messages": "Моля, изберете получател, за да видите историята на съобщенията",
"chat.no-users-in-room": "Няма потребители в тази стая",
"chat.recent-chats": "Скорошни разговори",
"chat.contacts": "Контакти",
"chat.message-history": "История на съобщенията",
"chat.pop-out": "Отделяне на разговора в прозорец",
"chat.maximize": "Уголемяване",
"chat.seven_days": "7 дни",
"chat.thirty_days": "30 дни",
"chat.three_months": "3 месеца",
"chat.delete_message_confirm": "Сигурен/а ли сте, че искате да изтриете това съобщение?",
"chat.roomname": "Стая за разговори %1",
"chat.add-users-to-room": "Добавяне на потребители към стаята",
"composer.compose": "Писане",
"composer.show_preview": "Показване на прегледа",
"composer.hide_preview": "Скриване на прегледа",
"composer.user_said_in": "%1 каза в %2:",
"composer.user_said": "%1 каза:",
"composer.discard": "Сигурен/а ли сте, че искате да отхвърлите тази публикация?",
"composer.submit_and_lock": "Публикуване и заключване",
"composer.toggle_dropdown": "Превключване на падащото меню",
"composer.uploading": "Качване на %1",
"bootbox.ok": "Добре",
"bootbox.cancel": "Отказ",
"bootbox.confirm": "Потвърждаване",
"cover.dragging_title": "Наместване на снимката",
"cover.dragging_message": "Преместете снимката на желаното положение и натиснете „Запазване“",
"cover.saved": "Снимката и мястото ѝ бяха запазени"
}

View File

@@ -1,38 +0,0 @@
{
"title": "Известия",
"no_notifs": "Нямате нови известия",
"see_all": "Вижте всички известия",
"mark_all_read": "Отбелязване на всички известия като прочетени",
"back_to_home": "Назад към %1",
"outgoing_link": "Външна връзка",
"outgoing_link_message": "Напускате %1",
"continue_to": "Продължаване към %1",
"return_to": "Връщане към %1",
"new_notification": "Ново известие",
"you_have_unread_notifications": "Имате непрочетени известия",
"new_message_from": "Ново съобщение от <strong>%1</strong>",
"upvoted_your_post_in": "<strong>%1</strong> гласува положително за Ваша публикация в <strong>%2</strong>.",
"upvoted_your_post_in_dual": "<strong>%1</strong> и <strong>%2</strong> гласуваха положително за Ваша публикация в <strong>%3</strong>.",
"upvoted_your_post_in_multiple": "<strong>%1</strong> и %2 други гласуваха положително за Ваша публикация в <strong>%3</strong>.",
"moved_your_post": "<strong>%1</strong> премести публикацията Ви в <strong>%2</strong>",
"moved_your_topic": "<strong>%1</strong> премести <strong>%2</strong>",
"favourited_your_post_in": "<strong>%1</strong> си запази отметка към Ваша публикация в <strong>%2</strong>.",
"favourited_your_post_in_dual": "<strong>%1</strong> и <strong>%2</strong> си запазиха отметки към Ваша публикация в <strong>%3</strong>.",
"favourited_your_post_in_multiple": "<strong>%1</strong> и %2 други си запазиха отметки към Ваша публикация в <strong>%3</strong>.",
"user_flagged_post_in": "<strong>%1</strong> докладва Ваша публикация в <strong>%2</strong>",
"user_flagged_post_in_dual": "<strong>%1</strong> и <strong>%2</strong> докладваха Ваша публикация в <strong>%3</strong>",
"user_flagged_post_in_multiple": "<strong>%1</strong> и %2 други докладваха Ваша публикация в <strong>%3</strong>",
"user_posted_to": "<strong>%1</strong> публикува отговор на: <strong>%2</strong>",
"user_posted_to_dual": "<strong>%1</strong> и <strong>%2</strong> публикуваха отговори на: <strong>%3</strong>",
"user_posted_to_multiple": "<strong>%1</strong> и %2 други публикуваха отговори на: <strong>%3</strong>",
"user_posted_topic": "<strong>%1</strong> публикува нова тема: <strong>%2</strong>",
"user_started_following_you": "<strong>%1</strong> започна да Ви следва.",
"user_started_following_you_dual": "<strong>%1</strong> и <strong>%2</strong> започнаха да Ви следват.",
"user_started_following_you_multiple": "<strong>%1</strong> и %2 започнаха да Ви следват.",
"new_register": "<strong>%1</strong> изпрати заявка за регистрация.",
"new_register_multiple": "There are <strong>%1</strong> registration requests awaiting review.",
"email-confirmed": "Е-пощата беше потвърдена",
"email-confirmed-message": "Благодарим Ви, че потвърдихте е-пощата си. Акаунтът Ви е вече напълно активиран.",
"email-confirm-error-message": "Възникна проблем при потвърждаването на е-пощата Ви. Може кодът да е грешен или давността му да е изтекла.",
"email-confirm-sent": "Изпратено е е-писмо за потвърждение."
}

View File

@@ -1,46 +0,0 @@
{
"home": "Начало",
"unread": "Непрочетени теми",
"popular-day": "Популярните теми днес",
"popular-week": "Популярните теми тази седмица",
"popular-month": "Популярните теми този месец",
"popular-alltime": "Популярните теми за всички времена",
"recent": "Скорошни теми",
"flagged-posts": "Докладвани публикации",
"users/online": "Потребители на линия",
"users/latest": "Последни потребители",
"users/sort-posts": "Потребители с най-много публикации",
"users/sort-reputation": "Потребители с най-висока репутация",
"users/banned": "Блокирани потребители",
"users/search": "Търсене на потребители",
"notifications": "Известия",
"tags": "Етикети",
"tag": "Теми, отбелязани като „%1“",
"register": "Регистрирайте акаунт",
"login": "Влезте в акаунта си",
"reset": "Подновете паролата за акаунта си",
"categories": "Категории",
"groups": "Групи",
"group": "Група %1",
"chats": "Разговори",
"chat": "Разговаря с %1",
"account/edit": "Редактиране на „%1“",
"account/edit/password": "Редактиране на паролата на „%1“",
"account/edit/username": "Редактиране на потребителското име на „%1“",
"account/edit/email": "Редактиране на е-пощата на „%1“",
"account/following": "Хора, които %1 следва",
"account/followers": "Хора, които следват %1",
"account/posts": "Публикации от %1",
"account/topics": "Теми, създадени от %1",
"account/groups": "Групите на %1",
"account/favourites": "Отметнатите публикации на %1",
"account/settings": "Потребителски настройки",
"account/watched": "Теми, следени от %1",
"account/upvoted": "Публикации, получили положителен глас от %1",
"account/downvoted": "Публикации, получили отрицателен глас от %1",
"account/best": "Най-добрите публикации от %1",
"confirm": "Е-пощата е потвърдена",
"maintenance.text": "%1 в момента е в профилактика. Моля, върнете се по-късно.",
"maintenance.messageIntro": "В допълнение, администраторът е оставил това съобщение:",
"throttled.text": "%1 в момента е недостъпен, поради прекомерно натоварване. Моля, върнете се отново по-късно."
}

View File

@@ -1,19 +0,0 @@
{
"title": "Скорошни",
"day": "Ден",
"week": "Седмица",
"month": "Месец",
"year": "Година",
"alltime": "Цялото време",
"no_recent_topics": "Няма скорошни теми.",
"no_popular_topics": "Няма популярни теми.",
"there-is-a-new-topic": "Има нова тема.",
"there-is-a-new-topic-and-a-new-post": "Има нова тема и нова публикация.",
"there-is-a-new-topic-and-new-posts": "Има нова тема и %1 нови публикации.",
"there-are-new-topics": "Има %1 нови теми.",
"there-are-new-topics-and-a-new-post": "Има %1 нови теми и нова публикация.",
"there-are-new-topics-and-new-posts": "Има %1 нови теми и %2 нови публикации.",
"there-is-a-new-post": "Има нова публикация",
"there-are-new-posts": "Има %1 нови публикации.",
"click-here-to-reload": "Натиснете тук, за да презаредите."
}

View File

@@ -1,19 +0,0 @@
{
"register": "Регистрация",
"help.email": "По подразбиране, Вашата е-поща ще бъде скрита за останалите.",
"help.username_restrictions": "Уникално потребителско име с дължина между %1 и %2 символа. Другите ще могат да Ви споменават чрез @<span id='yourUsername'>потребител</span>.",
"help.minimum_password_length": "Дължината на паролата Ви трябва да е поне %1 символа.",
"email_address": "Е-поща",
"email_address_placeholder": "Въведете адрес на е-поща",
"username": "Потребителско име",
"username_placeholder": "Въведете потребителско име",
"password": "Парола",
"password_placeholder": "Въведете парола",
"confirm_password": "Потвърдете паролата",
"confirm_password_placeholder": "Потвърдете паролата",
"register_now_button": "Регистриране",
"alternative_registration": "Друг начин за регистриране",
"terms_of_use": "Условия за ползване",
"agree_to_terms_of_use": "Съгласен съм с условията за ползване",
"registration-added-to-queue": "Вашата регистрация беше добавена в опашката за одобрение. Ще получите е-писмо, когато тя бъде одобрена от администратор."
}

View File

@@ -1,17 +0,0 @@
{
"reset_password": "Подновяване на паролата",
"update_password": "Обновяване на паролата",
"password_changed.title": "Паролата беше променена",
"password_changed.message": "<p>Паролата беше подновена. Моля, <a href=\"/login\">влезте отново</a>.",
"wrong_reset_code.title": "Грешен код за подновяване",
"wrong_reset_code.message": "Полученият код за подновяване беше грешен. Моля, опитайте отново или <a href=\"/reset\">поискайте нов код за подновяване</a>.",
"new_password": "Нова парола",
"repeat_password": "Потвърдете паролата",
"enter_email": "Моля, въведете Вашата <strong>е-поща</strong> и ние ще Ви изпратим е-писмо с инструкции за това как да достъпите акаунта си.",
"enter_email_address": "Въведете адрес на е-поща",
"password_reset_sent": "Информацията за подновяване на паролата беше изпратена",
"invalid_email": "Грешна е-поща / е-пощата не съществува!",
"password_too_short": "Паролата е твърде кратка. Моля, изберете друга парола.",
"passwords_do_not_match": "Двете пароли, които въведохте, са различни.",
"password_expired": "Паролата Ви е с изтекла давност. Моля, изберете нова парола"
}

View File

@@ -1,40 +0,0 @@
{
"results_matching": "%1 резултат(а), отговарящи на „%2“, (%3 секунди)",
"no-matches": "Няма съвпадения",
"advanced-search": "Разширено търсене",
"in": "В",
"titles": "Заглавия",
"titles-posts": "Заглавия и публикации",
"posted-by": "Публикувано от",
"in-categories": "В категории",
"search-child-categories": "Претърсване на подкатегориите",
"reply-count": "Брой на отговорите",
"at-least": "Поне",
"at-most": "Най-много",
"post-time": "Време на публикуване",
"newer-than": "По-нови от",
"older-than": "По-стари от",
"any-date": "Която и да е дата",
"yesterday": "Вчера",
"one-week": "Една седмица",
"two-weeks": "Две седмици",
"one-month": "Един месец",
"three-months": "Три месеца",
"six-months": "Шест месеца",
"one-year": "Една година",
"sort-by": "Подреждане по",
"last-reply-time": "Време на последния отговор",
"topic-title": "Заглавие на темата",
"number-of-replies": "Брой на отговорите",
"number-of-views": "Брой на преглежданията",
"topic-start-date": "Начална дата на темата",
"username": "Потребителско име",
"category": "Категория",
"descending": "В низходящ ред",
"ascending": "Във възходящ ред",
"save-preferences": "Запазване на предпочитанията",
"clear-preferences": "Изчистване на предпочитанията",
"search-preferences-saved": "Предпочитанията за търсене бяха запазени",
"search-preferences-cleared": "Предпочитанията за търсене бяха изчистени",
"show-results-as": "Показване на резултатите като"
}

View File

@@ -1,6 +0,0 @@
{
"success": "Готово",
"topic-post": "Вие публикувахте успешно.",
"authentication-successful": "Успешно удостоверяване",
"settings-saved": "Настройките са записани!"
}

View File

@@ -1,7 +0,0 @@
{
"no_tag_topics": "Няма теми с този етикет.",
"tags": "Етикети",
"enter_tags_here": "Въведете етикетите тук, всеки може да е с дължина между %1 и %2 символа.",
"enter_tags_here_short": "Въведете етикети...",
"no_tags": "Все още няма етикети."
}

View File

@@ -1,112 +0,0 @@
{
"topic": "Тема",
"topic_id": "Идентификатора на темата",
"topic_id_placeholder": "Въведете идентификатор на темата",
"no_topics_found": "Няма открити теми!",
"no_posts_found": "Няма открити публикации!",
"post_is_deleted": "Тази публикация е изтрита!",
"topic_is_deleted": "Тази тема е изтрита!",
"profile": "Профил",
"posted_by": "Публикувано от %1",
"posted_by_guest": "Публикувано от гост",
"chat": "Разговор",
"notify_me": "Получавайте известия за новите отговори в тази тема",
"quote": "Цитат",
"reply": "Отговор",
"reply-as-topic": "Отговор в нова тема",
"guest-login-reply": "Влезте, за да отговорите",
"edit": "Редактиране",
"delete": "Изтриване",
"purge": "Изчистване",
"restore": "Възстановяване",
"move": "Преместване",
"fork": "Разделяне",
"link": "Връзка",
"share": "Споделяне",
"tools": "Инструменти",
"flag": "Докладване",
"locked": "Заключена",
"bookmark_instructions": "Натиснете тук, за да се върнете на последната непрочетена публикация в тази тема.",
"flag_title": "Докладване на тази публикация до модератор",
"flag_success": "Тази публикация е била докладвана до модератор.",
"deleted_message": "Тази тема е била изтрита. Само потребители с права за управление на темите могат да я видят.",
"following_topic.message": "Вече ще получавате известия когато някой публикува коментар в тази тема.",
"not_following_topic.message": "Вече няма да получавате известия за тази тема.",
"login_to_subscribe": "Моля, регистрирайте се или влезте, за да се абонирате за тази тема.",
"markAsUnreadForAll.success": "Темата е отбелязана като непрочетена за всички.",
"mark_unread": "Отбелязване като непрочетена",
"mark_unread.success": "Темата е отбелязана като непрочетена.",
"watch": "Наблюдаване",
"unwatch": "Спиране на наблюдаването",
"watch.title": "Получавайте известия за новите отговори в тази тема",
"unwatch.title": "Спрете да наблюдавате тази тема",
"share_this_post": "Споделете тази публикация",
"thread_tools.title": "Инструменти за темата",
"thread_tools.markAsUnreadForAll": "Отбелязване като непрочетена",
"thread_tools.pin": "Закачане на темата",
"thread_tools.unpin": "Откачане на темата",
"thread_tools.lock": "Заключване на темата",
"thread_tools.unlock": "Отключване на темата",
"thread_tools.move": "Преместване на темата",
"thread_tools.move_all": "Преместване на всички",
"thread_tools.fork": "Разделяне на темата",
"thread_tools.delete": "Изтриване на темата",
"thread_tools.delete-posts": "Изтриване на публикациите",
"thread_tools.delete_confirm": "Сигурен/а ли сте, че искате да изтриете тази тема?",
"thread_tools.restore": "Възстановяване на темата",
"thread_tools.restore_confirm": "Сигурен/а ли сте, че искате да възстановите тази тема?",
"thread_tools.purge": "Изчистване на темата",
"thread_tools.purge_confirm": "Сигурен/а ли сте, че искате да изчистите тази тема?",
"topic_move_success": "Темата беше преместена успешно в %1",
"post_delete_confirm": "Сигурен/а ли сте, че искате да изтриете тази публикация?",
"post_restore_confirm": "Сигурен/а ли сте, че искате да възстановите тази публикация?",
"post_purge_confirm": "Сигурен/а ли сте, че искате да изчистите тази публикация?",
"load_categories": "Зареждане на категориите",
"disabled_categories_note": "Изключените категории са засивени",
"confirm_move": "Преместване",
"confirm_fork": "Разделяне",
"favourite": "Отметка",
"favourites": "Отметки",
"favourites.has_no_favourites": "Все още не сте си запазвали отметки към никакви публикации.",
"loading_more_posts": "Зареждане на още публикации",
"move_topic": "Преместване на темата",
"move_topics": "Преместване на темите",
"move_post": "Преместване на публикацията",
"post_moved": "Публикацията беше преместена!",
"fork_topic": "Разделяне на темата",
"topic_will_be_moved_to": "Тази тема ще бъде преместена в категорията",
"fork_topic_instruction": "Натиснете публикациите, които искате да отделите",
"fork_no_pids": "Няма избрани публикации!",
"fork_success": "Темата е разделена успешно! Натиснете тук, за да преминете към отделената тема.",
"delete_posts_instruction": "Натиснете публикациите, които искате да изтриете/изчистите",
"composer.title_placeholder": "Въведете заглавието на темата си тук...",
"composer.handle_placeholder": "Име",
"composer.discard": "Отхвърляне",
"composer.submit": "Публикуване",
"composer.replying_to": "Отговор на %1",
"composer.new_topic": "Нова тема",
"composer.uploading": "качване...",
"composer.thumb_url_label": "Поставете адреса на иконка за темата",
"composer.thumb_title": "Добавете иконка към тази тема",
"composer.thumb_url_placeholder": "http://example.com/thumb.png",
"composer.thumb_file_label": "Или качете файл",
"composer.thumb_remove": "Изчистване на полетата",
"composer.drag_and_drop_images": "Плъзнете снимките тук",
"more_users_and_guests": "Още %1 потребител(и) и %2 гост(и)",
"more_users": "Още %1 потребител(и)",
"more_guests": "Още %1 гост(и)",
"users_and_others": "%1 и %2 други",
"sort_by": "Подреждане по",
"oldest_to_newest": "Първо най-старите",
"newest_to_oldest": "Първо най-новите",
"most_votes": "Най-много гласове",
"most_posts": "Най-много публикации",
"stale.title": "Създаване на нова тема вместо това?",
"stale.warning": "Темата, в която отговаряте, е доста стара. Искате ли вместо това да създадете нова и да направите препратка към тази в отговора си?",
"stale.create": "Създаване на нова тема",
"stale.reply_anyway": "Отговаряне в тази тема въпреки това",
"link_back": "Отговор: [%1](%2)",
"spam": "Спам",
"offensive": "Обидно",
"custom-flag-reason": "Изберете причина за докладване"
}

View File

@@ -1,10 +0,0 @@
{
"title": "Непрочетени",
"no_unread_topics": "Няма непрочетени теми.",
"load_more": "Зареждане на още",
"mark_as_read": "Отбелязване като прочетени",
"selected": "Избраните",
"all": "Всички",
"all_categories": "Всички категории",
"topics_marked_as_read.success": "Темите бяха отбелязани като прочетени!"
}

View File

@@ -1,107 +0,0 @@
{
"banned": "Блокиран",
"offline": "Извън линия",
"username": "Потребителско име",
"joindate": "Дата на присъединяване",
"postcount": "Брой публикации",
"email": "Е-поща",
"confirm_email": "Потвърдете е-пощата",
"ban_account": "Блокиране на акаунта",
"ban_account_confirm": "Наистина ли искате да блокирате този потребител?",
"unban_account": "Отблокиране на акаунта",
"delete_account": "Изтриване на акаунта",
"delete_account_confirm": "Сигурен/а ли сте, че искате да изтриете акаунта си? <br /><strong>Това действие е необратимо и няма да можете да възстановите нищо от данните си</strong><br /><br />Въведете потребителското си име, за да потвърдите, че искате да унищожите този акаунт.",
"delete_this_account_confirm": "Сигурен/а ли сте, че искате да изтриете този акаунт? <br /><strong>Това действие е необратимо и няма да можете да възстановите нищо от данните</strong><br /><br />",
"account-deleted": "Акаунтът е изтрит",
"fullname": "Цяло име",
"website": "Уеб сайт",
"location": "Местоположение",
"age": "Възраст",
"joined": "Присъединил се",
"lastonline": "Последно на линия",
"profile": "Профил",
"profile_views": "Преглеждания на профила",
"reputation": "Репутация",
"favourites": "Отметки",
"watched": "Наблюдавани",
"followers": "Последователи",
"following": "Следва",
"aboutme": "За мен",
"signature": "Подпис",
"birthday": "Рождена дата",
"chat": "Разговор",
"chat_with": "Разговор с %1",
"follow": "Следване",
"unfollow": "Спиране на следването",
"more": "Още",
"profile_update_success": "Профилът беше обновен успешно!",
"change_picture": "Промяна на снимката",
"change_username": "Промяна на потребителското име",
"change_email": "Промяна на е-пощата",
"edit": "Редактиране",
"default_picture": "Иконка по подразбиране",
"uploaded_picture": "Качена снимка",
"upload_new_picture": "Качване на нова снимка",
"upload_new_picture_from_url": "Качване на нова снимка от адрес",
"current_password": "Текуща парола",
"change_password": "Промяна на паролата",
"change_password_error": "Грешна парола!",
"change_password_error_wrong_current": "Текущата Ви парола е грешна!",
"change_password_error_length": "Паролата е твърде кратка!",
"change_password_error_match": "Паролите са различни!",
"change_password_error_privileges": "Нямате права да промените тази парола.",
"change_password_success": "Паролата ви е обновена!",
"confirm_password": "Потвърдете паролата",
"password": "Парола",
"username_taken_workaround": "Потребителското име, което искате, е заето и затова ние го променихме малко. Вие ще се наричате <strong>%1</strong>",
"password_same_as_username": "Паролата е същата като потребителското Ви име. Моля, изберете друга парола.",
"password_same_as_email": "Паролата е същата като е-пощата Ви. Моля, изберете друга парола.",
"upload_picture": "Качване на снимка",
"upload_a_picture": "Качване на снимка",
"remove_uploaded_picture": "Премахване на качената снимка",
"upload_cover_picture": "Качване на снимка за показване",
"settings": "Настройки",
"show_email": "Да се показва е-пощата ми",
"show_fullname": "Да се показва цялото ми име",
"restrict_chats": "Разрешаване на съобщенията само от потребители, които следвам",
"digest_label": "Абониране за резюмета",
"digest_description": "Абониране за новини по е-пощата относно този форум (нови известия и теми) според избрания график",
"digest_off": "Изключено",
"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_upvoted_posts": "Този потребител не е гласувал положително досега.",
"has_no_downvoted_posts": "Този потребител не е гласувал отрицателно досега.",
"has_no_voted_posts": "Този потребител не е гласувал досега.",
"email_hidden": "Е-пощата е скрита",
"hidden": "скрито",
"paginate_description": "Разделяне на темите и публикациите на страници, вместо да се превърта безкрайно",
"topics_per_page": "Теми на страница",
"posts_per_page": "Публикации на страница",
"notification_sounds": "Изпълняване на звук, когато получите известие",
"browsing": "Настройки за страниците",
"open_links_in_new_tab": "Отваряне на външните връзки в нов подпрозорец",
"enable_topic_searching": "Включване на търсенето в темите",
"topic_search_help": "Ако е включено, търсенето в темата ще замени стандартното поведение на браузъра при търсене в страницата и ще Ви позволи да претърсвате цялата тема, а не само това, което се вижда на екрана",
"follow_topics_you_reply_to": "Следване на темите, на които отговаряте",
"follow_topics_you_create": "Следване на темите, които създавате",
"grouptitle": "Изберете заглавието на групата, което искате да се показва",
"no-group-title": "Няма заглавие на група",
"select-skin": "Изберете облик",
"select-homepage": "Изберете начална страница",
"homepage": "Начална страница",
"homepage_description": "Изберете страница, която да използвате като начална за форума, или „Нищо“, за да използвате тази по подразбиране.",
"custom_route": "Път до персонализираната начална страница",
"custom_route_help": "Въведете името на пътя тук, без наклонена черта пред него (пример: „recent“ или „popular“)",
"sso.title": "Услуги за еднократно вписване",
"sso.associated": "Свързан с",
"sso.not-associated": "Натиснете тук, за да свържете с"
}

View File

@@ -1,20 +0,0 @@
{
"latest_users": "Последни потребители",
"top_posters": "С най-много публикации",
"most_reputation": "С най-много репутация",
"search": "Търсене",
"enter_username": "Въведете потребителско име, което да потърсите",
"load_more": "Зареждане на още",
"users-found-search-took": "Намерени са %1 потребител(и)! Търсенето отне %2 секунди.",
"filter-by": "Филтриране",
"online-only": "Само тези на линия",
"invite": "Канене",
"invitation-email-sent": "Беше изпратено е-писмо за потвърждение до %1",
"user_list": "Списък от потребители",
"recent_topics": "Скорошни теми",
"popular_topics": "Популярни теми",
"unread_topics": "Непрочетени теми",
"categories": "Категории",
"tags": "Етикети",
"no-users-found": "Няма открити потребители!"
}

View File

@@ -1,16 +0,0 @@
{
"category": "বিভাগ",
"subcategories": "উপবিভাগ",
"new_topic_button": "নতুন টপিক",
"guest-login-post": "উত্তর দিতে লগিন করুন",
"no_topics": "<strong>এই বিভাগে কোন আলোচনা নেই! </strong><br /> আপনি চাইলে নতুন আলোচনা শুরু করতে পারেন।",
"browsing": "ব্রাউজিং",
"no_replies": "কোন রিপ্লাই নেই",
"no_new_posts": "নতুন কোন পোস্ট নাই",
"share_this_category": "এই বিভাগটি অন্যের সাথে ভাগাভাগি করুন",
"watch": "নজর রাখুন",
"ignore": "উপেক্ষা করুন",
"watch.message": "আপনি এই বিভাগটিতে নজর রাখছেন",
"ignore.message": "আপনি এই বিভাগটির উপেক্ষা করছেন ",
"watched-categories": "প্রেক্ষিত বিভাগসমূহ"
}

View File

@@ -1,35 +0,0 @@
{
"password-reset-requested": "পাসওয়ার্ড রিসেটের জন্য অনুরোধ করা হয়েছে - %1!",
"welcome-to": "%1 এ স্বাগতম",
"invite": "%1 থেকে আমন্ত্রণ",
"greeting_no_name": "স্বাগতম",
"greeting_with_name": "স্বাগতম %1",
"welcome.text1": "%1 এ নিবন্ধন করার জন্য আপনাকে ধন্যবাদ!",
"welcome.text2": "আপনার একাউন্ট এ্যাক্টিভেট করার জন্য, আপনি যে ইমেইল এড্রেস ব্যাবহার করে নিবন্ধন করেছেন তা যাচাই করতে হবে",
"welcome.text3": "An administrator has accepted your registration application. You can login with your username/password now.",
"welcome.cta": "আপনার ইমেইল এড্রেস নিশ্চিত করার জন্য এখানে ক্লিক করুন",
"invitation.text1": "%1 আপনাকে %2 তে যোগ দিতে আমন্ত্রণ জানিয়েছেন ",
"invitation.ctr": "আপনার একাউন্ট খুলতে এখানে ক্লিক করুন",
"reset.text1": "আমরা আপনার পাসওয়ার্ড রিসেট করার অনুরোধ পেয়েছি, সম্ভবত আপনি আপনার পাসওয়ার্ড ভুলে গিয়েছেন বলেই। তবে যদি তা না হয়ে থাকে, তাহলে এই মেইলকে উপেক্ষা করতে পারেন।",
"reset.text2": "পাসওয়ার্ড রিসেট করতে নিচের লিংকে ক্লিক করুন",
"reset.cta": "পাসওয়ার্ড রিসেট করতে এখানে ক্লিক করুন",
"reset.notify.subject": "পাসওয়ার্ড পরিবর্তন সফল হয়েছে",
"reset.notify.text1": "আপনাকে জানাচ্ছি যে %1 এ আপনার পাসওয়ার্ড পরিবর্তন হয়েছে",
"reset.notify.text2": "এটা আপনার অজান্তে হলে এখনই প্রশাসককে আবহিত করুন",
"digest.notifications": "%1 থেকে আনরিড নোটিফিকেশন আছে।",
"digest.latest_topics": "%1 এর সর্বশেষ টপিকসমূহ",
"digest.cta": "%1 ভিজিট করতে এখানে ক্লিক করুন",
"digest.unsub.info": "আপনার সাবস্ক্রীপশন সেটিংসের কারনে আপনাকে এই ডাইজেষ্টটি পাঠানো হয়েছে।",
"digest.no_topics": "%1 এ কোন সক্রিয় টপিক নেই।",
"digest.day": "day",
"digest.week": "week",
"digest.month": "month",
"notif.chat.subject": "%1 এর থেকে নতুন মেসেজ এসেছে।",
"notif.chat.cta": "কথপোকথন চালিয়ে যেতে এখানে ক্লিক করুন",
"notif.chat.unsub.info": "আপনার সাবস্ক্রীপশন সেটিংসের কারনে আপনার এই নোটিফিকেশন পাঠানো হয়েছে",
"notif.post.cta": "পুরো বিষয়টি পড়তে এখানে ক্লিক করুন",
"notif.post.unsub.info": "আপনার সাবস্ক্রিপশন সেটিংসের কারনে আপনার এই বার্তাটি পাঠানো হয়েছে",
"test.text1": "আপনি সঠিকভাবে নোডবিবির জন্য মেইলার সেটাপ করেছেন কিনা নিশ্চিত করার জন্য এই টেষ্ট ইমেইল পাঠানো হয়েছে",
"unsub.cta": "সেটিংসগুলো পরিবর্তন করতে এখানে ক্লিক করুন",
"closing": "ধন্যবাদ!"
}

View File

@@ -1,101 +0,0 @@
{
"invalid-data": "ভুল তথ্য",
"not-logged-in": "আপনি লগিন করেননি",
"account-locked": "আপনার অ্যাকাউন্ট সাময়িকভাবে লক করা হয়েছে",
"search-requires-login": "Searching requires an account - please login or register.",
"invalid-cid": "ভুল বিভাগ নাম্বার",
"invalid-tid": "ভুল টপিক নাম্বার",
"invalid-pid": "ভুল পোস্ট নাম্বার",
"invalid-uid": "ভুল ব্যবহারকারী নাম্বার",
"invalid-username": "ভুল ইউজারনেম",
"invalid-email": "ভুল ইমেইল",
"invalid-title": "ভুল শিরোনাম",
"invalid-user-data": "ভুল ব্যবহারকারী তথ্য",
"invalid-password": "ভুল পাসওয়ার্ড",
"invalid-username-or-password": "অনুগ্রহ পূর্বক ইউজারনেম এবং পাসওয়ার্ড উভয়ই প্রদান করুন",
"invalid-search-term": "অগ্রহনযোগ্য সার্চ টার্ম",
"invalid-pagination-value": "Invalid pagination value, must be at least %1 and at most %2",
"username-taken": "ইউজারনেম আগেই ব্যবহৃত",
"email-taken": "ইমেইল আগেই ব্যবহৃত",
"email-not-confirmed": "আপনার ইমেইল এড্রেস নিশ্চিত করা হয় নি, নিশ্চিত করতে এখানে ক্লিক করুন।",
"email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.",
"no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email",
"email-confirm-failed": "We could not confirm your email, please try again later.",
"confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.",
"username-too-short": "খুব ছোট ইউজারনেম",
"username-too-long": "ইউজারনেম বড় হয়ে গিয়েছে",
"password-too-long": "Password too long",
"user-banned": "ব্যবহারকারী নিষিদ্ধ",
"user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post",
"no-category": "বিভাগটি খুজে পাওয়া যায় নি",
"no-topic": "এই টপিক নেই",
"no-post": "এই পোষ্ট নেই",
"no-group": "এই গ্রুপ অস্তিত্বহীন",
"no-user": "এই নামে কোন সদস্য নেই",
"no-teaser": "টিজারটি খুজে পাওয়া যায় নি",
"no-privileges": "এই কাজটির জন্য আপনার পর্যাপ্ত অধিকার নেই",
"category-disabled": "বিভাগটি নিষ্ক্রিয়",
"topic-locked": "টপিক বন্ধ",
"post-edit-duration-expired": "You are only allowed to edit posts for %1 second(s) after posting",
"content-too-short": "Please enter a longer post. Posts should contain at least %1 character(s).",
"content-too-long": "Please enter a shorter post. Posts can't be longer than %1 character(s).",
"title-too-short": "Please enter a longer title. Titles should contain at least %1 character(s).",
"title-too-long": "Please enter a shorter title. Titles can't be longer than %1 character(s).",
"too-many-posts": "You can only post once every %1 second(s) - please wait before posting again",
"too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again",
"tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)",
"tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)",
"not-enough-tags": "Not enough tags. Topics must have at least %1 tag(s)",
"too-many-tags": "Too many tags. Topics can't have more than %1 tag(s)",
"still-uploading": "আপলোড সম্পূর্ণ জন্য অনুগ্রহ করে অপেক্ষা করুন",
"file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file",
"guest-upload-disabled": "Guest uploading has been disabled",
"already-favourited": "You have already bookmarked this post",
"already-unfavourited": "You have already unbookmarked this post",
"cant-ban-other-admins": "আপনি অন্য এ্যাডমিনদের নিষিদ্ধ করতে পারেন না!",
"cant-remove-last-admin": "You are the only administrator. Add another user as an administrator before removing yourself as admin",
"invalid-image-type": "Invalid image type. Allowed types are: %1",
"invalid-image-extension": "Invalid image extension",
"invalid-file-type": "Invalid file type. Allowed types are: %1",
"group-name-too-short": "গ্রুপের নাম খুব ছোট",
"group-already-exists": "গ্রুপ ইতিমধ্যেই বিদ্যমান",
"group-name-change-not-allowed": "গ্রুপের নাম পরিবর্তনের অনুমতি নেই",
"group-already-member": "Already part of this group",
"group-not-member": "Not a member of this group",
"group-needs-owner": "This group requires at least one owner",
"group-already-invited": "This user has already been invited",
"group-already-requested": "Your membership request has already been submitted",
"post-already-deleted": "এই পোস্টটি ইতিমধ্যে ডিলিট করা হয়ে গিয়েছে",
"post-already-restored": "এই পোষ্টটি ইতিমধ্যে পুনরোদ্ধার করা হয়েছে",
"topic-already-deleted": "এই টপিকটি ইতিমধ্যে ডিলিট করা হয়েছে",
"topic-already-restored": "এই টপিকটি ইতিমধ্যে পুনরোদ্ধার করা হয়েছে",
"cant-purge-main-post": "You can't purge the main post, please delete the topic instead",
"topic-thumbnails-are-disabled": "টপিক থাম্বনেল নিষ্ক্রিয় করা। ",
"invalid-file": "ভুল ফাইল",
"uploads-are-disabled": "আপলোড নিষ্ক্রিয় করা",
"signature-too-long": "Sorry, your signature cannot be longer than %1 character(s).",
"about-me-too-long": "Sorry, your about me cannot be longer than %1 character(s).",
"cant-chat-with-yourself": "আপনি নিজের সাথে চ্যাট করতে পারবেন না!",
"chat-restricted": "এই সদস্য তার বার্তালাপ সংরক্ষিত রেখেছেন। এই সদস্য আপনাকে ফলো করার পরই কেবলমাত্র আপনি তার সাথে চ্যাট করতে পারবেন",
"chat-disabled": "Chat system disabled",
"too-many-messages": "You have sent too many messages, please wait awhile.",
"invalid-chat-message": "Invalid chat message",
"chat-message-too-long": "Chat message is too long",
"cant-edit-chat-message": "You are not allowed to edit this message",
"cant-remove-last-user": "You can't remove the last user",
"cant-delete-chat-message": "You are not allowed to delete this message",
"reputation-system-disabled": "সম্মাননা ব্যাবস্থা নিস্ক্রীয় রাখা হয়েছে",
"downvoting-disabled": "ঋণাত্মক ভোট নিস্ক্রীয় রাখা হয়েছে।",
"not-enough-reputation-to-downvote": "আপনার এই পোস্ট downvote করার জন্য পর্যাপ্ত সম্মাননা নেই",
"not-enough-reputation-to-flag": "এই পোষ্টকে ফ্লাগ করার জন্য আপনার পর্যাপ্ত সম্মাননা নেই",
"already-flagged": "You have already flagged this post",
"reload-failed": "\"%1\" রিলোড করতে সমস্যা হয়েছে। রিলোডের পূর্বে যা করা হয়েছিল সেটি আনডু করা সমীচীন। ",
"registration-error": "নিবন্ধন এরর!",
"parse-error": "Something went wrong while parsing server response",
"wrong-login-type-email": "Please use your email to login",
"wrong-login-type-username": "Please use your username to login",
"invite-maximum-met": "You have invited the maximum amount of people (%1 out of %2).",
"no-session-found": "No login session found!",
"not-in-room": "User not in room",
"no-users-in-room": "No users in this room"
}

View File

@@ -1,94 +0,0 @@
{
"home": "নীড়পাতা",
"search": "অনুসন্ধান",
"buttons.close": "বন্ধ",
"403.title": "প্রবেশাধিকার প্রত্যাখ্যাত",
"403.message": "You seem to have stumbled upon a page that you do not have access to.",
"403.login": "Perhaps you should <a href='%1/login'>try logging in</a>?",
"404.title": "পাওয়া যায়নি",
"404.message": "You seem to have stumbled upon a page that does not exist. Return to the <a href='%1/'>home page</a>.",
"500.title": "অভ্যন্তরীণ ত্রুটি।",
"500.message": "ওহো! কিছু ভুল হয়েছে মনে হচ্ছে!",
"register": "নিবন্ধন",
"login": "প্রবেশ",
"please_log_in": "অনুগ্রহ করে প্রবেশ করুন",
"logout": "প্রস্থান",
"posting_restriction_info": "বর্তমানে নিবন্ধিত সদস্যরাই কেবল পোস্ট করতে পারেন, লগ ইন করতে এখানে ক্লিক করুন।",
"welcome_back": "আপনাকে স্বাগতম",
"you_have_successfully_logged_in": "আপনি সফলভাবে প্রবেশ করেছেন",
"save_changes": "পরিবর্তনগুলি সঞ্চয় করুন",
"close": "বন্ধ",
"pagination": "পাতা নং",
"pagination.out_of": "%2 এর মাঝে %1",
"pagination.enter_index": "সূচক লিখুন",
"header.admin": "অ্যাডমিন",
"header.categories": "বিভাগ",
"header.recent": "সাম্প্রতিক",
"header.unread": "অপঠিত",
"header.tags": "ট্যাগ",
"header.popular": "জনপ্রিয়",
"header.users": "ব্যবহারকারীগণ",
"header.groups": "Groups",
"header.chats": "কথোপকথন",
"header.notifications": "বিজ্ঞপ্তি",
"header.search": "অনুসন্ধান",
"header.profile": "প্রোফাইল",
"header.navigation": "Navigation",
"notifications.loading": "বিজ্ঞপ্তিগুলি লোড হচ্ছে",
"chats.loading": "কথোপকথনগুলি লোড হচ্ছে ",
"motd.welcome": "ভবিষ্যতের আলোচনার প্লাটফর্ম, NodeBB তে স্বাগতম।",
"previouspage": "আগের পাতা",
"nextpage": "পরের পাতা",
"alert.success": "সফল",
"alert.error": "ত্রুটি",
"alert.banned": "নিষিদ্ধ",
"alert.banned.message": "আপনাকে কেবলই নিষিদ্ধ করা হয়েছে, আপনি এখন লগআউট হয়ে যাবেন।",
"alert.unfollow": "আপনি আর %1 কে অনুসরণ করছেন না!",
"alert.follow": "আপনি এখন %1 কে অনুসরণ করছেন!",
"online": "অনলাইন",
"users": "ব্যবহারকারীগণ",
"topics": "টপিক",
"posts": "পোস্টগুলি",
"best": "Best",
"upvoted": "Upvoted",
"downvoted": "Downvoted",
"views": "দেখেছেন",
"reputation": "সন্মাননা",
"read_more": "আরো পড়ুন",
"more": "আরো...",
"posted_ago_by_guest": "অতিথি পোস্ট করেছেন %1",
"posted_ago_by": " %1 %2 দ্বারা পোস্টকৃত",
"posted_ago": "পোস্ট করেছেন %1",
"posted_in": "posted in %1",
"posted_in_by": "posted in %1 by %2",
"posted_in_ago": "%1 বিভাগে পোস্ট করা হয়েছে %2 আগে",
"posted_in_ago_by": "%3 %1 বিভাগে পোস্ট করেছেন %2",
"user_posted_ago": "%1 পোস্ট করেছেন %2",
"guest_posted_ago": "অতিথি পোস্ট করেছেন %1",
"last_edited_by": "last edited by %1",
"norecentposts": "কোনও সাম্প্রতিক পোস্ট নেই",
"norecenttopics": "কোনও সাম্প্রতিক টপিক নেই",
"recentposts": "সাম্প্রতিক পোস্ট",
"recentips": "সাম্প্রতিক প্রবেশকৃত আইপি সমুহ",
"away": "দূরে",
"dnd": "Do not disturb",
"invisible": "অদৃশ্য",
"offline": "অফলাইন",
"email": "ইমেইল",
"language": "ভাষা",
"guest": "অতিথি",
"guests": "অতিথি",
"updated.title": "ফোরাম আপডেট করা হয়েছে",
"updated.message": "এই ফোরামে এইমাত্র সর্বশেষ সংস্করণে আপডেট করা হয়েছে। পৃষ্ঠাটি রিফ্রেশ করতে এখানে ক্লিক করুন।",
"privacy": "নিরাপত্তা",
"follow": "Follow",
"unfollow": "Unfollow",
"delete_all": "সব মুছে ফেলুন",
"map": "ম্যাপ",
"sessions": "Login Sessions",
"ip_address": "IP Address",
"enter_page_number": "Enter page number",
"upload_file": "Upload file",
"upload": "Upload",
"allowed-file-types": "Allowed file types are %1"
}

View File

@@ -1,53 +0,0 @@
{
"groups": "গ্রুপসমূহ",
"view_group": "গ্রুপ দেখুন",
"owner": "Group Owner",
"new_group": "Create New Group",
"no_groups_found": "There are no groups to see",
"pending.accept": "Accept",
"pending.reject": "Reject",
"pending.accept_all": "Accept All",
"pending.reject_all": "Reject All",
"pending.none": "There are no pending members at this time",
"invited.none": "There are no invited members at this time",
"invited.uninvite": "Rescind Invitation",
"invited.search": "Search for a user to invite to this group",
"invited.notification_title": "You have been invited to join <strong>%1</strong>",
"request.notification_title": "Group Membership Request from <strong>%1</strong>",
"request.notification_text": "<strong>%1</strong> has requested to become a member of <strong>%2</strong>",
"cover-save": "Save",
"cover-saving": "Saving",
"details.title": "গ্রুপের বিস্তারিত",
"details.members": "সদস্য তালিকা",
"details.pending": "Pending Members",
"details.invited": "Invited Members",
"details.has_no_posts": "এই গ্রুপের সদস্যরা এখনো কোন পোষ্ট করেন নি",
"details.latest_posts": "সর্বশেষ পোষ্টসমূহ",
"details.private": "Private",
"details.disableJoinRequests": "Disable join requests",
"details.grant": "Grant/Rescind Ownership",
"details.kick": "Kick",
"details.owner_options": "Group Administration",
"details.group_name": "Group Name",
"details.member_count": "Member Count",
"details.creation_date": "Creation Date",
"details.description": "Description",
"details.badge_preview": "Badge Preview",
"details.change_icon": "Change Icon",
"details.change_colour": "Change Colour",
"details.badge_text": "Badge Text",
"details.userTitleEnabled": "Show Badge",
"details.private_help": "If enabled, joining of groups requires approval from a group owner",
"details.hidden": "Hidden",
"details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
"details.delete_group": "Delete Group",
"event.updated": "Group details have been updated",
"event.deleted": "The group \"%1\" has been deleted",
"membership.accept-invitation": "Accept Invitation",
"membership.invitation-pending": "Invitation Pending",
"membership.join-group": "Join Group",
"membership.leave-group": "Leave Group",
"membership.reject": "Reject",
"new-group.group_name": "Group Name:",
"upload-group-cover": "Upload group cover"
}

View File

@@ -1,5 +0,0 @@
{
"name": "বাংলা",
"code": "bn",
"dir": "ltr"
}

View File

@@ -1,11 +0,0 @@
{
"username-email": "ইউজারনেম / ইমেইল",
"username": "ইউজারনেম",
"email": "ইমেইল",
"remember_me": "মনে রাখুন",
"forgot_password": "পাসওয়ার্ড ভুলে গিয়েছেন?",
"alternative_logins": "বিকল্প প্রবেশ",
"failed_login_attempt": "প্রবেশ সফল হয় নি, আবার চেষ্টা করুন।",
"login_successful": "আপনি সফলভাবে প্রবেশ করেছেন!",
"dont_have_account": "কোন একাউন্ট নেই?"
}

View File

@@ -1,37 +0,0 @@
{
"chat.chatting_with": "<span id=\"chat-with-name\"></span> এর সাথে কথোপকথন",
"chat.placeholder": "এখানে আপনার বার্তা লিখুন। পাঠানোর জন্য Enter চাপুন",
"chat.send": "প্রেরন করুন",
"chat.no_active": "আপনার কোন সচল কথোপকথন নেই",
"chat.user_typing": "%1 লিখছেন",
"chat.user_has_messaged_you": "%1 আপনাকে বার্তা পাঠিয়েছেন",
"chat.see_all": "See all chats",
"chat.no-messages": "মেসেজ হিস্টোরী দেখতে প্রাপক নির্বাচন করুন",
"chat.no-users-in-room": "No users in this room",
"chat.recent-chats": "সাম্প্রতিক চ্যাটসমূহ",
"chat.contacts": "কন্টাক্টস",
"chat.message-history": "মেসেজ হিস্টোরী",
"chat.pop-out": "চ্যাট উইন্ডো আলাদা করুন",
"chat.maximize": "ম্যাক্সিমাইজ",
"chat.seven_days": " দিন",
"chat.thirty_days": "৩০ দিন",
"chat.three_months": "৩ মাস",
"chat.delete_message_confirm": "Are you sure you wish to delete this message?",
"chat.roomname": "Chat Room %1",
"chat.add-users-to-room": "Add users to room",
"composer.compose": "Compose",
"composer.show_preview": "Show Preview",
"composer.hide_preview": "Hide Preview",
"composer.user_said_in": "%1 বলেছেন %2:",
"composer.user_said": "%1 বলেছেনঃ",
"composer.discard": "আপনি কি নিশ্চিত যে আপনি এই পোস্ট বাতিল করতে ইচ্ছুক?",
"composer.submit_and_lock": "Submit and Lock",
"composer.toggle_dropdown": "Toggle Dropdown",
"composer.uploading": "Uploading %1",
"bootbox.ok": "OK",
"bootbox.cancel": "Cancel",
"bootbox.confirm": "Confirm",
"cover.dragging_title": "Cover Photo Positioning",
"cover.dragging_message": "Drag the cover photo to the desired position and click \"Save\"",
"cover.saved": "Cover photo image and position saved"
}

View File

@@ -1,38 +0,0 @@
{
"title": "বিজ্ঞপ্তিগুলো",
"no_notifs": "আপনার নতুন কোন বিজ্ঞপ্তি নেই",
"see_all": "See all notifications",
"mark_all_read": "Mark all notifications read",
"back_to_home": "ফিরুন %1",
"outgoing_link": "বহির্গামী লিঙ্ক",
"outgoing_link_message": "You are now leaving %1",
"continue_to": "%1 তে আগান",
"return_to": "%1 এ ফেরত যান",
"new_notification": "নতুন বিজ্ঞপ্তি",
"you_have_unread_notifications": "আপনার অপঠিত বিজ্ঞপ্তি আছে।",
"new_message_from": "<strong>%1</strong> থেকে নতুন বার্তা",
"upvoted_your_post_in": "<strong>%1</strong> , <strong>%2</strong> এ আপানার পোষ্টকে আপভোট করেছেন। ",
"upvoted_your_post_in_dual": "<strong>%1</strong> and <strong>%2</strong> have upvoted your post in <strong>%3</strong>.",
"upvoted_your_post_in_multiple": "<strong>%1</strong> and %2 others have upvoted your post in <strong>%3</strong>.",
"moved_your_post": "<strong>%1</strong> has moved your post to <strong>%2</strong>",
"moved_your_topic": "<strong>%1</strong> has moved <strong>%2</strong>",
"favourited_your_post_in": "<strong>%1</strong> has bookmarked your post in <strong>%2</strong>.",
"favourited_your_post_in_dual": "<strong>%1</strong> and <strong>%2</strong> have bookmarked your post in <strong>%3</strong>.",
"favourited_your_post_in_multiple": "<strong>%1</strong> and %2 others have bookmarked your post in <strong>%3</strong>.",
"user_flagged_post_in": "<strong>%1</strong> flagged a post in <strong>%2</strong>",
"user_flagged_post_in_dual": "<strong>%1</strong> and <strong>%2</strong> flagged a post in <strong>%3</strong>",
"user_flagged_post_in_multiple": "<strong>%1</strong> and %2 others flagged a post in <strong>%3</strong>",
"user_posted_to": "<strong>%1</strong> একটি উত্তর দিয়েছেন: <strong>%2</strong>",
"user_posted_to_dual": "<strong>%1</strong> and <strong>%2</strong> have posted replies to: <strong>%3</strong>",
"user_posted_to_multiple": "<strong>%1</strong> and %2 others have posted replies to: <strong>%3</strong>",
"user_posted_topic": "<strong>%1</strong> has posted a new topic: <strong>%2</strong>",
"user_started_following_you": "<strong>%1</strong> আপনাকে অনুসরন করা শুরু করেছেন।",
"user_started_following_you_dual": "<strong>%1</strong> and <strong>%2</strong> started following you.",
"user_started_following_you_multiple": "<strong>%1</strong> and %2 others started following you.",
"new_register": "<strong>%1</strong> sent a registration request.",
"new_register_multiple": "There are <strong>%1</strong> registration requests awaiting review.",
"email-confirmed": "ইমেইল নিশ্চিত করা হয়েছে",
"email-confirmed-message": "আপনার ইমেইল যাচাই করার জন্য আপনাকে ধন্যবাদ। আপনার অ্যাকাউন্টটি এখন সম্পূর্ণরূপে সক্রিয়।",
"email-confirm-error-message": "আপনার ইমেল ঠিকানার বৈধতা যাচাইয়ে একটি সমস্যা হয়েছে। সম্ভবত কোডটি ভুল ছিল অথবা কোডের মেয়াদ শেষ হয়ে গিয়েছে।",
"email-confirm-sent": "নিশ্চিতকরণ ইমেইল পাঠানো হয়েছে।"
}

View File

@@ -1,46 +0,0 @@
{
"home": "নীড়পাতা",
"unread": "অপঠিত টপিক",
"popular-day": "Popular topics today",
"popular-week": "Popular topics this week",
"popular-month": "Popular topics this month",
"popular-alltime": "All time popular topics",
"recent": "সাম্প্রতিক টপিক",
"flagged-posts": "Flagged Posts",
"users/online": "Online Users",
"users/latest": "Latest Users",
"users/sort-posts": "Users with the most posts",
"users/sort-reputation": "Users with the most reputation",
"users/banned": "Banned Users",
"users/search": "User Search",
"notifications": "বিজ্ঞপ্তি",
"tags": "ট্যাগসমূহ",
"tag": "Topics tagged under \"%1\"",
"register": "Register an account",
"login": "Login to your account",
"reset": "Reset your account password",
"categories": "বিভাগ",
"groups": "Groups",
"group": "%1 group",
"chats": "Chats",
"chat": "Chatting with %1",
"account/edit": "Editing \"%1\"",
"account/edit/password": "Editing password of \"%1\"",
"account/edit/username": "Editing username of \"%1\"",
"account/edit/email": "Editing email of \"%1\"",
"account/following": "People %1 follows",
"account/followers": "People who follow %1",
"account/posts": "Posts made by %1",
"account/topics": "Topics created by %1",
"account/groups": "%1's Groups",
"account/favourites": "%1's Bookmarked Posts",
"account/settings": "User Settings",
"account/watched": "Topics watched by %1",
"account/upvoted": "Posts upvoted by %1",
"account/downvoted": "Posts downvoted by %1",
"account/best": "Best posts made by %1",
"confirm": "Email Confirmed",
"maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.",
"maintenance.messageIntro": "Additionally, the administrator has left this message:",
"throttled.text": "%1 is currently unavailable due to excessive load. Please come back another time."
}

View File

@@ -1,19 +0,0 @@
{
"title": "সাম্প্রতিক",
"day": "দিন",
"week": "সপ্তাহ",
"month": "মাস",
"year": "বছর",
"alltime": "সবসময় ",
"no_recent_topics": "কোন সাম্প্রতিক টপিক নেই। ",
"no_popular_topics": "There are no popular topics.",
"there-is-a-new-topic": "There is a new topic.",
"there-is-a-new-topic-and-a-new-post": "There is a new topic and a new post.",
"there-is-a-new-topic-and-new-posts": "There is a new topic and %1 new posts.",
"there-are-new-topics": "There are %1 new topics.",
"there-are-new-topics-and-a-new-post": "There are %1 new topics and a new post.",
"there-are-new-topics-and-new-posts": "There are %1 new topics and %2 new posts.",
"there-is-a-new-post": "There is a new post.",
"there-are-new-posts": "There are %1 new posts.",
"click-here-to-reload": "Click here to reload."
}

View File

@@ -1,19 +0,0 @@
{
"register": "নিবন্ধন",
"help.email": "ডিফল্টভাবে, আপনার ইমেইল সর্বসাধারণ থেকে লুকানো থাকবে।",
"help.username_restrictions": "%1 এবং %2 অক্ষরের মাঝে একটি অনন্য সদস্য নাম। বাকিরা আপনাকে @<span id='yourUsername'>নাম</span> দিয়ে উল্লেখ করতে পারবেন।",
"help.minimum_password_length": "আপনার পাসওয়ার্ড এর দৈর্ঘ্য অন্তত %1 অক্ষরের হতে হবে।",
"email_address": "ইমেইল অ্যাড্রেস",
"email_address_placeholder": "ইমেইল অ্যাড্রেস লিখুন",
"username": "ইউজারনেম",
"username_placeholder": "ইউজারনেম লিখুন",
"password": "পাসওয়ার্ড",
"password_placeholder": "পাসওয়ার্ড লিখুন",
"confirm_password": "পাসওয়ার্ড নিশ্চিত করুন",
"confirm_password_placeholder": "পাসওয়ার্ড নিশ্চিত করুন",
"register_now_button": "নিবন্ধন করুন",
"alternative_registration": "বিকল্প নিবন্ধন",
"terms_of_use": "নিয়মাবলী",
"agree_to_terms_of_use": "আমি নিয়মাবলী মেনে চলতে সম্মতি জানালাম",
"registration-added-to-queue": "আপনার নিবন্ধনটি এ্যাপ্লুভাল তালিকায় যুক্ত হয়েছে। একজন এডমিনিস্ট্রেটর কর্তৃক নিবন্ধন গৃহীত হলে আপনি একটি মেইল পাবেন। "
}

View File

@@ -1,17 +0,0 @@
{
"reset_password": "পাসওয়ার্ড রিসেট",
"update_password": "পাসওয়ার্ড হালনাগাদ",
"password_changed.title": "পাসওয়ার্ড পরিবর্তন করা হয়েছে",
"password_changed.message": "<p>পাসওয়ার্ড সফলভাবে রিসেট করা হয়েছে, পুনরায় <a href=\"/login\">প্রবেশ<a> করুন।",
"wrong_reset_code.title": "ভুল রিসেট কোড",
"wrong_reset_code.message": "প্রাপ্ত রিসেট কোডটি ভুল ছিল। আবার চেষ্টা করুন, অথবা <a href=\"/reset\">একটি নতুন রিসেট কোড</a> অনুরোধ করুন।",
"new_password": "নতুন পাসওয়ার্ড",
"repeat_password": "পাসওয়ার্ড নিশ্চিত করুন",
"enter_email": "অনুগ্রহপূর্বক আপনার ইমেইল এড্রেস প্রদান করুন, আমরা আপনাকে আপনার পাসওয়ার্ড রিসেট সম্পর্কিত তথ্যাবলী ইমেইলে পাঠিয়ে দিবো। ",
"enter_email_address": "আপনার ইমেইল এড্রেস",
"password_reset_sent": "পাসওয়ার্ড রিসেট মেইল পাঠানো হয়েছে",
"invalid_email": "ভুল ইমেইল / ইমেইল ডেটাবেইজে নেই",
"password_too_short": "The password entered is too short, please pick a different password.",
"passwords_do_not_match": "The two passwords you've entered do not match.",
"password_expired": "Your password has expired, please choose a new password"
}

View File

@@ -1,40 +0,0 @@
{
"results_matching": "\"%2\" এর সাথে মিলিয়ে %1 ফলাফল পাওয়া গেছে, ( %3 seconds সময় লেগেছে )",
"no-matches": "কোন মিল খুঁজে পাওয়া যায় নি",
"advanced-search": "এডভান্সড সার্চ",
"in": "এর মধ্যে",
"titles": "টাইটেলস",
"titles-posts": "টাইটেল এবং পোস্ট সমূহ",
"posted-by": "পোষ্ট করেছেন",
"in-categories": "বিভাগের ভিতরে",
"search-child-categories": "উপবিভাগের ভিতরে",
"reply-count": "রিপ্লাই কাউন্ট",
"at-least": "কমপক্ষে",
"at-most": "সর্বোচ্চ",
"post-time": "পোস্টের সময়",
"newer-than": "Newer than",
"older-than": "Older than",
"any-date": "যেকোন তারিখ",
"yesterday": "গতকাল",
"one-week": "এক সপ্তাহ",
"two-weeks": "দুই সপ্তাহ",
"one-month": "এক মাস",
"three-months": "তিন মাস",
"six-months": "ছয় মাস",
"one-year": "এক বছর",
"sort-by": "সাজানোর ভিত্তি",
"last-reply-time": "সর্বশেষ রিপ্লাইয়ের সময়",
"topic-title": "টপিকের টাইটেল",
"number-of-replies": "রিপ্লাইয়ের সংখ্যা",
"number-of-views": "সর্বমোট ভিউ",
"topic-start-date": "টপিক শুরুর তারিখ",
"username": "ইউজারনেম",
"category": "বিভাগ",
"descending": "বড় থেকে ছোট অর্ডারে",
"ascending": "ছোট থেকে বড় অর্ডারে",
"save-preferences": "প্রেফারেন্স সেভ",
"clear-preferences": "Clear preferences",
"search-preferences-saved": "Search preferences saved",
"search-preferences-cleared": "Search preferences cleared",
"show-results-as": "ফলাফল দেখানো হোক : "
}

View File

@@ -1,6 +0,0 @@
{
"success": "সফল হয়েছে",
"topic-post": "আপনি সফলভাবে পোষ্ট করেছেন। ",
"authentication-successful": "অথেন্টিকেশন সফল হয়েছে",
"settings-saved": "সেটিংস সেভ করা হয়েছে। "
}

View File

@@ -1,7 +0,0 @@
{
"no_tag_topics": "এই ট্যাগ সম্বলিত কোন টপিক নেই",
"tags": "ট্যাগসমূহ",
"enter_tags_here": "Enter tags here, between %1 and %2 characters each.",
"enter_tags_here_short": "ট্যাগ বসান",
"no_tags": "এখন পর্যন্ত কোন ট্যাগ নেই"
}

View File

@@ -1,112 +0,0 @@
{
"topic": "টপিক",
"topic_id": "টপিক নাম্বার ",
"topic_id_placeholder": "টপিক নাম্বার দিন ",
"no_topics_found": "কোন টপিক পাওয়া যায়নি!",
"no_posts_found": "কোন পোস্ট পাওয়া যায়নি",
"post_is_deleted": "এই পোস্টটি মুছে ফেলা হয়েছে!",
"topic_is_deleted": "This topic is deleted!",
"profile": "প্রোফাইল ",
"posted_by": "পোস্ট করেছেন %1",
"posted_by_guest": "অতিথি পোস্ট ",
"chat": "আলাপচারি",
"notify_me": "এই টপিকে নতুন উত্তর আসলে জানুন",
"quote": "উদ্ধৃতি",
"reply": "উত্তর",
"reply-as-topic": "Reply as topic",
"guest-login-reply": "Log in to reply",
"edit": "সম্পাদণা",
"delete": "মুছে ফেলুন",
"purge": "পার্জ",
"restore": "পুনরূদ্ধার",
"move": "সরানো",
"fork": "শাখা",
"link": "লিঙ্ক",
"share": "শেয়ার",
"tools": "টুলস",
"flag": "ফ্ল্যাগ",
"locked": "বন্ধ",
"bookmark_instructions": "Click here to return to the last unread post in this thread.",
"flag_title": "মডারেশনের জন্য এই পোস্টটি ফ্ল্যাগ করুন",
"flag_success": "এই পোস্টটি মডারেশনের জন্য ফ্ল্যাগ করা হয়েছে।",
"deleted_message": "এই টপিকটি মুছে ফেলা হয়েছে। শুধুমাত্র টপিক ব্যবস্থাপনার ক্ষমতাপ্রাপ্ত সদস্যগণ এটি দেখতে পারবেন।",
"following_topic.message": "এখন থেকে এই টপিকে অন্যকেউ পোস্ট করলে আপনি নোটিফিকেশন পাবেন।",
"not_following_topic.message": "এই টপিক থেকে আপনি আর নোটিফিকেশন পাবেন না।",
"login_to_subscribe": "এই টপিকে সাবস্ক্রাইব করতে চাইলে অনুগ্রহ করে নিবন্ধণ করুন অথবা প্রবেশ করুন।",
"markAsUnreadForAll.success": "টপিকটি সবার জন্য অপঠিত হিসাবে মার্ক করুন।",
"mark_unread": "Mark unread",
"mark_unread.success": "Topic marked as unread.",
"watch": "দেখা",
"unwatch": "অদেখা",
"watch.title": "এই টপিকে নতুন উত্তর এলে বিজ্ঞাপণের মাধ্যমে জানুন।",
"unwatch.title": "এই টপিক দেখা বন্ধ করুন",
"share_this_post": "এই পোষ্টটি শেয়ার করুন",
"thread_tools.title": "টপিক সম্পর্কিত টুলস",
"thread_tools.markAsUnreadForAll": "\"অপঠিত\" হিসেবে চিহ্নিত করুন",
"thread_tools.pin": "টপিক পিন করুন",
"thread_tools.unpin": "টপিক আনপিন করুন",
"thread_tools.lock": "টপিক বন্ধ করুন",
"thread_tools.unlock": "টপিক খুলে দিন",
"thread_tools.move": "টপিক সরান",
"thread_tools.move_all": "সমস্ত টপিক সরান",
"thread_tools.fork": "টপিক ফর্ক করুন",
"thread_tools.delete": "টপিক মুছে ফেলুন",
"thread_tools.delete-posts": "Delete Posts",
"thread_tools.delete_confirm": "আপনি নিশ্চিত যে আপনি এই টপিকটি মুছে ফেলতে চান?",
"thread_tools.restore": "টপিক পুনরূদ্ধার করুন",
"thread_tools.restore_confirm": "আপনি নিশ্চিত যে আপনি টপিকটি পুনরূদ্ধার করতে চান?",
"thread_tools.purge": "টপিক পার্জ করুন",
"thread_tools.purge_confirm": "আপনি নিশ্চিত যে আপনি টপিকটি পার্জ করতে চাচ্ছেন ? ",
"topic_move_success": "টপিকটি %1 এ সরিয়ে নেয়া হয়েছে",
"post_delete_confirm": "আপনি নিশ্চিত যে আপনি এই পোষ্টটি মুছে ফেলতে চান ?",
"post_restore_confirm": "আপনি নিশ্চিত যে আপনি এই পোষ্টটি পুনরূূদ্ধার করতে চান ? ",
"post_purge_confirm": "আপনি নিশ্চিত যে আপনি এই পোষ্টটি পার্জ করতে চান ? ",
"load_categories": "ক্যাটাগরী লোড করা হচ্ছে",
"disabled_categories_note": "নিস্ক্রীয় ক্যাটাগরীসমূহ ধূসর কালিতে লেখা রয়েছে। ",
"confirm_move": "সরান",
"confirm_fork": "ফর্ক",
"favourite": "Bookmark",
"favourites": "Bookmarks",
"favourites.has_no_favourites": "You haven't bookmarked any posts yet.",
"loading_more_posts": "আরো পোষ্ট লোড করা হচ্ছে",
"move_topic": "টপিক সরান",
"move_topics": "টপিক সমূহ সরান",
"move_post": "পোষ্ট সরান",
"post_moved": "পোষ্ট সরানো হয়েছে",
"fork_topic": "টপিক ফর্ক করুন",
"topic_will_be_moved_to": "এই টপিকটি ক্যাটাগরীতে সরানো হবে",
"fork_topic_instruction": "যে পোষ্টটি ফর্ক করতে চান সেটি ক্লিক করুন",
"fork_no_pids": "কোন পোষ্ট সিলেক্ট করা হয় নি",
"fork_success": "টপিক ফর্ক করা হয়েছে। ফর্ক করা টপিকে যেতে এখানে ক্লিক করুন",
"delete_posts_instruction": "Click the posts you want to delete/purge",
"composer.title_placeholder": "আপনার টপিকের শিরোনাম দিন",
"composer.handle_placeholder": "Name",
"composer.discard": "বাতিল",
"composer.submit": "সাবমিট",
"composer.replying_to": "%1 এর উত্তরে:",
"composer.new_topic": "নতুন টপিক",
"composer.uploading": "আপলোডিং",
"composer.thumb_url_label": "টপিকে থাম্বনেইল URL পেষ্ট করুন",
"composer.thumb_title": "এই টপিকে থাম্বনেইল যোগ করুন",
"composer.thumb_url_placeholder": "http://example.com/thumb.png",
"composer.thumb_file_label": "অথবা একটি ফাইল আপলোড করুন",
"composer.thumb_remove": "ফিল্ড ক্লিয়ার করুন",
"composer.drag_and_drop_images": "ছবি এখানে ড্র্যাগ করে এনে ছেড়ে দিন",
"more_users_and_guests": "%1 more user(s) and %2 guest(s)",
"more_users": "%1 more user(s)",
"more_guests": "%1 more guest(s)",
"users_and_others": "%1 and %2 others",
"sort_by": "সাজানোর ভিত্তি:",
"oldest_to_newest": "পুরাতন থেকে নতুন",
"newest_to_oldest": "নতুন থেকে পুরাতন",
"most_votes": "সর্বোচ্চ ভোট",
"most_posts": "Most posts",
"stale.title": "Create new topic instead?",
"stale.warning": "The topic you are replying to is quite old. Would you like to create a new topic instead, and reference this one in your reply?",
"stale.create": "Create a new topic",
"stale.reply_anyway": "Reply to this topic anyway",
"link_back": "Re: [%1](%2)",
"spam": "Spam",
"offensive": "Offensive",
"custom-flag-reason": "Enter a flagging reason"
}

View File

@@ -1,10 +0,0 @@
{
"title": "অপঠিত",
"no_unread_topics": "কোন অপঠিত টপিক নেই",
"load_more": "আরো লোড করুন",
"mark_as_read": "পঠিত হিসেবে চিহ্নিত করুন",
"selected": "নির্বাচিত",
"all": "সবগুলো",
"all_categories": "All categories",
"topics_marked_as_read.success": "পঠিত হিসেবে চিহ্নিত টপিকসমূহ"
}

View File

@@ -1,107 +0,0 @@
{
"banned": "নিষিদ্ধ",
"offline": "অফলাইন",
"username": "সদস্যের নাম",
"joindate": "নিবন্ধন তারিখ",
"postcount": "সর্বমোট পোষ্ট",
"email": "ইমেইল",
"confirm_email": "ইমেইল নিশ্চিত করুন",
"ban_account": "একাউন্ট নিষিদ্ধ করুন",
"ban_account_confirm": "আপনি কি নিশ্চিত যে এই সদস্যকে নিষিদ্ধ করতে চান ?",
"unban_account": "নিষেদ্ধাজ্ঞা তুলে নিন",
"delete_account": "একাউন্ট মুছে ফেলুন",
"delete_account_confirm": "আপনি কি নিশ্চিত যে আপনি আপনার একাউন্ট মুছে ফেলতে চান ? <br /><strong>এই কাজটির ফলে আপনার কোন তথ্য পুনরূদ্ধার করা সম্ভব নয় </strong><br /><br /> নিশ্চিত করতে আপনার ইউজারনেম প্রবেশ করান। ",
"delete_this_account_confirm": "Are you sure you want to delete this account? <br /><strong>This action is irreversible and you will not be able to recover any data</strong><br /><br />",
"account-deleted": "একাউন্ট মুছে ফেলা হয়েছে",
"fullname": "পুর্ণ নাম",
"website": "ওয়েবসাইট",
"location": "স্থান",
"age": "বয়স",
"joined": "যোগদান করেছেন",
"lastonline": "সর্বশেষ অনলাইনে ছিলেন",
"profile": "প্রোফাইল",
"profile_views": "প্রোফাইল দেখেছেন",
"reputation": "সন্মাননা",
"favourites": "Bookmarks",
"watched": "দেখা হয়েছে",
"followers": "যাদের অনুসরণ করছেন",
"following": "যারা আপনাকে অনুসরণ করছে",
"aboutme": "আমার সম্পর্কে: ",
"signature": "স্বাক্ষর",
"birthday": "জন্মদিন",
"chat": "বার্তালাপ",
"chat_with": "চ্যাট উইথ %1",
"follow": "অনুসরন করুন",
"unfollow": "অনুসরন করা থেকে বিরত থাকুন",
"more": "আরো...",
"profile_update_success": "প্রোফাইল আপডেট সফল হয়েছে",
"change_picture": "ছবি পরিবর্তন",
"change_username": "ইউজারনেম পরিবর্তন করুন",
"change_email": "ইমেইল পরিবর্তন করুন",
"edit": "সম্পাদনা",
"default_picture": "ডিফল্ট আইকন",
"uploaded_picture": "ছবি আপলোড করুন",
"upload_new_picture": "নতুন ছবি আপলোড করুন",
"upload_new_picture_from_url": "URL থেকে নতুন ছবি আপলোড করুন",
"current_password": "বর্তমান পাসওয়ার্ড",
"change_password": "পাসওয়ার্ড পরিবর্তন",
"change_password_error": "অগ্রহনযোগ্য পাসওয়ার্ড",
"change_password_error_wrong_current": "আপনার পাসওয়ার্ড সঠিক নয়",
"change_password_error_length": "পাসওয়ার্ড অতিরিক্ত ছোট",
"change_password_error_match": "পাসওয়ার্ড অবশ্যই একই হতে হবে",
"change_password_error_privileges": "আপনার পাসওয়ার্ড পরিবর্তন করার অনুমতি নেই",
"change_password_success": "আপনার পাসওয়ার্ড আপডেট করা হয়েছে",
"confirm_password": "পাসওয়ার্ড নিশ্চিত করুন",
"password": "পাসওয়ার্ড",
"username_taken_workaround": "আপনি যে ইউজারনেম চাচ্ছিলেন সেটি ইতিমধ্যে নেয়া হয়ে গেছে, কাজেই আমরা এটি কিঞ্চিং পরিবর্তন করেছি। আপনি এখন <strong>%1</strong> হিসেবে পরিচিত",
"password_same_as_username": "Your password is the same as your username, please select another password.",
"password_same_as_email": "Your password is the same as your email, please select another password.",
"upload_picture": "ছবি আপলোড করুন",
"upload_a_picture": "ছবি (একটি) আপলোড করুন",
"remove_uploaded_picture": "আপলোড করা ছবিটি সরিয়ে নাও",
"upload_cover_picture": "Upload cover picture",
"settings": "সেটিংস",
"show_email": "আমার ইমেইল দেখাও",
"show_fullname": "আমার সম্পূর্ণ নাম দেখাও",
"restrict_chats": "আমি যাদের ফলো করি কেবলমাত্র তাদের থেকে বার্তা গ্রহন করা হোক",
"digest_label": "ডাইজেষ্টে সাবস্ক্রাইব করুন",
"digest_description": "শিডিউল অনূযায়ী এই ফোরামের ইমেইল আপডেটের জন্য সাবস্ক্রাইব করুন (নতুন নোটিফিকেশন এবং টপিকসমূহ )",
"digest_off": "বন্ধ",
"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_upvoted_posts": "This user hasn't upvoted any posts yet.",
"has_no_downvoted_posts": "This user hasn't downvoted any posts yet.",
"has_no_voted_posts": "This user has no voted posts",
"email_hidden": "ইমেইল গোপন রাখা হয়েছে",
"hidden": "গোপন করা হয়েছে",
"paginate_description": "ইনফাইনাইট স্ক্রলের বদলে টপিক ও পোস্টের জন্য পেজিনেশন ব্যাবহার করা হোক",
"topics_per_page": "প্রতি পেজে কতগুলো টপিক থাকবে",
"posts_per_page": "প্রতি পেইজে কতগুলো পোষ্ট থাকবে",
"notification_sounds": "নোটিফিকেশনের জন্য নোটিফিকেশন সাউন্ড এনাবল করুন",
"browsing": "Browsing সেটিংস",
"open_links_in_new_tab": "আউটগোয়িং লিংকগুলো নতুন ট্যাবে খুলুন",
"enable_topic_searching": "In-Topic সার্চ সক্রীয় করো",
"topic_search_help": "If enabled, in-topic searching will override the browser's default page search behaviour and allow you to search through the entire topic, instead of what is only shown on screen",
"follow_topics_you_reply_to": "Follow topics that you reply to",
"follow_topics_you_create": "Follow topics you create",
"grouptitle": "Select the group title you would like to display",
"no-group-title": "No group title",
"select-skin": "Select a Skin",
"select-homepage": "Select a Homepage",
"homepage": "Homepage",
"homepage_description": "Select a page to use as the forum homepage or 'None' to use the default homepage.",
"custom_route": "Custom Homepage Route",
"custom_route_help": "Enter a route name here, without any preceding slash (e.g. \"recent\", or \"popular\")",
"sso.title": "Single Sign-on Services",
"sso.associated": "Associated with",
"sso.not-associated": "Click here to associate with"
}

View File

@@ -1,20 +0,0 @@
{
"latest_users": "সর্বশেষ নিবন্ধিত সদস্যরা:",
"top_posters": "সর্বোচ্চ পোষ্টকারী",
"most_reputation": "সর্বোচ্চ সম্মাননাধারী",
"search": "খুঁজুন",
"enter_username": "ইউজারনেম এর ভিত্তিতে সার্চ করুন",
"load_more": "আরো লোড করুন",
"users-found-search-took": "%1 জন সদস্য(দের) খুঁজে পাওয়া গেছে। খুঁজতে সময় লেগেছে %2 সেকেন্ড ",
"filter-by": "ফিল্টার করার ধরন",
"online-only": "শুধুমাত্র অনলাইন",
"invite": "ইনভাইট",
"invitation-email-sent": "%1 কে একটি ইনভাইটেশন ইমেইল পাঠানো হয়েছে",
"user_list": "সদস্য তালিকা",
"recent_topics": "সাম্প্রতিক টপিক",
"popular_topics": "জনপ্রিয় টপিক",
"unread_topics": "অপঠিত টপিক",
"categories": "বিভাগ",
"tags": "ট্যাগসমূহ",
"no-users-found": "No users found!"
}

View File

@@ -1,16 +1,8 @@
{ {
"category": "Category",
"subcategories": "Subcategories",
"new_topic_button": "Nové téma", "new_topic_button": "Nové téma",
"guest-login-post": "Log in to post",
"no_topics": "<strong>V této kategorii zatím nejsou žádné příspěvky.</strong><br />Můžeš být první!", "no_topics": "<strong>V této kategorii zatím nejsou žádné příspěvky.</strong><br />Můžeš být první!",
"browsing": "prohlíží", "browsing": "prohlíží",
"no_replies": "Nikdo ještě neodpověděl", "no_replies": "Nikdo ještě neodpověděl",
"no_new_posts": "No new posts.",
"share_this_category": "Share this category", "share_this_category": "Share this category",
"watch": "Watch", "ignore": "Ignore"
"ignore": "Ignorovat",
"watch.message": "You are now watching updates from this category",
"ignore.message": "You are now ignoring updates from this category",
"watched-categories": "Watched categories"
} }

View File

@@ -1,35 +1,23 @@
{ {
"password-reset-requested": "Požadována obnova hesla - %1!", "password-reset-requested": "Password Reset Requested - %1!",
"welcome-to": "Vítejte v %1", "welcome-to": "Welcome to %1",
"invite": "Invitation from %1", "greeting_no_name": "Hello",
"greeting_no_name": "Dobrý den", "greeting_with_name": "Hello %1",
"greeting_with_name": "Dobrý den %1", "welcome.text1": "Thank you for registering with %1!",
"welcome.text1": "Děkujeme vám za registraci s %1!", "welcome.text2": "To fully activate your account, we need to verify that you own the email address you registered with.",
"welcome.text2": "Pro úplnou aktivaci vašeho účtu potřebujeme ověřit vaší emailovou adresu.", "welcome.cta": "Click here to confirm your email address",
"welcome.text3": "An administrator has accepted your registration application. You can login with your username/password now.", "reset.text1": "We received a request to reset your password, possibly because you have forgotten it. If this is not the case, please ignore this email.",
"welcome.cta": "Klikněte zde pro potvrzení vaší emailové adresy", "reset.text2": "To continue with the password reset, please click on the following link:",
"invitation.text1": "%1 has invited you to join %2", "reset.cta": "Click here to reset your password",
"invitation.ctr": "Click here to create your account.", "digest.notifications": "You have some unread notifications from %1:",
"reset.text1": "Obdrželi jsme požadavek na obnovu hesla, pravděpodobně kvůli tomu, že jste ho zapomněli. Pokud to není tento případ, ignorujte, prosím, tento email.", "digest.latest_topics": "Latest topics from %1",
"reset.text2": "Přejete-li si pokračovat v obnově vašeho hesla, klikněte, prosím, na následující odkaz:", "digest.cta": "Click here to visit %1",
"reset.cta": "Klikněte zde, chcete-li obnovit vaše heslo", "digest.unsub.info": "This digest was sent to you due to your subscription settings.",
"reset.notify.subject": "Password successfully changed", "digest.daily.no_topics": "There have been no active topics in the past day",
"reset.notify.text1": "We are notifying you that on %1, your password was changed successfully.", "notif.chat.subject": "New chat message received from %1",
"reset.notify.text2": "If you did not authorise this, please notify an administrator immediately.", "notif.chat.cta": "Click here to continue the conversation",
"digest.notifications": "Máte tu nepřečtená oznámení od %1:", "notif.chat.unsub.info": "This chat notification was sent to you due to your subscription settings.",
"digest.latest_topics": "Nejnovější témata od %1", "test.text1": "This is a test email to verify that the emailer is set up correctly for your NodeBB.",
"digest.cta": "Kliknutím zde navštívíte %1", "unsub.cta": "Click here to alter those settings",
"digest.unsub.info": "Tento výtah vám byl odeslán, protože jste si to nastavili ve vašich odběrech.", "closing": "Thanks!"
"digest.no_topics": "Dosud tu nebyly žádné aktivní témata %1",
"digest.day": "day",
"digest.week": "week",
"digest.month": "month",
"notif.chat.subject": "Nová zpráva z chatu od %1",
"notif.chat.cta": "Chcete-li pokračovat v konverzaci, klikněte zde.",
"notif.chat.unsub.info": "Toto oznámení z chatu vám bylo zasláno, protože jste si to nastavili ve vašich odběrech.",
"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.",
"test.text1": "Tento testovací email slouží k ověření, že mailer je správně nastaven. NodeBB.",
"unsub.cta": "Chcete-li změnit tyto nastavení, klikněte zde.",
"closing": "Díky!"
} }

View File

@@ -1,101 +1,64 @@
{ {
"invalid-data": "Neplatná data", "invalid-data": "Invalid Data",
"not-logged-in": "Zdá se, že nejste přihlášen(a)", "not-logged-in": "You don't seem to be logged in.",
"account-locked": "Váš účet byl dočasně uzamčen", "account-locked": "Your account has been locked temporarily",
"search-requires-login": "Searching requires an account - please login or register.", "search-requires-login": "Searching requires an account! Please login or register!",
"invalid-cid": "Neplatné ID kategorie", "invalid-cid": "Invalid Category ID",
"invalid-tid": "Neplatné ID tématu", "invalid-tid": "Invalid Topic ID",
"invalid-pid": "Neplatné ID příspěvku", "invalid-pid": "Invalid Post ID",
"invalid-uid": "Neplatné ID uživatele", "invalid-uid": "Invalid User ID",
"invalid-username": "Neplatné uživatelské jméno", "invalid-username": "Invalid Username",
"invalid-email": "Neplatný email", "invalid-email": "Invalid Email",
"invalid-title": "Neplatný titulek!", "invalid-title": "Invalid title!",
"invalid-user-data": "Neplatná uživatelská data", "invalid-user-data": "Invalid User Data",
"invalid-password": "Neplatné heslo", "invalid-password": "Invalid Password",
"invalid-username-or-password": "Stanovte, prosím, oboje, jak uživatelské jméno, tak heslo", "invalid-username-or-password": "Please specify both a username and password",
"invalid-search-term": "Neplatný výraz pro vyhledávání", "invalid-search-term": "Invalid search term",
"invalid-pagination-value": "Invalid pagination value, must be at least %1 and at most %2", "invalid-pagination-value": "Invalid pagination value",
"username-taken": "Uživatelské jméno je již použito", "username-taken": "Username taken",
"email-taken": "Email je již použit", "email-taken": "Email taken",
"email-not-confirmed": "Vaše emailová adresa zatím nebyla potvrzena. Kliknutím zde svůj email potvrdíte.", "email-not-confirmed": "Your email is not confirmed, please click here to confirm your email.",
"email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "username-too-short": "Username too short",
"no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", "username-too-long": "Username too long",
"email-confirm-failed": "We could not confirm your email, please try again later.", "user-banned": "User banned",
"confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", "user-too-new": "You need to wait %1 seconds before making your first post!",
"username-too-short": "Uživatelské jméno je příliš krátké", "no-category": "Category doesn't exist",
"username-too-long": "Uživatelské jméno je příliš dlouhé", "no-topic": "Topic doesn't exist",
"password-too-long": "Password too long", "no-post": "Post doesn't exist",
"user-banned": "Uživatel byl zakázán", "no-group": "Group doesn't exist",
"user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post", "no-user": "User doesn't exist",
"no-category": "Kategorie neexistuje", "no-teaser": "Teaser doesn't exist",
"no-topic": "Téma neexistuje", "no-privileges": "You don't have enough privileges for this action.",
"no-post": "Příspěvek neexistuje", "no-emailers-configured": "No email plugins were loaded, so a test email could not be sent",
"no-group": "Skupina neexistuje", "category-disabled": "Category disabled",
"no-user": "Uživatel neexistuje", "topic-locked": "Topic Locked",
"no-teaser": "Teaser does not exist", "still-uploading": "Please wait for uploads to complete.",
"no-privileges": "Na tuto akci nemáte dostatečná práva", "content-too-short": "Please enter a longer post. At least %1 characters.",
"category-disabled": "Kategorie zakázána", "title-too-short": "Please enter a longer title. At least %1 characters.",
"topic-locked": "Téma uzamčeno", "title-too-long": "Please enter a shorter title. Titles can't be longer than %1 characters.",
"post-edit-duration-expired": "You are only allowed to edit posts for %1 second(s) after posting", "too-many-posts": "You can only post every %1 seconds.",
"content-too-short": "Please enter a longer post. Posts should contain at least %1 character(s).", "file-too-big": "Maximum allowed file size is %1 kbs",
"content-too-long": "Please enter a shorter post. Posts can't be longer than %1 character(s).", "cant-vote-self-post": "You cannot vote for your own post",
"title-too-short": "Please enter a longer title. Titles should contain at least %1 character(s).", "already-favourited": "You already favourited this post",
"title-too-long": "Please enter a shorter title. Titles can't be longer than %1 character(s).", "already-unfavourited": "You already unfavourited this post",
"too-many-posts": "You can only post once every %1 second(s) - please wait before posting again", "cant-ban-other-admins": "You can't ban other admins!",
"too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again", "invalid-image-type": "Invalid image type",
"tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)", "group-name-too-short": "Group name too short",
"tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)", "group-already-exists": "Group already exists",
"not-enough-tags": "Not enough tags. Topics must have at least %1 tag(s)", "group-name-change-not-allowed": "Group name change not allowed",
"too-many-tags": "Too many tags. Topics can't have more than %1 tag(s)", "post-already-deleted": "Post already deleted",
"still-uploading": "Vyčkejte, prosím, nežli se vše kompletně nahraje.", "post-already-restored": "Post already restored",
"file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "topic-already-deleted": "Topic already deleted",
"guest-upload-disabled": "Guest uploading has been disabled", "topic-already-restored": "Topic already restored",
"already-favourited": "You have already bookmarked this post",
"already-unfavourited": "You have already unbookmarked this post",
"cant-ban-other-admins": "Nemůžete zakazovat ostatní administrátory!",
"cant-remove-last-admin": "You are the only administrator. Add another user as an administrator before removing yourself as admin",
"invalid-image-type": "Invalid image type. Allowed types are: %1",
"invalid-image-extension": "Invalid image extension",
"invalid-file-type": "Invalid file type. Allowed types are: %1",
"group-name-too-short": "Název skupiny je příliš krátký",
"group-already-exists": "Skupina už exstuje",
"group-name-change-not-allowed": "Změna názvu skupiny není povolena",
"group-already-member": "Already part of this group",
"group-not-member": "Not a member of this group",
"group-needs-owner": "This group requires at least one owner",
"group-already-invited": "This user has already been invited",
"group-already-requested": "Your membership request has already been submitted",
"post-already-deleted": "Tento příspěvek byl již vymazán",
"post-already-restored": "Tento příspěvek byl již obnoven",
"topic-already-deleted": "Toto téma bylo již vymazáno",
"topic-already-restored": "Toto téma bylo již obnoveno",
"cant-purge-main-post": "You can't purge the main post, please delete the topic instead",
"topic-thumbnails-are-disabled": "Topic thumbnails are disabled.", "topic-thumbnails-are-disabled": "Topic thumbnails are disabled.",
"invalid-file": "Neplatný soubor", "invalid-file": "Invalid File",
"uploads-are-disabled": "Nahrávání je zakázáno", "uploads-are-disabled": "Uploads are disabled",
"signature-too-long": "Sorry, your signature cannot be longer than %1 character(s).", "upload-error": "Upload Error : %1",
"about-me-too-long": "Sorry, your about me cannot be longer than %1 character(s).", "signature-too-long": "Signature can't be longer than %1 characters!",
"cant-chat-with-yourself": "Nemůžete chatovat sami se sebou!", "cant-chat-with-yourself": "You can't chat with yourself!",
"chat-restricted": "This user has restricted their chat messages. They must follow you before you can chat with them", "reputation-system-disabled": "Reputation system is disabled.",
"chat-disabled": "Chat system disabled",
"too-many-messages": "You have sent too many messages, please wait awhile.",
"invalid-chat-message": "Invalid chat message",
"chat-message-too-long": "Chat message is too long",
"cant-edit-chat-message": "You are not allowed to edit this message",
"cant-remove-last-user": "You can't remove the last user",
"cant-delete-chat-message": "You are not allowed to delete this message",
"reputation-system-disabled": "Systém reputací je zakázán.",
"downvoting-disabled": "Downvoting is disabled", "downvoting-disabled": "Downvoting is disabled",
"not-enough-reputation-to-downvote": "You do not have enough reputation to downvote this post", "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", "not-enough-reputation-to-flag": "Yo do not have enough reputation to flag this post",
"already-flagged": "You have already flagged this 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."
"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": "Chyba při registraci",
"parse-error": "Something went wrong while parsing server response",
"wrong-login-type-email": "Please use your email to login",
"wrong-login-type-username": "Please use your username to login",
"invite-maximum-met": "You have invited the maximum amount of people (%1 out of %2).",
"no-session-found": "No login session found!",
"not-in-room": "User not in room",
"no-users-in-room": "No users in this room"
} }

View File

@@ -3,92 +3,73 @@
"search": "Hledat", "search": "Hledat",
"buttons.close": "Zavřít", "buttons.close": "Zavřít",
"403.title": "Přístup odepřen", "403.title": "Přístup odepřen",
"403.message": "You seem to have stumbled upon a page that you do not have access to.", "403.message": "K této stránce nemáte přístup. Zkuste se <a href='/login'>přihlásit</a>?",
"403.login": "Perhaps you should <a href='%1/login'>try logging in</a>?",
"404.title": "Stránka nenalezena", "404.title": "Stránka nenalezena",
"404.message": "You seem to have stumbled upon a page that does not exist. Return to the <a href='%1/'>home page</a>.", "404.message": "Tato stránka bohužel neexistuje. Vraťte se na <a href='/'>domovskou stránku</a>.",
"500.title": "Neznámá chyba", "500.title": "Neznámá chyba",
"500.message": "Jejda, vypadá to, že se něco pokazilo.", "500.message": "Jejda, vypadá to, že se něco pokazilo.",
"register": "Registrovat", "register": "Registrovat",
"login": "Přihlásit se", "login": "Přihlásit se",
"please_log_in": "Přihlašte se, prosím", "please_log_in": "Please Log In",
"logout": "Odhlásit se", "logout": "Odhlásit se",
"posting_restriction_info": "V současné době je zasílání příspěvků povoleno pouze registrovaným členům, klikněte zde a přihlašte se.", "posting_restriction_info": "Posting is currently restricted to registered members only, click here to log in.",
"welcome_back": "Vítejte zpět", "welcome_back": "Welcome Back",
"you_have_successfully_logged_in": "Vaše přihlášení proběhlo úspěšně", "you_have_successfully_logged_in": "You have successfully logged in",
"save_changes": "Uložit změny", "save_changes": "Uložit změny",
"close": "Zrušit", "close": "Zrušit",
"pagination": "Stránkování", "pagination": "Pagination",
"pagination.out_of": "%1 z %2", "pagination.out_of": "%1 out of %2",
"pagination.enter_index": "Enter index", "pagination.enter_index": "Enter index",
"header.admin": "Administrace", "header.admin": "Administrace",
"header.categories": "Categories",
"header.recent": "Aktuality", "header.recent": "Aktuality",
"header.unread": "Nepřečtené", "header.unread": "Nepřečtené",
"header.tags": "Tagy", "header.tags": "Tags",
"header.popular": "Populární", "header.popular": "Populární",
"header.users": "Uživatelé", "header.users": "Uživatelé",
"header.groups": "Groups",
"header.chats": "Chats", "header.chats": "Chats",
"header.notifications": "Oznámení", "header.notifications": "Notifications",
"header.search": "Hledat", "header.search": "Hledat",
"header.profile": "Můj profil", "header.profile": "Můj profil",
"header.navigation": "Navigation",
"notifications.loading": "Načítání upozornění", "notifications.loading": "Načítání upozornění",
"chats.loading": "Načítání grafů", "chats.loading": "Načítání grafů",
"motd.welcome": "Vítejte na NodeBB, diskusní platforma buducnosti.", "motd.welcome": "Vítejte na NodeBB, diskusní platforma buducnosti.",
"previouspage": "Předchozí stránka", "previouspage": "Předchozí stránka",
"nextpage": "Další stránka", "nextpage": "Další stránka",
"alert.success": "Success", "alert.success": "Success",
"alert.error": "Chyba", "alert.error": "Error",
"alert.banned": "Banned", "alert.banned": "Banned",
"alert.banned.message": "You have just been banned, you will now be logged out.", "alert.banned.message": "You have just been banned, you will now be logged out.",
"alert.unfollow": "You are no longer following %1!", "alert.unfollow": "You are no longer following %1!",
"alert.follow": "You are now following %1!", "alert.follow": "You are now following %1!",
"online": "Online", "online": "Online",
"users": "Uživatelé", "users": "Users",
"topics": "Témata", "topics": "Topics",
"posts": "Příspěvky", "posts": "Příspěvky",
"best": "Best",
"upvoted": "Upvoted",
"downvoted": "Downvoted",
"views": "Zobrazení", "views": "Zobrazení",
"reputation": "Reputation", "reputation": "Reputation",
"read_more": "read more", "read_more": "read more",
"more": "More",
"posted_ago_by_guest": "posted %1 by Guest", "posted_ago_by_guest": "posted %1 by Guest",
"posted_ago_by": "posted %1 by %2", "posted_ago_by": "posted %1 by %2",
"posted_ago": "posted %1", "posted_ago": "posted %1",
"posted_in": "posted in %1", "posted_in_ago_by_guest": "posted in %1 %2 by Guest",
"posted_in_by": "posted in %1 by %2",
"posted_in_ago": "posted in %1 %2",
"posted_in_ago_by": "posted in %1 %2 by %3", "posted_in_ago_by": "posted in %1 %2 by %3",
"posted_in_ago": "posted in %1 %2",
"replied_ago": "replied %1",
"user_posted_ago": "%1 posted %2", "user_posted_ago": "%1 posted %2",
"guest_posted_ago": "Guest posted %1", "guest_posted_ago": "Guest posted %1",
"last_edited_by": "last edited by %1", "last_edited_by_ago": "last edited by %1 %2",
"norecentposts": "Žádné nedávné příspěvky", "norecentposts": "No Recent Posts",
"norecenttopics": "Žádné nedávné témata", "norecenttopics": "No Recent Topics",
"recentposts": "Nedávné příspěvky", "recentposts": "Nedávné příspěvky",
"recentips": "Recently Logged In IPs", "recentips": "Recently Logged In IPs",
"away": "Pryč", "away": "Pryč",
"dnd": "Do not disturb", "dnd": "Nerušit",
"invisible": "Neviditelný", "invisible": "Neviditelný",
"offline": "Offline", "offline": "Offline",
"email": "Email", "email": "Email",
"language": "Jazyk", "language": "Language",
"guest": "Host", "guest": "Guest",
"guests": "Hosté", "guests": "Guests",
"updated.title": "Fórum zaktualizováno", "updated.title": "Forum Updated",
"updated.message": "Toto fórum bylo právě aktualizováno na poslední verzi. Klikněte zde a obnovte tuto stránku.", "updated.message": "This forum has just been updated to the latest version. Click here to refresh the page."
"privacy": "Privacy",
"follow": "Follow",
"unfollow": "Unfollow",
"delete_all": "Vymazat vše",
"map": "Map",
"sessions": "Login Sessions",
"ip_address": "IP Address",
"enter_page_number": "Enter page number",
"upload_file": "Upload file",
"upload": "Upload",
"allowed-file-types": "Allowed file types are %1"
} }

View File

@@ -1,53 +1,7 @@
{ {
"groups": "Skupiny", "view_group": "View Group",
"view_group": "Prohlédnout skupinu", "details.title": "Group Details",
"owner": "Group Owner", "details.members": "Member List",
"new_group": "Create New Group", "details.has_no_posts": "This group's members have not made any posts.",
"no_groups_found": "There are no groups to see", "details.latest_posts": "Latest Posts"
"pending.accept": "Accept",
"pending.reject": "Reject",
"pending.accept_all": "Accept All",
"pending.reject_all": "Reject All",
"pending.none": "There are no pending members at this time",
"invited.none": "There are no invited members at this time",
"invited.uninvite": "Rescind Invitation",
"invited.search": "Search for a user to invite to this group",
"invited.notification_title": "You have been invited to join <strong>%1</strong>",
"request.notification_title": "Group Membership Request from <strong>%1</strong>",
"request.notification_text": "<strong>%1</strong> has requested to become a member of <strong>%2</strong>",
"cover-save": "Save",
"cover-saving": "Saving",
"details.title": "podrobnosti skupiny",
"details.members": "Seznam členů",
"details.pending": "Pending Members",
"details.invited": "Invited Members",
"details.has_no_posts": "Členové této skupiny dosud neodeslali ani jeden příspěvek.",
"details.latest_posts": "Nejnovější příspěvky",
"details.private": "Private",
"details.disableJoinRequests": "Disable join requests",
"details.grant": "Grant/Rescind Ownership",
"details.kick": "Kick",
"details.owner_options": "Group Administration",
"details.group_name": "Group Name",
"details.member_count": "Member Count",
"details.creation_date": "Creation Date",
"details.description": "Description",
"details.badge_preview": "Badge Preview",
"details.change_icon": "Change Icon",
"details.change_colour": "Change Colour",
"details.badge_text": "Badge Text",
"details.userTitleEnabled": "Show Badge",
"details.private_help": "If enabled, joining of groups requires approval from a group owner",
"details.hidden": "Hidden",
"details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
"details.delete_group": "Delete Group",
"event.updated": "Group details have been updated",
"event.deleted": "The group \"%1\" has been deleted",
"membership.accept-invitation": "Accept Invitation",
"membership.invitation-pending": "Invitation Pending",
"membership.join-group": "Join Group",
"membership.leave-group": "Leave Group",
"membership.reject": "Reject",
"new-group.group_name": "Group Name:",
"upload-group-cover": "Upload group cover"
} }

View File

@@ -1,11 +1,9 @@
{ {
"username-email": "Username / Email", "username": "Username / Email",
"username": "Username",
"email": "Email",
"remember_me": "Zapamatovat si mě?", "remember_me": "Zapamatovat si mě?",
"forgot_password": "Zapomněli jste heslo?", "forgot_password": "Zapomněli jste heslo?",
"alternative_logins": "Další způsoby přihlášení", "alternative_logins": "Další způsoby přihlášení",
"failed_login_attempt": "Přihlášení se nezdařilo, zkuste to prosím znovu.", "failed_login_attempt": "Přihlášení se nezdařilo, zkuste to prosím znovu.",
"login_successful": "Přihlášení proběhlo úspěšně!", "login_successful": "Přihlášení proběhlo úspěšně!",
"dont_have_account": "Nemáte účet?" "dont_have_account": "Don't have an account?"
} }

View File

@@ -1,37 +1,22 @@
{ {
"chat.chatting_with": "Chat s <span id=\"chat-with-name\"></span>", "chat.chatting_with": "Chat s <span id=\"chat-with-name\"></span>",
"chat.placeholder": "Zprávu do chatu napište zde, pro odeslání stiskněte enter", "chat.placeholder": "Type chat message here, press enter to send",
"chat.send": "Odeslat", "chat.send": "Odeslat",
"chat.no_active": "Nemáte žádné aktivní konverzace.", "chat.no_active": "Nemáte žádné aktivní konverzace.",
"chat.user_typing": "%1 píše ...", "chat.user_typing": "%1 is typing ...",
"chat.user_has_messaged_you": "%1 has messaged you.", "chat.user_has_messaged_you": "%1 has messaged you.",
"chat.see_all": "See all chats", "chat.see_all": "See all Chats",
"chat.no-messages": "Please select a recipient to view chat message history", "chat.no-messages": "Please select a recipient to view chat message history",
"chat.no-users-in-room": "No users in this room",
"chat.recent-chats": "Recent Chats", "chat.recent-chats": "Recent Chats",
"chat.contacts": "Kontakty", "chat.contacts": "Contacts",
"chat.message-history": "Historie zpráv", "chat.message-history": "Message History",
"chat.pop-out": "Pop out chat", "chat.pop-out": "Pop out chat",
"chat.maximize": "Maximalizovat", "chat.maximize": "Maximize",
"chat.seven_days": "7 dní", "chat.yesterday": "Yesterday",
"chat.thirty_days": "30 dní", "chat.seven_days": "7 Days",
"chat.three_months": "3 měsíce", "chat.thirty_days": "30 Days",
"chat.delete_message_confirm": "Are you sure you wish to delete this message?", "chat.three_months": "3 Months",
"chat.roomname": "Chat Room %1",
"chat.add-users-to-room": "Add users to room",
"composer.compose": "Compose",
"composer.show_preview": "Show Preview",
"composer.hide_preview": "Hide Preview",
"composer.user_said_in": "%1 said in %2:", "composer.user_said_in": "%1 said in %2:",
"composer.user_said": "%1 said:", "composer.user_said": "%1 said:",
"composer.discard": "Are you sure you wish to discard this post?", "composer.discard": "Are you sure you wish to discard this post?"
"composer.submit_and_lock": "Submit and Lock",
"composer.toggle_dropdown": "Toggle Dropdown",
"composer.uploading": "Uploading %1",
"bootbox.ok": "OK",
"bootbox.cancel": "Cancel",
"bootbox.confirm": "Confirm",
"cover.dragging_title": "Cover Photo Positioning",
"cover.dragging_message": "Drag the cover photo to the desired position and click \"Save\"",
"cover.saved": "Cover photo image and position saved"
} }

View File

@@ -1,38 +1,26 @@
{ {
"title": "Upozornění", "title": "Upozornění",
"no_notifs": "You have no new notifications", "no_notifs": "You have no new notifications",
"see_all": "See all notifications", "see_all": "See all Notifications",
"mark_all_read": "Mark all notifications read",
"back_to_home": "Back to %1", "back_to_home": "Back to %1",
"outgoing_link": "Odkaz mimo fórum", "outgoing_link": "Odkaz mimo fórum",
"outgoing_link_message": "You are now leaving %1", "outgoing_link_message": "You are now leaving %1.",
"continue_to": "Continue to %1", "continue_to": "Continue to %1",
"return_to": "Return to %1", "return_to": "Return to %1",
"new_notification": "New Notification", "new_notification": "New Notification",
"you_have_unread_notifications": "You have unread notifications.", "you_have_unread_notifications": "You have unread notifications.",
"new_message_from": "New message from <strong>%1</strong>", "new_message_from": "New message from <strong>%1</strong>",
"upvoted_your_post_in": "<strong>%1</strong> has upvoted your post in <strong>%2</strong>.", "upvoted_your_post_in": "<strong>%1</strong> has upvoted your post in <strong>%2</strong>.",
"upvoted_your_post_in_dual": "<strong>%1</strong> and <strong>%2</strong> have upvoted your post in <strong>%3</strong>.", "moved_your_post": "<strong>%1</strong> has moved your post.",
"upvoted_your_post_in_multiple": "<strong>%1</strong> and %2 others have upvoted your post in <strong>%3</strong>.", "moved_your_topic": "<strong>%1</strong> has moved your topic.",
"moved_your_post": "<strong>%1</strong> has moved your post to <strong>%2</strong>", "favourited_your_post_in": "<strong>%1</strong> has favourited your post in <strong>%2</strong>.",
"moved_your_topic": "<strong>%1</strong> has moved <strong>%2</strong>",
"favourited_your_post_in": "<strong>%1</strong> has bookmarked your post in <strong>%2</strong>.",
"favourited_your_post_in_dual": "<strong>%1</strong> and <strong>%2</strong> have bookmarked your post in <strong>%3</strong>.",
"favourited_your_post_in_multiple": "<strong>%1</strong> and %2 others have bookmarked your post in <strong>%3</strong>.",
"user_flagged_post_in": "<strong>%1</strong> flagged a post in <strong>%2</strong>", "user_flagged_post_in": "<strong>%1</strong> flagged a post in <strong>%2</strong>",
"user_flagged_post_in_dual": "<strong>%1</strong> and <strong>%2</strong> flagged a post in <strong>%3</strong>",
"user_flagged_post_in_multiple": "<strong>%1</strong> and %2 others flagged a post in <strong>%3</strong>",
"user_posted_to": "<strong>%1</strong> has posted a reply to: <strong>%2</strong>", "user_posted_to": "<strong>%1</strong> has posted a reply to: <strong>%2</strong>",
"user_posted_to_dual": "<strong>%1</strong> and <strong>%2</strong> have posted replies to: <strong>%3</strong>", "user_mentioned_you_in": "<strong>%1</strong> mentioned you in <strong>%2</strong>",
"user_posted_to_multiple": "<strong>%1</strong> and %2 others have posted replies to: <strong>%3</strong>",
"user_posted_topic": "<strong>%1</strong> has posted a new topic: <strong>%2</strong>",
"user_started_following_you": "<strong>%1</strong> started following you.", "user_started_following_you": "<strong>%1</strong> started following you.",
"user_started_following_you_dual": "<strong>%1</strong> and <strong>%2</strong> started following you.",
"user_started_following_you_multiple": "<strong>%1</strong> and %2 others started following you.",
"new_register": "<strong>%1</strong> sent a registration request.",
"new_register_multiple": "There are <strong>%1</strong> registration requests awaiting review.",
"email-confirmed": "Email Confirmed", "email-confirmed": "Email Confirmed",
"email-confirmed-message": "Thank you for validating your email. Your account is now fully activated.", "email-confirmed-message": "Thank you for validating your email. Your account is now fully activated.",
"email-confirm-error": "An error occurred...",
"email-confirm-error-message": "There was a problem validating your email address. Perhaps the code was invalid or has expired.", "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."
} }

View File

@@ -1,46 +1,18 @@
{ {
"home": "Home", "home": "Home",
"unread": "Unread Topics", "unread": "Unread Topics",
"popular-day": "Popular topics today", "popular": "Popular Topics",
"popular-week": "Popular topics this week",
"popular-month": "Popular topics this month",
"popular-alltime": "All time popular topics",
"recent": "Recent Topics", "recent": "Recent Topics",
"flagged-posts": "Flagged Posts", "users": "Registered Users",
"users/online": "Online Users",
"users/latest": "Latest Users",
"users/sort-posts": "Users with the most posts",
"users/sort-reputation": "Users with the most reputation",
"users/banned": "Banned Users",
"users/search": "User Search",
"notifications": "Notifications", "notifications": "Notifications",
"tags": "Tags", "tags": "Topics tagged under \"%1\"",
"tag": "Topics tagged under \"%1\"", "user.edit": "Editing \"%1\"",
"register": "Register an account", "user.following": "People %1 Follows",
"login": "Login to your account", "user.followers": "People who Follow %1",
"reset": "Reset your account password", "user.posts": "Posts made by %1",
"categories": "Categories", "user.topics": "Topics created by %1",
"groups": "Groups", "user.favourites": "%1's Favourite Posts",
"group": "%1 group", "user.settings": "User Settings",
"chats": "Chats",
"chat": "Chatting with %1",
"account/edit": "Editing \"%1\"",
"account/edit/password": "Editing password of \"%1\"",
"account/edit/username": "Editing username of \"%1\"",
"account/edit/email": "Editing email of \"%1\"",
"account/following": "People %1 follows",
"account/followers": "People who follow %1",
"account/posts": "Posts made by %1",
"account/topics": "Topics created by %1",
"account/groups": "%1's Groups",
"account/favourites": "%1's Bookmarked Posts",
"account/settings": "User Settings",
"account/watched": "Topics watched by %1",
"account/upvoted": "Posts upvoted by %1",
"account/downvoted": "Posts downvoted by %1",
"account/best": "Best posts made by %1",
"confirm": "Email Confirmed",
"maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.",
"maintenance.messageIntro": "Additionally, the administrator has left this message:", "maintenance.messageIntro": "Additionally, the administator has left this message:"
"throttled.text": "%1 is currently unavailable due to excessive load. Please come back another time."
} }

View File

@@ -5,15 +5,5 @@
"month": "Měsíc", "month": "Měsíc",
"year": "Year", "year": "Year",
"alltime": "All Time", "alltime": "All Time",
"no_recent_topics": "There are no recent topics.", "no_recent_topics": "There are no recent topics."
"no_popular_topics": "There are no popular topics.",
"there-is-a-new-topic": "There is a new topic.",
"there-is-a-new-topic-and-a-new-post": "There is a new topic and a new post.",
"there-is-a-new-topic-and-new-posts": "There is a new topic and %1 new posts.",
"there-are-new-topics": "There are %1 new topics.",
"there-are-new-topics-and-a-new-post": "There are %1 new topics and a new post.",
"there-are-new-topics-and-new-posts": "There are %1 new topics and %2 new posts.",
"there-is-a-new-post": "There is a new post.",
"there-are-new-posts": "There are %1 new posts.",
"click-here-to-reload": "Click here to reload."
} }

View File

@@ -14,6 +14,5 @@
"register_now_button": "Zaregistrovat se", "register_now_button": "Zaregistrovat se",
"alternative_registration": "Jiný způsob registrace", "alternative_registration": "Jiný způsob registrace",
"terms_of_use": "Podmínky", "terms_of_use": "Podmínky",
"agree_to_terms_of_use": "Souhlasím s Podmínkami", "agree_to_terms_of_use": "Souhlasím s Podmínkami"
"registration-added-to-queue": "Your registration has been added to the approval queue. You will receive an email when it is accepted by an administrator."
} }

View File

@@ -8,10 +8,7 @@
"new_password": "Nové heslo", "new_password": "Nové heslo",
"repeat_password": "Potvrzení hesla", "repeat_password": "Potvrzení hesla",
"enter_email": "Zadejte svou <strong>emailovou adresu</strong> a my Vám pošleme informace, jak můžete obnovit své heslo.", "enter_email": "Zadejte svou <strong>emailovou adresu</strong> a my Vám pošleme informace, jak můžete obnovit své heslo.",
"enter_email_address": "Zadejte emailovou adresu", "enter_email_address": "Enter Email Address",
"password_reset_sent": "Obnova hesla odeslána", "password_reset_sent": "Obnova hesla odeslána",
"invalid_email": "Špatný email / Email neexistuje!", "invalid_email": "Špatný email / Email neexistuje!"
"password_too_short": "The password entered is too short, please pick a different password.",
"passwords_do_not_match": "The two passwords you've entered do not match.",
"password_expired": "Your password has expired, please choose a new password"
} }

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