Compare commits

..

456 Commits

Author SHA1 Message Date
NodeBB Misty
fb2f857af2 Incremented version number - v1.4.6 2017-04-19 19:06:05 +00:00
NodeBB Misty
7181bb4e1a Merge commit 'de81a340ec374d7103287b446ce3081bb3a020cc' into v1.x.x 2017-04-19 19:06:05 +00:00
Julian Lam
de81a340ec Revert "Incremented version number - v1.4.6"
This reverts commit 73d934f5ae.
2017-04-19 13:32:37 -04:00
NodeBB Misty
73d934f5ae Incremented version number - v1.4.6 2017-04-18 17:46:39 -04:00
barisusakli
9e3d8a8090 one more fix #5607 2017-04-18 13:55:18 -04:00
barisusakli
27a76fcfc9 closes #5607 2017-04-18 13:53:43 -04:00
barisusakli
b33d25b0b8 use name 2017-04-18 13:33:32 -04:00
barisusakli
bda3c2863b closes #5605 2017-04-18 13:32:47 -04:00
Julian Lam
c14160a85b Merge pull request #5603 from NodeBB/sounds-fix
Fix sounds playing through multiple tabs
2017-04-17 18:02:22 -04:00
Peter Jaszkowiak
2827db3309 Fix sounds playing through multiple tabs 2017-04-17 15:56:24 -06:00
barisusakli
20eac0de94 closes #5518 2017-04-17 12:23:05 -04:00
Misty (Bot)
6d7c70c911 Latest translations and fallbacks 2017-04-17 09:22:05 +00:00
barisusakli
fdee61b4f4 use deleteMany instead 2017-04-16 15:42:28 -04:00
barisusakli
cf6c4667c8 upgrade script to clear sessions 2017-04-16 15:31:50 -04:00
barisusakli
65a65b19c0 tests for #5600 2017-04-16 14:46:02 -04:00
barisusakli
185b6e5c8e #5600 2017-04-16 14:31:49 -04:00
barisusakli
9f8d80e3a4 closes #5600 2017-04-16 14:22:40 -04:00
Julian Lam
678db343b4 Merge pull request #5597 from NodeBB/chherypick-fixes
Cherrypick fixes from #5591
2017-04-15 18:27:12 -04:00
Peter Jaszkowiak
37c4218184 Fix error if ./nodebb build isn't called before tests 2017-04-15 16:10:43 -06:00
Peter Jaszkowiak
6e5a79842f Fix #5595 2017-04-15 16:10:42 -06:00
Peter Jaszkowiak
baa2a59f4c Fix ace editor not working 2017-04-15 16:10:28 -06:00
Julian Lam
98047be9ce Merge pull request #5596 from NodeBB/translator-fix
Centrally escape translator tokens in every topic title
2017-04-15 17:18:27 -04:00
Peter Jaszkowiak
e382bca610 Fix tests 2017-04-15 04:22:28 -06:00
Misty (Bot)
0e615e7b09 Latest translations and fallbacks 2017-04-15 09:22:15 +00:00
Peter Jaszkowiak
0fe10f5e86 Escape topic titles at the source, deduplicate 2017-04-15 01:38:42 -06:00
Peter Jaszkowiak
ecfca21abe Up composer 2017-04-15 00:50:12 -06:00
psychobunny
9670d7d762 up persona 2017-04-14 20:03:39 -04:00
psychobunny
2319af2904 up persona 2017-04-14 19:58:24 -04:00
Misty (Bot)
c2ba1c270f Latest translations and fallbacks 2017-04-14 09:22:18 +00:00
psychobunny
1179dd9503 up composer, closes #5586 2017-04-13 15:32:38 -04:00
psychobunny
b1ee7cc5b4 up persona 2017-04-13 15:18:11 -04:00
Peter Jaszkowiak
1fb48ef7a7 Fix #5592 (#5593)
* Fix #5592
Escape translation tokens in topic titles, descriptions, profile about, and post contents

* Fix tests
2017-04-13 21:37:54 +03:00
Julian Lam
c3febca9c8 Merge pull request #5577 from NodeBB/patch-pitaj
Use npm instead of vendor files
2017-04-12 23:43:50 -04:00
Peter Jaszkowiak
a8add6477c Fix merge conflicts 2017-04-12 21:29:54 -06:00
Julian Lam
a62a4e698f Merge pull request #5578 from NodeBB/utils-translator-require
Make utils and translator easier to require
2017-04-12 23:16:59 -04:00
Julian Lam
a117b559b8 Merge pull request #5590 from NodeBB/translator-fix
Fix #5588, translator ignores unclosed tokens
2017-04-12 22:48:36 -04:00
Peter Jaszkowiak
980e9026f3 Fix #5588, translator ignores unclosed tokens 2017-04-12 20:34:31 -06:00
Julian Lam
e9fb42eb03 Merge pull request #5589 from NodeBB/fix-require.main.require
Fix using `./nodebb` in other CWDs
2017-04-12 17:32:43 -04:00
Peter Jaszkowiak
f16a40d29e Add nodebb file to linter 2017-04-12 15:29:01 -06:00
Peter Jaszkowiak
75d291183d Fix using nodebb in other CWDs 2017-04-12 15:22:58 -06:00
Peter Jaszkowiak
9368e666d8 Fix failing test 2017-04-11 21:53:17 -06:00
Misty (Bot)
73b6b06294 Latest translations and fallbacks 2017-04-11 09:22:21 +00:00
Misty (Bot)
08f001063c Latest translations and fallbacks 2017-04-10 09:22:23 +00:00
Peter Jaszkowiak
010473e5cc Merge branch 'master' into patch-pitaj 2017-04-09 23:09:52 -06:00
Peter Jaszkowiak
dc4f2be156 Remove ace global for eslint 2017-04-09 21:47:05 -06:00
Julian Lam
126237e2c9 Merge pull request #5576 from pichalite/zxcvbn
Closes #5521
2017-04-09 16:52:52 -04:00
Peter Jaszkowiak
1892492505 Deprecate utils.walk, remove prototype modification 2017-04-08 21:02:06 -06:00
Peter Jaszkowiak
1ed571189c Make utils and translator easier to require
Move utils.walk to file.walk, backwards compatible
2017-04-08 20:27:52 -06:00
Peter Jaszkowiak
b53d3254dd buzz is no longer used 2017-04-08 19:05:10 -06:00
Peter Jaszkowiak
2c418fd2af Use npm bootstrap 2017-04-08 19:05:10 -06:00
Peter Jaszkowiak
0ef30e91ba Use ace-builds npm package instead of vendor
ace can be referenced as an r.js module, reduces acp bundle size
2017-04-08 19:05:10 -06:00
Peter Jaszkowiak
17ff8a4151 Enable passing paths as module sources 2017-04-08 19:05:10 -06:00
Misty (Bot)
12a426b7b9 Latest translations and fallbacks 2017-04-08 09:22:22 +00:00
pichalite
d4de345e87 syntax 2017-04-07 21:39:22 +00:00
pichalite
4c89497cc4 Closes #5521 2017-04-07 20:57:00 +00:00
Anil Mandepudi
da183e196a Fixes #5572 (#5575)
* Fixes #5572

* Adding trailing commas but in protest
2017-04-07 14:35:24 -04:00
Julian Lam
0fac75c055 Merge pull request #5573 from NodeBB/patch-pitaj
Fix #5563
2017-04-07 14:15:22 -04:00
Misty (Bot)
07b9bb6fb8 Latest translations and fallbacks 2017-04-07 09:22:36 +00:00
psychobunny
5985a8a7a3 closes #5574 2017-04-06 18:06:10 -04:00
Barış Soner Uşaklı
43f8678c7a update local config immediately 2017-04-06 17:59:46 -04:00
Barış Soner Uşaklı
8afdd71ef1 closes #5559 2017-04-06 17:44:25 -04:00
Peter Jaszkowiak
1deeaaeb39 Fix #5563 2017-04-06 15:20:07 -06:00
Misty (Bot)
bb0ec540bd Latest translations and fallbacks 2017-04-04 09:22:34 +00:00
Julian Lam
60990f28ad Merge pull request #5568 from NodeBB/patch-pitaj
`filter:teasers.get` provided with `uid`
2017-04-03 16:59:18 -04:00
Peter Jaszkowiak
8119b8c4ae filter:teasers.get provided with uid 2017-04-03 14:40:03 -07:00
André Zanghelini
03d432182b Fix postcount is expected to be Number (#5567) 2017-04-03 12:45:43 -04:00
psychobunny
53dac97800 closes #5560 2017-04-03 12:42:36 -04:00
Barış Soner Uşaklı
d88219b4d1 closes #5566 2017-04-03 06:35:20 -04:00
Misty (Bot)
0bea922a12 Latest translations and fallbacks 2017-04-03 09:22:20 +00:00
Misty (Bot)
60d35fdf05 Latest translations and fallbacks 2017-04-02 09:22:17 +00:00
Misty (Bot)
2feb19aa2d Latest translations and fallbacks 2017-04-01 09:22:12 +00:00
Julian Lam
b287c75e3c Merge pull request #5562 from NodeBB/patch-pitaj
Fix #5561
2017-03-31 16:47:06 -04:00
Peter Jaszkowiak
81696dd24a Fxi #5561 2017-03-31 14:45:03 -06:00
Julian Lam
8a8bd23de9 Merge pull request #5558 from NodeBB/patch-5538
Partial fix #5538
2017-03-30 08:56:14 -04:00
Peter Jaszkowiak
57696b22f4 Partial fix #5538 2017-03-30 03:17:45 -06:00
Julian Lam
a450cb869d up themes 2017-03-29 15:26:18 -04:00
Misty (Bot)
e9794224a8 Latest translations and fallbacks 2017-03-29 09:24:44 +00:00
Julian Lam
5fbbe898d0 fixes #5538 2017-03-28 12:17:20 -04:00
Julian Lam
1594a84e1c fixes #5536 2017-03-28 12:13:44 -04:00
Julian Lam
a63459dc98 Merge branch 'master' of github.com:NodeBB/NodeBB 2017-03-28 12:13:30 -04:00
Misty (Bot)
8d4a32dc27 Latest translations and fallbacks 2017-03-28 09:24:51 +00:00
Julian Lam
15506c30a4 updates es search translation 2017-03-27 14:38:13 -04:00
husseinwalli
3876a88252 Added additional parameters to user creation method (#5496)
Treating picture, location and birthday similar to data.email as optional parameters to be passed to the create a user
2017-03-27 14:05:06 -04:00
Peter Jaszkowiak
ff09d6e0dd Fix #5549, improve tpl compilation (#5551) 2017-03-27 13:53:26 -04:00
Misty (Bot)
c1c96668af Latest translations and fallbacks 2017-03-27 09:24:50 +00:00
Barış Soner Uşaklı
6b0a907ede closes #5552 2017-03-26 15:12:28 +03:00
Misty (Bot)
2a2ed96a07 Latest translations and fallbacks 2017-03-26 09:24:22 +00:00
Julian Lam
42dc496572 Merge pull request #5550 from NodeBB/patch_5543
Remove duplicate slugify
2017-03-25 16:29:14 -04:00
Misty (Bot)
114f87e78c Latest translations and fallbacks 2017-03-25 09:22:16 +00:00
Peter Jaszkowiak
14ed0be4f7 Remove duplicate slugify 2017-03-24 14:43:58 -06:00
Julian Lam
a1f87a5d7f added tests for #5545 2017-03-24 15:52:33 -04:00
Julian Lam
a49e647de3 fixes #5545 again 2017-03-24 14:46:51 -04:00
Julian Lam
31b6d47f88 fixes #5545 2017-03-24 14:36:54 -04:00
Julian Lam
c84e54c6c6 Merge pull request #5544 from NodeBB/patch_5543
Fix #5543
2017-03-24 13:32:32 -04:00
Peter Jaszkowiak
a7677063de Rename to uniqueUsername 2017-03-24 10:33:38 -06:00
Peter Jaszkowiak
642306e69c Fix #5543 2017-03-24 10:28:18 -06:00
Misty (Bot)
3319a72679 Latest translations and fallbacks 2017-03-24 09:22:18 +00:00
Julian Lam
6060b8e13b fix tests 2017-03-23 14:39:46 -04:00
Aziz Khoury
6682e048ea wrapImagesInLinks with <a download> attribute
if the `src` of the `img` does not have an extension, most browsers will trigger a download with whatever filename is set, also without an extension, so when it's opened in any OS, it wont have a default application to open it with.

So, In this case, if the `alt` attribute has an extension (meaning if it looks like filename) - we use that with the html5 [`download` attr](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#attr-download)

The PR does not affect any src if they have an extension.
2017-03-22 12:19:31 +02:00
Julian Lam
b6134b160e moved auto_reconnect out of socketOptions object for Mongo 2017-03-21 15:55:24 -04:00
Julian Lam
db84296373 Merge pull request #5539 from NodeBB/julianlam-patch-1
Up MongoDB dependency to v2.2.25
2017-03-21 14:22:17 -04:00
Julian Lam
9714e3c26b Up MongoDB dependency to v2.2.25
This is a PR to see if tests go 💥
2017-03-21 14:01:41 -04:00
Ben Lubar
7f713ee822 Admin option to allow all users to view votes (#5534)
* Admin option to allow all users to view votes

* Fix </strong></strong>
2017-03-17 14:08:47 -04:00
Misty (Bot)
da1858f674 Incremented version number 2017-03-16 14:58:24 -04:00
Misty (Bot)
d19e59f1e1 Incremented version number 2017-03-16 18:57:33 +00:00
Misty (Bot)
f5e8a40d79 Merge commit '449352d8996b4c98be67052fbb5b68fdc65cd0f2' into v1.x.x 2017-03-16 18:57:33 +00:00
barisusakli
449352d899 wait for all routes to load before listening 2017-03-16 11:24:36 +03:00
Julian Lam
2ef71e22aa Merge pull request #5532 from NodeBB/patch_5491
Fix tests for #5491 fix
2017-03-15 23:11:09 -04:00
Peter Jaszkowiak
8f8babf90b Fix tests 2017-03-15 20:09:07 -07:00
Julian Lam
23d4497c73 Merge pull request #5531 from NodeBB/patch_5491
Fix #5491
2017-03-15 23:01:42 -04:00
Peter Jaszkowiak
8c45411ccc Fix #5491 2017-03-15 20:00:05 -07:00
Julian Lam
33bf930bb9 fixes #5528 2017-03-15 13:49:35 -04:00
barisusakli
8d7283e6c7 dont minify if file ends with .min.js #5529 2017-03-15 20:33:33 +03:00
barisusakli
ff4c7ab3bb fix tests 2017-03-15 12:49:08 +03:00
barisusakli
6a4b082080 closes #5524 2017-03-15 12:19:09 +03:00
Julian Lam
6d444ccacf Merge pull request #5526 from NodeBB/patch_5346
Fix #5346
2017-03-14 09:52:42 -04:00
Misty (Bot)
2106050bdc Latest translations and fallbacks 2017-03-14 09:22:41 +00:00
Peter Jaszkowiak
c199075d98 Fix #5346 2017-03-13 20:20:41 -07:00
psychobunny
8a6665a26c up lav, closes #5525 2017-03-13 16:54:28 -04:00
psychobunny
4a33f45b1e use writeFileSync for synchronous fs write operations - nodejs 7.x 2017-03-13 13:57:35 -04:00
Barış Soner Uşaklı
0396e9300b Merge pull request #5500 from RoiEXLab/fix-admin-search
Fix admin Search
2017-03-13 09:58:30 +02:00
barisusakli
90b8a3afd0 refactor topics/delete.js 2017-03-12 21:38:53 +03:00
Misty (Bot)
9f1a2b0cc9 Latest translations and fallbacks 2017-03-12 09:22:16 +00:00
barisusakli
0478e9c98c lint 2017-03-11 19:37:34 +03:00
barisusakli
37be43a3c5 async 2017-03-11 18:32:00 +03:00
barisusakli
27b030a71c test for #5523 2017-03-11 16:43:31 +03:00
Misty (Bot)
3e93975595 Latest translations and fallbacks 2017-03-11 09:22:17 +00:00
psychobunny
9dc54f801e up persona 2017-03-10 14:55:52 -05:00
psychobunny
286d0ab203 prevent tagsinput initialization from flagging as unsaved 2017-03-10 14:40:10 -05:00
psychobunny
5ca9e5e14c ACP: distinguish <small> from regular text 2017-03-10 14:36:35 -05:00
psychobunny
62f445ad7f ACP: added tagsinput to other fields that are "comma separated" 2017-03-10 14:36:35 -05:00
barisusakli
bb146e049c fix lint 2017-03-10 22:36:09 +03:00
psychobunny
debe34b96c better styling for tagsinput in ACP and added it to general -> keywords 2017-03-10 14:25:37 -05:00
barisusakli
3b41c40b93 refactor deleter code to use unixtimestamp 2017-03-10 22:22:08 +03:00
psychobunny
447b7b02ca use tagsinput for #5439 instead 2017-03-10 14:12:17 -05:00
psychobunny
f2eb4b8083 closes #5439 2017-03-10 14:03:07 -05:00
psychobunny
5aa45e9181 up persona 2017-03-10 13:37:02 -05:00
psychobunny
b3f8428691 closes #5510 2017-03-10 13:36:24 -05:00
Misty (Bot)
dc4d394cd5 Latest translations and fallbacks 2017-03-10 09:22:19 +00:00
barisusakli
5e0de4b8fb closes #5517 2017-03-10 12:22:10 +03:00
psychobunny
8da8e4d8c3 closes #5469 2017-03-09 16:50:26 -05:00
psychobunny
fd8e647ef5 closes #5506 2017-03-09 16:47:07 -05:00
barisusakli
0c7dee05ef fix lint 2017-03-10 00:38:34 +03:00
barisusakli
92fa9fecb6 add mongodb connection options #3670
increase reconnect tries
add keepAlive setting
set autoReconnect to true, should be on by default
2017-03-10 00:31:50 +03:00
barisusakli
0c8058ba9d closes #5516 2017-03-09 22:36:28 +03:00
Julian Lam
4713e0d81a Merge pull request #5514 from manolino/v1.x.x
apple-touch-icon for Web App on IOS
2017-03-09 14:22:40 -05:00
barisusakli
1c1d97dd54 up spam be gone 2017-03-09 21:32:43 +03:00
barisusakli
74d2835a1f escape body class parts 2017-03-09 20:18:42 +03:00
barisusakli
3d719eec99 enable sigs after test 2017-03-09 20:18:30 +03:00
barisusakli
8d493bf3b0 post parse test 2017-03-09 19:52:48 +03:00
barisusakli
c619b850ce fix tests 2017-03-09 17:28:19 +03:00
barisusakli
57691d9ad8 test for system group rename 2017-03-09 17:18:30 +03:00
manolino
562b088423 apple-touch-icon for Web App on IOS
route apple-touch-icon not serving touchicon-orig.png. I made needed
correction to file path.
Now works with new /assets and strategy.
2017-03-08 16:32:50 -06:00
psychobunny
9f2e5e9c4b closes #4685 2017-03-08 11:31:58 -05:00
Julian Lam
364b819a42 moving sanity checks above contentLen calculation 2017-03-08 09:41:32 -05:00
Julian Lam
fdb4766728 wow. 2017-03-08 09:32:55 -05:00
Julian Lam
5359a14bac better handling of redactor post length calculation on post edit 2017-03-08 09:19:45 -05:00
Misty (Bot)
92ad6bb4e8 Latest translations and fallbacks 2017-03-08 09:22:29 +00:00
Julian Lam
1102ca8ebb fix issue where an auto-redirect to SSO on login route was failing if invoked via API call (ajaxify) 2017-03-07 14:35:38 -05:00
barisusakli
8a123f7c1c closes #5509 2017-03-07 16:13:09 +03:00
barisusakli
b7e6104bbc closes #5511 2017-03-07 15:59:50 +03:00
barisusakli
69c6ee5834 closes #5483 2017-03-07 13:38:31 +03:00
barisusakli
992e3128bd closes #5499 2017-03-07 13:09:19 +03:00
Julian Lam
f732d6c1b9 Merge pull request #5501 from RoiEXLab/add-osd-functionality
Add OpenSearchDocument XML (#5399)
2017-03-06 15:10:10 -05:00
RoiEX
33e474759b Change var names 2017-03-06 21:00:20 +01:00
RoiEX
6420e22453 Remove uneccessary curly brackets 2017-03-06 20:43:06 +01:00
RoiEX
fcda832052 Add spaces 2017-03-06 20:39:26 +01:00
RoiEX
0f9530bbc0 Shrink JSON fix 2017-03-06 20:24:00 +01:00
RoiEX
f1b4a9b786 Shrink JSON 2017-03-06 20:23:34 +01:00
RoiEX
186c1f40e9 Refactor Code 2017-03-06 20:07:06 +01:00
RoiEX
710377ceea Remove space 2017-03-06 19:51:53 +01:00
RoiEX
603d45fbfa Changed Serving Method 2017-03-06 19:47:03 +01:00
Julian Lam
13edde2b30 Merge pull request #5505 from AccaliaDeElementia/fix-avatar-cropper
fix: auto cropper on image upload selects maximum image area by default
2017-03-06 12:19:54 -05:00
Julian Lam
8226fd6566 enhancing™️ post reply length checker to account for line breaks in redactor 2017-03-06 09:40:19 -05:00
Accalia de Elementia
743a7e00b4 fix: auto cropper on image upload selects maximum image area by default 2017-03-06 13:14:15 +00:00
barisusakli
f6721c249f up composer 2017-03-06 14:37:46 +03:00
barisusakli
531df7bd09 closes #5504 2017-03-06 13:54:43 +03:00
RoiEX
4082ca40c1 Add last comma 2017-03-05 15:20:35 +01:00
RoiEX
0710c6488d Fix trailing commas 2017-03-05 15:15:41 +01:00
RoiEX
eca150f392 Fix Tests 2017-03-05 15:10:35 +01:00
RoiEX
431f5e1f0f Add missing dependency
This deoendency is required by rss, but travis doesn't seem to notice that
2017-03-05 14:56:50 +01:00
RoiEX
f761191fca Add OSD 2017-03-05 14:45:30 +01:00
RoiEX
c517733e34 Fix admin Search 2017-03-05 11:38:40 +01:00
barisusakli
e85e35cf0c closes #5497 2017-03-05 00:46:18 +03:00
Misty (Bot)
99dff11462 Latest translations and fallbacks 2017-03-04 09:22:16 +00:00
barisusakli
ab9f4ad636 test bookmark tru socket.io 2017-03-03 21:49:14 +03:00
barisusakli
324e5be7bd privileges tests 2017-03-03 21:04:01 +03:00
barisusakli
a3b4c83e8b remove description from categories
it gets added in src/meta/tags
2017-03-03 19:59:37 +03:00
barisusakli
ea871384d8 remove fallbacks 2017-03-03 16:45:18 +03:00
barisusakli
3b8d14bf12 closes #5493 2017-03-03 16:15:01 +03:00
barisusakli
54c951cc81 fix tests 2017-03-02 22:12:56 +03:00
barisusakli
4369a6d290 more user tests 2017-03-02 21:58:33 +03:00
barisusakli
bce1208e2f make uploadFile public 2017-03-02 20:51:03 +03:00
barisusakli
63b3c29a1a test invalid data 2017-03-02 19:21:56 +03:00
barisusakli
cd448f90cd more topic tests 2017-03-02 19:03:49 +03:00
barisusakli
202bafa3e3 add images to bundle 2017-03-02 18:21:01 +03:00
barisusakli
5ca8456340 move image code to client/topic/images 2017-03-02 18:11:31 +03:00
barisusakli
d60930a51d test latest member posts 2017-03-02 17:59:45 +03:00
barisusakli
b060bda8a0 some more refactors 2017-03-02 17:25:32 +03:00
barisusakli
65cf7a01ec test for recent posts, fix redirect test 2017-03-02 16:29:17 +03:00
barisusakli
b1b87d339f more refactors 2017-03-02 16:11:11 +03:00
barisusakli
bc8d297377 move out error and 404 controllers 2017-03-02 14:57:33 +03:00
barisusakli
284485c885 check data.config 2017-03-02 10:51:05 +03:00
barisusakli
2188036148 controllers/users refactor 2017-03-02 00:14:30 +03:00
barisusakli
566ff95d3c call methods directly 2017-03-01 23:22:17 +03:00
barisusakli
3e396a8553 sitemap refactor 2017-03-01 23:19:34 +03:00
barisusakli
1bee91fa22 groups refactor 2017-03-01 22:42:16 +03:00
psychobunny
2ccf60a6ec fixed duplicate uninstall button 2017-03-01 13:49:55 -05:00
Julian Lam
b85dcb2570 lint 2017-03-01 11:28:07 -05:00
Julian Lam
5411b4c234 Merge pull request #5464 from NodeBB/assets-images-upgrade
Upgrade script for prepending `/assets` in config URLs
2017-03-01 10:54:33 -05:00
Barış Soner Uşaklı
fecdbc969f fix set call 2017-03-01 17:47:59 +02:00
Barış Soner Uşaklı
c5f40e3cf5 fix indents 2017-03-01 17:42:50 +02:00
Barış Soner Uşaklı
6222b55dd8 Merge branch 'master' into assets-images-upgrade 2017-03-01 17:40:44 +02:00
barisusakli
ac84e447dc closes #5492 2017-03-01 17:37:17 +03:00
Peter Jaszkowiak
b96b983552 Upgrade script for prepending /assets in config
Fix for sound settings upgrade script to upgrade user sound settings even if admin settings weren't set
2017-02-28 13:57:24 -07:00
barisusakli
2e47cf4db3 intersititial test 2017-02-28 16:42:10 +03:00
barisusakli
8a0cf6c0ac more admin socket tests 2017-02-28 15:16:49 +03:00
barisusakli
bb1045c5a0 remove unused require 2017-02-28 12:29:49 +03:00
barisusakli
ef93ef3dd4 if user does not have settings object skip 2017-02-28 12:23:42 +03:00
barisusakli
feb359f7d4 closes #5479 2017-02-27 20:16:44 +03:00
Julian Lam
8166f30b90 abort sound upgrade if no sounds set in config 2017-02-27 12:15:38 -05:00
Julian Lam
039f80c5aa added null check for #5482 2017-02-27 10:16:16 -05:00
Julian Lam
4d8bebcd81 Merge pull request #5482 from NodeBB/sounds-fix-5476
Upgrade script for new sounds system
2017-02-27 10:02:23 -05:00
Peter Jaszkowiak
da3cb0492c Verbose instead 2017-02-26 14:08:27 -07:00
Misty (Bot)
2bbf3c4f66 Latest translations and fallbacks 2017-02-26 09:22:49 +00:00
Peter Jaszkowiak
20d250bceb Upgrade script for new sounds system 2017-02-25 23:07:43 -07:00
Julian Lam
0213ca4bb1 Merge pull request #5477 from NodeBB/sounds-fix-5476
Fix sounds issue
2017-02-25 22:08:31 -05:00
Peter Jaszkowiak
007051c14c Fix #5476 2017-02-25 19:51:49 -07:00
barisusakli
0e7740af32 fix tests for subfolder installs 2017-02-25 16:04:04 +03:00
barisusakli
347761173a helpers tests 2017-02-25 15:10:23 +03:00
Misty (Bot)
a22909dbe8 Latest translations and fallbacks 2017-02-25 09:22:36 +00:00
barisusakli
6aa8c8aa94 merge 2017-02-25 11:17:56 +03:00
barisusakli
fa08498a9e closes #5480 2017-02-25 11:01:35 +03:00
psychobunny
2a311d2ff6 printing initialization message twice for some reason 2017-02-24 16:37:30 -05:00
psychobunny
09a1ed0869 Merge pull request #5371 from kingjan1999/master
Update FontAwesome to 4.7.0
2017-02-24 16:33:38 -05:00
Misty (Bot)
00a67b97ce Incremented version number 2017-02-24 13:47:46 -05:00
Julian Lam
995f8296a4 linting 2017-02-24 12:03:47 -05:00
Julian Lam
b5f8fc815e re-allowing pluplus in for loops 2017-02-24 11:53:00 -05:00
Julian Lam
e71bd7a27f Merge branch 'master' into styleguide 2017-02-24 11:45:04 -05:00
Misty (Bot)
92691782e6 Incremented version number 2017-02-24 15:45:36 +00:00
Misty (Bot)
fe582d8a7b Merge commit '048eb8a320a217c5e692c598c86a7661bd5eb2c5' into v1.x.x 2017-02-24 15:45:36 +00:00
barisusakli
048eb8a320 some helper tests 2017-02-24 18:06:23 +03:00
barisusakli
04b07e292c thumb tests 2017-02-24 17:34:34 +03:00
barisusakli
ca1fe557c7 topic controller tests 2017-02-24 16:26:19 +03:00
barisusakli
3a87f2566a more group tests 2017-02-24 15:05:00 +03:00
barisusakli
b7d5bc7dc8 more group tests 2017-02-24 12:54:16 +03:00
Misty (Bot)
3509e12748 Latest translations and fallbacks 2017-02-24 09:22:21 +00:00
Peter Jaszkowiak
f7a964474d Ignore log files 2017-02-23 20:00:30 -07:00
Peter Jaszkowiak
dd2b930824 Resolve merge conflicts, minify only .js files 2017-02-23 18:31:49 -07:00
Peter Jaszkowiak
ee9d7584e4 Fix test, misc 2017-02-23 17:29:08 -07:00
Julian Lam
cfc8884c9c Merge pull request #5475 from NodeBB/favicon-fix
Fixes #5474
2017-02-23 17:11:11 -05:00
Peter Jaszkowiak
8b533bb431 Fixes #5474 2017-02-23 14:19:11 -07:00
Julian Lam
4163ce0218 Merge pull request #5473 from pichalite/acp-tags
ACP manage tags page UI changes
2017-02-23 15:49:32 -05:00
pichalite
1d5b3cc73f ACP manage tags page UI changes 2017-02-23 20:45:05 +00:00
Barış Soner Uşaklı
35ff71c37d more tests 2017-02-23 23:06:00 +03:00
Julian Lam
14398a2d90 up markdown 2017-02-23 14:55:14 -05:00
Barış Soner Uşaklı
b4a32ee96f style changes 2017-02-23 22:42:45 +03:00
Barış Soner Uşaklı
743f758f75 set origin header to url 2017-02-23 21:29:28 +03:00
Julian Lam
25f6293821 using io.origins instead 2017-02-23 13:26:52 -05:00
Julian Lam
91d3ce1abc Revert "adding origin to new local ioConfig var, as per @barisusakli, re: #5472"
This reverts commit c1b1ff5c6e.
2017-02-23 13:26:52 -05:00
Barış Soner Uşaklı
c168ed43d4 up build timeout 2017-02-23 21:25:50 +03:00
psychobunny
7b7565ee8e Merge pull request #5468 from pichalite/acp-groups
ACP manage groups UI updates
2017-02-23 13:22:57 -05:00
Julian Lam
c1b1ff5c6e adding origin to new local ioConfig var, as per @barisusakli, re: #5472 2017-02-23 12:47:06 -05:00
Barış Soner Uşaklı
9079ee5b14 style 2017-02-23 20:44:23 +03:00
psychobunny
458cbfd603 show dashboard notice if forum is running in dev mode 2017-02-23 12:14:20 -05:00
psychobunny
a2847dc851 Merge branch 'master' of https://github.com/NodeBB/NodeBB 2017-02-23 12:01:25 -05:00
Julian Lam
d4c2fc3bc8 closes #5472 2017-02-23 11:54:51 -05:00
psychobunny
ebe5ed7560 Merge pull request #5470 from pichalite/acp-templates
Fix ACP templates markup
2017-02-23 11:46:02 -05:00
barisusakli
0de21cb3ff fix tab 2017-02-23 17:12:46 +03:00
barisusakli
09d0ce4778 post tests 2017-02-23 17:02:54 +03:00
barisusakli
4cd4414d19 small change 2017-02-23 15:29:35 +03:00
Barış Soner Uşaklı
026c32f32b Merge pull request #5462 from NodeBB/minify-modules
Minify all module scripts in production
2017-02-23 13:15:05 +02:00
Misty (Bot)
02cc988ae7 Latest translations and fallbacks 2017-02-23 09:22:14 +00:00
pichalite
aea40902b0 Fix markup in category privileges template 2017-02-23 00:28:54 +00:00
pichalite
f09f1f6ed8 Fix ACP templates markup 2017-02-23 00:20:42 +00:00
pichalite
dcb0f18422 ACP manage groups UI updates 2017-02-22 20:28:56 +00:00
Julian Lam
e887dda37a Merge pull request #5461 from pichalite/image-dimension
Use ACP profile image dimension setting in cropper
2017-02-22 14:53:40 -05:00
barisusakli
2dac3d2292 closes #5465, blacklist tests 2017-02-22 14:53:44 +03:00
barisusakli
5c01c7b1c7 delayed notification test 2017-02-22 13:35:05 +03:00
Julian Lam
e427f1663e Merge pull request #5456 from NodeBB/sounds-refactor
Sound system improvements
2017-02-21 16:14:58 -05:00
Barış Soner Uşaklı
89380824f8 navigation test 2017-02-21 17:00:54 +03:00
barisusakli
f2a795a9b7 fix tests 2017-02-21 15:18:01 +03:00
barisusakli
799f688503 closes #5463 , invitation tests 2017-02-21 15:08:17 +03:00
Misty (Bot)
4b21679d6f Latest translations and fallbacks 2017-02-21 09:24:38 +00:00
barisusakli
4ee7edad64 test uploadProfileImageFromUrl 2017-02-20 21:58:35 +03:00
barisusakli
ef90702049 closes #5459 2017-02-20 21:28:02 +03:00
Misty (Bot)
7d8477289d Latest translations and fallbacks 2017-02-20 09:22:34 +00:00
Peter Jaszkowiak
beb652ee43 Move minifier.js to src/meta 2017-02-20 00:44:04 -07:00
Peter Jaszkowiak
3e562ceb83 Update CONTRIBUTING.md 2017-02-19 16:37:00 -07:00
psychobunny
aaec279d75 Merge branch 'master' of https://github.com/NodeBB/NodeBB 2017-02-19 11:07:39 -05:00
Anil Mandepudi
f302c0d739 Update gruntfile to build on initialization (#5458)
* Update gruntfile to build on initialization

* Skip option skips build
2017-02-19 11:01:38 -05:00
psychobunny
631592b818 Merge branch 'master' of https://github.com/NodeBB/NodeBB 2017-02-19 11:00:14 -05:00
Misty (Bot)
2e27ce640c Latest translations and fallbacks 2017-02-19 09:25:24 +00:00
Peter Jaszkowiak
9b1068e868 Minify all module scripts in production 2017-02-19 02:07:19 -07:00
pichalite
fd0f0beaf2 lint 2017-02-19 08:54:46 +00:00
pichalite
a99572fc48 Use ACP profile image dimension setting in cropper 2017-02-19 08:30:30 +00:00
Peter Jaszkowiak
23540afaeb Resolve merge conflicts 2017-02-18 19:14:39 -07:00
Peter Jaszkowiak
b227297ef3 ESlint no-use-before-define 2017-02-18 18:55:33 -07:00
Peter Jaszkowiak
93f38d4f30 ESlint no-multi-assign
and max-nested-callbacks, no-mixed-requires, max-statements-per-line
2017-02-18 18:06:28 -07:00
Barış Soner Uşaklı
1b43faba1a closes #5441 2017-02-19 02:44:38 +03:00
Peter Jaszkowiak
4bb49a7171 ESlint no-unused-vars 2017-02-18 15:05:36 -07:00
Peter Jaszkowiak
c18808fdeb ESlint no-useless-concat, no-mixed-spaces-and-tabs 2017-02-18 14:42:15 -07:00
Peter Jaszkowiak
fdf4f873bf ESlint eqeqeq
and require-jsdoc, no-negated-condition
2017-02-18 14:36:16 -07:00
Peter Jaszkowiak
144fa8698c Eslint no-lonely-if 2017-02-18 14:32:35 -07:00
Peter Jaszkowiak
57f89663aa ESlint radix 2017-02-18 14:29:52 -07:00
Peter Jaszkowiak
09e868ce5f ESlint no-useless-escape, no-else-return 2017-02-18 14:27:26 -07:00
Peter Jaszkowiak
11cb3a9554 ESlint operator-assignment, block-scoped-var 2017-02-18 14:20:58 -07:00
Peter Jaszkowiak
a0a50677da ESlint n-loop-func, yoda 2017-02-18 14:00:29 -07:00
Peter Jaszkowiak
04bb6513b0 ESlint no-cond-assign, no-void, valid-jsdoc 2017-02-18 13:51:26 -07:00
Peter Jaszkowiak
5a45087fc8 ESlint no-unreachable, no-redeclare 2017-02-18 13:31:19 -07:00
Peter Jaszkowiak
32dc7c23ea ESlint guard-for-in, no-nested-ternary
and operator-linebreak
2017-02-18 13:28:03 -07:00
Peter Jaszkowiak
c4bdb72941 ESlint no-unneeded-ternary
and no-extend-native, no-sequences
2017-02-18 12:59:46 -07:00
Peter Jaszkowiak
64a6322002 ESlint no-extra-boolean-cast
and no-shadow-restricted-names
2017-02-18 12:51:13 -07:00
Peter Jaszkowiak
239d7f84dd ESlint no-path-concat 2017-02-18 12:47:58 -07:00
Peter Jaszkowiak
daa169c094 ESlint no-unused-expressions 2017-02-18 12:40:57 -07:00
Peter Jaszkowiak
ac2f69f7af ESlint no-return-assign
and no-restricted-modules
2017-02-18 12:35:49 -07:00
Peter Jaszkowiak
896c8c7343 ESlint object-curly-spacing 2017-02-18 12:30:49 -07:00
barisusakli
7842c3411c remove logs 2017-02-18 20:52:45 +03:00
barisusakli
b33d34f7cf refactor user/picture.js 2017-02-18 20:27:58 +03:00
Barış Soner Uşaklı
23ed1af282 Merge pull request #5457 from pichalite/image-extension
Add extensions for cropped images
2017-02-18 15:06:45 +02:00
Peter Jaszkowiak
1493afee2a ESlint indent 2017-02-18 02:38:03 -07:00
Peter Jaszkowiak
3b0dd2d1ef ESlint padded-blocks 2017-02-18 02:32:24 -07:00
Peter Jaszkowiak
feb8405f95 ESlint eol-last 2017-02-18 02:30:48 -07:00
Peter Jaszkowiak
41896e1fc7 ESlint lines-around-directive 2017-02-18 02:28:54 -07:00
Peter Jaszkowiak
f3a8256f35 ESlint strict 2017-02-18 02:23:47 -07:00
Peter Jaszkowiak
a038c66549 ESlint quotes 2017-02-18 01:56:23 -07:00
Peter Jaszkowiak
604358ecc4 ESlint keyword-spacing, no-multi-spaces 2017-02-18 01:52:56 -07:00
Peter Jaszkowiak
a5a3f3089a ESlint no-mixed-operators 2017-02-18 01:51:11 -07:00
Peter Jaszkowiak
2e031f3759 ESlint comma-spacing 2017-02-18 01:31:47 -07:00
Peter Jaszkowiak
277a7fb8b4 ESlint key-spacing, no-trailing-spaces 2017-02-18 01:27:46 -07:00
Peter Jaszkowiak
34e233fe1d ESlint spaced-comment 2017-02-18 01:25:46 -07:00
Peter Jaszkowiak
532951c24f ESlint space-in-parens, block-spacing 2017-02-18 01:21:34 -07:00
Peter Jaszkowiak
b1b486f729 ESlint quote-props 2017-02-18 01:19:20 -07:00
Peter Jaszkowiak
3361a72725 ESlint no-plusplus
and no-empty, space-unary-ops
2017-02-18 01:12:18 -07:00
Peter Jaszkowiak
d1101a7fb4 ESlint dot-notation
and func-call-spacing
2017-02-18 00:21:44 -07:00
Peter Jaszkowiak
d7526b5e44 ESlint array-bracket-spacing
and object-property-newline
2017-02-18 00:04:34 -07:00
Peter Jaszkowiak
554075b312 ESlint no-continue 2017-02-17 22:31:05 -07:00
Peter Jaszkowiak
d9c1f6f088 ESlint no-extra-semi 2017-02-17 22:20:45 -07:00
Peter Jaszkowiak
1cf25f57fc ESlint no-space-func 2017-02-17 22:17:10 -07:00
Peter Jaszkowiak
3d6bfa47c5 ESlint no-useless-return 2017-02-17 22:13:41 -07:00
Peter Jaszkowiak
879470f417 ESlint brace-style 2017-02-17 22:11:35 -07:00
Peter Jaszkowiak
52f2028206 ESlint no-multiple-empty-lines 2017-02-17 22:08:23 -07:00
Peter Jaszkowiak
b09b3aef7f ESlint no-undef, remove global comments 2017-02-17 22:03:55 -07:00
Peter Jaszkowiak
2ba46808a1 ESlint one-var, fix comma-dangle 2017-02-17 20:20:42 -07:00
Peter Jaszkowiak
bc1d70c126 ESlint comma-dangle 2017-02-17 19:31:21 -07:00
pichalite
bb3c8b910a Skip option skips build 2017-02-17 23:33:37 +00:00
pichalite
5ca931a52c Update gruntfile to build on initialization 2017-02-17 22:07:50 +00:00
pichalite
aacd8a2422 Fix return and tests 2017-02-17 20:36:13 +00:00
pichalite
7f4e4c8e2e Fix styling 2017-02-17 20:02:26 +00:00
pichalite
4d755bad0c Use typeToExtension from file.js 2017-02-17 19:57:18 +00:00
pichalite
8dab8864f6 Add extensions for cropped images 2017-02-17 19:42:02 +00:00
barisusakli
aa64ec7db1 remove unnecessary code 2017-02-17 22:33:41 +03:00
Peter Jaszkowiak
9f15008247 Address review issues 2017-02-17 11:19:30 -07:00
Julian Lam
a379b03e71 lint 2017-02-17 09:10:53 -05:00
Julian Lam
5ee2aa8adb Merge pull request #5453 from NodeBB/patch_5369
Fix #5368
2017-02-17 08:48:57 -05:00
Julian Lam
802878c371 Merge pull request #5455 from pichalite/cropper
Make cropper in to a module
2017-02-17 08:48:21 -05:00
barisusakli
e009ce5609 closes #5443 2017-02-17 16:46:30 +03:00
barisusakli
a427bba9cb up persona 2017-02-17 14:48:09 +03:00
barisusakli
4d05e492cc closes #5312 2017-02-17 14:45:45 +03:00
Misty (Bot)
461ad301a1 Latest translations and fallbacks 2017-02-17 09:22:25 +00:00
Peter Jaszkowiak
c75391f9f5 Sound system improvements
- Fix sound ACP uploads
- Display soundpack names with sound files
- Soundpacks can have sounds with identical names
- Link sounds during build step
- Generate map of sound name to file name during build step
- Change how soundpacks work. It's now done via a field in plugin.json
2017-02-16 22:58:15 -07:00
pichalite
2ca8f60e77 Finalize cropper module 2017-02-17 05:32:37 +00:00
pichalite
d784a8dce8 Restore uploader.js 2017-02-17 04:26:34 +00:00
pichalite
43f4d9819e Linting 2017-02-17 00:54:53 +00:00
pichalite
484891472e Make cropper in to a module 2017-02-17 00:48:38 +00:00
Peter Jaszkowiak
3d56dc4857 Fix #5368 2017-02-16 13:33:28 -07:00
barisusakli
fd88e9fdff up composer 2017-02-16 22:07:20 +03:00
barisusakli
9b3741bc63 up composer 2017-02-16 15:35:19 +03:00
barisusakli
dad5b135c3 lint 2017-02-16 15:11:31 +03:00
barisusakli
c285eb7fcd closes #5450 2017-02-16 15:01:11 +03:00
Misty (Bot)
2c428cdec1 Latest translations and fallbacks 2017-02-16 09:22:12 +00:00
Julian Lam
8bf719b258 Merge pull request #5431 from NodeBB/ajaxify-cache-buster
Ajaxify improvements, `/assets/uploads/` fixes, cache buster improvements
2017-02-15 13:49:47 -05:00
Julian Lam
9e23d09e5e removing outdated logic to call process.exit on reset completion as all invocations use callbacks now. Allowing invocation of reset -p and -t without nodebb-plugin- or nodebb-theme- prefix 2017-02-15 09:47:38 -05:00
Anil Mandepudi
c25836b5fc Option to upload without cropping (#5447)
* Option to upload without cropping

* Fix styling

* Fix styling

* Add missing semi-colon

* I fail at styling :fail:
2017-02-14 16:31:51 -05:00
barisusakli
867fd99fb6 closes #4625 2017-02-14 20:56:24 +03:00
barisusakli
4d8d23830d utils tests 2017-02-14 15:47:36 +03:00
barisusakli
4bbf517af3 rewards test 2017-02-14 15:04:48 +03:00
barisusakli
9f67142786 closes #5440 2017-02-14 14:16:31 +03:00
Julian Lam
1e33a659ef up persona 2017-02-13 15:42:09 -05:00
barisusakli
30f35c42f6 fix eslint 2017-02-13 22:42:47 +03:00
barisusakli
a3cbe5e090 #5436 2017-02-13 22:24:26 +03:00
Misty (Bot)
31ac72375f Latest translations and fallbacks 2017-02-13 09:22:08 +00:00
barisusakli
21eefb9760 closes #5436 2017-02-12 20:36:12 +03:00
barisusakli
8b006fb1ab closes #5434 2017-02-12 20:11:49 +03:00
Misty (Bot)
3dc2a91990 Latest translations and fallbacks 2017-02-12 09:22:10 +00:00
Julian Lam
5d4a0d7f05 Merge pull request #5426 from mortiy/ukrainian
Added Ukrainian language to Transifex config
2017-02-11 14:41:39 -05:00
Misty (Bot)
c4a2babbf7 Latest translations and fallbacks 2017-02-11 09:21:46 +00:00
Peter Jaszkowiak
b553236620 Better defaults if cache buster read fails 2017-02-10 21:18:09 -07:00
Julian Lam
21bc1fba3f Merge pull request #5429 from BenLubar/redis-drops-socket-messages
Fix forum instances using Redis dropping socket.io messages.
2017-02-10 16:21:38 -05:00
Julian Lam
6289f118ae updated cron strings with 5-digit strings instead of 6-digit ones 2017-02-10 15:52:05 -05:00
Ben Lubar
9fb16e3520 Fix forum instances using Redis dropping socket.io messages.
Bug introduced in b08acd197c.

https://github.com/socketio/socket.io-redis/releases/tag/3.0.0
https://github.com/socketio/socket.io-redis/issues/185
2017-02-10 14:28:53 -06:00
Julian Lam
6b2e40a8ce promoting digest output to info, instead of verbose 2017-02-10 12:54:17 -05:00
Oleksandr Sidko
97c6da7d3f Added Ukrainian language to Transifex config 2017-02-10 16:05:52 +02:00
barisusakli
f4a6527ce6 getRecentPosterUids test 2017-02-10 15:26:24 +03:00
Misty (Bot)
503378e259 Latest translations and fallbacks 2017-02-10 09:21:57 +00:00
Peter Jaszkowiak
8f27d7810b Ajaxify improvement, /assets/uploads 2017-02-09 15:50:05 -07:00
Julian Lam
7ba111acdd Merge pull request #5420 from NodeBB/assets-route
/assets/uploads
2017-02-09 16:08:12 -05:00
Julian Lam
a8fd1440d4 fixed incorrect language key in ip blacklist page 2017-02-09 14:42:21 -05:00
Barış Soner Uşaklı
a3e327301b update regex 2017-02-09 20:21:35 +02:00
Julian Lam
d61665c20a updated copy for no-routes-not-found 2017-02-09 12:52:25 -05:00
Barış Soner Uşaklı
4f5b9f3a42 Merge pull request #5425 from pichalite/issue-5415
Fix scrolling issues on mobile
2017-02-09 19:51:41 +02:00
pichalite
cc160d77e7 Fix scrolling issues on mobile 2017-02-09 17:33:31 +00:00
barisusakli
667582744e fix eslint 2017-02-09 13:22:03 +03:00
barisusakli
ab7867d4b5 topic follow tests, fix filterIgnoring 2017-02-09 13:15:43 +03:00
Misty (Bot)
0409109faa Latest translations and fallbacks 2017-02-09 09:21:45 +00:00
Peter Jaszkowiak
0fffde67b5 Undeprecate /uploads 2017-02-08 14:24:09 -07:00
Peter Jaszkowiak
aaacdb8413 Fix #5416, uploads path config setting
- Finish moving uploads route to `/assets/uploads`
- Remove `upload_url` config setting, it was broken
2017-02-08 11:41:34 -07:00
Julian Lam
a48c914a16 explicitly cast jobsDisabled as Boolean 2017-02-08 11:23:27 -05:00
Julian Lam
ce2bda0648 utilising async series if OS reports that system only contains one CPU processor 2017-02-08 10:42:55 -05:00
Julian Lam
d5a45832c3 up composer 2017-02-08 10:26:05 -05:00
Misty (Bot)
d966b52dc7 Latest translations and fallbacks 2017-02-08 09:21:49 +00:00
Julian Lam
23d92c214d up persona, vanilla, and markdown 2017-02-07 16:28:25 -05:00
Julian Lam
107abe3197 Merge pull request #5382 from pitaj/assets-route
Move client-side assets to the `/assets` route
2017-02-07 16:02:56 -05:00
Julian Lam
a122aad54d updating fallbacks 2017-02-07 20:54:03 +00:00
Peter Jaszkowiak
b530701cff Fix tabs 😡 2017-02-06 15:54:21 -07:00
Peter Jaszkowiak
bb1bfb0449 Merge branch 'master' into assets-route 2017-02-06 15:52:54 -07:00
psychobunny
df1a1811f2 add horizontal rule on top of image crop tools 2017-02-06 16:18:36 -05:00
psychobunny
034f3f0268 Merge pull request #5417 from pichalite/cropper-options
Add image options to cropper modal
2017-02-06 16:17:49 -05:00
pichalite
2c5f8ed8e6 Add image options to cropper modal 2017-02-06 21:00:21 +00:00
psychobunny
dbc3113940 Merge pull request #5412 from pichalite/cropperjs
Ability to crop profile images before uploading
2017-02-06 14:33:49 -05:00
pichalite
b757f563df Move tpl and less to core 2017-02-06 19:11:58 +00:00
barisusakli
959315c8f7 test admin/search 2017-02-06 13:43:51 +03:00
Misty (Bot)
f046ea012d Latest translations and fallbacks 2017-02-06 09:21:40 +00:00
Misty (Bot)
b9ae02583e Latest translations and fallbacks 2017-02-05 09:21:54 +00:00
Misty (Bot)
5ea5d11646 Latest translations and fallbacks 2017-02-04 09:21:31 +00:00
Peter Jaszkowiak
d43564dbbd No need to build multiple times 2017-02-03 23:55:33 -07:00
Peter Jaszkowiak
fdad66f58e Revert "Fix tests to use default activated plugin"
This reverts commit 44a59ac435.
2017-02-03 23:48:43 -07:00
Peter Jaszkowiak
d31499a860 Fix tests rewriting logo.png 2017-02-03 18:29:09 -07:00
Peter Jaszkowiak
44a59ac435 Fix tests to use default activated plugin 2017-02-03 16:37:03 -07:00
Julian Lam
9ceeff6f0a Merge pull request #5414 from pichalite/fix-acp
Fix ACP layout on tablets
2017-02-03 17:57:46 -05:00
pichalite
a3df9132f7 Fix styling 2017-02-03 22:19:19 +00:00
pichalite
a41acead44 Fix tabs 2017-02-03 22:16:04 +00:00
pichalite
6a073277ac Fix ACP layout on tablets 2017-02-03 22:12:47 +00:00
pichalite
a808d1b4d9 Set aspect ratio to square and confine crop box to image 2017-02-03 17:43:51 +00:00
barisusakli
a15aaaf389 closes #5394
dont allow socket.emits during maintenance mode
2017-02-03 19:02:43 +03:00
Julian Lam
06bf631445 increased file watch interval to reduce high CPU usage when using grunt 2017-02-03 10:24:55 -05:00
barisusakli
76254942b2 closes #5190 2017-02-03 16:25:02 +03:00
Misty (Bot)
d4e4b4bfa2 Latest translations and fallbacks 2017-02-03 09:21:41 +00:00
barisusakli
e3a2e13438 build test 2017-02-03 11:39:31 +03:00
Peter Jaszkowiak
360a35d0a6 Resolve merge conflicts 2017-02-02 22:15:26 -07:00
Julian Lam
1012368acd Merge pull request #5413 from NodeBB/nodebb-executable-refactor
Refactor `nodebb`, move `build.js`, add `--dev`
2017-02-02 22:04:19 -05:00
Peter Jaszkowiak
5aa3e6b95b Merge branch 'master' into nodebb-executable-refactor 2017-02-02 19:19:02 -07:00
Peter Jaszkowiak
553567c3b2 Refactor nodebb, move build.js, add --dev 2017-02-02 19:15:01 -07:00
pichalite
700e2cf800 linting 2017-02-03 01:00:09 +00:00
pichalite
702561a6ab Ability to crop profile images before uploading 2017-02-03 00:48:27 +00:00
pichalite
de28ff5d43 Ability to crop profile images before uploading 2017-02-03 00:47:09 +00:00
Julian Lam
70b20e3ff1 Up markdown 2017-02-02 15:19:05 -05:00
Misty (Bot)
a70051b30c Incremented version number 2017-02-02 17:16:01 +00:00
Peter Jaszkowiak
f4147f7922 Generate cache buster on build 2017-01-24 20:24:28 -07:00
Peter Jaszkowiak
001aa3d1a8 Fix tests, npm Windows fixes 2017-01-21 19:21:02 -07:00
Peter Jaszkowiak
186209a0a3 Build plugin staticDirs
- route `/plugins` -> `build/public/plugins`
- symlink `staticDirs` directories into `build/public/plugins`
- remove custom `/plugins` route handling
2017-01-21 18:57:27 -07:00
Jan
7fb7a64c8d Fix fa-font-path 2017-01-16 16:00:54 +01:00
Peter Jaszkowiak
8c86b2e32c Build pipeline improvements
- Refactor meta/css
- `fs.link` usage consolidated to `file.link`
- rimraf built modules directory to fix error
- Remove `local-assets` flag
2017-01-15 12:38:16 -07:00
kingjan1999
8ac40eb44c Update FontAwesome to 4.7.0 2017-01-15 17:51:28 +01:00
kingjan1999
cbe8807ebd update fontawesome.tpl 2017-01-15 17:46:21 +01:00
Peter Jaszkowiak
05b68391dd Use /assets for client assets
- Route `/assets` -> `build/public`, falling back on `public`
- Moved destinations for `nodebb.min.js`, `acp.min.js`, `admin.css`, `stylesheet.css`, `templates`, and `sounds` to `build/public`
- r.js modules previously routed through express are now symlinked into `public/build/src/modules`
- minfiles no longer served from a memory cache
- use config `views_dir` setting everywhere template directory is used
- fix cache buster `v=v=`
2017-01-14 22:38:40 -07:00
1411 changed files with 25376 additions and 25898 deletions

View File

@@ -1,5 +1,4 @@
node_modules/
public/src/nodebb.min.js
*.sublime-project
*.sublime-workspace
.project
@@ -10,11 +9,11 @@ logs/
/public/uploads
/public/sounds
/public/vendor
/public/nodebb.min.js
/public/acp.min.js
/public/src/modules/string.js
.idea/
.vscode/
*.ipr
*.iws
/coverage
/build
.eslintrc

128
.eslintrc Normal file
View File

@@ -0,0 +1,128 @@
{
"extends": "airbnb-base",
"parserOptions": {
"sourceType": "script"
},
"rules": {
// Customized
"handle-callback-err": [ "error","^(e$|(e|(.*(_e|E)))rr)" ],
"comma-dangle": ["error", {
"arrays": "always-multiline",
"objects": "always-multiline",
"imports": "always-multiline",
"exports": "always-multiline",
"functions": "never"
}],
"no-empty": ["error", { "allowEmptyCatch": true }],
"no-underscore-dangle": "off",
"newline-per-chained-call": "off",
"no-console": "off",
"no-mixed-operators": ["error", { "allowSamePrecedence": true }],
"strict": ["error", "global"],
"consistent-return": "off",
"func-names": "off",
"no-tabs": "off",
"indent": ["error", "tab"],
"no-eq-null": "off",
"camelcase": "off",
"no-new": "off",
"no-shadow": "off",
"no-use-before-define": ["error", "nofunc"],
"no-prototype-builtins": "off",
"new-cap": "off",
"no-plusplus": ["error", { "allowForLoopAfterthoughts": true }],
"import/no-unresolved": "error",
// ES6
"prefer-rest-params": "off",
"prefer-spread": "off",
"prefer-arrow-callback": "off",
"prefer-template": "off",
"no-var": "off",
"object-shorthand": "off",
"vars-on-top": "off",
// TODO
"import/no-extraneous-dependencies": "off",
"import/no-dynamic-require": "off",
"import/newline-after-import": "off",
"no-bitwise": "off",
"global-require": "off",
"max-len": "off",
"no-param-reassign": "off",
"no-restricted-syntax": "off",
"no-script-url": "off",
"default-case": "off",
// "no-multi-assign": "off",
// "linebreak-style": "off",
// "one-var": "off",
// "no-undef": "off",
// "max-nested-callbacks": "off",
// "no-mixed-requires": "off",
// "brace-style": "off",
// "max-statements-per-line": "off",
// "no-unused-vars": "off",
// "no-mixed-spaces-and-tabs": "off",
// "no-useless-concat": "off",
// "require-jsdoc": "off",
// "eqeqeq": "off",
// "no-negated-condition": "off",
// "one-var-declaration-per-line": "off",
// "no-lonely-if": "off",
// "radix": "off",
// "no-else-return": "off",
// "no-useless-escape": "off",
// "block-scoped-var": "off",
// "operator-assignment": "off",
// "yoda": "off",
// "no-loop-func": "off",
// "no-void": "off",
// "valid-jsdoc": "off",
// "no-cond-assign": "off",
// "no-redeclare": "off",
// "no-unreachable": "off",
// "no-nested-ternary": "off",
// "operator-linebreak": "off",
// "guard-for-in": "off",
// "no-unneeded-ternary": "off",
// "no-sequences": "off",
// "no-extend-native": "off",
// "no-shadow-restricted-names": "off",
// "no-extra-boolean-cast": "off",
// "no-path-concat": "off",
// "no-unused-expressions": "off",
// "no-return-assign": "off",
// "no-restricted-modules": "off",
// "object-curly-spacing": "off",
// "indent": "off",
// "padded-blocks": "off",
// "eol-last": "off",
// "lines-around-directive": "off",
// "strict": "off",
// "comma-dangle": "off",
// "no-multi-spaces": "off",
// "quotes": "off",
// "keyword-spacing": "off",
// "no-mixed-operators": "off",
// "comma-spacing": "off",
// "no-trailing-spaces": "off",
// "key-spacing": "off",
// "no-multiple-empty-lines": "off",
// "spaced-comment": "off",
// "space-in-parens": "off",
// "block-spacing": "off",
// "quote-props": "off",
// "space-unary-ops": "off",
// "no-empty": "off",
// "dot-notation": "off",
// "func-call-spacing": "off",
// "array-bracket-spacing": "off",
// "object-property-newline": "off",
// "no-continue": "off",
// "no-extra-semi": "off",
// "no-spaced-func": "off",
// "no-useless-return": "off"
}
}

View File

@@ -1,111 +0,0 @@
{
"extends": "airbnb",
"rules": {
"handle-callback-err": [ "error","^(e$|(e|(.*(_e|E)))rr)" ],
"linebreak-style": "off",
"import/no-unresolved": "off",
"import/no-extraneous-dependencies": "off",
"one-var": "off",
"no-undef": "off",
"max-len": "off",
"no-new": "off",
"max-nested-callbacks": "off",
"no-mixed-requires": "off",
"brace-style": "off",
"max-statements-per-line": "off",
"no-unused-vars": "off",
"no-mixed-spaces-and-tabs": "off",
"no-useless-concat": "off",
"require-jsdoc": "off",
"eqeqeq": "off",
"camelcase": "off",
"no-negated-condition": "off",
"one-var-declaration-per-line": "off",
"new-cap": "off",
"no-lonely-if": "off",
"radix": "off",
"no-else-return": "off",
"no-useless-escape": "off",
"block-scoped-var": "off",
"operator-assignment": "off",
"default-case": "off",
"yoda": "off",
"no-use-before-define": "off",
"no-loop-func": "off",
"no-void": "off",
"valid-jsdoc": "off",
"o-eq-null": "off",
"no-cond-assign": "off",
"no-eq-null": "off",
"no-redeclare": "off",
"no-unreachable": "off",
"no-nested-ternary": "off",
"operator-linebreak": "off",
"guard-for-in": "off",
"no-unneeded-ternary": "off",
"no-sequences": "off",
"no-extend-native": "off",
"no-shadow-restricted-names": "off",
"no-extra-boolean-cast": "off",
"no-script-url": "off",
"no-path-concat": "off",
"no-unused-expressions": "off",
"no-restricted-module": "off",
"no-return-assign": "off",
"no-restricted-modules": "off",
"no-tabs": "off",
"indent": "off",
"func-names": "off",
"prefer-arrow-callback": "off",
"object-curly-spacing": "off",
"no-var": "off",
"no-shadow": "off",
"prefer-template": "off",
"padded-blocks": "off",
"eol-last": "off",
"lines-around-directive": "off",
"no-restricted-syntax": "off",
"vars-on-top": "off",
"no-prototype-builtins": "off",
"object-shorthand": "off",
"no-param-reassign": "off",
"consistent-return": "off",
"strict": "off",
"comma-dangle": "off",
"no-multi-spaces": "off",
"quotes": "off",
"keyword-spacing": "off",
"no-plusplus": "off",
"no-mixed-operators": "off",
"comma-spacing": "off",
"global-require": "off",
"no-trailing-spaces": "off",
"key-spacing": "off",
"import/newline-after-import": "off",
"no-underscore-dangle": "off",
"prefer-spread": "off",
"no-multiple-empty-lines": "off",
"spaced-comment": "off",
"prefer-rest-params": "off",
"space-in-parens": "off",
"block-spacing": "off",
"quote-props": "off",
"no-console": "off",
"space-unary-ops": "off",
"import/no-dynamic-require": "off",
"no-bitwise": "off",
"no-empty": "off",
"array-bracket-spacin": "off",
"dot-notation": "off",
"func-call-spacing": "off",
"newline-per-chained-call": "off",
"newline-per-chained-call": "off",
"array-bracket-spacing": "off",
"object-property-newline": "off",
"no-continue": "off",
"no-extra-semi": "off",
"no-spaced-func": "off",
"no-useless-return": "off"
}
}

View File

@@ -1,6 +1,10 @@
# 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 :)
First of all, thank you! Before submission, please run `npm test` to lint and run the automated NodeBB tests. If everything passes, you're good to go. If you have any errors, please fix them and re-run `npm test` to make sure there aren't any others.
## Styleguide and linting
NodeBB mostly conforms to the [AirBnB Javascript style guide](https://github.com/airbnb/javascript#readme). If you're running into a lot of ESlint errors, you may want to install an editor plugin to display them in real time.
## Contributor License Agreement
@@ -34,11 +38,9 @@ There is a chance that the issue you are experiencing may have already been fixe
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)
3/4 12:38:57 [10752] - info: NodeBB v1.4.5 Copyright (C) 2013-2017 NodeBB Inc.
3/4 12:38:57 [10752] - info: This program comes with ABSOLUTELY NO WARRANTY.
3/4 12:38:57 [10752] - info: This is free software, and you are welcome to redistribute it under certain conditions.
```
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:
@@ -51,12 +53,13 @@ $ 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
Use `npm ls` to list the versions of the theme you're using. In this example, we're running the Persona theme, which depends on the Vanilla theme.
``` 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
$ npm ls nodebb-theme-vanilla nodebb-theme-persona
nodebb@1.4.3 /path/to/nodebb
+-- nodebb-theme-persona@4.2.4
`-- nodebb-theme-vanilla@5.2.0
```
## Attempt to use `git bisect`

1
.gitignore vendored
View File

@@ -57,3 +57,4 @@ tx.exe
coverage
build
*.log

View File

@@ -43,6 +43,7 @@ trans.sr = public/language/sr/category.json
trans.sv = public/language/sv/category.json
trans.th = public/language/th/category.json
trans.tr = public/language/tr/category.json
trans.uk = public/language/uk/category.json
trans.vi = public/language/vi/category.json
trans.zh_CN = public/language/zh-CN/category.json
trans.zh_TW = public/language/zh-TW/category.json
@@ -90,6 +91,7 @@ trans.sr = public/language/sr/login.json
trans.sv = public/language/sv/login.json
trans.th = public/language/th/login.json
trans.tr = public/language/tr/login.json
trans.uk = public/language/uk/login.json
trans.vi = public/language/vi/login.json
trans.zh_CN = public/language/zh-CN/login.json
trans.zh_TW = public/language/zh-TW/login.json
@@ -137,6 +139,7 @@ trans.sr = public/language/sr/recent.json
trans.sv = public/language/sv/recent.json
trans.th = public/language/th/recent.json
trans.tr = public/language/tr/recent.json
trans.uk = public/language/uk/recent.json
trans.vi = public/language/vi/recent.json
trans.zh_CN = public/language/zh-CN/recent.json
trans.zh_TW = public/language/zh-TW/recent.json
@@ -184,6 +187,7 @@ trans.sr = public/language/sr/unread.json
trans.sv = public/language/sv/unread.json
trans.th = public/language/th/unread.json
trans.tr = public/language/tr/unread.json
trans.uk = public/language/uk/unread.json
trans.vi = public/language/vi/unread.json
trans.zh_CN = public/language/zh-CN/unread.json
trans.zh_TW = public/language/zh-TW/unread.json
@@ -231,6 +235,7 @@ trans.sr = public/language/sr/modules.json
trans.sv = public/language/sv/modules.json
trans.th = public/language/th/modules.json
trans.tr = public/language/tr/modules.json
trans.uk = public/language/uk/modules.json
trans.vi = public/language/vi/modules.json
trans.zh_CN = public/language/zh-CN/modules.json
trans.zh_TW = public/language/zh-TW/modules.json
@@ -278,6 +283,7 @@ trans.sr = public/language/sr/register.json
trans.sv = public/language/sv/register.json
trans.th = public/language/th/register.json
trans.tr = public/language/tr/register.json
trans.uk = public/language/uk/register.json
trans.vi = public/language/vi/register.json
trans.zh_CN = public/language/zh-CN/register.json
trans.zh_TW = public/language/zh-TW/register.json
@@ -325,6 +331,7 @@ trans.sr = public/language/sr/user.json
trans.sv = public/language/sv/user.json
trans.th = public/language/th/user.json
trans.tr = public/language/tr/user.json
trans.uk = public/language/uk/user.json
trans.vi = public/language/vi/user.json
trans.zh_CN = public/language/zh-CN/user.json
trans.zh_TW = public/language/zh-TW/user.json
@@ -372,6 +379,7 @@ trans.sr = public/language/sr/global.json
trans.sv = public/language/sv/global.json
trans.th = public/language/th/global.json
trans.tr = public/language/tr/global.json
trans.uk = public/language/uk/global.json
trans.vi = public/language/vi/global.json
trans.zh_CN = public/language/zh-CN/global.json
trans.zh_TW = public/language/zh-TW/global.json
@@ -419,6 +427,7 @@ trans.sr = public/language/sr/notifications.json
trans.sv = public/language/sv/notifications.json
trans.th = public/language/th/notifications.json
trans.tr = public/language/tr/notifications.json
trans.uk = public/language/uk/notifications.json
trans.vi = public/language/vi/notifications.json
trans.zh_CN = public/language/zh-CN/notifications.json
trans.zh_TW = public/language/zh-TW/notifications.json
@@ -466,6 +475,7 @@ trans.sr = public/language/sr/reset_password.json
trans.sv = public/language/sv/reset_password.json
trans.th = public/language/th/reset_password.json
trans.tr = public/language/tr/reset_password.json
trans.uk = public/language/uk/reset_password.json
trans.vi = public/language/vi/reset_password.json
trans.zh_CN = public/language/zh-CN/reset_password.json
trans.zh_TW = public/language/zh-TW/reset_password.json
@@ -513,6 +523,7 @@ trans.sr = public/language/sr/users.json
trans.sv = public/language/sv/users.json
trans.th = public/language/th/users.json
trans.tr = public/language/tr/users.json
trans.uk = public/language/uk/users.json
trans.vi = public/language/vi/users.json
trans.zh_CN = public/language/zh-CN/users.json
trans.zh_TW = public/language/zh-TW/users.json
@@ -560,6 +571,7 @@ trans.sr = public/language/sr/language.json
trans.sv = public/language/sv/language.json
trans.th = public/language/th/language.json
trans.tr = public/language/tr/language.json
trans.uk = public/language/uk/language.json
trans.vi = public/language/vi/language.json
trans.zh_CN = public/language/zh-CN/language.json
trans.zh_TW = public/language/zh-TW/language.json
@@ -607,6 +619,7 @@ trans.sr = public/language/sr/pages.json
trans.sv = public/language/sv/pages.json
trans.th = public/language/th/pages.json
trans.tr = public/language/tr/pages.json
trans.uk = public/language/uk/pages.json
trans.vi = public/language/vi/pages.json
trans.zh_CN = public/language/zh-CN/pages.json
trans.zh_TW = public/language/zh-TW/pages.json
@@ -654,6 +667,7 @@ trans.sr = public/language/sr/topic.json
trans.sv = public/language/sv/topic.json
trans.th = public/language/th/topic.json
trans.tr = public/language/tr/topic.json
trans.uk = public/language/uk/topic.json
trans.vi = public/language/vi/topic.json
trans.zh_CN = public/language/zh-CN/topic.json
trans.zh_TW = public/language/zh-TW/topic.json
@@ -701,6 +715,7 @@ trans.sr = public/language/sr/success.json
trans.sv = public/language/sv/success.json
trans.th = public/language/th/success.json
trans.tr = public/language/tr/success.json
trans.uk = public/language/uk/success.json
trans.vi = public/language/vi/success.json
trans.zh_CN = public/language/zh-CN/success.json
trans.zh_TW = public/language/zh-TW/success.json
@@ -748,6 +763,7 @@ trans.sr = public/language/sr/error.json
trans.sv = public/language/sv/error.json
trans.th = public/language/th/error.json
trans.tr = public/language/tr/error.json
trans.uk = public/language/uk/error.json
trans.vi = public/language/vi/error.json
trans.zh_CN = public/language/zh-CN/error.json
trans.zh_TW = public/language/zh-TW/error.json
@@ -795,6 +811,7 @@ trans.sr = public/language/sr/tags.json
trans.sv = public/language/sv/tags.json
trans.th = public/language/th/tags.json
trans.tr = public/language/tr/tags.json
trans.uk = public/language/uk/tags.json
trans.vi = public/language/vi/tags.json
trans.zh_CN = public/language/zh-CN/tags.json
trans.zh_TW = public/language/zh-TW/tags.json
@@ -842,6 +859,7 @@ trans.sr = public/language/sr/email.json
trans.sv = public/language/sv/email.json
trans.th = public/language/th/email.json
trans.tr = public/language/tr/email.json
trans.uk = public/language/uk/email.json
trans.vi = public/language/vi/email.json
trans.zh_CN = public/language/zh-CN/email.json
trans.zh_TW = public/language/zh-TW/email.json
@@ -889,6 +907,7 @@ trans.sr = public/language/sr/search.json
trans.sv = public/language/sv/search.json
trans.th = public/language/th/search.json
trans.tr = public/language/tr/search.json
trans.uk = public/language/uk/search.json
trans.vi = public/language/vi/search.json
trans.zh_CN = public/language/zh-CN/search.json
trans.zh_TW = public/language/zh-TW/search.json
@@ -936,6 +955,7 @@ trans.sr = public/language/sr/groups.json
trans.sv = public/language/sv/groups.json
trans.th = public/language/th/groups.json
trans.tr = public/language/tr/groups.json
trans.uk = public/language/uk/groups.json
trans.vi = public/language/vi/groups.json
trans.zh_CN = public/language/zh-CN/groups.json
trans.zh_TW = public/language/zh-TW/groups.json
@@ -983,6 +1003,7 @@ trans.sr = public/language/sr/uploads.json
trans.sv = public/language/sv/uploads.json
trans.th = public/language/th/uploads.json
trans.tr = public/language/tr/uploads.json
trans.uk = public/language/uk/uploads.json
trans.vi = public/language/vi/uploads.json
trans.zh_CN = public/language/zh-CN/uploads.json
trans.zh_TW = public/language/zh-TW/uploads.json
@@ -1030,6 +1051,7 @@ trans.sr = public/language/sr/admin/admin.json
trans.sv = public/language/sv/admin/admin.json
trans.th = public/language/th/admin/admin.json
trans.tr = public/language/tr/admin/admin.json
trans.uk = public/language/uk/admin/admin.json
trans.vi = public/language/vi/admin/admin.json
trans.zh_CN = public/language/zh-CN/admin/admin.json
trans.zh_TW = public/language/zh-TW/admin/admin.json
@@ -1077,6 +1099,7 @@ trans.sr = public/language/sr/admin/menu.json
trans.sv = public/language/sv/admin/menu.json
trans.th = public/language/th/admin/menu.json
trans.tr = public/language/tr/admin/menu.json
trans.uk = public/language/uk/admin/menu.json
trans.vi = public/language/vi/admin/menu.json
trans.zh_CN = public/language/zh-CN/admin/menu.json
trans.zh_TW = public/language/zh-TW/admin/menu.json
@@ -1124,6 +1147,7 @@ trans.sr = public/language/sr/admin/advanced/cache.json
trans.sv = public/language/sv/admin/advanced/cache.json
trans.th = public/language/th/admin/advanced/cache.json
trans.tr = public/language/tr/admin/advanced/cache.json
trans.uk = public/language/uk/admin/advanced/cache.json
trans.vi = public/language/vi/admin/advanced/cache.json
trans.zh_CN = public/language/zh-CN/admin/advanced/cache.json
trans.zh_TW = public/language/zh-TW/admin/advanced/cache.json
@@ -1171,6 +1195,7 @@ trans.sr = public/language/sr/admin/advanced/database.json
trans.sv = public/language/sv/admin/advanced/database.json
trans.th = public/language/th/admin/advanced/database.json
trans.tr = public/language/tr/admin/advanced/database.json
trans.uk = public/language/uk/admin/advanced/database.json
trans.vi = public/language/vi/admin/advanced/database.json
trans.zh_CN = public/language/zh-CN/admin/advanced/database.json
trans.zh_TW = public/language/zh-TW/admin/advanced/database.json
@@ -1218,6 +1243,7 @@ trans.sr = public/language/sr/admin/advanced/errors.json
trans.sv = public/language/sv/admin/advanced/errors.json
trans.th = public/language/th/admin/advanced/errors.json
trans.tr = public/language/tr/admin/advanced/errors.json
trans.uk = public/language/uk/admin/advanced/errors.json
trans.vi = public/language/vi/admin/advanced/errors.json
trans.zh_CN = public/language/zh-CN/admin/advanced/errors.json
trans.zh_TW = public/language/zh-TW/admin/advanced/errors.json
@@ -1265,6 +1291,7 @@ trans.sr = public/language/sr/admin/advanced/events.json
trans.sv = public/language/sv/admin/advanced/events.json
trans.th = public/language/th/admin/advanced/events.json
trans.tr = public/language/tr/admin/advanced/events.json
trans.uk = public/language/uk/admin/advanced/events.json
trans.vi = public/language/vi/admin/advanced/events.json
trans.zh_CN = public/language/zh-CN/admin/advanced/events.json
trans.zh_TW = public/language/zh-TW/admin/advanced/events.json
@@ -1312,6 +1339,7 @@ trans.sr = public/language/sr/admin/advanced/logs.json
trans.sv = public/language/sv/admin/advanced/logs.json
trans.th = public/language/th/admin/advanced/logs.json
trans.tr = public/language/tr/admin/advanced/logs.json
trans.uk = public/language/uk/admin/advanced/logs.json
trans.vi = public/language/vi/admin/advanced/logs.json
trans.zh_CN = public/language/zh-CN/admin/advanced/logs.json
trans.zh_TW = public/language/zh-TW/admin/advanced/logs.json
@@ -1359,6 +1387,7 @@ trans.sr = public/language/sr/admin/appearance/customise.json
trans.sv = public/language/sv/admin/appearance/customise.json
trans.th = public/language/th/admin/appearance/customise.json
trans.tr = public/language/tr/admin/appearance/customise.json
trans.uk = public/language/uk/admin/appearance/customise.json
trans.vi = public/language/vi/admin/appearance/customise.json
trans.zh_CN = public/language/zh-CN/admin/appearance/customise.json
trans.zh_TW = public/language/zh-TW/admin/appearance/customise.json
@@ -1406,6 +1435,7 @@ trans.sr = public/language/sr/admin/appearance/skins.json
trans.sv = public/language/sv/admin/appearance/skins.json
trans.th = public/language/th/admin/appearance/skins.json
trans.tr = public/language/tr/admin/appearance/skins.json
trans.uk = public/language/uk/admin/appearance/skins.json
trans.vi = public/language/vi/admin/appearance/skins.json
trans.zh_CN = public/language/zh-CN/admin/appearance/skins.json
trans.zh_TW = public/language/zh-TW/admin/appearance/skins.json
@@ -1453,6 +1483,7 @@ trans.sr = public/language/sr/admin/appearance/themes.json
trans.sv = public/language/sv/admin/appearance/themes.json
trans.th = public/language/th/admin/appearance/themes.json
trans.tr = public/language/tr/admin/appearance/themes.json
trans.uk = public/language/uk/admin/appearance/themes.json
trans.vi = public/language/vi/admin/appearance/themes.json
trans.zh_CN = public/language/zh-CN/admin/appearance/themes.json
trans.zh_TW = public/language/zh-TW/admin/appearance/themes.json
@@ -1500,6 +1531,7 @@ trans.sr = public/language/sr/admin/development/info.json
trans.sv = public/language/sv/admin/development/info.json
trans.th = public/language/th/admin/development/info.json
trans.tr = public/language/tr/admin/development/info.json
trans.uk = public/language/uk/admin/development/info.json
trans.vi = public/language/vi/admin/development/info.json
trans.zh_CN = public/language/zh-CN/admin/development/info.json
trans.zh_TW = public/language/zh-TW/admin/development/info.json
@@ -1547,6 +1579,7 @@ trans.sr = public/language/sr/admin/development/logger.json
trans.sv = public/language/sv/admin/development/logger.json
trans.th = public/language/th/admin/development/logger.json
trans.tr = public/language/tr/admin/development/logger.json
trans.uk = public/language/uk/admin/development/logger.json
trans.vi = public/language/vi/admin/development/logger.json
trans.zh_CN = public/language/zh-CN/admin/development/logger.json
trans.zh_TW = public/language/zh-TW/admin/development/logger.json
@@ -1594,6 +1627,7 @@ trans.sr = public/language/sr/admin/extend/plugins.json
trans.sv = public/language/sv/admin/extend/plugins.json
trans.th = public/language/th/admin/extend/plugins.json
trans.tr = public/language/tr/admin/extend/plugins.json
trans.uk = public/language/uk/admin/extend/plugins.json
trans.vi = public/language/vi/admin/extend/plugins.json
trans.zh_CN = public/language/zh-CN/admin/extend/plugins.json
trans.zh_TW = public/language/zh-TW/admin/extend/plugins.json
@@ -1641,6 +1675,7 @@ trans.sr = public/language/sr/admin/extend/rewards.json
trans.sv = public/language/sv/admin/extend/rewards.json
trans.th = public/language/th/admin/extend/rewards.json
trans.tr = public/language/tr/admin/extend/rewards.json
trans.uk = public/language/uk/admin/extend/rewards.json
trans.vi = public/language/vi/admin/extend/rewards.json
trans.zh_CN = public/language/zh-CN/admin/extend/rewards.json
trans.zh_TW = public/language/zh-TW/admin/extend/rewards.json
@@ -1688,6 +1723,7 @@ trans.sr = public/language/sr/admin/extend/widgets.json
trans.sv = public/language/sv/admin/extend/widgets.json
trans.th = public/language/th/admin/extend/widgets.json
trans.tr = public/language/tr/admin/extend/widgets.json
trans.uk = public/language/uk/admin/extend/widgets.json
trans.vi = public/language/vi/admin/extend/widgets.json
trans.zh_CN = public/language/zh-CN/admin/extend/widgets.json
trans.zh_TW = public/language/zh-TW/admin/extend/widgets.json
@@ -1735,6 +1771,7 @@ trans.sr = public/language/sr/admin/general/dashboard.json
trans.sv = public/language/sv/admin/general/dashboard.json
trans.th = public/language/th/admin/general/dashboard.json
trans.tr = public/language/tr/admin/general/dashboard.json
trans.uk = public/language/uk/admin/general/dashboard.json
trans.vi = public/language/vi/admin/general/dashboard.json
trans.zh_CN = public/language/zh-CN/admin/general/dashboard.json
trans.zh_TW = public/language/zh-TW/admin/general/dashboard.json
@@ -1782,6 +1819,7 @@ trans.sr = public/language/sr/admin/general/homepage.json
trans.sv = public/language/sv/admin/general/homepage.json
trans.th = public/language/th/admin/general/homepage.json
trans.tr = public/language/tr/admin/general/homepage.json
trans.uk = public/language/uk/admin/general/homepage.json
trans.vi = public/language/vi/admin/general/homepage.json
trans.zh_CN = public/language/zh-CN/admin/general/homepage.json
trans.zh_TW = public/language/zh-TW/admin/general/homepage.json
@@ -1829,6 +1867,7 @@ trans.sr = public/language/sr/admin/general/languages.json
trans.sv = public/language/sv/admin/general/languages.json
trans.th = public/language/th/admin/general/languages.json
trans.tr = public/language/tr/admin/general/languages.json
trans.uk = public/language/uk/admin/general/languages.json
trans.vi = public/language/vi/admin/general/languages.json
trans.zh_CN = public/language/zh-CN/admin/general/languages.json
trans.zh_TW = public/language/zh-TW/admin/general/languages.json
@@ -1876,6 +1915,7 @@ trans.sr = public/language/sr/admin/general/navigation.json
trans.sv = public/language/sv/admin/general/navigation.json
trans.th = public/language/th/admin/general/navigation.json
trans.tr = public/language/tr/admin/general/navigation.json
trans.uk = public/language/uk/admin/general/navigation.json
trans.vi = public/language/vi/admin/general/navigation.json
trans.zh_CN = public/language/zh-CN/admin/general/navigation.json
trans.zh_TW = public/language/zh-TW/admin/general/navigation.json
@@ -1923,6 +1963,7 @@ trans.sr = public/language/sr/admin/general/social.json
trans.sv = public/language/sv/admin/general/social.json
trans.th = public/language/th/admin/general/social.json
trans.tr = public/language/tr/admin/general/social.json
trans.uk = public/language/uk/admin/general/social.json
trans.vi = public/language/vi/admin/general/social.json
trans.zh_CN = public/language/zh-CN/admin/general/social.json
trans.zh_TW = public/language/zh-TW/admin/general/social.json
@@ -1970,6 +2011,7 @@ trans.sr = public/language/sr/admin/general/sounds.json
trans.sv = public/language/sv/admin/general/sounds.json
trans.th = public/language/th/admin/general/sounds.json
trans.tr = public/language/tr/admin/general/sounds.json
trans.uk = public/language/uk/admin/general/sounds.json
trans.vi = public/language/vi/admin/general/sounds.json
trans.zh_CN = public/language/zh-CN/admin/general/sounds.json
trans.zh_TW = public/language/zh-TW/admin/general/sounds.json
@@ -2017,6 +2059,7 @@ trans.sr = public/language/sr/admin/manage/categories.json
trans.sv = public/language/sv/admin/manage/categories.json
trans.th = public/language/th/admin/manage/categories.json
trans.tr = public/language/tr/admin/manage/categories.json
trans.uk = public/language/uk/admin/manage/categories.json
trans.vi = public/language/vi/admin/manage/categories.json
trans.zh_CN = public/language/zh-CN/admin/manage/categories.json
trans.zh_TW = public/language/zh-TW/admin/manage/categories.json
@@ -2064,6 +2107,7 @@ trans.sr = public/language/sr/admin/manage/flags.json
trans.sv = public/language/sv/admin/manage/flags.json
trans.th = public/language/th/admin/manage/flags.json
trans.tr = public/language/tr/admin/manage/flags.json
trans.uk = public/language/uk/admin/manage/flags.json
trans.vi = public/language/vi/admin/manage/flags.json
trans.zh_CN = public/language/zh-CN/admin/manage/flags.json
trans.zh_TW = public/language/zh-TW/admin/manage/flags.json
@@ -2111,6 +2155,7 @@ trans.sr = public/language/sr/admin/manage/groups.json
trans.sv = public/language/sv/admin/manage/groups.json
trans.th = public/language/th/admin/manage/groups.json
trans.tr = public/language/tr/admin/manage/groups.json
trans.uk = public/language/uk/admin/manage/groups.json
trans.vi = public/language/vi/admin/manage/groups.json
trans.zh_CN = public/language/zh-CN/admin/manage/groups.json
trans.zh_TW = public/language/zh-TW/admin/manage/groups.json
@@ -2158,6 +2203,7 @@ trans.sr = public/language/sr/admin/manage/ip-blacklist.json
trans.sv = public/language/sv/admin/manage/ip-blacklist.json
trans.th = public/language/th/admin/manage/ip-blacklist.json
trans.tr = public/language/tr/admin/manage/ip-blacklist.json
trans.uk = public/language/uk/admin/manage/ip-blacklist.json
trans.vi = public/language/vi/admin/manage/ip-blacklist.json
trans.zh_CN = public/language/zh-CN/admin/manage/ip-blacklist.json
trans.zh_TW = public/language/zh-TW/admin/manage/ip-blacklist.json
@@ -2205,6 +2251,7 @@ trans.sr = public/language/sr/admin/manage/registration.json
trans.sv = public/language/sv/admin/manage/registration.json
trans.th = public/language/th/admin/manage/registration.json
trans.tr = public/language/tr/admin/manage/registration.json
trans.uk = public/language/uk/admin/manage/registration.json
trans.vi = public/language/vi/admin/manage/registration.json
trans.zh_CN = public/language/zh-CN/admin/manage/registration.json
trans.zh_TW = public/language/zh-TW/admin/manage/registration.json
@@ -2252,6 +2299,7 @@ trans.sr = public/language/sr/admin/manage/tags.json
trans.sv = public/language/sv/admin/manage/tags.json
trans.th = public/language/th/admin/manage/tags.json
trans.tr = public/language/tr/admin/manage/tags.json
trans.uk = public/language/uk/admin/manage/tags.json
trans.vi = public/language/vi/admin/manage/tags.json
trans.zh_CN = public/language/zh-CN/admin/manage/tags.json
trans.zh_TW = public/language/zh-TW/admin/manage/tags.json
@@ -2299,6 +2347,7 @@ trans.sr = public/language/sr/admin/manage/users.json
trans.sv = public/language/sv/admin/manage/users.json
trans.th = public/language/th/admin/manage/users.json
trans.tr = public/language/tr/admin/manage/users.json
trans.uk = public/language/uk/admin/manage/users.json
trans.vi = public/language/vi/admin/manage/users.json
trans.zh_CN = public/language/zh-CN/admin/manage/users.json
trans.zh_TW = public/language/zh-TW/admin/manage/users.json
@@ -2346,6 +2395,7 @@ trans.sr = public/language/sr/admin/settings/advanced.json
trans.sv = public/language/sv/admin/settings/advanced.json
trans.th = public/language/th/admin/settings/advanced.json
trans.tr = public/language/tr/admin/settings/advanced.json
trans.uk = public/language/uk/admin/settings/advanced.json
trans.vi = public/language/vi/admin/settings/advanced.json
trans.zh_CN = public/language/zh-CN/admin/settings/advanced.json
trans.zh_TW = public/language/zh-TW/admin/settings/advanced.json
@@ -2393,6 +2443,7 @@ trans.sr = public/language/sr/admin/settings/cookies.json
trans.sv = public/language/sv/admin/settings/cookies.json
trans.th = public/language/th/admin/settings/cookies.json
trans.tr = public/language/tr/admin/settings/cookies.json
trans.uk = public/language/uk/admin/settings/cookies.json
trans.vi = public/language/vi/admin/settings/cookies.json
trans.zh_CN = public/language/zh-CN/admin/settings/cookies.json
trans.zh_TW = public/language/zh-TW/admin/settings/cookies.json
@@ -2440,6 +2491,7 @@ trans.sr = public/language/sr/admin/settings/general.json
trans.sv = public/language/sv/admin/settings/general.json
trans.th = public/language/th/admin/settings/general.json
trans.tr = public/language/tr/admin/settings/general.json
trans.uk = public/language/uk/admin/settings/general.json
trans.vi = public/language/vi/admin/settings/general.json
trans.zh_CN = public/language/zh-CN/admin/settings/general.json
trans.zh_TW = public/language/zh-TW/admin/settings/general.json
@@ -2487,6 +2539,7 @@ trans.sr = public/language/sr/admin/settings/guest.json
trans.sv = public/language/sv/admin/settings/guest.json
trans.th = public/language/th/admin/settings/guest.json
trans.tr = public/language/tr/admin/settings/guest.json
trans.uk = public/language/uk/admin/settings/guest.json
trans.vi = public/language/vi/admin/settings/guest.json
trans.zh_CN = public/language/zh-CN/admin/settings/guest.json
trans.zh_TW = public/language/zh-TW/admin/settings/guest.json
@@ -2534,6 +2587,7 @@ trans.sr = public/language/sr/admin/settings/pagination.json
trans.sv = public/language/sv/admin/settings/pagination.json
trans.th = public/language/th/admin/settings/pagination.json
trans.tr = public/language/tr/admin/settings/pagination.json
trans.uk = public/language/uk/admin/settings/pagination.json
trans.vi = public/language/vi/admin/settings/pagination.json
trans.zh_CN = public/language/zh-CN/admin/settings/pagination.json
trans.zh_TW = public/language/zh-TW/admin/settings/pagination.json
@@ -2581,6 +2635,7 @@ trans.sr = public/language/sr/admin/settings/reputation.json
trans.sv = public/language/sv/admin/settings/reputation.json
trans.th = public/language/th/admin/settings/reputation.json
trans.tr = public/language/tr/admin/settings/reputation.json
trans.uk = public/language/uk/admin/settings/reputation.json
trans.vi = public/language/vi/admin/settings/reputation.json
trans.zh_CN = public/language/zh-CN/admin/settings/reputation.json
trans.zh_TW = public/language/zh-TW/admin/settings/reputation.json
@@ -2628,6 +2683,7 @@ trans.sr = public/language/sr/admin/settings/tags.json
trans.sv = public/language/sv/admin/settings/tags.json
trans.th = public/language/th/admin/settings/tags.json
trans.tr = public/language/tr/admin/settings/tags.json
trans.uk = public/language/uk/admin/settings/tags.json
trans.vi = public/language/vi/admin/settings/tags.json
trans.zh_CN = public/language/zh-CN/admin/settings/tags.json
trans.zh_TW = public/language/zh-TW/admin/settings/tags.json
@@ -2675,6 +2731,7 @@ trans.sr = public/language/sr/admin/settings/user.json
trans.sv = public/language/sv/admin/settings/user.json
trans.th = public/language/th/admin/settings/user.json
trans.tr = public/language/tr/admin/settings/user.json
trans.uk = public/language/uk/admin/settings/user.json
trans.vi = public/language/vi/admin/settings/user.json
trans.zh_CN = public/language/zh-CN/admin/settings/user.json
trans.zh_TW = public/language/zh-TW/admin/settings/user.json
@@ -2722,6 +2779,7 @@ trans.sr = public/language/sr/admin/settings/chat.json
trans.sv = public/language/sv/admin/settings/chat.json
trans.th = public/language/th/admin/settings/chat.json
trans.tr = public/language/tr/admin/settings/chat.json
trans.uk = public/language/uk/admin/settings/chat.json
trans.vi = public/language/vi/admin/settings/chat.json
trans.zh_CN = public/language/zh-CN/admin/settings/chat.json
trans.zh_TW = public/language/zh-TW/admin/settings/chat.json
@@ -2769,6 +2827,7 @@ trans.sr = public/language/sr/admin/settings/email.json
trans.sv = public/language/sv/admin/settings/email.json
trans.th = public/language/th/admin/settings/email.json
trans.tr = public/language/tr/admin/settings/email.json
trans.uk = public/language/uk/admin/settings/email.json
trans.vi = public/language/vi/admin/settings/email.json
trans.zh_CN = public/language/zh-CN/admin/settings/email.json
trans.zh_TW = public/language/zh-TW/admin/settings/email.json
@@ -2816,6 +2875,7 @@ trans.sr = public/language/sr/admin/settings/group.json
trans.sv = public/language/sv/admin/settings/group.json
trans.th = public/language/th/admin/settings/group.json
trans.tr = public/language/tr/admin/settings/group.json
trans.uk = public/language/uk/admin/settings/group.json
trans.vi = public/language/vi/admin/settings/group.json
trans.zh_CN = public/language/zh-CN/admin/settings/group.json
trans.zh_TW = public/language/zh-TW/admin/settings/group.json
@@ -2863,6 +2923,7 @@ trans.sr = public/language/sr/admin/settings/notifications.json
trans.sv = public/language/sv/admin/settings/notifications.json
trans.th = public/language/th/admin/settings/notifications.json
trans.tr = public/language/tr/admin/settings/notifications.json
trans.uk = public/language/uk/admin/settings/notifications.json
trans.vi = public/language/vi/admin/settings/notifications.json
trans.zh_CN = public/language/zh-CN/admin/settings/notifications.json
trans.zh_TW = public/language/zh-TW/admin/settings/notifications.json
@@ -2910,6 +2971,7 @@ trans.sr = public/language/sr/admin/settings/post.json
trans.sv = public/language/sv/admin/settings/post.json
trans.th = public/language/th/admin/settings/post.json
trans.tr = public/language/tr/admin/settings/post.json
trans.uk = public/language/uk/admin/settings/post.json
trans.vi = public/language/vi/admin/settings/post.json
trans.zh_CN = public/language/zh-CN/admin/settings/post.json
trans.zh_TW = public/language/zh-TW/admin/settings/post.json
@@ -2957,6 +3019,7 @@ trans.sr = public/language/sr/admin/settings/sockets.json
trans.sv = public/language/sv/admin/settings/sockets.json
trans.th = public/language/th/admin/settings/sockets.json
trans.tr = public/language/tr/admin/settings/sockets.json
trans.uk = public/language/uk/admin/settings/sockets.json
trans.vi = public/language/vi/admin/settings/sockets.json
trans.zh_CN = public/language/zh-CN/admin/settings/sockets.json
trans.zh_TW = public/language/zh-TW/admin/settings/sockets.json
@@ -3004,6 +3067,7 @@ trans.sr = public/language/sr/admin/settings/uploads.json
trans.sv = public/language/sv/admin/settings/uploads.json
trans.th = public/language/th/admin/settings/uploads.json
trans.tr = public/language/tr/admin/settings/uploads.json
trans.uk = public/language/uk/admin/settings/uploads.json
trans.vi = public/language/vi/admin/settings/uploads.json
trans.zh_CN = public/language/zh-CN/admin/settings/uploads.json
trans.zh_TW = public/language/zh-TW/admin/settings/uploads.json
@@ -3051,6 +3115,7 @@ trans.sr = public/language/sr/admin/settings/web-crawler.json
trans.sv = public/language/sv/admin/settings/web-crawler.json
trans.th = public/language/th/admin/settings/web-crawler.json
trans.tr = public/language/tr/admin/settings/web-crawler.json
trans.uk = public/language/uk/admin/settings/web-crawler.json
trans.vi = public/language/vi/admin/settings/web-crawler.json
trans.zh_CN = public/language/zh-CN/admin/settings/web-crawler.json
trans.zh_TW = public/language/zh-TW/admin/settings/web-crawler.json

View File

@@ -1,24 +1,26 @@
"use strict";
var fork = require('child_process').fork,
env = process.env,
worker, updateWorker,
incomplete = [],
running = 0;
'use strict';
var fork = require('child_process').fork;
var env = process.env;
var worker;
var updateWorker;
var initWorker;
var incomplete = [];
var running = 0;
module.exports = function (grunt) {
var args = [];
var initArgs = ['--build'];
if (!grunt.option('verbose')) {
args.push('--log-level=info');
initArgs.push('--log-level=info');
}
function update(action, filepath, target) {
var updateArgs = args.slice(),
fromFile = '',
compiling = '',
time = Date.now();
var updateArgs = args.slice();
var compiling = '';
var time = Date.now();
if (target === 'lessUpdated_Client') {
compiling = 'clientCSS';
} else if (target === 'lessUpdated_Admin') {
@@ -45,11 +47,13 @@ module.exports = function (grunt) {
updateWorker.kill('SIGKILL');
}
updateWorker = fork('app.js', updateArgs, { env: env });
++running;
running += 1;
updateWorker.on('exit', function () {
--running;
running -= 1;
if (running === 0) {
worker = fork('app.js', args, { env: env });
worker = fork('app.js', args, {
env: env,
});
worker.on('message', function () {
if (incomplete.length) {
incomplete = [];
@@ -70,11 +74,17 @@ module.exports = function (grunt) {
'public/*.less',
'node_modules/nodebb-*/*.less', 'node_modules/nodebb-*/**/*.less',
'!node_modules/nodebb-*/node_modules/**',
'!node_modules/nodebb-*/.git/**'
]
'!node_modules/nodebb-*/.git/**',
],
options: {
interval: 1000,
},
},
lessUpdated_Admin: {
files: ['public/**/*.less']
files: ['public/**/*.less'],
options: {
interval: 1000,
},
},
clientUpdated: {
files: [
@@ -82,19 +92,28 @@ module.exports = function (grunt) {
'node_modules/nodebb-*/*.js', 'node_modules/nodebb-*/**/*.js',
'!node_modules/nodebb-*/node_modules/**',
'node_modules/templates.js/lib/templates.js',
'!node_modules/nodebb-*/.git/**'
]
'!node_modules/nodebb-*/.git/**',
],
options: {
interval: 1000,
},
},
serverUpdated: {
files: ['*.js', 'install/*.js', 'src/**/*.js']
files: ['*.js', 'install/*.js', 'src/**/*.js'],
options: {
interval: 1000,
},
},
templatesUpdated: {
files: [
'src/views/**/*.tpl',
'node_modules/nodebb-*/*.tpl', 'node_modules/nodebb-*/**/*.tpl',
'!node_modules/nodebb-*/node_modules/**',
'!node_modules/nodebb-*/.git/**'
]
'!node_modules/nodebb-*/.git/**',
],
options: {
interval: 1000,
},
},
langUpdated: {
files: [
@@ -107,21 +126,33 @@ module.exports = function (grunt) {
'!node_modules/nodebb-*/package.json',
'!node_modules/nodebb-*/theme.json',
],
options: {
interval: 1000,
},
},
}
},
});
grunt.loadNpmTasks('grunt-contrib-watch');
if (grunt.option('skip')) {
grunt.registerTask('default', ['watch:serverUpdated']);
} else {
grunt.registerTask('default', ['watch']);
}
grunt.registerTask('default', ['watch']);
env.NODE_ENV = 'development';
worker = fork('app.js', args, { env: env });
if (grunt.option('skip')) {
worker = fork('app.js', args, {
env: env,
});
} else {
initWorker = fork('app.js', initArgs, {
env: env,
});
initWorker.on('exit', function () {
worker = fork('app.js', args, {
env: env,
});
});
}
grunt.event.on('watch', update);
};
};

85
app.js
View File

@@ -17,8 +17,13 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
"use strict";
/*global require, global, process*/
'use strict';
if (require.main !== module) {
require.main.require = function (path) {
return require(path);
};
}
var nconf = require('nconf');
nconf.argv().env('__');
@@ -37,11 +42,11 @@ winston.add(winston.transports.Console, {
colorize: true,
timestamp: function () {
var date = new Date();
return (!!nconf.get('json-logging')) ? date.toJSON() : date.getDate() + '/' + (date.getMonth() + 1) + ' ' + date.toTimeString().substr(0,8) + ' [' + global.process.pid + ']';
return nconf.get('json-logging') ? date.toJSON() : date.getDate() + '/' + (date.getMonth() + 1) + ' ' + date.toTimeString().substr(0, 8) + ' [' + global.process.pid + ']';
},
level: nconf.get('log-level') || (global.env === 'production' ? 'info' : 'verbose'),
json: (!!nconf.get('json-logging')),
stringify: (!!nconf.get('json-logging'))
stringify: (!!nconf.get('json-logging')),
});
@@ -75,7 +80,7 @@ if (nconf.get('setup') || nconf.get('install')) {
} else if (nconf.get('reset')) {
async.waterfall([
async.apply(require('./src/reset').reset),
async.apply(require('./build').buildAll)
async.apply(require('./src/meta/build').buildAll),
], function (err) {
process.exit(err ? 1 : 0);
});
@@ -84,7 +89,7 @@ if (nconf.get('setup') || nconf.get('install')) {
} else if (nconf.get('plugins')) {
listPlugins();
} else if (nconf.get('build')) {
require('./build').build(nconf.get('build'));
require('./src/meta/build').build(nconf.get('build'));
} else {
require('./src/start').start();
}
@@ -93,14 +98,15 @@ function loadConfig(callback) {
winston.verbose('* using configuration stored in: %s', configFile);
nconf.file({
file: configFile
file: configFile,
});
nconf.defaults({
base_dir: __dirname,
themes_path: path.join(__dirname, 'node_modules'),
views_dir: path.join(__dirname, 'public/templates'),
version: pkg.version
upload_path: 'public/uploads',
views_dir: path.join(__dirname, 'build/public/templates'),
version: pkg.version,
});
if (!nconf.get('isCluster')) {
@@ -113,10 +119,23 @@ function loadConfig(callback) {
nconf.set('core_templates_path', path.join(__dirname, 'src/views'));
nconf.set('base_templates_path', path.join(nconf.get('themes_path'), 'nodebb-theme-persona/templates'));
nconf.set('upload_path', path.resolve(nconf.get('base_dir'), nconf.get('upload_path')));
if (nconf.get('url')) {
nconf.set('url_parsed', url.parse(nconf.get('url')));
}
// Explicitly cast 'jobsDisabled' as Bool
var castAsBool = ['jobsDisabled'];
nconf.stores.env.readOnly = false;
castAsBool.forEach(function (prop) {
var value = nconf.get(prop);
if (value) {
nconf.set(prop, typeof value === 'boolean' ? value : String(value).toLowerCase() === 'true');
}
});
nconf.stores.env.readOnly = true;
if (typeof callback === 'function') {
callback();
}
@@ -126,7 +145,7 @@ function setup() {
winston.info('NodeBB Setup Triggered via Command Line');
var install = require('./src/install');
var build = require('./build');
var build = require('./src/meta/build');
process.stdout.write('\nWelcome to NodeBB!\n');
process.stdout.write('\nThis looks like a new installation, so you\'ll have to answer a few questions about your environment before we can proceed.\n');
@@ -135,14 +154,14 @@ function setup() {
async.series([
async.apply(install.setup),
async.apply(loadConfig),
async.apply(build.buildAll)
async.apply(build.buildAll),
], function (err, data) {
// Disregard build step data
data = data[0];
var separator = ' ';
if (process.stdout.columns > 10) {
for(var x = 0,cols = process.stdout.columns - 10; x < cols; x++) {
for (var x = 0, cols = process.stdout.columns - 10; x < cols; x += 1) {
separator += '=';
}
}
@@ -174,13 +193,13 @@ function upgrade() {
var db = require('./src/database');
var meta = require('./src/meta');
var upgrade = require('./src/upgrade');
var build = require('./build');
var build = require('./src/meta/build');
async.series([
async.apply(db.init),
async.apply(meta.configs.init),
async.apply(upgrade.upgrade),
async.apply(build.buildAll)
async.apply(build.buildAll),
], function (err) {
if (err) {
winston.error(err.stack);
@@ -193,22 +212,32 @@ function upgrade() {
function activate() {
var db = require('./src/database');
db.init(function (err) {
var plugins = require('./src/plugins');
var plugin = nconf.get('activate');
async.waterfall([
function (next) {
db.init(next);
},
function (next) {
if (plugin.indexOf('nodebb-') !== 0) {
// Allow omission of `nodebb-plugin-`
plugin = 'nodebb-plugin-' + plugin;
}
plugins.isInstalled(plugin, next);
},
function (isInstalled, next) {
if (!isInstalled) {
return next(new Error('plugin not installed'));
}
winston.info('Activating plugin `%s`', plugin);
db.sortedSetAdd('plugins:active', 0, plugin, next);
},
], function (err) {
if (err) {
winston.error(err.stack);
process.exit(1);
winston.error(err.message);
}
var plugin = nconf.get('activate');
if (plugin.indexOf('nodebb-') !== 0) {
// Allow omission of `nodebb-plugin-`
plugin = 'nodebb-plugin-' + plugin;
}
winston.info('Activating plugin `%s`', plugin);
db.sortedSetAdd('plugins:active', 0, plugin, function (err) {
process.exit(err ? 1 : 0);
});
process.exit(err ? 1 : 0);
});
}

121
build.js
View File

@@ -1,121 +0,0 @@
'use strict';
var async = require('async');
var winston = require('winston');
var buildStart;
var valid = ['js', 'clientCSS', 'acpCSS', 'tpl', 'lang'];
exports.buildAll = function (callback) {
exports.build(valid.join(','), callback);
};
exports.build = function build(targets, callback) {
buildStart = Date.now();
var db = require('./src/database');
var meta = require('./src/meta');
var plugins = require('./src/plugins');
targets = (targets === true ? valid : targets.split(',').filter(function (target) {
return valid.indexOf(target) !== -1;
}));
if (!targets) {
winston.error('[build] No valid build targets found. Aborting.');
return process.exit(0);
}
async.series([
async.apply(db.init),
async.apply(meta.themes.setupPaths),
async.apply(plugins.prepareForBuild)
], function (err) {
if (err) {
winston.error('[build] Encountered error preparing for build: ' + err.message);
return process.exit(1);
}
exports.buildTargets(targets, callback);
});
};
exports.buildTargets = function (targets, callback) {
var meta = require('./src/meta');
buildStart = buildStart || Date.now();
var step = function (startTime, target, next) {
winston.info('[build] ' + target + ' => Completed in ' + ((Date.now() - startTime) / 1000) + 's');
next();
};
async.parallel([
function (next) {
if (targets.indexOf('js') !== -1) {
winston.info('[build] Building javascript');
var startTime = Date.now();
async.series([
async.apply(meta.js.minify, 'nodebb.min.js'),
async.apply(meta.js.minify, 'acp.min.js')
], step.bind(this, startTime, 'js', next));
} else {
setImmediate(next);
}
},
function (next) {
async.eachSeries(targets, function (target, next) {
var startTime;
switch(target) {
case 'js':
setImmediate(next);
break;
case 'clientCSS':
winston.info('[build] Building client-side CSS');
startTime = Date.now();
meta.css.minify('stylesheet.css', step.bind(this, startTime, target, next));
break;
case 'acpCSS':
winston.info('[build] Building admin control panel CSS');
startTime = Date.now();
meta.css.minify('admin.css', step.bind(this, startTime, target, next));
break;
case 'tpl':
winston.info('[build] Building templates');
startTime = Date.now();
meta.templates.compile(step.bind(this, startTime, target, next));
break;
case 'lang':
winston.info('[build] Building language files');
startTime = Date.now();
meta.languages.build(step.bind(this, startTime, target, next));
break;
default:
winston.warn('[build] Unknown build target: \'' + target + '\'');
setImmediate(next);
break;
}
}, next);
}
], function (err) {
if (err) {
winston.error('[build] Encountered error during build step: ' + err.message);
return process.exit(1);
}
var time = (Date.now() - buildStart) / 1000;
winston.info('[build] Asset compilation successful. Completed in ' + time + 's.');
if (typeof callback === 'function') {
callback();
} else {
process.exit(0);
}
});
};

View File

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

View File

@@ -1,4 +1,4 @@
"use strict";
'use strict';
var async = require('async');
var prompt = require('prompt');
@@ -6,7 +6,7 @@ var winston = require('winston');
var questions = {
redis: require('../src/database/redis').questions,
mongo: require('../src/database/mongo').questions
mongo: require('../src/database/mongo').questions,
};
module.exports = function (config, callback) {
@@ -18,7 +18,7 @@ module.exports = function (config, callback) {
},
function (databaseConfig, next) {
saveDatabaseConfig(config, databaseConfig, next);
}
},
], callback);
};
@@ -55,7 +55,7 @@ function saveDatabaseConfig(config, databaseConfig, callback) {
host: databaseConfig['redis:host'],
port: databaseConfig['redis:port'],
password: databaseConfig['redis:password'],
database: databaseConfig['redis:database']
database: databaseConfig['redis:database'],
};
if (config.redis.host.slice(0, 1) === '/') {
@@ -67,16 +67,16 @@ function saveDatabaseConfig(config, databaseConfig, callback) {
port: databaseConfig['mongo:port'],
username: databaseConfig['mongo:username'],
password: databaseConfig['mongo:password'],
database: databaseConfig['mongo:database']
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++) {
for (var x = 0; x < allQuestions.length; x += 1) {
delete config[allQuestions[x].name];
}
callback(null, config);
}
}

View File

@@ -1,4 +1,4 @@
"use strict";
'use strict';
var winston = require('winston');
var express = require('express');
@@ -17,9 +17,9 @@ winston.add(winston.transports.File, {
colorize: true,
timestamp: function () {
var date = new Date();
return date.getDate() + '/' + (date.getMonth() + 1) + ' ' + date.toTimeString().substr(0,5) + ' [' + global.process.pid + ']';
return date.getDate() + '/' + (date.getMonth() + 1) + ' ' + date.toTimeString().substr(0, 5) + ' [' + global.process.pid + ']';
},
level: 'verbose'
level: 'verbose',
});
var web = {};
@@ -27,7 +27,7 @@ var scripts = [
'public/vendor/xregexp/xregexp.js',
'public/vendor/xregexp/unicode/unicode-base.js',
'public/src/utils.js',
'public/src/installer/install.js'
'public/src/installer/install.js',
];
web.install = function (port) {
@@ -39,7 +39,7 @@ web.install = function (port) {
app.set('view engine', 'tpl');
app.set('views', path.join(__dirname, '../src/views'));
app.use(bodyParser.urlencoded({
extended: true
extended: true,
}));
async.parallel([compileLess, compileJS], function () {
@@ -66,7 +66,7 @@ function welcome(req, res) {
var databases = dbs.map(function (el) {
return {
name: el,
questions: require('../src/database/' + el).questions
questions: require('../src/database/' + el).questions,
};
});
@@ -75,10 +75,10 @@ function welcome(req, res) {
res.render('install/index', {
databases: databases,
skipDatabaseSetup: !!nconf.get('database'),
error: res.locals.error ? true : false,
success: res.locals.success ? true : false,
error: !!res.locals.error,
success: !!res.locals.success,
values: req.body,
minimumPasswordLength: defaults.minimumPasswordLength
minimumPasswordLength: defaults.minimumPasswordLength,
});
}
@@ -90,7 +90,7 @@ function install(req, res) {
}
var child = require('child_process').fork('app', ['--setup'], {
env: process.env
env: process.env,
});
child.on('close', function (data) {
@@ -110,7 +110,7 @@ function launch(req, res) {
var child = require('child_process').spawn('node', ['loader.js'], {
detached: true,
stdio: ['ignore', 'ignore', 'ignore']
stdio: ['ignore', 'ignore', 'ignore'],
});
process.stdout.write('\nStarting NodeBB\n');
@@ -120,7 +120,7 @@ function launch(req, res) {
async.parallel([
async.apply(fs.unlink(path.join(__dirname, '../public/installer.css'))),
async.apply(fs.unlink(path.join(__dirname, '../public/installer.min.js')))
async.apply(fs.unlink(path.join(__dirname, '../public/installer.min.js'))),
], function (err) {
if (err) {
winston.warn('Unable to remove installer files');
@@ -138,7 +138,7 @@ function compileLess(callback) {
}
less.render(style.toString(), function (err, css) {
if(err) {
if (err) {
return winston.error('Unable to compile LESS: ', err);
}
@@ -157,4 +157,4 @@ function compileJS(callback) {
fs.writeFile(path.join(__dirname, '../public/installer.min.js'), result.code, callback);
}
module.exports = web;
module.exports = web;

View File

@@ -1,29 +1,30 @@
'use strict';
var nconf = require('nconf'),
fs = require('fs'),
url = require('url'),
path = require('path'),
fork = require('child_process').fork,
var nconf = require('nconf');
var fs = require('fs');
var url = require('url');
var path = require('path');
var fork = require('child_process').fork;
var async = require('async');
var logrotate = require('logrotate-stream');
async = require('async'),
logrotate = require('logrotate-stream'),
file = require('./src/file'),
pkg = require('./package.json');
var file = require('./src/file');
var pkg = require('./package.json');
nconf.argv().env().file({
file: path.join(__dirname, '/config.json')
file: path.join(__dirname, 'config.json'),
});
var pidFilePath = __dirname + '/pidfile',
output = logrotate({ file: __dirname + '/logs/output.log', size: '1m', keep: 3, compress: true }),
silent = nconf.get('silent') === 'false' ? false : nconf.get('silent') !== false,
numProcs,
workers = [],
Loader = {
timesStarted: 0
};
var pidFilePath = path.join(__dirname, 'pidfile');
var outputLogFilePath = path.join(__dirname, 'logs/output.log');
var output = logrotate({ file: outputLogFilePath, size: '1m', keep: 3, compress: true });
var silent = nconf.get('silent') === 'false' ? false : nconf.get('silent') !== false;
var numProcs;
var workers = [];
var Loader = {
timesStarted: 0,
};
var appPath = path.join(__dirname, 'app.js');
Loader.init = function (callback) {
if (silent) {
@@ -50,11 +51,10 @@ Loader.displayStartupMessages = function (callback) {
};
Loader.addWorkerEvents = function (worker) {
worker.on('exit', function (code, signal) {
if (code !== 0) {
if (Loader.timesStarted < numProcs * 3) {
Loader.timesStarted++;
Loader.timesStarted += 1;
if (Loader.crashTimer) {
clearTimeout(Loader.crashTimer);
}
@@ -62,7 +62,7 @@ Loader.addWorkerEvents = function (worker) {
Loader.timesStarted = 0;
}, 10000);
} else {
console.log(numProcs * 3 + ' restarts in 10 seconds, most likely an error on startup. Halting.');
console.log((numProcs * 3) + ' restarts in 10 seconds, most likely an error on startup. Halting.');
process.exit();
}
}
@@ -78,13 +78,13 @@ Loader.addWorkerEvents = function (worker) {
worker.on('message', function (message) {
if (message && typeof message === 'object' && message.action) {
switch (message.action) {
case 'restart':
console.log('[cluster] Restarting...');
Loader.restart();
case 'restart':
console.log('[cluster] Restarting...');
Loader.restart();
break;
case 'reload':
console.log('[cluster] Reloading...');
Loader.reload();
case 'reload':
console.log('[cluster] Reloading...');
Loader.reload();
break;
}
}
@@ -95,7 +95,7 @@ Loader.start = function (callback) {
numProcs = getPorts().length;
console.log('Clustering enabled: Spinning up ' + numProcs + ' process(es).\n');
for (var x = 0; x < numProcs; ++x) {
for (var x = 0; x < numProcs; x += 1) {
forkWorker(x, x === 0);
}
@@ -108,17 +108,17 @@ function forkWorker(index, isPrimary) {
var ports = getPorts();
var args = [];
if(!ports[index]) {
if (!ports[index]) {
return console.log('[cluster] invalid port for worker : ' + index + ' ports: ' + ports.length);
}
process.env.isPrimary = isPrimary;
process.env.isCluster = ports.length > 1 ? true : false;
process.env.isCluster = ports.length > 1;
process.env.port = ports[index];
var worker = fork('app.js', args, {
var worker = fork(appPath, args, {
silent: silent,
env: process.env
env: process.env,
});
worker.index = index;
@@ -129,7 +129,7 @@ function forkWorker(index, isPrimary) {
Loader.addWorkerEvents(worker);
if (silent) {
var output = logrotate({ file: __dirname + '/logs/output.log', size: '1m', keep: 3, compress: true });
var output = logrotate({ file: outputLogFilePath, size: '1m', keep: 3, compress: true });
worker.stdout.pipe(output);
worker.stderr.pipe(output);
}
@@ -156,7 +156,7 @@ Loader.restart = function () {
nconf.remove('file');
nconf.use('file', { file: pathToConfig });
fs.readFile(pathToConfig, {encoding: 'utf-8'}, function (err, configFile) {
fs.readFile(pathToConfig, { encoding: 'utf-8' }, function (err, configFile) {
if (err) {
console.log('Error reading config : ' + err.message);
process.exit();
@@ -175,7 +175,7 @@ Loader.restart = function () {
Loader.reload = function () {
workers.forEach(function (worker) {
worker.send({
action: 'reload'
action: 'reload',
});
});
};
@@ -184,7 +184,7 @@ Loader.stop = function () {
killWorkers();
// Clean up the pidfile
fs.unlinkSync(__dirname + '/pidfile');
fs.unlinkSync(pidFilePath);
};
function killWorkers() {
@@ -222,16 +222,16 @@ fs.open(path.join(__dirname, 'config.json'), 'r', function (err) {
require('daemon')({
stdout: process.stdout,
stderr: process.stderr
stderr: process.stderr,
});
fs.writeFile(__dirname + '/pidfile', process.pid);
fs.writeFileSync(pidFilePath, process.pid);
}
async.series([
Loader.init,
Loader.displayStartupMessages,
Loader.start
Loader.start,
], function (err) {
if (err) {
console.log('[loader] Error during startup: ' + err.message);
@@ -239,6 +239,6 @@ fs.open(path.join(__dirname, 'config.json'), 'r', function (err) {
});
} else {
// No config detected, kickstart web installer
var child = require('child_process').fork('app');
require('child_process').fork('app');
}
});

811
nodebb
View File

@@ -1,15 +1,26 @@
#!/usr/bin/env node
'use strict';
var cproc;
var args;
var fs;
var path;
var request;
var semver;
var prompt;
var async;
try {
var colors = require('colors'),
cproc = require('child_process'),
argv = require('minimist')(process.argv.slice(2)),
fs = require('fs'),
path = require('path'),
request = require('request'),
semver = require('semver'),
prompt = require('prompt'),
async = require('async');
require('colors');
cproc = require('child_process');
args = require('minimist')(process.argv.slice(2));
fs = require('fs');
path = require('path');
request = require('request');
semver = require('semver');
prompt = require('prompt');
async = require('async');
} catch (e) {
if (e.code === 'MODULE_NOT_FOUND') {
process.stdout.write('NodeBB could not be started because it\'s dependencies have not been installed.\n');
@@ -21,407 +32,473 @@ try {
}
}
var getRunningPid = function (callback) {
fs.readFile(__dirname + '/pidfile', {
encoding: 'utf-8'
}, function (err, pid) {
if (err) {
return callback(err);
var loaderPath = path.join(__dirname, 'loader.js');
var appPath = path.join(__dirname, 'app.js');
if (args.dev) {
process.env.NODE_ENV = 'development';
}
function getRunningPid(callback) {
fs.readFile(path.join(__dirname, 'pidfile'), {
encoding: 'utf-8',
}, function (err, pid) {
if (err) {
return callback(err);
}
try {
process.kill(parseInt(pid, 10), 0);
callback(null, parseInt(pid, 10));
} catch (e) {
callback(e);
}
});
}
function getCurrentVersion(callback) {
fs.readFile(path.join(__dirname, 'package.json'), { encoding: 'utf-8' }, function (err, pkg) {
if (err) {
return callback(err);
}
try {
pkg = JSON.parse(pkg);
return callback(null, pkg.version);
} catch (err) {
return callback(err);
}
});
}
function fork(args) {
return cproc.fork(appPath, args, {
cwd: __dirname,
silent: false,
});
}
function getInstalledPlugins(callback) {
async.parallel({
files: async.apply(fs.readdir, path.join(__dirname, 'node_modules')),
deps: async.apply(fs.readFile, path.join(__dirname, 'package.json'), { encoding: 'utf-8' }),
}, function (err, payload) {
if (err) {
return callback(err);
}
var isNbbModule = /^nodebb-(?:plugin|theme|widget|rewards)-[\w-]+$/;
var moduleName;
var isGitRepo;
payload.files = payload.files.filter(function (file) {
return isNbbModule.test(file);
});
try {
payload.deps = JSON.parse(payload.deps).dependencies;
payload.bundled = [];
payload.installed = [];
} catch (err) {
return callback(err);
}
for (moduleName in payload.deps) {
if (isNbbModule.test(moduleName)) {
payload.bundled.push(moduleName);
}
}
// Whittle down deps to send back only extraneously installed plugins/themes/etc
payload.files.forEach(function (moduleName) {
try {
fs.accessSync(path.join(__dirname, 'node_modules/' + moduleName, '.git'));
isGitRepo = true;
} catch (e) {
isGitRepo = false;
}
try {
process.kill(parseInt(pid, 10), 0);
callback(null, parseInt(pid, 10));
} catch(e) {
callback(e);
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);
}
});
},
getCurrentVersion = function (callback) {
fs.readFile(path.join(__dirname, 'package.json'), { encoding: 'utf-8' }, function (err, pkg) {
getModuleVersions(payload.installed, callback);
});
}
function getModuleVersions(modules, callback) {
var versionHash = {};
async.eachLimit(modules, 50, function (module, next) {
fs.readFile(path.join(__dirname, 'node_modules/' + module + '/package.json'), { encoding: 'utf-8' }, function (err, pkg) {
if (err) {
return callback(err);
return next(err);
}
try {
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) {
if (err) {
return callback(err);
}
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 = [];
versionHash[module] = pkg.version;
next();
} catch (err) {
return callback(err);
next(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 = {};
}, function (err) {
callback(err, versionHash);
});
}
function checkPlugins(standalone, callback) {
if (standalone) {
process.stdout.write('Checking installed plugins and themes for updates... ');
}
async.eachLimit(modules, 50, function (module, next) {
fs.readFile(path.join(__dirname, 'node_modules/' + module + '/package.json'), { encoding: 'utf-8' }, function (err, pkg) {
async.waterfall([
async.apply(async.parallel, {
plugins: async.apply(getInstalledPlugins),
version: async.apply(getCurrentVersion),
}),
function (payload, next) {
var toCheck = Object.keys(payload.plugins);
if (!toCheck.length) {
process.stdout.write('OK'.green + '\n'.reset);
return next(null, []); // no extraneous plugins installed
}
request({
method: 'GET',
url: 'https://packages.nodebb.org/api/v1/suggest?version=' + payload.version + '&package[]=' + toCheck.join('&package[]='),
json: true,
}, function (err, res, body) {
if (err) {
process.stdout.write('error'.red + '\n'.reset);
return next(err);
}
process.stdout.write('OK'.green + '\n'.reset);
try {
pkg = JSON.parse(pkg);
versionHash[module] = pkg.version;
next();
} catch (err) {
next(err);
if (!Array.isArray(body) && toCheck.length === 1) {
body = [body];
}
var current;
var suggested;
var upgradable = body.map(function (suggestObj) {
current = payload.plugins[suggestObj.package];
suggested = suggestObj.version;
if (suggestObj.code === 'match-found' && semver.gt(suggested, current)) {
return {
name: suggestObj.package,
current: current,
suggested: suggested,
};
}
return null;
}).filter(Boolean);
next(null, upgradable);
});
}, function (err) {
callback(err, versionHash);
});
},
checkPlugins = function (standalone, callback) {
if (standalone) {
process.stdout.write('Checking installed plugins and themes for updates... ');
},
], callback);
}
function upgradePlugins(callback) {
var standalone = false;
if (typeof callback !== 'function') {
callback = function () {};
standalone = true;
}
checkPlugins(standalone, function (err, found) {
if (err) {
process.stdout.write('Warning'.yellow + ': An unexpected error occured when attempting to verify plugin upgradability\n'.reset);
return callback(err);
}
async.waterfall([
async.apply(async.parallel, {
plugins: async.apply(getInstalledPlugins),
version: async.apply(getCurrentVersion)
}),
function (payload, next) {
var toCheck = Object.keys(payload.plugins);
if (!toCheck.length) {
process.stdout.write('OK'.green + '\n'.reset);
return next(null, []); // no extraneous plugins installed
}
request({
method: 'GET',
url: 'https://packages.nodebb.org/api/v1/suggest?version=' + payload.version + '&package[]=' + toCheck.join('&package[]='),
json: true
}, function (err, res, body) {
if (err) {
process.stdout.write('error'.red + '\n'.reset);
return next(err);
}
process.stdout.write('OK'.green + '\n'.reset);
if (!Array.isArray(body) && toCheck.length === 1) {
body = [body];
}
var current, 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);
});
if (found && found.length) {
process.stdout.write('\nA total of ' + String(found.length).bold + ' package(s) can be upgraded:\n');
found.forEach(function (suggestObj) {
process.stdout.write(' * '.yellow + suggestObj.name.reset + ' (' + suggestObj.current.yellow + ' -> '.reset + suggestObj.suggested.green + ')\n'.reset);
});
process.stdout.write('\n');
} else {
if (standalone) {
process.stdout.write('\nAll packages up-to-date!'.green + '\n'.reset);
}
], callback);
},
upgradePlugins = function (callback) {
var standalone = false;
if (typeof callback !== 'function') {
callback = function () {};
standalone = true;
};
return callback();
}
checkPlugins(standalone, function (err, found) {
prompt.message = '';
prompt.delimiter = '';
prompt.start();
prompt.get({
name: 'upgrade',
description: 'Proceed with upgrade (y|n)?'.reset,
type: 'string',
}, function (err, result) {
if (err) {
process.stdout.write('\Warning'.yellow + ': An unexpected error occured when attempting to verify plugin upgradability\n'.reset);
return callback(err);
}
if (found && found.length) {
process.stdout.write('\nA total of ' + String(found.length).bold + ' package(s) can be upgraded:\n');
if (['y', 'Y', 'yes', 'YES'].indexOf(result.upgrade) !== -1) {
process.stdout.write('\nUpgrading packages...');
var args = ['i'];
found.forEach(function (suggestObj) {
process.stdout.write(' * '.yellow + suggestObj.name.reset + ' (' + suggestObj.current.yellow + ' -> '.reset + suggestObj.suggested.green + ')\n'.reset);
args.push(suggestObj.name + '@' + suggestObj.suggested);
});
cproc.execFile((process.platform === 'win32') ? 'npm.cmd' : 'npm', args, { stdio: 'ignore' }, function (err) {
if (!err) {
process.stdout.write(' OK\n'.green);
}
callback(err);
});
process.stdout.write('\n');
} else {
if (standalone) {
process.stdout.write('\nAll packages up-to-date!'.green + '\n'.reset);
}
return callback();
process.stdout.write('\nPackage upgrades skipped'.yellow + '. Check for upgrades at any time by running "'.reset + './nodebb upgrade-plugins'.green + '".\n'.reset);
callback();
}
});
});
}
prompt.message = '';
prompt.delimiter = '';
prompt.start();
prompt.get({
name: 'upgrade',
description: 'Proceed with upgrade (y|n)?'.reset,
type: 'string'
}, function (err, result) {
if (err) {
return callback(err);
}
if (['y', 'Y', 'yes', 'YES'].indexOf(result.upgrade) !== -1) {
process.stdout.write('\nUpgrading packages...');
var args = ['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);
});
var commands = {
status: {
description: 'View the status of the NodeBB server',
usage: 'Usage: ' + './nodebb status'.yellow,
handler: function () {
getRunningPid(function (err, pid) {
if (!err) {
process.stdout.write('\nNodeBB Running '.bold + '(pid '.cyan + pid.toString().cyan + ')\n'.cyan);
process.stdout.write('\t"' + './nodebb stop'.yellow + '" to stop the NodeBB server\n');
process.stdout.write('\t"' + './nodebb log'.yellow + '" to view server output\n');
process.stdout.write('\t"' + './nodebb restart'.yellow + '" to restart NodeBB\n\n');
} else {
process.stdout.write('\nPackage upgrades skipped'.yellow + '. Check for upgrades at any time by running "'.reset + './nodebb upgrade-plugins'.green + '".\n'.reset);
callback();
process.stdout.write('\nNodeBB is not running\n'.bold);
process.stdout.write('\t"' + './nodebb start'.yellow + '" to launch the NodeBB server\n\n'.reset);
}
});
});
};
},
},
start: {
description: 'Start the NodeBB server',
usage: 'Usage: ' + './nodebb start'.yellow,
handler: function () {
process.stdout.write('\nStarting NodeBB\n'.bold);
process.stdout.write(' "' + './nodebb stop'.yellow + '" to stop the NodeBB server\n');
process.stdout.write(' "' + './nodebb log'.yellow + '" to view server output\n');
process.stdout.write(' "' + './nodebb restart'.yellow + '" to restart NodeBB\n\n'.reset);
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);
// Spawn a new NodeBB process
cproc.fork(loaderPath, {
env: process.env,
});
},
},
stop: {
description: 'Stop the NodeBB server',
usage: 'Usage: ' + './nodebb stop'.yellow,
handler: function () {
getRunningPid(function (err, pid) {
if (!err) {
process.kill(pid, 'SIGTERM');
process.stdout.write('Stopping NodeBB. Goodbye!\n');
} else {
process.stdout.write('NodeBB is already stopped.\n');
}
});
},
},
restart: {
description: 'Restart the NodeBB server',
usage: 'Usage: ' + './nodebb restart'.yellow,
handler: function () {
getRunningPid(function (err, pid) {
if (!err) {
process.kill(pid, 'SIGHUP');
process.stdout.write('\nRestarting NodeBB\n'.bold);
} else {
process.stdout.write('NodeBB could not be restarted, as a running instance could not be found.\n');
}
});
},
},
log: {
description: 'Open the output log (useful for debugging)',
usage: 'Usage: ' + './nodebb log'.yellow,
handler: function () {
process.stdout.write('\nHit '.red + 'Ctrl-C '.bold + 'to exit'.red);
process.stdout.write('\n\n'.reset);
cproc.spawn('tail', ['-F', './logs/output.log'], {
cwd: __dirname,
stdio: 'inherit',
});
},
},
slog: {
description: 'Start the NodeBB server and view the live output log',
usage: 'Usage: ' + './nodebb slog'.yellow,
handler: function () {
process.stdout.write('\nStarting NodeBB with logging output\n'.bold);
process.stdout.write('\nHit '.red + 'Ctrl-C '.bold + 'to exit'.red);
process.stdout.write('\n\n'.reset);
// Spawn a new NodeBB process
cproc.fork(loaderPath, {
env: process.env,
});
cproc.spawn('tail', ['-F', './logs/output.log'], {
cwd: __dirname,
stdio: 'inherit',
});
},
},
dev: {
description: 'Start NodeBB in verbose development mode',
usage: 'Usage: ' + './nodebb dev'.yellow,
handler: function () {
process.env.NODE_ENV = 'development';
cproc.fork(loaderPath, ['--no-daemon', '--no-silent'], {
env: process.env,
});
},
},
build: {
description: 'Compile static assets (CSS, Javascript, etc)',
usage: 'Usage: ' + './nodebb build'.yellow + ' [js,clientCSS,acpCSS,tpl,lang]'.red + '\n' +
' e.g. ' + './nodebb build js,tpl'.yellow + '\tbuilds JS and templates\n' +
' ' + './nodebb build'.yellow + '\t\tbuilds all targets\n',
handler: function () {
var arr = ['--build'].concat(process.argv.slice(3));
fork(arr);
},
},
setup: {
description: 'Run the NodeBB setup script',
usage: 'Usage: ' + './nodebb setup'.yellow,
handler: function () {
var arr = ['--setup'].concat(process.argv.slice(3));
fork(arr);
},
},
reset: {
description: 'Disable plugins and restore the default theme',
usage: 'Usage: ' + './nodebb reset '.yellow + '{-t|-p|-w|-s|-a}'.red + '\n' +
' -t <theme>\tuse specified theme\n' +
' -p <plugin>\tdisable specified plugin\n' +
'\n' +
' -t\t\tuse default theme\n' +
' -p\t\tdisable all but core plugins\n' +
' -w\t\twidgets\n' +
' -s\t\tsettings\n' +
' -a\t\tall of the above\n',
handler: function () {
var arr = ['--reset'].concat(process.argv.slice(3));
fork(arr);
},
},
activate: {
description: 'Activate a plugin for the next startup of NodeBB',
usage: 'Usage: ' + './nodebb activate <plugin>'.yellow,
handler: function () {
var name = args._[1];
if (!name) {
process.stdout.write(commands.activate.usage + '\n');
process.exit();
}
});
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 'slog':
process.stdout.write('\nStarting NodeBB with logging output\n'.bold);
process.stdout.write('\nHit '.red + 'Ctrl-C '.bold + 'to exit'.red);
process.stdout.write('\n\n'.reset);
// Spawn a new NodeBB process
cproc.fork(__dirname + '/loader.js', {
env: process.env
});
cproc.spawn('tail', ['-F', './logs/output.log'], {
cwd: __dirname,
stdio: 'inherit'
});
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');
if (name.startsWith('nodebb-theme')) {
fork(['--reset', '-t', name]);
return;
}
});
break;
var arr = ['--activate=' + name].concat(process.argv.slice(4));
fork(arr);
},
},
plugins: {
description: 'List all installed plugins',
usage: 'Usage: ' + './nodebb plugins'.yellow,
handler: function () {
var arr = ['--plugins'].concat(process.argv.slice(3));
fork(arr);
},
},
upgrade: {
description: 'Run NodeBB upgrade scripts, ensure packages are up-to-date',
usage: 'Usage: ' + './nodebb upgrade'.yellow,
handler: function () {
async.series([
function (next) {
process.stdout.write('1. '.bold + 'Bringing base dependencies up to date... '.yellow);
cproc.exec('npm i --production', { cwd: __dirname, stdio: 'ignore' }, next);
},
function (next) {
process.stdout.write('OK\n'.green);
process.stdout.write('2. '.bold + 'Checking installed plugins for updates... '.yellow);
upgradePlugins(next);
},
function (next) {
process.stdout.write('3. '.bold + 'Updating NodeBB data store schema...\n'.yellow);
var arr = ['--upgrade'].concat(process.argv.slice(3));
var upgradeProc = fork(arr);
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');
upgradeProc.on('close', next);
},
], function (err) {
if (err) {
process.stdout.write('\nError'.red + ': ' + err.message + '\n');
} else {
var message = 'NodeBB Upgrade Complete!';
// some consoles will return undefined/zero columns, so just use 2 spaces in upgrade script if we can't get our column count
var columns = process.stdout.columns;
var spaces = columns ? new Array(Math.floor(columns / 2) - (message.length / 2) + 1).join(' ') : ' ';
process.stdout.write('OK\n'.green);
process.stdout.write('\n' + spaces + message.green.bold + '\n\n'.reset);
}
});
},
},
upgradePlugins: {
hidden: true,
description: '',
handler: function () {
upgradePlugins();
},
},
help: {
description: 'Display the help message for a given command',
usage: 'Usage: ' + './nodebb help <command>'.yellow,
handler: function () {
var command = commands[args._[1]];
if (command) {
process.stdout.write(command.description + '\n'.reset);
process.stdout.write(command.usage + '\n'.reset);
return;
}
});
break;
var keys = Object.keys(commands).filter(function (key) {
return !commands[key].hidden;
});
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;
process.stdout.write('\nWelcome to NodeBB\n\n'.bold);
process.stdout.write('Usage: ./nodebb {' + keys.join('|') + '}\n\n');
case 'dev':
process.env.NODE_ENV = 'development';
cproc.fork(__dirname + '/loader.js', ['--no-daemon', '--no-silent'], {
env: process.env
});
break;
var usage = keys.map(function (key) {
var line = '\t' + key.yellow + (key.length < 8 ? '\t\t' : '\t');
return line + commands[key].description;
}).join('\n');
case 'log':
process.stdout.write('\nHit '.red + 'Ctrl-C '.bold + 'to exit'.red);
process.stdout.write('\n\n'.reset);
cproc.spawn('tail', ['-F', './logs/output.log'], {
cwd: __dirname,
stdio: 'inherit'
});
break;
process.stdout.write(usage + '\n'.reset);
},
},
};
case 'build':
var args = process.argv.slice(0);
args[2] = '--' + args[2];
commands['upgrade-plugins'] = commands.upgradePlugins;
fork(args);
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=' + process.argv[3]);
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);
cproc.exec('npm i --production', { cwd: __dirname, stdio: 'ignore' }, next);
},
function (next) {
process.stdout.write('OK\n'.green);
process.stdout.write('2. '.bold + 'Checking installed plugins for updates... '.yellow);
upgradePlugins(next);
},
function (next) {
process.stdout.write('3. '.bold + 'Updating NodeBB data store schema...\n'.yellow);
var 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|slog|stop|reload|restart|log|build|setup|reset|upgrade|dev}\n\n');
process.stdout.write('\t' + 'start'.yellow + '\t\tStart the NodeBB server\n');
process.stdout.write('\t' + 'slog'.yellow + '\t\tStarts the NodeBB server and displays the live output log\n');
process.stdout.write('\t' + 'stop'.yellow + '\t\tStops the NodeBB server\n');
process.stdout.write('\t' + 'reload'.yellow + '\t\tRestarts NodeBB\n');
process.stdout.write('\t' + 'restart'.yellow + '\t\tRestarts NodeBB\n');
process.stdout.write('\t' + 'log'.yellow + '\t\tOpens the logging interface (useful for debugging)\n');
process.stdout.write('\t' + 'build'.yellow + '\t\tCompiles javascript, css stylesheets, and templates\n');
process.stdout.write('\t' + 'setup'.yellow + '\t\tRuns the NodeBB setup script\n');
process.stdout.write('\t' + 'reset'.yellow + '\t\tDisables all plugins, restores the default theme.\n');
process.stdout.write('\t' + 'activate'.yellow + '\tActivates a plugin for the next startup of NodeBB.\n');
process.stdout.write('\t' + 'plugins'.yellow + '\t\tList all plugins that have been installed.\n');
process.stdout.write('\t' + 'upgrade'.yellow + '\t\tRun NodeBB upgrade scripts, ensure packages are up-to-date\n');
process.stdout.write('\t' + 'dev'.yellow + '\t\tStart NodeBB in interactive development mode\n');
process.stdout.write('\n'.reset);
break;
if (!commands[args._[0]]) {
commands.help.handler();
} else {
commands[args._[0]].handler();
}

View File

@@ -2,7 +2,7 @@
"name": "nodebb",
"license": "GPL-3.0",
"description": "NodeBB Forum",
"version": "1.4.3",
"version": "1.4.6",
"homepage": "http://www.nodebb.org",
"repository": {
"type": "git",
@@ -11,16 +11,18 @@
"main": "app.js",
"scripts": {
"start": "node loader.js",
"lint": "eslint --cache .",
"lint": "eslint --cache ./nodebb .",
"pretest": "npm run lint",
"test": "istanbul cover node_modules/mocha/bin/_mocha -- -R dot",
"coveralls": "istanbul cover _mocha --report lcovonly -- -R dot && cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js && rm -rf ./coverage"
},
"dependencies": {
"ace-builds": "^1.2.6",
"async": "~1.5.0",
"autoprefixer": "^6.2.3",
"bcryptjs": "~2.3.0",
"body-parser": "^1.9.0",
"bootstrap": "^3.3.7",
"chart.js": "^2.4.0",
"colors": "^1.1.0",
"compression": "^1.1.0",
@@ -31,11 +33,12 @@
"connect-redis": "~3.1.0",
"cookie-parser": "^1.3.3",
"cron": "^1.0.5",
"cropperjs": "^0.8.1",
"csurf": "^1.6.1",
"daemon": "~1.1.0",
"express": "^4.14.0",
"express-session": "^1.8.2",
"express-useragent": "1.0.4",
"express-useragent": "1.0.7",
"html-to-text": "2.1.3",
"ip": "1.1.3",
"jimp": "0.2.27",
@@ -47,22 +50,22 @@
"mime": "^1.3.4",
"minimist": "^1.1.1",
"mkdirp": "~0.5.0",
"mongodb": "2.2.16",
"mongodb": "2.2.25",
"morgan": "^1.3.2",
"mousetrap": "^1.5.3",
"nconf": "~0.8.2",
"nodebb-plugin-composer-default": "4.3.8",
"nodebb-plugin-composer-default": "4.4.6",
"nodebb-plugin-dbsearch": "1.0.5",
"nodebb-plugin-emoji-extended": "1.1.1",
"nodebb-plugin-emoji-one": "1.1.5",
"nodebb-plugin-markdown": "7.0.3",
"nodebb-plugin-markdown": "7.1.1",
"nodebb-plugin-mentions": "1.1.3",
"nodebb-plugin-soundpack-default": "0.1.6",
"nodebb-plugin-spam-be-gone": "0.4.10",
"nodebb-plugin-soundpack-default": "1.0.0",
"nodebb-plugin-spam-be-gone": "0.4.13",
"nodebb-rewards-essentials": "0.0.9",
"nodebb-theme-lavender": "3.0.15",
"nodebb-theme-persona": "4.1.95",
"nodebb-theme-vanilla": "5.1.59",
"nodebb-theme-lavender": "4.0.0",
"nodebb-theme-persona": "4.2.10",
"nodebb-theme-vanilla": "5.2.1",
"nodebb-widget-essentials": "2.0.13",
"nodemailer": "2.6.4",
"nodemailer-sendmail-transport": "1.0.0",
@@ -86,22 +89,22 @@
"socket.io-redis": "3.1.0",
"socketio-wildcard": "~0.3.0",
"string": "^3.0.0",
"templates.js": "0.3.6",
"templates.js": "0.3.10",
"toobusy-js": "^0.5.1",
"uglify-js": "^2.6.0",
"underscore": "^1.8.3",
"underscore.deep": "^0.5.1",
"validator": "^6.1.0",
"winston": "^2.1.0",
"xregexp": "~3.1.0"
"xml": "^1.0.1",
"xregexp": "~3.1.0",
"zxcvbn": "^4.4.2"
},
"devDependencies": {
"coveralls": "^2.11.14",
"eslint": "^3.12.0",
"eslint-config-airbnb": "^13.0.0",
"eslint-plugin-import": "^2.0.0",
"eslint-plugin-jsx-a11y": "^2.2.3",
"eslint-plugin-react": "^6.8.0",
"eslint-config-airbnb-base": "^11.1.0",
"eslint-plugin-import": "^2.2.0",
"grunt": "~1.0.0",
"grunt-contrib-watch": "^1.0.0",
"istanbul": "^0.4.2",

58
public/.eslintrc Normal file
View File

@@ -0,0 +1,58 @@
{
"globals": {
"app": true,
"io": true,
"socket": true,
"ajaxify": true,
"config": true,
"RELATIVE_PATH": true,
"utils": true,
"overrides": true,
"componentHandler": true,
"bootbox": true,
"templates": true,
"Visibility": true,
"Tinycon": true,
"Promise": true
},
"env": {
"jquery": true,
"amd": true,
"browser": true,
"es6": false
},
"rules": {
"no-dupe-class-members": "off",
"no-var": "off",
"object-shorthand": "off",
"prefer-arrow-callback": "off",
"prefer-spread": "off",
"prefer-reflect": "off",
"prefer-template": "off"
},
"parserOptions": {
"ecmaVersion": 5,
"ecmaFeatures": {
"arrowFunctions": false,
"classes": false,
"defaultParams": false,
"destructuring": false,
"experimentalObjectRestSpread": false,
"blockBindings": false,
"forOf": false,
"generators": false,
"globalReturn": false,
"jsx": false,
"modules": false,
"objectLiteralComputedProperties": false,
"objectLiteralDuplicateProperties": false,
"objectLiteralShorthandMethods": false,
"objectLiteralShorthandProperties": false,
"impliedStrict": false,
"restParams": false,
"spread": false,
"superInFunctions": false,
"templateStrings": false
}
}
}

84
public/.jshintrc Normal file
View File

@@ -0,0 +1,84 @@
{
"maxerr" : 50, // {int} Maximum error before stopping
// Enforcing
"bitwise" : true, // true: Prohibit bitwise operators (&, |, ^, etc.)
"camelcase" : false, // true: Identifiers must be in camelCase
"curly" : true, // true: Require {} for every new block or scope
"eqeqeq" : true, // true: Require triple equals (===) for comparison
"forin" : true, // true: Require filtering for..in loops with obj.hasOwnProperty()
"immed" : false, // true: Require immediate invocations to be wrapped in parens e.g. `(function () { } ());`
"indent" : 4, // {int} Number of spaces to use for indentation
"latedef" : false, // true: Require variables/functions to be defined before being used
"newcap" : false, // true: Require capitalization of all constructor functions e.g. `new F()`
"noarg" : true, // true: Prohibit use of `arguments.caller` and `arguments.callee`
"noempty" : true, // true: Prohibit use of empty blocks
"nonew" : false, // true: Prohibit use of constructors for side-effects (without assignment)
"plusplus" : false, // true: Prohibit use of `++` & `--`
"quotmark" : false, // Quotation mark consistency:
// false : do nothing (default)
// true : ensure whatever is used is consistent
// "single" : require single quotes
// "double" : require double quotes
"undef" : true, // true: Require all non-global variables to be declared (prevents global leaks)
"unused" : true, // true: Require all defined variables be used
"strict" : true, // true: Requires all functions run in ES5 Strict Mode
"trailing" : false, // true: Prohibit trailing whitespaces
"maxparams" : false, // {int} Max number of formal params allowed per function
"maxdepth" : false, // {int} Max depth of nested blocks (within functions)
"maxstatements" : false, // {int} Max number statements per function
"maxcomplexity" : false, // {int} Max cyclomatic complexity per function
"maxlen" : false, // {int} Max number of characters per line
// Relaxing
"asi" : false, // true: Tolerate Automatic Semicolon Insertion (no semicolons)
"boss" : false, // true: Tolerate assignments where comparisons would be expected
"debug" : false, // true: Allow debugger statements e.g. browser breakpoints.
"eqnull" : false, // true: Tolerate use of `== null`
"es5" : false, // true: Allow ES5 syntax (ex: getters and setters)
"esnext" : false, // true: Allow ES.next (ES6) syntax (ex: `const`)
"moz" : false, // true: Allow Mozilla specific syntax (extends and overrides esnext features)
// (ex: `for each`, multiple try/catch, function expression…)
"evil" : false, // true: Tolerate use of `eval` and `new Function()`
"expr" : false, // true: Tolerate `ExpressionStatement` as Programs
"funcscope" : false, // true: Tolerate defining variables inside control statements"
"globalstrict" : false, // true: Allow global "use strict" (also enables 'strict')
"iterator" : false, // true: Tolerate using the `__iterator__` property
"lastsemic" : false, // true: Tolerate omitting a semicolon for the last statement of a 1-line block
"laxbreak" : false, // true: Tolerate possibly unsafe line breakings
"laxcomma" : false, // true: Tolerate comma-first style coding
"loopfunc" : false, // true: Tolerate functions being defined in loops
"multistr" : false, // true: Tolerate multi-line strings
"proto" : false, // true: Tolerate using the `__proto__` property
"scripturl" : false, // true: Tolerate script-targeted URLs
"smarttabs" : false, // true: Tolerate mixed tabs/spaces when used for alignment
"shadow" : false, // true: Allows re-define variables later in code e.g. `var x=1; x=2;`
"sub" : false, // true: Tolerate using `[]` notation when it can still be expressed in dot notation
"supernew" : false, // true: Tolerate `new function () { ... };` and `new Object;`
"validthis" : false, // true: Tolerate using this in a non-constructor function
"globals": {
"app": true,
"io": true,
"socket": true,
"ajaxify": true,
"config": true,
"RELATIVE_PATH": true,
"utils": true,
"overrides": true,
"componentHandler": true,
"bootbox": true,
"templates": true,
"Visibility": true,
"Tinycon": true,
"require": true,
"define": true,
"ace": true,
"Sortable": true,
"Slideout": true,
"NProgress": true
},
"jquery": true,
"browser": true
}

View File

@@ -8,7 +8,7 @@
"clear-error-log": "Clear Error Log",
"route": "Route",
"count": "Count",
"no-routes-not-found": "Hooray! There are no routes that were not found.",
"no-routes-not-found": "Hooray! No 404 errors!",
"clear404-confirm": "Are you sure you wish to clear the 404 error logs?",
"clear404-success": "\"404 Not Found\" errors cleared"
}

View File

@@ -2,6 +2,9 @@
"forum-traffic": "Forum Traffic",
"page-views": "Page Views",
"unique-visitors": "Unique Visitors",
"users": "Users",
"posts": "Posts",
"topics": "Topics",
"page-views-last-month": "Page views Last Month",
"page-views-this-month": "Page views This Month",
"page-views-last-day": "Page views in last 24 hours",
@@ -18,8 +21,14 @@
"upgrade-available": "<p>A new version (v%1) has been released. Consider <a href=\"https://docs.nodebb.org/en/latest/upgrading/index.html\">upgrading your NodeBB</a>.</p>",
"prerelease-upgrade-available": "<p>This is an outdated pre-release version of NodeBB. A new version (v%1) has been released. Consider <a href=\"https://docs.nodebb.org/en/latest/upgrading/index.html\">upgrading your NodeBB</a>.</p>",
"prerelease-warning": "<p>This is a <strong>pre-release</strong> version of NodeBB. Unintended bugs may occur. <i class=\"fa fa-exclamation-triangle\"></i></p>",
"running-in-development": "<span>Forum is running in development mode. The forum may be open to potential vulnerabilities; please contact your system administrator.</span>",
"notices": "Notices",
"restart-not-required": "Restart not required",
"restart-required": "Restart required",
"search-plugin-installed": "Search Plugin installed",
"search-plugin-not-installed": "Search Plugin not installed",
"search-plugin-tooltip": "Install a search plugin from the plugin page in order to activate search functionality",
"control-panel": "System Control",
"reload": "Reload",
@@ -52,4 +61,4 @@
"graphs.unique-visitors": "Unique Visitors",
"graphs.registered-users": "Registered Users",
"graphs.anonymous-users": "Anonymous Users"
}
}

View File

@@ -13,7 +13,6 @@
"manage/users": "Users",
"manage/registration": "Registration Queue",
"manage/groups": "Groups",
"manage/flags": "Flags",
"manage/ip-blacklist": "IP Blacklist",
"section-settings": "Settings",

View File

@@ -26,5 +26,7 @@
"touch-icon.upload": "Upload",
"touch-icon.help": "Recommended size and format: 192x192, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.",
"outgoing-links": "Outgoing Links",
"outgoing-links.warning-page": "Use Outgoing Links Warning Page"
"outgoing-links.warning-page": "Use Outgoing Links Warning Page",
"search-default-sort-by": "Search default sort by",
"outgoing-links.whitelist": "Domains to whitelist for bypassing the warning page"
}

View File

@@ -2,6 +2,7 @@
"reputation": "Reputation Settings",
"disable": "Disable Reputation System",
"disable-down-voting": "Disable Down Voting",
"votes-are-public": "All Votes Are Public",
"thresholds": "Activity Thresholds",
"min-rep-downvote": "Minimum reputation to downvote posts",
"min-rep-flag": "Minimum reputation to flag posts"

View File

@@ -9,7 +9,7 @@
"allow-topic-thumbnails": "Allow users to upload topic thumbnails",
"topic-thumb-size": "Topic Thumb Size",
"allowed-file-extensions": "Allowed File Extensions",
"allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. <code>pdf,xls,doc</code>).\n\t\t\t\t\tAn empty list means all extensions are allowed.",
"allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. <code>pdf,xls,doc</code>). An empty list means all extensions are allowed.",
"profile-avatars": "Profile Avatars",
"allow-profile-image-uploads": "Allow users to upload profile images",
"convert-profile-image-png": "Convert profile image uploads to PNG",
@@ -25,4 +25,4 @@
"profile-covers": "Profile Covers",
"default-covers": "Default Cover Images",
"default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image"
}
}

View File

@@ -27,6 +27,7 @@
"details.disableJoinRequests": "Disable join requests",
"details.grant": "منح/سحب المِلكية",
"details.kick": "طرد",
"details.kick_confirm": "Are you sure you want to remove this member from the group?",
"details.owner_options": "إدارة المجموعة",
"details.group_name": "اسم المجموعة",
"details.member_count": "عدد اﻷعضاء",

View File

@@ -10,6 +10,15 @@
"return_to": "عودة إى %1",
"new_notification": "تنبيه جديد",
"you_have_unread_notifications": "لديك تنبيهات غير مقروءة.",
"all": "All",
"topics": "Topics",
"replies": "Replies",
"chat": "Chats",
"follows": "Follows",
"upvote": "Upvotes",
"new-flags": "New Flags",
"my-flags": "Flags assigned to me",
"bans": "Bans",
"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>.",
@@ -19,6 +28,9 @@
"user_flagged_post_in": "<strong>%1</strong> أشعَرَ بمشاركة مخلة في <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_flagged_user": "<strong>%1</strong> flagged a user profile (%2)",
"user_flagged_user_dual": "<strong>%1</strong> and <strong>%2</strong> flagged a user profile (%3)",
"user_flagged_user_multiple": "<strong>%1</strong> and %2 others flagged a user profile (%3)",
"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>",
@@ -28,6 +40,7 @@
"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.",
"flag_assigned_to_you": "<strong>Flag %1</strong> has been assigned to you",
"email-confirmed": "تم التحقق من عنوان البريد الإلكتروني",
"email-confirmed-message": "شكرًا على إثبات صحة عنوان بريدك الإلكتروني. صار حسابك مفعلًا بالكامل.",
"email-confirm-error-message": "حدث خطأ أثناء التحقق من عنوان بريدك الإلكتروني. ربما رمز التفعيل خاطئ أو انتهت صلاحيته.",

View File

@@ -6,7 +6,7 @@
"popular-month": "المواضيع الشائعة هذا الشهر",
"popular-alltime": "المواضيع الشائعة منذ القدم",
"recent": "المواضيع الحديثة",
"flagged-posts": "Flagged Posts",
"flagged-content": "Flagged Content",
"ip-blacklist": "IP Blacklist",
"users/online": "اﻷعضاء المتصلون",
"users/latest": "أحدث اﻷعضاء",
@@ -27,6 +27,8 @@
"group": "%1 مجموعة",
"chats": "محادثات",
"chat": "Chatting with %1",
"flags": "Flags",
"flag-details": "Flag %1 Details",
"account/edit": "Editing \"%1\"",
"account/edit/password": "Editing password of \"%1\"",
"account/edit/username": "Editing username of \"%1\"",

View File

@@ -12,6 +12,7 @@
"reply-count": "عدد المشاركات",
"at-least": "على اﻷقل",
"at-most": "على اﻷكثر",
"relevance": "Relevance",
"post-time": "تاريخ المشاركة",
"newer-than": "أحدث من",
"older-than": "أقدم من",

View File

@@ -13,7 +13,8 @@
"notify_me": "تلق تنبيهات بالردود الجديدة في هذا الموضوع",
"quote": "اقتبس",
"reply": "رد",
"replies_to_this_post": "Replies: %1",
"replies_to_this_post": "%1 Replies",
"last_reply_time": "Last reply",
"reply-as-topic": "رد بموضوع",
"guest-login-reply": "يجب عليك تسجيل الدخول للرد",
"edit": "تعديل",
@@ -25,28 +26,11 @@
"link": "رابط",
"share": "نشر",
"tools": "أدوات",
"flag": "تبليغ",
"locked": "مقفل",
"pinned": "مثبت",
"moved": "منقول",
"bookmark_instructions": "اضغط هنا للعودة لأخر مشاركة مقروءة في الموضوع",
"flag_title": "إشعار بمشاركة مخلة.",
"flag_success": "تم الإشعار بهذه المشاركة على أنها مخلة",
"flag_manage_title": "Flagged post in %1",
"flag_manage_history": "Action History",
"flag_manage_no_history": "No event history to report",
"flag_manage_assignee": "Assignee",
"flag_manage_state": "State",
"flag_manage_state_open": "New/Open",
"flag_manage_state_wip": "Work in Progress",
"flag_manage_state_resolved": "Resolved",
"flag_manage_state_rejected": "Rejected",
"flag_manage_notes": "Shared Notes",
"flag_manage_update": "Update Flag Status",
"flag_manage_history_assignee": "Assigned to %1",
"flag_manage_history_state": "Updated state to %1",
"flag_manage_history_notes": "Updated flag notes",
"flag_manage_saved": "Flag Details Updated",
"deleted_message": "هذه المشاركة محذوفة. فقط من لهم صلاحية الإشراف على ا لمشاركات يمكنهم معاينتها.",
"following_topic.message": "ستستلم تنبيها عند كل مشاركة جديدة في هذا الموضوع.",
"not_following_topic.message": "You will see this topic in the unread topics list, but you will not receive notifications when somebody posts to this topic.",
@@ -131,8 +115,5 @@
"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": "موضوع جديد",
"stale.reply_anyway": "الرد على هذا الموضوع ",
"link_back": "رد: [%1](%2)",
"spam": "سبام",
"offensive": "مسيئ",
"custom-flag-reason": "أدخل سبب التبليغ"
"link_back": "رد: [%1](%2)"
}

View File

@@ -33,6 +33,7 @@
"chat": "محادثة",
"chat_with": "Continue chat with %1",
"new_chat_with": "Start new chat with %1",
"flag-profile": "Flag Profile",
"follow": "تابع",
"unfollow": "إلغاء المتابعة",
"more": "المزيد",
@@ -64,6 +65,8 @@
"remove_uploaded_picture": "Remove Uploaded Picture",
"upload_cover_picture": "Upload cover picture",
"remove_cover_picture_confirm": "Are you sure you want to remove the cover picture?",
"crop_picture": "Crop picture",
"upload_cropped_picture": "Crop and upload",
"settings": "خيارات",
"show_email": "أظهر بريدي الإلكتروني",
"show_fullname": "أظهر اسمي الكامل",
@@ -127,5 +130,6 @@
"info.username-history": "Username History",
"info.email-history": "Email History",
"info.moderation-note": "Moderation Note",
"info.moderation-note.success": "Moderation note saved"
"info.moderation-note.success": "Moderation note saved",
"info.moderation-note.add": "Add note"
}

View File

@@ -8,7 +8,7 @@
"clear-error-log": "Изчистване на журнала за грешки",
"route": "Маршрут",
"count": "Брой",
"no-routes-not-found": "Ура! Няма неоткрити маршрути.",
"no-routes-not-found": "Ура! Няма грешки от вида „404“!",
"clear404-confirm": "Наистина ли искате да изчистите журналите за грешки от вида 404?",
"clear404-success": "Грешките от вида „Страницата не е намерена (Грешка 404)“ бяха изчистени."
}

View File

@@ -2,6 +2,9 @@
"forum-traffic": "Трафик на форума",
"page-views": "Преглеждания на страниците",
"unique-visitors": "Уникални посетители",
"users": "Потребители",
"posts": "Публикации",
"topics": "Теми",
"page-views-last-month": "Преглеждания на страниците през последния месец",
"page-views-this-month": "Преглеждания на страниците този месец",
"page-views-last-day": "Преглеждания на страниците през последните 24 часа",
@@ -18,8 +21,14 @@
"upgrade-available": "<p>Има нова версия (версия %1). Ако имате възможност, <a href=\"https://docs.nodebb.org/en/latest/upgrading/index.html\">обновете NodeBB</a>.</p>",
"prerelease-upgrade-available": "<p>Това е остаряла версия за предварителен преглед на NodeBB. Има нова версия (версия %1). Ако имате възможност, <a href=\"https://docs.nodebb.org/en/latest/upgrading/index.html\">обновете NodeBB</a>.</p>",
"prerelease-warning": "<p>Това е версия за <strong>предварителен преглед</strong> на NodeBB. Възможно е да има неочаквани неизправности. <i class=\"fa fa-exclamation-triangle\"></i></p>",
"running-in-development": "<span>Форумът работи в режим за разработчици, така че може да бъде уязвим. Моля, свържете се със системния си администратор.</span>",
"notices": "Забележки",
"restart-not-required": "Не се изисква рестартиране",
"restart-required": "Изисква се рестартиране",
"search-plugin-installed": "Добавката за търсене е инсталирана",
"search-plugin-not-installed": "Добавката за търсене не е инсталирана",
"search-plugin-tooltip": "Инсталирайте добавка за търсене от страницата с добавките, за да включите функционалността за търсене",
"control-panel": "Системен контрол",
"reload": "Презареждане",
@@ -52,4 +61,4 @@
"graphs.unique-visitors": "Уникални посетители",
"graphs.registered-users": "Регистрирани потребители",
"graphs.anonymous-users": "Анонимни потребители"
}
}

View File

@@ -59,7 +59,7 @@
"alert.copy-success": "Настройките са копирани!",
"alert.set-parent-category": "Задаване на базова категория",
"alert.updated": "Обновени категории",
"alert.updated-success": "Category IDs %1 successfully updated.",
"alert.updated-success": "Категориите с идентификатори %1 са обновени успешно.",
"alert.upload-image": "Качване на изображение за категорията",
"alert.find-user": "Търсене на потребител",
"alert.user-search": "Потърсете потребител тук…",

View File

@@ -13,7 +13,6 @@
"manage/users": "Потребители",
"manage/registration": "Регистрационна опашка",
"manage/groups": "Групи",
"manage/flags": "Доклади",
"manage/ip-blacklist": "Черен списък за IP адреси",
"section-settings": "Настройки",

View File

@@ -26,5 +26,7 @@
"touch-icon.upload": "Качване",
"touch-icon.help": "Препоръчителен размер и формат: 192x192, само във формат „PNG“. Ако не е посочена иконка за начален екран на мобилно устройство, NodeBB ще използва иконката на уеб сайта.",
"outgoing-links": "Изходящи връзки",
"outgoing-links.warning-page": "Показване на предупредителна страница при щракване върху външни връзки"
"outgoing-links.warning-page": "Показване на предупредителна страница при щракване върху външни връзки",
"search-default-sort-by": "Подредба по подразбиране при търсене",
"outgoing-links.whitelist": "Домейни, за които да не се показва предупредителната страница"
}

View File

@@ -2,6 +2,7 @@
"reputation": "Настройки за репутацията",
"disable": "Изключване на системата за репутация",
"disable-down-voting": "Забрана на отрицателното гласуване",
"votes-are-public": "Всички гласувания са публични",
"thresholds": "Ограничения на дейността",
"min-rep-downvote": "Минимална репутация, необходима за отрицателно гласуване за публикации",
"min-rep-flag": "Минимална репутация, необходима за докладване на публикации"

View File

@@ -9,7 +9,7 @@
"allow-topic-thumbnails": "Позволяване на потребителите да качват миниатюрни изображения за темите",
"topic-thumb-size": "Размер на миниатюрите за темите",
"allowed-file-extensions": "Разрешени файлови разширения",
"allowed-file-extensions-help": "Въведете файловите разширения тук, разделени със запетаи (напр. <code>pdf,xls,doc</code>).\n\\t\\t\\t\\t\\tАко списъкът е празен, всички файлови разширения ще бъдат разрешени.",
"allowed-file-extensions-help": "Въведете файловите разширения, разделени със запетаи (пример: <code>pdf,xls,doc</code>). Ако списъкът е празен, всички файлови разширения ще бъдат разрешени.",
"profile-avatars": "Профилни изображения",
"allow-profile-image-uploads": "Позволяване на потребителите да качват профилни изображения",
"convert-profile-image-png": "Превръщане на качените профилни изображения във формата „PNG“",
@@ -25,4 +25,4 @@
"profile-covers": "Корици на профила",
"default-covers": "Стандартни изображения за корицата",
"default-covers-help": "Добавете стандартни изображения на корицата (разделени със запетаи) за акаунтите, които нямат качено такова."
}
}

View File

@@ -27,6 +27,7 @@
"details.disableJoinRequests": "Забраняване на заявките за присъединяване",
"details.grant": "Даване/отнемане на собственост",
"details.kick": "Изгонване",
"details.kick_confirm": "Наистина ли искате да премахнете този член на групата?",
"details.owner_options": "Администрация на групата",
"details.group_name": "Име на групата",
"details.member_count": "Брой на членовете",

View File

@@ -10,6 +10,15 @@
"return_to": "Връщане към %1",
"new_notification": "Ново известие",
"you_have_unread_notifications": "Имате непрочетени известия",
"all": "Всички",
"topics": "Теми",
"replies": "Отговори",
"chat": "Разговори",
"follows": "Следвания",
"upvote": "Положителни гласове",
"new-flags": "Нови докладвания",
"my-flags": "Докладвания, назначени на мен",
"bans": "Блокирания",
"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>.",
@@ -19,6 +28,9 @@
"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_flagged_user": "<strong>%1</strong> докладва потребителски профил (%2)",
"user_flagged_user_dual": "<strong>%1</strong> и <strong>%2</strong> докладваха потребителски профил (%3)",
"user_flagged_user_multiple": "<strong>%1</strong> и още %2 потребители докладваха потребителски профил (%3)",
"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>",
@@ -28,6 +40,7 @@
"user_started_following_you_multiple": "<strong>%1</strong> и %2 започнаха да Ви следват.",
"new_register": "<strong>%1</strong> изпрати заявка за регистрация.",
"new_register_multiple": "Има <strong>%1</strong> заявки за регистрация, които очакват да бъдат прегледани.",
"flag_assigned_to_you": "<strong>Докладът %1</strong> беше назначен на Вас",
"email-confirmed": "Е-пощата беше потвърдена",
"email-confirmed-message": "Благодарим Ви, че потвърдихте е-пощата си. Акаунтът Ви е вече напълно активиран.",
"email-confirm-error-message": "Възникна проблем при потвърждаването на е-пощата Ви. Може кодът да е грешен или давността му да е изтекла.",

View File

@@ -6,7 +6,7 @@
"popular-month": "Популярните теми този месец",
"popular-alltime": "Популярните теми за всички времена",
"recent": "Скорошни теми",
"flagged-posts": "Докладвани публикации",
"flagged-content": "Докладвано съдържание",
"ip-blacklist": "Черен списък за IP адреси",
"users/online": "Потребители на линия",
"users/latest": "Последни потребители",
@@ -27,6 +27,8 @@
"group": "Група %1",
"chats": "Разговори",
"chat": "Разговаря с %1",
"flags": "Доклади",
"flag-details": "Подробности за доклад %1",
"account/edit": "Редактиране на „%1“",
"account/edit/password": "Редактиране на паролата на „%1“",
"account/edit/username": "Редактиране на потребителското име на „%1“",

View File

@@ -12,6 +12,7 @@
"reply-count": "Брой на отговорите",
"at-least": "Поне",
"at-most": "Най-много",
"relevance": "Уместност",
"post-time": "Време на публикуване",
"newer-than": "По-нови от",
"older-than": "По-стари от",

View File

@@ -13,7 +13,8 @@
"notify_me": "Получавайте известия за новите отговори в тази тема",
"quote": "Цитат",
"reply": "Отговор",
"replies_to_this_post": "Отговори: %1",
"replies_to_this_post": "%1 отговора",
"last_reply_time": "Последен отговор",
"reply-as-topic": "Отговор в нова тема",
"guest-login-reply": "Впишете се, за да отговорите",
"edit": "Редактиране",
@@ -25,28 +26,11 @@
"link": "Връзка",
"share": "Споделяне",
"tools": "Инструменти",
"flag": "Докладване",
"locked": "Заключена",
"pinned": "Закачена",
"moved": "Преместена",
"bookmark_instructions": "Щракнете тук, за да се върнете към последно прочетената публикация в тази тема.",
"flag_title": "Докладване на тази публикация до модератор",
"flag_success": "Тази публикация е била докладвана до модератор.",
"flag_manage_title": "Докладвана публикация в %1",
"flag_manage_history": "История на дейността",
"flag_manage_no_history": "Няма история на събитията",
"flag_manage_assignee": "Назначен",
"flag_manage_state": "Състояние",
"flag_manage_state_open": "Нов/отворен",
"flag_manage_state_wip": "В процес на работа",
"flag_manage_state_resolved": "Разрешен",
"flag_manage_state_rejected": "Отхвърлен",
"flag_manage_notes": "Споделени бележки",
"flag_manage_update": "Обновяване на състоянието на доклада",
"flag_manage_history_assignee": "Разпределен на %1",
"flag_manage_history_state": "Състоянието е променено на „%1“",
"flag_manage_history_notes": "Бележките към доклада са обновени",
"flag_manage_saved": "Подробностите за доклада са обновени",
"deleted_message": "Темата е изтрита. Само потребители с права за управление на темите могат да я видят.",
"following_topic.message": "Вече ще получавате известия когато някой публикува коментар в тази тема.",
"not_following_topic.message": "Ще виждате тази тема в списъка с непрочетени теми, но няма да получавате известия, когато хората публикуват нещо в нея.",
@@ -131,8 +115,5 @@
"stale.warning": "Темата, в която отговаряте, е доста стара. Искате ли вместо това да създадете нова и да направите препратка към тази в отговора си?",
"stale.create": "Създаване на нова тема",
"stale.reply_anyway": "Отговаряне в тази тема въпреки това",
"link_back": "Отговор: [%1](%2)",
"spam": "Спам",
"offensive": "Обидно",
"custom-flag-reason": "Изберете причина за докладване"
"link_back": "Отговор: [%1](%2)"
}

View File

@@ -33,6 +33,7 @@
"chat": "Разговор",
"chat_with": "Продължаване на разговора с %1",
"new_chat_with": "Започване на нов разговор с %1",
"flag-profile": "Докладване на профила",
"follow": "Следване",
"unfollow": "Спиране на следването",
"more": "Още",
@@ -64,6 +65,8 @@
"remove_uploaded_picture": "Премахване на качената снимка",
"upload_cover_picture": "Качване на снимка на корицата",
"remove_cover_picture_confirm": "Наистина ли искате да премахнете снимката на корицата?",
"crop_picture": "Орязване на снимката",
"upload_cropped_picture": "Орязване и качване",
"settings": "Настройки",
"show_email": "Да се показва е-пощата ми",
"show_fullname": "Да се показва цялото ми име",
@@ -127,5 +130,6 @@
"info.username-history": "История на потребителските имена",
"info.email-history": "Историята на е-пощите",
"info.moderation-note": "Модераторска бележка",
"info.moderation-note.success": "Модераторската бележка е запазена"
"info.moderation-note.success": "Модераторската бележка е запазена",
"info.moderation-note.add": "Добавяне на бележка"
}

View File

@@ -8,7 +8,7 @@
"clear-error-log": "Clear Error Log",
"route": "Route",
"count": "Count",
"no-routes-not-found": "Hooray! There are no routes that were not found.",
"no-routes-not-found": "Hooray! No 404 errors!",
"clear404-confirm": "Are you sure you wish to clear the 404 error logs?",
"clear404-success": "\"404 Not Found\" errors cleared"
}

View File

@@ -2,6 +2,9 @@
"forum-traffic": "Forum Traffic",
"page-views": "Page Views",
"unique-visitors": "Unique Visitors",
"users": "Users",
"posts": "Posts",
"topics": "Topics",
"page-views-last-month": "Page views Last Month",
"page-views-this-month": "Page views This Month",
"page-views-last-day": "Page views in last 24 hours",
@@ -18,8 +21,14 @@
"upgrade-available": "<p>A new version (v%1) has been released. Consider <a href=\"https://docs.nodebb.org/en/latest/upgrading/index.html\">upgrading your NodeBB</a>.</p>",
"prerelease-upgrade-available": "<p>This is an outdated pre-release version of NodeBB. A new version (v%1) has been released. Consider <a href=\"https://docs.nodebb.org/en/latest/upgrading/index.html\">upgrading your NodeBB</a>.</p>",
"prerelease-warning": "<p>This is a <strong>pre-release</strong> version of NodeBB. Unintended bugs may occur. <i class=\"fa fa-exclamation-triangle\"></i></p>",
"running-in-development": "<span>Forum is running in development mode. The forum may be open to potential vulnerabilities; please contact your system administrator.</span>",
"notices": "Notices",
"restart-not-required": "Restart not required",
"restart-required": "Restart required",
"search-plugin-installed": "Search Plugin installed",
"search-plugin-not-installed": "Search Plugin not installed",
"search-plugin-tooltip": "Install a search plugin from the plugin page in order to activate search functionality",
"control-panel": "System Control",
"reload": "Reload",
@@ -52,4 +61,4 @@
"graphs.unique-visitors": "Unique Visitors",
"graphs.registered-users": "Registered Users",
"graphs.anonymous-users": "Anonymous Users"
}
}

View File

@@ -13,7 +13,6 @@
"manage/users": "Users",
"manage/registration": "Registration Queue",
"manage/groups": "Groups",
"manage/flags": "Flags",
"manage/ip-blacklist": "IP Blacklist",
"section-settings": "Settings",

View File

@@ -26,5 +26,7 @@
"touch-icon.upload": "Upload",
"touch-icon.help": "Recommended size and format: 192x192, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.",
"outgoing-links": "Outgoing Links",
"outgoing-links.warning-page": "Use Outgoing Links Warning Page"
"outgoing-links.warning-page": "Use Outgoing Links Warning Page",
"search-default-sort-by": "Search default sort by",
"outgoing-links.whitelist": "Domains to whitelist for bypassing the warning page"
}

View File

@@ -2,6 +2,7 @@
"reputation": "Reputation Settings",
"disable": "Disable Reputation System",
"disable-down-voting": "Disable Down Voting",
"votes-are-public": "All Votes Are Public",
"thresholds": "Activity Thresholds",
"min-rep-downvote": "Minimum reputation to downvote posts",
"min-rep-flag": "Minimum reputation to flag posts"

View File

@@ -9,7 +9,7 @@
"allow-topic-thumbnails": "Allow users to upload topic thumbnails",
"topic-thumb-size": "Topic Thumb Size",
"allowed-file-extensions": "Allowed File Extensions",
"allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. <code>pdf,xls,doc</code>).\n\t\t\t\t\tAn empty list means all extensions are allowed.",
"allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. <code>pdf,xls,doc</code>). An empty list means all extensions are allowed.",
"profile-avatars": "Profile Avatars",
"allow-profile-image-uploads": "Allow users to upload profile images",
"convert-profile-image-png": "Convert profile image uploads to PNG",
@@ -25,4 +25,4 @@
"profile-covers": "Profile Covers",
"default-covers": "Default Cover Images",
"default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image"
}
}

View File

@@ -27,6 +27,7 @@
"details.disableJoinRequests": "Disable join requests",
"details.grant": "Grant/Rescind Ownership",
"details.kick": "Kick",
"details.kick_confirm": "Are you sure you want to remove this member from the group?",
"details.owner_options": "Group Administration",
"details.group_name": "Group Name",
"details.member_count": "Member Count",

View File

@@ -10,6 +10,15 @@
"return_to": "%1 এ ফেরত যান",
"new_notification": "নতুন বিজ্ঞপ্তি",
"you_have_unread_notifications": "আপনার অপঠিত বিজ্ঞপ্তি আছে।",
"all": "All",
"topics": "Topics",
"replies": "Replies",
"chat": "Chats",
"follows": "Follows",
"upvote": "Upvotes",
"new-flags": "New Flags",
"my-flags": "Flags assigned to me",
"bans": "Bans",
"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>.",
@@ -19,6 +28,9 @@
"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_flagged_user": "<strong>%1</strong> flagged a user profile (%2)",
"user_flagged_user_dual": "<strong>%1</strong> and <strong>%2</strong> flagged a user profile (%3)",
"user_flagged_user_multiple": "<strong>%1</strong> and %2 others flagged a user profile (%3)",
"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>",
@@ -28,6 +40,7 @@
"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.",
"flag_assigned_to_you": "<strong>Flag %1</strong> has been assigned to you",
"email-confirmed": "ইমেইল নিশ্চিত করা হয়েছে",
"email-confirmed-message": "আপনার ইমেইল যাচাই করার জন্য আপনাকে ধন্যবাদ। আপনার অ্যাকাউন্টটি এখন সম্পূর্ণরূপে সক্রিয়।",
"email-confirm-error-message": "আপনার ইমেল ঠিকানার বৈধতা যাচাইয়ে একটি সমস্যা হয়েছে। সম্ভবত কোডটি ভুল ছিল অথবা কোডের মেয়াদ শেষ হয়ে গিয়েছে।",

View File

@@ -6,7 +6,7 @@
"popular-month": "Popular topics this month",
"popular-alltime": "All time popular topics",
"recent": "সাম্প্রতিক টপিক",
"flagged-posts": "Flagged Posts",
"flagged-content": "Flagged Content",
"ip-blacklist": "IP Blacklist",
"users/online": "Online Users",
"users/latest": "Latest Users",
@@ -27,6 +27,8 @@
"group": "%1 group",
"chats": "Chats",
"chat": "Chatting with %1",
"flags": "Flags",
"flag-details": "Flag %1 Details",
"account/edit": "Editing \"%1\"",
"account/edit/password": "Editing password of \"%1\"",
"account/edit/username": "Editing username of \"%1\"",

View File

@@ -12,6 +12,7 @@
"reply-count": "রিপ্লাই কাউন্ট",
"at-least": "কমপক্ষে",
"at-most": "সর্বোচ্চ",
"relevance": "Relevance",
"post-time": "পোস্টের সময়",
"newer-than": "Newer than",
"older-than": "Older than",

View File

@@ -13,7 +13,8 @@
"notify_me": "এই টপিকে নতুন উত্তর আসলে জানুন",
"quote": "উদ্ধৃতি",
"reply": "উত্তর",
"replies_to_this_post": "Replies: %1",
"replies_to_this_post": "%1 Replies",
"last_reply_time": "Last reply",
"reply-as-topic": "Reply as topic",
"guest-login-reply": "Log in to reply",
"edit": "সম্পাদণা",
@@ -25,28 +26,11 @@
"link": "লিঙ্ক",
"share": "শেয়ার",
"tools": "টুলস",
"flag": "ফ্ল্যাগ",
"locked": "বন্ধ",
"pinned": "Pinned",
"moved": "Moved",
"bookmark_instructions": "Click here to return to the last read post in this thread.",
"flag_title": "মডারেশনের জন্য এই পোস্টটি ফ্ল্যাগ করুন",
"flag_success": "এই পোস্টটি মডারেশনের জন্য ফ্ল্যাগ করা হয়েছে।",
"flag_manage_title": "Flagged post in %1",
"flag_manage_history": "Action History",
"flag_manage_no_history": "No event history to report",
"flag_manage_assignee": "Assignee",
"flag_manage_state": "State",
"flag_manage_state_open": "New/Open",
"flag_manage_state_wip": "Work in Progress",
"flag_manage_state_resolved": "Resolved",
"flag_manage_state_rejected": "Rejected",
"flag_manage_notes": "Shared Notes",
"flag_manage_update": "Update Flag Status",
"flag_manage_history_assignee": "Assigned to %1",
"flag_manage_history_state": "Updated state to %1",
"flag_manage_history_notes": "Updated flag notes",
"flag_manage_saved": "Flag Details Updated",
"deleted_message": "এই টপিকটি মুছে ফেলা হয়েছে। শুধুমাত্র টপিক ব্যবস্থাপনার ক্ষমতাপ্রাপ্ত সদস্যগণ এটি দেখতে পারবেন।",
"following_topic.message": "এখন থেকে এই টপিকে অন্যকেউ পোস্ট করলে আপনি নোটিফিকেশন পাবেন।",
"not_following_topic.message": "You will see this topic in the unread topics list, but you will not receive notifications when somebody posts to this topic.",
@@ -131,8 +115,5 @@
"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"
"link_back": "Re: [%1](%2)"
}

View File

@@ -33,6 +33,7 @@
"chat": "বার্তালাপ",
"chat_with": "Continue chat with %1",
"new_chat_with": "Start new chat with %1",
"flag-profile": "Flag Profile",
"follow": "অনুসরন করুন",
"unfollow": "অনুসরন করা থেকে বিরত থাকুন",
"more": "আরো...",
@@ -64,6 +65,8 @@
"remove_uploaded_picture": "আপলোড করা ছবিটি সরিয়ে নাও",
"upload_cover_picture": "Upload cover picture",
"remove_cover_picture_confirm": "Are you sure you want to remove the cover picture?",
"crop_picture": "Crop picture",
"upload_cropped_picture": "Crop and upload",
"settings": "সেটিংস",
"show_email": "আমার ইমেইল দেখাও",
"show_fullname": "আমার সম্পূর্ণ নাম দেখাও",
@@ -127,5 +130,6 @@
"info.username-history": "Username History",
"info.email-history": "Email History",
"info.moderation-note": "Moderation Note",
"info.moderation-note.success": "Moderation note saved"
"info.moderation-note.success": "Moderation note saved",
"info.moderation-note.add": "Add note"
}

View File

@@ -8,7 +8,7 @@
"clear-error-log": "Clear Error Log",
"route": "Route",
"count": "Count",
"no-routes-not-found": "Hooray! There are no routes that were not found.",
"no-routes-not-found": "Hooray! No 404 errors!",
"clear404-confirm": "Are you sure you wish to clear the 404 error logs?",
"clear404-success": "\"404 Not Found\" errors cleared"
}

View File

@@ -1,9 +1,9 @@
{
"loading": "Načítání motivů…",
"homepage": "Homepage",
"select-skin": "Select Skin",
"current-skin": "Current Skin",
"skin-updated": "Skin Updated",
"homepage": "Domovská stránka",
"select-skin": "Vyber motiv",
"current-skin": "Současný motiv",
"skin-updated": "Motiv aktualizován",
"applied-success": "%1 skin was succesfully applied",
"revert-success": "Skin reverted to base colours"
}

View File

@@ -2,6 +2,9 @@
"forum-traffic": "Forum Traffic",
"page-views": "Page Views",
"unique-visitors": "Unique Visitors",
"users": "Users",
"posts": "Posts",
"topics": "Topics",
"page-views-last-month": "Page views Last Month",
"page-views-this-month": "Page views This Month",
"page-views-last-day": "Page views in last 24 hours",
@@ -18,8 +21,14 @@
"upgrade-available": "<p>A new version (v%1) has been released. Consider <a href=\"https://docs.nodebb.org/en/latest/upgrading/index.html\">upgrading your NodeBB</a>.</p>",
"prerelease-upgrade-available": "<p>This is an outdated pre-release version of NodeBB. A new version (v%1) has been released. Consider <a href=\"https://docs.nodebb.org/en/latest/upgrading/index.html\">upgrading your NodeBB</a>.</p>",
"prerelease-warning": "<p>This is a <strong>pre-release</strong> version of NodeBB. Unintended bugs may occur. <i class=\"fa fa-exclamation-triangle\"></i></p>",
"running-in-development": "<span>Forum is running in development mode. The forum may be open to potential vulnerabilities; please contact your system administrator.</span>",
"notices": "Notices",
"restart-not-required": "Restart not required",
"restart-required": "Restart required",
"search-plugin-installed": "Search Plugin installed",
"search-plugin-not-installed": "Search Plugin not installed",
"search-plugin-tooltip": "Install a search plugin from the plugin page in order to activate search functionality",
"control-panel": "System Control",
"reload": "Reload",
@@ -52,4 +61,4 @@
"graphs.unique-visitors": "Unique Visitors",
"graphs.registered-users": "Registered Users",
"graphs.anonymous-users": "Anonymous Users"
}
}

View File

@@ -8,7 +8,7 @@
"text-color": "Text Colour",
"bg-image-size": "Background Image Size",
"custom-class": "Custom Class",
"num-recent-replies": "# of Recent Replies",
"num-recent-replies": "# nedávných odpovědí",
"ext-link": "External Link",
"upload-image": "Upload Image",
"delete-image": "Remove",

View File

@@ -13,7 +13,6 @@
"manage/users": "Users",
"manage/registration": "Registration Queue",
"manage/groups": "Groups",
"manage/flags": "Flags",
"manage/ip-blacklist": "IP Blacklist",
"section-settings": "Settings",

View File

@@ -26,5 +26,7 @@
"touch-icon.upload": "Upload",
"touch-icon.help": "Recommended size and format: 192x192, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.",
"outgoing-links": "Outgoing Links",
"outgoing-links.warning-page": "Use Outgoing Links Warning Page"
"outgoing-links.warning-page": "Use Outgoing Links Warning Page",
"search-default-sort-by": "Search default sort by",
"outgoing-links.whitelist": "Domains to whitelist for bypassing the warning page"
}

View File

@@ -2,6 +2,7 @@
"reputation": "Reputation Settings",
"disable": "Disable Reputation System",
"disable-down-voting": "Disable Down Voting",
"votes-are-public": "All Votes Are Public",
"thresholds": "Activity Thresholds",
"min-rep-downvote": "Minimum reputation to downvote posts",
"min-rep-flag": "Minimum reputation to flag posts"

View File

@@ -9,7 +9,7 @@
"allow-topic-thumbnails": "Allow users to upload topic thumbnails",
"topic-thumb-size": "Topic Thumb Size",
"allowed-file-extensions": "Allowed File Extensions",
"allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. <code>pdf,xls,doc</code>).\n\t\t\t\t\tAn empty list means all extensions are allowed.",
"allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. <code>pdf,xls,doc</code>). An empty list means all extensions are allowed.",
"profile-avatars": "Profile Avatars",
"allow-profile-image-uploads": "Allow users to upload profile images",
"convert-profile-image-png": "Convert profile image uploads to PNG",
@@ -25,4 +25,4 @@
"profile-covers": "Profile Covers",
"default-covers": "Default Cover Images",
"default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image"
}
}

View File

@@ -1,21 +1,21 @@
{
"authentication": "Authentication",
"allow-local-login": "Allow local login",
"require-email-confirmation": "Require Email Confirmation",
"authentication": "Ověření",
"allow-local-login": "Povolit místní přihlášení",
"require-email-confirmation": "Vyžadovat potvrzení e-mailem",
"email-confirm-interval": "User may not resend a confirmation email until",
"email-confirm-email2": "minutes have elapsed",
"email-confirm-email2": "minut uplynulo",
"allow-login-with": "Allow login with",
"allow-login-with.username-email": "Username or Email",
"allow-login-with.username": "Username Only",
"allow-login-with.email": "Email Only",
"account-settings": "Account Settings",
"disable-username-changes": "Disable username changes",
"disable-email-changes": "Disable email changes",
"disable-password-changes": "Disable password changes",
"allow-account-deletion": "Allow account deletion",
"allow-login-with.username-email": "Uživatelské jméno nebo e-mail",
"allow-login-with.username": "Pouze uživatelské jméno",
"allow-login-with.email": "Pouze e-mail",
"account-settings": "Nastavení účtu",
"disable-username-changes": "Zakázat změnu uživatelského jména",
"disable-email-changes": "Zakázat změnu e-mailu",
"disable-password-changes": "Zakázat změnu hesla",
"allow-account-deletion": "Povolit smazání účtu",
"user-info-private": "Make user info private",
"themes": "Themes",
"disable-user-skins": "Prevent users from choosing a custom skin",
"themes": "Témata",
"disable-user-skins": "Zabránit uživateli ve výběru vlastního vzhledu",
"account-protection": "Account Protection",
"login-attempts": "Login attempts per hour",
"login-attempts-help": "If login attempts to a user&apos;s account exceeds this threshold, that account will be locked for a pre-configured amount of time",
@@ -34,10 +34,10 @@
"registration.max-invites": "Maximum Invitations per User",
"max-invites": "Maximum Invitations per User",
"max-invites-help": "0 for no restriction. Admins get infinite invitations<br>Only applicable for \"Invite Only\"",
"min-username-length": "Minimum Username Length",
"max-username-length": "Maximum Username Length",
"min-password-length": "Minimum Password Length",
"max-about-me-length": "Maximum About Me Length",
"min-username-length": "Minimální délka uživatelského jména",
"max-username-length": "Maximální délka uživatelského jména",
"min-password-length": "Minimální délka hesla",
"max-about-me-length": "Maximální délka hesla",
"terms-of-use": "Forum Terms of Use <small>(Leave blank to disable)</small>",
"user-search": "User Search",
"user-search-results-per-page": "Number of results to display",
@@ -48,10 +48,10 @@
"outgoing-new-tab": "Open outgoing links in new tab",
"topic-search": "Enable In-Topic Searching",
"digest-freq": "Subscribe to Digest",
"digest-freq.off": "Off",
"digest-freq.daily": "Daily",
"digest-freq.weekly": "Weekly",
"digest-freq.monthly": "Monthly",
"digest-freq.off": "Vypnuto",
"digest-freq.daily": "Denně",
"digest-freq.weekly": "Týdně",
"digest-freq.monthly": "Měsíčně",
"email-chat-notifs": "Send an email if a new chat message arrives and I am not online",
"email-post-notif": "Send an email when replies are made to topics I am subscribed to",
"follow-created-topics": "Follow topics you create",

View File

@@ -10,11 +10,11 @@
"share_this_category": "Share this category",
"watch": "Sledovat",
"ignore": "Ignorovat",
"watching": "Watching",
"watching": "Sledováno",
"ignoring": "Ignoring",
"watching.description": "Show topics in unread",
"ignoring.description": "Do not show topics in unread",
"watch.message": "You are now watching updates from this category and all subcategories",
"watch.message": "Nyní sledujete všechny aktualizace z této kategorie a všech podkategorií",
"ignore.message": "You are now ignoring updates from this category and all subcategories",
"watched-categories": "Sledované kategorie"
}

View File

@@ -57,7 +57,7 @@
"post-delete-duration-expired-days": "You are only allowed to delete posts for %1 day(s) after posting",
"post-delete-duration-expired-days-hours": "You are only allowed to delete posts for %1 day(s) %2 hour(s) after posting",
"cant-delete-topic-has-reply": "You can't delete your topic after it has a reply",
"cant-delete-topic-has-replies": "You can't delete your topic after it has %1 replies",
"cant-delete-topic-has-replies": "Téma nelze odstranit poté, co obsahuje %1 odpovědí",
"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).",

View File

@@ -27,6 +27,7 @@
"details.disableJoinRequests": "Zakázat žádosti o připojení",
"details.grant": "Přidat/Zrušit vlastnictví",
"details.kick": "Vyhodit",
"details.kick_confirm": "Are you sure you want to remove this member from the group?",
"details.owner_options": "Administrátor skupiny",
"details.group_name": "Název skupiny",
"details.member_count": "Počet členů",

View File

@@ -8,5 +8,5 @@
"failed_login_attempt": "Přihlášení neúspěšné",
"login_successful": "Přihlášení proběhlo úspěšně!",
"dont_have_account": "Nemáte účet?",
"logged-out-due-to-inactivity": "You have been logged out of the Admin Control Panel due to inactivity"
"logged-out-due-to-inactivity": "Z důvodu nečinnosti jste byl odhlášen z ovládacího panelu administrátora"
}

View File

@@ -13,7 +13,7 @@
"chat.contacts": "Kontakty",
"chat.message-history": "Historie zpráv",
"chat.pop-out": "Skrýt chat",
"chat.minimize": "Minimize",
"chat.minimize": "Minimalizovat",
"chat.maximize": "Maximalizovat",
"chat.seven_days": "7 dní",
"chat.thirty_days": "30 dní",

View File

@@ -10,6 +10,15 @@
"return_to": "Vrátit na %1",
"new_notification": "Nové upozornění",
"you_have_unread_notifications": "Máte nepřečtená upozornění.",
"all": "All",
"topics": "Topics",
"replies": "Replies",
"chat": "Chats",
"follows": "Follows",
"upvote": "Upvotes",
"new-flags": "New Flags",
"my-flags": "Flags assigned to me",
"bans": "Bans",
"new_message_from": "Nová zpráva od <strong>%1</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>.",
@@ -19,15 +28,19 @@
"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_flagged_user": "<strong>%1</strong> flagged a user profile (%2)",
"user_flagged_user_dual": "<strong>%1</strong> and <strong>%2</strong> flagged a user profile (%3)",
"user_flagged_user_multiple": "<strong>%1</strong> and %2 others flagged a user profile (%3)",
"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_posted_to_multiple": "<strong>%1</strong> and %2 others have posted replies to: <strong>%3</strong>",
"user_posted_to_dual": "<strong>%1</strong> a <strong>%2</strong> odpověděli v tématu <strong>%3</strong>",
"user_posted_to_multiple": "<strong>%1</strong> a %2 další odpověděli v tématu <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_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.",
"flag_assigned_to_you": "<strong>Flag %1</strong> has been assigned to you",
"email-confirmed": "E-mail potvrzen",
"email-confirmed-message": "Děkujeme za ověření vaší e-mailové adresy. Váš účet je nyní aktivní.",
"email-confirm-error-message": "Nastal problém s ověřením vaší e-mailové adresy. Kód je pravděpodobně neplatný nebo jeho platnost vypršela.",

View File

@@ -6,7 +6,7 @@
"popular-month": "Oblíbená témata pro tento měsíc",
"popular-alltime": "Oblíbená témata za celou dobu",
"recent": "Aktuální témata",
"flagged-posts": "Označené příspěvky",
"flagged-content": "Flagged Content",
"ip-blacklist": "IP Blacklist",
"users/online": "Uživatelé online",
"users/latest": "Nejnovější uživatelé",
@@ -27,6 +27,8 @@
"group": "%1 skupina",
"chats": "Chaty",
"chat": "Chatovat s %1",
"flags": "Flags",
"flag-details": "Flag %1 Details",
"account/edit": "Editing \"%1\"",
"account/edit/password": "Editing password of \"%1\"",
"account/edit/username": "Editing username of \"%1\"",
@@ -39,7 +41,7 @@
"account/groups": "%1's skupiny",
"account/bookmarks": "%1's Bookmarked Posts",
"account/settings": "Uživatelské nastavení",
"account/watched": "Topics watched by %1",
"account/watched": "Témata sledovaná uživatelem %1",
"account/upvoted": "Posts upvoted by %1",
"account/downvoted": "Posts downvoted by %1",
"account/best": "Nejlepší příspěvky od %1",

View File

@@ -1,6 +1,6 @@
{
"register": "Registrace",
"cancel_registration": "Cancel Registration",
"cancel_registration": "Zrušit registraci",
"help.email": "Ve výchozím nastavení bude váš e-mail skrytý.",
"help.username_restrictions": "Jedinečné uživatelské jméno dlouhé %1 až %2 znaků. Ostatní uživatelé Vás mohou zmínit jako @<span id='yourUsername'>uživatelské-jméno</span>.",
"help.minimum_password_length": "Délka vašeho hesla musí být alespoň %1 znaků.",

View File

@@ -12,6 +12,7 @@
"reply-count": "Reply Count",
"at-least": "At least",
"at-most": "At most",
"relevance": "Relevance",
"post-time": "Post time",
"newer-than": "Novější než",
"older-than": "Starší než",
@@ -24,9 +25,9 @@
"six-months": "Šest měsíců",
"one-year": "Jeden rok",
"sort-by": "Řadit dle",
"last-reply-time": "Last reply time",
"last-reply-time": "Čas poslední odpovědi",
"topic-title": "Topic title",
"number-of-replies": "Number of replies",
"number-of-replies": "Počet odpovědí",
"number-of-views": "Number of views",
"topic-start-date": "Topic start date",
"username": "Uživatelské jméno",

View File

@@ -10,10 +10,11 @@
"posted_by": "Přidal %1",
"posted_by_guest": "Přidal Host",
"chat": "Chat",
"notify_me": "Sledovat toto téma",
"notify_me": "Dostávat upozornění na nové odpovědi",
"quote": "Citovat",
"reply": "Odpovědět",
"replies_to_this_post": "Replies: %1",
"replies_to_this_post": "%1 Replies",
"last_reply_time": "Last reply",
"reply-as-topic": "Odpovědět jako Téma",
"guest-login-reply": "Přihlásit se pro odpověď",
"edit": "Upravit",
@@ -25,28 +26,11 @@
"link": "Odkaz",
"share": "Sdílet",
"tools": "Nástroje",
"flag": "Flag",
"locked": "Uzamčeno",
"pinned": "Pinned",
"moved": "Moved",
"bookmark_instructions": "Click here to return to the last read post in this thread.",
"flag_title": "Flag this post for moderation",
"flag_success": "This post has been flagged for moderation.",
"flag_manage_title": "Flagged post in %1",
"flag_manage_history": "Action History",
"flag_manage_no_history": "No event history to report",
"flag_manage_assignee": "Assignee",
"flag_manage_state": "State",
"flag_manage_state_open": "New/Open",
"flag_manage_state_wip": "Work in Progress",
"flag_manage_state_resolved": "Resolved",
"flag_manage_state_rejected": "Rejected",
"flag_manage_notes": "Shared Notes",
"flag_manage_update": "Update Flag Status",
"flag_manage_history_assignee": "Assigned to %1",
"flag_manage_history_state": "Updated state to %1",
"flag_manage_history_notes": "Updated flag notes",
"flag_manage_saved": "Flag Details Updated",
"deleted_message": "This topic has been deleted. Only users with topic management privileges can see it.",
"following_topic.message": "You will now be receiving notifications when somebody posts to this topic.",
"not_following_topic.message": "You will see this topic in the unread topics list, but you will not receive notifications when somebody posts to this topic.",
@@ -56,12 +40,12 @@
"mark_unread": "Označ za nepřečtené",
"mark_unread.success": "Téma označeno jako nepřečtené",
"watch": "Sledovat",
"unwatch": "Unwatch",
"unwatch": "Přesta sledovat",
"watch.title": "Be notified of new replies in this topic",
"unwatch.title": "Stop watching this topic",
"unwatch.title": "Přestat sledovat toto téma",
"share_this_post": "Sdílet toto téma",
"watching": "Watching",
"not-watching": "Not Watching",
"watching": "Sledováno",
"not-watching": "Nesledováno",
"ignoring": "Ignoring",
"watching.description": "Notify me of new replies.<br/>Show topic in unread.",
"not-watching.description": "Do not notify me of new replies.<br/>Show topic in unread if category is not ignored.",
@@ -109,7 +93,7 @@
"composer.handle_placeholder": "Jméno",
"composer.discard": "Zrušit",
"composer.submit": "Odeslat",
"composer.replying_to": "Replying to %1",
"composer.replying_to": "Odpovídání na %1",
"composer.new_topic": "Nové téma",
"composer.uploading": "nahrávání…",
"composer.thumb_url_label": "Vložit URL náhled tématu",
@@ -131,8 +115,5 @@
"stale.warning": "Reagujete na starší téma. Nechcete raději vytvořit téma nové a na původní v něm odkázat?",
"stale.create": "Vytvořit nové téma",
"stale.reply_anyway": "Přesto reagovat na toto téma",
"link_back": "Re: [%1](%2)",
"spam": "Spam",
"offensive": "Urážlivé",
"custom-flag-reason": "Vložte důvod oznámení"
"link_back": "Re: [%1](%2)"
}

View File

@@ -33,6 +33,7 @@
"chat": "Chat",
"chat_with": "Continue chat with %1",
"new_chat_with": "Start new chat with %1",
"flag-profile": "Flag Profile",
"follow": "Sledovat",
"unfollow": "Nesledovat",
"more": "Více",
@@ -64,6 +65,8 @@
"remove_uploaded_picture": "Odstranit nahraný obrázek",
"upload_cover_picture": "Náhrát titulní obrázek",
"remove_cover_picture_confirm": "Are you sure you want to remove the cover picture?",
"crop_picture": "Crop picture",
"upload_cropped_picture": "Crop and upload",
"settings": "Nastavení",
"show_email": "Zobrazovat můj e-mail v profilu",
"show_fullname": "Zobrazovat celé jméno",
@@ -81,7 +84,7 @@
"follows_no_one": "Tento uživatel nikoho nesleduje :(",
"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_watched_topics": "Tento uživatel zatím nesleduje žádná témata.",
"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",
@@ -91,7 +94,7 @@
"topics_per_page": "Témat na stránce",
"posts_per_page": "Příspěvků na stránce",
"notification_sounds": "Přehrát zvuk když dostanete notifikaci",
"notifications_and_sounds": "Notifications & Sounds",
"notifications_and_sounds": "Upozornění a zvuky",
"incoming-message-sound": "Incoming message sound",
"outgoing-message-sound": "Outgoing message sound",
"notification-sound": "Notification sound",
@@ -103,8 +106,8 @@
"delay_image_loading": "Delay Image Loading",
"image_load_delay_help": "If enabled, images in topics will not load until they are scrolled into view",
"scroll_to_my_post": "After posting a reply, show the new post",
"follow_topics_you_reply_to": "Watch topics that you reply to",
"follow_topics_you_create": "Watch topics you create",
"follow_topics_you_reply_to": "Sledovat témata, do kterých přispějete",
"follow_topics_you_create": "Sledovat témata, která vytvoříte",
"grouptitle": "Nadpis skupiny",
"no-group-title": "Žádný nadpis skupiny",
"select-skin": "Vybrat skin",
@@ -127,5 +130,6 @@
"info.username-history": "Username History",
"info.email-history": "Email History",
"info.moderation-note": "Moderation Note",
"info.moderation-note.success": "Moderation note saved"
"info.moderation-note.success": "Moderation note saved",
"info.moderation-note.add": "Add note"
}

View File

@@ -8,7 +8,7 @@
"clear-error-log": "Clear Error Log",
"route": "Route",
"count": "Count",
"no-routes-not-found": "Hooray! There are no routes that were not found.",
"no-routes-not-found": "Hooray! No 404 errors!",
"clear404-confirm": "Are you sure you wish to clear the 404 error logs?",
"clear404-success": "\"404 Not Found\" errors cleared"
}

View File

@@ -2,6 +2,9 @@
"forum-traffic": "Forum Traffik",
"page-views": "Side Visninger",
"unique-visitors": "Unikke Besøgere",
"users": "Users",
"posts": "Posts",
"topics": "Topics",
"page-views-last-month": "Side Visninger Sidste Måned",
"page-views-this-month": "Side Visninger Denne Måned",
"page-views-last-day": "Side visninger i de sidste 24 timer",
@@ -18,8 +21,14 @@
"upgrade-available": "<p>En ny version (v%1) er blevet udgivet. Overvej <a href=\"https://docs.nodebb.org/en/latest/upgrading/index.html\">at opgradere din NodeBB</a>.</p>",
"prerelease-upgrade-available": "<p>Dette er en uddateret pre-release version af NodeBB. En ny version (v%1) er blevet udgivet. Overvej <a href=\"https://docs.nodebb.org/en/latest/upgrading/index.html\">at opdatere din NodeBB</a>.</p>",
"prerelease-warning": "<p>Dette er en <strong>pre-release</strong> udgave af NodeBB. Uforventede bugs kan forekomme.<i class=\"fa fa-exclamation-triangle\"></i></p>",
"running-in-development": "<span>Forum is running in development mode. The forum may be open to potential vulnerabilities; please contact your system administrator.</span>",
"notices": "Varsler",
"restart-not-required": "Restart not required",
"restart-required": "Restart required",
"search-plugin-installed": "Search Plugin installed",
"search-plugin-not-installed": "Search Plugin not installed",
"search-plugin-tooltip": "Install a search plugin from the plugin page in order to activate search functionality",
"control-panel": "System Kontrol",
"reload": "Genindlæs",
@@ -52,4 +61,4 @@
"graphs.unique-visitors": "Unique Visitors",
"graphs.registered-users": "Registered Users",
"graphs.anonymous-users": "Anonymous Users"
}
}

View File

@@ -13,7 +13,6 @@
"manage/users": "Users",
"manage/registration": "Registration Queue",
"manage/groups": "Groups",
"manage/flags": "Flags",
"manage/ip-blacklist": "IP Blacklist",
"section-settings": "Settings",

View File

@@ -26,5 +26,7 @@
"touch-icon.upload": "Upload",
"touch-icon.help": "Recommended size and format: 192x192, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.",
"outgoing-links": "Outgoing Links",
"outgoing-links.warning-page": "Use Outgoing Links Warning Page"
"outgoing-links.warning-page": "Use Outgoing Links Warning Page",
"search-default-sort-by": "Search default sort by",
"outgoing-links.whitelist": "Domains to whitelist for bypassing the warning page"
}

View File

@@ -2,6 +2,7 @@
"reputation": "Reputation Settings",
"disable": "Disable Reputation System",
"disable-down-voting": "Disable Down Voting",
"votes-are-public": "All Votes Are Public",
"thresholds": "Activity Thresholds",
"min-rep-downvote": "Minimum reputation to downvote posts",
"min-rep-flag": "Minimum reputation to flag posts"

View File

@@ -9,7 +9,7 @@
"allow-topic-thumbnails": "Allow users to upload topic thumbnails",
"topic-thumb-size": "Topic Thumb Size",
"allowed-file-extensions": "Allowed File Extensions",
"allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. <code>pdf,xls,doc</code>).\n\t\t\t\t\tAn empty list means all extensions are allowed.",
"allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. <code>pdf,xls,doc</code>). An empty list means all extensions are allowed.",
"profile-avatars": "Profile Avatars",
"allow-profile-image-uploads": "Allow users to upload profile images",
"convert-profile-image-png": "Convert profile image uploads to PNG",
@@ -25,4 +25,4 @@
"profile-covers": "Profile Covers",
"default-covers": "Default Cover Images",
"default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image"
}
}

View File

@@ -27,6 +27,7 @@
"details.disableJoinRequests": "Deaktiver Anmodninger",
"details.grant": "Giv/ophæv ejerskab",
"details.kick": "Spark",
"details.kick_confirm": "Are you sure you want to remove this member from the group?",
"details.owner_options": "Gruppe administration",
"details.group_name": "Gruppe navn",
"details.member_count": "Medlemsantal",

View File

@@ -10,6 +10,15 @@
"return_to": "Returnere til %t",
"new_notification": "Ny notifikation",
"you_have_unread_notifications": "Du har ulæste notifikationer.",
"all": "All",
"topics": "Topics",
"replies": "Replies",
"chat": "Chats",
"follows": "Follows",
"upvote": "Upvotes",
"new-flags": "New Flags",
"my-flags": "Flags assigned to me",
"bans": "Bans",
"new_message_from": "Ny besked fra <strong>%1</strong>",
"upvoted_your_post_in": "<strong>%1</strong> har upvotet dit indlæg i <strong>%2</strong>.",
"upvoted_your_post_in_dual": "<strong>%1</strong> og <strong>%2</strong> har syntes godt om dit indlæg i <strong>%3</strong>.",
@@ -19,6 +28,9 @@
"user_flagged_post_in": "<strong>%1</strong> har anmeldt et indlæg i <strong>%2</strong>",
"user_flagged_post_in_dual": "<strong>%1</strong> og <strong>%2</strong> har anmeldt et indlæg i <strong>%3</strong>",
"user_flagged_post_in_multiple": "<strong>%1</strong> og %2 andre har anmeldt et indlæg i <strong>%3</strong>",
"user_flagged_user": "<strong>%1</strong> flagged a user profile (%2)",
"user_flagged_user_dual": "<strong>%1</strong> and <strong>%2</strong> flagged a user profile (%3)",
"user_flagged_user_multiple": "<strong>%1</strong> and %2 others flagged a user profile (%3)",
"user_posted_to": "<strong>%1</strong> har skrevet et svar til: <strong>%2</strong>",
"user_posted_to_dual": "<strong>%1</strong> og <strong>%2</strong> har skrevet svar til: <strong>%3</strong>",
"user_posted_to_multiple": "<strong>%1</strong> og %2 andre har skrevet svar til: <strong>%3</strong>",
@@ -28,6 +40,7 @@
"user_started_following_you_multiple": "<strong>%1</strong> og %2 har valgt at følge dig.",
"new_register": "<strong>%1</strong> har sendt en registrerings anmodning.",
"new_register_multiple": "There are <strong>%1</strong> registration requests awaiting review.",
"flag_assigned_to_you": "<strong>Flag %1</strong> has been assigned to you",
"email-confirmed": "Email bekræftet",
"email-confirmed-message": "Tak fordi du validerede din email. Din konto er nu fuldt ud aktiveret.",
"email-confirm-error-message": "Der var et problem med valideringen af din emailadresse. Bekræftelses koden var muligvis forkert eller udløbet.",

View File

@@ -6,7 +6,7 @@
"popular-month": "Populære tråde denne måned",
"popular-alltime": "Top populære tråde",
"recent": "Seneste tråde",
"flagged-posts": "Anmeldte Indlæg",
"flagged-content": "Flagged Content",
"ip-blacklist": "IP Blacklist",
"users/online": "Online brugere",
"users/latest": "Seneste brugere",
@@ -27,6 +27,8 @@
"group": "%1 gruppe",
"chats": "Chats",
"chat": "Chatter med %1",
"flags": "Flags",
"flag-details": "Flag %1 Details",
"account/edit": "Redigere \"%1\"",
"account/edit/password": "Redigerer adgangskode for \"%1\"",
"account/edit/username": "Redigerer brugernavn for \"%1\"",

View File

@@ -12,6 +12,7 @@
"reply-count": "Svar antal",
"at-least": "Mindst",
"at-most": "Højst",
"relevance": "Relevance",
"post-time": "Skrevet",
"newer-than": "Nyere end",
"older-than": "Ældre end",

View File

@@ -13,7 +13,8 @@
"notify_me": "Bliv notificeret ved nye svar i dette emne",
"quote": "Citer",
"reply": "Svar",
"replies_to_this_post": "Svar %1",
"replies_to_this_post": "%1 Replies",
"last_reply_time": "Last reply",
"reply-as-topic": "Svar som emne",
"guest-login-reply": "Login for at svare",
"edit": "Rediger",
@@ -25,28 +26,11 @@
"link": "Link",
"share": "Del",
"tools": "Værktøjer",
"flag": "Marker",
"locked": "Låst",
"pinned": "Pinned",
"moved": "Flyttet",
"bookmark_instructions": "Klik her for at vende tilbage til den sidst læste indlæg i denne tråd.",
"flag_title": "Meld dette indlæg til moderation",
"flag_success": "Dette indlæg er blevet meldt til moderation.",
"flag_manage_title": "Markeret indlæg %1",
"flag_manage_history": "Action History",
"flag_manage_no_history": "No event history to report",
"flag_manage_assignee": "Assignee",
"flag_manage_state": "State",
"flag_manage_state_open": "Ny/Åben",
"flag_manage_state_wip": "Work in Progress",
"flag_manage_state_resolved": "Løst",
"flag_manage_state_rejected": "Afvist",
"flag_manage_notes": "Delte Noter",
"flag_manage_update": "Opdater Markerings Status",
"flag_manage_history_assignee": "Assigned to %1",
"flag_manage_history_state": "Updated state to %1",
"flag_manage_history_notes": "Updated flag notes",
"flag_manage_saved": "Flag Details Updated",
"deleted_message": "Denne tråd er blevet slettet. Kun brugere med emne behandlings privilegier kan se den.",
"following_topic.message": "Du vil nu modtage notifikationer når nogle skriver et indlæg i dette emne.",
"not_following_topic.message": "You will see this topic in the unread topics list, but you will not receive notifications when somebody posts to this topic.",
@@ -131,8 +115,5 @@
"stale.warning": "Emnet du svarer på er ret gammelt. Vil du oprette et nyt emne istedet og referere dette indlæg i dit svar?",
"stale.create": "Opret nyt emne",
"stale.reply_anyway": "Svar dette emne alligevel",
"link_back": "Svar: [%1](%2)",
"spam": "Spam",
"offensive": "Stødende",
"custom-flag-reason": "Indsæt en markeringsgrund"
"link_back": "Svar: [%1](%2)"
}

View File

@@ -33,6 +33,7 @@
"chat": "Chat",
"chat_with": "Fortsæt chatte med %1",
"new_chat_with": "Start en ny chat med %1",
"flag-profile": "Flag Profile",
"follow": "Følg",
"unfollow": "Følg ikke",
"more": "Mere",
@@ -64,6 +65,8 @@
"remove_uploaded_picture": "Fjern uploaded billede",
"upload_cover_picture": "Upload coverbillede",
"remove_cover_picture_confirm": "Are you sure you want to remove the cover picture?",
"crop_picture": "Crop picture",
"upload_cropped_picture": "Crop and upload",
"settings": "Indstillinger",
"show_email": "Vis min emailaddresse",
"show_fullname": "Vis mit fulde navn",
@@ -127,5 +130,6 @@
"info.username-history": "Username History",
"info.email-history": "Email History",
"info.moderation-note": "Moderation Note",
"info.moderation-note.success": "Moderation note saved"
"info.moderation-note.success": "Moderation note saved",
"info.moderation-note.add": "Add note"
}

View File

@@ -2,6 +2,6 @@
"alert.confirm-reload": "Bist du sicher, dass du NodeBB neu laden möchtest?",
"alert.confirm-restart": "Bist du sicher, dass du NodeBB neu starten möchtest?",
"acp-title": "%1 | NodeBB Admin Control Panel",
"acp-title": "%1 | NodeBB Admin Systemsteuerung",
"settings-header-contents": "Inhalte"
}

View File

@@ -1,6 +1,6 @@
{
"x-b": "%1 b",
"x-mb": "%1 mb",
"x-b": "%1 B",
"x-mb": "%1 MB",
"uptime-seconds": "Laufzeit in Sekunden",
"uptime-days": "Laufzeit in Tagen",
@@ -14,9 +14,9 @@
"mongo.storage-size": "Speichergröße",
"mongo.index-size": "Indexgröße",
"mongo.file-size": "Dateigröße",
"mongo.resident-memory": "Resident Memory",
"mongo.virtual-memory": "virtueller Speicher",
"mongo.mapped-memory": "Mapped Memory",
"mongo.resident-memory": "Permanenter Speicher",
"mongo.virtual-memory": "Virtueller Speicher",
"mongo.mapped-memory": "Zugeordneter Speicher",
"mongo.raw-info": "MongoDB Rohinfo",
"redis": "Redis",
@@ -29,7 +29,7 @@
"redis.total-connections-recieved": "Insgesamt Verbindungen empfangen",
"redis.total-commands-processed": "Insgesamt Kommandos ausgeführt",
"redis.iops": "Durchschnittliche Anzahl von Ein-/Ausgaben pro Sekunde",
"redis.keyspace-hits": "Keyspace Hits",
"redis.keyspace-misses": "Keyspace Misses",
"redis.keyspace-hits": "Schlüsselraum Treffer",
"redis.keyspace-misses": "Schlüsselraum Verfehlungen",
"redis.raw-info": "Redis Rohinfo"
}

View File

@@ -3,12 +3,12 @@
"error-events-per-day": "<code>%1</code> Ereignisse pro Tag",
"error.404": "404 Not Found",
"error.503": "503 Service Unavailable",
"manage-error-log": "Aktionen Fehlerprotokoll",
"manage-error-log": "Fehlerprotokoll verwalten",
"export-error-log": "Exportiere das Fehlerprotokoll (CSV)",
"clear-error-log": "Lösche Fehlerprotokoll",
"clear-error-log": "Fehlerprotokoll leeren",
"route": "Zielroute",
"count": "Anzahl",
"no-routes-not-found": "Hurra! Es gibt keine Zielrouten, die nicht gefunden wurden.",
"no-routes-not-found": "Hurra! Keine 404 Fehler!",
"clear404-confirm": "Bist du dir sicher, dass du das 404 Fehlerprotokoll löschen möchtest?",
"clear404-success": "\"404 Not Found\" Fehler gelöscht"
}

View File

@@ -1,6 +1,6 @@
{
"events": "Veranstaltungen",
"no-events": "Es gibt keine Veranstaltungen",
"control-panel": "Veranstaltungen Steuerung",
"delete-events": "Veranstaltungen löschen"
"events": "Ereignisse",
"no-events": "Es gibt keine Ereignisse",
"control-panel": "Ereignis-Steuerung",
"delete-events": "Ereignisse löschen"
}

View File

@@ -1,9 +1,9 @@
{
"custom-css": "Benutzerdefiniertes CSS",
"custom-css.description": "Füge hier deine eigenen CSS-Eigenschaften ein, sie werden als letztes angewendet.",
"custom-css.enable": "Aktiviere benutzerdefiniertes CSS",
"custom-css.enable": "Benutzerdefiniertes CSS aktivieren",
"custom-header": "Benutzerdefinierter Kopfbereich",
"custom-header.description": "Füge hier dein benutzerdefiniertes HTML (z.B. Javascript, Meta Tags, usw.) ein, welches vor dem <code>&lt;head&gt;</code> Tag eingefügt wird.",
"custom-header.enable": "Aktiviere benutzerdefinierten Kopfbereich"
"custom-header.description": "Füge hier dein benutzerdefiniertes HTML (z.B. Javascript, Meta Tags, usw.) ein, welches in den <code>&lt;head&gt;</code> Tag eingefügt werden soll.",
"custom-header.enable": "Benutzerdefinierten Kopfbereich aktivieren"
}

View File

@@ -1,9 +1,9 @@
{
"loading": "Lade Aussehen...",
"homepage": "Homepage",
"select-skin": "Wähle Aussehen",
"select-skin": "Aussehen auswählen",
"current-skin": "Aktuelles Aussehen",
"skin-updated": "Aussehen aktualisiert",
"applied-success": "%1 Aussehen wurde erfolgreich angewendet",
"revert-success": "Aussehen wieder auf Basisfarben zurückgestellt."
"applied-success": "Aussehen %1 wurde erfolgreich angewendet",
"revert-success": "Aussehen auf Basisfarben zurückgestellt."
}

View File

@@ -6,6 +6,6 @@
"no-themes": "Keine installierten Designs gefunden.",
"revert-confirm": "Bist du dir sicher, dass du das standard NodeBB Design wieder herstellen willst?",
"theme-changed": "Design geändert",
"revert-success": "Du hast erfolgreich dein NodeBB wieder auf das Standarddesign gewechselt.",
"revert-success": "Du hast dein NodeBB erfolgreich wieder auf das Standarddesign zurückgesetzt.",
"restart-to-activate": "Bitte starte dein NodeBB neu um das Design voll zu aktivieren."
}

View File

@@ -1,16 +1,16 @@
{
"you-are-on": "Info - You are on <strong>%1:%2</strong>",
"host": "host",
"pid": "pid",
"nodejs": "nodejs",
"online": "online",
"you-are-on": "Info - Sie verwenden <strong>%1:%2</strong>",
"host": "Host",
"pid": "PID",
"nodejs": "Node.js Version",
"online": "Online",
"git": "git",
"load": "load",
"uptime": "uptime",
"load": "Auslastung",
"uptime": "Online Zeit",
"registered": "Registered",
"registered": "Registriert",
"sockets": "Sockets",
"guests": "Guests",
"guests": "Gäste",
"info": "Info"
}

View File

@@ -1,12 +1,12 @@
{
"logger-settings": "Logger Settings",
"description": "By enabling the check boxes, you will receive logs to your terminal. If you specify a path, logs will then be saved to a file instead. HTTP logging is useful for collecting statistics about who, when, and what people access on your forum. In addition to logging HTTP requests, we can also log socket.io events. Socket.io logging, in combination with redis-cli monitor, can be very helpful for learning NodeBB's internals.",
"explanation": "Simply check/uncheck the logging settings to enable or disable logging on the fly. No restart needed.",
"enable-http": "Enable HTTP logging",
"enable-socket": "Enable socket.io event logging",
"file-path": "Path to log file",
"file-path-placeholder": "/path/to/log/file.log ::: leave blank to log to your terminal",
"logger-settings": "Protokollierungseinstellungen",
"description": "Durch das markieren der Auswahlkästchen werden sie Protokolle in ihrem Terminal finden. Wenn sie einen Dateipfad angeben, werden die Protokolle stattdessen in einer Datei gespeichert. HTTP-Logging ist nützlich um Statistiken zu sammeln darüber, wer, wann was in ihrem Forum angesehen hat. Zusätzlich kann NodeBB auch Socket.io Events Protokollieren. In Kombination mit dem redis-cli Monitor kann dies ziemlich hilfreich sein um mehr über die Interne Struktur von NodeBB zu lernen.",
"explanation": "Markiere die Protokollierungseinstellungen nebenher um die Protokollierung zu (de-)aktivieren. Ein Neustart wird nicht benötigt.",
"enable-http": "HTTP-Protokollierung aktivieren",
"enable-socket": "Socket.io-Event-Protokollierung aktivieren",
"file-path": "Dateipfad zur Protokolldatei",
"file-path-placeholder": "/pfad/zur/protokoll/datei.log ::: Feld leer lassen um im Terminal zu protokollieren",
"control-panel": "Logger Control Panel",
"update-settings": "Update Logger Settings"
"control-panel": "Protokollsteuerung",
"update-settings": "Protokollierungseinstellungen aktualisieren"
}

View File

@@ -5,43 +5,43 @@
"out-of-date": "Veraltet",
"none-found": "Keine Plugins gefunden.",
"none-active": "Keine aktiven Plugins",
"find-plugins": "Find Plugins",
"find-plugins": "Plugins finden",
"plugin-search": "Plugin Search",
"plugin-search-placeholder": "Search for plugin...",
"reorder-plugins": "Re-order Plugins",
"order-active": "Order Active Plugins",
"dev-interested": "Interested in writing plugins for NodeBB?",
"docs-info": "Full documentation regarding plugin authoring can be found in the <a target=\"_blank\" href=\"https://docs.nodebb.org/en/latest/plugins/create.html\">NodeBB Docs Portal</a>.",
"plugin-search": "Plugin Suche",
"plugin-search-placeholder": "Nach Plugin suchen...",
"reorder-plugins": "Plugins neu sortieren",
"order-active": "Aktive Plugins sortieren",
"dev-interested": "Daran interessiert selbst Plugins für NodeBB zu schreiben?",
"docs-info": "Die komplette Dokumentation zur erstellung von Plugins kann im <a target=\"_blank\" href=\"https://docs.nodebb.org/en/latest/plugins/create.html\">NodeBB Dokumentations Portal</a> gefunden werden.",
"order.description": "Certain plugins work ideally when they are initialised before/after other plugins.",
"order.explanation": "Plugins load in the order specified here, from top to bottom",
"order.description": "Bestimmte Plugins funktionieren ideal, wenn diese for/nach anderen Plugins initialisiert werden.",
"order.explanation": "Die Plugins werden in der hier spezifizierten Reihenfolge geladen, von Oben nach Unten",
"plugin-item.themes": "Themes",
"plugin-item.deactivate": "Deactivate",
"plugin-item.activate": "Activate",
"plugin-item.install": "Install",
"plugin-item.uninstall": "Uninstall",
"plugin-item.themes": "Designs",
"plugin-item.deactivate": "Deaktivieren",
"plugin-item.activate": "Aktivieren",
"plugin-item.install": "Installieren",
"plugin-item.uninstall": "Deinstallieren",
"plugin-item.settings": "Einstellungen",
"plugin-item.installed": "Installed",
"plugin-item.latest": "Latest",
"plugin-item.upgrade": "Upgrade",
"plugin-item.more-info": "For more information:",
"plugin-item.unknown": "Unknown",
"plugin-item.unknown-explanation": "The state of this plugin could not be determined, possibly due to a misconfiguration error.",
"plugin-item.installed": "Installiert",
"plugin-item.latest": "Neueste",
"plugin-item.upgrade": "Aktualisieren",
"plugin-item.more-info": "Für weitere Informationen:",
"plugin-item.unknown": "Unbekannt",
"plugin-item.unknown-explanation": "Der Status dieses Plugins konnte nicht bestimmt werden, möglicherweise aufgrund eines Fehlkonfigurationsfehlers.",
"alert.enabled": "Plugin Enabled",
"alert.disabled": "Plugin Disabled",
"alert.upgraded": "Plugin Upgraded",
"alert.installed": "Plugin Installed",
"alert.uninstalled": "Plugin Uninstalled",
"alert.activate-success": "Please restart your NodeBB to fully activate this plugin",
"alert.deactivate-success": "Plugin successfully deactivated",
"alert.upgrade-success": "Please reload your NodeBB to fully upgrade this plugin",
"alert.install-success": "Plugin successfully installed, please activate the plugin.",
"alert.uninstall-success": "The plugin has been successfully deactivated and uninstalled.",
"alert.suggest-error": "<p>NodeBB could not reach the package manager, proceed with installation of latest version?</p><div class=\"alert alert-danger\"><strong>Server returned (%1)</strong>: %2</div>",
"alert.package-manager-unreachable": "<p>NodeBB could not reach the package manager, an upgrade is not suggested at this time.</p>",
"alert.incompatible": "<p>Your version of NodeBB (v%1) is only cleared to upgrade to v%2 of this plugin. Please update your NodeBB if you wish to install a newer version of this plugin.</p>",
"alert.possibly-incompatible": "<div class=\"alert alert-warning\"><p><strong>No Compatibility Information Found</strong></p><p>This plugin did not specify a specific version for installation given your NodeBB version. Full compatibility cannot be guaranteed, and may cause your NodeBB to no longer start properly.</p></div><p>In the event that NodeBB cannot boot properly:</p><pre><code>$ ./nodebb reset plugin=\"%1\"</code></pre><p>Continue installation of latest version of this plugin?</p>"
"alert.enabled": "Plugin aktiviert",
"alert.disabled": "Plugin deaktiviert",
"alert.upgraded": "Plugin aktualisiert",
"alert.installed": "Plugin installiert",
"alert.uninstalled": "Plugin deinstalliert",
"alert.activate-success": "Bitte starten Sie ihr NodeBB neu, um dieses Plugin vollständig zu aktivieren",
"alert.deactivate-success": "Plugin erfolgreich deaktiviert",
"alert.upgrade-success": "Bitte laden Sie ihr NodeBB neu um dieses Plugin vollständig zu aktualisieren",
"alert.install-success": "Plugin erfolgreich installiert. Bitte aktivieren Sie das Plugin",
"alert.uninstall-success": "Das Plugin wurde erfolgreich deaktiviert und deinstalliert.",
"alert.suggest-error": "<p>NodeBB konnte den Paket-Manager nicht erreichen, wollen Sie mit der Installation der neuesten Version fortfahren</p><div class=\"alert alert-danger\"><strong>Der Server meldete (%1)</strong>: %2</div>",
"alert.package-manager-unreachable": "<p>NodeBB konnte den Paket-manager nicht erreichen, eine aktualisierung wird momentan nicht empfohlen.</p>",
"alert.incompatible": "<p>Ihre NodeBB Version (v%1) ist nur für aktualisierungen bis v%2 dieses Plugins bestimmt. Bitte aktualisieren Sie NodeBB wenn Sie eine neuere Version dieses plugins installieren wollen.</p>",
"alert.possibly-incompatible": "<div class=\"alert alert-warning\"><p><strong>Keine Kompatibilitätsinformationen gefunden</strong></p><p>Dieses Plugin legte keine spezifische NodeBB version fest, welche für die Installation benötigt wird. Volle Kompatibilität kann nicht gewährleistet werden, was dazu führen könnte, dass ihr NodeBB nicht mehr korrekt startet.</p></div><p>Für den Fall, dass NodeBB nicht mehr ordnungsgemäß startet:</p><pre><code>$ ./nodebb reset plugin=\"%1\"</code></pre><p>Soll mit der installation der neuesten Version dieses Plugins fortgefahren werden?</p>"
}

View File

@@ -1,17 +1,17 @@
{
"rewards": "Rewards",
"condition-if-users": "If User's",
"condition-is": "Is:",
"condition-then": "Then:",
"max-claims": "Amount of times reward is claimable",
"zero-infinite": "Enter 0 for infinite",
"delete": "Delete",
"enable": "Enable",
"disable": "Disable",
"control-panel": "Rewards Control",
"new-reward": "New Reward",
"rewards": "Belohnungen",
"condition-if-users": "Wenn des Benutzers",
"condition-is": "Ist:",
"condition-then": "Dann:",
"max-claims": "Anzahl der male, die diese Belohnung beansprucht werden kann",
"zero-infinite": "Geben sie 0 für unendlich ein",
"delete": "Entfernen",
"enable": "Aktivieren",
"disable": "Deaktivieren",
"control-panel": "Belohnungseinstellungen",
"new-reward": "Neue Belohnung",
"alert.delete-success": "Successfully deleted reward",
"alert.no-inputs-found": "Illegal reward - no inputs found!",
"alert.save-success": "Successfully saved rewards"
"alert.delete-success": "Die Belohnung wurde erfolgreich gelöscht",
"alert.no-inputs-found": "Ungültige Belohnung - keine Eingaben gefunden!",
"alert.save-success": "Belohnungen erfolgreich gespeichert"
}

View File

@@ -1,19 +1,19 @@
{
"available": "Available Widgets",
"explanation": "Select a widget from the dropdown menu and then drag and drop it into a template's widget area on the left.",
"none-installed": "No widgets found! Activate the essential widgets plugin in the <a href=\"%1\">plugins</a> control panel.",
"containers.available": "Available Containers",
"containers.explanation": "Drag and drop on top of any active widget",
"containers.none": "None",
"container.well": "Well",
"available": "Verfügbare Widgets",
"explanation": "Wählen Sie ein Widget vom Dropdown-Menu aus und ziehen Sie es anschließend links in den Widget-Bereich einer Vorlage.",
"none-installed": "Keine Widgets gefunden! Aktivieren Sie das \"essential widgets\"-Plugin in den <a href=\"%1\">Plugin-Einstellungen</a>.",
"containers.available": "Verfügbare Container",
"containers.explanation": "Ziehen Sie sie auf ein beliebiges aktives Widget",
"containers.none": "Nichts",
"container.well": "Brunnen",
"container.jumbotron": "Jumbotron",
"container.panel": "Panel",
"container.panel-header": "Panel Header",
"container.panel-body": "Panel Body",
"container.alert": "Alert",
"container.panel-header": "Panel Kopfbereich",
"container.panel-body": "Panel Körper",
"container.alert": "Alarm",
"alert.confirm-delete": "Are you sure you wish to delete this widget?",
"alert.updated": "Widgets Updated",
"alert.update-success": "Successfully updated widgets"
"alert.confirm-delete": "Sind Sie sicher, dass Sie dieses Widget löschen wollen?",
"alert.updated": "Widgets aktualisiert",
"alert.update-success": "Widgets erfolgreich aktualisiert"
}

View File

@@ -1,55 +1,64 @@
{
"forum-traffic": "Forum Traffic",
"page-views": "Seitenaufrufe",
"unique-visitors": "Besucher",
"unique-visitors": "Individuelle Besucher",
"users": "Benutzer",
"posts": "Beiträge",
"topics": "Themen",
"page-views-last-month": "Aufrufe im letzten Monat",
"page-views-this-month": "Aufrufe in diesem Monat",
"page-views-last-day": "Aufrufe in den letzten 24 Stunden",
"stats.day": "diesen Tag",
"stats.week": "diese Woche",
"stats.month": "diesen Monat",
"stats.day": "Diesen Tag",
"stats.week": "Diese Woche",
"stats.month": "Diesen Monat",
"stats.all": "Alle",
"updates": "Updates",
"running-version": "Es läuft <strong>NodeBB v<span id=\\\"version\\\">%1</span></strong>.",
"keep-updated": "Stelle immer sicher, dass dein NodeBB auf dem neuesten Stand ist für die neuesten Sicherheits-Patches und Bug-fixes.",
"up-to-date": "<p>System ist <strong>aktuell</strong> <i class=\\\"fa fa-check\\\"></i></p>",
"upgrade-available": "<p>Version (v%1) wurde veröffentlicht. Beachte <a href=\\\"https://docs.nodebb.org/en/latest/upgrading/index.html\\\">um ein NodeBB Upgrade durchzuführen</a>.</p>",
"prerelease-upgrade-available": "<p>Das ist eine veraltete pre-release Version von NodeBB. Version (v%1) wurde veröffentlicht. Beachte <a href=\\\"https://docs.nodebb.org/en/latest/upgrading/index.html\\\">um ein NodeBB Upgrade durchzuführen</a>.</p>",
"prerelease-warning": "<p>Das ist eine <strong>pre-release</strong> Version von NodeBB. Es können ungewollte Fehler auftreten. <i class=\\\"fa fa-exclamation-triangle\\\"></i></p>",
"running-version": "Es läuft <strong>NodeBB v<span id=\"version\">%1</span></strong>.",
"keep-updated": "Stelle sicher, dass dein NodeBB immer auf dem neuesten Stand für die neuesten Sicherheits-Patches und Bug-fixes ist.",
"up-to-date": "<p>System ist <strong>aktuell</strong> <i class=\"fa fa-check\"></i></p>",
"upgrade-available": "<p>Version (v%1) wurde veröffentlicht. Beachte <a href=\"https://docs.nodebb.org/en/latest/upgrading/index.html\">um ein NodeBB Upgrade durchzuführen</a>.</p>",
"prerelease-upgrade-available": "<p>Das ist eine veraltete pre-release Version von NodeBB. Version (v%1) wurde veröffentlicht. Beachte <a href=\"https://docs.nodebb.org/en/latest/upgrading/index.html\">um ein NodeBB Upgrade durchzuführen</a>.</p>",
"prerelease-warning": "<p>Das ist eine <strong>pre-release</strong> Version von NodeBB. Es können ungewollte Fehler auftreten. <i class=\"fa fa-exclamation-triangle\"></i></p>",
"running-in-development": "<span>Das Forum wurde im Entwicklermodus gestartet. Das Forum könnte potenziellen Gefahren ausgeliefert sein. Bitte kontaktieren Sie Ihren Systemadministrator.</span>",
"notices": "Hinweise",
"restart-not-required": "Neustart nicht benötigt",
"restart-required": "Neustart benötigt",
"search-plugin-installed": "Such-Plugin installiert",
"search-plugin-not-installed": "Such-Plugin nicht installiert",
"search-plugin-tooltip": "Installieren Sie ein Such-Plugin auf der Plugin seite um die Such-Funktionalität zu aktivieren",
"control-panel": "Systemsteuerung",
"reload": "Reload",
"restart": "Neustart",
"restart-warning": "Ein Reload oder Neustart trennt die Verbindung für ein paar Sekunden.",
"maintenance-mode": "Wartungsmodus",
"maintenance-mode-title": "Hier klicken um NodeBB in den Wartungsmodus zu setzen",
"maintenance-mode-title": "Hier klicken um NodeBB in den Wartungsmodus zu versetzen",
"realtime-chart-updates": "Echtzeit Chartaktualisierung",
"active-users": "aktive Benutzer",
"active-users": "Aktive Benutzer",
"active-users.users": "Benutzer",
"active-users.guests": "Gäste",
"active-users.total": "Gesamt",
"active-users.connections": "Verbindungen",
"anonymous-registered-users": "anonyme vs registrierte Benutzer",
"anonymous-registered-users": "Anonyme vs Registrierte Benutzer",
"anonymous": "Anonym",
"registered": "Registriert",
"user-presence": "Benutzerpräsenz",
"on-categories": "auf Kategorie Übersicht",
"reading-posts": "Beiträge lesen",
"browsing-topics": "Themen durchsuchen",
"on-categories": "Auf Kategorieübersicht",
"reading-posts": "Beiträge lesend",
"browsing-topics": "Themen durchsuchend",
"recent": "Aktuell",
"unread": "Ungelesen",
"high-presence-topics": "Meist besuchte Themen",
"graphs.page-views": "Seitenaufrufe",
"graphs.unique-visitors": "verschiedene Besucher",
"graphs.registered-users": "registrierte Benutzer",
"graphs.anonymous-users": "anonyme Benutzer"
}
"graphs.unique-visitors": "Verschiedene Besucher",
"graphs.registered-users": "Registrierte Benutzer",
"graphs.anonymous-users": "Anonyme Benutzer"
}

View File

@@ -3,5 +3,5 @@
"description": "Wähle aus, welche Seite angezeigt werden soll, wenn Nutzer zur Startseite des Forums navigieren.",
"home-page-route": "Startseitenpfad",
"custom-route": "Eigener Startseitenpfad",
"allow-user-home-pages": "Benutzer eigene Startseiten erlauben"
"allow-user-home-pages": "Benutzern eigene Startseiten erlauben"
}

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