mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-12-25 18:00:28 +01:00
Compare commits
456 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fb2f857af2 | ||
|
|
7181bb4e1a | ||
|
|
de81a340ec | ||
|
|
73d934f5ae | ||
|
|
9e3d8a8090 | ||
|
|
27a76fcfc9 | ||
|
|
b33d25b0b8 | ||
|
|
bda3c2863b | ||
|
|
c14160a85b | ||
|
|
2827db3309 | ||
|
|
20eac0de94 | ||
|
|
6d7c70c911 | ||
|
|
fdee61b4f4 | ||
|
|
cf6c4667c8 | ||
|
|
65a65b19c0 | ||
|
|
185b6e5c8e | ||
|
|
9f8d80e3a4 | ||
|
|
678db343b4 | ||
|
|
37c4218184 | ||
|
|
6e5a79842f | ||
|
|
baa2a59f4c | ||
|
|
98047be9ce | ||
|
|
e382bca610 | ||
|
|
0e615e7b09 | ||
|
|
0fe10f5e86 | ||
|
|
ecfca21abe | ||
|
|
9670d7d762 | ||
|
|
2319af2904 | ||
|
|
c2ba1c270f | ||
|
|
1179dd9503 | ||
|
|
b1ee7cc5b4 | ||
|
|
1fb48ef7a7 | ||
|
|
c3febca9c8 | ||
|
|
a8add6477c | ||
|
|
a62a4e698f | ||
|
|
a117b559b8 | ||
|
|
980e9026f3 | ||
|
|
e9fb42eb03 | ||
|
|
f16a40d29e | ||
|
|
75d291183d | ||
|
|
9368e666d8 | ||
|
|
73b6b06294 | ||
|
|
08f001063c | ||
|
|
010473e5cc | ||
|
|
dc4f2be156 | ||
|
|
126237e2c9 | ||
|
|
1892492505 | ||
|
|
1ed571189c | ||
|
|
b53d3254dd | ||
|
|
2c418fd2af | ||
|
|
0ef30e91ba | ||
|
|
17ff8a4151 | ||
|
|
12a426b7b9 | ||
|
|
d4de345e87 | ||
|
|
4c89497cc4 | ||
|
|
da183e196a | ||
|
|
0fac75c055 | ||
|
|
07b9bb6fb8 | ||
|
|
5985a8a7a3 | ||
|
|
43f8678c7a | ||
|
|
8afdd71ef1 | ||
|
|
1deeaaeb39 | ||
|
|
bb0ec540bd | ||
|
|
60990f28ad | ||
|
|
8119b8c4ae | ||
|
|
03d432182b | ||
|
|
53dac97800 | ||
|
|
d88219b4d1 | ||
|
|
0bea922a12 | ||
|
|
60d35fdf05 | ||
|
|
2feb19aa2d | ||
|
|
b287c75e3c | ||
|
|
81696dd24a | ||
|
|
8a8bd23de9 | ||
|
|
57696b22f4 | ||
|
|
a450cb869d | ||
|
|
e9794224a8 | ||
|
|
5fbbe898d0 | ||
|
|
1594a84e1c | ||
|
|
a63459dc98 | ||
|
|
8d4a32dc27 | ||
|
|
15506c30a4 | ||
|
|
3876a88252 | ||
|
|
ff09d6e0dd | ||
|
|
c1c96668af | ||
|
|
6b0a907ede | ||
|
|
2a2ed96a07 | ||
|
|
42dc496572 | ||
|
|
114f87e78c | ||
|
|
14ed0be4f7 | ||
|
|
a1f87a5d7f | ||
|
|
a49e647de3 | ||
|
|
31b6d47f88 | ||
|
|
c84e54c6c6 | ||
|
|
a7677063de | ||
|
|
642306e69c | ||
|
|
3319a72679 | ||
|
|
6060b8e13b | ||
|
|
6682e048ea | ||
|
|
b6134b160e | ||
|
|
db84296373 | ||
|
|
9714e3c26b | ||
|
|
7f713ee822 | ||
|
|
da1858f674 | ||
|
|
d19e59f1e1 | ||
|
|
f5e8a40d79 | ||
|
|
449352d899 | ||
|
|
2ef71e22aa | ||
|
|
8f8babf90b | ||
|
|
23d4497c73 | ||
|
|
8c45411ccc | ||
|
|
33bf930bb9 | ||
|
|
8d7283e6c7 | ||
|
|
ff4c7ab3bb | ||
|
|
6a4b082080 | ||
|
|
6d444ccacf | ||
|
|
2106050bdc | ||
|
|
c199075d98 | ||
|
|
8a6665a26c | ||
|
|
4a33f45b1e | ||
|
|
0396e9300b | ||
|
|
90b8a3afd0 | ||
|
|
9f1a2b0cc9 | ||
|
|
0478e9c98c | ||
|
|
37be43a3c5 | ||
|
|
27b030a71c | ||
|
|
3e93975595 | ||
|
|
9dc54f801e | ||
|
|
286d0ab203 | ||
|
|
5ca9e5e14c | ||
|
|
62f445ad7f | ||
|
|
bb146e049c | ||
|
|
debe34b96c | ||
|
|
3b41c40b93 | ||
|
|
447b7b02ca | ||
|
|
f2eb4b8083 | ||
|
|
5aa45e9181 | ||
|
|
b3f8428691 | ||
|
|
dc4d394cd5 | ||
|
|
5e0de4b8fb | ||
|
|
8da8e4d8c3 | ||
|
|
fd8e647ef5 | ||
|
|
0c7dee05ef | ||
|
|
92fa9fecb6 | ||
|
|
0c8058ba9d | ||
|
|
4713e0d81a | ||
|
|
1c1d97dd54 | ||
|
|
74d2835a1f | ||
|
|
3d719eec99 | ||
|
|
8d493bf3b0 | ||
|
|
c619b850ce | ||
|
|
57691d9ad8 | ||
|
|
562b088423 | ||
|
|
9f2e5e9c4b | ||
|
|
364b819a42 | ||
|
|
fdb4766728 | ||
|
|
5359a14bac | ||
|
|
92ad6bb4e8 | ||
|
|
1102ca8ebb | ||
|
|
8a123f7c1c | ||
|
|
b7e6104bbc | ||
|
|
69c6ee5834 | ||
|
|
992e3128bd | ||
|
|
f732d6c1b9 | ||
|
|
33e474759b | ||
|
|
6420e22453 | ||
|
|
fcda832052 | ||
|
|
0f9530bbc0 | ||
|
|
f1b4a9b786 | ||
|
|
186c1f40e9 | ||
|
|
710377ceea | ||
|
|
603d45fbfa | ||
|
|
13edde2b30 | ||
|
|
8226fd6566 | ||
|
|
743a7e00b4 | ||
|
|
f6721c249f | ||
|
|
531df7bd09 | ||
|
|
4082ca40c1 | ||
|
|
0710c6488d | ||
|
|
eca150f392 | ||
|
|
431f5e1f0f | ||
|
|
f761191fca | ||
|
|
c517733e34 | ||
|
|
e85e35cf0c | ||
|
|
99dff11462 | ||
|
|
ab9f4ad636 | ||
|
|
324e5be7bd | ||
|
|
a3b4c83e8b | ||
|
|
ea871384d8 | ||
|
|
3b8d14bf12 | ||
|
|
54c951cc81 | ||
|
|
4369a6d290 | ||
|
|
bce1208e2f | ||
|
|
63b3c29a1a | ||
|
|
cd448f90cd | ||
|
|
202bafa3e3 | ||
|
|
5ca8456340 | ||
|
|
d60930a51d | ||
|
|
b060bda8a0 | ||
|
|
65cf7a01ec | ||
|
|
b1b87d339f | ||
|
|
bc8d297377 | ||
|
|
284485c885 | ||
|
|
2188036148 | ||
|
|
566ff95d3c | ||
|
|
3e396a8553 | ||
|
|
1bee91fa22 | ||
|
|
2ccf60a6ec | ||
|
|
b85dcb2570 | ||
|
|
5411b4c234 | ||
|
|
fecdbc969f | ||
|
|
c5f40e3cf5 | ||
|
|
6222b55dd8 | ||
|
|
ac84e447dc | ||
|
|
b96b983552 | ||
|
|
2e47cf4db3 | ||
|
|
8a0cf6c0ac | ||
|
|
bb1045c5a0 | ||
|
|
ef93ef3dd4 | ||
|
|
feb359f7d4 | ||
|
|
8166f30b90 | ||
|
|
039f80c5aa | ||
|
|
4d8bebcd81 | ||
|
|
da3cb0492c | ||
|
|
2bbf3c4f66 | ||
|
|
20d250bceb | ||
|
|
0213ca4bb1 | ||
|
|
007051c14c | ||
|
|
0e7740af32 | ||
|
|
347761173a | ||
|
|
a22909dbe8 | ||
|
|
6aa8c8aa94 | ||
|
|
fa08498a9e | ||
|
|
2a311d2ff6 | ||
|
|
09a1ed0869 | ||
|
|
00a67b97ce | ||
|
|
995f8296a4 | ||
|
|
b5f8fc815e | ||
|
|
e71bd7a27f | ||
|
|
92691782e6 | ||
|
|
fe582d8a7b | ||
|
|
048eb8a320 | ||
|
|
04b07e292c | ||
|
|
ca1fe557c7 | ||
|
|
3a87f2566a | ||
|
|
b7d5bc7dc8 | ||
|
|
3509e12748 | ||
|
|
f7a964474d | ||
|
|
dd2b930824 | ||
|
|
ee9d7584e4 | ||
|
|
cfc8884c9c | ||
|
|
8b533bb431 | ||
|
|
4163ce0218 | ||
|
|
1d5b3cc73f | ||
|
|
35ff71c37d | ||
|
|
14398a2d90 | ||
|
|
b4a32ee96f | ||
|
|
743f758f75 | ||
|
|
25f6293821 | ||
|
|
91d3ce1abc | ||
|
|
c168ed43d4 | ||
|
|
7b7565ee8e | ||
|
|
c1b1ff5c6e | ||
|
|
9079ee5b14 | ||
|
|
458cbfd603 | ||
|
|
a2847dc851 | ||
|
|
d4c2fc3bc8 | ||
|
|
ebe5ed7560 | ||
|
|
0de21cb3ff | ||
|
|
09d0ce4778 | ||
|
|
4cd4414d19 | ||
|
|
026c32f32b | ||
|
|
02cc988ae7 | ||
|
|
aea40902b0 | ||
|
|
f09f1f6ed8 | ||
|
|
dcb0f18422 | ||
|
|
e887dda37a | ||
|
|
2dac3d2292 | ||
|
|
5c01c7b1c7 | ||
|
|
e427f1663e | ||
|
|
89380824f8 | ||
|
|
f2a795a9b7 | ||
|
|
799f688503 | ||
|
|
4b21679d6f | ||
|
|
4ee7edad64 | ||
|
|
ef90702049 | ||
|
|
7d8477289d | ||
|
|
beb652ee43 | ||
|
|
3e562ceb83 | ||
|
|
aaec279d75 | ||
|
|
f302c0d739 | ||
|
|
631592b818 | ||
|
|
2e27ce640c | ||
|
|
9b1068e868 | ||
|
|
fd0f0beaf2 | ||
|
|
a99572fc48 | ||
|
|
23540afaeb | ||
|
|
b227297ef3 | ||
|
|
93f38d4f30 | ||
|
|
1b43faba1a | ||
|
|
4bb49a7171 | ||
|
|
c18808fdeb | ||
|
|
fdf4f873bf | ||
|
|
144fa8698c | ||
|
|
57f89663aa | ||
|
|
09e868ce5f | ||
|
|
11cb3a9554 | ||
|
|
a0a50677da | ||
|
|
04bb6513b0 | ||
|
|
5a45087fc8 | ||
|
|
32dc7c23ea | ||
|
|
c4bdb72941 | ||
|
|
64a6322002 | ||
|
|
239d7f84dd | ||
|
|
daa169c094 | ||
|
|
ac2f69f7af | ||
|
|
896c8c7343 | ||
|
|
7842c3411c | ||
|
|
b33d34f7cf | ||
|
|
23ed1af282 | ||
|
|
1493afee2a | ||
|
|
3b0dd2d1ef | ||
|
|
feb8405f95 | ||
|
|
41896e1fc7 | ||
|
|
f3a8256f35 | ||
|
|
a038c66549 | ||
|
|
604358ecc4 | ||
|
|
a5a3f3089a | ||
|
|
2e031f3759 | ||
|
|
277a7fb8b4 | ||
|
|
34e233fe1d | ||
|
|
532951c24f | ||
|
|
b1b486f729 | ||
|
|
3361a72725 | ||
|
|
d1101a7fb4 | ||
|
|
d7526b5e44 | ||
|
|
554075b312 | ||
|
|
d9c1f6f088 | ||
|
|
1cf25f57fc | ||
|
|
3d6bfa47c5 | ||
|
|
879470f417 | ||
|
|
52f2028206 | ||
|
|
b09b3aef7f | ||
|
|
2ba46808a1 | ||
|
|
bc1d70c126 | ||
|
|
bb3c8b910a | ||
|
|
5ca931a52c | ||
|
|
aacd8a2422 | ||
|
|
7f4e4c8e2e | ||
|
|
4d755bad0c | ||
|
|
8dab8864f6 | ||
|
|
aa64ec7db1 | ||
|
|
9f15008247 | ||
|
|
a379b03e71 | ||
|
|
5ee2aa8adb | ||
|
|
802878c371 | ||
|
|
e009ce5609 | ||
|
|
a427bba9cb | ||
|
|
4d05e492cc | ||
|
|
461ad301a1 | ||
|
|
c75391f9f5 | ||
|
|
2ca8f60e77 | ||
|
|
d784a8dce8 | ||
|
|
43f4d9819e | ||
|
|
484891472e | ||
|
|
3d56dc4857 | ||
|
|
fd88e9fdff | ||
|
|
9b3741bc63 | ||
|
|
dad5b135c3 | ||
|
|
c285eb7fcd | ||
|
|
2c428cdec1 | ||
|
|
8bf719b258 | ||
|
|
9e23d09e5e | ||
|
|
c25836b5fc | ||
|
|
867fd99fb6 | ||
|
|
4d8d23830d | ||
|
|
4bbf517af3 | ||
|
|
9f67142786 | ||
|
|
1e33a659ef | ||
|
|
30f35c42f6 | ||
|
|
a3cbe5e090 | ||
|
|
31ac72375f | ||
|
|
21eefb9760 | ||
|
|
8b006fb1ab | ||
|
|
3dc2a91990 | ||
|
|
5d4a0d7f05 | ||
|
|
c4a2babbf7 | ||
|
|
b553236620 | ||
|
|
21bc1fba3f | ||
|
|
6289f118ae | ||
|
|
9fb16e3520 | ||
|
|
6b2e40a8ce | ||
|
|
97c6da7d3f | ||
|
|
f4a6527ce6 | ||
|
|
503378e259 | ||
|
|
8f27d7810b | ||
|
|
7ba111acdd | ||
|
|
a8fd1440d4 | ||
|
|
a3e327301b | ||
|
|
d61665c20a | ||
|
|
4f5b9f3a42 | ||
|
|
cc160d77e7 | ||
|
|
667582744e | ||
|
|
ab7867d4b5 | ||
|
|
0409109faa | ||
|
|
0fffde67b5 | ||
|
|
aaacdb8413 | ||
|
|
a48c914a16 | ||
|
|
ce2bda0648 | ||
|
|
d5a45832c3 | ||
|
|
d966b52dc7 | ||
|
|
23d92c214d | ||
|
|
107abe3197 | ||
|
|
a122aad54d | ||
|
|
b530701cff | ||
|
|
bb1bfb0449 | ||
|
|
df1a1811f2 | ||
|
|
034f3f0268 | ||
|
|
2c5f8ed8e6 | ||
|
|
dbc3113940 | ||
|
|
b757f563df | ||
|
|
959315c8f7 | ||
|
|
f046ea012d | ||
|
|
b9ae02583e | ||
|
|
5ea5d11646 | ||
|
|
d43564dbbd | ||
|
|
fdad66f58e | ||
|
|
d31499a860 | ||
|
|
44a59ac435 | ||
|
|
9ceeff6f0a | ||
|
|
a3df9132f7 | ||
|
|
a41acead44 | ||
|
|
6a073277ac | ||
|
|
a808d1b4d9 | ||
|
|
a15aaaf389 | ||
|
|
06bf631445 | ||
|
|
76254942b2 | ||
|
|
d4e4b4bfa2 | ||
|
|
e3a2e13438 | ||
|
|
360a35d0a6 | ||
|
|
1012368acd | ||
|
|
5aa3e6b95b | ||
|
|
553567c3b2 | ||
|
|
700e2cf800 | ||
|
|
702561a6ab | ||
|
|
de28ff5d43 | ||
|
|
70b20e3ff1 | ||
|
|
a70051b30c | ||
|
|
f4147f7922 | ||
|
|
001aa3d1a8 | ||
|
|
186209a0a3 | ||
|
|
7fb7a64c8d | ||
|
|
8c86b2e32c | ||
|
|
8ac40eb44c | ||
|
|
cbe8807ebd | ||
|
|
05b68391dd |
@@ -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
128
.eslintrc
Normal 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"
|
||||
}
|
||||
}
|
||||
111
.eslintrc.json
111
.eslintrc.json
@@ -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"
|
||||
}
|
||||
}
|
||||
23
.github/CONTRIBUTING.md
vendored
23
.github/CONTRIBUTING.md
vendored
@@ -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
1
.gitignore
vendored
@@ -57,3 +57,4 @@ tx.exe
|
||||
coverage
|
||||
|
||||
build
|
||||
*.log
|
||||
|
||||
65
.tx/config
65
.tx/config
@@ -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
|
||||
|
||||
97
Gruntfile.js
97
Gruntfile.js
@@ -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
85
app.js
@@ -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
121
build.js
@@ -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);
|
||||
}
|
||||
});
|
||||
};
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
82
loader.js
82
loader.js
@@ -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
811
nodebb
@@ -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();
|
||||
}
|
||||
|
||||
37
package.json
37
package.json
@@ -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
58
public/.eslintrc
Normal 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
84
public/.jshintrc
Normal 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
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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": "عدد اﻷعضاء",
|
||||
|
||||
@@ -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": "حدث خطأ أثناء التحقق من عنوان بريدك الإلكتروني. ربما رمز التفعيل خاطئ أو انتهت صلاحيته.",
|
||||
|
||||
@@ -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\"",
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
"reply-count": "عدد المشاركات",
|
||||
"at-least": "على اﻷقل",
|
||||
"at-most": "على اﻷكثر",
|
||||
"relevance": "Relevance",
|
||||
"post-time": "تاريخ المشاركة",
|
||||
"newer-than": "أحدث من",
|
||||
"older-than": "أقدم من",
|
||||
|
||||
@@ -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)"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -8,7 +8,7 @@
|
||||
"clear-error-log": "Изчистване на журнала за грешки",
|
||||
"route": "Маршрут",
|
||||
"count": "Брой",
|
||||
"no-routes-not-found": "Ура! Няма неоткрити маршрути.",
|
||||
"no-routes-not-found": "Ура! Няма грешки от вида „404“!",
|
||||
"clear404-confirm": "Наистина ли искате да изчистите журналите за грешки от вида 404?",
|
||||
"clear404-success": "Грешките от вида „Страницата не е намерена (Грешка 404)“ бяха изчистени."
|
||||
}
|
||||
@@ -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": "Анонимни потребители"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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": "Потърсете потребител тук…",
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
"manage/users": "Потребители",
|
||||
"manage/registration": "Регистрационна опашка",
|
||||
"manage/groups": "Групи",
|
||||
"manage/flags": "Доклади",
|
||||
"manage/ip-blacklist": "Черен списък за IP адреси",
|
||||
|
||||
"section-settings": "Настройки",
|
||||
|
||||
@@ -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": "Домейни, за които да не се показва предупредителната страница"
|
||||
}
|
||||
@@ -2,6 +2,7 @@
|
||||
"reputation": "Настройки за репутацията",
|
||||
"disable": "Изключване на системата за репутация",
|
||||
"disable-down-voting": "Забрана на отрицателното гласуване",
|
||||
"votes-are-public": "Всички гласувания са публични",
|
||||
"thresholds": "Ограничения на дейността",
|
||||
"min-rep-downvote": "Минимална репутация, необходима за отрицателно гласуване за публикации",
|
||||
"min-rep-flag": "Минимална репутация, необходима за докладване на публикации"
|
||||
|
||||
@@ -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": "Добавете стандартни изображения на корицата (разделени със запетаи) за акаунтите, които нямат качено такова."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
"details.disableJoinRequests": "Забраняване на заявките за присъединяване",
|
||||
"details.grant": "Даване/отнемане на собственост",
|
||||
"details.kick": "Изгонване",
|
||||
"details.kick_confirm": "Наистина ли искате да премахнете този член на групата?",
|
||||
"details.owner_options": "Администрация на групата",
|
||||
"details.group_name": "Име на групата",
|
||||
"details.member_count": "Брой на членовете",
|
||||
|
||||
@@ -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": "Възникна проблем при потвърждаването на е-пощата Ви. Може кодът да е грешен или давността му да е изтекла.",
|
||||
|
||||
@@ -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“",
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
"reply-count": "Брой на отговорите",
|
||||
"at-least": "Поне",
|
||||
"at-most": "Най-много",
|
||||
"relevance": "Уместност",
|
||||
"post-time": "Време на публикуване",
|
||||
"newer-than": "По-нови от",
|
||||
"older-than": "По-стари от",
|
||||
|
||||
@@ -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)"
|
||||
}
|
||||
@@ -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": "Добавяне на бележка"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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": "আপনার ইমেল ঠিকানার বৈধতা যাচাইয়ে একটি সমস্যা হয়েছে। সম্ভবত কোডটি ভুল ছিল অথবা কোডের মেয়াদ শেষ হয়ে গিয়েছে।",
|
||||
|
||||
@@ -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\"",
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
"reply-count": "রিপ্লাই কাউন্ট",
|
||||
"at-least": "কমপক্ষে",
|
||||
"at-most": "সর্বোচ্চ",
|
||||
"relevance": "Relevance",
|
||||
"post-time": "পোস্টের সময়",
|
||||
"newer-than": "Newer than",
|
||||
"older-than": "Older than",
|
||||
|
||||
@@ -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)"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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'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",
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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).",
|
||||
|
||||
@@ -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ů",
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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í",
|
||||
|
||||
@@ -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.",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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ů.",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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)"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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.",
|
||||
|
||||
@@ -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\"",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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)"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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><head></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><head></code> Tag eingefügt werden soll.",
|
||||
"custom-header.enable": "Benutzerdefinierten Kopfbereich aktivieren"
|
||||
}
|
||||
@@ -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."
|
||||
}
|
||||
@@ -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."
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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>"
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user