Compare commits

...

43 Commits

Author SHA1 Message Date
Julian Lam
bc29c3a49b refactor: renderTemplate to async function, updated call to transitions API to wait until template is fully rendered before transitioning 2023-03-28 14:17:33 -04:00
Julian Lam
3883199be0 feat: implement a proof-of-concept cross-fade animation on ajaxify via the View Transitions API (currently only available in Chrome) 2023-03-28 14:01:14 -04:00
Julian Lam
7cb2e02cd7 fix: #11396, removal of base_templates_path variable 2023-03-27 14:48:50 -04:00
Julian Lam
491487a1a2 Merge remote-tracking branch 'origin/master' into develop 2023-03-27 14:16:14 -04:00
Misty Release Bot
188ec62f9a chore: update changelog for v2.8.10 2023-03-27 18:10:57 +00:00
Misty Release Bot
48c1c7594d chore: incrementing version number - v2.8.10 2023-03-27 18:10:57 +00:00
Barış Soner Uşaklı
69f24ed92a feat: add support for selected topic count 2023-03-27 11:09:22 -04:00
Julian Lam
830f142b7a fix: #11403, remove loader.js crash counter logic 2023-03-27 10:55:44 -04:00
Barış Soner Uşaklı
1aff9cad91 lint: fix arrow 2023-03-27 10:47:15 -04:00
Barış Soner Uşaklı
37b48b82a4 fix: don't crash if event name is not a string 2023-03-27 10:38:53 -04:00
Barış Soner Uşaklı
a83734fb2b fix: dont show search input if user doesn't have tag search priv 2023-03-27 09:39:57 -04:00
Barış Soner Uşaklı
68db271dfd chore: remove logs 2023-03-26 21:17:57 -04:00
Barış Soner Uşaklı
2c5a5bf366 feat: change chat notification delivery
instead of checking if user is online in the past x minutes, check if the user has read the room, if they have already marked the chat as read don't send notification
2023-03-26 21:13:07 -04:00
Barış Soner Uşaklı
2a9b3ee464 fix: add missing delete 2023-03-26 20:11:11 -04:00
Barış Soner Uşaklı
3f8344804a chore: up harmony 2023-03-26 14:42:52 -04:00
renovate[bot]
8906002772 fix(deps): update dependency esbuild to v0.17.14 (#11399)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-26 14:42:20 -04:00
renovate[bot]
415da6c2ed fix(deps): update dependency nodebb-theme-persona to v13.0.53 (#11401)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-26 14:41:43 -04:00
Barış Soner Uşaklı
9c0996e40a feat: add placeholder for category search 2023-03-26 14:16:54 -04:00
renovate[bot]
b17ab944e6 fix(deps): update dependency sharp to v0.32.0 (#11395)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-25 18:05:16 -04:00
renovate[bot]
4ab60c888c fix(deps): update dependency esbuild to v0.17.13 (#11397)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-25 18:05:07 -04:00
renovate[bot]
e753603e6a fix(deps): update dependency csrf-sync to v4.0.1 (#11398)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-25 18:02:01 -04:00
Misty Release Bot
b4292cf517 Latest translations and fallbacks 2023-03-25 09:17:57 +00:00
Julian Lam
33ad5a724a fix: buttons for post queue content editing 2023-03-24 16:35:41 -04:00
renovate[bot]
6947e60b47 fix(deps): update dependency @popperjs/core to v2.11.7 (#11394)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-24 13:59:57 -04:00
renovate[bot]
034666b4c1 chore(deps): update dependency sass-embedded to v1.60.0 (#11392)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-24 13:16:04 -04:00
Barış Soner Uşaklı
7b7f473e14 chore: up themes 2023-03-24 11:57:52 -04:00
Barış Soner Uşaklı
6b89884dd5 use selected class for user status elements 2023-03-24 11:53:20 -04:00
Misty Release Bot
ae5d4025b2 Latest translations and fallbacks 2023-03-24 09:18:38 +00:00
renovate[bot]
400a7abf55 fix(deps): update dependency sass to v1.60.0 (#11391)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-23 19:56:39 -04:00
renovate[bot]
5d2900e95d fix(deps): update dependency rimraf to v4.4.1 (#11388)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-23 19:56:30 -04:00
renovate[bot]
96305e12c9 fix(deps): update dependency @isaacs/ttlcache to v1.2.2 (#11389)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-23 19:56:14 -04:00
renovate[bot]
5a7104f13f fix(deps): update dependency html-to-text to v9.0.5 (#11390)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-23 19:55:59 -04:00
Misty Release Bot
1c0808d779 Latest translations and fallbacks 2023-03-23 09:18:16 +00:00
Barış Soner Uşaklı
1a07b77f88 Merge branch 'develop' of https://github.com/NodeBB/NodeBB into develop 2023-03-22 19:58:55 -04:00
Barış Soner Uşaklı
361441bd02 chore: up harmony 2023-03-22 19:58:50 -04:00
Misty Release Bot
04652ceb95 chore(i18n): fallback strings for new resources: nodebb.topic 2023-03-22 23:58:34 +00:00
Barış Soner Uşaklı
661a6e0473 https://github.com/NodeBB/NodeBB/issues/11329 2023-03-22 19:58:05 -04:00
renovate[bot]
97f081353f fix(deps): update dependency helmet to v6 (#10891)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-22 18:46:50 -04:00
renovate[bot]
98b58bcc3e fix(deps): update dependency nodebb-widget-essentials to v7.0.7 (#11387)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-22 18:07:55 -04:00
renovate[bot]
8c07a8d7e0 fix(deps): update dependency mkdirp to v2.1.6 (#11386)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-22 18:07:43 -04:00
renovate[bot]
69a7bfbe71 chore(deps): update dependency @commitlint/cli to v17.5.0 (#11384)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-22 18:03:45 -04:00
renovate[bot]
7f54709da7 fix(deps): update dependency webpack to v5.76.3 (#11385)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-22 18:03:26 -04:00
Julian Lam
03e05b5154 fix: #9397, trash the active session on account lockout, if there is one 2023-03-22 17:08:37 -04:00
80 changed files with 528 additions and 405 deletions

View File

@@ -1,3 +1,51 @@
#### v2.8.10 (2023-03-27)
##### Chores
* up composer-default (e9a8e195)
* incrementing version number - v2.8.9 (57f14e41)
* update changelog for v2.8.9 (18b2150e)
* incrementing version number - v2.8.8 (b331b942)
* incrementing version number - v2.8.7 (3f8248d6)
* incrementing version number - v2.8.6 (af6ce447)
* incrementing version number - v2.8.5 (bff5ce2d)
* incrementing version number - v2.8.4 (a46b2bbc)
* incrementing version number - v2.8.3 (c20b20a7)
* incrementing version number - v2.8.2 (050e43f8)
* incrementing version number - v2.8.1 (727f879e)
* incrementing version number - v2.8.0 (8e77673d)
* incrementing version number - v2.7.0 (96cc0617)
* incrementing version number - v2.6.1 (7e52a7a5)
* incrementing version number - v2.6.0 (e7fcf482)
* incrementing version number - v2.5.8 (dec0e7de)
* incrementing version number - v2.5.7 (5836bf4a)
* incrementing version number - v2.5.6 (c7bd7dbf)
* incrementing version number - v2.5.5 (3509ed94)
* incrementing version number - v2.5.4 (e83260ca)
* incrementing version number - v2.5.3 (7e922936)
* incrementing version number - v2.5.2 (babcd17e)
* incrementing version number - v2.5.1 (ce3aa950)
* incrementing version number - v2.5.0 (01d276cb)
* incrementing version number - v2.4.5 (dd3e1a28)
* incrementing version number - v2.4.4 (d5525c87)
* incrementing version number - v2.4.3 (9c647c6c)
* incrementing version number - v2.4.2 (3aa7b855)
* incrementing version number - v2.4.1 (60cbd148)
* incrementing version number - v2.4.0 (4834cde3)
* incrementing version number - v2.3.1 (d2425942)
* incrementing version number - v2.3.0 (046ea120)
##### Bug Fixes
* #11403, remove loader.js crash counter logic (830f142b)
* don't crash if event name is not a string (37b48b82)
* closes #11173, move cache clear code (c2961ad4)
##### Other Changes
* fix arrow (1aff9cad)
* whitespace (894f392b)
#### v2.8.9 (2023-03-19)
##### Chores

View File

@@ -29,8 +29,8 @@
},
"dependencies": {
"@adactive/bootstrap-tagsinput": "0.8.2",
"@isaacs/ttlcache": "1.2.1",
"@popperjs/core": "2.11.6",
"@isaacs/ttlcache": "1.2.2",
"@popperjs/core": "2.11.7",
"ace-builds": "1.16.0",
"archiver": "5.3.1",
"async": "3.2.4",
@@ -57,18 +57,18 @@
"cookie-parser": "1.4.6",
"cron": "2.3.0",
"cropperjs": "1.5.13",
"csrf-sync": "4.0.0",
"csrf-sync": "4.0.1",
"daemon": "1.1.0",
"diff": "5.1.0",
"esbuild": "0.17.12",
"esbuild": "0.17.14",
"express": "4.18.2",
"express-session": "1.17.3",
"express-useragent": "1.0.15",
"file-loader": "6.2.0",
"fs-extra": "11.1.1",
"graceful-fs": "4.2.11",
"helmet": "5.1.1",
"html-to-text": "9.0.4",
"helmet": "6.0.1",
"html-to-text": "9.0.5",
"ipaddr.js": "2.0.1",
"jquery": "3.6.4",
"jquery-deserialize": "2.0.0",
@@ -84,7 +84,7 @@
"lru-cache": "8.0.4",
"material-design-lite": "1.3.0",
"mime": "3.0.0",
"mkdirp": "2.1.5",
"mkdirp": "2.1.6",
"mongodb": "5.1.0",
"morgan": "1.10.0",
"mousetrap": "1.6.5",
@@ -100,11 +100,11 @@
"nodebb-plugin-ntfy": "1.0.15",
"nodebb-plugin-spam-be-gone": "2.0.6",
"nodebb-rewards-essentials": "0.2.2",
"nodebb-theme-harmony": "1.0.0-beta.81",
"nodebb-theme-harmony": "1.0.0-beta.84",
"nodebb-theme-lavender": "7.0.9",
"nodebb-theme-peace": "2.0.19",
"nodebb-theme-persona": "13.0.51",
"nodebb-widget-essentials": "7.0.6",
"nodebb-theme-persona": "13.0.53",
"nodebb-widget-essentials": "7.0.7",
"nodemailer": "6.9.1",
"nprogress": "0.2.0",
"passport": "0.6.0",
@@ -119,14 +119,14 @@
"ioredis": "5.3.1",
"request": "2.88.2",
"request-promise-native": "1.0.9",
"rimraf": "4.4.0",
"rimraf": "4.4.1",
"rss": "1.2.2",
"rtlcss": "4.0.0",
"sanitize-html": "2.10.0",
"sass": "1.59.3",
"sass": "1.60.0",
"semver": "7.3.8",
"serve-favicon": "2.5.0",
"sharp": "0.31.3",
"sharp": "0.32.0",
"sitemap": "7.1.1",
"slideout": "1.0.1",
"socket.io": "4.6.1",
@@ -142,7 +142,7 @@
"tinycon": "0.6.8",
"toobusy-js": "0.5.1",
"validator": "13.9.0",
"webpack": "5.76.2",
"webpack": "5.76.3",
"webpack-merge": "5.8.0",
"winston": "3.8.2",
"xml": "1.0.1",
@@ -152,7 +152,7 @@
},
"devDependencies": {
"@apidevtools/swagger-parser": "10.1.0",
"@commitlint/cli": "17.4.4",
"@commitlint/cli": "17.5.0",
"@commitlint/config-angular": "17.4.4",
"coveralls": "3.1.1",
"eslint": "8.36.0",
@@ -170,7 +170,7 @@
"smtp-server": "3.11.0"
},
"optionalDependencies": {
"sass-embedded": "1.59.3"
"sass-embedded": "1.60.0"
},
"resolutions": {
"*/jquery": "3.6.4"

View File

@@ -30,9 +30,7 @@ const output = logrotate({ file: outputLogFilePath, size: '1m', keep: 3, compres
const silent = nconf.get('silent') === 'false' ? false : nconf.get('silent') !== false;
let numProcs;
const workers = [];
const Loader = {
timesStarted: 0,
};
const Loader = {};
const appPath = path.join(__dirname, 'app.js');
Loader.init = function () {
@@ -57,21 +55,6 @@ Loader.displayStartupMessages = function () {
Loader.addWorkerEvents = function (worker) {
worker.on('exit', (code, signal) => {
if (code !== 0) {
if (Loader.timesStarted < numProcs * 3) {
Loader.timesStarted += 1;
if (Loader.crashTimer) {
clearTimeout(Loader.crashTimer);
}
Loader.crashTimer = setTimeout(() => {
Loader.timesStarted = 0;
}, 10000);
} else {
console.log(`${numProcs * 3} restarts in 10 seconds, most likely an error on startup. Halting.`);
process.exit();
}
}
console.log(`[cluster] Child Process (${worker.pid}) has exited (code: ${code}, signal: ${signal})`);
if (!(worker.suicide || code === 0)) {
console.log('[cluster] Spinning up another process...');

View File

@@ -39,10 +39,10 @@
"copy-ip": "Copy IP",
"ban-ip": "Ban IP",
"view-history": "Edit History",
"wrote-ago": "wrote <span class=\"timeago\" title=\"%1\"></span>",
"wrote-on": "wrote on <span class=\"timeago\" title=\"%1\"></span>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <span class=\"timeago\" title=\"%4\"></span>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <span class=\"timeago\" title=\"%4\"></span>",
"wrote-ago": "wrote <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"wrote-on": "wrote on <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <a href=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <a hrf=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"user-locked-topic-ago": "%1 locked this topic %2",
"user-locked-topic-on": "%1 locked this topic on %2",
"user-unlocked-topic-ago": "%1 unlocked this topic %2",

View File

@@ -6,7 +6,7 @@
"enabling-help": "За да включите тази функционалност, идете в <a href=\"%1\">Настройки &rarr; Публикуване &rarr; Опашка за публикации</a> и включете <strong>Опашката за публикации</strong>.",
"back-to-list": "Назад към Опашката за публикации",
"user": "Потребител",
"when": "When",
"when": "Кога",
"category": "Категория",
"title": "Заглавие",
"content": "Съдържание",

View File

@@ -39,10 +39,10 @@
"copy-ip": "Копиране на IP адреса",
"ban-ip": "Блокиране на IP адреса",
"view-history": "История на редакциите",
"wrote-ago": "писа <span class=\"timeago\" title=\"%1\"></span>",
"wrote-on": "писа на <span class=\"timeago\" title=\"%1\"></span>",
"replied-to-user-ago": "отговори на <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <span class=\"timeago\" title=\"%4\"></span>",
"replied-to-user-on": "отговори на <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> на <span class=\"timeago\" title=\"%4\"></span>",
"wrote-ago": "писа <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"wrote-on": "писа на <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"replied-to-user-ago": "отговори на <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <a href=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"replied-to-user-on": "отговори на <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> на <a hrf=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"user-locked-topic-ago": "%1 заключи тази тема %2",
"user-locked-topic-on": "%1 заключи тази тема на %2",
"user-unlocked-topic-ago": "%1 отключи тази тема %2",

View File

@@ -39,10 +39,10 @@
"copy-ip": "Copy IP",
"ban-ip": "Ban IP",
"view-history": "Edit History",
"wrote-ago": "wrote <span class=\"timeago\" title=\"%1\"></span>",
"wrote-on": "wrote on <span class=\"timeago\" title=\"%1\"></span>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <span class=\"timeago\" title=\"%4\"></span>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <span class=\"timeago\" title=\"%4\"></span>",
"wrote-ago": "wrote <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"wrote-on": "wrote on <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <a href=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <a hrf=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"user-locked-topic-ago": "%1 locked this topic %2",
"user-locked-topic-on": "%1 locked this topic on %2",
"user-unlocked-topic-ago": "%1 unlocked this topic %2",

View File

@@ -39,10 +39,10 @@
"copy-ip": "Kopírovat IP",
"ban-ip": "Zakázat IP",
"view-history": "Upravit historii",
"wrote-ago": "wrote <span class=\"timeago\" title=\"%1\"></span>",
"wrote-on": "wrote on <span class=\"timeago\" title=\"%1\"></span>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <span class=\"timeago\" title=\"%4\"></span>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <span class=\"timeago\" title=\"%4\"></span>",
"wrote-ago": "wrote <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"wrote-on": "wrote on <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <a href=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <a hrf=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"user-locked-topic-ago": "%1 locked this topic %2",
"user-locked-topic-on": "%1 locked this topic on %2",
"user-unlocked-topic-ago": "%1 unlocked this topic %2",

View File

@@ -39,10 +39,10 @@
"copy-ip": "Copy IP",
"ban-ip": "Ban IP",
"view-history": "Edit History",
"wrote-ago": "wrote <span class=\"timeago\" title=\"%1\"></span>",
"wrote-on": "wrote on <span class=\"timeago\" title=\"%1\"></span>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <span class=\"timeago\" title=\"%4\"></span>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <span class=\"timeago\" title=\"%4\"></span>",
"wrote-ago": "wrote <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"wrote-on": "wrote on <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <a href=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <a hrf=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"user-locked-topic-ago": "%1 locked this topic %2",
"user-locked-topic-on": "%1 locked this topic on %2",
"user-unlocked-topic-ago": "%1 unlocked this topic %2",

View File

@@ -39,10 +39,10 @@
"copy-ip": "IP-Adresse Kopieren",
"ban-ip": "IP-Adresse bannen",
"view-history": "Verlauf bearbeiten",
"wrote-ago": "wrote <span class=\"timeago\" title=\"%1\"></span>",
"wrote-on": "wrote on <span class=\"timeago\" title=\"%1\"></span>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <span class=\"timeago\" title=\"%4\"></span>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <span class=\"timeago\" title=\"%4\"></span>",
"wrote-ago": "wrote <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"wrote-on": "wrote on <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <a href=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <a hrf=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"user-locked-topic-ago": "%1 locked this topic %2",
"user-locked-topic-on": "%1 locked this topic on %2",
"user-unlocked-topic-ago": "%1 unlocked this topic %2",

View File

@@ -39,10 +39,10 @@
"copy-ip": "Copy IP",
"ban-ip": "Ban IP",
"view-history": "Edit History",
"wrote-ago": "wrote <span class=\"timeago\" title=\"%1\"></span>",
"wrote-on": "wrote on <span class=\"timeago\" title=\"%1\"></span>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <span class=\"timeago\" title=\"%4\"></span>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <span class=\"timeago\" title=\"%4\"></span>",
"wrote-ago": "wrote <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"wrote-on": "wrote on <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <a href=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <a hrf=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"user-locked-topic-ago": "%1 locked this topic %2",
"user-locked-topic-on": "%1 locked this topic on %2",
"user-unlocked-topic-ago": "%1 unlocked this topic %2",

View File

@@ -43,10 +43,10 @@
"ban-ip": "Ban IP",
"view-history": "Edit History",
"wrote-ago": "wrote <span class=\"timeago\" title=\"%1\"></span>",
"wrote-on": "wrote on <span class=\"timeago\" title=\"%1\"></span>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <span class=\"timeago\" title=\"%4\"></span>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <span class=\"timeago\" title=\"%4\"></span>",
"wrote-ago": "wrote <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"wrote-on": "wrote on <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <a href=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <a hrf=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"user-locked-topic-ago": "%1 locked this topic %2",
"user-locked-topic-on": "%1 locked this topic on %2",

View File

@@ -39,10 +39,10 @@
"copy-ip": "Copy IP",
"ban-ip": "Ban IP",
"view-history": "Edit History",
"wrote-ago": "wrote <span class=\"timeago\" title=\"%1\"></span>",
"wrote-on": "wrote on <span class=\"timeago\" title=\"%1\"></span>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <span class=\"timeago\" title=\"%4\"></span>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <span class=\"timeago\" title=\"%4\"></span>",
"wrote-ago": "wrote <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"wrote-on": "wrote on <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <a href=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <a hrf=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"user-locked-topic-ago": "%1 locked this topic %2",
"user-locked-topic-on": "%1 locked this topic on %2",
"user-unlocked-topic-ago": "%1 unlocked this topic %2",

View File

@@ -39,10 +39,10 @@
"copy-ip": "Copy IP",
"ban-ip": "Ban IP",
"view-history": "Edit History",
"wrote-ago": "wrote <span class=\"timeago\" title=\"%1\"></span>",
"wrote-on": "wrote on <span class=\"timeago\" title=\"%1\"></span>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <span class=\"timeago\" title=\"%4\"></span>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <span class=\"timeago\" title=\"%4\"></span>",
"wrote-ago": "wrote <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"wrote-on": "wrote on <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <a href=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <a hrf=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"user-locked-topic-ago": "%1 locked this topic %2",
"user-locked-topic-on": "%1 locked this topic on %2",
"user-unlocked-topic-ago": "%1 unlocked this topic %2",

View File

@@ -39,10 +39,10 @@
"copy-ip": "Copiar IP",
"ban-ip": "Banear IP",
"view-history": "Editar Historial",
"wrote-ago": "wrote <span class=\"timeago\" title=\"%1\"></span>",
"wrote-on": "wrote on <span class=\"timeago\" title=\"%1\"></span>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <span class=\"timeago\" title=\"%4\"></span>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <span class=\"timeago\" title=\"%4\"></span>",
"wrote-ago": "wrote <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"wrote-on": "wrote on <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <a href=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <a hrf=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"user-locked-topic-ago": "%1 locked this topic %2",
"user-locked-topic-on": "%1 locked this topic on %2",
"user-unlocked-topic-ago": "%1 unlocked this topic %2",

View File

@@ -39,10 +39,10 @@
"copy-ip": "Copy IP",
"ban-ip": "Ban IP",
"view-history": "Edit History",
"wrote-ago": "wrote <span class=\"timeago\" title=\"%1\"></span>",
"wrote-on": "wrote on <span class=\"timeago\" title=\"%1\"></span>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <span class=\"timeago\" title=\"%4\"></span>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <span class=\"timeago\" title=\"%4\"></span>",
"wrote-ago": "wrote <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"wrote-on": "wrote on <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <a href=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <a hrf=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"user-locked-topic-ago": "%1 locked this topic %2",
"user-locked-topic-on": "%1 locked this topic on %2",
"user-unlocked-topic-ago": "%1 unlocked this topic %2",

View File

@@ -39,10 +39,10 @@
"copy-ip": "کپی IP",
"ban-ip": "مسدود کردن IP",
"view-history": "تاریخچه ویرایش",
"wrote-ago": "wrote <span class=\"timeago\" title=\"%1\"></span>",
"wrote-on": "wrote on <span class=\"timeago\" title=\"%1\"></span>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <span class=\"timeago\" title=\"%4\"></span>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <span class=\"timeago\" title=\"%4\"></span>",
"wrote-ago": "wrote <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"wrote-on": "wrote on <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <a href=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <a hrf=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"user-locked-topic-ago": "%1 locked this topic %2",
"user-locked-topic-on": "%1 locked this topic on %2",
"user-unlocked-topic-ago": "%1 unlocked this topic %2",

View File

@@ -39,10 +39,10 @@
"copy-ip": "Kopioi IP",
"ban-ip": "Ban IP",
"view-history": "Muokkaa historiaa",
"wrote-ago": "wrote <span class=\"timeago\" title=\"%1\"></span>",
"wrote-on": "wrote on <span class=\"timeago\" title=\"%1\"></span>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <span class=\"timeago\" title=\"%4\"></span>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <span class=\"timeago\" title=\"%4\"></span>",
"wrote-ago": "wrote <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"wrote-on": "wrote on <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <a href=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <a hrf=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"user-locked-topic-ago": "%1 locked this topic %2",
"user-locked-topic-on": "%1 locked this topic on %2",
"user-unlocked-topic-ago": "%1 unlocked this topic %2",

View File

@@ -39,10 +39,10 @@
"copy-ip": "Copier l'IP",
"ban-ip": "Bannir l'IP",
"view-history": "Éditer l'historique",
"wrote-ago": "wrote <span class=\"timeago\" title=\"%1\"></span>",
"wrote-on": "wrote on <span class=\"timeago\" title=\"%1\"></span>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <span class=\"timeago\" title=\"%4\"></span>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <span class=\"timeago\" title=\"%4\"></span>",
"wrote-ago": "wrote <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"wrote-on": "wrote on <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <a href=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <a hrf=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"user-locked-topic-ago": "%1 locked this topic %2",
"user-locked-topic-on": "%1 locked this topic on %2",
"user-unlocked-topic-ago": "%1 unlocked this topic %2",

View File

@@ -39,10 +39,10 @@
"copy-ip": "Copy IP",
"ban-ip": "Ban IP",
"view-history": "Edit History",
"wrote-ago": "wrote <span class=\"timeago\" title=\"%1\"></span>",
"wrote-on": "wrote on <span class=\"timeago\" title=\"%1\"></span>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <span class=\"timeago\" title=\"%4\"></span>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <span class=\"timeago\" title=\"%4\"></span>",
"wrote-ago": "wrote <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"wrote-on": "wrote on <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <a href=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <a hrf=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"user-locked-topic-ago": "%1 locked this topic %2",
"user-locked-topic-on": "%1 locked this topic on %2",
"user-unlocked-topic-ago": "%1 unlocked this topic %2",

View File

@@ -39,10 +39,10 @@
"copy-ip": "העתקת IP",
"ban-ip": "הרחקת IP",
"view-history": "עריכת היסטוריה",
"wrote-ago": "wrote <span class=\"timeago\" title=\"%1\"></span>",
"wrote-on": "wrote on <span class=\"timeago\" title=\"%1\"></span>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <span class=\"timeago\" title=\"%4\"></span>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <span class=\"timeago\" title=\"%4\"></span>",
"wrote-ago": "wrote <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"wrote-on": "wrote on <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <a href=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <a hrf=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"user-locked-topic-ago": "%1 locked this topic %2",
"user-locked-topic-on": "%1 locked this topic on %2",
"user-unlocked-topic-ago": "%1 unlocked this topic %2",

View File

@@ -39,10 +39,10 @@
"copy-ip": "Copy IP",
"ban-ip": "Ban IP",
"view-history": "Edit History",
"wrote-ago": "wrote <span class=\"timeago\" title=\"%1\"></span>",
"wrote-on": "wrote on <span class=\"timeago\" title=\"%1\"></span>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <span class=\"timeago\" title=\"%4\"></span>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <span class=\"timeago\" title=\"%4\"></span>",
"wrote-ago": "wrote <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"wrote-on": "wrote on <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <a href=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <a hrf=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"user-locked-topic-ago": "%1 locked this topic %2",
"user-locked-topic-on": "%1 locked this topic on %2",
"user-unlocked-topic-ago": "%1 unlocked this topic %2",

View File

@@ -39,10 +39,10 @@
"copy-ip": "IP-cím másolása",
"ban-ip": "IP-cím kitiltása",
"view-history": "Előzmények szerkesztése",
"wrote-ago": "wrote <span class=\"timeago\" title=\"%1\"></span>",
"wrote-on": "wrote on <span class=\"timeago\" title=\"%1\"></span>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <span class=\"timeago\" title=\"%4\"></span>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <span class=\"timeago\" title=\"%4\"></span>",
"wrote-ago": "wrote <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"wrote-on": "wrote on <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <a href=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <a hrf=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"user-locked-topic-ago": "%1 locked this topic %2",
"user-locked-topic-on": "%1 locked this topic on %2",
"user-unlocked-topic-ago": "%1 unlocked this topic %2",

View File

@@ -39,10 +39,10 @@
"copy-ip": "Պատճենել IP",
"ban-ip": "Արգելել IP-ն",
"view-history": "Խմբագրել պատմությունը",
"wrote-ago": "wrote <span class=\"timeago\" title=\"%1\"></span>",
"wrote-on": "wrote on <span class=\"timeago\" title=\"%1\"></span>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <span class=\"timeago\" title=\"%4\"></span>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <span class=\"timeago\" title=\"%4\"></span>",
"wrote-ago": "wrote <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"wrote-on": "wrote on <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <a href=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <a hrf=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"user-locked-topic-ago": "%1 locked this topic %2",
"user-locked-topic-on": "%1 locked this topic on %2",
"user-unlocked-topic-ago": "%1 unlocked this topic %2",

View File

@@ -39,10 +39,10 @@
"copy-ip": "Copy IP",
"ban-ip": "Ban IP",
"view-history": "Edit History",
"wrote-ago": "wrote <span class=\"timeago\" title=\"%1\"></span>",
"wrote-on": "wrote on <span class=\"timeago\" title=\"%1\"></span>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <span class=\"timeago\" title=\"%4\"></span>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <span class=\"timeago\" title=\"%4\"></span>",
"wrote-ago": "wrote <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"wrote-on": "wrote on <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <a href=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <a hrf=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"user-locked-topic-ago": "%1 locked this topic %2",
"user-locked-topic-on": "%1 locked this topic on %2",
"user-unlocked-topic-ago": "%1 unlocked this topic %2",

View File

@@ -39,10 +39,10 @@
"copy-ip": "Copia indirizzo IP",
"ban-ip": "Banna indirizzo IP",
"view-history": "Modifica storico",
"wrote-ago": "wrote <span class=\"timeago\" title=\"%1\"></span>",
"wrote-on": "wrote on <span class=\"timeago\" title=\"%1\"></span>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <span class=\"timeago\" title=\"%4\"></span>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <span class=\"timeago\" title=\"%4\"></span>",
"wrote-ago": "wrote <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"wrote-on": "wrote on <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <a href=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <a hrf=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"user-locked-topic-ago": "%1 locked this topic %2",
"user-locked-topic-on": "%1 locked this topic on %2",
"user-unlocked-topic-ago": "%1 unlocked this topic %2",

View File

@@ -39,10 +39,10 @@
"copy-ip": "IPをコピー",
"ban-ip": "IPをBan",
"view-history": "履歴を編集",
"wrote-ago": "wrote <span class=\"timeago\" title=\"%1\"></span>",
"wrote-on": "wrote on <span class=\"timeago\" title=\"%1\"></span>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <span class=\"timeago\" title=\"%4\"></span>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <span class=\"timeago\" title=\"%4\"></span>",
"wrote-ago": "wrote <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"wrote-on": "wrote on <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <a href=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <a hrf=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"user-locked-topic-ago": "%1 locked this topic %2",
"user-locked-topic-on": "%1 locked this topic on %2",
"user-unlocked-topic-ago": "%1 unlocked this topic %2",

View File

@@ -39,10 +39,10 @@
"copy-ip": "IP 복사",
"ban-ip": "IP 차단",
"view-history": "편집 기록",
"wrote-ago": "wrote <span class=\"timeago\" title=\"%1\"></span>",
"wrote-on": "wrote on <span class=\"timeago\" title=\"%1\"></span>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <span class=\"timeago\" title=\"%4\"></span>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <span class=\"timeago\" title=\"%4\"></span>",
"wrote-ago": "wrote <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"wrote-on": "wrote on <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <a href=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <a hrf=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"user-locked-topic-ago": "%1 locked this topic %2",
"user-locked-topic-on": "%1 locked this topic on %2",
"user-unlocked-topic-ago": "%1 unlocked this topic %2",

View File

@@ -39,10 +39,10 @@
"copy-ip": "Copy IP",
"ban-ip": "Blokuoti IP",
"view-history": "Edit History",
"wrote-ago": "wrote <span class=\"timeago\" title=\"%1\"></span>",
"wrote-on": "wrote on <span class=\"timeago\" title=\"%1\"></span>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <span class=\"timeago\" title=\"%4\"></span>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <span class=\"timeago\" title=\"%4\"></span>",
"wrote-ago": "wrote <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"wrote-on": "wrote on <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <a href=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <a hrf=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"user-locked-topic-ago": "%1 locked this topic %2",
"user-locked-topic-on": "%1 locked this topic on %2",
"user-unlocked-topic-ago": "%1 unlocked this topic %2",

View File

@@ -39,10 +39,10 @@
"copy-ip": "Kopēt IP adresi",
"ban-ip": "Bloķēt IP adresi",
"view-history": "Rediģēšanas vēsture",
"wrote-ago": "wrote <span class=\"timeago\" title=\"%1\"></span>",
"wrote-on": "wrote on <span class=\"timeago\" title=\"%1\"></span>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <span class=\"timeago\" title=\"%4\"></span>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <span class=\"timeago\" title=\"%4\"></span>",
"wrote-ago": "wrote <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"wrote-on": "wrote on <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <a href=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <a hrf=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"user-locked-topic-ago": "%1 locked this topic %2",
"user-locked-topic-on": "%1 locked this topic on %2",
"user-unlocked-topic-ago": "%1 unlocked this topic %2",

View File

@@ -39,10 +39,10 @@
"copy-ip": "Copy IP",
"ban-ip": "Ban IP",
"view-history": "Edit History",
"wrote-ago": "wrote <span class=\"timeago\" title=\"%1\"></span>",
"wrote-on": "wrote on <span class=\"timeago\" title=\"%1\"></span>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <span class=\"timeago\" title=\"%4\"></span>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <span class=\"timeago\" title=\"%4\"></span>",
"wrote-ago": "wrote <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"wrote-on": "wrote on <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <a href=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <a hrf=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"user-locked-topic-ago": "%1 locked this topic %2",
"user-locked-topic-on": "%1 locked this topic on %2",
"user-unlocked-topic-ago": "%1 unlocked this topic %2",

View File

@@ -39,10 +39,10 @@
"copy-ip": "Kopier IP",
"ban-ip": "Forby IP",
"view-history": "Redigere historie",
"wrote-ago": "wrote <span class=\"timeago\" title=\"%1\"></span>",
"wrote-on": "wrote on <span class=\"timeago\" title=\"%1\"></span>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <span class=\"timeago\" title=\"%4\"></span>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <span class=\"timeago\" title=\"%4\"></span>",
"wrote-ago": "wrote <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"wrote-on": "wrote on <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <a href=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <a hrf=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"user-locked-topic-ago": "%1 locked this topic %2",
"user-locked-topic-on": "%1 locked this topic on %2",
"user-unlocked-topic-ago": "%1 unlocked this topic %2",

View File

@@ -39,10 +39,10 @@
"copy-ip": "Kopieer IP",
"ban-ip": "Verban IP",
"view-history": "Revisie geschiedenis",
"wrote-ago": "wrote <span class=\"timeago\" title=\"%1\"></span>",
"wrote-on": "wrote on <span class=\"timeago\" title=\"%1\"></span>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <span class=\"timeago\" title=\"%4\"></span>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <span class=\"timeago\" title=\"%4\"></span>",
"wrote-ago": "wrote <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"wrote-on": "wrote on <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <a href=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <a hrf=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"user-locked-topic-ago": "%1 locked this topic %2",
"user-locked-topic-on": "%1 locked this topic on %2",
"user-unlocked-topic-ago": "%1 unlocked this topic %2",

View File

@@ -39,10 +39,10 @@
"copy-ip": "Kopiuj IP",
"ban-ip": "Blokuj IP",
"view-history": "Historia edycji",
"wrote-ago": "wrote <span class=\"timeago\" title=\"%1\"></span>",
"wrote-on": "wrote on <span class=\"timeago\" title=\"%1\"></span>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <span class=\"timeago\" title=\"%4\"></span>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <span class=\"timeago\" title=\"%4\"></span>",
"wrote-ago": "wrote <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"wrote-on": "wrote on <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <a href=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <a hrf=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"user-locked-topic-ago": "%1 locked this topic %2",
"user-locked-topic-on": "%1 locked this topic on %2",
"user-unlocked-topic-ago": "%1 unlocked this topic %2",

View File

@@ -39,10 +39,10 @@
"copy-ip": "Copiar IP",
"ban-ip": "Banir IP",
"view-history": "Histórico de Edição",
"wrote-ago": "wrote <span class=\"timeago\" title=\"%1\"></span>",
"wrote-on": "wrote on <span class=\"timeago\" title=\"%1\"></span>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <span class=\"timeago\" title=\"%4\"></span>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <span class=\"timeago\" title=\"%4\"></span>",
"wrote-ago": "wrote <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"wrote-on": "wrote on <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <a href=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <a hrf=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"user-locked-topic-ago": "%1 locked this topic %2",
"user-locked-topic-on": "%1 locked this topic on %2",
"user-unlocked-topic-ago": "%1 unlocked this topic %2",

View File

@@ -39,10 +39,10 @@
"copy-ip": "Copiar IP",
"ban-ip": "Banir IP",
"view-history": "Histórico de Edição",
"wrote-ago": "wrote <span class=\"timeago\" title=\"%1\"></span>",
"wrote-on": "wrote on <span class=\"timeago\" title=\"%1\"></span>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <span class=\"timeago\" title=\"%4\"></span>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <span class=\"timeago\" title=\"%4\"></span>",
"wrote-ago": "wrote <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"wrote-on": "wrote on <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <a href=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <a hrf=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"user-locked-topic-ago": "%1 locked this topic %2",
"user-locked-topic-on": "%1 locked this topic on %2",
"user-unlocked-topic-ago": "%1 unlocked this topic %2",

View File

@@ -39,10 +39,10 @@
"copy-ip": "Copy IP",
"ban-ip": "Ban IP",
"view-history": "Edit History",
"wrote-ago": "wrote <span class=\"timeago\" title=\"%1\"></span>",
"wrote-on": "wrote on <span class=\"timeago\" title=\"%1\"></span>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <span class=\"timeago\" title=\"%4\"></span>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <span class=\"timeago\" title=\"%4\"></span>",
"wrote-ago": "wrote <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"wrote-on": "wrote on <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <a href=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <a hrf=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"user-locked-topic-ago": "%1 locked this topic %2",
"user-locked-topic-on": "%1 locked this topic on %2",
"user-unlocked-topic-ago": "%1 unlocked this topic %2",

View File

@@ -39,10 +39,10 @@
"copy-ip": "Копировать IP",
"ban-ip": "Забанить IP",
"view-history": "История правок",
"wrote-ago": "wrote <span class=\"timeago\" title=\"%1\"></span>",
"wrote-on": "wrote on <span class=\"timeago\" title=\"%1\"></span>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <span class=\"timeago\" title=\"%4\"></span>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <span class=\"timeago\" title=\"%4\"></span>",
"wrote-ago": "wrote <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"wrote-on": "wrote on <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <a href=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <a hrf=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"user-locked-topic-ago": "%1 locked this topic %2",
"user-locked-topic-on": "%1 locked this topic on %2",
"user-unlocked-topic-ago": "%1 unlocked this topic %2",

View File

@@ -39,10 +39,10 @@
"copy-ip": "Copy IP",
"ban-ip": "Ban IP",
"view-history": "Edit History",
"wrote-ago": "wrote <span class=\"timeago\" title=\"%1\"></span>",
"wrote-on": "wrote on <span class=\"timeago\" title=\"%1\"></span>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <span class=\"timeago\" title=\"%4\"></span>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <span class=\"timeago\" title=\"%4\"></span>",
"wrote-ago": "wrote <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"wrote-on": "wrote on <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <a href=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <a hrf=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"user-locked-topic-ago": "%1 locked this topic %2",
"user-locked-topic-on": "%1 locked this topic on %2",
"user-unlocked-topic-ago": "%1 unlocked this topic %2",

View File

@@ -39,10 +39,10 @@
"copy-ip": "Copy IP",
"ban-ip": "Ban IP",
"view-history": "Edit History",
"wrote-ago": "wrote <span class=\"timeago\" title=\"%1\"></span>",
"wrote-on": "wrote on <span class=\"timeago\" title=\"%1\"></span>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <span class=\"timeago\" title=\"%4\"></span>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <span class=\"timeago\" title=\"%4\"></span>",
"wrote-ago": "wrote <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"wrote-on": "wrote on <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <a href=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <a hrf=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"user-locked-topic-ago": "%1 locked this topic %2",
"user-locked-topic-on": "%1 locked this topic on %2",
"user-unlocked-topic-ago": "%1 unlocked this topic %2",

View File

@@ -39,10 +39,10 @@
"copy-ip": "Kopírovať IP adresu",
"ban-ip": "Zablokovať IP adresu",
"view-history": "Upraviť históriu",
"wrote-ago": "wrote <span class=\"timeago\" title=\"%1\"></span>",
"wrote-on": "wrote on <span class=\"timeago\" title=\"%1\"></span>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <span class=\"timeago\" title=\"%4\"></span>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <span class=\"timeago\" title=\"%4\"></span>",
"wrote-ago": "wrote <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"wrote-on": "wrote on <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <a href=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <a hrf=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"user-locked-topic-ago": "%1 locked this topic %2",
"user-locked-topic-on": "%1 locked this topic on %2",
"user-unlocked-topic-ago": "%1 unlocked this topic %2",

View File

@@ -39,10 +39,10 @@
"copy-ip": "Kopiraj IP",
"ban-ip": "Prepovej IP",
"view-history": "Uredi zgodovino",
"wrote-ago": "wrote <span class=\"timeago\" title=\"%1\"></span>",
"wrote-on": "wrote on <span class=\"timeago\" title=\"%1\"></span>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <span class=\"timeago\" title=\"%4\"></span>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <span class=\"timeago\" title=\"%4\"></span>",
"wrote-ago": "wrote <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"wrote-on": "wrote on <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <a href=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <a hrf=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"user-locked-topic-ago": "%1 locked this topic %2",
"user-locked-topic-on": "%1 locked this topic on %2",
"user-unlocked-topic-ago": "%1 unlocked this topic %2",

View File

@@ -39,10 +39,10 @@
"copy-ip": "Kopjoni IP-në",
"ban-ip": "Pezulloni IP-në",
"view-history": "Ndrysho historinë",
"wrote-ago": "wrote <span class=\"timeago\" title=\"%1\"></span>",
"wrote-on": "wrote on <span class=\"timeago\" title=\"%1\"></span>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <span class=\"timeago\" title=\"%4\"></span>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <span class=\"timeago\" title=\"%4\"></span>",
"wrote-ago": "wrote <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"wrote-on": "wrote on <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <a href=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <a hrf=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"user-locked-topic-ago": "%1 locked this topic %2",
"user-locked-topic-on": "%1 locked this topic on %2",
"user-unlocked-topic-ago": "%1 unlocked this topic %2",

View File

@@ -6,7 +6,7 @@
"enabling-help": "За омогућавање ове функције, идите у <a href=\"%1\">Подешавања &rarr; Објава &rarr; Објаве на чекању</a> и омогућите <strong>Објаве на чекању</strong>.",
"back-to-list": "Назад на објаве на чекању",
"user": "Корисник",
"when": "When",
"when": "Када",
"category": "Категорија",
"title": "Наслов",
"content": "Садржај",
@@ -23,7 +23,7 @@
"notify": "Обавештење",
"notify-user": "Обавести корисника",
"confirm-reject": "Да ли желите да одбаците ову објаву?",
"confirm-remove": "Do you want to remove this post?",
"confirm-remove": "Да ли желите да уклоните ову објаву?",
"bulk-actions": "Масовне радње",
"accept-all": "Прихвати све",
"accept-selected": "Прихвати изабрано",
@@ -31,10 +31,10 @@
"reject-all-confirm": "Да ли желите да одбаците све објаве?",
"reject-selected": "Одбаци изабрано",
"reject-selected-confirm": "Да ли желите да одбаците изабране објаве (укупно %1)?",
"remove-all": "Remove all",
"remove-all-confirm": "Do you want to remove all posts?",
"remove-selected": "Remove Selected",
"remove-selected-confirm": "Do you want to remove %1 selected posts?",
"remove-all": "Уклони све",
"remove-all-confirm": "Да ли желите да уклоните све објаве?",
"remove-selected": "Уклони изабрано",
"remove-selected-confirm": "Да ли желите да уклоните изабране објаве (%1)?",
"bulk-accept-success": "Прихваћених објава: %1",
"bulk-reject-success": "Одбачених објава: %1"
}

View File

@@ -39,10 +39,10 @@
"copy-ip": "Копирај IP",
"ban-ip": "Бануј IP",
"view-history": "Уреди историју",
"wrote-ago": "wrote <span class=\"timeago\" title=\"%1\"></span>",
"wrote-on": "wrote on <span class=\"timeago\" title=\"%1\"></span>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <span class=\"timeago\" title=\"%4\"></span>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <span class=\"timeago\" title=\"%4\"></span>",
"wrote-ago": "wrote <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"wrote-on": "wrote on <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <a href=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <a hrf=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"user-locked-topic-ago": "%1 locked this topic %2",
"user-locked-topic-on": "%1 locked this topic on %2",
"user-unlocked-topic-ago": "%1 unlocked this topic %2",

View File

@@ -39,10 +39,10 @@
"copy-ip": "Kopiera IP",
"ban-ip": "Banna IP",
"view-history": "Redigera historik",
"wrote-ago": "wrote <span class=\"timeago\" title=\"%1\"></span>",
"wrote-on": "wrote on <span class=\"timeago\" title=\"%1\"></span>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <span class=\"timeago\" title=\"%4\"></span>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <span class=\"timeago\" title=\"%4\"></span>",
"wrote-ago": "wrote <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"wrote-on": "wrote on <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <a href=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <a hrf=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"user-locked-topic-ago": "%1 locked this topic %2",
"user-locked-topic-on": "%1 locked this topic on %2",
"user-unlocked-topic-ago": "%1 unlocked this topic %2",

View File

@@ -39,10 +39,10 @@
"copy-ip": "คัดลอก IP",
"ban-ip": "แบน IP",
"view-history": "แก้ไขประวัติ",
"wrote-ago": "wrote <span class=\"timeago\" title=\"%1\"></span>",
"wrote-on": "wrote on <span class=\"timeago\" title=\"%1\"></span>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <span class=\"timeago\" title=\"%4\"></span>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <span class=\"timeago\" title=\"%4\"></span>",
"wrote-ago": "wrote <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"wrote-on": "wrote on <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <a href=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <a hrf=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"user-locked-topic-ago": "%1 locked this topic %2",
"user-locked-topic-on": "%1 locked this topic on %2",
"user-unlocked-topic-ago": "%1 unlocked this topic %2",

View File

@@ -39,10 +39,10 @@
"copy-ip": "IP Kopyala",
"ban-ip": "IP Yasakla",
"view-history": "Geçmişi Düzenle",
"wrote-ago": "wrote <span class=\"timeago\" title=\"%1\"></span>",
"wrote-on": "wrote on <span class=\"timeago\" title=\"%1\"></span>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <span class=\"timeago\" title=\"%4\"></span>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <span class=\"timeago\" title=\"%4\"></span>",
"wrote-ago": "wrote <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"wrote-on": "wrote on <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <a href=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <a hrf=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"user-locked-topic-ago": "%1 locked this topic %2",
"user-locked-topic-on": "%1 locked this topic on %2",
"user-unlocked-topic-ago": "%1 unlocked this topic %2",

View File

@@ -39,10 +39,10 @@
"copy-ip": "Копіювати IP",
"ban-ip": "Заблокувати IP",
"view-history": "Редагувати історію",
"wrote-ago": "wrote <span class=\"timeago\" title=\"%1\"></span>",
"wrote-on": "wrote on <span class=\"timeago\" title=\"%1\"></span>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <span class=\"timeago\" title=\"%4\"></span>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <span class=\"timeago\" title=\"%4\"></span>",
"wrote-ago": "wrote <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"wrote-on": "wrote on <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <a href=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <a hrf=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"user-locked-topic-ago": "%1 locked this topic %2",
"user-locked-topic-on": "%1 locked this topic on %2",
"user-unlocked-topic-ago": "%1 unlocked this topic %2",

View File

@@ -1,7 +1,7 @@
{
"custom-css": "Custom CSS/SASS",
"custom-css.description": "Enter your own CSS/SASS declarations here, which will be applied after all other styles.",
"custom-css.enable": "Enable Custom CSS/SASS",
"custom-css": "CSS/SASS Tùy Chỉnh",
"custom-css.description": "Nhập các khai báo CSS/SASS của riêng bạn tại đây, sẽ được áp dụng sau tất cả các kiểu khác.",
"custom-css.enable": "Bật CSS/SASS Tùy Chỉnh",
"custom-js": "Javascript tùy chỉnh",
"custom-js.description": "Nhập javascript của riêng bạn ở đây. Nó sẽ được thực hiện sau khi trang được tải hoàn toàn.",

View File

@@ -13,7 +13,7 @@
"description": "Mô tả",
"last-seen-ago": "Last used <span class=\"timeago\" title=\"%1\"></span>.",
"last-seen-on": "Last used on <span class=\"timeago\" title=\"%1\"></span>.",
"last-seen-never": "This key has never been used.",
"last-seen-never": "Khóa này chưa bao giờ được dùng.",
"no-description": "Không có mô tả cụ thể.",
"token-on-save": "Mã truy cập sẽ được tạo sau khi biểu mẫu được lưu"
}

View File

@@ -58,7 +58,7 @@
"users": "Người dùng",
"topics": "Chủ Đề",
"posts": "Bài Viết",
"x-posts": "<span class=\"formatted-number\">%1</span> posts",
"x-posts": "<span class=\"formatted-number\">%1</span> bài đăng",
"x-topics": "<span class=\"formatted-number\">%1</span> topics",
"best": "Tốt",
"controversial": "Gây tranh cãi",

View File

@@ -1,7 +1,7 @@
{
"chat.chatting_with": "Trò chuyện với",
"chat.placeholder": "Nhập tin nhắn trò chuyện tại đây, kéo và thả hình ảnh, nhấn enter để gửi",
"chat.placeholder.mobile": "Type chat message here",
"chat.placeholder.mobile": "Nhập tin nhắn trò chuyện tại đây",
"chat.scroll-up-alert": "Bạn đang xem các tin nhắn cũ hơn, nhấp vào đây để chuyển đến tin nhắn gần đây nhất.",
"chat.usernames-and-x-others": "%1 & %2 others",
"chat.chat-with-usernames": "Chat with %1",
@@ -46,7 +46,7 @@
"composer.compose": "Soạn thảo",
"composer.show_preview": "Hiện Xem trước",
"composer.hide_preview": "Ẩn Xem trước",
"composer.help": "Help",
"composer.help": "Trợ giúp",
"composer.user_said_in": "%1 đã nói trong %2:",
"composer.user_said": "%1 đã nói:",
"composer.discard": "Bạn có chắc chắn hủy bỏ bài viết này?",
@@ -70,9 +70,9 @@
"composer.schedule-time": "Thời gian",
"composer.cancel-scheduling": "Hủy Lập Lịch",
"composer.set-schedule-date": "Đặt Ngày",
"composer.discard-all-drafts": "Discard all drafts",
"composer.no-drafts": "You have no drafts",
"composer.discard-draft-confirm": "Do you want to discard this draft?",
"composer.discard-all-drafts": "Hủy tất cả bản nháp",
"composer.no-drafts": "Bạn không có bản nháp nào",
"composer.discard-draft-confirm": "Bạn có muốn hủy bản nháp này không?",
"bootbox.ok": "Đồng ý",
"bootbox.cancel": "Huỷ bỏ",
"bootbox.confirm": "Xác nhận",

View File

@@ -23,7 +23,7 @@
"notify": "Thông báo",
"notify-user": "Thông Báo Người Dùng",
"confirm-reject": "Bạn có muốn từ chối bài viết này không?",
"confirm-remove": "Do you want to remove this post?",
"confirm-remove": "Bạn có muốn xóa bài đăng này không?",
"bulk-actions": "Hành động số lượng lớn",
"accept-all": "Chấp nhận tất cả",
"accept-selected": "Chấp nhận đã chọn",
@@ -32,9 +32,9 @@
"reject-selected": "Từ chối đã chọn",
"reject-selected-confirm": "Bạn có muốn từ chối %1 bài viết đã chọn không?",
"remove-all": "Remove all",
"remove-all-confirm": "Do you want to remove all posts?",
"remove-all-confirm": "Bạn có muốn xóa tất cả bài đăng không?",
"remove-selected": "Remove Selected",
"remove-selected-confirm": "Do you want to remove %1 selected posts?",
"remove-selected-confirm": "Bạn có muốn xóa %1 bài đăng đã chọn không?",
"bulk-accept-success": "%1 bài đăng được chấp nhận",
"bulk-reject-success": "%1 bài đăng bị từ chối"
}

View File

@@ -1,5 +1,5 @@
{
"type-to-search": "Type to search",
"type-to-search": "Nhập để tìm kiếm",
"results_matching": "%1 kết quả khớp với \"%2\", (%3 giây)",
"no-matches": "Không tìm thấy kết quả phù hợp",
"advanced-search": "Tìm kiếm nâng cao",
@@ -10,22 +10,22 @@
"in-categories": "In categories",
"in-users": "In users",
"in-tags": "In tags",
"categories": "Categories",
"all-categories": "All categories",
"categories-x": "Categories: %1",
"categories": "Danh mục",
"all-categories": "Tất cả danh mục",
"categories-x": "Danh mục: %1",
"categories-watched-categories": "Categories: Watched categories",
"type-a-category": "Type a category",
"tags": "Tags",
"type-a-category": "Nhập một danh mục",
"tags": "Thẻ",
"tags-x": "Tags: %1",
"type-a-tag": "Type a tag",
"type-a-tag": "Nhập một thẻ",
"match-words": "Khớp các từ",
"match-all-words": "Match all words",
"match-any-word": "Match any word",
"all": "Tất cả",
"any": "Bất kì",
"posted-by": "Đăng bởi",
"posted-by-usernames": "Posted by: %1",
"type-a-username": "Type a username",
"posted-by-usernames": "Đăng bởi: %1",
"type-a-username": "Nhập tên người dùng",
"search-child-categories": "Tìm kiếm chuyên mục con",
"has-tags": "Có thẻ bên trong",
"reply-count": "Số lượt trả lời",
@@ -35,7 +35,7 @@
"at-least": "Tối thiểu",
"at-most": "Tối đa",
"relevance": "Mức độ liên quan",
"time": "Time",
"time": "Thời gian",
"post-time": "Thời gian đăng bài",
"votes": "Phiếu bầu",
"newer-than": "Mới hơn",
@@ -48,22 +48,22 @@
"three-months": "Ba tháng",
"six-months": "Sáu tháng",
"one-year": "Một năm",
"time-newer-than-86400": "Time: Newer than yesterday",
"time-older-than-86400": "Time: Older than yesterday",
"time-newer-than-604800": "Time: Newer than one week",
"time-older-than-604800": "Time: Older than one week",
"time-newer-than-1209600": "Time: Newer than two weeks",
"time-older-than-1209600": "Time: Older than two weeks",
"time-newer-than-2592000": "Time: Newer than one month",
"time-older-than-2592000": "Time: Older than one month",
"time-newer-than-7776000": "Time: Newer than three months",
"time-older-than-7776000": "Time: Older than three months",
"time-newer-than-15552000": "Time: Newer than six months",
"time-older-than-15552000": "Time: Older than six months",
"time-newer-than-31104000": "Time: Newer than one year",
"time-older-than-31104000": "Time: Older than one year",
"time-newer-than-86400": "Thời gian: Mới hơn hôm qua",
"time-older-than-86400": "Thời gian: Cũ hơn hôm qua",
"time-newer-than-604800": "Thời gian: Mới hơn một tuần",
"time-older-than-604800": "Thời gian: Cũ hơn một tuần",
"time-newer-than-1209600": "Thời gian: Mới hơn hai tuần",
"time-older-than-1209600": "Thời gian: Cũ hơn hai tuần",
"time-newer-than-2592000": "Thời gian: Mới hơn một tháng",
"time-older-than-2592000": "Thời gian: Cũ hơn một tháng",
"time-newer-than-7776000": "Thời gian: Mới hơn ba tháng",
"time-older-than-7776000": "Thời gian: Cũ hơn ba tháng",
"time-newer-than-15552000": "Thời gian: Mới hơn sáu tháng",
"time-older-than-15552000": "Thời gian: Cũ hơn sáu tháng",
"time-newer-than-31104000": "Thời gian: Mới hơn một năm",
"time-older-than-31104000": "Thời gian: Cũ hơn một năm",
"sort-by": "Sắp xếp theo",
"sort": "Sort",
"sort": "Sắp xếp",
"last-reply-time": "Thời điểm trả lời lần cuối",
"topic-title": "Tiêu đề chủ đề",
"topic-votes": "Phiếu bầu chủ đề",
@@ -74,36 +74,36 @@
"category": "Chuyên mục ",
"descending": "Theo thứ tự giảm dần",
"ascending": "Theo thứ tự tăng dần",
"sort-by-relevance-desc": "Sort by: Relevance in descending order",
"sort-by-relevance-asc": "Sort by: Relevance in ascending order",
"sort-by-timestamp-desc": "Sort by: Post time in descending order",
"sort-by-timestamp-asc": "Sort by: Post time in ascending order",
"sort-by-votes-desc": "Sort by: Votes in descending order",
"sort-by-votes-asc": "Sort by: Votes in ascending order",
"sort-by-topic.lastposttime-desc": "Sort by: Last reply time in descending order",
"sort-by-topic.lastposttime-asc": "Sort by: Last reply time in ascending order",
"sort-by-topic.title-desc": "Sort by: Topic title in descending order",
"sort-by-topic.title-asc": "Sort by: Topic title in ascending order",
"sort-by-topic.postcount-desc": "Sort by: Number of replies in descending order",
"sort-by-topic.postcount-asc": "Sort by: Number of replies in ascending order",
"sort-by-topic.viewcount-desc": "Sort by: Number of views in descending order",
"sort-by-topic.viewcount-asc": "Sort by: Number of views in ascending order",
"sort-by-topic.votes-desc": "Sort by: Topic votes in descending order",
"sort-by-topic.votes-asc": "Sort by: Topic votes in ascending order",
"sort-by-topic.timestamp-desc": "Sort by: Topic start date in descending order",
"sort-by-topic.timestamp-asc": "Sort by: Topic start date in ascending order",
"sort-by-user.username-desc": "Sort by: Username in descending order",
"sort-by-user.username-asc": "Sort by: Username in ascending order",
"sort-by-category.name-desc": "Sort by: Category in descending order",
"sort-by-category.name-asc": "Sort by: Category in ascending order",
"save": "Save",
"sort-by-relevance-desc": "Sắp xếp theo: Mức độ liên quan giảm dần",
"sort-by-relevance-asc": "Sắp xếp theo: Mức độ liên quan tăng dần",
"sort-by-timestamp-desc": "Sắp xếp theo: Thời gian đăng giảm dần",
"sort-by-timestamp-asc": "Sắp xếp theo: Thời gian đăng tăng dần",
"sort-by-votes-desc": "Sắp xếp theo: Lượt bình chọn giảm dần",
"sort-by-votes-asc": "Sắp xếp theo: Lượt bình chọn tăng dần",
"sort-by-topic.lastposttime-desc": "Sắp xếp theo: Thời gian trả lời cuối cùng giảm dần",
"sort-by-topic.lastposttime-asc": "Sắp xếp theo: Thời gian trả lời cuối cùng tăng dần",
"sort-by-topic.title-desc": "Sắp xếp theo: Tên chủ đề giảm dần",
"sort-by-topic.title-asc": "Sắp xếp theo: Tên chủ đề tăng dần",
"sort-by-topic.postcount-desc": "Sắp xếp theo: Số phản hồi giảm dần",
"sort-by-topic.postcount-asc": "Sắp xếp theo: Số phản hồi tăng dần",
"sort-by-topic.viewcount-desc": "Sắp xếp theo: Số lượt xem giảm dần",
"sort-by-topic.viewcount-asc": "Sắp xếp theo: Số lượt xem tăng dần",
"sort-by-topic.votes-desc": "Sắp xếp theo: Bình chọn chủ đề giảm dần",
"sort-by-topic.votes-asc": "Sắp xếp theo: Bình chọn chủ đề tăng dần",
"sort-by-topic.timestamp-desc": "Sắp xếp theo: Ngày bắt đầu chủ đề giảm dần",
"sort-by-topic.timestamp-asc": "Sắp xếp theo: Ngày bắt đầu chủ đề tăng dần",
"sort-by-user.username-desc": "Sắp xếp theo: Tên đăng nhập giảm dần",
"sort-by-user.username-asc": "Sắp xếp theo: Tên đăng nhập tăng dần",
"sort-by-category.name-desc": "Sắp xếp theo: Danh mục giảm dần",
"sort-by-category.name-asc": "Sắp xếp theo: Danh mục tăng dần",
"save": "Lưu",
"save-preferences": "Lưu tuỳ chọn",
"clear-preferences": "Xoá tuỳ chọn",
"search-preferences-saved": "Tìm kiếm tuỳ chọn đã lưu",
"search-preferences-cleared": "Tìm kiếm tuỳ chọn đã xoá",
"show-results-as": "Hiện thị kết quả theo",
"show-results-as-topics": "Show results as topics",
"show-results-as-posts": "Show results as posts",
"show-results-as-topics": "Hiển thị kết quả dưới dạng chủ đề",
"show-results-as-posts": "Hiển thị kết quả dưới dạng bài viết",
"see-more-results": "Xem thêm kết quả (%1)",
"search-in-category": "Tìm kiếm ở \"%1\""
}

View File

@@ -1,7 +1,7 @@
{
"all-tags": "All tags",
"all-tags": "Tất cả các thẻ",
"no_tag_topics": "Không có bài viết nào với thẻ này.",
"no-tags-found": "No tags found",
"no-tags-found": "Không tìm thấy thẻ nào",
"tags": "Thẻ",
"enter_tags_here": "Nhập thẻ ở đây, mỗi thẻ phải có từ %1 tới %2 ký tự.",
"enter_tags_here_short": "Nhập thẻ...",

View File

@@ -39,10 +39,10 @@
"copy-ip": "Sao chép IP",
"ban-ip": "Cấm IP",
"view-history": "Lịch sử chỉnh sửa",
"wrote-ago": "wrote <span class=\"timeago\" title=\"%1\"></span>",
"wrote-on": "wrote on <span class=\"timeago\" title=\"%1\"></span>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <span class=\"timeago\" title=\"%4\"></span>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <span class=\"timeago\" title=\"%4\"></span>",
"wrote-ago": "wrote <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"wrote-on": "wrote on <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <a href=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <a hrf=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"user-locked-topic-ago": "%1 locked this topic %2",
"user-locked-topic-on": "%1 locked this topic on %2",
"user-unlocked-topic-ago": "%1 unlocked this topic %2",
@@ -109,7 +109,7 @@
"thread_tools.purge": "Xóa hẳn chủ đề",
"thread_tools.purge_confirm": "Bạn có muốn xóa hẳn chủ đề này?",
"thread_tools.merge_topics": "Gộp chủ đề",
"thread_tools.merge": "Merge Topic",
"thread_tools.merge": "Gộp Chủ Đề",
"topic_move_success": "Chủ đề này sẽ sớm được chuyển đến \"%1\". Nhấn vào đây để hoàn tác.",
"topic_move_multiple_success": "Các chủ đề này sẽ sớm được chuyển đến \"%1\". Nhấn vào đây để hoàn tác.",
"topic_move_all_success": "Tất cả các chủ đề sẽ sớm được chuyển đến \"%1\". Nhấn vào đây để hoàn tác.",
@@ -135,7 +135,7 @@
"post_moved": "Đã chuyển bài gửi!",
"fork_topic": "Tạo bản sao chủ đề",
"enter-new-topic-title": "Nhập tiêu đề chủ đề mới",
"fork_topic_instruction": "Click the posts you want to fork, enter a title for the new topic and click fork topic",
"fork_topic_instruction": "Nhấp vào bài đăng bạn muốn rẽ nhánh, nhập tiêu đề cho chủ đề mới và nhấp vào chủ đề rẽ nhánh",
"fork_no_pids": "Chưa chọn bài gửi nào!",
"no-posts-selected": "Không bài viết nào được chọn!",
"x-posts-selected": "%1 bài viết được chọn",
@@ -150,11 +150,11 @@
"merge-new-title-for-topic": "Tiêu đề mới cho chủ đề",
"topic-id": "ID Chủ Đề",
"move_posts_instruction": "Chọn bài đăng bạn muốn di chuyển, sau đó nhập ID chủ đề hoặc đi đến chủ đề mong muốn",
"move_topic_instruction": "Select the target category and then click move",
"move_topic_instruction": "Chọn danh mục nhắm đến và sau đó nhấp vào di chuyển",
"change_owner_instruction": "Bấm vào bài viết bạn muốn chỉ định cho người dùng khác",
"composer.title_placeholder": "Nhập tiêu đề chủ đề của bạn tại đây...",
"composer.handle_placeholder": "Nhập tên/xử lý của bạn ở đây",
"composer.hide": "Hide",
"composer.hide": "Ẩn",
"composer.discard": "Huỷ bỏ",
"composer.submit": "Gửi",
"composer.additional-options": "Tùy chọn bổ sung",
@@ -200,7 +200,7 @@
"last-post": "Bài viết cuối cùng",
"go-to-my-next-post": "Đi tới bài kế tiếp của tôi",
"no-more-next-post": "Bạn không có bài viết nào khác trong chủ đề này",
"post-quick-reply": "Quick reply",
"post-quick-reply": "Trả lời nhanh",
"navigator.index": "Post %1 of %2",
"navigator.unread": "%1 unread"
"navigator.unread": "%1 chưa đọc"
}

View File

@@ -43,7 +43,7 @@
"followers": "Người theo dõi",
"following": "Đang theo dõi",
"blocks": "Khóa",
"blocked-users": "Blocked users",
"blocked-users": "Người dùng bị chặn",
"block_toggle": "Chuyển đổi khối",
"block_user": "Khóa Người Dùng",
"unblock_user": "Mở Khóa Người Dùng",
@@ -69,7 +69,7 @@
"upload_new_picture": "Tải lên ảnh mới",
"upload_new_picture_from_url": "Tải Lên Ảnh Mới Từ URL",
"current_password": "Mật khẩu hiện tại",
"new_password": "New Password",
"new_password": "Mật Khẩu Mới",
"change_password": "Đổi Mật Khẩu",
"change_password_error": "Mật khẩu không hợp lệ!",
"change_password_error_wrong_current": "Mật khẩu hiện tại của bạn không đúng",
@@ -172,7 +172,7 @@
"info.moderation-note.success": "Đã lưu ghi chú quản lý",
"info.moderation-note.add": "Thêm ghi chú",
"sessions.description": "Trang này cho phép bạn xem bất kỳ phiên hoạt động nào trên diễn đàn này và thu hồi chúng nếu cần thiết. Bạn có thể thu hồi phiên của riêng mình bằng cách đăng xuất khỏi tài khoản của bạn.",
"revoke-session": "Revoke Session",
"revoke-session": "Thu Hồi Phiên",
"browser-version-on-platform": "%1 %2 on %3",
"consent.title": "Quyền của bạn &amp; Bằng lòng",
"consent.lead": "Diễn đàn cộng đồng này thu thập và xử lý thông tin cá nhân của bạn.",

View File

@@ -39,10 +39,10 @@
"copy-ip": "复制IP",
"ban-ip": "封禁 IP",
"view-history": "编辑历史",
"wrote-ago": "wrote <span class=\"timeago\" title=\"%1\"></span>",
"wrote-on": "wrote on <span class=\"timeago\" title=\"%1\"></span>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <span class=\"timeago\" title=\"%4\"></span>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <span class=\"timeago\" title=\"%4\"></span>",
"wrote-ago": "wrote <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"wrote-on": "wrote on <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <a href=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <a hrf=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"user-locked-topic-ago": "%1 locked this topic %2",
"user-locked-topic-on": "%1 locked this topic on %2",
"user-unlocked-topic-ago": "%1 unlocked this topic %2",

View File

@@ -39,10 +39,10 @@
"copy-ip": "複製IP",
"ban-ip": "禁用IP",
"view-history": "編輯歷史",
"wrote-ago": "wrote <span class=\"timeago\" title=\"%1\"></span>",
"wrote-on": "wrote on <span class=\"timeago\" title=\"%1\"></span>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <span class=\"timeago\" title=\"%4\"></span>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <span class=\"timeago\" title=\"%4\"></span>",
"wrote-ago": "wrote <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"wrote-on": "wrote on <a href=\"%1\" class=\"timeago text-muted\" title=\"%2\"></a>",
"replied-to-user-ago": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> <a href=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"replied-to-user-on": "replied to <a component=\"post/parent\" data-topid=\"%1\" href=\"%2\">%3</a> on <a hrf=\"%4\" class=\"timeago text-muted\" title=\"%5\"></a>",
"user-locked-topic-ago": "%1 locked this topic %2",
"user-locked-topic-on": "%1 locked this topic on %2",
"user-unlocked-topic-ago": "%1 unlocked this topic %2",

View File

@@ -2,6 +2,7 @@
const hooks = require('./modules/hooks');
const { render } = require('./widgets');
const transitions = require('./modules/transitions');
window.ajaxify = window.ajaxify || {};
ajaxify.widgets = { render: render };
@@ -50,7 +51,7 @@ ajaxify.widgets = { render: render };
ajaxify.cleanup(url, ajaxify.data.template.name);
if ($('#content').hasClass('ajaxifying') && apiXHR) {
if (transitions.isActive() && apiXHR) {
apiXHR.abort();
}
@@ -67,7 +68,6 @@ ajaxify.widgets = { render: render };
}
previousBodyClass = ajaxify.data.bodyClass;
$('#footer, #content').removeClass('hide').addClass('ajaxifying');
ajaxify.loadData(url, function (err, data) {
if (!err || (
@@ -83,8 +83,12 @@ ajaxify.widgets = { render: render };
}
retry = true;
renderTemplate(url, data.templateToRender || data.template.name, data, callback);
transitions.start(async () => {
await renderTemplate(url, data.templateToRender || data.template.name, data);
if (typeof callback === 'function') {
callback();
}
});
});
return true;
@@ -157,8 +161,12 @@ ajaxify.widgets = { render: render };
data.responseJSON.config = config;
}
$('#footer, #content').removeClass('hide').addClass('ajaxifying');
return renderTemplate(url, status.toString(), data.responseJSON || {}, callback);
transitions.start(async () => {
await renderTemplate(url, status.toString(), data.responseJSON || {});
if (typeof callback === 'function') {
callback();
}
});
} else if (status === 401) {
require(['alerts'], function (alerts) {
alerts.error('[[global:please_log_in]]');
@@ -186,29 +194,24 @@ ajaxify.widgets = { render: render };
}
}
function renderTemplate(url, tpl_url, data, callback) {
async function renderTemplate(url, tpl_url, data) {
hooks.fire('action:ajaxify.loadingTemplates', {});
require(['translator', 'benchpress'], function (translator, Benchpress) {
Benchpress.render(tpl_url, data)
.then(rendered => translator.translate(rendered))
.then(function (translated) {
translated = translator.unescape(translated);
$('body').removeClass(previousBodyClass).addClass(data.bodyClass);
$('#content').html(translated);
const [translator, Benchpress] = await app.require(['translator', 'benchpressjs']);
return Benchpress.render(tpl_url, data)
.then(rendered => translator.translate(rendered))
.then(function (translated) {
console.log('got here');
translated = translator.unescape(translated);
$('body').removeClass(previousBodyClass).addClass(data.bodyClass);
$('#content').html(translated);
ajaxify.end(url, tpl_url);
ajaxify.end(url, tpl_url);
transitions.end();
if (typeof callback === 'function') {
callback();
}
$('#content, #footer').removeClass('ajaxifying');
// Only executed on ajaxify. Otherwise these'd be in ajaxify.end()
updateTitle(data.title);
updateTags();
});
});
// Only executed on ajaxify. Otherwise these'd be in ajaxify.end()
updateTitle(data.title);
updateTags();
});
}
function updateTitle(title) {

View File

@@ -30,7 +30,7 @@ define('forum/header', [
.removeClass('away online dnd offline')
.addClass(status);
$('[component="header/usercontrol"] [data-status]').each(function () {
$(this).find('span').toggleClass('fw-bold', $(this).attr('data-status') === status);
$(this).toggleClass('selected', $(this).attr('data-status') === status);
});
app.user.status = status;
});

View File

@@ -19,38 +19,13 @@ define('forum/post-queue', [
handleActions();
handleBulkActions();
handleContentEdit('.post-content', '.post-content-editable', 'textarea');
handleContentEdit('.topic-title', '.topic-title-editable', 'input');
handleContentEdit('[data-action="editContent"]', '.post-content-editable', 'textarea', '.post-content');
handleContentEdit('[data-action="editTitle"]', '.topic-title-editable', 'input', '.topic-title');
$('.posts-list').on('click', '.topic-category[data-editable]', function () {
const $this = $(this);
const id = $this.parents('[data-id]').attr('data-id');
categorySelector.modal({
onSubmit: function (selectedCategory) {
Promise.all([
api.get(`/categories/${selectedCategory.cid}`, {}),
socket.emit('posts.editQueuedContent', {
id: id,
cid: selectedCategory.cid,
}),
]).then(function (result) {
const category = result[0];
app.parseAndTranslate('post-queue', 'posts', {
posts: [{
category: category,
}],
}, function (html) {
if ($this.find('.category-text').length) {
$this.find('.category-text').text(html.find('.topic-category .category-text').text());
} else {
// for backwards compatibility, remove in 1.16.0
$this.replaceWith(html.find('.topic-category'));
}
});
}).catch(alerts.error);
},
});
return false;
$('.posts-list').on('click', '.topic-category[data-editable]', function (e) {
handleCategoryChange(this);
e.stopPropagation();
e.preventDefault();
});
$('[component="post/content"] img:not(.not-responsive)').addClass('img-fluid');
@@ -62,12 +37,13 @@ define('forum/post-queue', [
});
}
function handleContentEdit(displayClass, editableClass, inputSelector) {
$('.posts-list').on('click', displayClass, function () {
function handleContentEdit(triggerClass, editableClass, inputSelector, displayClass) {
$('.posts-list').on('click', triggerClass, function () {
const el = $(this);
const inputEl = el.parent().find(editableClass);
const inputEl = el.parents('[data-id]').find(editableClass);
const displayEl = el.parents('[data-id]').find(displayClass);
if (inputEl.length) {
el.addClass('hidden');
displayEl.addClass('hidden');
inputEl.removeClass('hidden').find(inputSelector).focus();
}
});
@@ -76,7 +52,7 @@ define('forum/post-queue', [
const textarea = $(this);
const preview = textarea.parent().parent().find(displayClass);
const id = textarea.parents('[data-id]').attr('data-id');
const titleEdit = displayClass === '.topic-title';
const titleEdit = triggerClass === '[data-action="editTitle"]';
socket.emit('posts.editQueuedContent', {
id: id,
@@ -87,12 +63,7 @@ define('forum/post-queue', [
return alerts.error(err);
}
if (titleEdit) {
if (preview.find('.title-text').length) {
preview.find('.title-text').text(data.postData.title);
} else {
// for backwards compatibility, remove in 1.16.0
preview.html(data.postData.title);
}
preview.find('.title-text').text(data.postData.title);
} else {
preview.html(data.postData.content);
}
@@ -103,6 +74,37 @@ define('forum/post-queue', [
});
}
function handleCategoryChange(categoryEl) {
const $this = $(categoryEl);
const id = $this.parents('[data-id]').attr('data-id');
categorySelector.modal({
onSubmit: function (selectedCategory) {
Promise.all([
api.get(`/categories/${selectedCategory.cid}`, {}),
socket.emit('posts.editQueuedContent', {
id: id,
cid: selectedCategory.cid,
}),
]).then(function (result) {
const category = result[0];
app.parseAndTranslate('post-queue', 'posts', {
posts: [{
category: category,
}],
}, function (html) {
if ($this.find('.category-text').length) {
$this.find('.category-text').text(html.find('.topic-category .category-text').text());
} else {
// for backwards compatibility, remove in 1.16.0
$this.replaceWith(html.find('.topic-category'));
}
});
}).catch(alerts.error);
},
});
return false;
}
function handleActions() {
const listEl = document.querySelector('.posts-list');
if (listEl) {
@@ -113,6 +115,12 @@ define('forum/post-queue', [
const uid = subselector.closest('[data-uid]').getAttribute('data-uid');
switch (action) {
case 'editCategory': {
const categoryEl = e.target.closest('[data-id]').querySelector('.topic-category');
handleCategoryChange(categoryEl);
break;
}
case 'ban':
AccountModerate.banAccount(uid, ajaxify.refresh);
break;
@@ -151,6 +159,7 @@ define('forum/post-queue', [
}
async function handleQueueActions() {
// accept, reject, notify
function getMessage() {
return new Promise((resolve) => {
const modal = bootbox.dialog({

View File

@@ -328,13 +328,13 @@ module.exports = function (utils, Benchpress, relative_path) {
post.parent.username : '[[global:guest]]';
const isBeforeCutoff = post.timestamp < (Date.now() - (timeagoCutoff * oneDayInMs));
const langSuffix = isBeforeCutoff ? 'on' : 'ago';
return `[[topic:replied-to-user-${langSuffix}, ${post.toPid}, ${relative_path}/post/${post.toPid}, ${username}, ${post.timestampISO}]]`;
return `[[topic:replied-to-user-${langSuffix}, ${post.toPid}, ${relative_path}/post/${post.toPid}, ${username}, ${relative_path}/post/${post.pid}, ${post.timestampISO}]]`;
}
function generateWrote(post, timeagoCutoff) {
const isBeforeCutoff = post.timestamp < (Date.now() - (timeagoCutoff * oneDayInMs));
const langSuffix = isBeforeCutoff ? 'on' : 'ago';
return `[[topic:wrote-${langSuffix}, ${post.timestampISO}]]`;
return `[[topic:wrote-${langSuffix}, ${relative_path}/post/${post.pid}, ${post.timestampISO}]]`;
}
function register() {

View File

@@ -27,12 +27,17 @@ define('tagFilter', ['hooks', 'alerts', 'bootstrap'], function (hooks, alerts, b
}
initialTags = selectedTags.slice();
const toggleSearchVisibilty = searchEl.parent('[component="tag/filter"]').length &&
app.user.privileges['search:tags'];
el.on('show.bs.dropdown', function () {
el.find('.dropdown-toggle').css({ visibility: 'hidden' });
searchEl.removeClass('hidden');
searchEl.css({
'z-index': el.find('.dropdown-toggle').css('z-index') + 1,
});
if (toggleSearchVisibilty) {
el.find('.dropdown-toggle').css({ visibility: 'hidden' });
searchEl.removeClass('hidden');
searchEl.css({
'z-index': el.find('.dropdown-toggle').css('z-index') + 1,
});
}
function doSearch() {
const val = searchEl.find('input').val();
@@ -61,8 +66,11 @@ define('tagFilter', ['hooks', 'alerts', 'bootstrap'], function (hooks, alerts, b
});
el.on('hidden.bs.dropdown', function () {
el.find('.dropdown-toggle').css({ visibility: 'inherit' });
searchEl.addClass('hidden');
if (toggleSearchVisibilty) {
el.find('.dropdown-toggle').css({ visibility: 'inherit' });
searchEl.addClass('hidden');
}
searchEl.off('click');
searchEl.find('input').off('keyup');

View File

@@ -35,6 +35,15 @@ define('topicSelect', ['components'], function (components) {
select.toggleClass('fa-check-square-o', isSelected);
select.toggleClass('fa-square-o', !isSelected);
select.parents('[component="category/topic"]').toggleClass('selected', isSelected);
updateSelectedBadgeCount();
}
function updateSelectedBadgeCount() {
const badge = $('[component="topic/selected/badge"]');
if (badge.length) {
const count = topicsContainer.find('[component="category/topic"].selected').length;
badge.text(count > 0 ? count : '');
}
}
TopicSelect.getSelectedTids = function () {

View File

@@ -0,0 +1,33 @@
let active = false;
export async function start(process) {
if (active) {
return;
}
active = true;
if (!document.startViewTransition) {
$('#footer, #content').removeClass('hide').addClass('ajaxifying');
await process();
return;
}
document.startViewTransition(process);
}
export function end() {
if (!active) {
return;
}
if (!document.startViewTransition) {
$('#content, #footer').removeClass('ajaxifying');
}
active = false;
}
export function isActive() {
return active;
}

View File

@@ -397,6 +397,9 @@ authenticationController.onSuccessfulLogin = async function (req, uid) {
}
};
const destroyAsync = util.promisify((req, callback) => req.session.destroy(callback));
const logoutAsync = util.promisify((req, callback) => req.logout(callback));
authenticationController.localLogin = async function (req, username, password, next) {
if (!username) {
return next(new Error('[[error:invalid-username]]'));
@@ -431,9 +434,17 @@ authenticationController.localLogin = async function (req, username, password, n
return next(new Error('[[error:local-login-disabled]]'));
}
const passwordMatch = await user.isPasswordCorrect(uid, password, req.ip);
if (!passwordMatch) {
return next(new Error('[[error:invalid-login-credentials]]'));
try {
const passwordMatch = await user.isPasswordCorrect(uid, password, req.ip);
if (!passwordMatch) {
return next(new Error('[[error:invalid-login-credentials]]'));
}
} catch (e) {
if (req.loggedIn) {
await logoutAsync(req);
await destroyAsync(req);
}
throw e;
}
next(null, userData, '[[success:authentication-successful]]');
@@ -442,9 +453,6 @@ authenticationController.localLogin = async function (req, username, password, n
}
};
const destroyAsync = util.promisify((req, callback) => req.session.destroy(callback));
const logoutAsync = util.promisify((req, callback) => req.logout(callback));
authenticationController.logout = async function (req, res, next) {
if (!req.loggedIn || !req.sessionID) {
res.clearCookie(nconf.get('sessionKey'), meta.configs.cookie.get());
@@ -456,7 +464,6 @@ authenticationController.logout = async function (req, res, next) {
try {
await user.auth.revokeSession(sessionID, uid);
await logoutAsync(req);
await destroyAsync(req);
res.clearCookie(nconf.get('sessionKey'), meta.configs.cookie.get());

View File

@@ -57,9 +57,10 @@ module.exports = function (Messaging) {
};
async function sendNotifications(fromuid, uids, roomId, messageObj) {
const isOnline = await user.isOnline(uids);
uids = uids.filter((uid, index) => !isOnline[index] && parseInt(fromuid, 10) !== parseInt(uid, 10));
const hasRead = await Messaging.hasRead(uids, roomId);
uids = uids.filter((uid, index) => !hasRead[index] && parseInt(fromuid, 10) !== parseInt(uid, 10));
if (!uids.length) {
delete Messaging.notifyQueue[`${fromuid}:${roomId}`];
return;
}

View File

@@ -24,6 +24,14 @@ module.exports = function (Messaging) {
await db.sortedSetRemove(`uid:${uid}:chat:rooms:unread`, roomId);
};
Messaging.hasRead = async (uids, roomId) => {
const isMembers = await db.isMemberOfSortedSets(
uids.map(uid => `uid:${uid}:chat:rooms:unread`),
roomId
);
return uids.map((uid, index) => !isMembers[index]);
};
Messaging.markAllRead = async (uid) => {
await db.delete(`uid:${uid}:chat:rooms:unread`);
};

View File

@@ -70,7 +70,7 @@ async function beforeBuild(targets) {
await plugins.prepareForBuild(targets);
await mkdirp(path.join(__dirname, '../../build/public'));
} catch (err) {
winston.error(`[build] Encountered error preparing for build\n${err.stack}`);
winston.error(`[build] Encountered error preparing for build`);
throw err;
}
}
@@ -197,7 +197,7 @@ exports.build = async function (targets, options) {
await cacheBuster.write();
winston.info(`[build] Asset compilation successful. Completed in ${totalTime}sec.`);
} catch (err) {
winston.error(`[build] Encountered error during build step\n${err.stack ? err.stack : err}`);
winston.error(`[build] Encountered error during build step`);
throw err;
}
};

View File

@@ -65,7 +65,6 @@ async function getTemplateDirs(activePlugins) {
theme = themeConfig.baseTheme;
}
themeTemplates.push(nconf.get('base_templates_path'));
themeTemplates = _.uniq(themeTemplates.reverse());
const coreTemplatesPath = nconf.get('core_templates_path');

View File

@@ -159,7 +159,7 @@ Themes.setupPaths = async () => {
const themeObj = data.themesData.find(themeObj => themeObj.id === themeId);
if (!themeObj) {
throw new Error('[[error:theme-not-found]]');
throw new Error('theme-not-found');
}
Themes.setPath(themeObj);
@@ -167,13 +167,16 @@ Themes.setupPaths = async () => {
Themes.setPath = function (themeObj) {
// Theme's templates path
let themePath = nconf.get('base_templates_path');
let themePath;
const fallback = path.join(nconf.get('themes_path'), themeObj.id, 'templates');
if (themeObj.templates) {
themePath = path.join(nconf.get('themes_path'), themeObj.id, themeObj.templates);
} else if (file.existsSync(fallback)) {
themePath = fallback;
} else {
winston.error('[themes] Unable to resolve this theme\'s templates. Expected to be at "templates/" or defined in the "templates" property of "theme.json"');
throw new Error('theme-missing-templates');
}
nconf.set('theme_templates_path', themePath);

View File

@@ -75,7 +75,6 @@ function loadConfig(configFile) {
// Ensure themes_path is a full filepath
nconf.set('themes_path', path.resolve(paths.baseDir, nconf.get('themes_path')));
nconf.set('core_templates_path', path.join(paths.baseDir, 'src/views'));
nconf.set('base_templates_path', path.join(nconf.get('themes_path'), 'nodebb-theme-harmony/templates'));
nconf.set('upload_path', path.resolve(nconf.get('base_dir'), nconf.get('upload_path')));
nconf.set('upload_url', '/assets/uploads');

View File

@@ -120,7 +120,12 @@ async function onMessage(socket, payload) {
return winston.warn('[socket.io] Empty method name');
}
const parts = eventName.toString().split('.');
if (typeof eventName !== 'string') {
const escapedName = validator.escape(String(eventName));
return callback({ message: `[[error:invalid-event, ${escapedName}]]` });
}
const parts = eventName.split('.');
const namespace = parts[0];
const methodToCall = parts.reduce((prev, cur) => {
if (prev !== null && prev[cur] && (!prev.hasOwnProperty || prev.hasOwnProperty(cur))) {

View File

@@ -73,11 +73,6 @@ module.exports = function (SocketTopics) {
// used by tag filter search
SocketTopics.tagFilterSearch = async function (socket, data) {
const allowed = await privileges.global.can('search:tags', socket.uid);
if (!allowed) {
throw new Error('[[error:no-privileges]]');
}
let cids = [];
if (Array.isArray(data.cids)) {
cids = await privileges.categories.filterCids('topics:read', data.cids, socket.uid);
@@ -87,6 +82,10 @@ module.exports = function (SocketTopics) {
let tags = [];
if (data.query) {
const allowed = await privileges.global.can('search:tags', socket.uid);
if (!allowed) {
throw new Error('[[error:no-privileges]]');
}
tags = await topics.searchTags({
query: data.query,
cid: cids.length === 1 ? cids[0] : null,

View File

@@ -5,7 +5,7 @@
<span component="category-selector-selected">[[topic:thread_tools.select_category]]</span> <span class="caret"></span>
</button>
<div component="category-selector-search" class="hidden position-absolute">
<input type="text" class="form-control" autocomplete="off">
<input type="text" class="form-control" placeholder="[[search:type-to-search]]" autocomplete="off">
</div>
<ul component="category/list" class="dropdown-menu category-dropdown-menu" role="menu">
<li component="category/no-matches" role="presentation" class="category hidden">

View File

@@ -10,7 +10,7 @@
{{{ end }}}</span> <span class="caret"></span>
</button>
<div component="category-selector-search" class="hidden position-absolute">
<input type="text" class="form-control" autocomplete="off">
<input type="text" class="form-control" placeholder="[[search:type-to-search]]" autocomplete="off">
</div>
<ul component="category/list" class="dropdown-menu category-dropdown-menu" role="menu">
<li component="category/no-matches" role="presentation" class="category hidden">

View File

@@ -3,7 +3,7 @@
<span>[[admin/manage/groups:privileges]]</span> <span class="caret"></span>
</button>
<div component="category-selector-search" class="hidden position-absolute">
<input type="text" class="form-control" autocomplete="off">
<input type="text" class="form-control" placeholder="[[search:type-to-search]]" autocomplete="off">
</div>
<ul component="category/list" class="dropdown-menu category-dropdown-menu dropdown-menu-end" role="menu">
<li component="category/no-matches" role="presentation" class="category hidden">

View File

@@ -107,6 +107,15 @@ describe('socket.io', () => {
});
});
it('should return error for invalid eventName type', (done) => {
const eventName = ['topics.loadMoreTags'];
io.emit(eventName, (err) => {
const eventAsString = String(eventName);
assert.strictEqual(err.message, `[[error:invalid-event, ${eventAsString}]]`);
done();
});
});
it('should get installed themes', (done) => {
const themes = ['nodebb-theme-persona'];
io.emit('admin.themes.getInstalled', (err, data) => {