diff --git a/.eslintignore b/.eslintignore index 3278600389..11b456699f 100644 --- a/.eslintignore +++ b/.eslintignore @@ -17,3 +17,4 @@ logs/ /coverage /build .eslintrc +test/files diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 28dd965678..ede6d5ee5c 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,13 +1,24 @@ -Please include the following information when submitting a bug report/issue: + -* NodeBB version and git hash (to find your git hash, execute `git rev-parse HEAD` from the main NodeBB directory) -* Database (mongo or redis) and it's version. -* Exact steps to cause this issue - 1. First I did this... - 2. Then, I clicked on this item... -* What you expected - * e.g. I expected *abc* to *xyz* -* What happened instead - * e.g. Instead, I got *zyx* and NodeBB set fire to my house + -Thank you! +- **NodeBB version:** +- **NodeBB git hash:** + +- **Database type:** mongo or redis +- **Database version:** + +- **Exact steps to cause this issue:** + +- **What you expected:** + +- **What happened instead:** + + + diff --git a/.gitignore b/.gitignore index dcda0224fc..66ff7ab337 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +yarn.lock npm-debug.log node_modules/ sftp-config.json @@ -17,6 +18,7 @@ provision.sh .DS_Store feeds/recent.rss .eslintcache +.svn logs/ @@ -26,6 +28,7 @@ pidfile /public/templates /public/sounds +/public/uploads # compiled files /public/stylesheet.css @@ -58,3 +61,6 @@ coverage build *.log +test/files/normalise.jpg.png +test/files/normalise-resized.jpg +package-lock.json diff --git a/.tx/config b/.tx/config index d88ed808e1..f2e0db3200 100644 --- a/.tx/config +++ b/.tx/config @@ -21,6 +21,7 @@ trans.fi = public/language/fi/category.json trans.fr = public/language/fr/category.json trans.gl = public/language/gl/category.json trans.he = public/language/he/category.json +trans.hr = public/language/hr/category.json trans.hu = public/language/hu/category.json trans.id = public/language/id/category.json trans.it = public/language/it/category.json @@ -69,6 +70,7 @@ trans.fi = public/language/fi/login.json trans.fr = public/language/fr/login.json trans.gl = public/language/gl/login.json trans.he = public/language/he/login.json +trans.hr = public/language/hr/login.json trans.hu = public/language/hu/login.json trans.id = public/language/id/login.json trans.it = public/language/it/login.json @@ -117,6 +119,7 @@ trans.fi = public/language/fi/recent.json trans.fr = public/language/fr/recent.json trans.gl = public/language/gl/recent.json trans.he = public/language/he/recent.json +trans.hr = public/language/hr/recent.json trans.hu = public/language/hu/recent.json trans.id = public/language/id/recent.json trans.it = public/language/it/recent.json @@ -165,6 +168,7 @@ trans.fi = public/language/fi/unread.json trans.fr = public/language/fr/unread.json trans.gl = public/language/gl/unread.json trans.he = public/language/he/unread.json +trans.hr = public/language/hr/unread.json trans.hu = public/language/hu/unread.json trans.id = public/language/id/unread.json trans.it = public/language/it/unread.json @@ -213,6 +217,7 @@ trans.fi = public/language/fi/modules.json trans.fr = public/language/fr/modules.json trans.gl = public/language/gl/modules.json trans.he = public/language/he/modules.json +trans.hr = public/language/hr/modules.json trans.hu = public/language/hu/modules.json trans.id = public/language/id/modules.json trans.it = public/language/it/modules.json @@ -261,6 +266,7 @@ trans.fi = public/language/fi/register.json trans.fr = public/language/fr/register.json trans.gl = public/language/gl/register.json trans.he = public/language/he/register.json +trans.hr = public/language/hr/register.json trans.hu = public/language/hu/register.json trans.id = public/language/id/register.json trans.it = public/language/it/register.json @@ -309,6 +315,7 @@ trans.fi = public/language/fi/user.json trans.fr = public/language/fr/user.json trans.gl = public/language/gl/user.json trans.he = public/language/he/user.json +trans.hr = public/language/hr/user.json trans.hu = public/language/hu/user.json trans.id = public/language/id/user.json trans.it = public/language/it/user.json @@ -357,6 +364,7 @@ trans.fi = public/language/fi/global.json trans.fr = public/language/fr/global.json trans.gl = public/language/gl/global.json trans.he = public/language/he/global.json +trans.hr = public/language/hr/global.json trans.hu = public/language/hu/global.json trans.id = public/language/id/global.json trans.it = public/language/it/global.json @@ -405,6 +413,7 @@ trans.fi = public/language/fi/notifications.json trans.fr = public/language/fr/notifications.json trans.gl = public/language/gl/notifications.json trans.he = public/language/he/notifications.json +trans.hr = public/language/hr/notifications.json trans.hu = public/language/hu/notifications.json trans.id = public/language/id/notifications.json trans.it = public/language/it/notifications.json @@ -453,6 +462,7 @@ trans.fi = public/language/fi/reset_password.json trans.fr = public/language/fr/reset_password.json trans.gl = public/language/gl/reset_password.json trans.he = public/language/he/reset_password.json +trans.hr = public/language/hr/reset_password.json trans.hu = public/language/hu/reset_password.json trans.id = public/language/id/reset_password.json trans.it = public/language/it/reset_password.json @@ -501,6 +511,7 @@ trans.fi = public/language/fi/users.json trans.fr = public/language/fr/users.json trans.gl = public/language/gl/users.json trans.he = public/language/he/users.json +trans.hr = public/language/hr/users.json trans.hu = public/language/hu/users.json trans.id = public/language/id/users.json trans.it = public/language/it/users.json @@ -549,6 +560,7 @@ trans.fi = public/language/fi/language.json trans.fr = public/language/fr/language.json trans.gl = public/language/gl/language.json trans.he = public/language/he/language.json +trans.hr = public/language/hr/language.json trans.hu = public/language/hu/language.json trans.id = public/language/id/language.json trans.it = public/language/it/language.json @@ -597,6 +609,7 @@ trans.fi = public/language/fi/pages.json trans.fr = public/language/fr/pages.json trans.gl = public/language/gl/pages.json trans.he = public/language/he/pages.json +trans.hr = public/language/hr/pages.json trans.hu = public/language/hu/pages.json trans.id = public/language/id/pages.json trans.it = public/language/it/pages.json @@ -645,6 +658,7 @@ trans.fi = public/language/fi/topic.json trans.fr = public/language/fr/topic.json trans.gl = public/language/gl/topic.json trans.he = public/language/he/topic.json +trans.hr = public/language/hr/topic.json trans.hu = public/language/hu/topic.json trans.id = public/language/id/topic.json trans.it = public/language/it/topic.json @@ -693,6 +707,7 @@ trans.fi = public/language/fi/success.json trans.fr = public/language/fr/success.json trans.gl = public/language/gl/success.json trans.he = public/language/he/success.json +trans.hr = public/language/hr/success.json trans.hu = public/language/hu/success.json trans.id = public/language/id/success.json trans.it = public/language/it/success.json @@ -741,6 +756,7 @@ trans.fi = public/language/fi/error.json trans.fr = public/language/fr/error.json trans.gl = public/language/gl/error.json trans.he = public/language/he/error.json +trans.hr = public/language/hr/error.json trans.hu = public/language/hu/error.json trans.id = public/language/id/error.json trans.it = public/language/it/error.json @@ -789,6 +805,7 @@ trans.fi = public/language/fi/flags.json trans.fr = public/language/fr/flags.json trans.gl = public/language/gl/flags.json trans.he = public/language/he/flags.json +trans.hr = public/language/hr/flags.json trans.hu = public/language/hu/flags.json trans.id = public/language/id/flags.json trans.it = public/language/it/flags.json @@ -836,6 +853,7 @@ trans.fi = public/language/fi/tags.json trans.fr = public/language/fr/tags.json trans.gl = public/language/gl/tags.json trans.he = public/language/he/tags.json +trans.hr = public/language/hr/tags.json trans.hu = public/language/hu/tags.json trans.id = public/language/id/tags.json trans.it = public/language/it/tags.json @@ -884,6 +902,7 @@ trans.fi = public/language/fi/email.json trans.fr = public/language/fr/email.json trans.gl = public/language/gl/email.json trans.he = public/language/he/email.json +trans.hr = public/language/hr/email.json trans.hu = public/language/hu/email.json trans.id = public/language/id/email.json trans.it = public/language/it/email.json @@ -932,6 +951,7 @@ trans.fi = public/language/fi/search.json trans.fr = public/language/fr/search.json trans.gl = public/language/gl/search.json trans.he = public/language/he/search.json +trans.hr = public/language/hr/search.json trans.hu = public/language/hu/search.json trans.id = public/language/id/search.json trans.it = public/language/it/search.json @@ -980,6 +1000,7 @@ trans.fi = public/language/fi/groups.json trans.fr = public/language/fr/groups.json trans.gl = public/language/gl/groups.json trans.he = public/language/he/groups.json +trans.hr = public/language/hr/groups.json trans.hu = public/language/hu/groups.json trans.id = public/language/id/groups.json trans.it = public/language/it/groups.json @@ -1028,6 +1049,7 @@ trans.fi = public/language/fi/uploads.json trans.fr = public/language/fr/uploads.json trans.gl = public/language/gl/uploads.json trans.he = public/language/he/uploads.json +trans.hr = public/language/hr/uploads.json trans.hu = public/language/hu/uploads.json trans.id = public/language/id/uploads.json trans.it = public/language/it/uploads.json @@ -1076,6 +1098,7 @@ trans.fi = public/language/fi/admin/admin.json trans.fr = public/language/fr/admin/admin.json trans.gl = public/language/gl/admin/admin.json trans.he = public/language/he/admin/admin.json +trans.hr = public/language/hr/admin/admin.json trans.hu = public/language/hu/admin/admin.json trans.id = public/language/id/admin/admin.json trans.it = public/language/it/admin/admin.json @@ -1124,6 +1147,7 @@ trans.fi = public/language/fi/admin/menu.json trans.fr = public/language/fr/admin/menu.json trans.gl = public/language/gl/admin/menu.json trans.he = public/language/he/admin/menu.json +trans.hr = public/language/hr/admin/menu.json trans.hu = public/language/hu/admin/menu.json trans.id = public/language/id/admin/menu.json trans.it = public/language/it/admin/menu.json @@ -1172,6 +1196,7 @@ trans.fi = public/language/fi/admin/advanced/cache.json trans.fr = public/language/fr/admin/advanced/cache.json trans.gl = public/language/gl/admin/advanced/cache.json trans.he = public/language/he/admin/advanced/cache.json +trans.hr = public/language/hr/admin/advanced/cache.json trans.hu = public/language/hu/admin/advanced/cache.json trans.id = public/language/id/admin/advanced/cache.json trans.it = public/language/it/admin/advanced/cache.json @@ -1220,6 +1245,7 @@ trans.fi = public/language/fi/admin/advanced/database.json trans.fr = public/language/fr/admin/advanced/database.json trans.gl = public/language/gl/admin/advanced/database.json trans.he = public/language/he/admin/advanced/database.json +trans.hr = public/language/hr/admin/advanced/database.json trans.hu = public/language/hu/admin/advanced/database.json trans.id = public/language/id/admin/advanced/database.json trans.it = public/language/it/admin/advanced/database.json @@ -1268,6 +1294,7 @@ trans.fi = public/language/fi/admin/advanced/errors.json trans.fr = public/language/fr/admin/advanced/errors.json trans.gl = public/language/gl/admin/advanced/errors.json trans.he = public/language/he/admin/advanced/errors.json +trans.hr = public/language/hr/admin/advanced/errors.json trans.hu = public/language/hu/admin/advanced/errors.json trans.id = public/language/id/admin/advanced/errors.json trans.it = public/language/it/admin/advanced/errors.json @@ -1316,6 +1343,7 @@ trans.fi = public/language/fi/admin/advanced/events.json trans.fr = public/language/fr/admin/advanced/events.json trans.gl = public/language/gl/admin/advanced/events.json trans.he = public/language/he/admin/advanced/events.json +trans.hr = public/language/hr/admin/advanced/events.json trans.hu = public/language/hu/admin/advanced/events.json trans.id = public/language/id/admin/advanced/events.json trans.it = public/language/it/admin/advanced/events.json @@ -1364,6 +1392,7 @@ trans.fi = public/language/fi/admin/advanced/logs.json trans.fr = public/language/fr/admin/advanced/logs.json trans.gl = public/language/gl/admin/advanced/logs.json trans.he = public/language/he/admin/advanced/logs.json +trans.hr = public/language/hr/admin/advanced/logs.json trans.hu = public/language/hu/admin/advanced/logs.json trans.id = public/language/id/admin/advanced/logs.json trans.it = public/language/it/admin/advanced/logs.json @@ -1412,6 +1441,7 @@ trans.fi = public/language/fi/admin/appearance/customise.json trans.fr = public/language/fr/admin/appearance/customise.json trans.gl = public/language/gl/admin/appearance/customise.json trans.he = public/language/he/admin/appearance/customise.json +trans.hr = public/language/hr/admin/appearance/customise.json trans.hu = public/language/hu/admin/appearance/customise.json trans.id = public/language/id/admin/appearance/customise.json trans.it = public/language/it/admin/appearance/customise.json @@ -1460,6 +1490,7 @@ trans.fi = public/language/fi/admin/appearance/skins.json trans.fr = public/language/fr/admin/appearance/skins.json trans.gl = public/language/gl/admin/appearance/skins.json trans.he = public/language/he/admin/appearance/skins.json +trans.hr = public/language/hr/admin/appearance/skins.json trans.hu = public/language/hu/admin/appearance/skins.json trans.id = public/language/id/admin/appearance/skins.json trans.it = public/language/it/admin/appearance/skins.json @@ -1508,6 +1539,7 @@ trans.fi = public/language/fi/admin/appearance/themes.json trans.fr = public/language/fr/admin/appearance/themes.json trans.gl = public/language/gl/admin/appearance/themes.json trans.he = public/language/he/admin/appearance/themes.json +trans.hr = public/language/hr/admin/appearance/themes.json trans.hu = public/language/hu/admin/appearance/themes.json trans.id = public/language/id/admin/appearance/themes.json trans.it = public/language/it/admin/appearance/themes.json @@ -1556,6 +1588,7 @@ trans.fi = public/language/fi/admin/development/info.json trans.fr = public/language/fr/admin/development/info.json trans.gl = public/language/gl/admin/development/info.json trans.he = public/language/he/admin/development/info.json +trans.hr = public/language/hr/admin/development/info.json trans.hu = public/language/hu/admin/development/info.json trans.id = public/language/id/admin/development/info.json trans.it = public/language/it/admin/development/info.json @@ -1604,6 +1637,7 @@ trans.fi = public/language/fi/admin/development/logger.json trans.fr = public/language/fr/admin/development/logger.json trans.gl = public/language/gl/admin/development/logger.json trans.he = public/language/he/admin/development/logger.json +trans.hr = public/language/hr/admin/development/logger.json trans.hu = public/language/hu/admin/development/logger.json trans.id = public/language/id/admin/development/logger.json trans.it = public/language/it/admin/development/logger.json @@ -1652,6 +1686,7 @@ trans.fi = public/language/fi/admin/extend/plugins.json trans.fr = public/language/fr/admin/extend/plugins.json trans.gl = public/language/gl/admin/extend/plugins.json trans.he = public/language/he/admin/extend/plugins.json +trans.hr = public/language/hr/admin/extend/plugins.json trans.hu = public/language/hu/admin/extend/plugins.json trans.id = public/language/id/admin/extend/plugins.json trans.it = public/language/it/admin/extend/plugins.json @@ -1700,6 +1735,7 @@ trans.fi = public/language/fi/admin/extend/rewards.json trans.fr = public/language/fr/admin/extend/rewards.json trans.gl = public/language/gl/admin/extend/rewards.json trans.he = public/language/he/admin/extend/rewards.json +trans.hr = public/language/hr/admin/extend/rewards.json trans.hu = public/language/hu/admin/extend/rewards.json trans.id = public/language/id/admin/extend/rewards.json trans.it = public/language/it/admin/extend/rewards.json @@ -1748,6 +1784,7 @@ trans.fi = public/language/fi/admin/extend/widgets.json trans.fr = public/language/fr/admin/extend/widgets.json trans.gl = public/language/gl/admin/extend/widgets.json trans.he = public/language/he/admin/extend/widgets.json +trans.hr = public/language/hr/admin/extend/widgets.json trans.hu = public/language/hu/admin/extend/widgets.json trans.id = public/language/id/admin/extend/widgets.json trans.it = public/language/it/admin/extend/widgets.json @@ -1796,6 +1833,7 @@ trans.fi = public/language/fi/admin/general/dashboard.json trans.fr = public/language/fr/admin/general/dashboard.json trans.gl = public/language/gl/admin/general/dashboard.json trans.he = public/language/he/admin/general/dashboard.json +trans.hr = public/language/hr/admin/general/dashboard.json trans.hu = public/language/hu/admin/general/dashboard.json trans.id = public/language/id/admin/general/dashboard.json trans.it = public/language/it/admin/general/dashboard.json @@ -1844,6 +1882,7 @@ trans.fi = public/language/fi/admin/general/homepage.json trans.fr = public/language/fr/admin/general/homepage.json trans.gl = public/language/gl/admin/general/homepage.json trans.he = public/language/he/admin/general/homepage.json +trans.hr = public/language/hr/admin/general/homepage.json trans.hu = public/language/hu/admin/general/homepage.json trans.id = public/language/id/admin/general/homepage.json trans.it = public/language/it/admin/general/homepage.json @@ -1892,6 +1931,7 @@ trans.fi = public/language/fi/admin/general/languages.json trans.fr = public/language/fr/admin/general/languages.json trans.gl = public/language/gl/admin/general/languages.json trans.he = public/language/he/admin/general/languages.json +trans.hr = public/language/hr/admin/general/languages.json trans.hu = public/language/hu/admin/general/languages.json trans.id = public/language/id/admin/general/languages.json trans.it = public/language/it/admin/general/languages.json @@ -1940,6 +1980,7 @@ trans.fi = public/language/fi/admin/general/navigation.json trans.fr = public/language/fr/admin/general/navigation.json trans.gl = public/language/gl/admin/general/navigation.json trans.he = public/language/he/admin/general/navigation.json +trans.hr = public/language/hr/admin/general/navigation.json trans.hu = public/language/hu/admin/general/navigation.json trans.id = public/language/id/admin/general/navigation.json trans.it = public/language/it/admin/general/navigation.json @@ -1988,6 +2029,7 @@ trans.fi = public/language/fi/admin/general/social.json trans.fr = public/language/fr/admin/general/social.json trans.gl = public/language/gl/admin/general/social.json trans.he = public/language/he/admin/general/social.json +trans.hr = public/language/hr/admin/general/social.json trans.hu = public/language/hu/admin/general/social.json trans.id = public/language/id/admin/general/social.json trans.it = public/language/it/admin/general/social.json @@ -2036,6 +2078,7 @@ trans.fi = public/language/fi/admin/general/sounds.json trans.fr = public/language/fr/admin/general/sounds.json trans.gl = public/language/gl/admin/general/sounds.json trans.he = public/language/he/admin/general/sounds.json +trans.hr = public/language/hr/admin/general/sounds.json trans.hu = public/language/hu/admin/general/sounds.json trans.id = public/language/id/admin/general/sounds.json trans.it = public/language/it/admin/general/sounds.json @@ -2084,6 +2127,7 @@ trans.fi = public/language/fi/admin/manage/categories.json trans.fr = public/language/fr/admin/manage/categories.json trans.gl = public/language/gl/admin/manage/categories.json trans.he = public/language/he/admin/manage/categories.json +trans.hr = public/language/hr/admin/manage/categories.json trans.hu = public/language/hu/admin/manage/categories.json trans.id = public/language/id/admin/manage/categories.json trans.it = public/language/it/admin/manage/categories.json @@ -2132,6 +2176,7 @@ trans.fi = public/language/fi/admin/manage/groups.json trans.fr = public/language/fr/admin/manage/groups.json trans.gl = public/language/gl/admin/manage/groups.json trans.he = public/language/he/admin/manage/groups.json +trans.hr = public/language/hr/admin/manage/groups.json trans.hu = public/language/hu/admin/manage/groups.json trans.id = public/language/id/admin/manage/groups.json trans.it = public/language/it/admin/manage/groups.json @@ -2180,6 +2225,7 @@ trans.fi = public/language/fi/admin/manage/ip-blacklist.json trans.fr = public/language/fr/admin/manage/ip-blacklist.json trans.gl = public/language/gl/admin/manage/ip-blacklist.json trans.he = public/language/he/admin/manage/ip-blacklist.json +trans.hr = public/language/hr/admin/manage/ip-blacklist.json trans.hu = public/language/hu/admin/manage/ip-blacklist.json trans.id = public/language/id/admin/manage/ip-blacklist.json trans.it = public/language/it/admin/manage/ip-blacklist.json @@ -2228,6 +2274,7 @@ trans.fi = public/language/fi/admin/manage/registration.json trans.fr = public/language/fr/admin/manage/registration.json trans.gl = public/language/gl/admin/manage/registration.json trans.he = public/language/he/admin/manage/registration.json +trans.hr = public/language/hr/admin/manage/registration.json trans.hu = public/language/hu/admin/manage/registration.json trans.id = public/language/id/admin/manage/registration.json trans.it = public/language/it/admin/manage/registration.json @@ -2276,6 +2323,7 @@ trans.fi = public/language/fi/admin/manage/tags.json trans.fr = public/language/fr/admin/manage/tags.json trans.gl = public/language/gl/admin/manage/tags.json trans.he = public/language/he/admin/manage/tags.json +trans.hr = public/language/hr/admin/manage/tags.json trans.hu = public/language/hu/admin/manage/tags.json trans.id = public/language/id/admin/manage/tags.json trans.it = public/language/it/admin/manage/tags.json @@ -2324,6 +2372,7 @@ trans.fi = public/language/fi/admin/manage/users.json trans.fr = public/language/fr/admin/manage/users.json trans.gl = public/language/gl/admin/manage/users.json trans.he = public/language/he/admin/manage/users.json +trans.hr = public/language/hr/admin/manage/users.json trans.hu = public/language/hu/admin/manage/users.json trans.id = public/language/id/admin/manage/users.json trans.it = public/language/it/admin/manage/users.json @@ -2372,6 +2421,7 @@ trans.fi = public/language/fi/admin/settings/advanced.json trans.fr = public/language/fr/admin/settings/advanced.json trans.gl = public/language/gl/admin/settings/advanced.json trans.he = public/language/he/admin/settings/advanced.json +trans.hr = public/language/hr/admin/settings/advanced.json trans.hu = public/language/hu/admin/settings/advanced.json trans.id = public/language/id/admin/settings/advanced.json trans.it = public/language/it/admin/settings/advanced.json @@ -2420,6 +2470,7 @@ trans.fi = public/language/fi/admin/settings/cookies.json trans.fr = public/language/fr/admin/settings/cookies.json trans.gl = public/language/gl/admin/settings/cookies.json trans.he = public/language/he/admin/settings/cookies.json +trans.hr = public/language/hr/admin/settings/cookies.json trans.hu = public/language/hu/admin/settings/cookies.json trans.id = public/language/id/admin/settings/cookies.json trans.it = public/language/it/admin/settings/cookies.json @@ -2468,6 +2519,7 @@ trans.fi = public/language/fi/admin/settings/general.json trans.fr = public/language/fr/admin/settings/general.json trans.gl = public/language/gl/admin/settings/general.json trans.he = public/language/he/admin/settings/general.json +trans.hr = public/language/hr/admin/settings/general.json trans.hu = public/language/hu/admin/settings/general.json trans.id = public/language/id/admin/settings/general.json trans.it = public/language/it/admin/settings/general.json @@ -2516,6 +2568,7 @@ trans.fi = public/language/fi/admin/settings/guest.json trans.fr = public/language/fr/admin/settings/guest.json trans.gl = public/language/gl/admin/settings/guest.json trans.he = public/language/he/admin/settings/guest.json +trans.hr = public/language/hr/admin/settings/guest.json trans.hu = public/language/hu/admin/settings/guest.json trans.id = public/language/id/admin/settings/guest.json trans.it = public/language/it/admin/settings/guest.json @@ -2564,6 +2617,7 @@ trans.fi = public/language/fi/admin/settings/pagination.json trans.fr = public/language/fr/admin/settings/pagination.json trans.gl = public/language/gl/admin/settings/pagination.json trans.he = public/language/he/admin/settings/pagination.json +trans.hr = public/language/hr/admin/settings/pagination.json trans.hu = public/language/hu/admin/settings/pagination.json trans.id = public/language/id/admin/settings/pagination.json trans.it = public/language/it/admin/settings/pagination.json @@ -2612,6 +2666,7 @@ trans.fi = public/language/fi/admin/settings/reputation.json trans.fr = public/language/fr/admin/settings/reputation.json trans.gl = public/language/gl/admin/settings/reputation.json trans.he = public/language/he/admin/settings/reputation.json +trans.hr = public/language/hr/admin/settings/reputation.json trans.hu = public/language/hu/admin/settings/reputation.json trans.id = public/language/id/admin/settings/reputation.json trans.it = public/language/it/admin/settings/reputation.json @@ -2660,6 +2715,7 @@ trans.fi = public/language/fi/admin/settings/tags.json trans.fr = public/language/fr/admin/settings/tags.json trans.gl = public/language/gl/admin/settings/tags.json trans.he = public/language/he/admin/settings/tags.json +trans.hr = public/language/hr/admin/settings/tags.json trans.hu = public/language/hu/admin/settings/tags.json trans.id = public/language/id/admin/settings/tags.json trans.it = public/language/it/admin/settings/tags.json @@ -2708,6 +2764,7 @@ trans.fi = public/language/fi/admin/settings/user.json trans.fr = public/language/fr/admin/settings/user.json trans.gl = public/language/gl/admin/settings/user.json trans.he = public/language/he/admin/settings/user.json +trans.hr = public/language/hr/admin/settings/user.json trans.hu = public/language/hu/admin/settings/user.json trans.id = public/language/id/admin/settings/user.json trans.it = public/language/it/admin/settings/user.json @@ -2756,6 +2813,7 @@ trans.fi = public/language/fi/admin/settings/chat.json trans.fr = public/language/fr/admin/settings/chat.json trans.gl = public/language/gl/admin/settings/chat.json trans.he = public/language/he/admin/settings/chat.json +trans.hr = public/language/hr/admin/settings/chat.json trans.hu = public/language/hu/admin/settings/chat.json trans.id = public/language/id/admin/settings/chat.json trans.it = public/language/it/admin/settings/chat.json @@ -2804,6 +2862,7 @@ trans.fi = public/language/fi/admin/settings/email.json trans.fr = public/language/fr/admin/settings/email.json trans.gl = public/language/gl/admin/settings/email.json trans.he = public/language/he/admin/settings/email.json +trans.hr = public/language/hr/admin/settings/email.json trans.hu = public/language/hu/admin/settings/email.json trans.id = public/language/id/admin/settings/email.json trans.it = public/language/it/admin/settings/email.json @@ -2852,6 +2911,7 @@ trans.fi = public/language/fi/admin/settings/group.json trans.fr = public/language/fr/admin/settings/group.json trans.gl = public/language/gl/admin/settings/group.json trans.he = public/language/he/admin/settings/group.json +trans.hr = public/language/hr/admin/settings/group.json trans.hu = public/language/hu/admin/settings/group.json trans.id = public/language/id/admin/settings/group.json trans.it = public/language/it/admin/settings/group.json @@ -2900,6 +2960,7 @@ trans.fi = public/language/fi/admin/settings/notifications.json trans.fr = public/language/fr/admin/settings/notifications.json trans.gl = public/language/gl/admin/settings/notifications.json trans.he = public/language/he/admin/settings/notifications.json +trans.hr = public/language/hr/admin/settings/notifications.json trans.hu = public/language/hu/admin/settings/notifications.json trans.id = public/language/id/admin/settings/notifications.json trans.it = public/language/it/admin/settings/notifications.json @@ -2948,6 +3009,7 @@ trans.fi = public/language/fi/admin/settings/post.json trans.fr = public/language/fr/admin/settings/post.json trans.gl = public/language/gl/admin/settings/post.json trans.he = public/language/he/admin/settings/post.json +trans.hr = public/language/hr/admin/settings/post.json trans.hu = public/language/hu/admin/settings/post.json trans.id = public/language/id/admin/settings/post.json trans.it = public/language/it/admin/settings/post.json @@ -2996,6 +3058,7 @@ trans.fi = public/language/fi/admin/settings/sockets.json trans.fr = public/language/fr/admin/settings/sockets.json trans.gl = public/language/gl/admin/settings/sockets.json trans.he = public/language/he/admin/settings/sockets.json +trans.hr = public/language/hr/admin/settings/sockets.json trans.hu = public/language/hu/admin/settings/sockets.json trans.id = public/language/id/admin/settings/sockets.json trans.it = public/language/it/admin/settings/sockets.json @@ -3044,6 +3107,7 @@ trans.fi = public/language/fi/admin/settings/uploads.json trans.fr = public/language/fr/admin/settings/uploads.json trans.gl = public/language/gl/admin/settings/uploads.json trans.he = public/language/he/admin/settings/uploads.json +trans.hr = public/language/hr/admin/settings/uploads.json trans.hu = public/language/hu/admin/settings/uploads.json trans.id = public/language/id/admin/settings/uploads.json trans.it = public/language/it/admin/settings/uploads.json @@ -3092,6 +3156,7 @@ trans.fi = public/language/fi/admin/settings/web-crawler.json trans.fr = public/language/fr/admin/settings/web-crawler.json trans.gl = public/language/gl/admin/settings/web-crawler.json trans.he = public/language/he/admin/settings/web-crawler.json +trans.hr = public/language/hr/admin/settings/web-crawler.json trans.hu = public/language/hu/admin/settings/web-crawler.json trans.id = public/language/id/admin/settings/web-crawler.json trans.it = public/language/it/admin/settings/web-crawler.json diff --git a/Gruntfile.js b/Gruntfile.js index c97795e743..7fa94e3eaf 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -8,6 +8,8 @@ var initWorker; var incomplete = []; var running = 0; +env.NODE_ENV = env.NODE_ENV || 'development'; + module.exports = function (grunt) { var args = []; var initArgs = ['--build']; @@ -18,7 +20,7 @@ module.exports = function (grunt) { function update(action, filepath, target) { var updateArgs = args.slice(); - var compiling = ''; + var compiling; var time = Date.now(); if (target === 'lessUpdated_Client') { @@ -35,7 +37,7 @@ module.exports = function (grunt) { // Do nothing, just restart } - if (incomplete.indexOf(compiling) === -1) { + if (compiling && incomplete.indexOf(compiling) === -1) { incomplete.push(compiling); } diff --git a/app.js b/app.js index 26336a74c8..90f5ef046e 100644 --- a/app.js +++ b/app.js @@ -90,6 +90,11 @@ if (nconf.get('setup') || nconf.get('install')) { listPlugins(); } else if (nconf.get('build')) { require('./src/meta/build').build(nconf.get('build')); +} else if (nconf.get('events')) { + async.series([ + async.apply(require('./src/database').init), + async.apply(require('./src/events').output), + ]); } else { require('./src/start').start(); } @@ -203,7 +208,8 @@ function upgrade() { // Skip build tasks.pop(); } - + // disable mongo timeouts during upgrade + nconf.set('mongo:options:socketTimeoutMS', 0); async.series(tasks, function (err) { if (err) { winston.error(err.stack); @@ -217,6 +223,7 @@ function upgrade() { function activate() { var db = require('./src/database'); var plugins = require('./src/plugins'); + var events = require('./src/events'); var plugin = nconf.get('activate'); async.waterfall([ function (next) { @@ -237,6 +244,12 @@ function activate() { winston.info('Activating plugin `%s`', plugin); db.sortedSetAdd('plugins:active', 0, plugin, next); }, + function (next) { + events.log({ + type: 'plugin-activate', + text: plugin, + }, next); + }, ], function (err) { if (err) { winston.error(err.message); diff --git a/nodebb b/nodebb index 22051bb810..45e0ebaec3 100755 --- a/nodebb +++ b/nodebb @@ -2,10 +2,28 @@ 'use strict'; -var cproc; -var args; -var fs; -var path; +var fs = require('fs'); +var path = require('path'); +var cproc = require('child_process'); + +// check to make sure dependencies are installed +try { + fs.readFileSync(path.join(__dirname, 'node_modules/async/package.json')); +} catch (e) { + if (e.code === 'ENOENT') { + process.stdout.write('Dependencies not yet installed.\n'); + process.stdout.write('Installing them now...\n\n'); + + cproc.execSync('npm i --production', { + cwd: __dirname, + stdio: [0, 1, 2], + }); + } else { + throw e; + } +} + +var minimist; var request; var semver; var prompt; @@ -13,25 +31,23 @@ var async; try { require('colors'); - cproc = require('child_process'); - args = require('minimist')(process.argv.slice(2)); - fs = require('fs'); - path = require('path'); + minimist = require('minimist'); request = require('request'); semver = require('semver'); prompt = require('prompt'); async = require('async'); } catch (e) { - if (e.code === 'MODULE_NOT_FOUND') { - process.stdout.write('NodeBB could not be started because it\'s dependencies have not been installed.\n'); - process.stdout.write('Please ensure that you have executed "npm install --production" prior to running NodeBB.\n\n'); - process.stdout.write('For more information, please see: https://docs.nodebb.org/en/latest/installing/os.html\n\n'); - process.stdout.write('Could not start: ' + e.code + '\n'); + process.stdout.write( + '\x1b[31mNodeBB could not be initialised because there was an error while loading dependencies.\n' + + 'Please run "\x1b[33mnpm install --production\x1b[31m" and try again.\x1b[0m\n\n' + + 'For more information, please see: https://docs.nodebb.org/en/latest/installing/os.html\n\n' + ); - process.exit(1); - } + throw e; } +var args = minimist(process.argv.slice(2)); + var loaderPath = path.join(__dirname, 'loader.js'); var appPath = path.join(__dirname, 'app.js'); @@ -479,6 +495,13 @@ var commands = { upgradePlugins(); }, }, + events: { + description: 'Outputs the last ten (10) administrative events recorded by NodeBB', + usage: 'Usage: ' + './nodebb events'.yellow, + handler: function () { + fork(['--events']); + }, + }, help: { description: 'Display the help message for a given command', usage: 'Usage: ' + './nodebb help '.yellow, diff --git a/package.json b/package.json index 7e668c42ec..d9cdf3781b 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "nodebb", "license": "GPL-3.0", "description": "NodeBB Forum", - "version": "1.4.6", + "version": "1.5.1", "homepage": "http://www.nodebb.org", "repository": { "type": "git", @@ -17,10 +17,10 @@ "coveralls": "istanbul cover _mocha --report lcovonly -- -R dot && cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js && rm -rf ./coverage" }, "dependencies": { - "async": "^2.1.4", "ace-builds": "^1.2.6", - "autoprefixer": "^6.2.3", - "bcryptjs": "~2.3.0", + "async": "2.4.1", + "autoprefixer": "7.1.1", + "bcryptjs": "2.4.3", "body-parser": "^1.9.0", "bootstrap": "^3.3.7", "chart.js": "^2.4.0", @@ -30,7 +30,7 @@ "connect-flash": "^0.1.1", "connect-mongo": "1.3.2", "connect-multiparty": "^2.0.0", - "connect-redis": "~3.1.0", + "connect-redis": "3.3.0", "cookie-parser": "^1.3.3", "cron": "^1.0.5", "cropperjs": "^0.8.1", @@ -39,65 +39,65 @@ "express": "^4.14.0", "express-session": "^1.8.2", "express-useragent": "1.0.7", - "html-to-text": "2.1.3", - "ip": "1.1.3", - "jimp": "0.2.27", + "html-to-text": "3.3.0", + "ip": "1.1.5", + "jimp": "0.2.28", "jquery": "^3.1.0", "json-2-csv": "^2.0.22", "less": "^2.0.0", + "lodash": "^4.17.4", "logrotate-stream": "^0.2.3", "lru-cache": "4.0.2", "mime": "^1.3.4", "minimist": "^1.1.1", "mkdirp": "~0.5.0", - "mongodb": "2.2.25", + "mongodb": "2.2.27", "morgan": "^1.3.2", "mousetrap": "^1.5.3", "nconf": "~0.8.2", - "nodebb-plugin-composer-default": "4.4.6", - "nodebb-plugin-dbsearch": "2.0.2", + "nodebb-plugin-composer-default": "4.4.12", + "nodebb-plugin-dbsearch": "2.0.4", "nodebb-plugin-emoji-extended": "1.1.1", - "nodebb-plugin-emoji-one": "1.1.5", + "nodebb-plugin-emoji-one": "1.2.1", "nodebb-plugin-markdown": "7.1.1", "nodebb-plugin-mentions": "2.0.3", "nodebb-plugin-soundpack-default": "1.0.0", - "nodebb-plugin-spam-be-gone": "0.4.13", + "nodebb-plugin-spam-be-gone": "0.5.0", "nodebb-rewards-essentials": "0.0.9", - "nodebb-theme-lavender": "4.0.0", - "nodebb-theme-persona": "4.2.10", - "nodebb-theme-vanilla": "5.2.1", + "nodebb-theme-lavender": "4.0.1", + "nodebb-theme-persona": "5.0.7", + "nodebb-theme-slick": "1.1.0", + "nodebb-theme-vanilla": "6.0.6", "nodebb-widget-essentials": "3.0.0", "nodemailer": "2.6.4", "nodemailer-sendmail-transport": "1.0.0", "nodemailer-smtp-transport": "^2.4.1", "passport": "^0.3.0", "passport-local": "1.0.0", - "postcss": "^5.0.13", - "postcss-clean": "^1.0.0", + "postcss": "6.0.1", + "postcss-clean": "1.0.2", "promise-polyfill": "^6.0.2", "prompt": "^1.0.0", - "redis": "~2.6.2", + "redis": "2.7.1", "request": "2.81.0", - "rimraf": "~2.5.0", + "rimraf": "2.6.1", "rss": "^1.0.0", "sanitize-html": "^1.13.0", "semver": "^5.1.0", "serve-favicon": "^2.1.5", "sitemap": "^1.4.0", - "socket.io": "1.7.2", - "socket.io-client": "1.7.2", - "socket.io-redis": "3.1.0", - "socketio-wildcard": "~0.3.0", + "socket.io": "2.0.1", + "socket.io-client": "2.0.1", + "socket.io-redis": "5.0.1", + "socketio-wildcard": "2.0.0", "string": "^3.0.0", - "templates.js": "0.3.10", + "templates.js": "0.3.11", "toobusy-js": "^0.5.1", - "uglify-js": "^2.6.0", - "underscore": "^1.8.3", - "underscore.deep": "^0.5.1", - "validator": "^6.1.0", + "uglify-js": "^3.0.11", + "validator": "7.0.0", "winston": "^2.1.0", "xml": "^1.0.1", - "xregexp": "~3.1.0", + "xregexp": "3.2.0", "zxcvbn": "^4.4.2" }, "devDependencies": { @@ -108,6 +108,7 @@ "grunt": "~1.0.0", "grunt-contrib-watch": "^1.0.0", "istanbul": "^0.4.2", + "jsdom": "9.12.0", "mocha": "~3.2.0", "mocha-lcov-reporter": "^1.2.0", "xmlhttprequest": "1.8.0", diff --git a/public/language/ar/admin/appearance/customise.json b/public/language/ar/admin/appearance/customise.json index 767d443e29..5095f7a937 100644 --- a/public/language/ar/admin/appearance/customise.json +++ b/public/language/ar/admin/appearance/customise.json @@ -5,5 +5,8 @@ "custom-header": "Custom Header", "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", - "custom-header.enable": "Enable Custom Header" + "custom-header.enable": "Enable Custom Header", + + "custom-css.livereload": "Enable Live Reload", + "custom-css.livereload.description": "Enable this to force all sessions on every device under your account to refresh whenever you click save" } \ No newline at end of file diff --git a/public/language/ar/admin/development/info.json b/public/language/ar/admin/development/info.json index b2768ca212..0a4ae6fe2c 100644 --- a/public/language/ar/admin/development/info.json +++ b/public/language/ar/admin/development/info.json @@ -1,10 +1,12 @@ { "you-are-on": "Info - You are on %1:%2", + "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", "pid": "pid", "nodejs": "nodejs", "online": "online", "git": "git", + "memory": "memory", "load": "load", "uptime": "uptime", diff --git a/public/language/ar/admin/general/dashboard.json b/public/language/ar/admin/general/dashboard.json index 02046bd17a..61f4421fb5 100644 --- a/public/language/ar/admin/general/dashboard.json +++ b/public/language/ar/admin/general/dashboard.json @@ -5,9 +5,14 @@ "users": "Users", "posts": "Posts", "topics": "Topics", - "page-views-last-month": "Page views Last Month", - "page-views-this-month": "Page views This Month", - "page-views-last-day": "Page views in last 24 hours", + "page-views-seven": "Last 7 Days", + "page-views-thirty": "Last 30 Days", + "page-views-last-day": "Last 24 hours", + "page-views-custom": "Custom Date Range", + "page-views-custom-start": "Range Start", + "page-views-custom-end": "Range End", + "page-views-custom-help": "Enter a date range of page views you would like to view. If no date picker is available, the accepted format is YYYY-MM-DD", + "page-views-custom-error": "Please enter a valid date range in the format YYYY-MM-DD", "stats.day": "Day", "stats.week": "Week", diff --git a/public/language/ar/admin/general/languages.json b/public/language/ar/admin/general/languages.json index da45cade2c..bdd57849b3 100644 --- a/public/language/ar/admin/general/languages.json +++ b/public/language/ar/admin/general/languages.json @@ -1,5 +1,6 @@ { "language-settings": "Language Settings", "description": "The default language determines the language settings for all users who are visiting your forum.
Individual users can override the default language on their account settings page.", - "default-language": "Default Language" + "default-language": "Default Language", + "auto-detect": "Auto Detect Language Setting for Guests" } \ No newline at end of file diff --git a/public/language/ar/admin/settings/user.json b/public/language/ar/admin/settings/user.json index b8f51c9288..fa8049c3a9 100644 --- a/public/language/ar/admin/settings/user.json +++ b/public/language/ar/admin/settings/user.json @@ -34,6 +34,8 @@ "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", + "invite-expiration": "Invite expiration", + "invite-expiration-help": "# of days invitations expire in.", "min-username-length": "Minimum Username Length", "max-username-length": "Maximum Username Length", "min-password-length": "Minimum Password Length", diff --git a/public/language/ar/error.json b/public/language/ar/error.json index 0a05be7777..68de3c7528 100644 --- a/public/language/ar/error.json +++ b/public/language/ar/error.json @@ -1,5 +1,6 @@ { "invalid-data": "بيانات غير صحيحة", + "invalid-json": "Invalid JSON", "not-logged-in": "لم تقم بتسجيل الدخول", "account-locked": "تم حظر حسابك مؤقتًا.", "search-requires-login": "البحث في المنتدى يتطلب حساب - الرجاء تسجيل الدخول أو التسجيل", @@ -12,6 +13,7 @@ "invalid-title": "عنوان غير صحيح", "invalid-user-data": "بيانات المستخدم غير صحيحة", "invalid-password": "كلمة السر غير مقبولة", + "invalid-login-credentials": "Invalid login credentials", "invalid-username-or-password": "المرجود تحديد اسم مستخدم و كلمة مرور", "invalid-search-term": "كلمة البحث غير صحيحة", "csrf-invalid": "لم تتمكن من تسجيل الدخول. هنالك أحتمال ان جلستك انتهت. رجاءًا حاول مرة اخرى.", diff --git a/public/language/ar/topic.json b/public/language/ar/topic.json index 34c6750ea8..f302d9bf6a 100644 --- a/public/language/ar/topic.json +++ b/public/language/ar/topic.json @@ -14,6 +14,7 @@ "quote": "اقتبس", "reply": "رد", "replies_to_this_post": "%1 Replies", + "one_reply_to_this_post": "1 Reply", "last_reply_time": "Last reply", "reply-as-topic": "رد بموضوع", "guest-login-reply": "يجب عليك تسجيل الدخول للرد", diff --git a/public/language/bg/admin/appearance/customise.json b/public/language/bg/admin/appearance/customise.json index 2c5b67e504..f052e4e5c9 100644 --- a/public/language/bg/admin/appearance/customise.json +++ b/public/language/bg/admin/appearance/customise.json @@ -5,5 +5,8 @@ "custom-header": "Персонализирана заглавна част", "custom-header.description": "Въведете своя персонализиран код HTML тук (напр. JavaScript, елементи „meta“ и т.н.), те ще бъдат добавени към секцията <head> в кода на Вашия форум.", - "custom-header.enable": "Включване на персонализирана заглавна част" + "custom-header.enable": "Включване на персонализирана заглавна част", + + "custom-css.livereload": "Включване на моменталното презареждане", + "custom-css.livereload.description": "Ако включите това, всички сесии на всяко устройство, където използвате акаунта си, ще се презареждат, когато натискате „Запазване“." } \ No newline at end of file diff --git a/public/language/bg/admin/development/info.json b/public/language/bg/admin/development/info.json index cfd2990662..87ff0b8b70 100644 --- a/public/language/bg/admin/development/info.json +++ b/public/language/bg/admin/development/info.json @@ -1,10 +1,12 @@ { "you-are-on": "Информация — Вие сте на %1:%2", + "nodes-responded": "%1 възела отговориха в рамките на %2мсек!", "host": "сървър", "pid": "ид. на процеса", "nodejs": "nodejs", "online": "на линия", "git": "git", + "memory": "памет", "load": "натоварване", "uptime": "активно време", diff --git a/public/language/bg/admin/general/dashboard.json b/public/language/bg/admin/general/dashboard.json index 871f61f7b0..23335e4652 100644 --- a/public/language/bg/admin/general/dashboard.json +++ b/public/language/bg/admin/general/dashboard.json @@ -5,9 +5,14 @@ "users": "Потребители", "posts": "Публикации", "topics": "Теми", - "page-views-last-month": "Преглеждания на страниците през последния месец", - "page-views-this-month": "Преглеждания на страниците този месец", - "page-views-last-day": "Преглеждания на страниците през последните 24 часа", + "page-views-seven": "Последните 7 дни", + "page-views-thirty": "Последните 30 дни", + "page-views-last-day": "Последните 24 часа", + "page-views-custom": "Интервал по избор", + "page-views-custom-start": "Начална дата", + "page-views-custom-end": "Крайна дата", + "page-views-custom-help": "Въведете интервал от дати, за които искате да видите преглежданията на страниците. Ако не се появи календар за избор, можете да въведете датите във формат: ГГГГ-ММ-ДД", + "page-views-custom-error": "Моля, въведете правилен интервал от дати във формата: ГГГГ-ММ-ДД", "stats.day": "Ден", "stats.week": "Седмица", diff --git a/public/language/bg/admin/general/languages.json b/public/language/bg/admin/general/languages.json index 2ccfa73419..b4dbba6c3e 100644 --- a/public/language/bg/admin/general/languages.json +++ b/public/language/bg/admin/general/languages.json @@ -1,5 +1,6 @@ { "language-settings": "Езикови настройки", "description": "Езикът по подразбиране определя езиковите настройки за всички потребители, които посещават Вашия форум.
Отделните потребители могат да сменят езика си от страницата с настройки на профила си.", - "default-language": "Език по подразбиране" + "default-language": "Език по подразбиране", + "auto-detect": "Автоматично разпознаване на езика за гостите" } \ No newline at end of file diff --git a/public/language/bg/admin/settings/user.json b/public/language/bg/admin/settings/user.json index a470c905d0..294ee7939a 100644 --- a/public/language/bg/admin/settings/user.json +++ b/public/language/bg/admin/settings/user.json @@ -34,6 +34,8 @@ "registration.max-invites": "Максимален брой покани на потребител", "max-invites": "Максимален брой покани на потребител", "max-invites-help": "0 = няма ограничение. Администраторите могат да разпращат неограничен брой покани.
Тази стойност се използва, само ако е избран режимът „Само с покана“.", + "invite-expiration": "Давност на поканите", + "invite-expiration-help": "Брой дни, след които поканите вече не важат.", "min-username-length": "Минимална дължина на потребителското име", "max-username-length": "Максимална дължина на потребителското име", "min-password-length": "Минимална дължина на паролата", diff --git a/public/language/bg/error.json b/public/language/bg/error.json index 6733bdcca5..1251e2d864 100644 --- a/public/language/bg/error.json +++ b/public/language/bg/error.json @@ -1,5 +1,6 @@ { "invalid-data": "Грешни данни", + "invalid-json": "Неправилен JSON", "not-logged-in": "Изглежда не сте се вписали в системата.", "account-locked": "Вашият акаунт беше заключен временно", "search-requires-login": "Търсенето изисква регистриран акаунт! Моля, впишете се или се регистрирайте!", @@ -12,6 +13,7 @@ "invalid-title": "Грешно заглавие!", "invalid-user-data": "Грешни потребителски данни", "invalid-password": "Грешна парола", + "invalid-login-credentials": "Неправилни данни за удостоверяване", "invalid-username-or-password": "Моля, въведете потребителско име и парола", "invalid-search-term": "Грешен текст за търсене", "csrf-invalid": "Не успяхме да Ви впишем, най-вероятно защото сесията Ви е изтекла. Моля, опитайте отново", diff --git a/public/language/bg/topic.json b/public/language/bg/topic.json index 4f0827c267..d4bbb10ed7 100644 --- a/public/language/bg/topic.json +++ b/public/language/bg/topic.json @@ -14,6 +14,7 @@ "quote": "Цитат", "reply": "Отговор", "replies_to_this_post": "%1 отговора", + "one_reply_to_this_post": "1 отговор", "last_reply_time": "Последен отговор", "reply-as-topic": "Отговор в нова тема", "guest-login-reply": "Впишете се, за да отговорите", diff --git a/public/language/bn/admin/appearance/customise.json b/public/language/bn/admin/appearance/customise.json index 767d443e29..5095f7a937 100644 --- a/public/language/bn/admin/appearance/customise.json +++ b/public/language/bn/admin/appearance/customise.json @@ -5,5 +5,8 @@ "custom-header": "Custom Header", "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", - "custom-header.enable": "Enable Custom Header" + "custom-header.enable": "Enable Custom Header", + + "custom-css.livereload": "Enable Live Reload", + "custom-css.livereload.description": "Enable this to force all sessions on every device under your account to refresh whenever you click save" } \ No newline at end of file diff --git a/public/language/bn/admin/development/info.json b/public/language/bn/admin/development/info.json index b2768ca212..0a4ae6fe2c 100644 --- a/public/language/bn/admin/development/info.json +++ b/public/language/bn/admin/development/info.json @@ -1,10 +1,12 @@ { "you-are-on": "Info - You are on %1:%2", + "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", "pid": "pid", "nodejs": "nodejs", "online": "online", "git": "git", + "memory": "memory", "load": "load", "uptime": "uptime", diff --git a/public/language/bn/admin/general/dashboard.json b/public/language/bn/admin/general/dashboard.json index 02046bd17a..61f4421fb5 100644 --- a/public/language/bn/admin/general/dashboard.json +++ b/public/language/bn/admin/general/dashboard.json @@ -5,9 +5,14 @@ "users": "Users", "posts": "Posts", "topics": "Topics", - "page-views-last-month": "Page views Last Month", - "page-views-this-month": "Page views This Month", - "page-views-last-day": "Page views in last 24 hours", + "page-views-seven": "Last 7 Days", + "page-views-thirty": "Last 30 Days", + "page-views-last-day": "Last 24 hours", + "page-views-custom": "Custom Date Range", + "page-views-custom-start": "Range Start", + "page-views-custom-end": "Range End", + "page-views-custom-help": "Enter a date range of page views you would like to view. If no date picker is available, the accepted format is YYYY-MM-DD", + "page-views-custom-error": "Please enter a valid date range in the format YYYY-MM-DD", "stats.day": "Day", "stats.week": "Week", diff --git a/public/language/bn/admin/general/languages.json b/public/language/bn/admin/general/languages.json index da45cade2c..bdd57849b3 100644 --- a/public/language/bn/admin/general/languages.json +++ b/public/language/bn/admin/general/languages.json @@ -1,5 +1,6 @@ { "language-settings": "Language Settings", "description": "The default language determines the language settings for all users who are visiting your forum.
Individual users can override the default language on their account settings page.", - "default-language": "Default Language" + "default-language": "Default Language", + "auto-detect": "Auto Detect Language Setting for Guests" } \ No newline at end of file diff --git a/public/language/bn/admin/settings/user.json b/public/language/bn/admin/settings/user.json index b8f51c9288..fa8049c3a9 100644 --- a/public/language/bn/admin/settings/user.json +++ b/public/language/bn/admin/settings/user.json @@ -34,6 +34,8 @@ "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", + "invite-expiration": "Invite expiration", + "invite-expiration-help": "# of days invitations expire in.", "min-username-length": "Minimum Username Length", "max-username-length": "Maximum Username Length", "min-password-length": "Minimum Password Length", diff --git a/public/language/bn/error.json b/public/language/bn/error.json index 5c97eecb55..b97a0ff8ff 100644 --- a/public/language/bn/error.json +++ b/public/language/bn/error.json @@ -1,5 +1,6 @@ { "invalid-data": "ভুল তথ্য", + "invalid-json": "Invalid JSON", "not-logged-in": "আপনি লগিন করেননি", "account-locked": "আপনার অ্যাকাউন্ট সাময়িকভাবে লক করা হয়েছে", "search-requires-login": "Searching requires an account - please login or register.", @@ -12,6 +13,7 @@ "invalid-title": "ভুল শিরোনাম", "invalid-user-data": "ভুল ব্যবহারকারী তথ্য", "invalid-password": "ভুল পাসওয়ার্ড", + "invalid-login-credentials": "Invalid login credentials", "invalid-username-or-password": "অনুগ্রহ পূর্বক ইউজারনেম এবং পাসওয়ার্ড উভয়ই প্রদান করুন", "invalid-search-term": "অগ্রহনযোগ্য সার্চ টার্ম", "csrf-invalid": "We were unable to log you in, likely due to an expired session. Please try again", diff --git a/public/language/bn/topic.json b/public/language/bn/topic.json index 66863ac28b..25b18f2972 100644 --- a/public/language/bn/topic.json +++ b/public/language/bn/topic.json @@ -14,6 +14,7 @@ "quote": "উদ্ধৃতি", "reply": "উত্তর", "replies_to_this_post": "%1 Replies", + "one_reply_to_this_post": "1 Reply", "last_reply_time": "Last reply", "reply-as-topic": "Reply as topic", "guest-login-reply": "Log in to reply", diff --git a/public/language/cs/admin/appearance/customise.json b/public/language/cs/admin/appearance/customise.json index 767d443e29..5095f7a937 100644 --- a/public/language/cs/admin/appearance/customise.json +++ b/public/language/cs/admin/appearance/customise.json @@ -5,5 +5,8 @@ "custom-header": "Custom Header", "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", - "custom-header.enable": "Enable Custom Header" + "custom-header.enable": "Enable Custom Header", + + "custom-css.livereload": "Enable Live Reload", + "custom-css.livereload.description": "Enable this to force all sessions on every device under your account to refresh whenever you click save" } \ No newline at end of file diff --git a/public/language/cs/admin/development/info.json b/public/language/cs/admin/development/info.json index b2768ca212..0a4ae6fe2c 100644 --- a/public/language/cs/admin/development/info.json +++ b/public/language/cs/admin/development/info.json @@ -1,10 +1,12 @@ { "you-are-on": "Info - You are on %1:%2", + "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", "pid": "pid", "nodejs": "nodejs", "online": "online", "git": "git", + "memory": "memory", "load": "load", "uptime": "uptime", diff --git a/public/language/cs/admin/general/dashboard.json b/public/language/cs/admin/general/dashboard.json index fd3e417771..eb269bc916 100644 --- a/public/language/cs/admin/general/dashboard.json +++ b/public/language/cs/admin/general/dashboard.json @@ -5,9 +5,14 @@ "users": "Users", "posts": "Posts", "topics": "Topics", - "page-views-last-month": "Page views Last Month", - "page-views-this-month": "Page views This Month", - "page-views-last-day": "Page views in last 24 hours", + "page-views-seven": "Last 7 Days", + "page-views-thirty": "Last 30 Days", + "page-views-last-day": "Last 24 hours", + "page-views-custom": "Custom Date Range", + "page-views-custom-start": "Range Start", + "page-views-custom-end": "Range End", + "page-views-custom-help": "Enter a date range of page views you would like to view. If no date picker is available, the accepted format is YYYY-MM-DD", + "page-views-custom-error": "Please enter a valid date range in the format YYYY-MM-DD", "stats.day": "Day", "stats.week": "Week", diff --git a/public/language/cs/admin/general/languages.json b/public/language/cs/admin/general/languages.json index da45cade2c..bdd57849b3 100644 --- a/public/language/cs/admin/general/languages.json +++ b/public/language/cs/admin/general/languages.json @@ -1,5 +1,6 @@ { "language-settings": "Language Settings", "description": "The default language determines the language settings for all users who are visiting your forum.
Individual users can override the default language on their account settings page.", - "default-language": "Default Language" + "default-language": "Default Language", + "auto-detect": "Auto Detect Language Setting for Guests" } \ No newline at end of file diff --git a/public/language/cs/admin/settings/user.json b/public/language/cs/admin/settings/user.json index c1684da402..83d3308671 100644 --- a/public/language/cs/admin/settings/user.json +++ b/public/language/cs/admin/settings/user.json @@ -34,6 +34,8 @@ "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", + "invite-expiration": "Invite expiration", + "invite-expiration-help": "# of days invitations expire in.", "min-username-length": "Minimální délka uživatelského jména", "max-username-length": "Maximální délka uživatelského jména", "min-password-length": "Minimální délka hesla", diff --git a/public/language/cs/error.json b/public/language/cs/error.json index 41ca155c7a..628b1c9109 100644 --- a/public/language/cs/error.json +++ b/public/language/cs/error.json @@ -1,5 +1,6 @@ { "invalid-data": "Neplatná data", + "invalid-json": "Invalid JSON", "not-logged-in": "Zdá se, že nejste přihlášen(a)", "account-locked": "Váš účet byl dočasně uzamčen", "search-requires-login": "Searching requires an account - please login or register.", @@ -12,6 +13,7 @@ "invalid-title": "Neplatný titulek!", "invalid-user-data": "Neplatná uživatelská data", "invalid-password": "Neplatné heslo", + "invalid-login-credentials": "Invalid login credentials", "invalid-username-or-password": "Stanovte, prosím, oboje, jak uživatelské jméno, tak heslo", "invalid-search-term": "Neplatný výraz pro vyhledávání", "csrf-invalid": "We were unable to log you in, likely due to an expired session. Please try again", diff --git a/public/language/cs/flags.json b/public/language/cs/flags.json index c4bfed6f23..aea0e868e4 100644 --- a/public/language/cs/flags.json +++ b/public/language/cs/flags.json @@ -54,7 +54,7 @@ "modal-body": "Please specify your reason for flagging %1 %2 for review. Alternatively, use one of the quick report buttons if applicable.", "modal-reason-spam": "Spam", "modal-reason-offensive": "Offensive", - "modal-reason-custom": "Reason for reporting this content...", + "modal-reason-custom": "Důvod nahlášení tohoto obsahu…", "modal-submit": "Submit Report", "modal-submit-success": "Content has been flagged for moderation." } \ No newline at end of file diff --git a/public/language/cs/topic.json b/public/language/cs/topic.json index 67a774b3e8..5720cb73b2 100644 --- a/public/language/cs/topic.json +++ b/public/language/cs/topic.json @@ -14,6 +14,7 @@ "quote": "Citovat", "reply": "Odpovědět", "replies_to_this_post": "%1 Replies", + "one_reply_to_this_post": "1 Reply", "last_reply_time": "Last reply", "reply-as-topic": "Odpovědět jako Téma", "guest-login-reply": "Přihlásit se pro odpověď", diff --git a/public/language/da/admin/appearance/customise.json b/public/language/da/admin/appearance/customise.json index 767d443e29..5095f7a937 100644 --- a/public/language/da/admin/appearance/customise.json +++ b/public/language/da/admin/appearance/customise.json @@ -5,5 +5,8 @@ "custom-header": "Custom Header", "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", - "custom-header.enable": "Enable Custom Header" + "custom-header.enable": "Enable Custom Header", + + "custom-css.livereload": "Enable Live Reload", + "custom-css.livereload.description": "Enable this to force all sessions on every device under your account to refresh whenever you click save" } \ No newline at end of file diff --git a/public/language/da/admin/development/info.json b/public/language/da/admin/development/info.json index b2768ca212..0a4ae6fe2c 100644 --- a/public/language/da/admin/development/info.json +++ b/public/language/da/admin/development/info.json @@ -1,10 +1,12 @@ { "you-are-on": "Info - You are on %1:%2", + "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", "pid": "pid", "nodejs": "nodejs", "online": "online", "git": "git", + "memory": "memory", "load": "load", "uptime": "uptime", diff --git a/public/language/da/admin/general/dashboard.json b/public/language/da/admin/general/dashboard.json index 19c1bc9f75..07714e37e8 100644 --- a/public/language/da/admin/general/dashboard.json +++ b/public/language/da/admin/general/dashboard.json @@ -5,9 +5,14 @@ "users": "Users", "posts": "Posts", "topics": "Topics", - "page-views-last-month": "Side Visninger Sidste Måned", - "page-views-this-month": "Side Visninger Denne Måned", - "page-views-last-day": "Side visninger i de sidste 24 timer", + "page-views-seven": "Last 7 Days", + "page-views-thirty": "Last 30 Days", + "page-views-last-day": "Last 24 hours", + "page-views-custom": "Custom Date Range", + "page-views-custom-start": "Range Start", + "page-views-custom-end": "Range End", + "page-views-custom-help": "Enter a date range of page views you would like to view. If no date picker is available, the accepted format is YYYY-MM-DD", + "page-views-custom-error": "Please enter a valid date range in the format YYYY-MM-DD", "stats.day": "Dag", "stats.week": "Uge", diff --git a/public/language/da/admin/general/languages.json b/public/language/da/admin/general/languages.json index da45cade2c..bdd57849b3 100644 --- a/public/language/da/admin/general/languages.json +++ b/public/language/da/admin/general/languages.json @@ -1,5 +1,6 @@ { "language-settings": "Language Settings", "description": "The default language determines the language settings for all users who are visiting your forum.
Individual users can override the default language on their account settings page.", - "default-language": "Default Language" + "default-language": "Default Language", + "auto-detect": "Auto Detect Language Setting for Guests" } \ No newline at end of file diff --git a/public/language/da/admin/settings/user.json b/public/language/da/admin/settings/user.json index b8f51c9288..fa8049c3a9 100644 --- a/public/language/da/admin/settings/user.json +++ b/public/language/da/admin/settings/user.json @@ -34,6 +34,8 @@ "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", + "invite-expiration": "Invite expiration", + "invite-expiration-help": "# of days invitations expire in.", "min-username-length": "Minimum Username Length", "max-username-length": "Maximum Username Length", "min-password-length": "Minimum Password Length", diff --git a/public/language/da/error.json b/public/language/da/error.json index 271adb8fd3..c2419381c8 100644 --- a/public/language/da/error.json +++ b/public/language/da/error.json @@ -1,5 +1,6 @@ { "invalid-data": "Ugyldig Data", + "invalid-json": "Invalid JSON", "not-logged-in": "Det ser ikke ud til at du er logget ind.", "account-locked": "Din konto er blevet blokeret midlertidigt.", "search-requires-login": "Du skal have en konto for at søge - log venligst ind eller registrer dig.", @@ -12,6 +13,7 @@ "invalid-title": "Ugylidt titel", "invalid-user-data": "Ugyldig Bruger Data", "invalid-password": "Ugyldig Adgangskode", + "invalid-login-credentials": "Invalid login credentials", "invalid-username-or-password": "Venligst angiv både brugernavn og adgangskode", "invalid-search-term": "Ugyldig søgeterm", "csrf-invalid": "We were unable to log you in, likely due to an expired session. Please try again", diff --git a/public/language/da/topic.json b/public/language/da/topic.json index 54d4114614..463a34eeb9 100644 --- a/public/language/da/topic.json +++ b/public/language/da/topic.json @@ -14,6 +14,7 @@ "quote": "Citer", "reply": "Svar", "replies_to_this_post": "%1 Replies", + "one_reply_to_this_post": "1 Reply", "last_reply_time": "Last reply", "reply-as-topic": "Svar som emne", "guest-login-reply": "Login for at svare", diff --git a/public/language/de/admin/advanced/database.json b/public/language/de/admin/advanced/database.json index a2b3963632..7caa65a1bb 100644 --- a/public/language/de/admin/advanced/database.json +++ b/public/language/de/admin/advanced/database.json @@ -1,7 +1,7 @@ { "x-b": "%1 B", "x-mb": "%1 MB", - "x-gb": "%1 gb", + "x-gb": "%1 GB", "uptime-seconds": "Uptime in Sekunden", "uptime-days": "Uptime in Tagen", diff --git a/public/language/de/admin/appearance/customise.json b/public/language/de/admin/appearance/customise.json index 426750609f..657fe93ea8 100644 --- a/public/language/de/admin/appearance/customise.json +++ b/public/language/de/admin/appearance/customise.json @@ -5,5 +5,8 @@ "custom-header": "Benutzerdefinierter Header", "custom-header.description": "Füge hier dein benutzerdefiniertes HTML (z.B. Javascript, Meta Tags, usw.) ein, welches in den <head> Tag eingefügt werden soll.", - "custom-header.enable": "Benutzerdefinierten Header aktivieren" + "custom-header.enable": "Benutzerdefinierten Header aktivieren", + + "custom-css.livereload": "Live-Aktualisierung aktivieren", + "custom-css.livereload.description": "Aktiviere diese Einstellung um alle Sessions auf allen Geräten mit deinem Account dazu zu zwingen Neuzulaladen wenn du Speichern drückst" } \ No newline at end of file diff --git a/public/language/de/admin/development/info.json b/public/language/de/admin/development/info.json index 810511ae04..56e27b7e72 100644 --- a/public/language/de/admin/development/info.json +++ b/public/language/de/admin/development/info.json @@ -1,10 +1,12 @@ { "you-are-on": "Info - Sie verwenden %1:%2", + "nodes-responded": "%1 Knoten antworteten innerhalb von %2ms", "host": "Host", "pid": "PID", "nodejs": "Node.js Version", "online": "Online", "git": "git", + "memory": "Speicher", "load": "Auslastung", "uptime": "Uptime", diff --git a/public/language/de/admin/general/dashboard.json b/public/language/de/admin/general/dashboard.json index 29772ca3e6..c70a86e3fc 100644 --- a/public/language/de/admin/general/dashboard.json +++ b/public/language/de/admin/general/dashboard.json @@ -5,9 +5,14 @@ "users": "Benutzer", "posts": "Beiträge", "topics": "Themen", - "page-views-last-month": "Aufrufe im letzten Monat", - "page-views-this-month": "Aufrufe in diesem Monat", - "page-views-last-day": "Aufrufe in den letzten 24 Stunden", + "page-views-seven": "Letzte 7 Tage", + "page-views-thirty": "Letzte 30 Tage", + "page-views-last-day": "Letzte 24 Stunden", + "page-views-custom": "Benutzerdefinierte Tagesspanne", + "page-views-custom-start": "Spannen-Anfang", + "page-views-custom-end": "Spannen-Ende", + "page-views-custom-help": "Gib eine Zeitspanne an, in dem du die Besichtigungszahlen ansehen willst. Sollte keine Kalenderauswahl verfügbar sein ist das akzeptierte format YYYY-MM-DD", + "page-views-custom-error": "Bitte gib eine gültige Zeitspanne im Format YYYY-MM-DD an", "stats.day": "Diesen Tag", "stats.week": "Diese Woche", @@ -18,8 +23,8 @@ "running-version": "Es läuft NodeBB v%1.", "keep-updated": "Stelle sicher, dass dein NodeBB immer auf dem neuesten Stand für die neuesten Sicherheits-Patches und Bug-fixes ist.", "up-to-date": "

NodeBB Version ist aktuell

", - "upgrade-available": "

Version (v%1) wurde veröffentlicht. Es wird ein NodeBB Upgrade empfohlen.

", - "prerelease-upgrade-available": "

Das ist eine veraltete pre-release Version von NodeBB. Version (v%1) wurde veröffentlicht. Es wird ein NodeBB Upgrade empfohlen.

", + "upgrade-available": "

Version (v%1) wurde veröffentlicht. Ein NodeBB Upgrade wird empfohlen.

", + "prerelease-upgrade-available": "

Das ist eine veraltete pre-release Version von NodeBB. Version (v%1) wurde veröffentlicht. Ein NodeBB Upgrade wird empfohlen.

", "prerelease-warning": "

Das ist eine pre-release Version von NodeBB. Es können ungewollte Fehler auftreten.

", "running-in-development": "Das Forum wurde im Entwicklermodus gestartet. Das Forum könnte potenziellen Gefahren ausgeliefert sein. Bitte kontaktiere den Systemadministrator.", diff --git a/public/language/de/admin/general/languages.json b/public/language/de/admin/general/languages.json index af0bb78d1f..c2358ac047 100644 --- a/public/language/de/admin/general/languages.json +++ b/public/language/de/admin/general/languages.json @@ -1,5 +1,6 @@ { "language-settings": "Spracheinstellungen", "description": "Die Standardsprache legt die Spracheinstellungen für alle Benutzer fest, die das Forum besuchen.
Einzelne Benutzer können die Standardsprache auf der Seite in ihren Kontoeinstellungen überschreiben.", - "default-language": "Standardsprache" + "default-language": "Standardsprache", + "auto-detect": "Sprach-Einstellung bei Gästen automatisch ermitteln" } \ No newline at end of file diff --git a/public/language/de/admin/manage/groups.json b/public/language/de/admin/manage/groups.json index f6df5ca99e..fa7244a3e5 100644 --- a/public/language/de/admin/manage/groups.json +++ b/public/language/de/admin/manage/groups.json @@ -1,7 +1,7 @@ { "name": "Gruppenname", "description": "Gruppenbeschreibung", - "member-count": "Member Count", + "member-count": "Mitglieder Anzahl", "system": "System-Gruppe", "edit": "Ändern", "search-placeholder": "Suchen", diff --git a/public/language/de/admin/settings/advanced.json b/public/language/de/admin/settings/advanced.json index cca15102cc..87c5b2ca21 100644 --- a/public/language/de/admin/settings/advanced.json +++ b/public/language/de/admin/settings/advanced.json @@ -6,7 +6,7 @@ "headers.allow-from": "ALLOW-FROM setzen um NodeBB in einem iFrame zu platzieren", "headers.powered-by": "Anpassen des \"Powered By\" Headers von NodeBB", "headers.acao": "Access-Control-Allow-Origin", - "headers.acao-help": "To deny access to all sites, leave empty", + "headers.acao-help": "Um den Zugriff zu allen Seiten zu verbieten, leer lassen.", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", "traffic-management": "Traffic Management", diff --git a/public/language/de/admin/settings/post.json b/public/language/de/admin/settings/post.json index 5844dfe9eb..ab310f421e 100644 --- a/public/language/de/admin/settings/post.json +++ b/public/language/de/admin/settings/post.json @@ -29,8 +29,8 @@ "unread": "Ungelesen-Einstellungen", "unread.cutoff": "Ungelesen-Limit (in Tagen)", "unread.min-track-last": "Minimale Anzahl an Beiträgen pro Thema bevor die letzte Sichtung mitgeschrieben wird", - "recent": "Recent Settings", - "recent.categoryFilter.disable": "Disable filtering of topics in ignored categories on the /recent page", + "recent": "Kürzlich verwendete Einstellungen", + "recent.categoryFilter.disable": "Filtern von Themen in ignorierten Kategorien auf der /recent Seite deaktivieren", "signature": "Signatureinstellungen", "signature.disable": "Signaturen deaktivieren", "signature.no-links": "Links in signaturen deaktivieren", diff --git a/public/language/de/admin/settings/user.json b/public/language/de/admin/settings/user.json index b5bfb291c9..e7d7e34d1c 100644 --- a/public/language/de/admin/settings/user.json +++ b/public/language/de/admin/settings/user.json @@ -34,10 +34,12 @@ "registration.max-invites": "Maximale Einladungen pro Benutzer", "max-invites": "Maximale Einladungen pro Benutzer", "max-invites-help": "0 für keine Beschränkung. Admins haben keine beschränkung.
Nur praktikabel für \"Nur Einladungen\".", + "invite-expiration": "Einladungsfrist", + "invite-expiration-help": "# der Tage nachdem Einladungen auslaufen.", "min-username-length": "Minimale länge des Benutzernamens", "max-username-length": "Maximale länge des Benutzernamens", "min-password-length": "Minimale länge des Passwortes", - "min-password-strength": "Minimum Password Strength", + "min-password-strength": "Minimale Passwort stärke", "max-about-me-length": "Maximale länge von Über Mich", "terms-of-use": "Forum Nutzungsbedingungen (Leer lassen um es zu deaktivieren)", "user-search": "Benutzersuche", diff --git a/public/language/de/email.json b/public/language/de/email.json index 490001d405..dcd3eb4fa3 100644 --- a/public/language/de/email.json +++ b/public/language/de/email.json @@ -32,9 +32,9 @@ "notif.post.unsub.info": "Diese Mitteilung wurde dir aufgrund deiner Abonnement-Einstellungen gesendet.", "test.text1": "Dies ist eine Test-E-Mail, um zu überprüfen, ob der E-Mailer deines NodeBB korrekt eingestellt wurde.", "unsub.cta": "Klicke hier, um diese Einstellungen zu ändern.", - "banned.subject": "You have been banned from %1", - "banned.text1": "The user %1 has been banned from %2.", - "banned.text2": "This ban will last until %1.", - "banned.text3": "This is the reason why you have been banned:", + "banned.subject": "Du wurdest von %1 gebannt.", + "banned.text1": "Der Benutzer %1 wurde von %2 gebannt.", + "banned.text2": "Dieser Bann wird bis %1 dauern.", + "banned.text3": "Diese ist der Grund weshalb du gebannt wurdest", "closing": "Danke!" } \ No newline at end of file diff --git a/public/language/de/error.json b/public/language/de/error.json index ea969f8284..32b5fc4388 100644 --- a/public/language/de/error.json +++ b/public/language/de/error.json @@ -1,5 +1,6 @@ { "invalid-data": "Ungültige Daten", + "invalid-json": "Ungültiges JSON", "not-logged-in": "Du bist nicht angemeldet.", "account-locked": "Dein Account wurde vorübergehend gesperrt.", "search-requires-login": "Die Suche erfordert ein Konto, bitte einloggen oder registrieren.", @@ -12,6 +13,7 @@ "invalid-title": "Ungültiger Titel", "invalid-user-data": "Ungültige Benutzerdaten", "invalid-password": "Ungültiges Passwort", + "invalid-login-credentials": "Ungültige Zugangsdaten", "invalid-username-or-password": "Bitte gebe einen Benutzernamen und ein Passwort an", "invalid-search-term": "Ungültige Suchanfrage", "csrf-invalid": "Dein Login war nicht erfolgreich da wahrscheinlich deine Sitzung abgelaufen ist. Bitte versuche es noch einmal", @@ -30,7 +32,7 @@ "password-too-long": "Passwort ist zu lang", "user-banned": "Benutzer ist gesperrt", "user-banned-reason": "Entschuldige, dieses Konto wurde gebannt (Grund: %1)", - "user-banned-reason-until": "Sorry, this account has been banned until %1 (Reason: %2)", + "user-banned-reason-until": "Entschuldigung, dieser Account wurde bis %1 (Reason: %2) gebannt.", "user-too-new": "Entschuldigung, du musst %1 Sekunde(n) warten, bevor du deinen ersten Beitrag schreiben kannst.", "blacklisted-ip": "Deine IP-Adresse ist für diese Plattform gesperrt. Sollte dies ein Irrtum sein, dann kontaktiere bitte einen Administrator.", "ban-expiry-missing": "Bitte gebe ein Enddatum für diesen Ban an", @@ -105,7 +107,7 @@ "chat-disabled": "Das Chatsystem deaktiviert", "too-many-messages": "Du hast zu viele Nachrichten versandt, bitte warte eine Weile.", "invalid-chat-message": "Ungültige Nachricht", - "chat-message-too-long": "Chat messages can not be longer than %1 characters.", + "chat-message-too-long": "Chat Nachricht darf nicht länger als %1 Zeichen sein.", "cant-edit-chat-message": "Du darfst diese Nachricht nicht ändern", "cant-remove-last-user": "Du kannst den letzten Benutzer nicht entfernen", "cant-delete-chat-message": "Du darfst diese Nachricht nicht löschen", diff --git a/public/language/de/flags.json b/public/language/de/flags.json index c4bfed6f23..974ba725ff 100644 --- a/public/language/de/flags.json +++ b/public/language/de/flags.json @@ -1,60 +1,60 @@ { - "state": "State", - "reporter": "Reporter", - "reported-at": "Reported At", - "description": "Description", - "no-flags": "Hooray! No flags found.", - "assignee": "Assignee", - "update": "Update", - "updated": "Updated", - "target-purged": "The content this flag referred to has been purged and is no longer available.", + "state": "Zustand", + "reporter": "Meldender", + "reported-at": "Gemeldet am", + "description": "Beschreibung", + "no-flags": "Hurra! Keine Meldungen gefunden.", + "assignee": "Zugeordneter Benutzer", + "update": "Aktualisieren", + "updated": "Aktualisiert", + "target-purged": "Der Inhalt auf den diese Meldung hingewiesen hat, wurde gelöscht und ist nicht mehr verfügbar.", - "quick-filters": "Quick Filters", - "filter-active": "There are one or more filters active in this list of flags", - "filter-reset": "Remove Filters", - "filters": "Filter Options", - "filter-reporterId": "Reporter UID", - "filter-targetUid": "Flagged UID", - "filter-type": "Flag Type", - "filter-type-all": "All Content", - "filter-type-post": "Post", - "filter-state": "State", - "filter-assignee": "Assignee UID", - "filter-cid": "Category", - "filter-quick-mine": "Assigned to me", - "filter-cid-all": "All categories", - "apply-filters": "Apply Filters", + "quick-filters": "Schnell-Filter", + "filter-active": "Ein oder mehrere Filter sind in dieser Meldungs-Liste aktiv", + "filter-reset": "Filter Entfernen", + "filters": "Filter Optionen", + "filter-reporterId": "Melder UID", + "filter-targetUid": "Gemeldete UID", + "filter-type": "Meldungstyp", + "filter-type-all": "Gesamter Inhalt", + "filter-type-post": "Beitrag", + "filter-state": "Status", + "filter-assignee": "UID des Zugewiesenen", + "filter-cid": "Kategorie", + "filter-quick-mine": "Mir zugewiesen", + "filter-cid-all": "Alle Kategorien", + "apply-filters": "Filter anwenden", - "quick-links": "Quick Links", - "flagged-user": "Flagged User", - "view-profile": "View Profile", - "start-new-chat": "Start New Chat", - "go-to-target": "View Flag Target", + "quick-links": "Schnellnavigation", + "flagged-user": "Gemeldeter Benutzer", + "view-profile": "Profil ansehen", + "start-new-chat": "Neuen Chat beginnen", + "go-to-target": "Meldungsziel ansehen", - "user-view": "View Profile", - "user-edit": "Edit Profile", + "user-view": "Profil ansehen", + "user-edit": "Profil bearbeiten", - "notes": "Flag Notes", - "add-note": "Add Note", - "no-notes": "No shared notes.", + "notes": "Meldungsnotizen", + "add-note": "Notiz hinzufügen", + "no-notes": "Keine geteilten Notizen", - "history": "Flag History", - "back": "Back to Flags List", - "no-history": "No flag history.", + "history": "Meldungsverlauf", + "back": "Zurück zur Meldungsliste", + "no-history": "Kein Meldungsverlauf", - "state-all": "All states", - "state-open": "New/Open", - "state-wip": "Work in Progress", - "state-resolved": "Resolved", - "state-rejected": "Rejected", - "no-assignee": "Not Assigned", - "note-added": "Note Added", + "state-all": "Alle Status", + "state-open": "Neu/Öffnen", + "state-wip": "In Arbeit", + "state-resolved": "Gelöst", + "state-rejected": "Abgelehnt", + "no-assignee": "Nicht zugewiesen", + "note-added": "Notiz hinzugefügt", - "modal-title": "Report Inappropriate Content", - "modal-body": "Please specify your reason for flagging %1 %2 for review. Alternatively, use one of the quick report buttons if applicable.", + "modal-title": "Anstößige Inhalte Melden", + "modal-body": "Bitte geben Sie den Grund an, weshalb Sie %1 %2 melden wollen. Alternativ können Sie einen der Schnell-Meldungs-Knöpfe verwenden, wenn anwendbar.", "modal-reason-spam": "Spam", - "modal-reason-offensive": "Offensive", - "modal-reason-custom": "Reason for reporting this content...", - "modal-submit": "Submit Report", - "modal-submit-success": "Content has been flagged for moderation." + "modal-reason-offensive": "Beleidigend", + "modal-reason-custom": "Grund für die Meldung dieses Inhalts...", + "modal-submit": "Meldung abschicken", + "modal-submit-success": "Der Inhalt wurde gemeldet." } \ No newline at end of file diff --git a/public/language/de/modules.json b/public/language/de/modules.json index a1cf19cea0..bb53b0fb87 100644 --- a/public/language/de/modules.json +++ b/public/language/de/modules.json @@ -20,7 +20,7 @@ "chat.three_months": "3 Monate", "chat.delete_message_confirm": "Bist du sicher, dass du diese Nachricht löschen möchtest?", "chat.add-users-to-room": "Benutzer zum Raum hinzufügen", - "chat.confirm-chat-with-dnd-user": "This user has set their status to DnD(Do not disturb). Do you still want to chat with them?", + "chat.confirm-chat-with-dnd-user": "Dieser Benutzer hat seinen Status auf DnD(Bitte nicht stören) gesetzt. Möchtest du noch immer mit ihm chatten?", "composer.compose": "Verfassen", "composer.show_preview": "Vorschau zeigen", "composer.hide_preview": "Vorschau ausblenden", diff --git a/public/language/de/topic.json b/public/language/de/topic.json index 76861f0d00..24334afd81 100644 --- a/public/language/de/topic.json +++ b/public/language/de/topic.json @@ -14,6 +14,7 @@ "quote": "Zitieren", "reply": "Antworten", "replies_to_this_post": "%1 Antworten", + "one_reply_to_this_post": "1 Antwort", "last_reply_time": "Letzte Antwort", "reply-as-topic": "In einem neuen Thema antworten", "guest-login-reply": "Anmelden zum Antworten", diff --git a/public/language/de/user.json b/public/language/de/user.json index afcbb48c96..22dd586842 100644 --- a/public/language/de/user.json +++ b/public/language/de/user.json @@ -60,7 +60,7 @@ "username_taken_workaround": "Der gewünschte Benutzername ist bereits vergeben, deshalb haben wir ihn ein wenig verändert. Du bist jetzt unter dem Namen %1 bekannt.", "password_same_as_username": "Dein Passwort entspricht deinem Benutzernamen, bitte wähle ein anderes Passwort.", "password_same_as_email": "Dein Passwort entspricht deiner E-Mail-Adresse, bitte wähle ein anderes Passwort.", - "weak_password": "Weak password.", + "weak_password": "Schwaches Password.", "upload_picture": "Bild hochladen", "upload_a_picture": "Ein Bild hochladen", "remove_uploaded_picture": "Hochgeladenes Bild entfernen", diff --git a/public/language/el/admin/appearance/customise.json b/public/language/el/admin/appearance/customise.json index 767d443e29..5095f7a937 100644 --- a/public/language/el/admin/appearance/customise.json +++ b/public/language/el/admin/appearance/customise.json @@ -5,5 +5,8 @@ "custom-header": "Custom Header", "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", - "custom-header.enable": "Enable Custom Header" + "custom-header.enable": "Enable Custom Header", + + "custom-css.livereload": "Enable Live Reload", + "custom-css.livereload.description": "Enable this to force all sessions on every device under your account to refresh whenever you click save" } \ No newline at end of file diff --git a/public/language/el/admin/development/info.json b/public/language/el/admin/development/info.json index b2768ca212..0a4ae6fe2c 100644 --- a/public/language/el/admin/development/info.json +++ b/public/language/el/admin/development/info.json @@ -1,10 +1,12 @@ { "you-are-on": "Info - You are on %1:%2", + "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", "pid": "pid", "nodejs": "nodejs", "online": "online", "git": "git", + "memory": "memory", "load": "load", "uptime": "uptime", diff --git a/public/language/el/admin/general/dashboard.json b/public/language/el/admin/general/dashboard.json index 02046bd17a..61f4421fb5 100644 --- a/public/language/el/admin/general/dashboard.json +++ b/public/language/el/admin/general/dashboard.json @@ -5,9 +5,14 @@ "users": "Users", "posts": "Posts", "topics": "Topics", - "page-views-last-month": "Page views Last Month", - "page-views-this-month": "Page views This Month", - "page-views-last-day": "Page views in last 24 hours", + "page-views-seven": "Last 7 Days", + "page-views-thirty": "Last 30 Days", + "page-views-last-day": "Last 24 hours", + "page-views-custom": "Custom Date Range", + "page-views-custom-start": "Range Start", + "page-views-custom-end": "Range End", + "page-views-custom-help": "Enter a date range of page views you would like to view. If no date picker is available, the accepted format is YYYY-MM-DD", + "page-views-custom-error": "Please enter a valid date range in the format YYYY-MM-DD", "stats.day": "Day", "stats.week": "Week", diff --git a/public/language/el/admin/general/languages.json b/public/language/el/admin/general/languages.json index da45cade2c..bdd57849b3 100644 --- a/public/language/el/admin/general/languages.json +++ b/public/language/el/admin/general/languages.json @@ -1,5 +1,6 @@ { "language-settings": "Language Settings", "description": "The default language determines the language settings for all users who are visiting your forum.
Individual users can override the default language on their account settings page.", - "default-language": "Default Language" + "default-language": "Default Language", + "auto-detect": "Auto Detect Language Setting for Guests" } \ No newline at end of file diff --git a/public/language/el/admin/settings/user.json b/public/language/el/admin/settings/user.json index b8f51c9288..fa8049c3a9 100644 --- a/public/language/el/admin/settings/user.json +++ b/public/language/el/admin/settings/user.json @@ -34,6 +34,8 @@ "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", + "invite-expiration": "Invite expiration", + "invite-expiration-help": "# of days invitations expire in.", "min-username-length": "Minimum Username Length", "max-username-length": "Maximum Username Length", "min-password-length": "Minimum Password Length", diff --git a/public/language/el/error.json b/public/language/el/error.json index cb553a38d1..1f222177af 100644 --- a/public/language/el/error.json +++ b/public/language/el/error.json @@ -1,5 +1,6 @@ { "invalid-data": "Άκυρα Δεδομένα", + "invalid-json": "Invalid JSON", "not-logged-in": "Φαίνεται πως δεν είσαι συνδεδεμένος/η.", "account-locked": "Ο λογαριασμός σου έχει κλειδωθεί προσωρινά", "search-requires-login": "Searching requires an account - please login or register.", @@ -12,6 +13,7 @@ "invalid-title": "Άκυρος Τίτλος!", "invalid-user-data": "Άκυρα Δεδομένα Χρήστη", "invalid-password": "Άκυρος Κωδικός", + "invalid-login-credentials": "Invalid login credentials", "invalid-username-or-password": "Παρακαλώ γράψε το όνομα χρήστη και τον κωδικό", "invalid-search-term": "Άκυρος όρος αναζήτησης", "csrf-invalid": "We were unable to log you in, likely due to an expired session. Please try again", diff --git a/public/language/el/topic.json b/public/language/el/topic.json index 0d382c2407..e7ae540d04 100644 --- a/public/language/el/topic.json +++ b/public/language/el/topic.json @@ -14,6 +14,7 @@ "quote": "Παράθεση", "reply": "Απάντηση", "replies_to_this_post": "%1 Replies", + "one_reply_to_this_post": "1 Reply", "last_reply_time": "Last reply", "reply-as-topic": "Reply as topic", "guest-login-reply": "Log in to reply", diff --git a/public/language/en-GB/admin/appearance/customise.json b/public/language/en-GB/admin/appearance/customise.json index 767d443e29..5095f7a937 100644 --- a/public/language/en-GB/admin/appearance/customise.json +++ b/public/language/en-GB/admin/appearance/customise.json @@ -5,5 +5,8 @@ "custom-header": "Custom Header", "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", - "custom-header.enable": "Enable Custom Header" + "custom-header.enable": "Enable Custom Header", + + "custom-css.livereload": "Enable Live Reload", + "custom-css.livereload.description": "Enable this to force all sessions on every device under your account to refresh whenever you click save" } \ No newline at end of file diff --git a/public/language/en-GB/admin/development/info.json b/public/language/en-GB/admin/development/info.json index 24bf179655..0a4ae6fe2c 100644 --- a/public/language/en-GB/admin/development/info.json +++ b/public/language/en-GB/admin/development/info.json @@ -6,6 +6,7 @@ "nodejs": "nodejs", "online": "online", "git": "git", + "memory": "memory", "load": "load", "uptime": "uptime", diff --git a/public/language/en-GB/admin/general/dashboard.json b/public/language/en-GB/admin/general/dashboard.json index 02046bd17a..61f4421fb5 100644 --- a/public/language/en-GB/admin/general/dashboard.json +++ b/public/language/en-GB/admin/general/dashboard.json @@ -5,9 +5,14 @@ "users": "Users", "posts": "Posts", "topics": "Topics", - "page-views-last-month": "Page views Last Month", - "page-views-this-month": "Page views This Month", - "page-views-last-day": "Page views in last 24 hours", + "page-views-seven": "Last 7 Days", + "page-views-thirty": "Last 30 Days", + "page-views-last-day": "Last 24 hours", + "page-views-custom": "Custom Date Range", + "page-views-custom-start": "Range Start", + "page-views-custom-end": "Range End", + "page-views-custom-help": "Enter a date range of page views you would like to view. If no date picker is available, the accepted format is YYYY-MM-DD", + "page-views-custom-error": "Please enter a valid date range in the format YYYY-MM-DD", "stats.day": "Day", "stats.week": "Week", diff --git a/public/language/en-GB/admin/manage/categories.json b/public/language/en-GB/admin/manage/categories.json index 7e2a5ce12e..871affe560 100644 --- a/public/language/en-GB/admin/manage/categories.json +++ b/public/language/en-GB/admin/manage/categories.json @@ -10,6 +10,7 @@ "custom-class": "Custom Class", "num-recent-replies": "# of Recent Replies", "ext-link": "External Link", + "is-section": "Treat this category as a section", "upload-image": "Upload Image", "delete-image": "Remove", "category-image": "Category Image", diff --git a/public/language/en-GB/admin/settings/user.json b/public/language/en-GB/admin/settings/user.json index b8f51c9288..fa8049c3a9 100644 --- a/public/language/en-GB/admin/settings/user.json +++ b/public/language/en-GB/admin/settings/user.json @@ -34,6 +34,8 @@ "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", + "invite-expiration": "Invite expiration", + "invite-expiration-help": "# of days invitations expire in.", "min-username-length": "Minimum Username Length", "max-username-length": "Maximum Username Length", "min-password-length": "Minimum Password Length", diff --git a/public/language/en-GB/error.json b/public/language/en-GB/error.json index 89222f622f..8d106b6a79 100644 --- a/public/language/en-GB/error.json +++ b/public/language/en-GB/error.json @@ -1,5 +1,6 @@ { "invalid-data": "Invalid Data", + "invalid-json": "Invalid JSON", "not-logged-in": "You don't seem to be logged in.", "account-locked": "Your account has been locked temporarily", diff --git a/public/language/en-GB/global.json b/public/language/en-GB/global.json index bb152e4561..741fb4d2b8 100644 --- a/public/language/en-GB/global.json +++ b/public/language/en-GB/global.json @@ -130,6 +130,8 @@ "cookies.message": "This website uses cookies to ensure you get the best experience on our website.", "cookies.accept": "Got it!", "cookies.learn_more": "Learn More", - - "edited": "Edited" + + "edited": "Edited", + "disabled": "Disabled", + "select": "Select" } diff --git a/public/language/en-GB/topic.json b/public/language/en-GB/topic.json index b960fb0fba..d206960156 100644 --- a/public/language/en-GB/topic.json +++ b/public/language/en-GB/topic.json @@ -17,6 +17,7 @@ "quote": "Quote", "reply": "Reply", "replies_to_this_post": "%1 Replies", + "one_reply_to_this_post": "1 Reply", "last_reply_time": "Last reply", "reply-as-topic": "Reply as topic", "guest-login-reply": "Log in to reply", @@ -69,6 +70,7 @@ "thread_tools.unlock": "Unlock Topic", "thread_tools.move": "Move Topic", "thread_tools.move_all": "Move All", + "thread_tools.select_category": "Select Category", "thread_tools.fork": "Fork Topic", "thread_tools.delete": "Delete Topic", "thread_tools.delete-posts": "Delete Posts", @@ -85,7 +87,6 @@ "post_purge_confirm": "Are you sure you want to purge this post?", "load_categories": "Loading Categories", - "disabled_categories_note": "Disabled Categories are greyed out", "confirm_move": "Move", "confirm_fork": "Fork", @@ -99,7 +100,6 @@ "move_post": "Move Post", "post_moved": "Post moved!", "fork_topic": "Fork Topic", - "topic_will_be_moved_to": "This topic will be moved to the category", "fork_topic_instruction": "Click the posts you want to fork", "fork_no_pids": "No posts selected!", "fork_pid_count": "%1 post(s) selected", diff --git a/public/language/en-US/admin/appearance/customise.json b/public/language/en-US/admin/appearance/customise.json index 767d443e29..5095f7a937 100644 --- a/public/language/en-US/admin/appearance/customise.json +++ b/public/language/en-US/admin/appearance/customise.json @@ -5,5 +5,8 @@ "custom-header": "Custom Header", "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", - "custom-header.enable": "Enable Custom Header" + "custom-header.enable": "Enable Custom Header", + + "custom-css.livereload": "Enable Live Reload", + "custom-css.livereload.description": "Enable this to force all sessions on every device under your account to refresh whenever you click save" } \ No newline at end of file diff --git a/public/language/en-US/admin/development/info.json b/public/language/en-US/admin/development/info.json index b2768ca212..0a4ae6fe2c 100644 --- a/public/language/en-US/admin/development/info.json +++ b/public/language/en-US/admin/development/info.json @@ -1,10 +1,12 @@ { "you-are-on": "Info - You are on %1:%2", + "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", "pid": "pid", "nodejs": "nodejs", "online": "online", "git": "git", + "memory": "memory", "load": "load", "uptime": "uptime", diff --git a/public/language/en-US/admin/general/dashboard.json b/public/language/en-US/admin/general/dashboard.json index 02046bd17a..61f4421fb5 100644 --- a/public/language/en-US/admin/general/dashboard.json +++ b/public/language/en-US/admin/general/dashboard.json @@ -5,9 +5,14 @@ "users": "Users", "posts": "Posts", "topics": "Topics", - "page-views-last-month": "Page views Last Month", - "page-views-this-month": "Page views This Month", - "page-views-last-day": "Page views in last 24 hours", + "page-views-seven": "Last 7 Days", + "page-views-thirty": "Last 30 Days", + "page-views-last-day": "Last 24 hours", + "page-views-custom": "Custom Date Range", + "page-views-custom-start": "Range Start", + "page-views-custom-end": "Range End", + "page-views-custom-help": "Enter a date range of page views you would like to view. If no date picker is available, the accepted format is YYYY-MM-DD", + "page-views-custom-error": "Please enter a valid date range in the format YYYY-MM-DD", "stats.day": "Day", "stats.week": "Week", diff --git a/public/language/en-US/admin/general/languages.json b/public/language/en-US/admin/general/languages.json index da45cade2c..bdd57849b3 100644 --- a/public/language/en-US/admin/general/languages.json +++ b/public/language/en-US/admin/general/languages.json @@ -1,5 +1,6 @@ { "language-settings": "Language Settings", "description": "The default language determines the language settings for all users who are visiting your forum.
Individual users can override the default language on their account settings page.", - "default-language": "Default Language" + "default-language": "Default Language", + "auto-detect": "Auto Detect Language Setting for Guests" } \ No newline at end of file diff --git a/public/language/en-US/admin/settings/user.json b/public/language/en-US/admin/settings/user.json index b8f51c9288..fa8049c3a9 100644 --- a/public/language/en-US/admin/settings/user.json +++ b/public/language/en-US/admin/settings/user.json @@ -34,6 +34,8 @@ "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", + "invite-expiration": "Invite expiration", + "invite-expiration-help": "# of days invitations expire in.", "min-username-length": "Minimum Username Length", "max-username-length": "Maximum Username Length", "min-password-length": "Minimum Password Length", diff --git a/public/language/en-US/error.json b/public/language/en-US/error.json index 35eaf8cbc6..403c0b4aa7 100644 --- a/public/language/en-US/error.json +++ b/public/language/en-US/error.json @@ -1,5 +1,6 @@ { "invalid-data": "Invalid Data", + "invalid-json": "Invalid JSON", "not-logged-in": "You don't seem to be logged in.", "account-locked": "Your account has been locked temporarily", "search-requires-login": "Searching requires an account - please login or register.", @@ -12,6 +13,7 @@ "invalid-title": "Invalid title!", "invalid-user-data": "Invalid User Data", "invalid-password": "Invalid Password", + "invalid-login-credentials": "Invalid login credentials", "invalid-username-or-password": "Please specify both a username and password", "invalid-search-term": "Invalid search term", "csrf-invalid": "We were unable to log you in, likely due to an expired session. Please try again", diff --git a/public/language/en-US/topic.json b/public/language/en-US/topic.json index 519cc5cd74..c880249b60 100644 --- a/public/language/en-US/topic.json +++ b/public/language/en-US/topic.json @@ -14,6 +14,7 @@ "quote": "Quote", "reply": "Reply", "replies_to_this_post": "%1 Replies", + "one_reply_to_this_post": "1 Reply", "last_reply_time": "Last reply", "reply-as-topic": "Reply as topic", "guest-login-reply": "Log in to reply", diff --git a/public/language/en-x-pirate/admin/appearance/customise.json b/public/language/en-x-pirate/admin/appearance/customise.json index 767d443e29..5095f7a937 100644 --- a/public/language/en-x-pirate/admin/appearance/customise.json +++ b/public/language/en-x-pirate/admin/appearance/customise.json @@ -5,5 +5,8 @@ "custom-header": "Custom Header", "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", - "custom-header.enable": "Enable Custom Header" + "custom-header.enable": "Enable Custom Header", + + "custom-css.livereload": "Enable Live Reload", + "custom-css.livereload.description": "Enable this to force all sessions on every device under your account to refresh whenever you click save" } \ No newline at end of file diff --git a/public/language/en-x-pirate/admin/development/info.json b/public/language/en-x-pirate/admin/development/info.json index b2768ca212..0a4ae6fe2c 100644 --- a/public/language/en-x-pirate/admin/development/info.json +++ b/public/language/en-x-pirate/admin/development/info.json @@ -1,10 +1,12 @@ { "you-are-on": "Info - You are on %1:%2", + "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", "pid": "pid", "nodejs": "nodejs", "online": "online", "git": "git", + "memory": "memory", "load": "load", "uptime": "uptime", diff --git a/public/language/en-x-pirate/admin/general/dashboard.json b/public/language/en-x-pirate/admin/general/dashboard.json index 02046bd17a..61f4421fb5 100644 --- a/public/language/en-x-pirate/admin/general/dashboard.json +++ b/public/language/en-x-pirate/admin/general/dashboard.json @@ -5,9 +5,14 @@ "users": "Users", "posts": "Posts", "topics": "Topics", - "page-views-last-month": "Page views Last Month", - "page-views-this-month": "Page views This Month", - "page-views-last-day": "Page views in last 24 hours", + "page-views-seven": "Last 7 Days", + "page-views-thirty": "Last 30 Days", + "page-views-last-day": "Last 24 hours", + "page-views-custom": "Custom Date Range", + "page-views-custom-start": "Range Start", + "page-views-custom-end": "Range End", + "page-views-custom-help": "Enter a date range of page views you would like to view. If no date picker is available, the accepted format is YYYY-MM-DD", + "page-views-custom-error": "Please enter a valid date range in the format YYYY-MM-DD", "stats.day": "Day", "stats.week": "Week", diff --git a/public/language/en-x-pirate/admin/general/languages.json b/public/language/en-x-pirate/admin/general/languages.json index da45cade2c..bdd57849b3 100644 --- a/public/language/en-x-pirate/admin/general/languages.json +++ b/public/language/en-x-pirate/admin/general/languages.json @@ -1,5 +1,6 @@ { "language-settings": "Language Settings", "description": "The default language determines the language settings for all users who are visiting your forum.
Individual users can override the default language on their account settings page.", - "default-language": "Default Language" + "default-language": "Default Language", + "auto-detect": "Auto Detect Language Setting for Guests" } \ No newline at end of file diff --git a/public/language/en-x-pirate/admin/settings/user.json b/public/language/en-x-pirate/admin/settings/user.json index b8f51c9288..fa8049c3a9 100644 --- a/public/language/en-x-pirate/admin/settings/user.json +++ b/public/language/en-x-pirate/admin/settings/user.json @@ -34,6 +34,8 @@ "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", + "invite-expiration": "Invite expiration", + "invite-expiration-help": "# of days invitations expire in.", "min-username-length": "Minimum Username Length", "max-username-length": "Maximum Username Length", "min-password-length": "Minimum Password Length", diff --git a/public/language/en-x-pirate/error.json b/public/language/en-x-pirate/error.json index 35eaf8cbc6..403c0b4aa7 100644 --- a/public/language/en-x-pirate/error.json +++ b/public/language/en-x-pirate/error.json @@ -1,5 +1,6 @@ { "invalid-data": "Invalid Data", + "invalid-json": "Invalid JSON", "not-logged-in": "You don't seem to be logged in.", "account-locked": "Your account has been locked temporarily", "search-requires-login": "Searching requires an account - please login or register.", @@ -12,6 +13,7 @@ "invalid-title": "Invalid title!", "invalid-user-data": "Invalid User Data", "invalid-password": "Invalid Password", + "invalid-login-credentials": "Invalid login credentials", "invalid-username-or-password": "Please specify both a username and password", "invalid-search-term": "Invalid search term", "csrf-invalid": "We were unable to log you in, likely due to an expired session. Please try again", diff --git a/public/language/en-x-pirate/topic.json b/public/language/en-x-pirate/topic.json index 519cc5cd74..c880249b60 100644 --- a/public/language/en-x-pirate/topic.json +++ b/public/language/en-x-pirate/topic.json @@ -14,6 +14,7 @@ "quote": "Quote", "reply": "Reply", "replies_to_this_post": "%1 Replies", + "one_reply_to_this_post": "1 Reply", "last_reply_time": "Last reply", "reply-as-topic": "Reply as topic", "guest-login-reply": "Log in to reply", diff --git a/public/language/es/admin/advanced/database.json b/public/language/es/admin/advanced/database.json index 9c51814073..16c72eb046 100644 --- a/public/language/es/admin/advanced/database.json +++ b/public/language/es/admin/advanced/database.json @@ -2,35 +2,35 @@ "x-b": "%1 b", "x-mb": "%1 mb", "x-gb": "%1 gb", - "uptime-seconds": "Uptime in Seconds", - "uptime-days": "Uptime in Days", + "uptime-seconds": "Tiempo de acitividad en Segundos", + "uptime-days": "Tiempo de actividad en días", "mongo": "Mongo", - "mongo.version": "MongoDB Version", - "mongo.storage-engine": "Storage Engine", + "mongo.version": "Versión MongoDB", + "mongo.storage-engine": "Motor de almacenamiento", "mongo.collections": "Colecciones", "mongo.objects": "Objetos", "mongo.avg-object-size": "Tamaño promedio por Objeto", "mongo.data-size": "Tamaño de los Datos", - "mongo.storage-size": "Storage Size", - "mongo.index-size": "Index Size", - "mongo.file-size": "File Size", - "mongo.resident-memory": "Resident Memory", + "mongo.storage-size": "Tamaño del almacenamiento", + "mongo.index-size": "Tamaño del Índice", + "mongo.file-size": "Tamaño del fichero", + "mongo.resident-memory": "Memoria Residente", "mongo.virtual-memory": "Memoria Virtual", - "mongo.mapped-memory": "Mapped Memory", - "mongo.raw-info": "MongoDB Raw Info", + "mongo.mapped-memory": "Memoria Mapeada", + "mongo.raw-info": "Fila de Información MongoDB", "redis": "Redis", - "redis.version": "Redis Version", - "redis.connected-clients": "Connected Clients", + "redis.version": "Versión de Redis", + "redis.connected-clients": "Clientes Conectados", "redis.connected-slaves": "Esclavos Conectados", "redis.blocked-clients": "Clientes Bloqueados", "redis.used-memory": "Memoria Utilizada", - "redis.memory-frag-ratio": "Memory Fragmentation Ratio", + "redis.memory-frag-ratio": "Proporción de Fragmentación de la Memoria", "redis.total-connections-recieved": "Total de Conexiones Recividas ", "redis.total-commands-processed": "Total de Comandos Procesados", "redis.iops": "Operaciones Instantáneas por Segundo", - "redis.keyspace-hits": "Keyspace Hits", - "redis.keyspace-misses": "Keyspace Misses", - "redis.raw-info": "Redis Raw Info" + "redis.keyspace-hits": "Pulsaciones de espaciado del teclado", + "redis.keyspace-misses": "Fallos de espaciado del teclado", + "redis.raw-info": "Fila de Información de Redis" } \ No newline at end of file diff --git a/public/language/es/admin/appearance/customise.json b/public/language/es/admin/appearance/customise.json index 9578bf423d..ad8ae104a8 100644 --- a/public/language/es/admin/appearance/customise.json +++ b/public/language/es/admin/appearance/customise.json @@ -5,5 +5,8 @@ "custom-header": "Cabezera personalizada", "custom-header.description": "Introduce HTML personalizado aquí (ej. JavaScript, Meta Etiquetas, etc.), el cual se adjuntará a la sección <head> del código de su foro.", - "custom-header.enable": "Activar cabecera personalizada" + "custom-header.enable": "Activar cabecera personalizada", + + "custom-css.livereload": "Activar Recargar en Vivo", + "custom-css.livereload.description": "Activar esto para forzar todas las sesiones en todos los dispositivos que recaen de tu cuenta a limpiar cada vez que tú haces clic en guardar" } \ No newline at end of file diff --git a/public/language/es/admin/development/info.json b/public/language/es/admin/development/info.json index a068347c43..826b848cbc 100644 --- a/public/language/es/admin/development/info.json +++ b/public/language/es/admin/development/info.json @@ -1,16 +1,18 @@ { "you-are-on": "Info - Tu estas en %1:%2", + "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", "pid": "pid", "nodejs": "nodejs", "online": "en-linea", "git": "git", + "memory": "memoria", "load": "cargar", - "uptime": "uptime", + "uptime": "tiempo de actividad", - "registered": "Registered", - "sockets": "Sockets", - "guests": "Guests", + "registered": "Registrado", + "sockets": "Toma", + "guests": "Invitados", - "info": "Info" + "info": "Información" } \ No newline at end of file diff --git a/public/language/es/admin/development/logger.json b/public/language/es/admin/development/logger.json index 6ab9558149..018f676d48 100644 --- a/public/language/es/admin/development/logger.json +++ b/public/language/es/admin/development/logger.json @@ -1,12 +1,12 @@ { - "logger-settings": "Logger Settings", + "logger-settings": "Ajustes de registro", "description": "By enabling the check boxes, you will receive logs to your terminal. If you specify a path, logs will then be saved to a file instead. HTTP logging is useful for collecting statistics about who, when, and what people access on your forum. In addition to logging HTTP requests, we can also log socket.io events. Socket.io logging, in combination with redis-cli monitor, can be very helpful for learning NodeBB's internals.", - "explanation": "Simply check/uncheck the logging settings to enable or disable logging on the fly. No restart needed.", - "enable-http": "Enable HTTP logging", - "enable-socket": "Enable socket.io event logging", - "file-path": "Path to log file", + "explanation": "Simplemente marca/desmarca los ajustes de registro para activar o desactivar registro en el aire. No se necesita reinicio.", + "enable-http": "Activar registro HTTP", + "enable-socket": "Activar el evento de registro socket.io ", + "file-path": "Ruta al fichero log", "file-path-placeholder": "/path/to/log/file.log ::: leave blank to log to your terminal", - "control-panel": "Logger Control Panel", - "update-settings": "Update Logger Settings" + "control-panel": "Panel de Control de Registro", + "update-settings": "Actualizar Ajustes de Registro" } \ No newline at end of file diff --git a/public/language/es/admin/extend/plugins.json b/public/language/es/admin/extend/plugins.json index dba3e65d87..c2414d3a25 100644 --- a/public/language/es/admin/extend/plugins.json +++ b/public/language/es/admin/extend/plugins.json @@ -7,7 +7,7 @@ "none-active": "No hay Plug-ins activos", "find-plugins": "Buscar Plug-in", - "plugin-search": "Plug-in de Búsqueda", + "plugin-search": "Buscar", "plugin-search-placeholder": "Búscando Plug-in", "reorder-plugins": "Re-ordenar Plug-ins", "order-active": "Ordenar Plug-ins Activos", @@ -18,14 +18,14 @@ "order.explanation": "Los plug-in son cargados en el orden especificado, de arriba a abajo.", "plugin-item.themes": "Temas", - "plugin-item.deactivate": "Desactivado", - "plugin-item.activate": "Activado", + "plugin-item.deactivate": "Desactivar", + "plugin-item.activate": "Activar", "plugin-item.install": "Instalar", "plugin-item.uninstall": "Desinstalar", "plugin-item.settings": "Configuraciones", "plugin-item.installed": "Instalados", "plugin-item.latest": "Ultimos", - "plugin-item.upgrade": "Actualizado", + "plugin-item.upgrade": "Actualizar", "plugin-item.more-info": "Para mas información:", "plugin-item.unknown": "Desconocido", "plugin-item.unknown-explanation": "El estado de este plug-in no puede determinsarse, posiblemente es debido a un error de configuración.", @@ -35,9 +35,9 @@ "alert.upgraded": "Plug-in Actualizado", "alert.installed": "Plug-in Instalado", "alert.uninstalled": "Plug-in Desinstalado", - "alert.activate-success": "Por favor reinicia NodeBB para activar el plug-in por completo", + "alert.activate-success": "Por favor reiniciá NodeBB para activar el plug-in por completo", "alert.deactivate-success": "Plugin successfully deactivated", - "alert.upgrade-success": "Please reload your NodeBB to fully upgrade this plugin", + "alert.upgrade-success": "Por favor recargá NodeBB para actualizar el plug-in por completo", "alert.install-success": "Plugin successfully installed, please activate the plugin.", "alert.uninstall-success": "The plugin has been successfully deactivated and uninstalled.", "alert.suggest-error": "

NodeBB could not reach the package manager, proceed with installation of latest version?

Server returned (%1): %2
", diff --git a/public/language/es/admin/general/dashboard.json b/public/language/es/admin/general/dashboard.json index c68d48da21..28bb5a07eb 100644 --- a/public/language/es/admin/general/dashboard.json +++ b/public/language/es/admin/general/dashboard.json @@ -5,9 +5,14 @@ "users": "Usuario", "posts": "Publicación", "topics": "Temas", - "page-views-last-month": "Vistas de la Pagina del Mes Pasado", - "page-views-this-month": "Vistas de la Pagina de este Mes.", - "page-views-last-day": "Vistas de la Pagina en las ultimas 24 horas", + "page-views-seven": "Last 7 Days", + "page-views-thirty": "Last 30 Days", + "page-views-last-day": "Last 24 hours", + "page-views-custom": "Custom Date Range", + "page-views-custom-start": "Range Start", + "page-views-custom-end": "Range End", + "page-views-custom-help": "Enter a date range of page views you would like to view. If no date picker is available, the accepted format is YYYY-MM-DD", + "page-views-custom-error": "Please enter a valid date range in the format YYYY-MM-DD", "stats.day": "Día", "stats.week": "Semana", diff --git a/public/language/es/admin/general/languages.json b/public/language/es/admin/general/languages.json index da45cade2c..bdd57849b3 100644 --- a/public/language/es/admin/general/languages.json +++ b/public/language/es/admin/general/languages.json @@ -1,5 +1,6 @@ { "language-settings": "Language Settings", "description": "The default language determines the language settings for all users who are visiting your forum.
Individual users can override the default language on their account settings page.", - "default-language": "Default Language" + "default-language": "Default Language", + "auto-detect": "Auto Detect Language Setting for Guests" } \ No newline at end of file diff --git a/public/language/es/admin/settings/user.json b/public/language/es/admin/settings/user.json index 395ae98b58..b3fde20150 100644 --- a/public/language/es/admin/settings/user.json +++ b/public/language/es/admin/settings/user.json @@ -34,6 +34,8 @@ "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", + "invite-expiration": "Invite expiration", + "invite-expiration-help": "# of days invitations expire in.", "min-username-length": "Minimum Username Length", "max-username-length": "Maximum Username Length", "min-password-length": "Minimum Password Length", diff --git a/public/language/es/error.json b/public/language/es/error.json index f4d5c8fdef..9fa27f3bc6 100644 --- a/public/language/es/error.json +++ b/public/language/es/error.json @@ -1,5 +1,6 @@ { "invalid-data": "Datos no válidos", + "invalid-json": "Invalid JSON", "not-logged-in": "No has iniciado sesión.", "account-locked": "Tu cuenta ha sido bloqueada temporalmente.", "search-requires-login": "¡Buscar requiere estar registrado! Por favor, entra o regístrate.", @@ -12,6 +13,7 @@ "invalid-title": "¡Título no válido!", "invalid-user-data": "Datos de usuario no válidos", "invalid-password": "Contraseña no válida", + "invalid-login-credentials": "Invalid login credentials", "invalid-username-or-password": "Por favor especifica tanto un usuario como contraseña", "invalid-search-term": "Término de búsqueda inválido", "csrf-invalid": "El acceso ha fallado porque tu sesión ha expirado. Por favor prueba otra vez.", diff --git a/public/language/es/flags.json b/public/language/es/flags.json index c4bfed6f23..012d3181b0 100644 --- a/public/language/es/flags.json +++ b/public/language/es/flags.json @@ -1,60 +1,60 @@ { - "state": "State", - "reporter": "Reporter", - "reported-at": "Reported At", - "description": "Description", - "no-flags": "Hooray! No flags found.", - "assignee": "Assignee", - "update": "Update", - "updated": "Updated", - "target-purged": "The content this flag referred to has been purged and is no longer available.", + "state": "Estado", + "reporter": "Reportador", + "reported-at": "Reportado en", + "description": "Descripción", + "no-flags": "Yeah! No se encontraron indicadores", + "assignee": "Asignado", + "update": "Actualizar", + "updated": "Actualizado", + "target-purged": "El contenido al que se refiere este indicador ha sido purgado y ya no está disponible.", - "quick-filters": "Quick Filters", - "filter-active": "There are one or more filters active in this list of flags", - "filter-reset": "Remove Filters", - "filters": "Filter Options", - "filter-reporterId": "Reporter UID", - "filter-targetUid": "Flagged UID", - "filter-type": "Flag Type", - "filter-type-all": "All Content", + "quick-filters": "Filtros rapidos", + "filter-active": "Hay uno o más filtros activos en esta lista de indicadores.", + "filter-reset": "Quitar filtros", + "filters": "Opciones de filtros", + "filter-reporterId": "UID del reportador", + "filter-targetUid": "Indicador UID", + "filter-type": "Tipo de indicador", + "filter-type-all": "Todo el contenido", "filter-type-post": "Post", - "filter-state": "State", - "filter-assignee": "Assignee UID", - "filter-cid": "Category", - "filter-quick-mine": "Assigned to me", - "filter-cid-all": "All categories", - "apply-filters": "Apply Filters", + "filter-state": "estado", + "filter-assignee": "UID asignado", + "filter-cid": "Categoria", + "filter-quick-mine": "Asignado a mí", + "filter-cid-all": "Todas las categorias", + "apply-filters": "Aplicar filtros", - "quick-links": "Quick Links", - "flagged-user": "Flagged User", - "view-profile": "View Profile", - "start-new-chat": "Start New Chat", - "go-to-target": "View Flag Target", + "quick-links": "Links rapidos", + "flagged-user": "Usuario marcado", + "view-profile": "Ver perfil", + "start-new-chat": "Empezar nuevo chat", + "go-to-target": "Ver objetivo marcado", - "user-view": "View Profile", - "user-edit": "Edit Profile", + "user-view": "Ver perfil", + "user-edit": "Editar perfil", - "notes": "Flag Notes", - "add-note": "Add Note", - "no-notes": "No shared notes.", + "notes": "Marcar notas", + "add-note": "Añadir nota", + "no-notes": "No hay notas compartidas", - "history": "Flag History", - "back": "Back to Flags List", - "no-history": "No flag history.", + "history": "Historico de marcadores", + "back": "Volver a la lista de marcadores", + "no-history": "No hay registro de marcadores", - "state-all": "All states", - "state-open": "New/Open", - "state-wip": "Work in Progress", - "state-resolved": "Resolved", - "state-rejected": "Rejected", - "no-assignee": "Not Assigned", - "note-added": "Note Added", + "state-all": "Todos los estados", + "state-open": "Nuevo/Abrir", + "state-wip": "Trabajo en proceso", + "state-resolved": "Resuelto", + "state-rejected": "Rechazado", + "no-assignee": "Sin asignar", + "note-added": "Nota añadida", - "modal-title": "Report Inappropriate Content", - "modal-body": "Please specify your reason for flagging %1 %2 for review. Alternatively, use one of the quick report buttons if applicable.", - "modal-reason-spam": "Spam", - "modal-reason-offensive": "Offensive", - "modal-reason-custom": "Reason for reporting this content...", - "modal-submit": "Submit Report", + "modal-title": "Reportar contenido inapropiado", + "modal-body": "Por favor especifica tu razón para marcar %1 %2 para revisar. Alternativamente, usa una de los botones de reporte rápido si corresponde.", + "modal-reason-spam": "Correo no deseado", + "modal-reason-offensive": "Ofensivo", + "modal-reason-custom": "Razón para reportar este contenido...", + "modal-submit": "Enviar reporte", "modal-submit-success": "Content has been flagged for moderation." } \ No newline at end of file diff --git a/public/language/es/topic.json b/public/language/es/topic.json index a6cc026d23..fc5e984756 100644 --- a/public/language/es/topic.json +++ b/public/language/es/topic.json @@ -14,6 +14,7 @@ "quote": "Citar", "reply": "Responder", "replies_to_this_post": "%1 Replies", + "one_reply_to_this_post": "1 Reply", "last_reply_time": "Last reply", "reply-as-topic": "Responder como tema", "guest-login-reply": "Accede para responder", diff --git a/public/language/et/admin/appearance/customise.json b/public/language/et/admin/appearance/customise.json index 767d443e29..5095f7a937 100644 --- a/public/language/et/admin/appearance/customise.json +++ b/public/language/et/admin/appearance/customise.json @@ -5,5 +5,8 @@ "custom-header": "Custom Header", "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", - "custom-header.enable": "Enable Custom Header" + "custom-header.enable": "Enable Custom Header", + + "custom-css.livereload": "Enable Live Reload", + "custom-css.livereload.description": "Enable this to force all sessions on every device under your account to refresh whenever you click save" } \ No newline at end of file diff --git a/public/language/et/admin/development/info.json b/public/language/et/admin/development/info.json index b2768ca212..0a4ae6fe2c 100644 --- a/public/language/et/admin/development/info.json +++ b/public/language/et/admin/development/info.json @@ -1,10 +1,12 @@ { "you-are-on": "Info - You are on %1:%2", + "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", "pid": "pid", "nodejs": "nodejs", "online": "online", "git": "git", + "memory": "memory", "load": "load", "uptime": "uptime", diff --git a/public/language/et/admin/general/dashboard.json b/public/language/et/admin/general/dashboard.json index 02046bd17a..61f4421fb5 100644 --- a/public/language/et/admin/general/dashboard.json +++ b/public/language/et/admin/general/dashboard.json @@ -5,9 +5,14 @@ "users": "Users", "posts": "Posts", "topics": "Topics", - "page-views-last-month": "Page views Last Month", - "page-views-this-month": "Page views This Month", - "page-views-last-day": "Page views in last 24 hours", + "page-views-seven": "Last 7 Days", + "page-views-thirty": "Last 30 Days", + "page-views-last-day": "Last 24 hours", + "page-views-custom": "Custom Date Range", + "page-views-custom-start": "Range Start", + "page-views-custom-end": "Range End", + "page-views-custom-help": "Enter a date range of page views you would like to view. If no date picker is available, the accepted format is YYYY-MM-DD", + "page-views-custom-error": "Please enter a valid date range in the format YYYY-MM-DD", "stats.day": "Day", "stats.week": "Week", diff --git a/public/language/et/admin/general/languages.json b/public/language/et/admin/general/languages.json index da45cade2c..bdd57849b3 100644 --- a/public/language/et/admin/general/languages.json +++ b/public/language/et/admin/general/languages.json @@ -1,5 +1,6 @@ { "language-settings": "Language Settings", "description": "The default language determines the language settings for all users who are visiting your forum.
Individual users can override the default language on their account settings page.", - "default-language": "Default Language" + "default-language": "Default Language", + "auto-detect": "Auto Detect Language Setting for Guests" } \ No newline at end of file diff --git a/public/language/et/admin/settings/user.json b/public/language/et/admin/settings/user.json index b8f51c9288..fa8049c3a9 100644 --- a/public/language/et/admin/settings/user.json +++ b/public/language/et/admin/settings/user.json @@ -34,6 +34,8 @@ "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", + "invite-expiration": "Invite expiration", + "invite-expiration-help": "# of days invitations expire in.", "min-username-length": "Minimum Username Length", "max-username-length": "Maximum Username Length", "min-password-length": "Minimum Password Length", diff --git a/public/language/et/error.json b/public/language/et/error.json index 79979ceb3a..fa1f188b62 100644 --- a/public/language/et/error.json +++ b/public/language/et/error.json @@ -1,5 +1,6 @@ { "invalid-data": "Vigased andmed", + "invalid-json": "Invalid JSON", "not-logged-in": "Sa ei ole sisse logitud", "account-locked": "Su kasutaja on ajutiselt lukustatud", "search-requires-login": "Otsing nõuab kasutajat - palun registreeruge või logige sisse.", @@ -12,6 +13,7 @@ "invalid-title": "Vigane pealkiri!", "invalid-user-data": "Vigased kasutaja andmed", "invalid-password": "Vigane parool", + "invalid-login-credentials": "Invalid login credentials", "invalid-username-or-password": "Palun täpsusta kasutajanime ja parooli", "invalid-search-term": "Vigane otsingusõna", "csrf-invalid": "Me ei saanud Sind sisse logida, võimalik, et tänu aegunud sessioonile, palun proovi uuesti", diff --git a/public/language/et/topic.json b/public/language/et/topic.json index 63d556f10d..b540c97188 100644 --- a/public/language/et/topic.json +++ b/public/language/et/topic.json @@ -14,6 +14,7 @@ "quote": "Tsiteeri", "reply": "Vasta", "replies_to_this_post": "%1 Replies", + "one_reply_to_this_post": "1 Reply", "last_reply_time": "Last reply", "reply-as-topic": "Vasta teemana", "guest-login-reply": "Logi sisse, et vastata", diff --git a/public/language/fa-IR/admin/appearance/customise.json b/public/language/fa-IR/admin/appearance/customise.json index 767d443e29..5095f7a937 100644 --- a/public/language/fa-IR/admin/appearance/customise.json +++ b/public/language/fa-IR/admin/appearance/customise.json @@ -5,5 +5,8 @@ "custom-header": "Custom Header", "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", - "custom-header.enable": "Enable Custom Header" + "custom-header.enable": "Enable Custom Header", + + "custom-css.livereload": "Enable Live Reload", + "custom-css.livereload.description": "Enable this to force all sessions on every device under your account to refresh whenever you click save" } \ No newline at end of file diff --git a/public/language/fa-IR/admin/development/info.json b/public/language/fa-IR/admin/development/info.json index b2768ca212..0a4ae6fe2c 100644 --- a/public/language/fa-IR/admin/development/info.json +++ b/public/language/fa-IR/admin/development/info.json @@ -1,10 +1,12 @@ { "you-are-on": "Info - You are on %1:%2", + "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", "pid": "pid", "nodejs": "nodejs", "online": "online", "git": "git", + "memory": "memory", "load": "load", "uptime": "uptime", diff --git a/public/language/fa-IR/admin/general/dashboard.json b/public/language/fa-IR/admin/general/dashboard.json index 02046bd17a..61f4421fb5 100644 --- a/public/language/fa-IR/admin/general/dashboard.json +++ b/public/language/fa-IR/admin/general/dashboard.json @@ -5,9 +5,14 @@ "users": "Users", "posts": "Posts", "topics": "Topics", - "page-views-last-month": "Page views Last Month", - "page-views-this-month": "Page views This Month", - "page-views-last-day": "Page views in last 24 hours", + "page-views-seven": "Last 7 Days", + "page-views-thirty": "Last 30 Days", + "page-views-last-day": "Last 24 hours", + "page-views-custom": "Custom Date Range", + "page-views-custom-start": "Range Start", + "page-views-custom-end": "Range End", + "page-views-custom-help": "Enter a date range of page views you would like to view. If no date picker is available, the accepted format is YYYY-MM-DD", + "page-views-custom-error": "Please enter a valid date range in the format YYYY-MM-DD", "stats.day": "Day", "stats.week": "Week", diff --git a/public/language/fa-IR/admin/general/languages.json b/public/language/fa-IR/admin/general/languages.json index da45cade2c..bdd57849b3 100644 --- a/public/language/fa-IR/admin/general/languages.json +++ b/public/language/fa-IR/admin/general/languages.json @@ -1,5 +1,6 @@ { "language-settings": "Language Settings", "description": "The default language determines the language settings for all users who are visiting your forum.
Individual users can override the default language on their account settings page.", - "default-language": "Default Language" + "default-language": "Default Language", + "auto-detect": "Auto Detect Language Setting for Guests" } \ No newline at end of file diff --git a/public/language/fa-IR/admin/settings/user.json b/public/language/fa-IR/admin/settings/user.json index b8f51c9288..fa8049c3a9 100644 --- a/public/language/fa-IR/admin/settings/user.json +++ b/public/language/fa-IR/admin/settings/user.json @@ -34,6 +34,8 @@ "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", + "invite-expiration": "Invite expiration", + "invite-expiration-help": "# of days invitations expire in.", "min-username-length": "Minimum Username Length", "max-username-length": "Maximum Username Length", "min-password-length": "Minimum Password Length", diff --git a/public/language/fa-IR/error.json b/public/language/fa-IR/error.json index 92eff6f85f..885cbc54e0 100644 --- a/public/language/fa-IR/error.json +++ b/public/language/fa-IR/error.json @@ -1,5 +1,6 @@ { "invalid-data": "داده(های) نامعتبر", + "invalid-json": "Invalid JSON", "not-logged-in": "وارد حساب کاربری نشده‌اید.", "account-locked": "حساب کاربری شما موقتاً مسدود شده است.", "search-requires-login": "استفاده از جستجو نیازمند ورود با نام‌کاربری و رمز‌عبور است. لطفا ابتدا وارد شوید.", @@ -12,6 +13,7 @@ "invalid-title": "عنوان نامعتبر است!", "invalid-user-data": "داده‌های کاربر نامعتبر است.", "invalid-password": "کلمه عبور نامعتبر است.", + "invalid-login-credentials": "Invalid login credentials", "invalid-username-or-password": "لطفا هم نام کاربری و هم کلمه عبور را مشخص کنید", "invalid-search-term": "کلمه جستجو نامعتبر است", "csrf-invalid": "اجازه ورود شما تمام شده است، لطفا دوباره وارد شوید.", diff --git a/public/language/fa-IR/topic.json b/public/language/fa-IR/topic.json index 48adb9b76c..348bc8eeaa 100644 --- a/public/language/fa-IR/topic.json +++ b/public/language/fa-IR/topic.json @@ -14,6 +14,7 @@ "quote": "نقل قول", "reply": "پاسخ", "replies_to_this_post": "%1 Replies", + "one_reply_to_this_post": "1 Reply", "last_reply_time": "Last reply", "reply-as-topic": "پاسخ به موضوع", "guest-login-reply": "وارد شوید تا پست بفرستید", diff --git a/public/language/fi/admin/appearance/customise.json b/public/language/fi/admin/appearance/customise.json index 767d443e29..5095f7a937 100644 --- a/public/language/fi/admin/appearance/customise.json +++ b/public/language/fi/admin/appearance/customise.json @@ -5,5 +5,8 @@ "custom-header": "Custom Header", "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", - "custom-header.enable": "Enable Custom Header" + "custom-header.enable": "Enable Custom Header", + + "custom-css.livereload": "Enable Live Reload", + "custom-css.livereload.description": "Enable this to force all sessions on every device under your account to refresh whenever you click save" } \ No newline at end of file diff --git a/public/language/fi/admin/development/info.json b/public/language/fi/admin/development/info.json index b2768ca212..0a4ae6fe2c 100644 --- a/public/language/fi/admin/development/info.json +++ b/public/language/fi/admin/development/info.json @@ -1,10 +1,12 @@ { "you-are-on": "Info - You are on %1:%2", + "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", "pid": "pid", "nodejs": "nodejs", "online": "online", "git": "git", + "memory": "memory", "load": "load", "uptime": "uptime", diff --git a/public/language/fi/admin/general/dashboard.json b/public/language/fi/admin/general/dashboard.json index 02046bd17a..61f4421fb5 100644 --- a/public/language/fi/admin/general/dashboard.json +++ b/public/language/fi/admin/general/dashboard.json @@ -5,9 +5,14 @@ "users": "Users", "posts": "Posts", "topics": "Topics", - "page-views-last-month": "Page views Last Month", - "page-views-this-month": "Page views This Month", - "page-views-last-day": "Page views in last 24 hours", + "page-views-seven": "Last 7 Days", + "page-views-thirty": "Last 30 Days", + "page-views-last-day": "Last 24 hours", + "page-views-custom": "Custom Date Range", + "page-views-custom-start": "Range Start", + "page-views-custom-end": "Range End", + "page-views-custom-help": "Enter a date range of page views you would like to view. If no date picker is available, the accepted format is YYYY-MM-DD", + "page-views-custom-error": "Please enter a valid date range in the format YYYY-MM-DD", "stats.day": "Day", "stats.week": "Week", diff --git a/public/language/fi/admin/general/languages.json b/public/language/fi/admin/general/languages.json index da45cade2c..bdd57849b3 100644 --- a/public/language/fi/admin/general/languages.json +++ b/public/language/fi/admin/general/languages.json @@ -1,5 +1,6 @@ { "language-settings": "Language Settings", "description": "The default language determines the language settings for all users who are visiting your forum.
Individual users can override the default language on their account settings page.", - "default-language": "Default Language" + "default-language": "Default Language", + "auto-detect": "Auto Detect Language Setting for Guests" } \ No newline at end of file diff --git a/public/language/fi/admin/settings/user.json b/public/language/fi/admin/settings/user.json index b8f51c9288..fa8049c3a9 100644 --- a/public/language/fi/admin/settings/user.json +++ b/public/language/fi/admin/settings/user.json @@ -34,6 +34,8 @@ "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", + "invite-expiration": "Invite expiration", + "invite-expiration-help": "# of days invitations expire in.", "min-username-length": "Minimum Username Length", "max-username-length": "Maximum Username Length", "min-password-length": "Minimum Password Length", diff --git a/public/language/fi/error.json b/public/language/fi/error.json index 75e5d3609b..fc904202b2 100644 --- a/public/language/fi/error.json +++ b/public/language/fi/error.json @@ -1,5 +1,6 @@ { "invalid-data": "Virheellinen data", + "invalid-json": "Invalid JSON", "not-logged-in": "Et taida olla kirjautuneena sisään.", "account-locked": "Käyttäjätilisi on lukittu väliaikaisesti", "search-requires-login": "Searching requires an account - please login or register.", @@ -12,6 +13,7 @@ "invalid-title": "Virheellinen otsikko!", "invalid-user-data": "Virheellinen käyttäjätieto", "invalid-password": "Virheellinen salasana", + "invalid-login-credentials": "Invalid login credentials", "invalid-username-or-password": "Ole hyvä ja anna sekä käyttäjänimi että salasana", "invalid-search-term": "Virheellinen hakutermi", "csrf-invalid": "We were unable to log you in, likely due to an expired session. Please try again", diff --git a/public/language/fi/topic.json b/public/language/fi/topic.json index 56f51da9bf..a79a071204 100644 --- a/public/language/fi/topic.json +++ b/public/language/fi/topic.json @@ -14,6 +14,7 @@ "quote": "Lainaa", "reply": "Vastaa", "replies_to_this_post": "%1 Replies", + "one_reply_to_this_post": "1 Reply", "last_reply_time": "Last reply", "reply-as-topic": "Reply as topic", "guest-login-reply": "Kirjaudu sisään voidaksesi vastata", diff --git a/public/language/fr/admin/advanced/database.json b/public/language/fr/admin/advanced/database.json index ee2103cf4f..38f97bbd33 100644 --- a/public/language/fr/admin/advanced/database.json +++ b/public/language/fr/admin/advanced/database.json @@ -1,7 +1,7 @@ { "x-b": "%1 octets", "x-mb": "%1 Mo", - "x-gb": "%1 gb", + "x-gb": "%1 Go", "uptime-seconds": "Disponibilité en secondes", "uptime-days": "Disponibilité en jours", diff --git a/public/language/fr/admin/advanced/errors.json b/public/language/fr/admin/advanced/errors.json index 2884db0eaf..10b7ea5d33 100644 --- a/public/language/fr/admin/advanced/errors.json +++ b/public/language/fr/admin/advanced/errors.json @@ -8,7 +8,7 @@ "clear-error-log": "Effacer les journaux d'erreurs", "route": "Route", "count": "Nombre", - "no-routes-not-found": "Hooray! No 404 errors!", + "no-routes-not-found": "Hourrah ! Aucune erreur 404 !", "clear404-confirm": "Êtes-vous sûr de vouloir effacer les journaux d'erreurs 404 ?", "clear404-success": "Erreurs \"404 non trouvé\" effacées" } \ No newline at end of file diff --git a/public/language/fr/admin/appearance/customise.json b/public/language/fr/admin/appearance/customise.json index f06d1c65f3..e867039801 100644 --- a/public/language/fr/admin/appearance/customise.json +++ b/public/language/fr/admin/appearance/customise.json @@ -5,5 +5,8 @@ "custom-header": "En-tête personnalisé", "custom-header.description": "Entrez votre code HTML ici (ex. Javascripts, Méta tags, etc…), qui seront ajoutés à la section <head> du code de votre forum.", - "custom-header.enable": "Activer les en-têtes personnalisés" + "custom-header.enable": "Activer les en-têtes personnalisés", + + "custom-css.livereload": "Activer le rechargement en direct", + "custom-css.livereload.description": "Activez cette option pour forcer toutes les sessions sur chaque appareil connecté à votre compte à se rafraichir lorsque vous cliquez sur Enregistrer." } \ No newline at end of file diff --git a/public/language/fr/admin/development/info.json b/public/language/fr/admin/development/info.json index d367863480..ce9f8f43ee 100644 --- a/public/language/fr/admin/development/info.json +++ b/public/language/fr/admin/development/info.json @@ -1,10 +1,12 @@ { "you-are-on": "Info - Vous êtes sur %1:%2", + "nodes-responded": "%1 noeuds ont répondu en %2ms !", "host": "hôte", "pid": "pid", "nodejs": "nodejs", "online": "en ligne", "git": "git", + "memory": "mémoire", "load": "charge", "uptime": "disponibilité", diff --git a/public/language/fr/admin/general/dashboard.json b/public/language/fr/admin/general/dashboard.json index b89e291b74..af8a030b01 100644 --- a/public/language/fr/admin/general/dashboard.json +++ b/public/language/fr/admin/general/dashboard.json @@ -5,9 +5,14 @@ "users": "Utilisateurs", "posts": "Messages", "topics": "Sujets", - "page-views-last-month": "Pages vues le mois dernier", - "page-views-this-month": "Pages vues ce mois-ci", - "page-views-last-day": "Pages vues ces dernières 24 heures", + "page-views-seven": "7 derniers jours", + "page-views-thirty": "30 derniers jours", + "page-views-last-day": "Dernières 24 heures", + "page-views-custom": "Dates personnalisées", + "page-views-custom-start": "Début", + "page-views-custom-end": "Fin", + "page-views-custom-help": "Entrez une plage de date pour les vues que vous souhaitez afficher. Si aucun sélecteur de date n'est disponible, le format de date accepté est YYYY-MM-DD.", + "page-views-custom-error": "Veuillez entrer une plage de date valide dans le format suivant : YYYY-MM-DD", "stats.day": "Jour", "stats.week": "Semaine", @@ -21,7 +26,7 @@ "upgrade-available": "

Une nouvelle version (v%1) a été publiée. Pensez à mettre à jour votre version de NodeBB.

", "prerelease-upgrade-available": "

Ceci est une ancienne version préliminaire de NodeBB. Une nouvelle version (v%1) a été publiée. Pensez à mettre à jour votre version de NodeBB.

", "prerelease-warning": "

Ceci est une version préliminaire de NodeBB. Des bugs inattendus peuvent se produire.

", - "running-in-development": "Forum is running in development mode. The forum may be open to potential vulnerabilities; please contact your system administrator.", + "running-in-development": "Le forum est en mode développement. Il peut être sujet à certaines vulnérabilités, veuillez contacter votre administrateur système.", "notices": "Informations", "restart-not-required": "Pas de redémarrage nécessaire", diff --git a/public/language/fr/admin/general/languages.json b/public/language/fr/admin/general/languages.json index 0dfa80733c..51ee9f7f01 100644 --- a/public/language/fr/admin/general/languages.json +++ b/public/language/fr/admin/general/languages.json @@ -1,5 +1,6 @@ { "language-settings": "Réglages linguistiques", "description": "La langue par défaut détermine les réglages pour tous les utilisateurs qui visitent votre forum.
Les utilisateurs peuvent ensuite modifier la langue par défaut sur leur page de réglages.", - "default-language": "Langue par défaut" + "default-language": "Langue par défaut", + "auto-detect": "Détection automatique de la langue pour les invités" } \ No newline at end of file diff --git a/public/language/fr/admin/manage/groups.json b/public/language/fr/admin/manage/groups.json index ec1898fbcb..6a6f6d6d36 100644 --- a/public/language/fr/admin/manage/groups.json +++ b/public/language/fr/admin/manage/groups.json @@ -1,7 +1,7 @@ { "name": "Nom du groupe", "description": "Description du groupe", - "member-count": "Member Count", + "member-count": "Nombre de membres", "system": "Groupe système", "edit": "Éditer", "search-placeholder": "Rechercher", diff --git a/public/language/fr/admin/settings/advanced.json b/public/language/fr/admin/settings/advanced.json index 42fa98183f..28d42fbc5e 100644 --- a/public/language/fr/admin/settings/advanced.json +++ b/public/language/fr/admin/settings/advanced.json @@ -6,7 +6,7 @@ "headers.allow-from": "Définissez ALLOW-FROM pour afficher NodeBB dans un iFrame", "headers.powered-by": "Personnaliser l'en-tête \"Propulsé par\" envoyé par NodeBB", "headers.acao": "Access-Control-Allow-Origin", - "headers.acao-help": "To deny access to all sites, leave empty", + "headers.acao-help": "Pour refuser l'accès à tous les sites, laissez vide", "headers.acam": "\nAccess-Control-Allow-Methods", "headers.acah": "\nAccess-Control-Allow-Headers", "traffic-management": "Gestion du trafic", diff --git a/public/language/fr/admin/settings/general.json b/public/language/fr/admin/settings/general.json index d16c22e4a3..35b67e48be 100644 --- a/public/language/fr/admin/settings/general.json +++ b/public/language/fr/admin/settings/general.json @@ -27,6 +27,6 @@ "touch-icon.help": "Taille et format recommandés : 192x192, format PNG uniquement. Si aucune icône n'est spécifiée, NodeBB utilisera le favicon.", "outgoing-links": "Liens sortants", "outgoing-links.warning-page": "Utiliser la page d'avertissement pour liens sortants", - "search-default-sort-by": "Search default sort by", - "outgoing-links.whitelist": "Domains to whitelist for bypassing the warning page" + "search-default-sort-by": "Tri par défaut de la recherche", + "outgoing-links.whitelist": "Domaines à inclure dans la liste blanche pour passer la page d'avertissement." } \ No newline at end of file diff --git a/public/language/fr/admin/settings/post.json b/public/language/fr/admin/settings/post.json index 5fb72189c8..5b8581552f 100644 --- a/public/language/fr/admin/settings/post.json +++ b/public/language/fr/admin/settings/post.json @@ -29,8 +29,8 @@ "unread": "Paramètres des messages non lus", "unread.cutoff": "Nombre de jours pour les messages non-lus", "unread.min-track-last": "Nombre minimum de messages dans le sujet avant de garder en mémoire le dernier message lu", - "recent": "Recent Settings", - "recent.categoryFilter.disable": "Disable filtering of topics in ignored categories on the /recent page", + "recent": "Réglages récents", + "recent.categoryFilter.disable": "Désactiver le filtrage des sujets dans les catégories ignorées sur la page /recent", "signature": "Paramètres de signature", "signature.disable": "Désactiver les signatures", "signature.no-links": "Désactiver les liens en signature", diff --git a/public/language/fr/admin/settings/reputation.json b/public/language/fr/admin/settings/reputation.json index 0757c8a9a5..21573e7f76 100644 --- a/public/language/fr/admin/settings/reputation.json +++ b/public/language/fr/admin/settings/reputation.json @@ -2,7 +2,7 @@ "reputation": "Paramètre de réputation", "disable": "Désactiver le système de réputation", "disable-down-voting": "Désactiver les votes négatifs", - "votes-are-public": "All Votes Are Public", + "votes-are-public": "Tous les votes sont publics", "thresholds": "Seuils d'activité", "min-rep-downvote": "Réputation minimum pour les votes négatifs", "min-rep-flag": "Réputation minimum pour signaler un message" diff --git a/public/language/fr/admin/settings/user.json b/public/language/fr/admin/settings/user.json index d6c9fb0c23..0f8bc4e171 100644 --- a/public/language/fr/admin/settings/user.json +++ b/public/language/fr/admin/settings/user.json @@ -34,10 +34,12 @@ "registration.max-invites": "Nombre maximum d'invitations par utilisateur", "max-invites": "Nombre maximum d'invitations par utilisateur", "max-invites-help": "0 pour supprimer cette restriction. Les admins n'ont aucune restriction
Valable uniquement pour \"Uniquement sur invitation\"", + "invite-expiration": "Expiration des invitations", + "invite-expiration-help": "nombre de jours avant que l'invitation n'expire.", "min-username-length": "Longueur minimum du nom d'utilisateur", "max-username-length": "Longueur maxmum du nom d'utilisateur", "min-password-length": "Longueur minimum du mot de passe", - "min-password-strength": "Minimum Password Strength", + "min-password-strength": "Sécurité minimale du mot de passe", "max-about-me-length": "Longueur maximum du À propos de moi", "terms-of-use": "Conditions générales d'utilisation du forum (Laisser vide pour désactiver)", "user-search": "Rechercher un utilisateur", diff --git a/public/language/fr/email.json b/public/language/fr/email.json index 73634e14f3..cd244af52f 100644 --- a/public/language/fr/email.json +++ b/public/language/fr/email.json @@ -32,9 +32,9 @@ "notif.post.unsub.info": "La notification de ce message vous a été envoyé en raison de vos paramètres d'abonnement.", "test.text1": "Ceci est un e-mail de test pour vérifier que l'e-mailer est correctement configuré pour NodeBB.", "unsub.cta": "Cliquez ici pour modifier ces paramètres", - "banned.subject": "You have been banned from %1", - "banned.text1": "The user %1 has been banned from %2.", - "banned.text2": "This ban will last until %1.", - "banned.text3": "This is the reason why you have been banned:", + "banned.subject": "Vous avez été banni de %1", + "banned.text1": "L'utilisateur %1 a été banni de %2.", + "banned.text2": "Ce ban est effectif jusqu'au %1.", + "banned.text3": "Voici la raison pour laquelle vous avez été banni : ", "closing": "Merci !" } \ No newline at end of file diff --git a/public/language/fr/error.json b/public/language/fr/error.json index a158d6f83b..009cbfdc93 100644 --- a/public/language/fr/error.json +++ b/public/language/fr/error.json @@ -1,5 +1,6 @@ { "invalid-data": "Données invalides", + "invalid-json": "JSON invalide", "not-logged-in": "Vous ne semblez pas être connecté.", "account-locked": "Votre compte a été temporairement suspendu", "search-requires-login": "Rechercher nécessite d'avoir un compte. Veuillez vous identifier ou vous enregistrer.", @@ -12,6 +13,7 @@ "invalid-title": "Titre invalide !", "invalid-user-data": "Données utilisateur invalides", "invalid-password": "Mot de passe invalide", + "invalid-login-credentials": "Certificat d'identification invalide", "invalid-username-or-password": "Veuillez entrer un nom d'utilisateur et un mot de passe", "invalid-search-term": "Données de recherche invalides", "csrf-invalid": "Nous ne pouvons pas vous connectez, possiblement car votre session a expiré. Merci de réessayer.", @@ -30,7 +32,7 @@ "password-too-long": "Mot de passe trop long", "user-banned": "Utilisateur banni", "user-banned-reason": "Désolé, ce compte a été banni (Raison : %1)", - "user-banned-reason-until": "Sorry, this account has been banned until %1 (Reason: %2)", + "user-banned-reason-until": "Désolé, ce compte a été banni jusque %1 (Raison : %2).", "user-too-new": "Désolé, vous devez attendre encore %1 seconde(s) avant d'envoyer votre premier message", "blacklisted-ip": "Désolé, votre adresse IP a été bannie de cette communauté. Si vous pensez que c'est une erreur, veuillez contacter un administrateur.", "ban-expiry-missing": "Veuillez entrer une date de fin de banissement.", @@ -105,7 +107,7 @@ "chat-disabled": "Système de chat désactivé", "too-many-messages": "Vous avez envoyé trop de messages, veuillez patienter un instant.", "invalid-chat-message": "Message de Chat invalide", - "chat-message-too-long": "Chat messages can not be longer than %1 characters.", + "chat-message-too-long": "Les messages de discussion ne peuvent pas être plus longs que %1 caractères.", "cant-edit-chat-message": "Vous n'avez pas l'autorisation de modifier ce message", "cant-remove-last-user": "Vous ne pouvez pas supprimer le dernier utilisateur", "cant-delete-chat-message": "Vous n'avez pas l'autorisation de supprimer ce message", diff --git a/public/language/fr/flags.json b/public/language/fr/flags.json index c4bfed6f23..c4d031cca4 100644 --- a/public/language/fr/flags.json +++ b/public/language/fr/flags.json @@ -1,60 +1,60 @@ { - "state": "State", - "reporter": "Reporter", - "reported-at": "Reported At", + "state": "Etat", + "reporter": "Rapporteur", + "reported-at": "Reporté à", "description": "Description", - "no-flags": "Hooray! No flags found.", - "assignee": "Assignee", - "update": "Update", - "updated": "Updated", - "target-purged": "The content this flag referred to has been purged and is no longer available.", + "no-flags": "Hourra ! Aucun signalement trouvé.", + "assignee": "Assigné", + "update": "Mise à jour", + "updated": "Mis à jour", + "target-purged": "Le contenu référencé par ce signalement a été supprimé et n'est plus accessible", - "quick-filters": "Quick Filters", - "filter-active": "There are one or more filters active in this list of flags", - "filter-reset": "Remove Filters", - "filters": "Filter Options", - "filter-reporterId": "Reporter UID", - "filter-targetUid": "Flagged UID", - "filter-type": "Flag Type", - "filter-type-all": "All Content", - "filter-type-post": "Post", - "filter-state": "State", - "filter-assignee": "Assignee UID", - "filter-cid": "Category", - "filter-quick-mine": "Assigned to me", - "filter-cid-all": "All categories", - "apply-filters": "Apply Filters", + "quick-filters": "Filtres rapides", + "filter-active": "Il y a un ou plusieurs filtres actifs dans cette liste de signalements", + "filter-reset": "Supprimer les filtres", + "filters": "Options de filtre", + "filter-reporterId": "UID du reporteur", + "filter-targetUid": "UID signalé", + "filter-type": "Type de signalement", + "filter-type-all": "Tout le contenu", + "filter-type-post": "Message", + "filter-state": "Etat", + "filter-assignee": "UID assigné", + "filter-cid": "Catégorie", + "filter-quick-mine": "Assigné à moi", + "filter-cid-all": "Toutes les catégories", + "apply-filters": "Appliquer les filtres", - "quick-links": "Quick Links", - "flagged-user": "Flagged User", - "view-profile": "View Profile", - "start-new-chat": "Start New Chat", - "go-to-target": "View Flag Target", + "quick-links": "Permaliens", + "flagged-user": "Utilisateurs signalés", + "view-profile": "Voir le profil", + "start-new-chat": "Démarrer un nouveau Chat", + "go-to-target": "Voir le signalement cible", - "user-view": "View Profile", - "user-edit": "Edit Profile", + "user-view": "Voir le profil", + "user-edit": "Éditer le profil", - "notes": "Flag Notes", - "add-note": "Add Note", - "no-notes": "No shared notes.", + "notes": "Notes de signalement", + "add-note": "Ajouter une note", + "no-notes": "aucune note partagée", - "history": "Flag History", - "back": "Back to Flags List", - "no-history": "No flag history.", + "history": "Historiques des signalements", + "back": "Revenir à la liste des signalements", + "no-history": "aucun historique de signalements", - "state-all": "All states", - "state-open": "New/Open", - "state-wip": "Work in Progress", - "state-resolved": "Resolved", - "state-rejected": "Rejected", - "no-assignee": "Not Assigned", - "note-added": "Note Added", + "state-all": "Tous les états", + "state-open": "Nouveau/Ouvert", + "state-wip": "En cours", + "state-resolved": "Résolu", + "state-rejected": "Rejeté", + "no-assignee": "Non assigné", + "note-added": "Note ajoutée", - "modal-title": "Report Inappropriate Content", - "modal-body": "Please specify your reason for flagging %1 %2 for review. Alternatively, use one of the quick report buttons if applicable.", + "modal-title": "Signaler un contenu inapproprié", + "modal-body": "Veuillez spécifier votre raison de signaler %1 %2 pour une révision. Vous pouvez utiliser un des boutons de report rapide si c'est plus approprié", "modal-reason-spam": "Spam", - "modal-reason-offensive": "Offensive", - "modal-reason-custom": "Reason for reporting this content...", - "modal-submit": "Submit Report", - "modal-submit-success": "Content has been flagged for moderation." + "modal-reason-offensive": "Choquant", + "modal-reason-custom": "Motif du signalement...", + "modal-submit": "Soumettre le signalement", + "modal-submit-success": "Le contenu a été soumis pour examen." } \ No newline at end of file diff --git a/public/language/fr/groups.json b/public/language/fr/groups.json index f9596e6493..84bcf7a529 100644 --- a/public/language/fr/groups.json +++ b/public/language/fr/groups.json @@ -27,7 +27,7 @@ "details.disableJoinRequests": "Désactiver les demandes d'adhésion", "details.grant": "Promouvoir/rétrograder comme propriétaire", "details.kick": "Exclure", - "details.kick_confirm": "Are you sure you want to remove this member from the group?", + "details.kick_confirm": "Voulez-vous vraiment supprimer ce membre du groupe ?", "details.owner_options": "Administration du groupe", "details.group_name": "Nom du groupe", "details.member_count": "Nombre de membres", diff --git a/public/language/fr/modules.json b/public/language/fr/modules.json index 5f3c253db7..bb99ae9031 100644 --- a/public/language/fr/modules.json +++ b/public/language/fr/modules.json @@ -20,7 +20,7 @@ "chat.three_months": "3 Mois", "chat.delete_message_confirm": "Êtes-vous sûr de vouloir supprimer ce message ?", "chat.add-users-to-room": "Ajouter des participants", - "chat.confirm-chat-with-dnd-user": "This user has set their status to DnD(Do not disturb). Do you still want to chat with them?", + "chat.confirm-chat-with-dnd-user": "Cet utilisateur a son statut en mode \"Ne pas déranger\". Voulez-vous quand même discuter avec lui ?", "composer.compose": "Écrire", "composer.show_preview": "Afficher l'aperçu", "composer.hide_preview": "Masquer l'aperçu", diff --git a/public/language/fr/notifications.json b/public/language/fr/notifications.json index e802422df5..2deb6b63db 100644 --- a/public/language/fr/notifications.json +++ b/public/language/fr/notifications.json @@ -10,15 +10,15 @@ "return_to": "Revenir à %1", "new_notification": "Nouvelle notification", "you_have_unread_notifications": "Vous avez des notifications non-lues", - "all": "All", - "topics": "Topics", - "replies": "Replies", - "chat": "Chats", - "follows": "Follows", - "upvote": "Upvotes", - "new-flags": "New Flags", - "my-flags": "Flags assigned to me", - "bans": "Bans", + "all": "Tout", + "topics": "Sujets", + "replies": "Réponses", + "chat": "Discussions", + "follows": "Suivis", + "upvote": "Votes pour", + "new-flags": "Nouveaux drapeaux", + "my-flags": "Drapeaux assignés à moi", + "bans": "Bannissements", "new_message_from": "Nouveau message de %1", "upvoted_your_post_in": "%1 a voté pour votre message dans %2.", "upvoted_your_post_in_dual": "%1 et %2 ont voté pour votre message dans %3.", @@ -40,7 +40,7 @@ "user_started_following_you_multiple": "%1 et %2 autres se sont abonnés à votre compte.", "new_register": "%1 a envoyé une demande d'incription.", "new_register_multiple": "%1 inscription(s) est en attente de validation.", - "flag_assigned_to_you": "Flag %1 has been assigned to you", + "flag_assigned_to_you": "Drapeau %1 vous a été assigné", "email-confirmed": "Email vérifié", "email-confirmed-message": "Merci pour la validation de votre adresse email. Votre compte est désormais activé.", "email-confirm-error-message": "Il y a un un problème dans la vérification de votre adresse email. Le code est peut être invalide ou a expiré.", diff --git a/public/language/fr/search.json b/public/language/fr/search.json index 139a6e512e..f429040908 100644 --- a/public/language/fr/search.json +++ b/public/language/fr/search.json @@ -12,7 +12,7 @@ "reply-count": "Nombre de réponses", "at-least": "Au moins", "at-most": "Au plus", - "relevance": "Relevance", + "relevance": "Pertinence", "post-time": "Date de message", "newer-than": "Plus récent que", "older-than": "Plus vieux que", diff --git a/public/language/fr/topic.json b/public/language/fr/topic.json index 71efbb71c5..c55cbcf8a4 100644 --- a/public/language/fr/topic.json +++ b/public/language/fr/topic.json @@ -13,8 +13,9 @@ "notify_me": "Être notifié des réponses dans ce sujet", "quote": "Citer", "reply": "Répondre", - "replies_to_this_post": "%1 Replies", - "last_reply_time": "Last reply", + "replies_to_this_post": "%1 réponses", + "one_reply_to_this_post": "1 réponse", + "last_reply_time": "Dernière réponse", "reply-as-topic": "Répondre à l'aide d'un sujet", "guest-login-reply": "Se connecter pour répondre", "edit": "Éditer", diff --git a/public/language/fr/user.json b/public/language/fr/user.json index f09cefe60b..d8b53361b3 100644 --- a/public/language/fr/user.json +++ b/public/language/fr/user.json @@ -60,7 +60,7 @@ "username_taken_workaround": "Le nom d'utilisateur désiré est déjà utilisé, nous l'avons donc légèrement modifié. Vous êtes maintenant connu comme %1", "password_same_as_username": "Votre mot de passe est identique à votre nom d'utilisateur. Veuillez en choisir un autre.", "password_same_as_email": "Votre mot de passe est identique à votre adresse email. Veuillez en choisir un autre.", - "weak_password": "Weak password.", + "weak_password": "Sécurité du mot de passe faible.", "upload_picture": "Envoyer l'image", "upload_a_picture": "Envoyer une image", "remove_uploaded_picture": "Supprimer l'image envoyée", @@ -132,5 +132,5 @@ "info.email-history": "Historique des adresses email", "info.moderation-note": "Note de modération", "info.moderation-note.success": "Note de modération enregistrée", - "info.moderation-note.add": "Add note" + "info.moderation-note.add": "Ajouter une note" } \ No newline at end of file diff --git a/public/language/gl/admin/appearance/customise.json b/public/language/gl/admin/appearance/customise.json index 767d443e29..5095f7a937 100644 --- a/public/language/gl/admin/appearance/customise.json +++ b/public/language/gl/admin/appearance/customise.json @@ -5,5 +5,8 @@ "custom-header": "Custom Header", "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", - "custom-header.enable": "Enable Custom Header" + "custom-header.enable": "Enable Custom Header", + + "custom-css.livereload": "Enable Live Reload", + "custom-css.livereload.description": "Enable this to force all sessions on every device under your account to refresh whenever you click save" } \ No newline at end of file diff --git a/public/language/gl/admin/development/info.json b/public/language/gl/admin/development/info.json index b2768ca212..0a4ae6fe2c 100644 --- a/public/language/gl/admin/development/info.json +++ b/public/language/gl/admin/development/info.json @@ -1,10 +1,12 @@ { "you-are-on": "Info - You are on %1:%2", + "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", "pid": "pid", "nodejs": "nodejs", "online": "online", "git": "git", + "memory": "memory", "load": "load", "uptime": "uptime", diff --git a/public/language/gl/admin/general/dashboard.json b/public/language/gl/admin/general/dashboard.json index 02046bd17a..61f4421fb5 100644 --- a/public/language/gl/admin/general/dashboard.json +++ b/public/language/gl/admin/general/dashboard.json @@ -5,9 +5,14 @@ "users": "Users", "posts": "Posts", "topics": "Topics", - "page-views-last-month": "Page views Last Month", - "page-views-this-month": "Page views This Month", - "page-views-last-day": "Page views in last 24 hours", + "page-views-seven": "Last 7 Days", + "page-views-thirty": "Last 30 Days", + "page-views-last-day": "Last 24 hours", + "page-views-custom": "Custom Date Range", + "page-views-custom-start": "Range Start", + "page-views-custom-end": "Range End", + "page-views-custom-help": "Enter a date range of page views you would like to view. If no date picker is available, the accepted format is YYYY-MM-DD", + "page-views-custom-error": "Please enter a valid date range in the format YYYY-MM-DD", "stats.day": "Day", "stats.week": "Week", diff --git a/public/language/gl/admin/general/languages.json b/public/language/gl/admin/general/languages.json index da45cade2c..bdd57849b3 100644 --- a/public/language/gl/admin/general/languages.json +++ b/public/language/gl/admin/general/languages.json @@ -1,5 +1,6 @@ { "language-settings": "Language Settings", "description": "The default language determines the language settings for all users who are visiting your forum.
Individual users can override the default language on their account settings page.", - "default-language": "Default Language" + "default-language": "Default Language", + "auto-detect": "Auto Detect Language Setting for Guests" } \ No newline at end of file diff --git a/public/language/gl/admin/settings/user.json b/public/language/gl/admin/settings/user.json index b8f51c9288..fa8049c3a9 100644 --- a/public/language/gl/admin/settings/user.json +++ b/public/language/gl/admin/settings/user.json @@ -34,6 +34,8 @@ "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", + "invite-expiration": "Invite expiration", + "invite-expiration-help": "# of days invitations expire in.", "min-username-length": "Minimum Username Length", "max-username-length": "Maximum Username Length", "min-password-length": "Minimum Password Length", diff --git a/public/language/gl/error.json b/public/language/gl/error.json index f6fd1bca9b..31afca5970 100644 --- a/public/language/gl/error.json +++ b/public/language/gl/error.json @@ -1,5 +1,6 @@ { "invalid-data": "Datos non válidos", + "invalid-json": "Invalid JSON", "not-logged-in": "Parece que estás desconectado.", "account-locked": "A túa conta foi bloqueada temporalmente.", "search-requires-login": "As buscas requiren unha conta. Por favor inicia sesión ou rexístrate.", @@ -12,6 +13,7 @@ "invalid-title": "Título inválido!", "invalid-user-data": "Datos de Usuario Inválidos", "invalid-password": "Contrasinal Inválido", + "invalid-login-credentials": "Invalid login credentials", "invalid-username-or-password": "Especifica ámbolos dous por favor, nome de usuario e contrasinal", "invalid-search-term": "Termo de búsqueda inválido", "csrf-invalid": "Non fomos capaces de entrar, probablemente porque a que a sesión expirou. Por favor, téntao de novo", diff --git a/public/language/gl/flags.json b/public/language/gl/flags.json index c4bfed6f23..0fda38ff5a 100644 --- a/public/language/gl/flags.json +++ b/public/language/gl/flags.json @@ -1,60 +1,60 @@ { - "state": "State", - "reporter": "Reporter", - "reported-at": "Reported At", - "description": "Description", - "no-flags": "Hooray! No flags found.", - "assignee": "Assignee", - "update": "Update", - "updated": "Updated", - "target-purged": "The content this flag referred to has been purged and is no longer available.", + "state": "Estado", + "reporter": "Reportador", + "reported-at": "Reportado en", + "description": "Descripción", + "no-flags": "Un licorca, que non hai nada marcado para revisión.", + "assignee": "Encargado", + "update": "Actualizar", + "updated": "Actualizado", + "target-purged": "O contido marcado foi purgado e xa non está dispoñible", - "quick-filters": "Quick Filters", - "filter-active": "There are one or more filters active in this list of flags", - "filter-reset": "Remove Filters", - "filters": "Filter Options", - "filter-reporterId": "Reporter UID", - "filter-targetUid": "Flagged UID", - "filter-type": "Flag Type", - "filter-type-all": "All Content", - "filter-type-post": "Post", - "filter-state": "State", - "filter-assignee": "Assignee UID", - "filter-cid": "Category", - "filter-quick-mine": "Assigned to me", - "filter-cid-all": "All categories", - "apply-filters": "Apply Filters", + "quick-filters": "Filtros rápidos", + "filter-active": "Hai un ou máis filtros na lista de avisos", + "filter-reset": "Eliminar filtros", + "filters": "Filtrar opcións", + "filter-reporterId": "UID do reportador", + "filter-targetUid": "UID marcada", + "filter-type": "Tipo de aviso", + "filter-type-all": "Todo o contido", + "filter-type-post": "Publicar", + "filter-state": "Estado", + "filter-assignee": "UID do encargado", + "filter-cid": "Categoría", + "filter-quick-mine": "Asignado a min", + "filter-cid-all": "Tódalas categorías", + "apply-filters": "Aplicar filtros", - "quick-links": "Quick Links", - "flagged-user": "Flagged User", - "view-profile": "View Profile", - "start-new-chat": "Start New Chat", - "go-to-target": "View Flag Target", + "quick-links": "Ligazóns rápidas", + "flagged-user": "Usuario marcado", + "view-profile": "Ver perfil", + "start-new-chat": "Comezar novo chat", + "go-to-target": "Ver contido marcado", - "user-view": "View Profile", - "user-edit": "Edit Profile", + "user-view": "Ver perfil", + "user-edit": "Editar perfil", - "notes": "Flag Notes", - "add-note": "Add Note", - "no-notes": "No shared notes.", + "notes": "Notas do aviso", + "add-note": "Engadir nota", + "no-notes": "Ningunha nota foi compartida", - "history": "Flag History", - "back": "Back to Flags List", - "no-history": "No flag history.", + "history": "Historial de avisos", + "back": "Voltar á lista de avisos", + "no-history": "Non hai historial de avisos", - "state-all": "All states", - "state-open": "New/Open", - "state-wip": "Work in Progress", - "state-resolved": "Resolved", - "state-rejected": "Rejected", - "no-assignee": "Not Assigned", - "note-added": "Note Added", + "state-all": "Tódolos estados", + "state-open": "Novo/Abrir", + "state-wip": "Traballo en progreso", + "state-resolved": "Resolto", + "state-rejected": "Rexeitado", + "no-assignee": "Non asignado", + "note-added": "Nota engadida", - "modal-title": "Report Inappropriate Content", - "modal-body": "Please specify your reason for flagging %1 %2 for review. Alternatively, use one of the quick report buttons if applicable.", + "modal-title": "Reportar Contido Inapropiado", + "modal-body": "Por favor, especifique o seu motivo para marcar %1 %2 para revisión. Alternativamente, empregue un dos botóns de reporte rápido se fose pertinente.", "modal-reason-spam": "Spam", - "modal-reason-offensive": "Offensive", - "modal-reason-custom": "Reason for reporting this content...", - "modal-submit": "Submit Report", - "modal-submit-success": "Content has been flagged for moderation." + "modal-reason-offensive": "Ofensivo", + "modal-reason-custom": "Motivo para reportar este contido...", + "modal-submit": "Enviar Reporte", + "modal-submit-success": "Contido marcado para moderación" } \ No newline at end of file diff --git a/public/language/gl/topic.json b/public/language/gl/topic.json index 5c5e19ed43..27165403dd 100644 --- a/public/language/gl/topic.json +++ b/public/language/gl/topic.json @@ -14,6 +14,7 @@ "quote": "Citar", "reply": "Responder", "replies_to_this_post": "%1 Replies", + "one_reply_to_this_post": "1 Reply", "last_reply_time": "Last reply", "reply-as-topic": "Responder como tema", "guest-login-reply": "Identifícate para responder", diff --git a/public/language/he/admin/appearance/customise.json b/public/language/he/admin/appearance/customise.json index 767d443e29..5095f7a937 100644 --- a/public/language/he/admin/appearance/customise.json +++ b/public/language/he/admin/appearance/customise.json @@ -5,5 +5,8 @@ "custom-header": "Custom Header", "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", - "custom-header.enable": "Enable Custom Header" + "custom-header.enable": "Enable Custom Header", + + "custom-css.livereload": "Enable Live Reload", + "custom-css.livereload.description": "Enable this to force all sessions on every device under your account to refresh whenever you click save" } \ No newline at end of file diff --git a/public/language/he/admin/development/info.json b/public/language/he/admin/development/info.json index b2768ca212..0a4ae6fe2c 100644 --- a/public/language/he/admin/development/info.json +++ b/public/language/he/admin/development/info.json @@ -1,10 +1,12 @@ { "you-are-on": "Info - You are on %1:%2", + "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", "pid": "pid", "nodejs": "nodejs", "online": "online", "git": "git", + "memory": "memory", "load": "load", "uptime": "uptime", diff --git a/public/language/he/admin/general/dashboard.json b/public/language/he/admin/general/dashboard.json index d341cd9fcf..5c05b1aab7 100644 --- a/public/language/he/admin/general/dashboard.json +++ b/public/language/he/admin/general/dashboard.json @@ -5,9 +5,14 @@ "users": "Users", "posts": "Posts", "topics": "Topics", - "page-views-last-month": "Page views Last Month", - "page-views-this-month": "Page views This Month", - "page-views-last-day": "Page views in last 24 hours", + "page-views-seven": "Last 7 Days", + "page-views-thirty": "Last 30 Days", + "page-views-last-day": "Last 24 hours", + "page-views-custom": "Custom Date Range", + "page-views-custom-start": "Range Start", + "page-views-custom-end": "Range End", + "page-views-custom-help": "Enter a date range of page views you would like to view. If no date picker is available, the accepted format is YYYY-MM-DD", + "page-views-custom-error": "Please enter a valid date range in the format YYYY-MM-DD", "stats.day": "יום", "stats.week": "שבוע", diff --git a/public/language/he/admin/general/languages.json b/public/language/he/admin/general/languages.json index da45cade2c..bdd57849b3 100644 --- a/public/language/he/admin/general/languages.json +++ b/public/language/he/admin/general/languages.json @@ -1,5 +1,6 @@ { "language-settings": "Language Settings", "description": "The default language determines the language settings for all users who are visiting your forum.
Individual users can override the default language on their account settings page.", - "default-language": "Default Language" + "default-language": "Default Language", + "auto-detect": "Auto Detect Language Setting for Guests" } \ No newline at end of file diff --git a/public/language/he/admin/settings/user.json b/public/language/he/admin/settings/user.json index b8f51c9288..fa8049c3a9 100644 --- a/public/language/he/admin/settings/user.json +++ b/public/language/he/admin/settings/user.json @@ -34,6 +34,8 @@ "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", + "invite-expiration": "Invite expiration", + "invite-expiration-help": "# of days invitations expire in.", "min-username-length": "Minimum Username Length", "max-username-length": "Maximum Username Length", "min-password-length": "Minimum Password Length", diff --git a/public/language/he/error.json b/public/language/he/error.json index 16430c13d1..06022d95a8 100644 --- a/public/language/he/error.json +++ b/public/language/he/error.json @@ -1,5 +1,6 @@ { "invalid-data": "נתונים שגויים", + "invalid-json": "Invalid JSON", "not-logged-in": "נראה שאינך מחובר למערכת.", "account-locked": "חשבונך נחסם באופן זמני", "search-requires-login": "פעולת החיפוש דורשת חשבון - בבקשה התחבר או הרשם.", @@ -12,6 +13,7 @@ "invalid-title": "כותרת שגויה", "invalid-user-data": "מידע משתמש שגוי", "invalid-password": "סיסמא שגויה", + "invalid-login-credentials": "Invalid login credentials", "invalid-username-or-password": "אנא הגדר שם משתמש וסיסמה", "invalid-search-term": "מילת חיפוש לא תקינה", "csrf-invalid": "אין באפשרותנו לחבר אותך למערכת, מכיוון שעבר זמן רב מידי. אנא נסה שנית.", diff --git a/public/language/he/topic.json b/public/language/he/topic.json index e54bb502e6..0d7c4daa0d 100644 --- a/public/language/he/topic.json +++ b/public/language/he/topic.json @@ -14,6 +14,7 @@ "quote": "ציטוט", "reply": "תגובה", "replies_to_this_post": "%1 Replies", + "one_reply_to_this_post": "1 Reply", "last_reply_time": "Last reply", "reply-as-topic": "הגב כנושא", "guest-login-reply": "התחבר כדי לפרסם תגובה", diff --git a/public/language/hr/admin/admin.json b/public/language/hr/admin/admin.json new file mode 100644 index 0000000000..fef743caf9 --- /dev/null +++ b/public/language/hr/admin/admin.json @@ -0,0 +1,7 @@ +{ + "alert.confirm-reload": "Sigurni ste da želite ponovno pokrenuti NodeBB?", + "alert.confirm-restart": "Sigurni ste da želite ponovno pokrenuti NodeBB?", + + "acp-title": "%1 | NodeBB Administratorska kontrolna ploča", + "settings-header-contents": "Sadržaj" +} \ No newline at end of file diff --git a/public/language/hr/admin/advanced/cache.json b/public/language/hr/admin/advanced/cache.json new file mode 100644 index 0000000000..937db239bf --- /dev/null +++ b/public/language/hr/admin/advanced/cache.json @@ -0,0 +1,11 @@ +{ + "post-cache": "Objava predmemorija", + "posts-in-cache": "Objave u predmemoriji", + "average-post-size": "Prosječna veličina objave", + "length-to-max": "Dužina / Maksimum", + "percent-full": "%1% Puno", + "post-cache-size": "Veličina predmemorije objave", + "items-in-cache": "Artikli u predmemoriji", + "control-panel": "Kontrolna ploča", + "update-settings": "Obnovi postavke predmemorije" +} \ No newline at end of file diff --git a/public/language/hr/admin/advanced/database.json b/public/language/hr/admin/advanced/database.json new file mode 100644 index 0000000000..e79a4b6192 --- /dev/null +++ b/public/language/hr/admin/advanced/database.json @@ -0,0 +1,36 @@ +{ + "x-b": "%1 b", + "x-mb": "%1 mb", + "x-gb": "%1 gb", + "uptime-seconds": "Na mreži u sekundama", + "uptime-days": "Na mreži u danima", + + "mongo": "Mongo", + "mongo.version": "Verzija MongoDB", + "mongo.storage-engine": "Način pohrane", + "mongo.collections": "Kolekcije", + "mongo.objects": "Objekti", + "mongo.avg-object-size": "Avg. Object Size", + "mongo.data-size": "Veličina datoteke", + "mongo.storage-size": "Veličina pohrane", + "mongo.index-size": "Veličina indexa", + "mongo.file-size": "Veličina datoteke", + "mongo.resident-memory": "Rezidentna memorija", + "mongo.virtual-memory": "Virtualna memorija", + "mongo.mapped-memory": "Mapirana memorija", + "mongo.raw-info": "MongoDB sirove informacije", + + "redis": "Redis", + "redis.version": "Redis verzija", + "redis.connected-clients": "Spojeni klijenti", + "redis.connected-slaves": "Povezani robovi", + "redis.blocked-clients": "Blokirani klijenti", + "redis.used-memory": "Iskorištena memorija", + "redis.memory-frag-ratio": "Omjer fragmentiranja memorije", + "redis.total-connections-recieved": "Ukupno primljeni veza", + "redis.total-commands-processed": "Ukupne prcesirane komande", + "redis.iops": "Instante operacije po sekundi", + "redis.keyspace-hits": "Keyspace Hits", + "redis.keyspace-misses": "Keyspace Misses", + "redis.raw-info": "Redis sirova informacija" +} \ No newline at end of file diff --git a/public/language/hr/admin/advanced/errors.json b/public/language/hr/admin/advanced/errors.json new file mode 100644 index 0000000000..04e9e32776 --- /dev/null +++ b/public/language/hr/admin/advanced/errors.json @@ -0,0 +1,14 @@ +{ + "figure-x": "Figura %1", + "error-events-per-day": "%1 događaja po danu", + "error.404": "404 Nije pronađeno", + "error.503": "503 Usluga nedostupna", + "manage-error-log": "Upravljaj dnevnikom grešaka", + "export-error-log": "Izvedi dnevnik grešaka (CSV)", + "clear-error-log": "Očisti dnevnik grešaka", + "route": "Putanja", + "count": "Zbroj", + "no-routes-not-found": "Huura! Nema 404 grešaka!", + "clear404-confirm": "Sigurni ste da želite očistiti 404 greše iz dnevnika?", + "clear404-success": "\"404 Nije pronađen\" greške očišćene" +} \ No newline at end of file diff --git a/public/language/hr/admin/advanced/events.json b/public/language/hr/admin/advanced/events.json new file mode 100644 index 0000000000..a113f933e4 --- /dev/null +++ b/public/language/hr/admin/advanced/events.json @@ -0,0 +1,6 @@ +{ + "events": "Događanja", + "no-events": "Nema događaja", + "control-panel": "Kontrolna ploča događanja", + "delete-events": "Obriši događanja" +} \ No newline at end of file diff --git a/public/language/hr/admin/advanced/logs.json b/public/language/hr/admin/advanced/logs.json new file mode 100644 index 0000000000..8d87365ce6 --- /dev/null +++ b/public/language/hr/admin/advanced/logs.json @@ -0,0 +1,7 @@ +{ + "logs": "Dnevnik", + "control-panel": "Dnevnik kontrolne ploče", + "reload": "Učitaj dnevnik ponovno", + "clear": "Očisti dnevnik ", + "clear-success": "Dnevnik čist!" +} \ No newline at end of file diff --git a/public/language/hr/admin/appearance/customise.json b/public/language/hr/admin/appearance/customise.json new file mode 100644 index 0000000000..a283a153aa --- /dev/null +++ b/public/language/hr/admin/appearance/customise.json @@ -0,0 +1,12 @@ +{ + "custom-css": "CSS po narudžbi", + "custom-css.description": "Unesi CSS deklaracije koje će biti upisane poslije svih stilova.", + "custom-css.enable": "Omogući dodatni CSS", + + "custom-header": "Uobičajno zaglavlje", + "custom-header.description": "Unesite Vaš HTML ovdje(npr. JavaScript Meta Tags itd.)koji će biti dodani <head> sekciji marže Vašeg foruma.", + "custom-header.enable": "Omogući uobičajeno zaglavlje", + + "custom-css.livereload": "Enable Live Reload", + "custom-css.livereload.description": "Enable this to force all sessions on every device under your account to refresh whenever you click save" +} \ No newline at end of file diff --git a/public/language/hr/admin/appearance/skins.json b/public/language/hr/admin/appearance/skins.json new file mode 100644 index 0000000000..1b68ae2ecd --- /dev/null +++ b/public/language/hr/admin/appearance/skins.json @@ -0,0 +1,9 @@ +{ + "loading": "Učitavam Izgled ...", + "homepage": "Naslovnica", + "select-skin": "Odaberi izgled", + "current-skin": "Trenutni izgled", + "skin-updated": "Izgled promijenjen", + "applied-success": "%1 izgled je primjenjen", + "revert-success": "Izgled povraćen na osnovne boje" +} \ No newline at end of file diff --git a/public/language/hr/admin/appearance/themes.json b/public/language/hr/admin/appearance/themes.json new file mode 100644 index 0000000000..593a589aca --- /dev/null +++ b/public/language/hr/admin/appearance/themes.json @@ -0,0 +1,11 @@ +{ + "checking-for-installed": "Provjeravam instalirane teme ...", + "homepage": "Naslovnica", + "select-theme": "Odaberi temu", + "current-theme": "Trenutna tema", + "no-themes": "Nisu pronađene instalirane teme", + "revert-confirm": "Sigurni ste da želite povratiti zadani NodeBB izgled ?", + "theme-changed": "Tema promijenjena", + "revert-success": "Uspješno ste vratili vaš NodeBB u početno zadanu temu.", + "restart-to-activate": "Ponovno pokrenite NodeBB da bi aktivirali izgled" +} \ No newline at end of file diff --git a/public/language/hr/admin/development/info.json b/public/language/hr/admin/development/info.json new file mode 100644 index 0000000000..6921af57c2 --- /dev/null +++ b/public/language/hr/admin/development/info.json @@ -0,0 +1,18 @@ +{ + "you-are-on": "Info - Vi ste %1:%2", + "nodes-responded": "%1 nodes responded within %2ms!", + "host": "Domaćin", + "pid": "pid", + "nodejs": "nodejs", + "online": "Na mreži", + "git": "git", + "memory": "memory", + "load": "učitaj", + "uptime": "uptime", + + "registered": "Registriran", + "sockets": "Sockets", + "guests": "Gosti", + + "info": "Info" +} \ No newline at end of file diff --git a/public/language/hr/admin/development/logger.json b/public/language/hr/admin/development/logger.json new file mode 100644 index 0000000000..e4c9b130f6 --- /dev/null +++ b/public/language/hr/admin/development/logger.json @@ -0,0 +1,12 @@ +{ + "logger-settings": "Postavke dnevnika", + "description": "By enabling the check boxes, you will receive logs to your terminal. If you specify a path, logs will then be saved to a file instead. HTTP logging is useful for collecting statistics about who, when, and what people access on your forum. In addition to logging HTTP requests, we can also log socket.io events. Socket.io logging, in combination with redis-cli monitor, can be very helpful for learning NodeBB's internals.", + "explanation": "Jednostavno potvrdite ili onemogućite postavke prijave da upalite ili ugasite prijave na brzinu.Ponovno pokretanje nije potrebno.", + "enable-http": "Dozvoli HTTP dnevnik", + "enable-socket": "Omogući socket.io dnevnik događanja ", + "file-path": "Putanja da datoteke dnevnika", + "file-path-placeholder": "/path/to/log/file.log ::: Ostavite prazno kako bi ste se mogli ulogirati u vaš terminal", + + "control-panel": "Kontrolna ploča dnevnika", + "update-settings": "Obnovi postavke dnevnika " +} \ No newline at end of file diff --git a/public/language/hr/admin/extend/plugins.json b/public/language/hr/admin/extend/plugins.json new file mode 100644 index 0000000000..31dc0981d0 --- /dev/null +++ b/public/language/hr/admin/extend/plugins.json @@ -0,0 +1,47 @@ +{ + "installed": "Instalirano", + "active": "Aktivno", + "inactive": "Neaktivan", + "out-of-date": "Izvan datuma", + "none-found": "Dodatci nisu pronađeni.", + "none-active": "Nema aktivnih dodataka", + "find-plugins": "Pronađi dodatke", + + "plugin-search": "Pretraga dodataka", + "plugin-search-placeholder": "Pretraži za dodatak ...", + "reorder-plugins": "Promjenite redosljed dodataka", + "order-active": "Posloži aktivne dodatke", + "dev-interested": "Interesira vas pisanje dodataka za NodeBB?", + "docs-info": "Punu dokumentaciju u vezi autorstva dodatka mogu biti nađeni na target=\"_blank\" href=\"https://docs.nodebb.org/en/latest/plugins/create.html\">NodeBB Docs Portal.", + + "order.description": "Određeni dodatci rade idealno kada su pokrenuti prije/poslije drugih dodataka.", + "order.explanation": "Dodatci se učitavaju u slijedu zadanom ovdje,od vrha prema dnu.", + + "plugin-item.themes": "Predlošci", + "plugin-item.deactivate": "Deaktiviraj", + "plugin-item.activate": "Aktiviraj", + "plugin-item.install": "Instaliraj", + "plugin-item.uninstall": "Deinstaliraj", + "plugin-item.settings": "Postavke", + "plugin-item.installed": "Instalirano", + "plugin-item.latest": "Najnovije", + "plugin-item.upgrade": "Nadogradnja", + "plugin-item.more-info": "Za više informacija:", + "plugin-item.unknown": "Nepoznato", + "plugin-item.unknown-explanation": "Stanje ovog dodatka se nemože utvrditi, vjerovatno zbog greške u konfiguraciji.", + + "alert.enabled": "Dodatak omogućen", + "alert.disabled": "Dodatak onemogućen", + "alert.upgraded": "Dodatak nadograđen", + "alert.installed": "Dodatak instaliran", + "alert.uninstalled": "Dodatak deinstaliran", + "alert.activate-success": "Pokrenite NodeBB za aktivaciju dodataka", + "alert.deactivate-success": "Dodatak uspjepno deaktiviran", + "alert.upgrade-success": "Ponovno pokrenite NodeBB da bi potpuno nadogradili dodatke", + "alert.install-success": "Dodatak instaliran, aktivirajte ga.", + "alert.uninstall-success": "Dodatak je uspješno deaktiviran i deinstaliran.", + "alert.suggest-error": "

NodeBB could not reach the package manager, proceed with installation of latest version?

Server returned (%1): %2
", + "alert.package-manager-unreachable": "

NodeBB nemože uspostaviti komunikaciju sa upraviteljem paketa, nadogradnja se ne preporučuje u ovom trenutku.

", + "alert.incompatible": "

Your version of NodeBB (v%1) is only cleared to upgrade to v%2 of this plugin. Please update your NodeBB if you wish to install a newer version of this plugin.

", + "alert.possibly-incompatible": "

No Compatibility Information Found

This plugin did not specify a specific version for installation given your NodeBB version. Full compatibility cannot be guaranteed, and may cause your NodeBB to no longer start properly.

In the event that NodeBB cannot boot properly:

$ ./nodebb reset plugin=\"%1\"

Continue installation of latest version of this plugin?

" +} diff --git a/public/language/hr/admin/extend/rewards.json b/public/language/hr/admin/extend/rewards.json new file mode 100644 index 0000000000..5e20c3872f --- /dev/null +++ b/public/language/hr/admin/extend/rewards.json @@ -0,0 +1,17 @@ +{ + "rewards": "Nagrade", + "condition-if-users": "Ako korisnici", + "condition-is": "ls:", + "condition-then": "Tada:", + "max-claims": "Koliko puta nagrada može biti osvojena.", + "zero-infinite": "Upišite 0 za beskonačno", + "delete": "Obriši", + "enable": "Omogući", + "disable": "onemogući", + "control-panel": "Kontrola nagrada", + "new-reward": "Nova nagrada", + + "alert.delete-success": "Uspješno obrisana nagrada", + "alert.no-inputs-found": "Ilegalna nagrada - nije pronađen unos!", + "alert.save-success": "Uspješno spremljene nagrade" +} \ No newline at end of file diff --git a/public/language/hr/admin/extend/widgets.json b/public/language/hr/admin/extend/widgets.json new file mode 100644 index 0000000000..72362aafa0 --- /dev/null +++ b/public/language/hr/admin/extend/widgets.json @@ -0,0 +1,19 @@ +{ + "available": "Dostupni dodatci", + "explanation": "Select a widget from the dropdown menu and then drag and drop it into a template's widget area on the left.", + "none-installed": "No widgets found! Activate the essential widgets plugin in the plugins control panel.", + "containers.available": "Dostupni kontejneri", + "containers.explanation": "Povucite i ispustite na vrhu bilo kojeg aktivnog widgeta", + "containers.none": "Ništa", + "container.well": "`", + "container.jumbotron": "Jumbotron", + "container.panel": "Ploča", + "container.panel-header": "Ploča zaglavlja", + "container.panel-body": "Tijelo ploče", + "container.alert": "Upozorenje", + + "alert.confirm-delete": "Sigurni ste da želite obrisati ovaj widget?", + "alert.updated": "Widgeti ažurirani", + "alert.update-success": "Uspješno promijenjeni widgeti" + +} \ No newline at end of file diff --git a/public/language/hr/admin/general/dashboard.json b/public/language/hr/admin/general/dashboard.json new file mode 100644 index 0000000000..d29ba8dd1e --- /dev/null +++ b/public/language/hr/admin/general/dashboard.json @@ -0,0 +1,69 @@ +{ + "forum-traffic": "Promet foruma", + "page-views": "Broj pogleda", + "unique-visitors": "Jedinstveni posjetitelji", + "users": "Korisnici", + "posts": "Objave", + "topics": "Teme", + "page-views-seven": "Last 7 Days", + "page-views-thirty": "Last 30 Days", + "page-views-last-day": "Last 24 hours", + "page-views-custom": "Custom Date Range", + "page-views-custom-start": "Range Start", + "page-views-custom-end": "Range End", + "page-views-custom-help": "Enter a date range of page views you would like to view. If no date picker is available, the accepted format is YYYY-MM-DD", + "page-views-custom-error": "Please enter a valid date range in the format YYYY-MM-DD", + + "stats.day": "Dan", + "stats.week": "Tjedan", + "stats.month": "Mjesec", + "stats.all": "Sve vrijeme", + + "updates": "Nadogradnje", + "running-version": "Ovo je verzija NodeBB v%1.", + "keep-updated": "Uvijek se pobrinite da je Vaš NodeBB na najnovijoj verziji za najnovije sigurnosne mjere i popravke grešaka.", + "up-to-date": "

Vaš NodeBB je na najnovijoj verziji

", + "upgrade-available": "

Izašla je (v%1) nova verzija NodeBB.Razmotrite nadogradnju Vašeg foruma.

", + "prerelease-upgrade-available": "

Ovo je zastarjela verzija NodeBB. Nova verzija (v%1) je izašla.Razmotrite nadogradnju Vašeg NodeBB.

\n", + "prerelease-warning": "

Ovo je pre-release verzija NodeBB. Nenamjerne greške su moguće.

", + "running-in-development": "Forum je u razvojnom stanju. Forum bi mogao biti otvoren za napade; Molimo kontaktirajte vašeg sistemskog administratora", + + "notices": "Obavijest", + "restart-not-required": "Restart nije potreban", + "restart-required": "Potrebno je ponovno pokretanje", + "search-plugin-installed": "Dodatak pretrage instaliran", + "search-plugin-not-installed": "Dodatak pretrage nije instaliran", + "search-plugin-tooltip": "Instalirajte dodatak za pretragu sa stranice za upravljanje dodatcima da aktivirate mogućnost pretrage foruma.", + + "control-panel": "Kontrola sistema", + "reload": "Ponovno učitaj", + "restart": "Pokreni ponovno", + "restart-warning": "Ponovno pokretanje NodeBB će odbaciti sve uspostavljene veze na par sekundi.", + "maintenance-mode": "Održavanje", + "maintenance-mode-title": "Postavite mod za održavanje foruma", + "realtime-chart-updates": "Ažuriranja u stvarnom vremenu", + + "active-users": "Aktivni korisnici", + "active-users.users": "Korisnici", + "active-users.guests": "Gosti", + "active-users.total": "Ukupno", + "active-users.connections": "Veze", + + "anonymous-registered-users": "Anonimni vs Registrirani korisnici", + "anonymous": "Anomiman", + "registered": "Registriran", + + "user-presence": "Korisnik prisutan", + "on-categories": "Na listi kategorija", + "reading-posts": "Čita objave", + "browsing-topics": "Pretražuj teme", + "recent": "Nedavno", + "unread": "Nepročitano", + + "high-presence-topics": "Teme visoke prisutnosti", + + "graphs.page-views": "Pregled stranica", + "graphs.unique-visitors": "Jedninstveni posjetitelji", + "graphs.registered-users": "Registrirani korisnici", + "graphs.anonymous-users": "Anonimni korisnici" +} diff --git a/public/language/hr/admin/general/homepage.json b/public/language/hr/admin/general/homepage.json new file mode 100644 index 0000000000..a42652183e --- /dev/null +++ b/public/language/hr/admin/general/homepage.json @@ -0,0 +1,7 @@ +{ + "home-page": "Naslovnica", + "description": "Izaberi koja stranica će se prikazivati kada korisnici navigiraju u root URL Vašeg foruma", + "home-page-route": "Putanja naslovnice", + "custom-route": "Uobičajna putanja", + "allow-user-home-pages": "Dozvoli korisničke naslovnice" +} \ No newline at end of file diff --git a/public/language/hr/admin/general/languages.json b/public/language/hr/admin/general/languages.json new file mode 100644 index 0000000000..a20b3c705d --- /dev/null +++ b/public/language/hr/admin/general/languages.json @@ -0,0 +1,6 @@ +{ + "language-settings": "Postavke jezika", + "description": "Zadani jezik odlučuje o postavkama jezika za sve korisnike foruma.
.Korisnici mogu sami odabrati jezik na stranici postavki jezika.", + "default-language": "Zadani jezik", + "auto-detect": "Auto Detect Language Setting for Guests" +} \ No newline at end of file diff --git a/public/language/hr/admin/general/navigation.json b/public/language/hr/admin/general/navigation.json new file mode 100644 index 0000000000..c49c255bb6 --- /dev/null +++ b/public/language/hr/admin/general/navigation.json @@ -0,0 +1,27 @@ +{ + "icon": "Ikona:", + "change-icon": "promjena", + "route": "Putanja:", + "tooltip": "Napomena:", + "text": "Tekst:", + "text-class": "Text Class: opcija", + "id": "ID: opcionalno", + + "properties": "Postavke", + "only-admins": "Prikaži samo administratorima", + "only-global-mods-and-admins": "Prikazuj samo globalnim moderatorima i administratorima", + "only-logged-in": "Prikaži samo prijavljenim korisnicima", + "open-new-window": "Otvori u novom prozoru", + + "installed-plugins-required": "Potrebni su instalirani dodatci:", + "search-plugin": "Dodatak pretrage", + + "btn.delete": "Obriši", + "btn.disable": "Onemogući", + "btn.enable": "Omogući", + + "available-menu-items": "Dostupni artikli menija", + "custom-route": "Uobičajna putanja", + "core": "jezgra", + "plugin": "dodatak" +} \ No newline at end of file diff --git a/public/language/hr/admin/general/social.json b/public/language/hr/admin/general/social.json new file mode 100644 index 0000000000..b6f1c3ee29 --- /dev/null +++ b/public/language/hr/admin/general/social.json @@ -0,0 +1,5 @@ +{ + "post-sharing": "Dijeljenje objave", + "info-plugins-additional": "Dodaci mogu dodati dodatne mreže za dijeljenje objava.", + "save-success": "Uspješno spremljene mreže za razmjenu objava!" +} \ No newline at end of file diff --git a/public/language/hr/admin/general/sounds.json b/public/language/hr/admin/general/sounds.json new file mode 100644 index 0000000000..21bf8e26ff --- /dev/null +++ b/public/language/hr/admin/general/sounds.json @@ -0,0 +1,9 @@ +{ + "notifications": "Obavijesti", + "chat-messages": "Poruke", + "play-sound": "Pokreni", + "incoming-message": "Dolazna poruka", + "outgoing-message": "Odlazna poruka", + "upload-new-sound": "Učitaj novi zvuk", + "saved": "Postavke spremljene" +} \ No newline at end of file diff --git a/public/language/hr/admin/manage/categories.json b/public/language/hr/admin/manage/categories.json new file mode 100644 index 0000000000..f87dfb28f8 --- /dev/null +++ b/public/language/hr/admin/manage/categories.json @@ -0,0 +1,68 @@ +{ + "settings": "Postavke kategorije", + "privileges": "Privilegije", + + "name": "Ime kategorije", + "description": "Opis kategorije", + "bg-color": "Pozadniska boja", + "text-color": "Boja teksta", + "bg-image-size": "Veličina pozadinske slike", + "custom-class": "Obična klasa", + "num-recent-replies": "# nedavnih objava", + "ext-link": "Vanjska poveznica", + "upload-image": "Učitaj sliku", + "delete-image": "Ukloni", + "category-image": "Slika kategorije", + "parent-category": "Roditeljska kategorija", + "optional-parent-category": "(Opcionalno) Roditeljska kategorija", + "parent-category-none": "(Ništa)", + "copy-settings": "Kopiraj postavke iz ", + "optional-clone-settings": "(Opcionalno) Kloniraj postavke iz kategorije", + "purge": "Odbaci kategoriju", + + "enable": "Omogući", + "disable": "Onemogući", + "edit": "Uredi", + + "select-category": "Odabri kategoriju", + "set-parent-category": "Postavi roditeljsku kategoriju ", + + "privileges.description": "Možete konfigurirati pristup kontrolnim privilegijama u ovoj kategoriji unutar ove sekcije.Privilegije mogu biti dane bazirane na korisnicima ili grupama.Možete dodati nove korisnike u ovu tabelu pretragom u polju ispod.", + "privileges.warning": "Note: Privilege settings take effect immediately. It is not necessary to save the category after adjusting these settings.", + "privileges.section-viewing": "Privilegije pogleda", + "privileges.section-posting": "Privilegije objave", + "privileges.section-moderation": "Dozvole moderiranja", + "privileges.section-user": "Korisnik", + "privileges.search-user": "Dodaj korisnika", + "privileges.no-users": "U ovoj kategoriji nema privilegije za korisnika.", + "privileges.section-group": "Grupa", + "privileges.group-private": "Ova grupa je privatna", + "privileges.search-group": "Dodaj grupu", + "privileges.copy-to-children": "Kopiraj u dijete", + "privileges.copy-from-category": "Kopiraj iz kategorije", + "privileges.inherit": "If the registered-users group is granted a specific privilege, all other groups receive an implicit privilege, even if they are not explicitly defined/checked. This implicit privilege is shown to you because all users are part of the registered-users user group, and so, privileges for additional groups need not be explicitly granted.", + + "analytics.back": "Povratak na listu kategorija", + "analytics.title": "Analitika za \"%1\" kategoriju", + "analytics.pageviews-hourly": "Figure 1 – Hourly page views for this category", + "analytics.pageviews-daily": "Oblik 2 – Pregledi po danu za ovu kategoriju", + "analytics.topics-daily": "Oblik 3 – Dnevne teme kreirane u ovoj kategoriji", + "analytics.posts-daily": "Oblik 4 – Dnevne objave u ovoj kategoriji", + + "alert.created": "Kreirano", + "alert.create-success": "Kategorija uspješno kreirana!", + "alert.none-active": "Nemate aktivnih kategorija.", + "alert.create": "Napravi kategoriju", + "alert.confirm-moderate": "Are you sure you wish to grant the moderation privilege to this user group? This group is public, and any users can join at will.", + "alert.confirm-purge": "

Do you really want to purge this category \"%1\"?

Warning! All topics and posts in this category will be purged!

Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

", + "alert.purge-success": "Kategorija odbačena!", + "alert.copy-success": "Postavke kopirane!", + "alert.set-parent-category": "Postavi roditeljsku kategoriju", + "alert.updated": "Promijenjene kategorije", + "alert.updated-success": "ID kategorije %1 uspješno promijenjen", + "alert.upload-image": "Učitaj sliku kategorije", + "alert.find-user": "Pronađi korisnika", + "alert.user-search": "Pretraži korisnika ovdje ...", + "alert.find-group": "Pronađi grupu", + "alert.group-search": "Pretraži grupu ovdje ..." +} \ No newline at end of file diff --git a/public/language/hr/admin/manage/groups.json b/public/language/hr/admin/manage/groups.json new file mode 100644 index 0000000000..a6056842bd --- /dev/null +++ b/public/language/hr/admin/manage/groups.json @@ -0,0 +1,35 @@ +{ + "name": "Ime grupe", + "description": "Opis grupe", + "member-count": "Broj članova", + "system": "Sistemska grupa", + "edit": "Uredi", + "search-placeholder": "Pretraga", + "create": "Kreiraj grupu", + "description-placeholder": "Kratki opis grupe", + "create-button": "Napravi", + + "alerts.create-failure": "Uh-Oh

Nastao je problem sa stvaranjem Vaše grupe.Molimo probajte ponovo kasnije!

", + "alerts.confirm-delete": "Sigurni ste da želite obrisati ovu grupu?", + + "edit.name": "Ime", + "edit.description": "Opis", + "edit.user-title": "Naslov članova", + "edit.icon": "Ikona grupe", + "edit.label-color": "Boja oznake grupe", + "edit.show-badge": "Prikaži beđ", + "edit.private-details": "Ako je omogućeno, pridruživanje grupi zahtjeva dozvolu vlasnika grupe.", + "edit.private-override": "Upozorenje:Privatne grupe su onemogućene na sistemskoj razini,koje onemogućavaju ovu opciju", + "edit.disable-requests": "Onemogući zahtjeve za priključenje", + "edit.hidden": "Skriveno", + "edit.hidden-details": "Ako je uključeno,ova grupa neće biti prikazana u listi grupa i korisnici će morati biti pozvani ručno", + "edit.add-user": "Dodaj korisnika u grupu", + "edit.add-user-search": "Pretraži korisnike", + "edit.members": "Lista članova", + "control-panel": "Kontrolna ploča grupa", + "revert": "Povrati", + + "edit.no-users-found": "Korisnik nije pronađen", + "edit.confirm-remove-user": "Sigurni ste da želite ukloniti ovog korisnika?", + "edit.save-success": "Promjene spremljene!" +} \ No newline at end of file diff --git a/public/language/hr/admin/manage/ip-blacklist.json b/public/language/hr/admin/manage/ip-blacklist.json new file mode 100644 index 0000000000..374b5029d5 --- /dev/null +++ b/public/language/hr/admin/manage/ip-blacklist.json @@ -0,0 +1,15 @@ +{ + "lead": "Upišite IP za blokiranje ovdje.", + "description": "Blokiranje korisničkog računa neki put nije dovoljno za odbiti nepoželjno osobu.U tom slučaju najbolji način da se zaštiti forum je onemogućavanje spajanja na forum sa određene IP adrese ili spektrom IP adresa.", + "active-rules": "Aktivna pravila", + "validate": "Potvrdite blokade ", + "apply": "Primjeni blokade", + "hints": "Sintaktički savjeti", + "hint-1": "Odredite jednu IP adresu po liniji. Možete dodati IP blokove dokle god su upisani u CIDR formatu (npr. 192.168.100.0/22).", + "hint-2": "Možete dodati komentare tako da u početku reda upišete simbol ljestvi code>#", + + "validate.x-valid": "%1 od %2 pravila valjano.", + "validate.x-invalid": "Sljedeća %1 pravila su nevažeća:", + + "alerts.applied-success": "Blokiranje omogućeno" +} \ No newline at end of file diff --git a/public/language/hr/admin/manage/registration.json b/public/language/hr/admin/manage/registration.json new file mode 100644 index 0000000000..aba7529be9 --- /dev/null +++ b/public/language/hr/admin/manage/registration.json @@ -0,0 +1,20 @@ +{ + "queue": "Na čekanju", + "description": "Nema korisnika na čekanju za registraciju.
Za pokretanje ove mogućnosti odite na Settings → User → User Registration i postavite tip registracije u \"Admin Approval\".", + + "list.name": "Ime", + "list.email": "Email", + "list.ip": "IP", + "list.time": "Vrijeme", + "list.username-spam": "Učestalost %1 Pojavljivanje %2 Samouvjerenost %3", + "list.email-spam": "Učestalost %1 Pojavljivanje %2", + "list.ip-spam": "Učestalost: %1 Pojavljivanje: %2", + + "invitations": "Pozivnice", + "invitations.description": "Ispod je potpuni popis poslanih pozivnica.Koristite ctrl + f za pretragu liste po emailu ili korisničkom imenu.

Korisničko ime će biti prikazano na desno od emaila za korisnike koji su iskoristili svoje pozivnice.", + "invitations.inviter-username": "Korisničko ime pozivatelja", + "invitations.invitee-email": "Email adresa pozivatelja", + "invitations.invitee-username": "Korisničko ime pozivatelja (ako je registriran)", + + "invitations.confirm-delete": "Sigurni ste da želite obrisati ovu pozivnicu?" +} \ No newline at end of file diff --git a/public/language/hr/admin/manage/tags.json b/public/language/hr/admin/manage/tags.json new file mode 100644 index 0000000000..9976f4d310 --- /dev/null +++ b/public/language/hr/admin/manage/tags.json @@ -0,0 +1,18 @@ +{ + "none": "Vaš forum nema tema sa oznakama", + "bg-color": "Pozadinska boja", + "text-color": "Boja teksta", + "create-modify": "Napravi i uredi oznake", + "description": "Odaberite oznake klikom ili povlačenjem, koristite SHIFT za višestruki odabir.", + "create": "Napravi oznaku", + "modify": "Uredi oznake", + "delete": "Obriši odabrane oznake", + "search": "Pretraži za oznake ...", + "settings": "Kliknite ovdje za posjetu postavki oznaka", + "name": "Ime oznake", + + "alerts.editing-multiple": "Uređivanje više oznaka", + "alerts.editing-x": "Uredi \"%1\" oznake", + "alerts.confirm-delete": "Želite li obrisati odabrane oznake?", + "alerts.update-success": "Oznake promijenjene!" +} \ No newline at end of file diff --git a/public/language/hr/admin/manage/users.json b/public/language/hr/admin/manage/users.json new file mode 100644 index 0000000000..67d5981583 --- /dev/null +++ b/public/language/hr/admin/manage/users.json @@ -0,0 +1,91 @@ +{ + "users": "Korisnici", + "edit": "Uredi", + "make-admin": "Dodaj administratora", + "remove-admin": "Makni administratora", + "validate-email": "Potvrdite email", + "send-validation-email": "Pošalji email potvrde", + "password-reset-email": "Poslan email zahtjev za resetiranje lozinke", + "ban": "Blokiraj korisnika", + "temp-ban": "Blokiraj korisnika privremeno", + "unban": "Odblokiraj korisnika", + "reset-lockout": "Resetiraj zaključavanje", + "reset-flags": "Resetiraj zastave", + "delete": "Obriši korisnika", + "purge": "Obriši korisnike i sadržaj", + "download-csv": "Preuzmi CSV", + "invite": "Pozivnica", + "new": "Novi korisnik", + + "pills.latest": "Posljednji korisnici", + "pills.unvalidated": "Nije potvrđen", + "pills.no-posts": "Nema objava", + "pills.top-posters": "Najviše objava", + "pills.top-rep": "Najviše reputacije", + "pills.inactive": "Neaktivan", + "pills.flagged": "Najviše zastava", + "pills.banned": "Blokirani", + "pills.search": "Pretraga korisnika", + + "search.username": "Po korisničkom imenu", + "search.username-placeholder": "Unesite korisničko ime za pretragu", + "search.email": "Sa email-om", + "search.email-placeholder": "Unesite email za pretragu", + "search.ip": "Po IP adresi", + "search.ip-placeholder": "Unesite IP adresu za pretragu", + "search.not-found": "Korisnik nije pronađen!", + + "inactive.3-months": "3 mjeseca", + "inactive.6-months": "6 mjeseci", + "inactive.12-months": "12 mjeseci", + + "users.uid": "uid", + "users.username": "korisničko ime", + "users.email": "email", + "users.postcount": "postcount", + "users.reputation": "reputacija", + "users.flags": "flags", + "users.joined": "joined", + "users.last-online": "Zadnji online", + "users.banned": "blokiran", + + "create.username": "Korisničko ime", + "create.email": "Email", + "create.email-placeholder": "Email korisnika", + "create.password": "Lozinka", + "create.password-confirm": "Potvdri lozinku", + + "temp-ban.length": "Dužina blokade", + "temp-ban.reason": "Razlog (Opcionalno)", + "temp-ban.hours": "Sati", + "temp-ban.days": "Dani", + "temp-ban.explanation": "Unesite dužinu trajana blokade. Ukoliko je vrijeme 0 smatra se permanentnom blokadom.", + + "alerts.confirm-ban": "Sigurni ste da želite blokirati ovo korisnika trajno?", + "alerts.confirm-ban-multi": "Sigurni ste da želite blokirati korisnika permanentno?", + "alerts.ban-success": "Korisnik blokiran!", + "alerts.button-ban-x": "Blokiraj %1 korisnika", + "alerts.unban-success": "Korisnik odblokiran!", + "alerts.lockout-reset-success": "Zaključavanje resetirano!", + "alerts.flag-reset-success": "Flags(s) reset!", + "alerts.no-remove-yourself-admin": "Nemoguće je maknuti samog sebe iz administracije!", + "alerts.make-admin-success": "Korisnik je sada administrator.", + "alerts.confirm-remove-admin": "Sigurni ste da želite ukloniti administratora?", + "alerts.remove-admin-success": "Korisnik više nije administrator!", + "alerts.confirm-validate-email": "Želite li potvrditi email ovih korisnika?", + "alerts.validate-email-success": "Email potvrđen", + "alerts.password-reset-confirm": "Želite li poslati email za reset lozinke korisniku ?", + "alerts.confirm-delete": "Warning!
Do you really want to delete user(s)?
This action is not reversable! Only the user account will be deleted, their posts and topics will remain.", + "alerts.delete-success": "Korisnici obrisani!", + "alerts.confirm-purge": "Warning!
Do you really want to delete user(s) and their content?
This action is not reversable! All user data and content will be erased!", + "alerts.create": "Napravi korisnika", + "alerts.button-create": "Napravi", + "alerts.button-cancel": "Odustani", + "alerts.error-passwords-different": "Lozinke se moraju podudarati!", + "alerts.error-x": "Greška

%1

", + "alerts.create-success": "Korisnik kreiran!", + + "alerts.prompt-email": "Email:", + "alerts.email-sent-to": "Email pozivnica je poslana %1", + "alerts.x-users-found": "%1 korisnik pronađen! Vrijeme pretrage: %2 ms" +} \ No newline at end of file diff --git a/public/language/hr/admin/menu.json b/public/language/hr/admin/menu.json new file mode 100644 index 0000000000..088c6a06ef --- /dev/null +++ b/public/language/hr/admin/menu.json @@ -0,0 +1,74 @@ +{ + "section-general": "Glavno", + "general/dashboard": "Glavna ploča", + "general/homepage": "Naslovnica", + "general/navigation": "Navigacija", + "general/languages": "Jezici", + "general/sounds": "Zvukovi", + "general/social": "Socijalno", + + "section-manage": "Upravljanje", + "manage/categories": "Kategorije", + "manage/tags": "Oznake", + "manage/users": "Korisnici", + "manage/registration": "Lista zahtjeva za registraciju", + "manage/groups": "Grupe", + "manage/ip-blacklist": "IP blokade", + + "section-settings": "Postavke", + "settings/general": "Generalno", + "settings/reputation": "Reputacija", + "settings/email": "Email", + "settings/user": "Korisnik", + "settings/group": "Grupa", + "settings/guest": "Gosti", + "settings/uploads": "Slanje", + "settings/post": "Objave", + "settings/chat": "Razgovor", + "settings/pagination": "Numeriranje", + "settings/tags": "Oznake", + "settings/notifications": "Obavijesti", + "settings/cookies": "Kolačići", + "settings/web-crawler": "Web puzač", + "settings/sockets": "Utičnice", + "settings/advanced": "Napredno", + + "settings.page-title": "%1 Postavke", + + "section-appearance": "Izgled", + "appearance/themes": "Predlošci", + "appearance/skins": "Izgled", + "appearance/customise": "Uobičajni HTML i CSS", + + "section-extend": "Proširi", + "extend/plugins": "Dodatci", + "extend/widgets": "Widgeti", + "extend/rewards": "Nagrade", + + "section-social-auth": "Socijalna provjera autentičnosti", + + "section-plugins": "Dodatci", + "extend/plugins.install": "Instaliraj dodatke", + + "section-advanced": "Napredno", + "advanced/database": "Baza podataka", + "advanced/events": "Događanja", + "advanced/logs": "Dnevnik", + "advanced/errors": "Greške", + "advanced/cache": "Cache", + "development/logger": "Dnevnik", + "development/info": "Info", + + "reload-forum": "Ponovno učitaj forum", + "restart-forum": "ponovno pokreni forum", + "logout": "Odjava", + "view-forum": "Pogledaj forum", + + "search.placeholder": "Pretraga...", + "search.no-results": "Nema rezultata ...", + "search.search-forum": "Pretraži forum za ", + "search.keep-typing": "Upiši više da vidiš rezultate ...", + "search.start-typing": "Počni pisati da bi vidio rezultate...", + + "connection-lost": "Veza sa %1 je prekinuta, pokušavam se spojiti ..." +} \ No newline at end of file diff --git a/public/language/hr/admin/settings/advanced.json b/public/language/hr/admin/settings/advanced.json new file mode 100644 index 0000000000..3bd50b1a1e --- /dev/null +++ b/public/language/hr/admin/settings/advanced.json @@ -0,0 +1,19 @@ +{ + "maintenance-mode": "Održavanje u toku", + "maintenance-mode.help": "Kada je forum u stanju održavanja,svi zahtjevi će biti preusmjereni statičnoj stranici.Administratori su izuzeti od ovog preusmjerenja i mogu normalno koristiti stranicu.", + "maintenance-mode.message": "Poruka održavanja", + "headers": "Zaglavlje", + "headers.allow-from": "Izaberi ALLOW-FROM da bi ste postavili NodeBB u iFrame.", + "headers.powered-by": "Uredi \"Powered by\" zaglavlje koje šalje NodeBB", + "headers.acao": "Pristup-Kontrola-Dozvoli-Izvor", + "headers.acao-help": "Za zabranu pristupa svim stranicama ostavi prazno", + "headers.acam": "Access-Control-Allow-Methods", + "headers.acah": "Access-Control-Allow-Headers", + "traffic-management": "Upravljanje prometom", + "traffic.help": "NodeBB koristi modul koji automatski odbija zahtjeve u situacijama visokog prometa.Možete ove postavke izmjeniti ovdje,iako su već zadane postavke dobra početna točka.", + "traffic.enable": "Omogući upravljanje prometom", + "traffic.event-lag": "Event Loop Lag Threshold (in milliseconds)", + "traffic.event-lag-help": "Smanjivanje ove vrijednosti smanjuje vrijeme čekanja za učitavanje stranica,ali će također pokazivati poruku \"prekomjerno opterećenje\" više korisnika(u takvim slučajevima potrebno je ponovo pokretanje).", + "traffic.lag-check-interval": "Provjeri interval (u milisekundama)", + "traffic.lag-check-interval-help": "Smanjivanje ove vrijednosti uzrokuje da NodeBB postane osjetljivji na oscilacije u prometu,takodjer može uzrokovati da provjere postanu preosjetljive(Biti će potrebno ponovno pokretanje)." +} \ No newline at end of file diff --git a/public/language/hr/admin/settings/chat.json b/public/language/hr/admin/settings/chat.json new file mode 100644 index 0000000000..2ec0c9147e --- /dev/null +++ b/public/language/hr/admin/settings/chat.json @@ -0,0 +1,9 @@ +{ + "chat-settings": "Postavke razgovora", + "disable": "Onemogući razgovor", + "disable-editing": "Onemogući uređivanje/brisanje poruka razgovora", + "disable-editing-help": "Administratori i moderatori su izuzeti od ovih restrikcija", + "max-length": "Maksimalna dužina poruka u razgovoru", + "max-room-size": "Maksimalan broj korisnika u sobama za razgovor", + "delay": "Vrijeme između poruka razgovora u milisekundama" +} \ No newline at end of file diff --git a/public/language/hr/admin/settings/cookies.json b/public/language/hr/admin/settings/cookies.json new file mode 100644 index 0000000000..b38e7b223a --- /dev/null +++ b/public/language/hr/admin/settings/cookies.json @@ -0,0 +1,11 @@ +{ + "eu-consent": "Suglasnost EU", + "consent.enabled": "Omogućeno", + "consent.message": "Poruka obavijesti", + "consent.acceptance": "Poruka prihvaćanja", + "consent.link-text": "Odrednice Poveznice Tekst", + "consent.blank-localised-default": "Pusti prazno za zadanu NodeBB lokalizaciju", + "settings": "Postavke", + "cookie-domain": "Sesija kolačić domene", + "blank-default": "Ostavi prazno za osnovno" +} \ No newline at end of file diff --git a/public/language/hr/admin/settings/email.json b/public/language/hr/admin/settings/email.json new file mode 100644 index 0000000000..67ef2941c5 --- /dev/null +++ b/public/language/hr/admin/settings/email.json @@ -0,0 +1,25 @@ +{ + "email-settings": "Postavke emaila", + "address": "Email adresa", + "address-help": "Sljedeća email adresa je adresa koju će primatelj vidjeti u \"Od\" i \"Odgovori na\" poljima.", + "from": "Od imena", + "from-help": "Ime prikazano u dolaznom emailu.", + "gmail-routing": "Gmail putanja", + "gmail-routing-help1": "Postoje prijave da je Gmail Routing onemogućen na računima sa povišenom sigurnosti. U tom slučaju morati ćete konfigurirati vaš GMail račun da dozvoljava manje sigurne aplikacije.", + "gmail-routing-help2": "Za više informacija o ovom rješenju href=\"https://nodemailer.com/using-gmail/\"> molimo pročitajte NodeMailer članak o tom problemu .Alternativa je korištenje email dodatak treće strane poput SendGrid,MailGun itd. Pretražite moguće email dodatke ovdje.", + "gmail-transport": "Prosljedite email kroz Gmail/Google Apps račun", + "gmail-transport.username": "Korisničko ime", + "gmail-transport.username-help": "Unesite punu email adresu ovdje,naročito ako koristite domenu upravljanu preko Google Appsa.", + "gmail-transport.password": "Lozinka", + "template": "Uredi predložak emaila", + "template.select": "Odaberi predložak emaila", + "template.revert": "Povrati na original ", + "testing": "Testiranje emaila", + "testing.select": "Odaberi email predložak ", + "testing.send": "Pošalji testni email", + "testing.send-help": "Ovaj test mail će biti poslan svim trenutačno prijavljenim korisnicima na njihovu email adresu.", + "subscriptions": "Email pretplate", + "subscriptions.disable": "Onemogući obavijesti emailom za pretplatnika ", + "subscriptions.hour": "Pregled Sati.", + "subscriptions.hour-help": "Unesite broj koji pretstavlja vrijeme kada će se poslati pregled mailom (npr. 0 za ponoć, 17za 5 popodne).Imajte na umu da to vrijeme predstavlja vrijeme servera te ne mora predstavljati vrijeme na Vašem sistemu. Vrijeme servera je:
Sljedeći pregled će biti poslan ." +} \ No newline at end of file diff --git a/public/language/hr/admin/settings/general.json b/public/language/hr/admin/settings/general.json new file mode 100644 index 0000000000..37c16a92b5 --- /dev/null +++ b/public/language/hr/admin/settings/general.json @@ -0,0 +1,32 @@ +{ + "site-settings": "Postavke stranice", + "title": "Naslov stranice", + "title.name": "Ime Vaše zajednice", + "title.show-in-header": "Prikaži naslov stranice u zaglavlju", + "browser-title": "Naslov pretraživača", + "browser-title-help": "Ako naslov pretraživača nije postavljen, koristit će se naziv foruma", + "title-layout": "Raspored naslova", + "title-layout-help": "Definiraj kako će naslov pretraživača biti strukturiran npr.: {pageTitle} | {browserTitle}", + "description.placeholder": "Kratak opis zajednice", + "description": "Opis foruma", + "keywords": "Ključne riječi", + "keywords-placeholder": "Ključne riječi koje opisuju Vašu zajednicu, odvojeni zarezom", + "logo": "Logo foruma", + "logo.image": "Slika", + "logo.image-placeholder": "Putanja logotipa za zaglavlje foruma", + "logo.upload": "Učitaj", + "logo.url": "URL", + "logo.url-placeholder": "URL loga stranice", + "logo.url-help": "U slučaju klika na logo,pošalji korisnike na ovu adresu.U slučaju praznog polja,korisnik će biti poslan na index foruma.", + "logo.alt-text": "Alt tekst", + "log.alt-text-placeholder": "Alternativni tekst za dostupnost", + "favicon": "Favicon", + "favicon.upload": "Učitaj", + "touch-icon": "Naslovnica/Touch ikona", + "touch-icon.upload": "Učitaj", + "touch-icon.help": "Recommended size and format: 192x192, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.", + "outgoing-links": "Odlazne poveznice", + "outgoing-links.warning-page": "Koristi upozorenje za odlazne poveznice", + "search-default-sort-by": "Pretraži zadani poredak", + "outgoing-links.whitelist": "Domene za koje se ne koristi odlazno upozorenje" +} \ No newline at end of file diff --git a/public/language/hr/admin/settings/group.json b/public/language/hr/admin/settings/group.json new file mode 100644 index 0000000000..c621da8cb1 --- /dev/null +++ b/public/language/hr/admin/settings/group.json @@ -0,0 +1,12 @@ +{ + "general": "Glavno", + "private-groups": "Privatne grupe", + "private-groups.help": "Ako je uključeno,ulazak u grupe zahtjevati će odobrenje vlasnika grupe (Default: enabled)", + "private-groups.warning": "Pazi! Ako je ova opcija isključena,a imate privatne grupe,automatski će postati javne.", + "allow-creation": "Dozvoli kreiranje grupe", + "allow-creation-help": "Ako je uključeno,korisnicima će biti omogućeno stvaranje grupa (Default: disabled)", + "max-name-length": "Maksimalna dužina imena grupe", + "cover-image": "Slika grupe", + "default-cover": " ", + "default-cover-help": "Dodaj slike sa zarezima između za grupe koje nemaju učitanu naslovnu sliku" +} \ No newline at end of file diff --git a/public/language/hr/admin/settings/guest.json b/public/language/hr/admin/settings/guest.json new file mode 100644 index 0000000000..8cc284acb4 --- /dev/null +++ b/public/language/hr/admin/settings/guest.json @@ -0,0 +1,8 @@ +{ + "handles": "Upravljanje gostima", + "handles.enabled": "Dozvoli upravljanje gostima", + "handles.enabled-help": "Ova opcija omogućava gostima da izaberi ime za svaku objavu koju naprave.Ako je onemogućena gosti će se zvati \"gost\".", + "privileges": "Privilegije gosta", + "privileges.can-search": "Dozvoli gostima pretragu bez prijave", + "privileges.can-search-users": "Dopusti gostima pretragu korisnika bez prijave" +} \ No newline at end of file diff --git a/public/language/hr/admin/settings/notifications.json b/public/language/hr/admin/settings/notifications.json new file mode 100644 index 0000000000..1d1c969f34 --- /dev/null +++ b/public/language/hr/admin/settings/notifications.json @@ -0,0 +1,5 @@ +{ + "notifications": "Obavijesti", + "welcome-notification": "Obavijest dobrodošlice", + "welcome-notification-link": "Poveznica objave dobrodošlice" +} \ No newline at end of file diff --git a/public/language/hr/admin/settings/pagination.json b/public/language/hr/admin/settings/pagination.json new file mode 100644 index 0000000000..3a38d2bfe9 --- /dev/null +++ b/public/language/hr/admin/settings/pagination.json @@ -0,0 +1,9 @@ +{ + "pagination": "Postavke numeriranja", + "enable": "Numeriraj teme i objave umjesto beskrajnog skrolanja.", + "topics": "Numeriranje tema", + "posts-per-page": "Objava po stranici ", + "categories": "Numeriranje kategorija", + "topics-per-page": "Tema po stranici", + "initial-num-load": "Početni broj tema za učitati u sekcijama nepročitano,nedavno i popularno." +} \ No newline at end of file diff --git a/public/language/hr/admin/settings/post.json b/public/language/hr/admin/settings/post.json new file mode 100644 index 0000000000..e97f8d77e8 --- /dev/null +++ b/public/language/hr/admin/settings/post.json @@ -0,0 +1,46 @@ +{ + "sorting": "Redosljed objava", + "sorting.post-default": "Zadano sortiranje objava", + "sorting.oldest-to-newest": "Starije prema Novijem", + "sorting.newest-to-oldest": "Novije prema Starijem", + "sorting.most-votes": "Najviše glasova", + "sorting.topic-default": "Uobičajeno sortiranje tema", + "restrictions": "Restrikcije objave", + "restrictions.seconds-between": "Sekunde između objava", + "restrictions.seconds-between-new": "Sekunde prije objave za nove korisnike", + "restrictions.rep-threshold": "Prag reputacije prije nego je ova restrikcija maknuta.", + "restrictions.seconds-defore-new": "Sekunde prije novi korisnik može objavljivati", + "restrictions.seconds-edit-after": "Broj sekundi koje su korisnicima dozvoljene za mijenjanje objava nakon objavljivanja(u slučaju 0 ova postavka je ugašena).", + "restrictions.seconds-delete-after": "Broj sekundi koji korisnik ima za obrisati objavu nakon objavljivanja(u slučaju 0 ova postavka je ugašena).", + "restrictions.replies-no-delete": "Broj odgovora nakon što je korisniku zabranjeno brisati njegovu temu(u slučaju 0 ova postavka je ugašena).", + "restrictions.min-title-length": "Minimalna dužina naslova", + "restrictions.max-title-length": "Maksimalna dužina naslova", + "restrictions.min-post-length": "Minimalna dužina objave", + "restrictions.max-post-length": "Maksimalna dužina objave", + "restrictions.days-until-stale": "Dani do kad se tema smatra neaktivnom", + "restrictions.stale-help": "Ako je tema smatran neaktivnim,upozorenje će biti prikazano svim korisnicima koji pokušaju odgovoriti na temu", + "timestamp": "Vremenska oznaka", + "timestamp.cut-off": "Datum prekida (u danima)", + "timestamp.cut-off-help": "Dates & times will be shown in a relative manner (e.g. \"3 hours ago\" / \"5 days ago\"), and localised into various\n\t\t\t\t\tlanguages. After a certain point, this text can be switched to display the localised date itself\n\t\t\t\t\t(e.g. 5 Nov 2016 15:30).
(Default: 30, or one month). Set to 0 to always display dates, leave blank to always display relative times.", + "teaser": "Zadirkivač objava", + "teaser.last-post": "Last – Show the latest post, including the original post, if no replies", + "teaser.last-reply": "Last – Show the latest reply, or a \"No replies\" placeholder if no replies", + "teaser.first": "Prvi", + "unread": "Nepročitane postavke", + "unread.cutoff": "Nepročitano dani prekinutosti", + "unread.min-track-last": "Minimalni broj objava u temi prije praćenja zadnje pročitanog", + "recent": "Nedavne postavke", + "recent.categoryFilter.disable": "onemogući filtriranje tema u ignoriranim kategorijama na stranici /nedavno", + "signature": "Postavke potpisa", + "signature.disable": "Onemogući potpise", + "signature.no-links": "Onemogući odlazne poveznice u potpisima ", + "signature.no-images": "Onemogući slike u potpisima", + "signature.max-length": "Minimalna dužina potpisa", + "composer": "Postavke Composer-a", + "composer-help": "The following settings govern the functionality and/or appearance of the post composer shown\n\t\t\t\tto users when they create new topics, or reply to existing topics.", + "composer.show-help": "Prikaži \"Pomoć\"", + "composer.enable-plugin-help": "Dozvoli dodatcima da dodaju sadržaj u \"Pomoć\"", + "composer.custom-help": "Tekst \"Pomoć\"", + "ip-tracking": "IP praćenje", + "ip-tracking.each-post": "Prati IP adresu za svaku objavu" +} \ No newline at end of file diff --git a/public/language/hr/admin/settings/reputation.json b/public/language/hr/admin/settings/reputation.json new file mode 100644 index 0000000000..71e4fab8b6 --- /dev/null +++ b/public/language/hr/admin/settings/reputation.json @@ -0,0 +1,9 @@ +{ + "reputation": "Postavke reputacije", + "disable": "Onemogući reputacije", + "disable-down-voting": "Onemogući oduzimanje glasova", + "votes-are-public": "Svi glasovi su javni", + "thresholds": "Prag aktivnosti", + "min-rep-downvote": "Minimalna reputacija za glasanje protiv", + "min-rep-flag": "Minimalna reputacija za označavanje objava" +} \ No newline at end of file diff --git a/public/language/hr/admin/settings/sockets.json b/public/language/hr/admin/settings/sockets.json new file mode 100644 index 0000000000..7528fef036 --- /dev/null +++ b/public/language/hr/admin/settings/sockets.json @@ -0,0 +1,6 @@ +{ + "reconnection": "Postavke ponovnog spajanja", + "max-attempts": "Max pokušaji spajanja", + "default-placeholder": "Zadano: %1", + "delay": "Stanka u ponovnom spajanju" +} \ No newline at end of file diff --git a/public/language/hr/admin/settings/tags.json b/public/language/hr/admin/settings/tags.json new file mode 100644 index 0000000000..ea7284a928 --- /dev/null +++ b/public/language/hr/admin/settings/tags.json @@ -0,0 +1,12 @@ +{ + "tag": "Postavke oznaka", + "min-per-topic": "Najmanje oznaka za temu", + "max-per-topic": "Maksimalno oznaka po temi", + "min-length": "Minimalna dužina oznake", + "max-length": "Maksimalna dužina oznaka", + "goto-manage": "Klikni ovdje za upravljanje oznakama.", + "privacy": "Privatnost", + "list-private": "Postavi listu oznaka privatno", + "related-topics": "Slične teme", + "max-related-topics": "Maksimalni broj povezanih tema za prikaz(ako je podržano unutar predloška)" +} \ No newline at end of file diff --git a/public/language/hr/admin/settings/uploads.json b/public/language/hr/admin/settings/uploads.json new file mode 100644 index 0000000000..ced5c66195 --- /dev/null +++ b/public/language/hr/admin/settings/uploads.json @@ -0,0 +1,28 @@ +{ + "posts": "Objave", + "allow-files": "Dozvoli korisnicima učitavanje regularnih datoteka", + "private": "Učini datoteke privatnim", + "max-image-width": "Promjeni veličinu slike na zadanu širinu (u pikselima)", + "max-image-width-help": "(u pixelima,zadano:760 pixela,upiši 0 za onemogućiti opciju)", + "max-file-size": "Maksimalna veličina datoteka (in KiB)", + "max-file-size-help": "u kilobajtima,zadano:2048 kiB", + "allow-topic-thumbnails": "Dozvoli korisnicima da učitaju sliku teme", + "topic-thumb-size": "Veličina slike teme", + "allowed-file-extensions": "Dozvoljene ekstenzije datoteka", + "allowed-file-extensions-help": "Unesite popis dozvoljenih ekstenzija datoteka sa zarezima između (npr. pdf,xls,doc ).Prazan popis znači da su sve ekstenzije dozvoljene.", + "profile-avatars": "Avatar profila", + "allow-profile-image-uploads": "Dozvoli korisnicima da učitaju sliku profila", + "convert-profile-image-png": "Konvertiraj profilne slike u PNG", + "default-avatar": "Zadani osnovni avatar", + "upload": "Učitaj", + "profile-image-dimension": "Dimenzije slike profila", + "profile-image-dimension-help": "(u pikselima, zadano: 128 piksela)", + "max-profile-image-size": "Maksimalna veličina profilne slike", + "max-profile-image-size-help": "(u kilobajtima, početna postavka: 256 KiB)", + "max-cover-image-size": "Maksimalna veličina slike za naslovnicu", + "max-cover-image-size-help": "(in kilobytes, default: 2,048 KiB)", + "keep-all-user-images": "Zadrži stare verzije avatara i slike profila na serveru", + "profile-covers": "Slika profila", + "default-covers": "Osnovne slike naslovnica", + "default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image" +} diff --git a/public/language/hr/admin/settings/user.json b/public/language/hr/admin/settings/user.json new file mode 100644 index 0000000000..46f7b8bac3 --- /dev/null +++ b/public/language/hr/admin/settings/user.json @@ -0,0 +1,62 @@ +{ + "authentication": "Autentifikacija", + "allow-local-login": "Dozvoli lokalnu prijavu", + "require-email-confirmation": "Zahtjeva potvrdu email-om", + "email-confirm-interval": "Korisnik ne može ponovno poslati potvrdni email do ", + "email-confirm-email2": "prošlo je minuta", + "allow-login-with": "Dozvoli prijavu sa", + "allow-login-with.username-email": "Korisničko ime ili Email", + "allow-login-with.username": "Korisničko ime", + "allow-login-with.email": "Samo email", + "account-settings": "Postavke računa", + "disable-username-changes": "onemogući promjenu korisničkog imena", + "disable-email-changes": "Onemogući promjenu emaila", + "disable-password-changes": "Onemogući promjenu lozinke", + "allow-account-deletion": "Dozvoli brisanje računa korisnicima", + "user-info-private": "Postavi korisničke informacije privatne", + "themes": "Predlošci", + "disable-user-skins": "Onemogući korisnicima odabir predloška", + "account-protection": "Zaštita računa", + "login-attempts": "Pokušaji prijave po satu", + "login-attempts-help": "U slučaju pokušaja prijave na račun user's u tolikoj količini da prelazi ovaj prag,račun će biti zaključan na pre-konfigurirano vrijeme", + "lockout-duration": "Broj minuta u slučaju zaključavanja računa", + "login-days": "Dani za zapamtiti sesiju korisničke prijave", + "password-expiry-days": "Forsiraj reset lozinke nakon broja dana", + "registration": "Korisnička registracija", + "registration-type": "Tip registracije", + "registration-type.normal": "Nromalno", + "registration-type.admin-approval": "Administratorsko dopuštenje", + "registration-type.admin-approval-ip": "Administratorska dozovola za IP", + "registration-type.invite-only": "Samo uz pozivnicu", + "registration-type.admin-invite-only": "Samo uz pozivnicu administratora", + "registration-type.disabled": "Bez registracije", + "registration-type.help": "Normal - Users can register from the /register page.
\nAdmin Approval - User registrations are placed in an approval queue for administrators.
\nAdmin Approval for IPs - Normal for new users, Admin Approval for IP addresses that already have an account.
\nInvite Only - Users can invite others from the users page.
\nAdmin Invite Only - Only administrators can invite others from users and admin/manage/users pages.
\nNo registration - No user registration.
", + "registration.max-invites": "Maksimalan broj pozivnica po korisniku", + "max-invites": "Maksimalan broj pozivnica po korisniku", + "max-invites-help": "0 bez restrikcija. Administrator ima neograničeno pozivnica
Primjenjivo samo za \"poziv na forum\"", + "invite-expiration": "Invite expiration", + "invite-expiration-help": "# of days invitations expire in.", + "min-username-length": "Minimalna dužina korisničkog imena", + "max-username-length": "Maksimalna dužina korisničkog imena", + "min-password-length": "Minimalna dužina lozinke", + "min-password-strength": "Minimalna snaga lozinke", + "max-about-me-length": "Maksimalna dužina \"O meni\"", + "terms-of-use": "Pravila korištenja foruma (ostavi prazno za isključeno)", + "user-search": "Korisnička pretraga", + "user-search-results-per-page": "Broj rezultata za prikaz", + "default-user-settings": "Osnovne korisničke postavke", + "show-email": "Prikaži email", + "show-fullname": "Prikaži puno ime", + "restrict-chat": "Dozvoli poruke samo od ljudi koje praim", + "outgoing-new-tab": "Otvori odlazne poveznive u novom prozoru ", + "topic-search": "Dopusti pretragu po temama", + "digest-freq": "Pretplatite se na pregled", + "digest-freq.off": "Isključi", + "digest-freq.daily": "Dnevno", + "digest-freq.weekly": "Tjedno", + "digest-freq.monthly": "Mjesečno", + "email-chat-notifs": "Pošalji email ukoliko stigne nova poruka dok nisam na mreži", + "email-post-notif": "Pošalji email pri odgovoru u teme na koje pratim", + "follow-created-topics": "Prati teme koje kreiram", + "follow-replied-topics": "Prati teme na koje odgovorim" +} \ No newline at end of file diff --git a/public/language/hr/admin/settings/web-crawler.json b/public/language/hr/admin/settings/web-crawler.json new file mode 100644 index 0000000000..1bcfcd2409 --- /dev/null +++ b/public/language/hr/admin/settings/web-crawler.json @@ -0,0 +1,10 @@ +{ + "crawlability-settings": "Postavke pretraživanja", + "robots-txt": "Obični Robots.txt ostavi prazno za osnovno", + "sitemap-feed-settings": "Sitemap i postavke feeda", + "disable-rss-feeds": "Onemogući RSS", + "disable-sitemap-xml": "Onemogući Sitemap.xml", + "sitemap-topics": "Broj tema za prikaz u mapi foruma", + "clear-sitemap-cache": "Očisti mapu foruma iz predmemorije", + "view-sitemap": "Pogledaj mapu foruma" +} \ No newline at end of file diff --git a/public/language/hr/category.json b/public/language/hr/category.json new file mode 100644 index 0000000000..c4eb7644fa --- /dev/null +++ b/public/language/hr/category.json @@ -0,0 +1,20 @@ +{ + "category": "Kategorija", + "subcategories": "Podkategorije", + "new_topic_button": "Nova Tema", + "guest-login-post": "Prijavi se za objavu", + "no_topics": "Nema tema u ovoj kategoriji.
Zašto ne probate napisati novu?", + "browsing": "pregledavanje", + "no_replies": "Nema odgovora", + "no_new_posts": "Nema novih tema.", + "share_this_category": "Podijeli ovu kategoriju", + "watch": "Prati", + "ignore": "Ignoriraj", + "watching": "Pratim", + "ignoring": "Ignoriram", + "watching.description": "Prikaži nepročitane teme", + "ignoring.description": "Ne prikazuj nepročitane teme", + "watch.message": "Sada pratite nove objave iz ove kategorije i svih potkategorija", + "ignore.message": "Sada ignorirate nove objave iz ove kategorije i svih potkategorija", + "watched-categories": "Praćene Kategorije" +} \ No newline at end of file diff --git a/public/language/hr/email.json b/public/language/hr/email.json new file mode 100644 index 0000000000..cdf26cd74f --- /dev/null +++ b/public/language/hr/email.json @@ -0,0 +1,40 @@ +{ + "password-reset-requested": "Zatraženo ponovno kreiranje lozinke - %1!", + "welcome-to": "Dobrodošli na %1", + "invite": "Poziv s %1", + "greeting_no_name": "Zdravo", + "greeting_with_name": "Zdravo %1", + "welcome.text1": "Zahvaljujemo na registraciji na %1!", + "welcome.text2": "Da bi u potpunosti aktivirali Vaš račun, moramo provjeriti da li ste Vi pravi vlasnik email adrese sa kojom ste se registrirali.", + "welcome.text3": "Administrator je prihvatio vaš zahtjev za registraciju. Možete se prijaviti koristeći svoje korisničko ime i lozinku.", + "welcome.cta": "Kliknite ovdje da bi potvrdili email adresu", + "invitation.text1": "%1 vas je pozvao da se pridružite %2", + "invitation.ctr": "Kliknite ovdje kako biste stvorili korisnički račun.", + "reset.text1": "Dobili smo zahtjev za ponovnim kreiranjem lozinke, vjerojatno jer ste ju zaboravili. Ako niste, molimo vas da ignorirate ovaj email.", + "reset.text2": "Da bi nastavili sa ponovnim kreiranjem lozinke, kliknite na ovaj link:", + "reset.cta": "Kliknite ovdje kako biste postavili novu lozinku.", + "reset.notify.subject": "Lozinka uspješno promijenjena.", + "reset.notify.text1": "Obavještavamo vas da vam je lozinka na %1 uspješno promijenjena.", + "reset.notify.text2": "Ako niste ovo odobrili, molimo vas obavijestite administratora.", + "digest.notifications": "Imate nepročitane obavijesti s %1:", + "digest.latest_topics": "Posljednje teme s %1", + "digest.cta": "Kliknite ovdje kako biste posjetili %1", + "digest.unsub.info": "Ovaj pregled je poslan zbog Vaših postavki pretplata.", + "digest.no_topics": "Nije bilo aktivnih tema u posljednjih %1", + "digest.day": "Dan", + "digest.week": "Tjedan", + "digest.month": "Mjesec", + "digest.subject": "Pregled za %1", + "notif.chat.subject": "Nova poruka od %1", + "notif.chat.cta": "Klikni ovdje za nastavak razgovora ", + "notif.chat.unsub.info": "Ova obavijest razgovora Vam je poslana na temelju vaših postavki pretplate.", + "notif.post.cta": "Pročitaj temu", + "notif.post.unsub.info": "Ova objava Vam je poslana na temelju vaših postavki pretplate.", + "test.text1": "Ovo je test email za provjeru Vaše konfiguracije.", + "unsub.cta": "Klikni ovdje za promjenu postavki", + "banned.subject": "Blokirani se na %1", + "banned.text1": "Korisnik %2 je blokirao %1.", + "banned.text2": "Blok će trajati do %1.", + "banned.text3": "Blokirani ste zbog:", + "closing": "Hvala!" +} \ No newline at end of file diff --git a/public/language/hr/error.json b/public/language/hr/error.json new file mode 100644 index 0000000000..55ccfa9c97 --- /dev/null +++ b/public/language/hr/error.json @@ -0,0 +1,134 @@ +{ + "invalid-data": "Nevažeći podaci", + "invalid-json": "Invalid JSON", + "not-logged-in": "Izgleda da niste prijavljeni", + "account-locked": "Vaš račun je privremeno blokiran", + "search-requires-login": "Pretraga zahtijeva prijavu - prijavite se ili se registrirajte.", + "invalid-cid": "Netočan ID kategorije", + "invalid-tid": "Netočan ID teme", + "invalid-pid": "Netočan ID objave", + "invalid-uid": "Netočan ID korisnika", + "invalid-username": "Netočno korisničko ime", + "invalid-email": "Netočan email", + "invalid-title": "Netočan naslov!", + "invalid-user-data": "Netočni korisnički podatci", + "invalid-password": "Netočna lozinka", + "invalid-login-credentials": "Invalid login credentials", + "invalid-username-or-password": "Upišite oboje, korisničko ime i lozinku", + "invalid-search-term": "Netočan upit pretraživanja", + "csrf-invalid": "Nismo Vas uspijeli prijaviti, najvjerovatnije zbog istekle sesije. Molimo pokušajte ponovno", + "invalid-pagination-value": "Netočno numeriranje stranica, mora biti %1 ili %2", + "username-taken": "Korisničko ime je zauzeto", + "email-taken": "Email je zauzet", + "email-not-confirmed": "Vaš email još nije potvrđen, kliknite ovdje da bi potvrdili svoj email.", + "email-not-confirmed-chat": "Nemožete razgovarati dok Vaš email nije potvrđen, kliknite ovdje da bi potvrdili svoj email.", + "email-not-confirmed-email-sent": "Vaš email još nije potvrđen, provjerite svoj sandučić za potvrdni email.", + "no-email-to-confirm": "Ovaj forum zahtijeva potvrdu emaila, kliknite ovdje da bi potvrdili svoj email.", + "email-confirm-failed": "Nismo u mogućnosti potvrditi Vaš email, pokušajte ponovno kasnije.", + "confirm-email-already-sent": "Potvrdni email je poslan, počekajte %1 minuta za ponovni pokušaj.", + "sendmail-not-found": "Sendmail nije pronađen, provjerite da li je instaliran?", + "username-too-short": "Korisničko ime prekratko", + "username-too-long": "Korisničko ime predugo", + "password-too-long": "Lozinka je preduga", + "user-banned": "Korisnik blokiran", + "user-banned-reason": "Ovaj račun je blokiran (Razlog: %1)", + "user-banned-reason-until": "Ovaj račun je blokiran do %1 (Razlog: %2)", + "user-too-new": "Pričekajte %1 sekundi prije prve objave", + "blacklisted-ip": "Vaša IP adresa je blokirana. Ako mislite da je ovo greška, kontaktirajte administratora.", + "ban-expiry-missing": "Postavite datum isteka blokade", + "no-category": "Kategorija ne postoji", + "no-topic": "Tema ne postoji", + "no-post": "Objava ne postoji", + "no-group": "Grupa ne postoji", + "no-user": "Korisnik ne postoji", + "no-teaser": "Zadirkivač ne postoji", + "no-privileges": "Nemate privilegije za ovu radnju.", + "category-disabled": "Kategorija onemogućena", + "topic-locked": "Tema zaključana", + "post-edit-duration-expired": "Dozvoljeno vam je uređivanje %1 sekundi nakon objave", + "post-edit-duration-expired-minutes": "Dozvoljeno vam je uređivanje %1 minuta nakon objave", + "post-edit-duration-expired-minutes-seconds": "Dozvoljeno vam je uređivanje %1 minuta %2 sekunde nakon objave", + "post-edit-duration-expired-hours": "Dozvoljeno vam je uređivanje %1 sat nakon objave", + "post-edit-duration-expired-hours-minutes": "Dozvoljeno vam je uređivanje %1 sat %2 minute nakon objave", + "post-edit-duration-expired-days": "Dozvoljeno vam je uređivanje %1 dan nakon objave", + "post-edit-duration-expired-days-hours": "Dozvoljeno vam je uređivanje %1 dan %2 sata nakon objave", + "post-delete-duration-expired": "Dozvoljeno vam je brisanje %1 sekundi nakon objave", + "post-delete-duration-expired-minutes": "Dozvoljeno vam je brisanje %1 minute nakon objave", + "post-delete-duration-expired-minutes-seconds": "Dozvoljeno vam je brisanje %1 minute %2 sekunde nakon objave", + "post-delete-duration-expired-hours": "Dozvoljeno vam je brisanje %1 sat nakon objave", + "post-delete-duration-expired-hours-minutes": "Dozvoljeno vam je brisanje %1 sat i %2 minute nakon objave", + "post-delete-duration-expired-days": "Dozvoljeno vam je brisanje %1 dan nakon objave", + "post-delete-duration-expired-days-hours": "Dozvoljeno vam je brisanje %1 dan %2 sata nakon objave", + "cant-delete-topic-has-reply": "Nemožete obrisati temu nakon odgovora", + "cant-delete-topic-has-replies": "Nemožete obrisati temu nakon %1 odgovora", + "content-too-short": "Unesite dužu objavu. Objava mora sadržavati bar %1 znaka. ", + "content-too-long": "Unestie kraću objavu. Objave ne mogu biti duže od %1 znaka.", + "title-too-short": "Unesite duži naslov, minimalno %1 znakova.", + "title-too-long": "Unesite kraći naslov, maksimalno %1 znakova.", + "category-not-selected": "Kategorija nije odabrana.", + "too-many-posts": "Možete objavljivati svakih %1 skeundi, pričekajte prije ponovne objave", + "too-many-posts-newbie": "Kao novi korisnik možete objaviti svakih %1 sekundi dok ne steknete %2 reputaciju - pričekajte prije ponovne objave", + "tag-too-short": "Unesite dužu oznaku. Oznake moraju sadržavati minimalno %1 znakova", + "tag-too-long": "Unesite kraću oznaku. Oznake moraju sadržavati maksimalno %1 znakova", + "not-enough-tags": "Nema dovoljno oznaka. Teme moraju imate bar %1 oznaku", + "too-many-tags": "Previše oznaka. Teme ne mogu imati više od %1 oznaka", + "still-uploading": "Pričekajte da se prijenos završi.", + "file-too-big": "Maksimalna veličina datoteke je %1 kB - učitajte manju datoteku", + "guest-upload-disabled": "Učitavanje datoteka za goste je isključeno", + "already-bookmarked": "Već ste zabilježili ovu objavu", + "already-unbookmarked": "Već ste odbilježili ovu objavu", + "cant-ban-other-admins": "Nemožete blokirati ostale administratore!", + "cant-remove-last-admin": "Vi ste jedini administrator. Dodajte korisnika kao administratora prije nego sebe odjavite kao administratora.", + "cant-delete-admin": "Ukloni administratorske privilegije sa ovog računa prije brisanja.", + "invalid-image-type": "Pogrešan format slike. Dozvoljeni formati: %1", + "invalid-image-extension": "Kriva ekstezija slike", + "invalid-file-type": "Netočan tip datoteke. Dozvoljeni formati su: %1", + "group-name-too-short": "Prekratko ime grupe", + "group-name-too-long": "Predugo ime Grupe", + "group-already-exists": "Grupa postoji", + "group-name-change-not-allowed": "Promjena imena grupe nije dozvoljena", + "group-already-member": "Već ste član ove grupe", + "group-not-member": "Niste član ove grupe", + "group-needs-owner": "Ova grupa zahtjeva bar jednog vlasnika", + "group-already-invited": "Ovaj korisnik je već pozvan", + "group-already-requested": "Vaš zahtjev za članstvom je već podnesen", + "post-already-deleted": "Ova objava je već obrisana", + "post-already-restored": "Ova objava je povraćena", + "topic-already-deleted": "Ova tema je već obrisana", + "topic-already-restored": "Ova tema je povraćena", + "cant-purge-main-post": "Nemožete odbaciti glavnu objavu, obrišite temu za brisanje", + "topic-thumbnails-are-disabled": "Slike tema su onemogućene", + "invalid-file": "Pogrešna datoteka", + "uploads-are-disabled": "Pohrana je onemogućena", + "signature-too-long": "Vaš potpis neže biti duži od %1 znaka", + "about-me-too-long": "O vama nemože biti duže od %1 znaka", + "cant-chat-with-yourself": "Nemoguće je razgovarati sam sa sobom!", + "chat-restricted": "Korisnik je ograničio razgovore. Mora vas pratiti prije nego možete razgovarati", + "chat-disabled": "Razgovor onemogućen", + "too-many-messages": "Poslali ste previše poruka, pričekajte.", + "invalid-chat-message": "Netočna poruka.", + "chat-message-too-long": "Poruka je preduga.Mora imati manje od %1 znakova", + "cant-edit-chat-message": "Nemate dopuštenje uređivati ovu poruku", + "cant-remove-last-user": "Ne možete obrisati zadnjeg korisnika", + "cant-delete-chat-message": "Nije dozvoljeno brisanje ove poruke", + "already-voting-for-this-post": "Već ste glasali za ovu objavu", + "reputation-system-disabled": "Sistem reputacije onemogućen.", + "downvoting-disabled": "Oduzimanje glasova je onemogućeno", + "not-enough-reputation-to-downvote": "Nemate dovoljno reputacije da bi ste glasali", + "not-enough-reputation-to-flag": "Nemate dovoljno reputacije da bi stavili zastavicu na ovu objavu", + "already-flagged": "Već ste označili zastavicom ovu objavu", + "reload-failed": "Problem kod ponovnog podizanja: \"%1\" will continue to serve the existing client-side assets.", + "registration-error": "Greška prilikom registracije", + "parse-error": "Došlo je do pogreške u komunikaciji sa serverom", + "wrong-login-type-email": "Upišite Vaš email za prijavu", + "wrong-login-type-username": "Upišite Vaše korisničko ime za prijavu", + "invite-maximum-met": "Pozvali ste maksimalan broj ljudi (%1 od %2).", + "no-session-found": "Nije pronađena sesija prijave!", + "not-in-room": "Korisnik nije u sobi", + "no-users-in-room": "Nema korisnika u sobi", + "cant-kick-self": "Ne možete sebe izbaciti iz grupe", + "no-users-selected": "Korisnici nisu odabrani", + "invalid-home-page-route": "Netočna putanja naslovnice", + "invalid-session": "Pogreška sesije", + "invalid-session-text": "Vaša sesija nije više aktivna ili se više ne poklapa sa serverom. Molimo osvježite stranicu." +} \ No newline at end of file diff --git a/public/language/hr/flags.json b/public/language/hr/flags.json new file mode 100644 index 0000000000..f86d22916c --- /dev/null +++ b/public/language/hr/flags.json @@ -0,0 +1,60 @@ +{ + "state": "Stanje", + "reporter": "Reporter", + "reported-at": "Prijavljeno u", + "description": "Opis", + "no-flags": "Huura! Nema pronađenih zastavica.", + "assignee": "Dodijeljeni", + "update": "Nadogradnja", + "updated": "Nadograđeno", + "target-purged": "Sadržaj koji je označen zastavom je odbačen i više nije dostupan.", + + "quick-filters": "Brzi filteri", + "filter-active": "Postoje jedan ili više filtera aktivnih u popisu zastava", + "filter-reset": "Ukloni filtere", + "filters": "Opcije filtera", + "filter-reporterId": "Reporter UID", + "filter-targetUid": "Flagged UID", + "filter-type": "Vrsta zastave", + "filter-type-all": "Sav sadržaj", + "filter-type-post": "Objave", + "filter-state": "Stanje", + "filter-assignee": "Asignee UID", + "filter-cid": "Kategorija", + "filter-quick-mine": "Dodijeljeno meni", + "filter-cid-all": "Sve kategorije", + "apply-filters": "Primjeni filtere", + + "quick-links": "Brze poveznice", + "flagged-user": "Označeni korisnici", + "view-profile": "Pogledaj profil", + "start-new-chat": "Pokreni novi razgovor", + "go-to-target": "Pogledaj metu zastave", + + "user-view": "Pogledaj profil", + "user-edit": "Uredi profil", + + "notes": "Bilješke zastave", + "add-note": "Dodaj bilješku", + "no-notes": "Nema podijeljenih bilješki", + + "history": "Povijest zastava", + "back": "Nazad na popis zastava", + "no-history": "Nema povijesti zastava.", + + "state-all": "Sva stanja", + "state-open": "Novo/Otvori", + "state-wip": "Rad u tijeku", + "state-resolved": "Riješeno", + "state-rejected": "Odbijeno", + "no-assignee": "Nije dodijeljeno", + "note-added": "Bilješka dodana", + + "modal-title": "Prijavi neprimjereni sadržaj", + "modal-body": "Navedite razlog označavanja zastavom %1 %2 .U suprotnom koristite jedan od dugmića za brzo prijavljivanje.", + "modal-reason-spam": "Spam", + "modal-reason-offensive": "Uvredljivo", + "modal-reason-custom": "Razlog prijavljivanja ovog sadržaja", + "modal-submit": "Podnesi izvještaj", + "modal-submit-success": "Ovaj sadržaj je označen zastavom u svrhu moderiranja," +} \ No newline at end of file diff --git a/public/language/hr/global.json b/public/language/hr/global.json new file mode 100644 index 0000000000..8d02d5bc58 --- /dev/null +++ b/public/language/hr/global.json @@ -0,0 +1,107 @@ +{ + "home": "Naslovna", + "search": "Pretraga", + "buttons.close": "Zatvori", + "403.title": "Pristup onemogućen", + "403.message": "Nemate pristup ovoj stranici .", + "403.login": "Pokušajte se prijaviti?", + "404.title": "Nije pronadjeno", + "404.message": "Ova stranica ne postoji. Vrati se na početnu.", + "500.title": "Interna greška.", + "500.message": "Ups! Čini se da nešto nije u redu.", + "400.title": "Krivi zahtjev.", + "400.message": "Izgleda da ovaj link nije ispravan, molimo provjerite i ponovo pokušajte. Ili se vratite na početnu stranicu.", + "register": "Registracija", + "login": "Prijava", + "please_log_in": "Molimo prijavite se.", + "logout": "Odjava", + "posting_restriction_info": "Objave su trenutačno omogućene samo registriranim korisnicima,kliknite ovdje za prijavu.", + "welcome_back": "Dobrodošli natrag", + "you_have_successfully_logged_in": "Uspješno ste se prijavili", + "save_changes": "Spremi promjene", + "save": "Spremi", + "close": "Zatvori", + "pagination": "Stranice", + "pagination.out_of": "%1 od %2", + "pagination.enter_index": "Unesi index", + "header.admin": "Admin", + "header.categories": "Kategorije", + "header.recent": "Posljednje", + "header.unread": "Nepročitano", + "header.tags": "Tagovi", + "header.popular": "Popularno", + "header.users": "Korisnici", + "header.groups": "Grupe", + "header.chats": "Razgovori", + "header.notifications": "Obavijesti", + "header.search": "Pretraga", + "header.profile": "Profil", + "header.navigation": "Navigacija", + "notifications.loading": "Učitavanje obavijesti", + "chats.loading": "Učitavam razgovore", + "motd.welcome": "Dobrodošli na Silicon Island Rijeka 2020 forum.", + "previouspage": "Prethodna stranica", + "nextpage": "Sljedeća stranica", + "alert.success": "Uspjeh!", + "alert.error": "Greška", + "alert.banned": "Blokiran", + "alert.banned.message": "Upravo ste banirani, sada ćete biti odjavljeni", + "alert.unfollow": "Više ne pratite %1", + "alert.follow": "Sada pratite %1", + "online": "Na mreži", + "users": "Korisnici", + "topics": "Teme", + "posts": "Objave", + "best": "Najbolje", + "upvoters": "Pozitivni glasači", + "upvoted": "Glasova za", + "downvoters": "Glasači protiv", + "downvoted": "Glasova protiv", + "views": "Pregleda", + "reputation": "Reputacija", + "read_more": "pročitaj više", + "more": "Više", + "posted_ago_by_guest": "postao gost prije %1", + "posted_ago_by": "postao %2 prije %1 ", + "posted_ago": "Objavljeno prije %1", + "posted_in": "Objavljeno u %1", + "posted_in_by": "Objavljeno u %1 od &2", + "posted_in_ago": "Objavljeno u %1 %2", + "posted_in_ago_by": "Objavljeno u %1 &2 od %3", + "user_posted_ago": "%1 je objavio %2", + "guest_posted_ago": "Gost je objavio %1", + "last_edited_by": "Zadnji put uređeno &1", + "norecentposts": "Nema nedavnih objava", + "norecenttopics": "Nema nedavnih tema", + "recentposts": "Posljednji postovi", + "recentips": "Posljednje prijavljeni IPovi", + "moderator_tools": "Moderatorski alati", + "away": "Odustan", + "dnd": "Ne smetaj", + "invisible": "Nevidljiv", + "offline": "Odjavljen", + "email": "Email", + "language": "Jezik", + "guest": "Gost", + "guests": "Gosti", + "updated.title": "Forum je nadograđen", + "updated.message": "Ovaj forum je upravo nadograđen na posljednju verziju. Klikni ovdje za ponovno učitavanje stranice.", + "privacy": "Privatnost", + "follow": "Prati", + "unfollow": "Prestani pratiti", + "delete_all": "Obriši sve", + "map": "Mapa", + "sessions": "Prijavljene sesije", + "ip_address": "IP adresa", + "enter_page_number": "Unesi broj stranice", + "upload_file": "Učitaj datoteku", + "upload": "Učitavanje", + "allowed-file-types": "Dozvoljeni tipovi datoteke su %1", + "unsaved-changes": "Imate nespremljenih promjena. Jeste li sigurni da želite napustiti stranicu?", + "reconnecting-message": "Izgleda da je veza na %1 prekinuta, molimo pričekajte dok se pokušamo ponovo spojiti.", + "play": "Pokreni", + "cookies.message": "Ova stranica koristi kolačiće kako bi osigurala najbolje korisničko iskustvo.", + "cookies.accept": "Shvaćam!", + "cookies.learn_more": "Saznaj više", + "edited": "Uređeno" +} \ No newline at end of file diff --git a/public/language/hr/groups.json b/public/language/hr/groups.json new file mode 100644 index 0000000000..a27c0cc6c9 --- /dev/null +++ b/public/language/hr/groups.json @@ -0,0 +1,58 @@ +{ + "groups": "Grupe", + "view_group": "Pogledaj grupu", + "owner": "Vlasnik grupe", + "new_group": "Napravi novu grupu", + "no_groups_found": "Nema grupa za pregled", + "pending.accept": "Prihvaćam", + "pending.reject": "Odbij", + "pending.accept_all": "Prihvati sve", + "pending.reject_all": "Odbij sve", + "pending.none": "Trenutno nema korisnika na čekanju", + "invited.none": "Trenutno nema pozvanih članova", + "invited.uninvite": "Povuci pozivnicu", + "invited.search": "Pretraži korisnike za poziv u grupu", + "invited.notification_title": "Pozvani ste da se pridružite%1", + "request.notification_title": "Zahtjev za pristup grupi od %1", + "request.notification_text": "%1 je poslao zahtjev da postane član %2", + "cover-save": "Spremi", + "cover-saving": "Spremanje", + "details.title": "Detalji Grupe", + "details.members": "Popis članova", + "details.pending": "Korisnici na čekanju", + "details.invited": "Pozvani korisnici", + "details.has_no_posts": "Članovi ove grupe nisu objavljivali.", + "details.latest_posts": "Zadnje objave", + "details.private": "Privatno", + "details.disableJoinRequests": "Onemogući zahtjeve za pristup", + "details.grant": "Dozvoli/Ukini vlasništvo", + "details.kick": "Izbaci", + "details.kick_confirm": "Jeste li sigurni da želite izbaciti ovog člana iz grupe?", + "details.owner_options": "\"Administracija grupe", + "details.group_name": "Ime grupe", + "details.member_count": "Broj članova", + "details.creation_date": "Kreirano", + "details.description": "Opis", + "details.badge_preview": "Prikaz značke", + "details.change_icon": "Promjeni ikonu", + "details.change_colour": "Promjeni boju", + "details.badge_text": "Tekst značke", + "details.userTitleEnabled": "Pokaži značku", + "details.private_help": "Ako je uključeno, ulazak korisnika u grupu zahtjeva odobrenje vlasnika grupe", + "details.hidden": "Sakriveno", + "details.hidden_help": "Ako je uključeno, ova grupa neće biti na popisu grupa i korisnici će morati biti pozvani ručno", + "details.delete_group": "Obriši ovu grupu", + "details.private_system_help": "Privatne grupe su isključene na sistemskoj razini", + "event.updated": "Detalji grupe su promjenjeni", + "event.deleted": "Grupa \\\"%1\\\" je obrisana", + "membership.accept-invitation": "Prihvati pozivnicu", + "membership.invitation-pending": "Pozivnica na čekanju", + "membership.join-group": "Priključi se u grupu", + "membership.leave-group": "Izađi iz grupe", + "membership.reject": "Odbij", + "new-group.group_name": "Ime grupe:", + "upload-group-cover": "Promjeni naslovnicu grupe", + "bulk-invite-instructions": "Unesi popis korisnika sa zarezima između korisničkih imena za poziv u ovu grupu", + "bulk-invite": "Masovni poziv", + "remove_group_cover_confirm": "Jeste li sigurni da želite obrisati sliku naslovnice?" +} \ No newline at end of file diff --git a/public/language/hr/language.json b/public/language/hr/language.json new file mode 100644 index 0000000000..bdc95e799c --- /dev/null +++ b/public/language/hr/language.json @@ -0,0 +1,5 @@ +{ + "name": "Hrvatski", + "code": "hr", + "dir": "ltr" +} \ No newline at end of file diff --git a/public/language/hr/login.json b/public/language/hr/login.json new file mode 100644 index 0000000000..53c6fe313b --- /dev/null +++ b/public/language/hr/login.json @@ -0,0 +1,12 @@ +{ + "username-email": "Korisničko ime / Email", + "username": "Korisničko ime", + "email": "Email", + "remember_me": "Zapamti me?", + "forgot_password": "Zaboravljena lozinka?", + "alternative_logins": "Alternativne prijave", + "failed_login_attempt": "Neuspješna prijava", + "login_successful": "Uspješno ste prijavljeni!", + "dont_have_account": "Nemate korisnički račun?", + "logged-out-due-to-inactivity": "Odjavljeni ste iz administratorske kontrolne ploče zbog neaktivnosti." +} \ No newline at end of file diff --git a/public/language/hr/modules.json b/public/language/hr/modules.json new file mode 100644 index 0000000000..90a85d3450 --- /dev/null +++ b/public/language/hr/modules.json @@ -0,0 +1,49 @@ +{ + "chat.chatting_with": "Razgovaraj sa ", + "chat.placeholder": "Upišite poruku ovdje, ENTER za slanje", + "chat.send": "Pošalji", + "chat.no_active": "Nemate aktivnih razgovora.", + "chat.user_typing": "%1 piše poruku ...", + "chat.user_has_messaged_you": "%1 vam je poslao poruku.", + "chat.see_all": "Pogledaj sve razgovore", + "chat.mark_all_read": "Označi sve razgovore kao pročitane", + "chat.no-messages": "Odaberite primatelja da vidite povijest razgovora", + "chat.no-users-in-room": "Nema korisnika u ovoj sobi", + "chat.recent-chats": "Nedavni razgovori", + "chat.contacts": "Kontakti", + "chat.message-history": "Povijest razgovora", + "chat.pop-out": "Pop out razgovor", + "chat.minimize": "Smanji", + "chat.maximize": "Povećaj", + "chat.seven_days": "7 Dana", + "chat.thirty_days": "30 Dana", + "chat.three_months": "3 Mjeseca", + "chat.delete_message_confirm": "Sigurni ste da želite izbrisati ovu poruku?", + "chat.add-users-to-room": "Dodaj korisnike u sobu", + "chat.confirm-chat-with-dnd-user": "Korisnik ne želi biti ometan. Jeste li sigurno da mu želite poslati poruku?", + "composer.compose": "Sastavi", + "composer.show_preview": "Prikaz", + "composer.hide_preview": "Sakrij prikaz", + "composer.user_said_in": "%1 je rekao u %2:", + "composer.user_said": "%1 je rekao:", + "composer.discard": "Sigurni ste da želite odbaciti ovu objavu?", + "composer.submit_and_lock": "Objavi i zaključaj", + "composer.toggle_dropdown": "Promjeni padajuće", + "composer.uploading": "Šaljem %1", + "composer.formatting.bold": "Bold", + "composer.formatting.italic": "Italic", + "composer.formatting.list": "Popis", + "composer.formatting.strikethrough": "Precrtano", + "composer.formatting.link": "Poveznica", + "composer.formatting.picture": "Slika", + "composer.upload-picture": "Učitaj sliku", + "composer.upload-file": "Učitaj datoteku", + "composer.zen_mode": "Zen", + "composer.select_category": "Odaberi kategoriju", + "bootbox.ok": "OK", + "bootbox.cancel": "Odbaci", + "bootbox.confirm": "Potvrdi", + "cover.dragging_title": "Pozicija naslovne slike", + "cover.dragging_message": "Povucite sliku na željenu poziciju i spremite \\\"Save\\\"", + "cover.saved": "Spremljeno" +} \ No newline at end of file diff --git a/public/language/hr/notifications.json b/public/language/hr/notifications.json new file mode 100644 index 0000000000..ba6c3cd24e --- /dev/null +++ b/public/language/hr/notifications.json @@ -0,0 +1,48 @@ +{ + "title": "Obavijesti", + "no_notifs": "Nema novih obavijesti", + "see_all": "Pogledaj sve obavijesti", + "mark_all_read": "Označi sve obavijesti kao pročitane", + "back_to_home": "Povratak na %1", + "outgoing_link": "Odlazna poveznica", + "outgoing_link_message": "Napuštate %1", + "continue_to": "Nastavite na %1", + "return_to": "Vratite se na %1", + "new_notification": "Nova obavijest", + "you_have_unread_notifications": "Nepročitane obavijesti.", + "all": "Sve", + "topics": "Teme", + "replies": "Odgovori", + "chat": "Razgovori", + "follows": "Pratitelji", + "upvote": "Glasači za", + "new-flags": "Nove zastave", + "my-flags": "Zastave označene na mene", + "bans": "Blokirani", + "new_message_from": "Poruka od %1", + "upvoted_your_post_in": "%1 je glasao za u %2.", + "upvoted_your_post_in_dual": "%1 i %2 Glasalo je za Vašu objavu in %3.", + "upvoted_your_post_in_multiple": "%1 i %2 ostalih glasalo je za Vašu objavu %3.", + "moved_your_post": "%1 je premjestio Vašu objavu u %2", + "moved_your_topic": "%1 je premjestio %2", + "user_flagged_post_in": "%1 je označio objavu u %2", + "user_flagged_post_in_dual": "%1 i %2 označio objavu u %3", + "user_flagged_post_in_multiple": "%1 i %2 ostalih označio objavu u %3", + "user_flagged_user": "%1 označio je profil (%2)", + "user_flagged_user_dual": "%1 i %2su označili profil (%3)", + "user_flagged_user_multiple": "%1 i %2 ostalih su označili korisnički profil (%3)", + "user_posted_to": "%1 i %2 su odgovorili na: %3", + "user_posted_to_dual": "%1 i %2 ostalih su odgovorili na objavu u: %3", + "user_posted_to_multiple": "%1 i %2 drugih su odgovorili na: %3", + "user_posted_topic": "%1 je otvorio novu temu: %2", + "user_started_following_you": "%1 Vas sada prati.", + "user_started_following_you_dual": "%1 i %2 vas sada prate.", + "user_started_following_you_multiple": "%1 i %2 ostalih vas sada prate.", + "new_register": "%1 je poslao zahtjev za registraciju.", + "new_register_multiple": "%1 registracija čeka odobrenje.", + "flag_assigned_to_you": "Zastava%1 je dodijeljena vama.", + "email-confirmed": "Email potvrđen", + "email-confirmed-message": "Hvala na potvrdi emaila. Vaš račun je sada aktivan.", + "email-confirm-error-message": "Nastao je problem pri potvrdi Vaše email adrese. Provjerite kod ili zatražite novi.", + "email-confirm-sent": "Provjera korisničkog emaila poslana." +} \ No newline at end of file diff --git a/public/language/hr/pages.json b/public/language/hr/pages.json new file mode 100644 index 0000000000..76cd7ae518 --- /dev/null +++ b/public/language/hr/pages.json @@ -0,0 +1,52 @@ +{ + "home": "Naslovna", + "unread": "Nepročitane teme", + "popular-day": "Popularne teme danas", + "popular-week": "Popularne teme ovaj tjedan", + "popular-month": "Popularne teme ovaj mjesec", + "popular-alltime": "Najpopularnije teme ", + "recent": "Nedavne teme", + "flagged-content": "Označene objave", + "ip-blacklist": "IP crna lista", + "users/online": "Online korisnici", + "users/latest": "Posljednji korisnici", + "users/sort-posts": "Korisnici s najviše objava", + "users/sort-reputation": "Korisnici s najvećom reputacijom", + "users/banned": "Blokirani korisnici", + "users/most-flags": "Najviše označeni korisnici", + "users/search": "Pretraga korisnika", + "notifications": "Obavijesti", + "tags": "Oznake", + "tag": "Teme označene pod \\\"%1\\\"", + "register": "Registrirajte se", + "registration-complete": "Registracija uspješna", + "login": "Prijavite se na Vaš račun", + "reset": "Promijenite lozinku", + "categories": "Kategorije", + "groups": "Grupe", + "group": "%1 grupa", + "chats": "Razgovori", + "chat": "Razgovor s %1", + "flags": "Zastave", + "flag-details": "Detalji zastave %1", + "account/edit": "Uređivanje \\\"%1\\\"", + "account/edit/password": "Uređivanje lozinke \\\"%1\\", + "account/edit/username": "Uređivanje korisnika \\\"%1\\\"", + "account/edit/email": "Uređivanje email \\\"%1\\\"", + "account/info": "Informacija o računu", + "account/following": "Ljudi %1 prati", + "account/followers": "Ljudi koji prate %1", + "account/posts": "Objavio %1", + "account/topics": "Teme od %1", + "account/groups": "%1 grupe", + "account/bookmarks": "%1 zabilježene objave", + "account/settings": "Korisničke postavke", + "account/watched": "Teme prati %1", + "account/upvoted": "%1 glasao za", + "account/downvoted": "%1 glasao protiv", + "account/best": "Najbolje objave od %1", + "confirm": "Email potvrđen!", + "maintenance.text": "%1 Održavanje u toku. Posjetite nas uskoro.", + "maintenance.messageIntro": "Poruka administratora:", + "throttled.text": "%1: Preopterećenje sustava. Pričekajte nekoliko trenutaka." +} \ No newline at end of file diff --git a/public/language/hr/recent.json b/public/language/hr/recent.json new file mode 100644 index 0000000000..ac247883e2 --- /dev/null +++ b/public/language/hr/recent.json @@ -0,0 +1,19 @@ +{ + "title": "Nedavno", + "day": "Dan", + "week": "Tjedan", + "month": "Mjesec", + "year": "Godina", + "alltime": "Sve vrijeme", + "no_recent_topics": "Nema nedavnih tema.", + "no_popular_topics": "Nema popularnih tema.", + "there-is-a-new-topic": "Nova tema.", + "there-is-a-new-topic-and-a-new-post": "Nova tema i nova objava.", + "there-is-a-new-topic-and-new-posts": "Nova tema i %1 nova objava", + "there-are-new-topics": "%1 nova tema", + "there-are-new-topics-and-a-new-post": "%1 nova tema i nova objava", + "there-are-new-topics-and-new-posts": "%1 nova tema i %2 nova objava", + "there-is-a-new-post": "Nova objava.", + "there-are-new-posts": "%1 nova objava.", + "click-here-to-reload": "Klikni ovdje za ponovno učitavanje." +} \ No newline at end of file diff --git a/public/language/hr/register.json b/public/language/hr/register.json new file mode 100644 index 0000000000..a518352cf3 --- /dev/null +++ b/public/language/hr/register.json @@ -0,0 +1,23 @@ +{ + "register": "Registracija", + "cancel_registration": "Obustavi registraciju", + "help.email": "Vaš email će biti skriven od javnosti.", + "help.username_restrictions": "Unikatno korisničko ime između %1 i %2 znaka. Ostali Vas mogu spomenuti sa @username.", + "help.minimum_password_length": "Dužina lozinke mora biti %1 znakova.", + "email_address": "Email adresa", + "email_address_placeholder": "Unesite email adresu", + "username": "Korisničko ime", + "username_placeholder": "Unesite korisničko ime", + "password": "Lozinka", + "password_placeholder": "Unesite lozinku", + "confirm_password": "Potvrdite lozinku", + "confirm_password_placeholder": "Potvrdite lozinku", + "register_now_button": "Registrirajte se", + "alternative_registration": "Alternativna registracija:", + "terms_of_use": "Uvjeti korištenja", + "agree_to_terms_of_use": "Prihvaćam uvjete korištenja", + "terms_of_use_error": "Morate prihvatiti uvjete korištenja", + "registration-added-to-queue": "Vaša registracija je dodana u listu zahtjeva za registraciju. Biti ćete obaviješteni kad Vas administrator prihvati.", + "interstitial.intro": "Treba nam još par dodatnih informacija prije nego kreirate novi račun.", + "interstitial.errors-found": "Nismo uspijeli dovršiti registraciju:" +} \ No newline at end of file diff --git a/public/language/hr/reset_password.json b/public/language/hr/reset_password.json new file mode 100644 index 0000000000..a815beb932 --- /dev/null +++ b/public/language/hr/reset_password.json @@ -0,0 +1,17 @@ +{ + "reset_password": "Resetiranje lozinke", + "update_password": "Promjeni lozinku", + "password_changed.title": "Lozinka promijenjena", + "password_changed.message": "

Lozink uspješno promijenjena, prijavite se ponovno!.", + "wrong_reset_code.title": "Netočan kod za resetiranje", + "wrong_reset_code.message": "Netočan kod za resetiranje. Probaj ponovno ili zatraži novi kod.", + "new_password": "Nova lozinka", + "repeat_password": "Potvrdi lozinku", + "enter_email": "Unesite Vašu email adresu i poslati ćemo Vam email sa uputstvima kako resetirati lozinku.", + "enter_email_address": "Unesite email adresu", + "password_reset_sent": "Poslan je zahtjev za resetiranje lozinke", + "invalid_email": "Netočan email / email ne postoji!", + "password_too_short": "Lozinka koju ste unijeli je prekratka, izaberite drugu lozinku.", + "passwords_do_not_match": "Lozinke se ne podudaraju!", + "password_expired": "Vaša lozinka je istekla, izaberite novu lozinku" +} \ No newline at end of file diff --git a/public/language/hr/search.json b/public/language/hr/search.json new file mode 100644 index 0000000000..a2e5fddedd --- /dev/null +++ b/public/language/hr/search.json @@ -0,0 +1,42 @@ +{ + "results_matching": "%1 rezultat odgovara \"%2\", (%3 sekunde)", + "no-matches": "Nema rezultata", + "advanced-search": "Napredna pretraga", + "in": "U", + "titles": "Naslovi", + "titles-posts": "Naslovi i objave", + "posted-by": "Objavio", + "in-categories": "U kategoriji", + "search-child-categories": "Pretraži podkategorije", + "has-tags": "Ima oznake", + "reply-count": "Broj odgovora", + "at-least": "Najmanje", + "at-most": "Najviše", + "relevance": "Relevantno", + "post-time": "Vrijeme objave", + "newer-than": "Novije od", + "older-than": "Starije od", + "any-date": "Bilo kada", + "yesterday": "Jučer", + "one-week": "Tjedan", + "two-weeks": "Dva tjedna", + "one-month": "Mjesec", + "three-months": "Tri mjeseca", + "six-months": "Šest mjeseci", + "one-year": "Godina", + "sort-by": "Sortiraj po", + "last-reply-time": "Vrijeme zadnje odgovora", + "topic-title": "Naslov teme", + "number-of-replies": "Broj odgovora", + "number-of-views": "Broj pogleda", + "topic-start-date": "Početak teme", + "username": "Korisničko ime", + "category": "Kategorija", + "descending": "U silaznom redu", + "ascending": "Po uzlaznom redu", + "save-preferences": "Spremi postavke", + "clear-preferences": "Očisti postavke", + "search-preferences-saved": "Postavke pretraživanja spremljene", + "search-preferences-cleared": "Postavke pretraživanja očišćene ", + "show-results-as": "Prikaži rezultate kao" +} \ No newline at end of file diff --git a/public/language/hr/success.json b/public/language/hr/success.json new file mode 100644 index 0000000000..55b303fba9 --- /dev/null +++ b/public/language/hr/success.json @@ -0,0 +1,6 @@ +{ + "success": "Uspijeh", + "topic-post": "Uspješna objava", + "authentication-successful": "Autentifikacija uspješna", + "settings-saved": "Postavke spremljene!" +} \ No newline at end of file diff --git a/public/language/hr/tags.json b/public/language/hr/tags.json new file mode 100644 index 0000000000..ba0b9b5495 --- /dev/null +++ b/public/language/hr/tags.json @@ -0,0 +1,7 @@ +{ + "no_tag_topics": "Nema tema sa ovom oznakom", + "tags": "Oznake", + "enter_tags_here": "Unesite oznake, između %1 i %2 znaka.", + "enter_tags_here_short": "Unestie oznake ...", + "no_tags": "Još nema oznaka." +} \ No newline at end of file diff --git a/public/language/hr/topic.json b/public/language/hr/topic.json new file mode 100644 index 0000000000..39315c4255 --- /dev/null +++ b/public/language/hr/topic.json @@ -0,0 +1,120 @@ +{ + "topic": "Tema", + "topic_id": "ID Teme", + "topic_id_placeholder": "Unesite ID teme", + "no_topics_found": "Tema nije pronađena!", + "no_posts_found": "Objave nisu pronađene!", + "post_is_deleted": "Ova objava je obrisana!", + "topic_is_deleted": "Ova tema je obrisana!", + "profile": "Profil", + "posted_by": "Objavio %1", + "posted_by_guest": "Objavio gost", + "chat": "Razgovor", + "notify_me": "Budi obavješten o novim odgovorima na ovu temu", + "quote": "Citat", + "reply": "Odgovor", + "replies_to_this_post": "%1 je odgovorio", + "one_reply_to_this_post": "1 Reply", + "last_reply_time": "Zadnji odgovor", + "reply-as-topic": "Odgovori kao temu", + "guest-login-reply": "Prijavi se za objavu", + "edit": "Uredi", + "delete": "Obriši", + "purge": "Očisti sve", + "restore": "Obnovi", + "move": "Premjesti", + "fork": "Dupliraj", + "link": "Poveznica", + "share": "Podijeli", + "tools": "Alati", + "locked": "Zaključano", + "pinned": "Zakačeno", + "moved": "Premješteno", + "bookmark_instructions": "Klikni ovdje za povratak na zadnji pročitani post.", + "flag_title": "Označi ovaj post za zastavom za moderaciju", + "deleted_message": "Ova tema je obrisana. Samo korisnici sa privilegijom upravljanja tema je mogu vidjeti.", + "following_topic.message": "Od sada ćete primati obavijesti kada netko objavi objavu u ovoj temi.", + "not_following_topic.message": "Od sada ćete vidjeti ovu temu u popisu nepročitanih tema,ali nećete dobivati obavijesti kada netko objavi objavu u temi.", + "ignoring_topic.message": "Od sada više nećete vidjeti ovu temu u popisu nepročitanih tema.Bit će te obaviješteni kada ste spomenuti ili je netko glasao za vašu objavu.", + "login_to_subscribe": "Registriraj se ili prijavi kako bi se mogao pretplatit na ovu temu.", + "markAsUnreadForAll.success": "Tema označena kao nepročitana za sve.", + "mark_unread": "Označi kao nepročitano", + "mark_unread.success": "Tema označena kao nepročitana", + "watch": "Prati", + "unwatch": "Prestani pratiti", + "watch.title": "Budi obaviješten o novim objavama u ovoj temi", + "unwatch.title": "Prestani pratiti ovu temu", + "share_this_post": "Podijeli ovu objavu", + "watching": "Prati", + "not-watching": "Ne pratiš", + "ignoring": "Ignoriraš", + "watching.description": "Obavijesti me o novim odgovorima .
Prikaži temu u nepročitanim ako kategorija nije ignorirana.", + "ignoring.description": "Nemoj slati obavijesti o novim odgovorima.
Ne prikazuj temu u nepročitanom.", + "thread_tools.title": "Alati teme", + "thread_tools.markAsUnreadForAll": "Označi kao nepročitano za sve", + "thread_tools.pin": "Zakači temu", + "thread_tools.unpin": "Otkači temu", + "thread_tools.lock": "Zaključaj temu", + "thread_tools.unlock": "Odključaj temu", + "thread_tools.move": "Premjesti temu", + "thread_tools.move_all": "Premjesti sve", + "thread_tools.fork": "Dupliraj temu", + "thread_tools.delete": "Obriši temu", + "thread_tools.delete-posts": "Obriši objavu", + "thread_tools.delete_confirm": "Sigurni ste da želite obrisati ovu temu?", + "thread_tools.restore": "Povrati temu", + "thread_tools.restore_confirm": "Sigurni ste da želite povratiti ovu temu?", + "thread_tools.purge": "Odbaci temu", + "thread_tools.purge_confirm": "Sigurni ste da želite odbaciti ovu temu?", + "topic_move_success": "Tema je uspješno pomaknuta u %1", + "post_delete_confirm": "Sigurni ste da želite obrisati ovu objavu?", + "post_restore_confirm": "Sigurni ste da želite povratiti ovu objavu?", + "post_purge_confirm": "Sigurni ste da želite odbaciti ovu objavu?", + "load_categories": "Učitavam kategorije", + "disabled_categories_note": "Onemogućene kategorije su izbljeđene", + "confirm_move": "Pomakni", + "confirm_fork": "Dupliraj", + "bookmark": "Zabilježi", + "bookmarks": "Zabilješke", + "bookmarks.has_no_bookmarks": "Nemate zabiježenih objava.", + "loading_more_posts": "Učitavam više objava", + "move_topic": "Pomakni temu", + "move_topics": "Pomakni teme", + "move_post": "Pomakni objavu", + "post_moved": "Objava pomaknuta!", + "fork_topic": "Dupliraj temu", + "topic_will_be_moved_to": "Ova tem će biti pomaknuta u kategoriju", + "fork_topic_instruction": "Označi objave koje želite duplirati", + "fork_no_pids": "Objave nisu odabrane!", + "fork_pid_count": "%1 objava odabrana", + "fork_success": "Uspješno duplirana tema. Kliknite ovdje za dupliranu temu.", + "delete_posts_instruction": "Označite objave koje želite obrisati/odbaciti", + "composer.title_placeholder": "Unesite naslov teme ovdje ...", + "composer.handle_placeholder": "Ime", + "composer.discard": "Odbaci", + "composer.submit": "Podnesi", + "composer.replying_to": "Odgovori na %1", + "composer.new_topic": "Nova tema", + "composer.uploading": "slanje...", + "composer.thumb_url_label": "Zaljepite URL slike za temu", + "composer.thumb_title": "Dodajte slike ovoj temi", + "composer.thumb_url_placeholder": "http://example.com/thumb.png", + "composer.thumb_file_label": "Ili učitajte datoteku", + "composer.thumb_remove": "Očisti polja", + "composer.drag_and_drop_images": "Dovuci i pusti sliku ovdje", + "more_users_and_guests": "%1 korisnik i %2 gosta", + "more_users": "%1 korisnik", + "more_guests": "%1 gost", + "users_and_others": "%1 i %2 druga", + "sort_by": "Sortitaj po", + "oldest_to_newest": "Starije prema Novom", + "newest_to_oldest": "Novije prema Starom", + "most_votes": "Najviše glasova", + "most_posts": "Najviše objava", + "stale.title": "Otvori novu temu?", + "stale.warning": "Tema na koju odgovarate je stara. Želite li otvoriti novu temu i postaviti referencu u vašem odgovoru?", + "stale.create": "Otvori novu temu", + "stale.reply_anyway": "Odgovori na ovu temu svejedno", + "link_back": "Re: [%1](%2)" +} \ No newline at end of file diff --git a/public/language/hr/unread.json b/public/language/hr/unread.json new file mode 100644 index 0000000000..2d8bd2128a --- /dev/null +++ b/public/language/hr/unread.json @@ -0,0 +1,13 @@ +{ + "title": "Nepročitano", + "no_unread_topics": "Sve teme su pročitane", + "load_more": "Učitaj više", + "mark_as_read": "Označi kao pročitano", + "selected": "Odabrano", + "all": "Sve", + "all_categories": "Sve kategorije", + "topics_marked_as_read.success": "Teme označene kao pročitane!", + "all-topics": "Sve teme", + "new-topics": "Nove teme", + "watched-topics": "Praćene teme" +} \ No newline at end of file diff --git a/public/language/hr/uploads.json b/public/language/hr/uploads.json new file mode 100644 index 0000000000..6a3655ad9b --- /dev/null +++ b/public/language/hr/uploads.json @@ -0,0 +1,6 @@ +{ + "uploading-file": "Učitavam datoteku ...", + "select-file-to-upload": "Izaberite datoteku!", + "upload-success": "Prijenos datoteka uspješan!", + "maximum-file-size": "Maksimum %1 kb" +} \ No newline at end of file diff --git a/public/language/hr/user.json b/public/language/hr/user.json new file mode 100644 index 0000000000..20ad62ec30 --- /dev/null +++ b/public/language/hr/user.json @@ -0,0 +1,136 @@ +{ + "banned": "Blokiran", + "offline": "Nije na mreži", + "username": "Korisničko ime", + "joindate": "Datum prijave", + "postcount": "Broj objava", + "email": "Email", + "confirm_email": "Potvrdi email", + "account_info": "Informacije o računu", + "ban_account": "Blokiraj račun", + "ban_account_confirm": "Da li zaista želite blokirati ovog korisnika", + "unban_account": "Odblokiraj račun", + "delete_account": "Obriši račun", + "delete_account_confirm": "Jeste li sigurni da želite obrisati vaš račun?
Ova radnja je nepovratna i nećete više moći pristupiti vašim podacima

Upišite svoje korisničko ime za potvrdu brisanja računa.", + "delete_this_account_confirm": "Jeste li sigurni da želite obrisati vaš račun?
Ova radnja je nepovratna i nećete više moći pristupiti vašim podacima

", + "account-deleted": "Račun obrisan", + "fullname": "Puno ime", + "website": "Web stranica", + "location": "Lokacija", + "age": "Dob", + "joined": "Priključio", + "lastonline": "Viđen na mreži", + "profile": "Profil", + "profile_views": "Pregled profila", + "reputation": "Reputacija", + "bookmarks": "Zabilješke", + "watched": "Gledano", + "followers": "Pratitelji", + "following": "Prati", + "aboutme": "O meni", + "signature": "Potpis", + "birthday": "Rođendan", + "chat": "Razgovor", + "chat_with": "Nastavi razgovor sa %1!", + "new_chat_with": "Pokreni novi razgovor sa %1", + "flag-profile": "Označi profil", + "follow": "Prati", + "unfollow": "Prestani pratiti", + "more": "Više", + "profile_update_success": "Profil je uspješno promijenjen!", + "change_picture": "Promjeni sliku", + "change_username": "Promjeni korisničko ime", + "change_email": "Promjeni email", + "edit": "Uredi", + "edit-profile": "Uredi profil", + "default_picture": "Zadana ikona", + "uploaded_picture": "Učitaj sliku", + "upload_new_picture": "Učitaj novu sliku", + "upload_new_picture_from_url": "Učitaj sliku iz URL", + "current_password": "Sadašnja lozinka", + "change_password": "Promjeni lozinku", + "change_password_error": "Netočna lozinka!", + "change_password_error_wrong_current": "Vaša trenutačna lozinka nije točna!", + "change_password_error_length": "Lozinka prekratka!", + "change_password_error_match": "Lozinke se moraju podudarati!", + "change_password_error_privileges": "Nemate pravo mijenjati ovu lozinku.", + "change_password_success": "Vaša lozinka je promijenjena!", + "confirm_password": "Potvrdi lozinku", + "password": "Lozinka", + "username_taken_workaround": "Korisničko ime koje ste izabrali je već zauzeto. Zbog toga smo ga malo promjenili. Sada je vaše korisničko ime%1", + "password_same_as_username": "Vaša lozinka je ista kao i vaše korisničko ime, molimo upišite drugu lozinku.", + "password_same_as_email": "Vaša lozinka je ista kao vaš email, molimo upišite drugu lozinku.", + "weak_password": "Slaba lozinka", + "upload_picture": "Učitaj sliku", + "upload_a_picture": "Učitaj sliku", + "remove_uploaded_picture": "Ukloni učitanu sliku", + "upload_cover_picture": "Učitaj naslovnu sliku", + "remove_cover_picture_confirm": "Jeste li sigurno da želite ukloniti naslovnu sliku", + "crop_picture": "Skratite sliku", + "upload_cropped_picture": "Skrati i učitaj", + "settings": "Postavke", + "show_email": "Prikaži email", + "show_fullname": "Prikaži puno ime", + "restrict_chats": "Dopusti poruke o korisnika koje pratim", + "digest_label": "Pretplati se na izvještaje", + "digest_description": "Pretplati se na email izvještaje od ovog foruma (nove obavjesti i teme) prema zadanom rasporedu", + "digest_off": "Isključi", + "digest_daily": "Dnevno", + "digest_weekly": "Tjedno", + "digest_monthly": "Mjesečno", + "send_chat_notifications": "Pošalji email ako stigne nova poruka i nisam na mreži", + "send_post_notifications": "Pošalji email kada se objavi odgovor na teme koje sam pretplaćen", + "settings-require-reload": "Neke promjene zahtjevaju osvježenje. Kliknite ovdje za osvježavanje stranice.", + "has_no_follower": "Ovaj korisnik nema pratitelja :(.", + "follows_no_one": "Ovaj korisnik nikog ne prati :(", + "has_no_posts": "Ovaj korisnik nema objava.", + "has_no_topics": "Ovaj korisnik nema objavljenih tema.", + "has_no_watched_topics": "Ovaj korisnik ne prati teme.", + "has_no_upvoted_posts": "Ovaj korisnik nije glasao za na objavama.", + "has_no_downvoted_posts": "Ovaj korisnik nije glasao protiv na objavama.", + "has_no_voted_posts": "Ovaj korisnik nema glasanih objava", + "email_hidden": "Email sakriven", + "hidden": "Sakriven", + "paginate_description": "Numeriraj teme i objave umjesto scrollanja", + "topics_per_page": "Teme po stranici", + "posts_per_page": "Objave po stranici", + "notification_sounds": "Sviraj zvuk kada primim obavijest", + "notifications_and_sounds": "Obavijesti i zvukovi", + "incoming-message-sound": "Zvuk nadolazećih poruka", + "outgoing-message-sound": "Zvuk odlazećih poruka", + "notification-sound": "Zvuk obavijesti", + "no-sound": "Bez zvuka", + "browsing": "Postavke pretraživanja", + "open_links_in_new_tab": "Otvori odlazne poveznice u novom tabu", + "enable_topic_searching": "Omogući pretragu unutar tema", + "topic_search_help": "Ako uključeno,pretraga unutar tema će zamijeniti pretragu ključnih riječi vašeg pretraživača kojemu je omogućeno pretraživanje samo onoga što je na ekranu,za razliku od ove opcije koja omogućava pretragu na cijeloj temi", + "delay_image_loading": "Odgodi učitavanje slika.", + "image_load_delay_help": "Ako omogućeno,slike u ovoj temi se neće učitavati dok nisu u potpunosti unutar ruba ekrana.", + "scroll_to_my_post": "Nakon objavljivanja,prikaži objavu", + "follow_topics_you_reply_to": "Prati teme na koje objavljuješ", + "follow_topics_you_create": "Prati teme koje si napravio", + "grouptitle": "Ime Grupe", + "no-group-title": "Nema imena grupe", + "select-skin": "Izaberi izgled", + "select-homepage": "Izaberi naslovnu", + "homepage": "Naslovna", + "homepage_description": "Izaberi stranicu ", + "custom_route": "Uobičajena putanja naslovnice", + "custom_route_help": "Izaberi ime putanje ovdje", + "sso.title": "Jednokratne usluge prijave", + "sso.associated": "Povezano sa", + "sso.not-associated": "Klikni ovdje za povezivanje sa", + "info.latest-flags": "Zadnja zastava", + "info.no-flags": "Nema objava sa zastavama", + "info.ban-history": "Povijest nedavno blokiranih", + "info.no-ban-history": "Ovaj korisnik nikad nije bio blokiran", + "info.banned-until": "Blokiran do %1!", + "info.banned-permanently": "Trajno blokiran", + "info.banned-reason-label": "Razlog", + "info.banned-no-reason": "Razlog nije dan.", + "info.username-history": "Povijest korisničkog imena", + "info.email-history": "Povijest emaila", + "info.moderation-note": "Poruka moderiranja", + "info.moderation-note.success": "Poruka moderiranja spremljena", + "info.moderation-note.add": "Dodaj bilješku" +} \ No newline at end of file diff --git a/public/language/hr/users.json b/public/language/hr/users.json new file mode 100644 index 0000000000..cafe2c0412 --- /dev/null +++ b/public/language/hr/users.json @@ -0,0 +1,21 @@ +{ + "latest_users": "Posljednji korisnici", + "top_posters": "Najviše objava", + "most_reputation": "Najveća reputacija", + "most_flags": "Najviše zastava", + "search": "Pretraga", + "enter_username": "Unesi korisničko ime za pretragu", + "load_more": "Učitaj više", + "users-found-search-took": "%1user(s) pronađeni! Pretraga je trajala %2 sekundi.", + "filter-by": "Filtriraj po", + "online-only": "Samo na mreži", + "invite": "Pozovi", + "invitation-email-sent": "Pozivnica poslana %1", + "user_list": "Popis korisnika", + "recent_topics": "Zadnje teme", + "popular_topics": "Popularne teme", + "unread_topics": "Nepročitane teme", + "categories": "Kategorije", + "tags": "Tagovi", + "no-users-found": "Korisnici nisu pronađeni!" +} \ No newline at end of file diff --git a/public/language/hu/admin/appearance/customise.json b/public/language/hu/admin/appearance/customise.json index 767d443e29..5095f7a937 100644 --- a/public/language/hu/admin/appearance/customise.json +++ b/public/language/hu/admin/appearance/customise.json @@ -5,5 +5,8 @@ "custom-header": "Custom Header", "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", - "custom-header.enable": "Enable Custom Header" + "custom-header.enable": "Enable Custom Header", + + "custom-css.livereload": "Enable Live Reload", + "custom-css.livereload.description": "Enable this to force all sessions on every device under your account to refresh whenever you click save" } \ No newline at end of file diff --git a/public/language/hu/admin/development/info.json b/public/language/hu/admin/development/info.json index b2768ca212..0a4ae6fe2c 100644 --- a/public/language/hu/admin/development/info.json +++ b/public/language/hu/admin/development/info.json @@ -1,10 +1,12 @@ { "you-are-on": "Info - You are on %1:%2", + "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", "pid": "pid", "nodejs": "nodejs", "online": "online", "git": "git", + "memory": "memory", "load": "load", "uptime": "uptime", diff --git a/public/language/hu/admin/general/dashboard.json b/public/language/hu/admin/general/dashboard.json index 02046bd17a..61f4421fb5 100644 --- a/public/language/hu/admin/general/dashboard.json +++ b/public/language/hu/admin/general/dashboard.json @@ -5,9 +5,14 @@ "users": "Users", "posts": "Posts", "topics": "Topics", - "page-views-last-month": "Page views Last Month", - "page-views-this-month": "Page views This Month", - "page-views-last-day": "Page views in last 24 hours", + "page-views-seven": "Last 7 Days", + "page-views-thirty": "Last 30 Days", + "page-views-last-day": "Last 24 hours", + "page-views-custom": "Custom Date Range", + "page-views-custom-start": "Range Start", + "page-views-custom-end": "Range End", + "page-views-custom-help": "Enter a date range of page views you would like to view. If no date picker is available, the accepted format is YYYY-MM-DD", + "page-views-custom-error": "Please enter a valid date range in the format YYYY-MM-DD", "stats.day": "Day", "stats.week": "Week", diff --git a/public/language/hu/admin/general/languages.json b/public/language/hu/admin/general/languages.json index da45cade2c..bdd57849b3 100644 --- a/public/language/hu/admin/general/languages.json +++ b/public/language/hu/admin/general/languages.json @@ -1,5 +1,6 @@ { "language-settings": "Language Settings", "description": "The default language determines the language settings for all users who are visiting your forum.
Individual users can override the default language on their account settings page.", - "default-language": "Default Language" + "default-language": "Default Language", + "auto-detect": "Auto Detect Language Setting for Guests" } \ No newline at end of file diff --git a/public/language/hu/admin/settings/user.json b/public/language/hu/admin/settings/user.json index b8f51c9288..fa8049c3a9 100644 --- a/public/language/hu/admin/settings/user.json +++ b/public/language/hu/admin/settings/user.json @@ -34,6 +34,8 @@ "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", + "invite-expiration": "Invite expiration", + "invite-expiration-help": "# of days invitations expire in.", "min-username-length": "Minimum Username Length", "max-username-length": "Maximum Username Length", "min-password-length": "Minimum Password Length", diff --git a/public/language/hu/error.json b/public/language/hu/error.json index 2741e13087..14e34a907c 100644 --- a/public/language/hu/error.json +++ b/public/language/hu/error.json @@ -1,5 +1,6 @@ { "invalid-data": "Érvénytelen adat", + "invalid-json": "Invalid JSON", "not-logged-in": "Úgy tűnik, nem vagy bejelentkezve.", "account-locked": "A fiókod ideiglenesen zárolva lett.", "search-requires-login": "Searching requires an account - please login or register.", @@ -12,6 +13,7 @@ "invalid-title": "Érvénytelen cím!", "invalid-user-data": "Érvénytelen felhasználói adatok", "invalid-password": "Érvénytelen jelszó", + "invalid-login-credentials": "Invalid login credentials", "invalid-username-or-password": "Kérlek adj meg egy felhasználónevet és egy jelszót", "invalid-search-term": "Érvénytelen keresési feltétel", "csrf-invalid": "We were unable to log you in, likely due to an expired session. Please try again", diff --git a/public/language/hu/topic.json b/public/language/hu/topic.json index 1a67ce9b46..277bcc8354 100644 --- a/public/language/hu/topic.json +++ b/public/language/hu/topic.json @@ -14,6 +14,7 @@ "quote": "Idéz", "reply": "Válasz", "replies_to_this_post": "%1 Replies", + "one_reply_to_this_post": "1 Reply", "last_reply_time": "Last reply", "reply-as-topic": "Reply as topic", "guest-login-reply": "Log in to reply", diff --git a/public/language/id/admin/appearance/customise.json b/public/language/id/admin/appearance/customise.json index 767d443e29..5095f7a937 100644 --- a/public/language/id/admin/appearance/customise.json +++ b/public/language/id/admin/appearance/customise.json @@ -5,5 +5,8 @@ "custom-header": "Custom Header", "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", - "custom-header.enable": "Enable Custom Header" + "custom-header.enable": "Enable Custom Header", + + "custom-css.livereload": "Enable Live Reload", + "custom-css.livereload.description": "Enable this to force all sessions on every device under your account to refresh whenever you click save" } \ No newline at end of file diff --git a/public/language/id/admin/development/info.json b/public/language/id/admin/development/info.json index b2768ca212..0a4ae6fe2c 100644 --- a/public/language/id/admin/development/info.json +++ b/public/language/id/admin/development/info.json @@ -1,10 +1,12 @@ { "you-are-on": "Info - You are on %1:%2", + "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", "pid": "pid", "nodejs": "nodejs", "online": "online", "git": "git", + "memory": "memory", "load": "load", "uptime": "uptime", diff --git a/public/language/id/admin/general/dashboard.json b/public/language/id/admin/general/dashboard.json index 02046bd17a..61f4421fb5 100644 --- a/public/language/id/admin/general/dashboard.json +++ b/public/language/id/admin/general/dashboard.json @@ -5,9 +5,14 @@ "users": "Users", "posts": "Posts", "topics": "Topics", - "page-views-last-month": "Page views Last Month", - "page-views-this-month": "Page views This Month", - "page-views-last-day": "Page views in last 24 hours", + "page-views-seven": "Last 7 Days", + "page-views-thirty": "Last 30 Days", + "page-views-last-day": "Last 24 hours", + "page-views-custom": "Custom Date Range", + "page-views-custom-start": "Range Start", + "page-views-custom-end": "Range End", + "page-views-custom-help": "Enter a date range of page views you would like to view. If no date picker is available, the accepted format is YYYY-MM-DD", + "page-views-custom-error": "Please enter a valid date range in the format YYYY-MM-DD", "stats.day": "Day", "stats.week": "Week", diff --git a/public/language/id/admin/general/languages.json b/public/language/id/admin/general/languages.json index da45cade2c..bdd57849b3 100644 --- a/public/language/id/admin/general/languages.json +++ b/public/language/id/admin/general/languages.json @@ -1,5 +1,6 @@ { "language-settings": "Language Settings", "description": "The default language determines the language settings for all users who are visiting your forum.
Individual users can override the default language on their account settings page.", - "default-language": "Default Language" + "default-language": "Default Language", + "auto-detect": "Auto Detect Language Setting for Guests" } \ No newline at end of file diff --git a/public/language/id/admin/settings/user.json b/public/language/id/admin/settings/user.json index b8f51c9288..fa8049c3a9 100644 --- a/public/language/id/admin/settings/user.json +++ b/public/language/id/admin/settings/user.json @@ -34,6 +34,8 @@ "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", + "invite-expiration": "Invite expiration", + "invite-expiration-help": "# of days invitations expire in.", "min-username-length": "Minimum Username Length", "max-username-length": "Maximum Username Length", "min-password-length": "Minimum Password Length", diff --git a/public/language/id/error.json b/public/language/id/error.json index 18c53d69f5..9b7a820a07 100644 --- a/public/language/id/error.json +++ b/public/language/id/error.json @@ -1,5 +1,6 @@ { "invalid-data": "Data Salah", + "invalid-json": "Invalid JSON", "not-logged-in": "Kamu terlihat belum login", "account-locked": "Akun kamu dikunci sementara", "search-requires-login": "Searching requires an account - please login or register.", @@ -12,6 +13,7 @@ "invalid-title": "Judul Salah", "invalid-user-data": "Data Pengguna Salah", "invalid-password": "Password Salah", + "invalid-login-credentials": "Invalid login credentials", "invalid-username-or-password": "Mohon spesifikasikan username dan password", "invalid-search-term": "Kata pencarian salah", "csrf-invalid": "We were unable to log you in, likely due to an expired session. Please try again", diff --git a/public/language/id/topic.json b/public/language/id/topic.json index abb48888eb..08a39598d6 100644 --- a/public/language/id/topic.json +++ b/public/language/id/topic.json @@ -14,6 +14,7 @@ "quote": "Kutip", "reply": "Balas", "replies_to_this_post": "%1 Replies", + "one_reply_to_this_post": "1 Reply", "last_reply_time": "Last reply", "reply-as-topic": "Reply as topic", "guest-login-reply": "Log in untuk membalas", diff --git a/public/language/it/admin/appearance/customise.json b/public/language/it/admin/appearance/customise.json index c97943fd6f..c5eb9568ef 100644 --- a/public/language/it/admin/appearance/customise.json +++ b/public/language/it/admin/appearance/customise.json @@ -5,5 +5,8 @@ "custom-header": "Intestazione Personalizzata", "custom-header.description": "Inserisci l' HTML personalizzato qui (es. JavaScript, Meta Tags, ecc.), verrà attaccato al codice <head> sezione del markup del tuo forum", - "custom-header.enable": "Abilita l'Intestazione Personalizzata" + "custom-header.enable": "Abilita l'Intestazione Personalizzata", + + "custom-css.livereload": "Enable Live Reload", + "custom-css.livereload.description": "Enable this to force all sessions on every device under your account to refresh whenever you click save" } \ No newline at end of file diff --git a/public/language/it/admin/development/info.json b/public/language/it/admin/development/info.json index 38e991ebd6..0b3f1c8d37 100644 --- a/public/language/it/admin/development/info.json +++ b/public/language/it/admin/development/info.json @@ -1,10 +1,12 @@ { "you-are-on": "Informazione - Tu sei su %1:%2", + "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", "pid": "pid", "nodejs": "nodejs", "online": "online", "git": "git", + "memory": "memory", "load": "carica", "uptime": "tempo di caricamento", diff --git a/public/language/it/admin/general/dashboard.json b/public/language/it/admin/general/dashboard.json index 02046bd17a..61f4421fb5 100644 --- a/public/language/it/admin/general/dashboard.json +++ b/public/language/it/admin/general/dashboard.json @@ -5,9 +5,14 @@ "users": "Users", "posts": "Posts", "topics": "Topics", - "page-views-last-month": "Page views Last Month", - "page-views-this-month": "Page views This Month", - "page-views-last-day": "Page views in last 24 hours", + "page-views-seven": "Last 7 Days", + "page-views-thirty": "Last 30 Days", + "page-views-last-day": "Last 24 hours", + "page-views-custom": "Custom Date Range", + "page-views-custom-start": "Range Start", + "page-views-custom-end": "Range End", + "page-views-custom-help": "Enter a date range of page views you would like to view. If no date picker is available, the accepted format is YYYY-MM-DD", + "page-views-custom-error": "Please enter a valid date range in the format YYYY-MM-DD", "stats.day": "Day", "stats.week": "Week", diff --git a/public/language/it/admin/general/languages.json b/public/language/it/admin/general/languages.json index da45cade2c..bdd57849b3 100644 --- a/public/language/it/admin/general/languages.json +++ b/public/language/it/admin/general/languages.json @@ -1,5 +1,6 @@ { "language-settings": "Language Settings", "description": "The default language determines the language settings for all users who are visiting your forum.
Individual users can override the default language on their account settings page.", - "default-language": "Default Language" + "default-language": "Default Language", + "auto-detect": "Auto Detect Language Setting for Guests" } \ No newline at end of file diff --git a/public/language/it/admin/settings/user.json b/public/language/it/admin/settings/user.json index b8f51c9288..fa8049c3a9 100644 --- a/public/language/it/admin/settings/user.json +++ b/public/language/it/admin/settings/user.json @@ -34,6 +34,8 @@ "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", + "invite-expiration": "Invite expiration", + "invite-expiration-help": "# of days invitations expire in.", "min-username-length": "Minimum Username Length", "max-username-length": "Maximum Username Length", "min-password-length": "Minimum Password Length", diff --git a/public/language/it/error.json b/public/language/it/error.json index e87e872b70..c6a8f0af3a 100644 --- a/public/language/it/error.json +++ b/public/language/it/error.json @@ -1,5 +1,6 @@ { "invalid-data": "Dati non validi", + "invalid-json": "Invalid JSON", "not-logged-in": "Non sembri essere loggato.", "account-locked": "Il tuo account è stato bloccato temporaneamente", "search-requires-login": "La ricerca richiede un account! Si prega di loggarsi o registrarsi!", @@ -12,6 +13,7 @@ "invalid-title": "Titolo non valido", "invalid-user-data": "Dati Utente non validi", "invalid-password": "Password non valida", + "invalid-login-credentials": "Invalid login credentials", "invalid-username-or-password": "Si prega di specificare sia un nome utente che una password", "invalid-search-term": "Termine di ricerca non valido", "csrf-invalid": "Non siamo riusciti a farti connettere, probabilmente perché la sessione è scaduta. Per favore riprova.", diff --git a/public/language/it/topic.json b/public/language/it/topic.json index c7c5bfbaca..6ff3d989eb 100644 --- a/public/language/it/topic.json +++ b/public/language/it/topic.json @@ -14,6 +14,7 @@ "quote": "Cita", "reply": "Rispondi", "replies_to_this_post": "%1 Replies", + "one_reply_to_this_post": "1 Reply", "last_reply_time": "Last reply", "reply-as-topic": "Topic risposta", "guest-login-reply": "Effettua il Log in per rispondere", diff --git a/public/language/ja/admin/appearance/customise.json b/public/language/ja/admin/appearance/customise.json index fc00e1ad92..c2e1f7cbbc 100644 --- a/public/language/ja/admin/appearance/customise.json +++ b/public/language/ja/admin/appearance/customise.json @@ -5,5 +5,8 @@ "custom-header": "カスタムヘッダー", "custom-header.description": "カスタムしたHTMLを入力してください(例. JavaScript, メタタグなど)。これはフォーラムのマークアップの<head>に追加されます。", - "custom-header.enable": "カスタムヘッダーを有効にする" + "custom-header.enable": "カスタムヘッダーを有効にする", + + "custom-css.livereload": "Enable Live Reload", + "custom-css.livereload.description": "Enable this to force all sessions on every device under your account to refresh whenever you click save" } \ No newline at end of file diff --git a/public/language/ja/admin/development/info.json b/public/language/ja/admin/development/info.json index 9169cb20d6..c6a7837667 100644 --- a/public/language/ja/admin/development/info.json +++ b/public/language/ja/admin/development/info.json @@ -1,10 +1,12 @@ { "you-are-on": "お知らせ - あなたは%1:%2", + "nodes-responded": "%1 nodes responded within %2ms!", "host": "ホスト", "pid": "pid", "nodejs": "nodejs", "online": "オンライン", "git": "git", + "memory": "memory", "load": "ロード", "uptime": "稼働時間", diff --git a/public/language/ja/admin/general/dashboard.json b/public/language/ja/admin/general/dashboard.json index 7dcb9e74ec..ed544afb51 100644 --- a/public/language/ja/admin/general/dashboard.json +++ b/public/language/ja/admin/general/dashboard.json @@ -5,9 +5,14 @@ "users": "ユーザー", "posts": "投稿", "topics": "スレッド", - "page-views-last-month": "先月のページビュー数", - "page-views-this-month": "今月のページビュー数", - "page-views-last-day": "過去24時間のページビュー", + "page-views-seven": "Last 7 Days", + "page-views-thirty": "Last 30 Days", + "page-views-last-day": "Last 24 hours", + "page-views-custom": "Custom Date Range", + "page-views-custom-start": "Range Start", + "page-views-custom-end": "Range End", + "page-views-custom-help": "Enter a date range of page views you would like to view. If no date picker is available, the accepted format is YYYY-MM-DD", + "page-views-custom-error": "Please enter a valid date range in the format YYYY-MM-DD", "stats.day": "日", "stats.week": "週", diff --git a/public/language/ja/admin/general/languages.json b/public/language/ja/admin/general/languages.json index 1d17c27bee..095dcd8a0f 100644 --- a/public/language/ja/admin/general/languages.json +++ b/public/language/ja/admin/general/languages.json @@ -1,5 +1,6 @@ { "language-settings": "言語設定", "description": "デフォルトの言語は、フォーラムにアクセスしているすべてのユーザーの言語表示を決定します。
個々のユーザーは、アカウント設定ページでデフォルトの言語を上書きできます。", - "default-language": "デフォルトの言語" + "default-language": "デフォルトの言語", + "auto-detect": "Auto Detect Language Setting for Guests" } \ No newline at end of file diff --git a/public/language/ja/admin/settings/user.json b/public/language/ja/admin/settings/user.json index 1048a1863c..8bdd9fdb73 100644 --- a/public/language/ja/admin/settings/user.json +++ b/public/language/ja/admin/settings/user.json @@ -34,6 +34,8 @@ "registration.max-invites": "ユーザーごとの最大招待数", "max-invites": "ユーザーごとの最大招待数", "max-invites-help": "無制限の場合は0です。管理者は無限の招待を受ける
「招待のみ」にのみ適用されます", + "invite-expiration": "Invite expiration", + "invite-expiration-help": "# of days invitations expire in.", "min-username-length": "ユーザー名の最小文字数", "max-username-length": "ユーザー名の最大文字数", "min-password-length": "パスワードの最小文字数", diff --git a/public/language/ja/error.json b/public/language/ja/error.json index 52df59a6d4..f450eed636 100644 --- a/public/language/ja/error.json +++ b/public/language/ja/error.json @@ -1,5 +1,6 @@ { "invalid-data": "無効なデータ", + "invalid-json": "Invalid JSON", "not-logged-in": "ログインしていません。", "account-locked": "あなたのアカウントは一時的にロックされています", "search-requires-login": "検索するにはアカウントが必要です - ログインするかアカウントを作成してください。", @@ -12,6 +13,7 @@ "invalid-title": "無効なタイトル!", "invalid-user-data": "無効なユーザーデータ", "invalid-password": "無効なパスワード", + "invalid-login-credentials": "Invalid login credentials", "invalid-username-or-password": "ユーザー名とパスワードの両方を指定してください", "invalid-search-term": "無効な検索ワード", "csrf-invalid": "セッションの期限切れと思われるため、私達はあなたのログイン状態を確認できませんでした。もう一度お試しください。", diff --git a/public/language/ja/flags.json b/public/language/ja/flags.json index c4bfed6f23..90a2d96569 100644 --- a/public/language/ja/flags.json +++ b/public/language/ja/flags.json @@ -1,60 +1,60 @@ { - "state": "State", - "reporter": "Reporter", - "reported-at": "Reported At", - "description": "Description", - "no-flags": "Hooray! No flags found.", - "assignee": "Assignee", - "update": "Update", - "updated": "Updated", - "target-purged": "The content this flag referred to has been purged and is no longer available.", + "state": "状態", + "reporter": "報告者", + "reported-at": "報告された", + "description": "説明", + "no-flags": "おめでとう!フラグは見つかりませんでした。", + "assignee": "譲受人", + "update": "更新", + "updated": "更新されました", + "target-purged": "このフラグが参照しているコンテンツは切り離されており、利用できません。", - "quick-filters": "Quick Filters", - "filter-active": "There are one or more filters active in this list of flags", - "filter-reset": "Remove Filters", - "filters": "Filter Options", - "filter-reporterId": "Reporter UID", - "filter-targetUid": "Flagged UID", - "filter-type": "Flag Type", - "filter-type-all": "All Content", - "filter-type-post": "Post", - "filter-state": "State", - "filter-assignee": "Assignee UID", - "filter-cid": "Category", - "filter-quick-mine": "Assigned to me", - "filter-cid-all": "All categories", - "apply-filters": "Apply Filters", + "quick-filters": "クイックフィルター", + "filter-active": "このフラグのリストには1つまたは複数のフィルタが有効です。", + "filter-reset": "フィルターを削除", + "filters": "フィルターオプション", + "filter-reporterId": "報告者のユーザーID", + "filter-targetUid": "フラグを立てたユーザーID", + "filter-type": "フラグの種類", + "filter-type-all": "すべてのコンテンツ", + "filter-type-post": "投稿", + "filter-state": "状態", + "filter-assignee": "譲受人のユーザーID", + "filter-cid": "カテゴリ", + "filter-quick-mine": "私に割り当てられました", + "filter-cid-all": "全てのカテゴリ", + "apply-filters": "フィルターを追加", - "quick-links": "Quick Links", - "flagged-user": "Flagged User", - "view-profile": "View Profile", - "start-new-chat": "Start New Chat", - "go-to-target": "View Flag Target", + "quick-links": "クイックリンク", + "flagged-user": "フラグを立てたユーザー", + "view-profile": "プロフィールを見る", + "start-new-chat": "新しいチャットを開始", + "go-to-target": "フラグのターゲットを表示", - "user-view": "View Profile", - "user-edit": "Edit Profile", + "user-view": "プロフィールを見る", + "user-edit": "プロフィールを編集", - "notes": "Flag Notes", - "add-note": "Add Note", - "no-notes": "No shared notes.", + "notes": "ノートにフラグをつける", + "add-note": "ノートを追加", + "no-notes": "共有ノートはありません。", - "history": "Flag History", - "back": "Back to Flags List", - "no-history": "No flag history.", + "history": "フラグ履歴", + "back": "フラグリストに戻る", + "no-history": "フラグ履歴がありません", - "state-all": "All states", - "state-open": "New/Open", - "state-wip": "Work in Progress", - "state-resolved": "Resolved", - "state-rejected": "Rejected", - "no-assignee": "Not Assigned", - "note-added": "Note Added", + "state-all": "全ての状態", + "state-open": "新規/開く", + "state-wip": "進行中の作業", + "state-resolved": "解決済み", + "state-rejected": "拒否済", + "no-assignee": "割り当てられていない", + "note-added": "ノートが追加されました", - "modal-title": "Report Inappropriate Content", - "modal-body": "Please specify your reason for flagging %1 %2 for review. Alternatively, use one of the quick report buttons if applicable.", - "modal-reason-spam": "Spam", - "modal-reason-offensive": "Offensive", - "modal-reason-custom": "Reason for reporting this content...", - "modal-submit": "Submit Report", - "modal-submit-success": "Content has been flagged for moderation." + "modal-title": "不適切なコンテンツを報告する", + "modal-body": "レビューのために%1 %2 にフラグを付ける理由を指定してください。または必要に応じてクイックレポートボタンの1つを使用します。", + "modal-reason-spam": "スパム", + "modal-reason-offensive": "攻撃", + "modal-reason-custom": "このコンテンツを報告する理由...", + "modal-submit": "レポートを提出", + "modal-submit-success": "コンテンツはモデレーションにフラグ付けされています。" } \ No newline at end of file diff --git a/public/language/ja/topic.json b/public/language/ja/topic.json index 0719e1d021..274d43ec55 100644 --- a/public/language/ja/topic.json +++ b/public/language/ja/topic.json @@ -14,6 +14,7 @@ "quote": "引用", "reply": "返信", "replies_to_this_post": "%1 件の返信", + "one_reply_to_this_post": "1 Reply", "last_reply_time": "最後の返信", "reply-as-topic": "スレッドとして返信する", "guest-login-reply": "投稿するのにログインして下さい", diff --git a/public/language/ko/admin/appearance/customise.json b/public/language/ko/admin/appearance/customise.json index 767d443e29..5095f7a937 100644 --- a/public/language/ko/admin/appearance/customise.json +++ b/public/language/ko/admin/appearance/customise.json @@ -5,5 +5,8 @@ "custom-header": "Custom Header", "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", - "custom-header.enable": "Enable Custom Header" + "custom-header.enable": "Enable Custom Header", + + "custom-css.livereload": "Enable Live Reload", + "custom-css.livereload.description": "Enable this to force all sessions on every device under your account to refresh whenever you click save" } \ No newline at end of file diff --git a/public/language/ko/admin/development/info.json b/public/language/ko/admin/development/info.json index b2768ca212..0a4ae6fe2c 100644 --- a/public/language/ko/admin/development/info.json +++ b/public/language/ko/admin/development/info.json @@ -1,10 +1,12 @@ { "you-are-on": "Info - You are on %1:%2", + "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", "pid": "pid", "nodejs": "nodejs", "online": "online", "git": "git", + "memory": "memory", "load": "load", "uptime": "uptime", diff --git a/public/language/ko/admin/general/dashboard.json b/public/language/ko/admin/general/dashboard.json index 02046bd17a..61f4421fb5 100644 --- a/public/language/ko/admin/general/dashboard.json +++ b/public/language/ko/admin/general/dashboard.json @@ -5,9 +5,14 @@ "users": "Users", "posts": "Posts", "topics": "Topics", - "page-views-last-month": "Page views Last Month", - "page-views-this-month": "Page views This Month", - "page-views-last-day": "Page views in last 24 hours", + "page-views-seven": "Last 7 Days", + "page-views-thirty": "Last 30 Days", + "page-views-last-day": "Last 24 hours", + "page-views-custom": "Custom Date Range", + "page-views-custom-start": "Range Start", + "page-views-custom-end": "Range End", + "page-views-custom-help": "Enter a date range of page views you would like to view. If no date picker is available, the accepted format is YYYY-MM-DD", + "page-views-custom-error": "Please enter a valid date range in the format YYYY-MM-DD", "stats.day": "Day", "stats.week": "Week", diff --git a/public/language/ko/admin/general/languages.json b/public/language/ko/admin/general/languages.json index da45cade2c..bdd57849b3 100644 --- a/public/language/ko/admin/general/languages.json +++ b/public/language/ko/admin/general/languages.json @@ -1,5 +1,6 @@ { "language-settings": "Language Settings", "description": "The default language determines the language settings for all users who are visiting your forum.
Individual users can override the default language on their account settings page.", - "default-language": "Default Language" + "default-language": "Default Language", + "auto-detect": "Auto Detect Language Setting for Guests" } \ No newline at end of file diff --git a/public/language/ko/admin/settings/user.json b/public/language/ko/admin/settings/user.json index b8f51c9288..fa8049c3a9 100644 --- a/public/language/ko/admin/settings/user.json +++ b/public/language/ko/admin/settings/user.json @@ -34,6 +34,8 @@ "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", + "invite-expiration": "Invite expiration", + "invite-expiration-help": "# of days invitations expire in.", "min-username-length": "Minimum Username Length", "max-username-length": "Maximum Username Length", "min-password-length": "Minimum Password Length", diff --git a/public/language/ko/error.json b/public/language/ko/error.json index f67dae56bb..4cccc68991 100644 --- a/public/language/ko/error.json +++ b/public/language/ko/error.json @@ -1,5 +1,6 @@ { "invalid-data": "올바르지 않은 정보입니다.", + "invalid-json": "Invalid JSON", "not-logged-in": "로그인하지 않았습니다.", "account-locked": "임시로 잠긴 계정입니다.", "search-requires-login": "검색을 하기 위해서는 계정이 필요합니다. 로그인하거나 가입해 주십시오.", @@ -12,6 +13,7 @@ "invalid-title": "올바르지 않은 제목입니다.", "invalid-user-data": "올바르지 않은 사용자 정보입니다.", "invalid-password": "올바르지 않은 비밀번호입니다.", + "invalid-login-credentials": "Invalid login credentials", "invalid-username-or-password": "사용자 이름과 패스워드를 모두 설정해주세요.", "invalid-search-term": "올바르지 않은 검색어입니다.", "csrf-invalid": "We were unable to log you in, likely due to an expired session. Please try again", diff --git a/public/language/ko/topic.json b/public/language/ko/topic.json index 4b6775f329..a7bc3a69e9 100644 --- a/public/language/ko/topic.json +++ b/public/language/ko/topic.json @@ -14,6 +14,7 @@ "quote": "인용", "reply": "답글", "replies_to_this_post": "%1 Replies", + "one_reply_to_this_post": "1 Reply", "last_reply_time": "Last reply", "reply-as-topic": "주제로 답글", "guest-login-reply": "답변을 위해 로그인하기", diff --git a/public/language/lt/admin/appearance/customise.json b/public/language/lt/admin/appearance/customise.json index 767d443e29..5095f7a937 100644 --- a/public/language/lt/admin/appearance/customise.json +++ b/public/language/lt/admin/appearance/customise.json @@ -5,5 +5,8 @@ "custom-header": "Custom Header", "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", - "custom-header.enable": "Enable Custom Header" + "custom-header.enable": "Enable Custom Header", + + "custom-css.livereload": "Enable Live Reload", + "custom-css.livereload.description": "Enable this to force all sessions on every device under your account to refresh whenever you click save" } \ No newline at end of file diff --git a/public/language/lt/admin/development/info.json b/public/language/lt/admin/development/info.json index b2768ca212..0a4ae6fe2c 100644 --- a/public/language/lt/admin/development/info.json +++ b/public/language/lt/admin/development/info.json @@ -1,10 +1,12 @@ { "you-are-on": "Info - You are on %1:%2", + "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", "pid": "pid", "nodejs": "nodejs", "online": "online", "git": "git", + "memory": "memory", "load": "load", "uptime": "uptime", diff --git a/public/language/lt/admin/general/dashboard.json b/public/language/lt/admin/general/dashboard.json index 02046bd17a..61f4421fb5 100644 --- a/public/language/lt/admin/general/dashboard.json +++ b/public/language/lt/admin/general/dashboard.json @@ -5,9 +5,14 @@ "users": "Users", "posts": "Posts", "topics": "Topics", - "page-views-last-month": "Page views Last Month", - "page-views-this-month": "Page views This Month", - "page-views-last-day": "Page views in last 24 hours", + "page-views-seven": "Last 7 Days", + "page-views-thirty": "Last 30 Days", + "page-views-last-day": "Last 24 hours", + "page-views-custom": "Custom Date Range", + "page-views-custom-start": "Range Start", + "page-views-custom-end": "Range End", + "page-views-custom-help": "Enter a date range of page views you would like to view. If no date picker is available, the accepted format is YYYY-MM-DD", + "page-views-custom-error": "Please enter a valid date range in the format YYYY-MM-DD", "stats.day": "Day", "stats.week": "Week", diff --git a/public/language/lt/admin/general/languages.json b/public/language/lt/admin/general/languages.json index da45cade2c..bdd57849b3 100644 --- a/public/language/lt/admin/general/languages.json +++ b/public/language/lt/admin/general/languages.json @@ -1,5 +1,6 @@ { "language-settings": "Language Settings", "description": "The default language determines the language settings for all users who are visiting your forum.
Individual users can override the default language on their account settings page.", - "default-language": "Default Language" + "default-language": "Default Language", + "auto-detect": "Auto Detect Language Setting for Guests" } \ No newline at end of file diff --git a/public/language/lt/admin/settings/user.json b/public/language/lt/admin/settings/user.json index b8f51c9288..fa8049c3a9 100644 --- a/public/language/lt/admin/settings/user.json +++ b/public/language/lt/admin/settings/user.json @@ -34,6 +34,8 @@ "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", + "invite-expiration": "Invite expiration", + "invite-expiration-help": "# of days invitations expire in.", "min-username-length": "Minimum Username Length", "max-username-length": "Maximum Username Length", "min-password-length": "Minimum Password Length", diff --git a/public/language/lt/error.json b/public/language/lt/error.json index aa16eedd88..18d6f41d29 100644 --- a/public/language/lt/error.json +++ b/public/language/lt/error.json @@ -1,5 +1,6 @@ { "invalid-data": "Klaidingi duomenys", + "invalid-json": "Invalid JSON", "not-logged-in": "Atrodo, kad jūs neesate prisijungęs.", "account-locked": "Jūsų paskyra buvo laikinai užrakinta", "search-requires-login": "Paieška reikalauja vartotojo - prašome prisijungti arba užsiregistruoti", @@ -12,6 +13,7 @@ "invalid-title": "Neteisingas pavadinimas!", "invalid-user-data": "Klaidingi vartotojo duomenys", "invalid-password": "Klaidingas slaptažodis", + "invalid-login-credentials": "Invalid login credentials", "invalid-username-or-password": "Prašome nurodyti tiek vartotojo vardą, tiek ir slaptažodį", "invalid-search-term": "Neteisingas paieškos terminas", "csrf-invalid": "We were unable to log you in, likely due to an expired session. Please try again", diff --git a/public/language/lt/topic.json b/public/language/lt/topic.json index c2e8c8bd56..1e7f273486 100644 --- a/public/language/lt/topic.json +++ b/public/language/lt/topic.json @@ -14,6 +14,7 @@ "quote": "Cituoti", "reply": "Atsakyti", "replies_to_this_post": "%1 Replies", + "one_reply_to_this_post": "1 Reply", "last_reply_time": "Last reply", "reply-as-topic": "Reply as topic", "guest-login-reply": "Norėdami atsakyti, prisijunkite", diff --git a/public/language/ms/admin/appearance/customise.json b/public/language/ms/admin/appearance/customise.json index 767d443e29..5095f7a937 100644 --- a/public/language/ms/admin/appearance/customise.json +++ b/public/language/ms/admin/appearance/customise.json @@ -5,5 +5,8 @@ "custom-header": "Custom Header", "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", - "custom-header.enable": "Enable Custom Header" + "custom-header.enable": "Enable Custom Header", + + "custom-css.livereload": "Enable Live Reload", + "custom-css.livereload.description": "Enable this to force all sessions on every device under your account to refresh whenever you click save" } \ No newline at end of file diff --git a/public/language/ms/admin/development/info.json b/public/language/ms/admin/development/info.json index b2768ca212..0a4ae6fe2c 100644 --- a/public/language/ms/admin/development/info.json +++ b/public/language/ms/admin/development/info.json @@ -1,10 +1,12 @@ { "you-are-on": "Info - You are on %1:%2", + "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", "pid": "pid", "nodejs": "nodejs", "online": "online", "git": "git", + "memory": "memory", "load": "load", "uptime": "uptime", diff --git a/public/language/ms/admin/general/dashboard.json b/public/language/ms/admin/general/dashboard.json index 02046bd17a..61f4421fb5 100644 --- a/public/language/ms/admin/general/dashboard.json +++ b/public/language/ms/admin/general/dashboard.json @@ -5,9 +5,14 @@ "users": "Users", "posts": "Posts", "topics": "Topics", - "page-views-last-month": "Page views Last Month", - "page-views-this-month": "Page views This Month", - "page-views-last-day": "Page views in last 24 hours", + "page-views-seven": "Last 7 Days", + "page-views-thirty": "Last 30 Days", + "page-views-last-day": "Last 24 hours", + "page-views-custom": "Custom Date Range", + "page-views-custom-start": "Range Start", + "page-views-custom-end": "Range End", + "page-views-custom-help": "Enter a date range of page views you would like to view. If no date picker is available, the accepted format is YYYY-MM-DD", + "page-views-custom-error": "Please enter a valid date range in the format YYYY-MM-DD", "stats.day": "Day", "stats.week": "Week", diff --git a/public/language/ms/admin/general/languages.json b/public/language/ms/admin/general/languages.json index da45cade2c..bdd57849b3 100644 --- a/public/language/ms/admin/general/languages.json +++ b/public/language/ms/admin/general/languages.json @@ -1,5 +1,6 @@ { "language-settings": "Language Settings", "description": "The default language determines the language settings for all users who are visiting your forum.
Individual users can override the default language on their account settings page.", - "default-language": "Default Language" + "default-language": "Default Language", + "auto-detect": "Auto Detect Language Setting for Guests" } \ No newline at end of file diff --git a/public/language/ms/admin/settings/user.json b/public/language/ms/admin/settings/user.json index b8f51c9288..fa8049c3a9 100644 --- a/public/language/ms/admin/settings/user.json +++ b/public/language/ms/admin/settings/user.json @@ -34,6 +34,8 @@ "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", + "invite-expiration": "Invite expiration", + "invite-expiration-help": "# of days invitations expire in.", "min-username-length": "Minimum Username Length", "max-username-length": "Maximum Username Length", "min-password-length": "Minimum Password Length", diff --git a/public/language/ms/error.json b/public/language/ms/error.json index 34f838b4b4..643531b8f0 100644 --- a/public/language/ms/error.json +++ b/public/language/ms/error.json @@ -1,5 +1,6 @@ { "invalid-data": "Data Tak Sah", + "invalid-json": "Invalid JSON", "not-logged-in": "Anda tidak log masuk.", "account-locked": "Akaun anda telah dikunci untuk seketika", "search-requires-login": "Fungsi Carian perlukan akaun - sila log masuk atau daftar.", @@ -12,6 +13,7 @@ "invalid-title": "Tajuk Tak Sah!", "invalid-user-data": "Data Pengguna Tak Sah", "invalid-password": "Kata laluan salah!", + "invalid-login-credentials": "Invalid login credentials", "invalid-username-or-password": "Sila tentukan kedua-dua nama pengguna dan kata laluan", "invalid-search-term": "Terma pencarian tak sah", "csrf-invalid": "We were unable to log you in, likely due to an expired session. Please try again", diff --git a/public/language/ms/topic.json b/public/language/ms/topic.json index c1aa71fee9..5cc6a65eda 100644 --- a/public/language/ms/topic.json +++ b/public/language/ms/topic.json @@ -14,6 +14,7 @@ "quote": "Petikan", "reply": "Balas", "replies_to_this_post": "%1 Replies", + "one_reply_to_this_post": "1 Reply", "last_reply_time": "Last reply", "reply-as-topic": "Reply as topic", "guest-login-reply": "Log masuk untuk balas", diff --git a/public/language/nb/admin/appearance/customise.json b/public/language/nb/admin/appearance/customise.json index 767d443e29..5095f7a937 100644 --- a/public/language/nb/admin/appearance/customise.json +++ b/public/language/nb/admin/appearance/customise.json @@ -5,5 +5,8 @@ "custom-header": "Custom Header", "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", - "custom-header.enable": "Enable Custom Header" + "custom-header.enable": "Enable Custom Header", + + "custom-css.livereload": "Enable Live Reload", + "custom-css.livereload.description": "Enable this to force all sessions on every device under your account to refresh whenever you click save" } \ No newline at end of file diff --git a/public/language/nb/admin/development/info.json b/public/language/nb/admin/development/info.json index b2768ca212..0a4ae6fe2c 100644 --- a/public/language/nb/admin/development/info.json +++ b/public/language/nb/admin/development/info.json @@ -1,10 +1,12 @@ { "you-are-on": "Info - You are on %1:%2", + "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", "pid": "pid", "nodejs": "nodejs", "online": "online", "git": "git", + "memory": "memory", "load": "load", "uptime": "uptime", diff --git a/public/language/nb/admin/general/dashboard.json b/public/language/nb/admin/general/dashboard.json index 02046bd17a..61f4421fb5 100644 --- a/public/language/nb/admin/general/dashboard.json +++ b/public/language/nb/admin/general/dashboard.json @@ -5,9 +5,14 @@ "users": "Users", "posts": "Posts", "topics": "Topics", - "page-views-last-month": "Page views Last Month", - "page-views-this-month": "Page views This Month", - "page-views-last-day": "Page views in last 24 hours", + "page-views-seven": "Last 7 Days", + "page-views-thirty": "Last 30 Days", + "page-views-last-day": "Last 24 hours", + "page-views-custom": "Custom Date Range", + "page-views-custom-start": "Range Start", + "page-views-custom-end": "Range End", + "page-views-custom-help": "Enter a date range of page views you would like to view. If no date picker is available, the accepted format is YYYY-MM-DD", + "page-views-custom-error": "Please enter a valid date range in the format YYYY-MM-DD", "stats.day": "Day", "stats.week": "Week", diff --git a/public/language/nb/admin/general/languages.json b/public/language/nb/admin/general/languages.json index da45cade2c..bdd57849b3 100644 --- a/public/language/nb/admin/general/languages.json +++ b/public/language/nb/admin/general/languages.json @@ -1,5 +1,6 @@ { "language-settings": "Language Settings", "description": "The default language determines the language settings for all users who are visiting your forum.
Individual users can override the default language on their account settings page.", - "default-language": "Default Language" + "default-language": "Default Language", + "auto-detect": "Auto Detect Language Setting for Guests" } \ No newline at end of file diff --git a/public/language/nb/admin/settings/user.json b/public/language/nb/admin/settings/user.json index b8f51c9288..fa8049c3a9 100644 --- a/public/language/nb/admin/settings/user.json +++ b/public/language/nb/admin/settings/user.json @@ -34,6 +34,8 @@ "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", + "invite-expiration": "Invite expiration", + "invite-expiration-help": "# of days invitations expire in.", "min-username-length": "Minimum Username Length", "max-username-length": "Maximum Username Length", "min-password-length": "Minimum Password Length", diff --git a/public/language/nb/error.json b/public/language/nb/error.json index 8c63511a83..a88fdd69c7 100644 --- a/public/language/nb/error.json +++ b/public/language/nb/error.json @@ -1,5 +1,6 @@ { "invalid-data": "Ugyldige data", + "invalid-json": "Invalid JSON", "not-logged-in": "Du ser ikke ut til å være logget inn.", "account-locked": "Kontoen din har blitt midlertidig låst", "search-requires-login": "Søking krever en konto - vennligst logg inn eller registrer deg.", @@ -12,6 +13,7 @@ "invalid-title": "Ugyldig tittel!", "invalid-user-data": "Ugyldig brukerdata", "invalid-password": "Ugyldig passord", + "invalid-login-credentials": "Invalid login credentials", "invalid-username-or-password": "Vennligst spesifiser både et brukernavn og passord", "invalid-search-term": "Ugyldig søkeord", "csrf-invalid": "We were unable to log you in, likely due to an expired session. Please try again", diff --git a/public/language/nb/topic.json b/public/language/nb/topic.json index 3c6153e359..a8707253c6 100644 --- a/public/language/nb/topic.json +++ b/public/language/nb/topic.json @@ -14,6 +14,7 @@ "quote": "Siter", "reply": "Svar", "replies_to_this_post": "%1 Replies", + "one_reply_to_this_post": "1 Reply", "last_reply_time": "Last reply", "reply-as-topic": "Reply as topic", "guest-login-reply": "Logg inn for å besvare", diff --git a/public/language/nl/admin/appearance/customise.json b/public/language/nl/admin/appearance/customise.json index 767d443e29..5095f7a937 100644 --- a/public/language/nl/admin/appearance/customise.json +++ b/public/language/nl/admin/appearance/customise.json @@ -5,5 +5,8 @@ "custom-header": "Custom Header", "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", - "custom-header.enable": "Enable Custom Header" + "custom-header.enable": "Enable Custom Header", + + "custom-css.livereload": "Enable Live Reload", + "custom-css.livereload.description": "Enable this to force all sessions on every device under your account to refresh whenever you click save" } \ No newline at end of file diff --git a/public/language/nl/admin/development/info.json b/public/language/nl/admin/development/info.json index b2768ca212..0a4ae6fe2c 100644 --- a/public/language/nl/admin/development/info.json +++ b/public/language/nl/admin/development/info.json @@ -1,10 +1,12 @@ { "you-are-on": "Info - You are on %1:%2", + "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", "pid": "pid", "nodejs": "nodejs", "online": "online", "git": "git", + "memory": "memory", "load": "load", "uptime": "uptime", diff --git a/public/language/nl/admin/general/dashboard.json b/public/language/nl/admin/general/dashboard.json index 02046bd17a..61f4421fb5 100644 --- a/public/language/nl/admin/general/dashboard.json +++ b/public/language/nl/admin/general/dashboard.json @@ -5,9 +5,14 @@ "users": "Users", "posts": "Posts", "topics": "Topics", - "page-views-last-month": "Page views Last Month", - "page-views-this-month": "Page views This Month", - "page-views-last-day": "Page views in last 24 hours", + "page-views-seven": "Last 7 Days", + "page-views-thirty": "Last 30 Days", + "page-views-last-day": "Last 24 hours", + "page-views-custom": "Custom Date Range", + "page-views-custom-start": "Range Start", + "page-views-custom-end": "Range End", + "page-views-custom-help": "Enter a date range of page views you would like to view. If no date picker is available, the accepted format is YYYY-MM-DD", + "page-views-custom-error": "Please enter a valid date range in the format YYYY-MM-DD", "stats.day": "Day", "stats.week": "Week", diff --git a/public/language/nl/admin/general/languages.json b/public/language/nl/admin/general/languages.json index da45cade2c..bdd57849b3 100644 --- a/public/language/nl/admin/general/languages.json +++ b/public/language/nl/admin/general/languages.json @@ -1,5 +1,6 @@ { "language-settings": "Language Settings", "description": "The default language determines the language settings for all users who are visiting your forum.
Individual users can override the default language on their account settings page.", - "default-language": "Default Language" + "default-language": "Default Language", + "auto-detect": "Auto Detect Language Setting for Guests" } \ No newline at end of file diff --git a/public/language/nl/admin/settings/user.json b/public/language/nl/admin/settings/user.json index b8f51c9288..fa8049c3a9 100644 --- a/public/language/nl/admin/settings/user.json +++ b/public/language/nl/admin/settings/user.json @@ -34,6 +34,8 @@ "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", + "invite-expiration": "Invite expiration", + "invite-expiration-help": "# of days invitations expire in.", "min-username-length": "Minimum Username Length", "max-username-length": "Maximum Username Length", "min-password-length": "Minimum Password Length", diff --git a/public/language/nl/error.json b/public/language/nl/error.json index 588d2d3a1b..8d9367fe1f 100644 --- a/public/language/nl/error.json +++ b/public/language/nl/error.json @@ -1,5 +1,6 @@ { "invalid-data": "Ongeldige data", + "invalid-json": "Invalid JSON", "not-logged-in": "Het lijkt erop dat je niet ingelogd bent.", "account-locked": "Dit account is tijdelijk vergrendeld", "search-requires-login": "Zoeken vereist een account - meld je aan of registreer je om te zoeken.", @@ -12,6 +13,7 @@ "invalid-title": "Ongeldige titel!", "invalid-user-data": "Ongeldige gebruikersgegevens", "invalid-password": "Ongeldig wachtwoord", + "invalid-login-credentials": "Invalid login credentials", "invalid-username-or-password": "Geef zowel een gebruikersnaam als wachtwoord op", "invalid-search-term": "Ongeldig zoekterm", "csrf-invalid": "We konden u niet aanmelden, waarschijnlijk door een verlopen sessie. Probeer het a.u.b. nogmaals.", diff --git a/public/language/nl/topic.json b/public/language/nl/topic.json index 1e0be1b1c3..c2b9336bf6 100644 --- a/public/language/nl/topic.json +++ b/public/language/nl/topic.json @@ -14,6 +14,7 @@ "quote": "Citeren", "reply": "Reageren", "replies_to_this_post": "%1 Antwoorden", + "one_reply_to_this_post": "1 Reply", "last_reply_time": "Laatste antwoord", "reply-as-topic": "Reageren als onderwerp", "guest-login-reply": "Aanmelden om te reageren", diff --git a/public/language/pl/admin/appearance/customise.json b/public/language/pl/admin/appearance/customise.json index 22e1338056..0e56eb3d69 100644 --- a/public/language/pl/admin/appearance/customise.json +++ b/public/language/pl/admin/appearance/customise.json @@ -5,5 +5,8 @@ "custom-header": "Własny nagłówek", "custom-header.description": "Wpisz tutaj kod HTML (JavaScript, tagi <meta>) który ma być dołączony do sekcji <head> w szablonie forum.", - "custom-header.enable": "Włącz własny nagłówek" + "custom-header.enable": "Włącz własny nagłówek", + + "custom-css.livereload": "Enable Live Reload", + "custom-css.livereload.description": "Enable this to force all sessions on every device under your account to refresh whenever you click save" } \ No newline at end of file diff --git a/public/language/pl/admin/development/info.json b/public/language/pl/admin/development/info.json index d63f50a900..2213ad9909 100644 --- a/public/language/pl/admin/development/info.json +++ b/public/language/pl/admin/development/info.json @@ -1,10 +1,12 @@ { "you-are-on": "Informacja - Jesteś na %1:%2", + "nodes-responded": "%1 nodes responded within %2ms!", "host": "Host", "pid": "pid", "nodejs": "nodejs", "online": "online", "git": "git", + "memory": "memory", "load": "obciążenie", "uptime": "uptime", diff --git a/public/language/pl/admin/general/dashboard.json b/public/language/pl/admin/general/dashboard.json index 1fc261cf9c..359d6eea49 100644 --- a/public/language/pl/admin/general/dashboard.json +++ b/public/language/pl/admin/general/dashboard.json @@ -5,9 +5,14 @@ "users": "Users", "posts": "Posts", "topics": "Topics", - "page-views-last-month": "Wyświetlenia strony w ostatnim miesiącu", - "page-views-this-month": "Wyświetlenia strony w tym miesiącu", - "page-views-last-day": "Wyświetlenia strony z ostatnich 24 godzin", + "page-views-seven": "Last 7 Days", + "page-views-thirty": "Last 30 Days", + "page-views-last-day": "Last 24 hours", + "page-views-custom": "Custom Date Range", + "page-views-custom-start": "Range Start", + "page-views-custom-end": "Range End", + "page-views-custom-help": "Enter a date range of page views you would like to view. If no date picker is available, the accepted format is YYYY-MM-DD", + "page-views-custom-error": "Please enter a valid date range in the format YYYY-MM-DD", "stats.day": "Dzień", "stats.week": "Tydzień", diff --git a/public/language/pl/admin/general/languages.json b/public/language/pl/admin/general/languages.json index d8779b4524..5f90036f0a 100644 --- a/public/language/pl/admin/general/languages.json +++ b/public/language/pl/admin/general/languages.json @@ -1,5 +1,6 @@ { "language-settings": "Ustawienia Językowe", "description": "Domyślnym językiem określa ustawienia języka dla wszystkich użytkowników, którzy odwiedzają forum.
Użytkownicy mogą zmienić domyślny język, w ustawieniach konta.", - "default-language": "Domyślny Język" + "default-language": "Domyślny Język", + "auto-detect": "Auto Detect Language Setting for Guests" } \ No newline at end of file diff --git a/public/language/pl/admin/settings/user.json b/public/language/pl/admin/settings/user.json index ca27eca846..f9383ab222 100644 --- a/public/language/pl/admin/settings/user.json +++ b/public/language/pl/admin/settings/user.json @@ -34,6 +34,8 @@ "registration.max-invites": "Maksymalnie ilość zaproszeń przez użytkownika", "max-invites": "Maksymalnie ilość zaproszeń przez użytkownika", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", + "invite-expiration": "Invite expiration", + "invite-expiration-help": "# of days invitations expire in.", "min-username-length": "Minimum Username Length", "max-username-length": "Maximum Username Length", "min-password-length": "Minimum Password Length", diff --git a/public/language/pl/error.json b/public/language/pl/error.json index 9e1bcf4ae4..0f976f0a18 100644 --- a/public/language/pl/error.json +++ b/public/language/pl/error.json @@ -1,5 +1,6 @@ { "invalid-data": "Błędne Dane", + "invalid-json": "Invalid JSON", "not-logged-in": "Nie jesteś zalogowany/a.", "account-locked": "Twoje konto zostało tymczasowo zablokowane", "search-requires-login": "Wyszukiwanie wymaga konta - zaloguj się lub zarejestruj.", @@ -12,6 +13,7 @@ "invalid-title": "Błędny tytuł!", "invalid-user-data": "Błędne Dane Użytkownika", "invalid-password": "Błędne Hasło", + "invalid-login-credentials": "Invalid login credentials", "invalid-username-or-password": "Proszę podać nazwę użytkownika i hasło", "invalid-search-term": "Błędne wyszukiwane wyrażenie", "csrf-invalid": "Nie mogliśmy Cię zalogować. Zapewne przyczyną jest wygasła sesja. Proszę spróbować ponownie.", diff --git a/public/language/pl/topic.json b/public/language/pl/topic.json index 9a026a1c11..e8800ba31c 100644 --- a/public/language/pl/topic.json +++ b/public/language/pl/topic.json @@ -14,6 +14,7 @@ "quote": "Cytuj", "reply": "Odpowiedz", "replies_to_this_post": "%1 Replies", + "one_reply_to_this_post": "1 Reply", "last_reply_time": "Last reply", "reply-as-topic": "Odpowiedz na temat", "guest-login-reply": "Zaloguj się, aby odpowiedzieć.", diff --git a/public/language/pt-BR/admin/appearance/customise.json b/public/language/pt-BR/admin/appearance/customise.json index 5a88e5915b..b09feb1da0 100644 --- a/public/language/pt-BR/admin/appearance/customise.json +++ b/public/language/pt-BR/admin/appearance/customise.json @@ -5,5 +5,8 @@ "custom-header": "Cabeçalho Personalizado", "custom-header.description": "Adicione HTML pessoal aqui (ex. JavaScript, Meta Tags, Tags, etc), os quais serão acrescentados ao final da seção <head> do markup do seu fórum.", - "custom-header.enable": "Ligar o Cabeçalho Personalizado" + "custom-header.enable": "Ligar o Cabeçalho Personalizado", + + "custom-css.livereload": "Enable Live Reload", + "custom-css.livereload.description": "Enable this to force all sessions on every device under your account to refresh whenever you click save" } \ No newline at end of file diff --git a/public/language/pt-BR/admin/development/info.json b/public/language/pt-BR/admin/development/info.json index 6b16f9a46a..4d754e5d85 100644 --- a/public/language/pt-BR/admin/development/info.json +++ b/public/language/pt-BR/admin/development/info.json @@ -1,10 +1,12 @@ { "you-are-on": "Informação - Você está em %1:%2", + "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", "pid": "pid", "nodejs": "nodejs", "online": "online", "git": "git", + "memory": "memory", "load": "carregar", "uptime": "tempo rodando", diff --git a/public/language/pt-BR/admin/general/dashboard.json b/public/language/pt-BR/admin/general/dashboard.json index 1722d960b0..c6621b2593 100644 --- a/public/language/pt-BR/admin/general/dashboard.json +++ b/public/language/pt-BR/admin/general/dashboard.json @@ -5,9 +5,14 @@ "users": "Usuários", "posts": "Posts", "topics": "Tópicos", - "page-views-last-month": "Visualizações de página no Último Mês", - "page-views-this-month": "Visualizações de Página Este Mês", - "page-views-last-day": "Visualizações de página nas últimas 24 horas", + "page-views-seven": "Last 7 Days", + "page-views-thirty": "Last 30 Days", + "page-views-last-day": "Last 24 hours", + "page-views-custom": "Custom Date Range", + "page-views-custom-start": "Range Start", + "page-views-custom-end": "Range End", + "page-views-custom-help": "Enter a date range of page views you would like to view. If no date picker is available, the accepted format is YYYY-MM-DD", + "page-views-custom-error": "Please enter a valid date range in the format YYYY-MM-DD", "stats.day": "Dia", "stats.week": "Semana", diff --git a/public/language/pt-BR/admin/general/languages.json b/public/language/pt-BR/admin/general/languages.json index 25b203c2f2..fe5213d0dc 100644 --- a/public/language/pt-BR/admin/general/languages.json +++ b/public/language/pt-BR/admin/general/languages.json @@ -1,5 +1,6 @@ { "language-settings": "Configurações de Idioma", "description": "O idioma padrão determina as configurações de idioma para todos os usuários que estiverem visitando o seu fórum.
Usuários individuais podem sobrepor o idioma padrão em sua página de configurações de conta.", - "default-language": "Idioma Padrão" + "default-language": "Idioma Padrão", + "auto-detect": "Auto Detect Language Setting for Guests" } \ No newline at end of file diff --git a/public/language/pt-BR/admin/settings/user.json b/public/language/pt-BR/admin/settings/user.json index 9ccdd6baa5..a849488cc9 100644 --- a/public/language/pt-BR/admin/settings/user.json +++ b/public/language/pt-BR/admin/settings/user.json @@ -34,6 +34,8 @@ "registration.max-invites": "Máximo de Convites por Usuário", "max-invites": "Máximo de Convites por Usuário", "max-invites-help": "0 para nenhuma restrição. Administradores tem convites infinitos
Apenas aplicável para \"Apenas Convite\"", + "invite-expiration": "Invite expiration", + "invite-expiration-help": "# of days invitations expire in.", "min-username-length": "Tamanho Mínimo do Nome de Usuário", "max-username-length": "Tamanho Máximo do Nome de Usuário", "min-password-length": "Tamanho Mínimo da Senha", diff --git a/public/language/pt-BR/error.json b/public/language/pt-BR/error.json index ba2053e547..0463e2ad5e 100644 --- a/public/language/pt-BR/error.json +++ b/public/language/pt-BR/error.json @@ -1,5 +1,6 @@ { "invalid-data": "Dados Inválidos", + "invalid-json": "Invalid JSON", "not-logged-in": "Você não parece estar logado.", "account-locked": "Sua conta foi temporariamente bloqueada ", "search-requires-login": "É necessário ter uma conta para pesquisar - por favor efetue o login ou cadastre-se.", @@ -12,6 +13,7 @@ "invalid-title": "Título inválido!", "invalid-user-data": "Dados de Usuário Inválidos", "invalid-password": "Senha Inválida", + "invalid-login-credentials": "Invalid login credentials", "invalid-username-or-password": "Por favor especifique ambos nome de usuário e senha", "invalid-search-term": "Termo de pesquisa inválido", "csrf-invalid": "Nós não fomos capazes de logá-lo, provavelmente devido à uma sessão expirada. Por favor tente novamente.", diff --git a/public/language/pt-BR/flags.json b/public/language/pt-BR/flags.json index c4bfed6f23..802b042fa3 100644 --- a/public/language/pt-BR/flags.json +++ b/public/language/pt-BR/flags.json @@ -1,60 +1,60 @@ { - "state": "State", - "reporter": "Reporter", - "reported-at": "Reported At", - "description": "Description", - "no-flags": "Hooray! No flags found.", - "assignee": "Assignee", - "update": "Update", - "updated": "Updated", - "target-purged": "The content this flag referred to has been purged and is no longer available.", + "state": "Estado", + "reporter": "Reportado por", + "reported-at": "Reportado Em", + "description": "Descrição", + "no-flags": "Ihuul! Nenhuma sinalização encontrada.", + "assignee": "Cessionário", + "update": "Atualizar", + "updated": "Atualizado", + "target-purged": "O conteúdo ao qual essa sinalização se referia foi removido e não está mais disponível.", - "quick-filters": "Quick Filters", - "filter-active": "There are one or more filters active in this list of flags", - "filter-reset": "Remove Filters", - "filters": "Filter Options", - "filter-reporterId": "Reporter UID", - "filter-targetUid": "Flagged UID", - "filter-type": "Flag Type", - "filter-type-all": "All Content", + "quick-filters": "Filtros Rápidos", + "filter-active": "Há um ou mais filtros ativos nesta lista de sinalizações", + "filter-reset": "Remover Filtros", + "filters": "Opções de Filtro", + "filter-reporterId": "UID do Reportador", + "filter-targetUid": "UID Sinalizado", + "filter-type": "Tipo de Sinalização", + "filter-type-all": "Todo o Conteúdo", "filter-type-post": "Post", - "filter-state": "State", - "filter-assignee": "Assignee UID", - "filter-cid": "Category", - "filter-quick-mine": "Assigned to me", - "filter-cid-all": "All categories", - "apply-filters": "Apply Filters", + "filter-state": "Estado", + "filter-assignee": "UID do Cessionário", + "filter-cid": "Categoria", + "filter-quick-mine": "Procurado à mim", + "filter-cid-all": "Todas as categorias", + "apply-filters": "Aplicar Filtros", - "quick-links": "Quick Links", - "flagged-user": "Flagged User", - "view-profile": "View Profile", - "start-new-chat": "Start New Chat", - "go-to-target": "View Flag Target", + "quick-links": "Links Rápidos", + "flagged-user": "Usuário Sinalizado", + "view-profile": "Ver Perfil", + "start-new-chat": "Iniciar Novo Chat", + "go-to-target": "Ver Sinalizado", - "user-view": "View Profile", - "user-edit": "Edit Profile", + "user-view": "Ver Perfil", + "user-edit": "Editar Perfil", - "notes": "Flag Notes", - "add-note": "Add Note", - "no-notes": "No shared notes.", + "notes": "Notas da Sinalização", + "add-note": "Adicionar Nota", + "no-notes": "Nenhuma nota compartilhada.", - "history": "Flag History", - "back": "Back to Flags List", - "no-history": "No flag history.", + "history": "Histórico de Sinalizações", + "back": "Voltar à Lista de Sinaliações", + "no-history": "Sem histórico de sinalizações.", - "state-all": "All states", - "state-open": "New/Open", - "state-wip": "Work in Progress", - "state-resolved": "Resolved", - "state-rejected": "Rejected", - "no-assignee": "Not Assigned", - "note-added": "Note Added", + "state-all": "Todos os estados", + "state-open": "Novo/Aberto", + "state-wip": "Trabalho em Progresso", + "state-resolved": "Resolvido", + "state-rejected": "Rejeitado", + "no-assignee": "Não Procurado", + "note-added": "Nota Adicionada", - "modal-title": "Report Inappropriate Content", - "modal-body": "Please specify your reason for flagging %1 %2 for review. Alternatively, use one of the quick report buttons if applicable.", + "modal-title": "Reportar Conteúdo Inadequado", + "modal-body": "Por favor especifique sua razão para sinalizar %1 %2 para revisão. Alternativamente, use um dos botões de reporte rápido se for aplicável.", "modal-reason-spam": "Spam", - "modal-reason-offensive": "Offensive", - "modal-reason-custom": "Reason for reporting this content...", - "modal-submit": "Submit Report", - "modal-submit-success": "Content has been flagged for moderation." + "modal-reason-offensive": "Ofensivo", + "modal-reason-custom": "Motivo para reportar este conteúdo...", + "modal-submit": "Enviar Reportagem", + "modal-submit-success": "O conteúdo foi sinalizado para moderação." } \ No newline at end of file diff --git a/public/language/pt-BR/topic.json b/public/language/pt-BR/topic.json index 483c769ade..116057d638 100644 --- a/public/language/pt-BR/topic.json +++ b/public/language/pt-BR/topic.json @@ -14,6 +14,7 @@ "quote": "Citar", "reply": "Responder", "replies_to_this_post": "%1 Respostas", + "one_reply_to_this_post": "1 Reply", "last_reply_time": "Última resposta", "reply-as-topic": "Responder como tópico", "guest-login-reply": "Entre para responder", diff --git a/public/language/pt-PT/admin/appearance/customise.json b/public/language/pt-PT/admin/appearance/customise.json index 767d443e29..5095f7a937 100644 --- a/public/language/pt-PT/admin/appearance/customise.json +++ b/public/language/pt-PT/admin/appearance/customise.json @@ -5,5 +5,8 @@ "custom-header": "Custom Header", "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", - "custom-header.enable": "Enable Custom Header" + "custom-header.enable": "Enable Custom Header", + + "custom-css.livereload": "Enable Live Reload", + "custom-css.livereload.description": "Enable this to force all sessions on every device under your account to refresh whenever you click save" } \ No newline at end of file diff --git a/public/language/pt-PT/admin/development/info.json b/public/language/pt-PT/admin/development/info.json index b2768ca212..0a4ae6fe2c 100644 --- a/public/language/pt-PT/admin/development/info.json +++ b/public/language/pt-PT/admin/development/info.json @@ -1,10 +1,12 @@ { "you-are-on": "Info - You are on %1:%2", + "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", "pid": "pid", "nodejs": "nodejs", "online": "online", "git": "git", + "memory": "memory", "load": "load", "uptime": "uptime", diff --git a/public/language/pt-PT/admin/general/dashboard.json b/public/language/pt-PT/admin/general/dashboard.json index 02046bd17a..61f4421fb5 100644 --- a/public/language/pt-PT/admin/general/dashboard.json +++ b/public/language/pt-PT/admin/general/dashboard.json @@ -5,9 +5,14 @@ "users": "Users", "posts": "Posts", "topics": "Topics", - "page-views-last-month": "Page views Last Month", - "page-views-this-month": "Page views This Month", - "page-views-last-day": "Page views in last 24 hours", + "page-views-seven": "Last 7 Days", + "page-views-thirty": "Last 30 Days", + "page-views-last-day": "Last 24 hours", + "page-views-custom": "Custom Date Range", + "page-views-custom-start": "Range Start", + "page-views-custom-end": "Range End", + "page-views-custom-help": "Enter a date range of page views you would like to view. If no date picker is available, the accepted format is YYYY-MM-DD", + "page-views-custom-error": "Please enter a valid date range in the format YYYY-MM-DD", "stats.day": "Day", "stats.week": "Week", diff --git a/public/language/pt-PT/admin/general/languages.json b/public/language/pt-PT/admin/general/languages.json index da45cade2c..bdd57849b3 100644 --- a/public/language/pt-PT/admin/general/languages.json +++ b/public/language/pt-PT/admin/general/languages.json @@ -1,5 +1,6 @@ { "language-settings": "Language Settings", "description": "The default language determines the language settings for all users who are visiting your forum.
Individual users can override the default language on their account settings page.", - "default-language": "Default Language" + "default-language": "Default Language", + "auto-detect": "Auto Detect Language Setting for Guests" } \ No newline at end of file diff --git a/public/language/pt-PT/admin/settings/user.json b/public/language/pt-PT/admin/settings/user.json index b8f51c9288..fa8049c3a9 100644 --- a/public/language/pt-PT/admin/settings/user.json +++ b/public/language/pt-PT/admin/settings/user.json @@ -34,6 +34,8 @@ "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", + "invite-expiration": "Invite expiration", + "invite-expiration-help": "# of days invitations expire in.", "min-username-length": "Minimum Username Length", "max-username-length": "Maximum Username Length", "min-password-length": "Minimum Password Length", diff --git a/public/language/pt-PT/error.json b/public/language/pt-PT/error.json index d87e005288..07fa77e963 100644 --- a/public/language/pt-PT/error.json +++ b/public/language/pt-PT/error.json @@ -1,5 +1,6 @@ { "invalid-data": "Dados inválidos", + "invalid-json": "Invalid JSON", "not-logged-in": "Não tem sessão iniciada.", "account-locked": "A sua conta foi bloqueada temporariamente", "search-requires-login": "A pesquisa requer uma conta de utilizador - For favor inicie sessão ou crie uma conta.", @@ -12,6 +13,7 @@ "invalid-title": "Título inválido!", "invalid-user-data": "Dados de utilizador inválidos", "invalid-password": "Senha inválida", + "invalid-login-credentials": "Invalid login credentials", "invalid-username-or-password": "Por favor especificar um nome de utilizador e senha", "invalid-search-term": "Termo de pesquisa inválido", "csrf-invalid": "Não conseguimos efetuar o teu login, provavelmente devido a uma sessão que já expirou. Por favor, tenta novamente", diff --git a/public/language/pt-PT/flags.json b/public/language/pt-PT/flags.json index c4bfed6f23..8d1d58cbf4 100644 --- a/public/language/pt-PT/flags.json +++ b/public/language/pt-PT/flags.json @@ -2,59 +2,59 @@ "state": "State", "reporter": "Reporter", "reported-at": "Reported At", - "description": "Description", + "description": "Descrição", "no-flags": "Hooray! No flags found.", "assignee": "Assignee", - "update": "Update", - "updated": "Updated", + "update": "Atualizar", + "updated": "Atualizado", "target-purged": "The content this flag referred to has been purged and is no longer available.", - "quick-filters": "Quick Filters", + "quick-filters": "Filtros Rápidos", "filter-active": "There are one or more filters active in this list of flags", - "filter-reset": "Remove Filters", - "filters": "Filter Options", + "filter-reset": "Remover Filtros", + "filters": "Opções dos Filtros", "filter-reporterId": "Reporter UID", "filter-targetUid": "Flagged UID", "filter-type": "Flag Type", - "filter-type-all": "All Content", - "filter-type-post": "Post", + "filter-type-all": "Todo o Conteúdo", + "filter-type-post": "Publicação", "filter-state": "State", "filter-assignee": "Assignee UID", - "filter-cid": "Category", - "filter-quick-mine": "Assigned to me", - "filter-cid-all": "All categories", - "apply-filters": "Apply Filters", + "filter-cid": "Categoria", + "filter-quick-mine": "Atribuído a mim", + "filter-cid-all": "Todas as categorias", + "apply-filters": "Aplicar Filtros", - "quick-links": "Quick Links", - "flagged-user": "Flagged User", - "view-profile": "View Profile", - "start-new-chat": "Start New Chat", - "go-to-target": "View Flag Target", + "quick-links": "Links Rápidos", + "flagged-user": "Utilizador Sinalizado", + "view-profile": "Ver Perfil", + "start-new-chat": "Iniciar Nova Conversa", + "go-to-target": "Ver Alvo da Sinalização", - "user-view": "View Profile", - "user-edit": "Edit Profile", + "user-view": "Ver Perfil", + "user-edit": "Editar Perfil", - "notes": "Flag Notes", - "add-note": "Add Note", - "no-notes": "No shared notes.", + "notes": "Sinalizar Notas", + "add-note": "Adicionar Nota", + "no-notes": "Não existem notas partilhadas.", - "history": "Flag History", - "back": "Back to Flags List", - "no-history": "No flag history.", + "history": "Histórico de Sinalizações", + "back": "Voltar para a Lista de Sinalizações", + "no-history": "Não existe histórico de sinalizações.", - "state-all": "All states", - "state-open": "New/Open", - "state-wip": "Work in Progress", - "state-resolved": "Resolved", - "state-rejected": "Rejected", - "no-assignee": "Not Assigned", - "note-added": "Note Added", + "state-all": "Todos os estados", + "state-open": "Novo/Abrir", + "state-wip": "Trabalho em Progresso", + "state-resolved": "Resolvido", + "state-rejected": "Rejeitado", + "no-assignee": "Não Atribuído", + "note-added": "Nota Adicionada.", "modal-title": "Report Inappropriate Content", "modal-body": "Please specify your reason for flagging %1 %2 for review. Alternatively, use one of the quick report buttons if applicable.", "modal-reason-spam": "Spam", - "modal-reason-offensive": "Offensive", - "modal-reason-custom": "Reason for reporting this content...", - "modal-submit": "Submit Report", - "modal-submit-success": "Content has been flagged for moderation." + "modal-reason-offensive": "Ofensivo", + "modal-reason-custom": "Motivo para reportar este conteúdo...", + "modal-submit": "Submeter Relatório", + "modal-submit-success": "Conteúdo sinalizado para moderação." } \ No newline at end of file diff --git a/public/language/pt-PT/topic.json b/public/language/pt-PT/topic.json index 6622afb644..f5084825c0 100644 --- a/public/language/pt-PT/topic.json +++ b/public/language/pt-PT/topic.json @@ -14,6 +14,7 @@ "quote": "Citar", "reply": "Responder", "replies_to_this_post": "%1 Replies", + "one_reply_to_this_post": "1 Reply", "last_reply_time": "Last reply", "reply-as-topic": "Responder com um tópico", "guest-login-reply": "Faz login para responder", diff --git a/public/language/ro/admin/appearance/customise.json b/public/language/ro/admin/appearance/customise.json index 767d443e29..5095f7a937 100644 --- a/public/language/ro/admin/appearance/customise.json +++ b/public/language/ro/admin/appearance/customise.json @@ -5,5 +5,8 @@ "custom-header": "Custom Header", "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", - "custom-header.enable": "Enable Custom Header" + "custom-header.enable": "Enable Custom Header", + + "custom-css.livereload": "Enable Live Reload", + "custom-css.livereload.description": "Enable this to force all sessions on every device under your account to refresh whenever you click save" } \ No newline at end of file diff --git a/public/language/ro/admin/development/info.json b/public/language/ro/admin/development/info.json index b2768ca212..0a4ae6fe2c 100644 --- a/public/language/ro/admin/development/info.json +++ b/public/language/ro/admin/development/info.json @@ -1,10 +1,12 @@ { "you-are-on": "Info - You are on %1:%2", + "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", "pid": "pid", "nodejs": "nodejs", "online": "online", "git": "git", + "memory": "memory", "load": "load", "uptime": "uptime", diff --git a/public/language/ro/admin/general/dashboard.json b/public/language/ro/admin/general/dashboard.json index 02046bd17a..61f4421fb5 100644 --- a/public/language/ro/admin/general/dashboard.json +++ b/public/language/ro/admin/general/dashboard.json @@ -5,9 +5,14 @@ "users": "Users", "posts": "Posts", "topics": "Topics", - "page-views-last-month": "Page views Last Month", - "page-views-this-month": "Page views This Month", - "page-views-last-day": "Page views in last 24 hours", + "page-views-seven": "Last 7 Days", + "page-views-thirty": "Last 30 Days", + "page-views-last-day": "Last 24 hours", + "page-views-custom": "Custom Date Range", + "page-views-custom-start": "Range Start", + "page-views-custom-end": "Range End", + "page-views-custom-help": "Enter a date range of page views you would like to view. If no date picker is available, the accepted format is YYYY-MM-DD", + "page-views-custom-error": "Please enter a valid date range in the format YYYY-MM-DD", "stats.day": "Day", "stats.week": "Week", diff --git a/public/language/ro/admin/general/languages.json b/public/language/ro/admin/general/languages.json index da45cade2c..bdd57849b3 100644 --- a/public/language/ro/admin/general/languages.json +++ b/public/language/ro/admin/general/languages.json @@ -1,5 +1,6 @@ { "language-settings": "Language Settings", "description": "The default language determines the language settings for all users who are visiting your forum.
Individual users can override the default language on their account settings page.", - "default-language": "Default Language" + "default-language": "Default Language", + "auto-detect": "Auto Detect Language Setting for Guests" } \ No newline at end of file diff --git a/public/language/ro/admin/settings/user.json b/public/language/ro/admin/settings/user.json index b8f51c9288..fa8049c3a9 100644 --- a/public/language/ro/admin/settings/user.json +++ b/public/language/ro/admin/settings/user.json @@ -34,6 +34,8 @@ "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", + "invite-expiration": "Invite expiration", + "invite-expiration-help": "# of days invitations expire in.", "min-username-length": "Minimum Username Length", "max-username-length": "Maximum Username Length", "min-password-length": "Minimum Password Length", diff --git a/public/language/ro/error.json b/public/language/ro/error.json index 82112f70c0..6a7ecea6f3 100644 --- a/public/language/ro/error.json +++ b/public/language/ro/error.json @@ -1,5 +1,6 @@ { "invalid-data": "Date invalide", + "invalid-json": "Invalid JSON", "not-logged-in": "Se pare ca nu ești logat.", "account-locked": "Contul tău a fost blocat temporar", "search-requires-login": "Pentru a cauta ai nevoie de un cont. Logheaza-te sau autentifica-te.", @@ -12,6 +13,7 @@ "invalid-title": "Titlu invalid!", "invalid-user-data": "Date utilizator invalide", "invalid-password": "Parolă Invalidă", + "invalid-login-credentials": "Invalid login credentials", "invalid-username-or-password": "Te rugăm să specifici atât un nume de utilizator cât si o parolă", "invalid-search-term": "Cuvânt de căutare invalid", "csrf-invalid": "We were unable to log you in, likely due to an expired session. Please try again", diff --git a/public/language/ro/topic.json b/public/language/ro/topic.json index 370981d72e..076bf3bcf1 100644 --- a/public/language/ro/topic.json +++ b/public/language/ro/topic.json @@ -14,6 +14,7 @@ "quote": "Citează", "reply": "Răspunde", "replies_to_this_post": "%1 Replies", + "one_reply_to_this_post": "1 Reply", "last_reply_time": "Last reply", "reply-as-topic": "Răspunde ca subiect", "guest-login-reply": "Login pentru a răspunde", diff --git a/public/language/ru/admin/appearance/customise.json b/public/language/ru/admin/appearance/customise.json index 226ce535ee..dfed0bf11c 100644 --- a/public/language/ru/admin/appearance/customise.json +++ b/public/language/ru/admin/appearance/customise.json @@ -5,5 +5,8 @@ "custom-header": "Custom Header", "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", - "custom-header.enable": "Enable Custom Header" + "custom-header.enable": "Enable Custom Header", + + "custom-css.livereload": "Enable Live Reload", + "custom-css.livereload.description": "Enable this to force all sessions on every device under your account to refresh whenever you click save" } \ No newline at end of file diff --git a/public/language/ru/admin/development/info.json b/public/language/ru/admin/development/info.json index b2768ca212..0a4ae6fe2c 100644 --- a/public/language/ru/admin/development/info.json +++ b/public/language/ru/admin/development/info.json @@ -1,10 +1,12 @@ { "you-are-on": "Info - You are on %1:%2", + "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", "pid": "pid", "nodejs": "nodejs", "online": "online", "git": "git", + "memory": "memory", "load": "load", "uptime": "uptime", diff --git a/public/language/ru/admin/general/dashboard.json b/public/language/ru/admin/general/dashboard.json index 02e228ba2e..31eae5031a 100644 --- a/public/language/ru/admin/general/dashboard.json +++ b/public/language/ru/admin/general/dashboard.json @@ -5,9 +5,14 @@ "users": "Users", "posts": "Posts", "topics": "Topics", - "page-views-last-month": "Просмотров за прошлый месяц", - "page-views-this-month": "Просмотров за этот месяц", - "page-views-last-day": "Просмотров за 24 часа", + "page-views-seven": "Last 7 Days", + "page-views-thirty": "Last 30 Days", + "page-views-last-day": "Last 24 hours", + "page-views-custom": "Custom Date Range", + "page-views-custom-start": "Range Start", + "page-views-custom-end": "Range End", + "page-views-custom-help": "Enter a date range of page views you would like to view. If no date picker is available, the accepted format is YYYY-MM-DD", + "page-views-custom-error": "Please enter a valid date range in the format YYYY-MM-DD", "stats.day": "День", "stats.week": "Неделя", diff --git a/public/language/ru/admin/general/languages.json b/public/language/ru/admin/general/languages.json index da45cade2c..bdd57849b3 100644 --- a/public/language/ru/admin/general/languages.json +++ b/public/language/ru/admin/general/languages.json @@ -1,5 +1,6 @@ { "language-settings": "Language Settings", "description": "The default language determines the language settings for all users who are visiting your forum.
Individual users can override the default language on their account settings page.", - "default-language": "Default Language" + "default-language": "Default Language", + "auto-detect": "Auto Detect Language Setting for Guests" } \ No newline at end of file diff --git a/public/language/ru/admin/settings/user.json b/public/language/ru/admin/settings/user.json index b8f51c9288..fa8049c3a9 100644 --- a/public/language/ru/admin/settings/user.json +++ b/public/language/ru/admin/settings/user.json @@ -34,6 +34,8 @@ "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", + "invite-expiration": "Invite expiration", + "invite-expiration-help": "# of days invitations expire in.", "min-username-length": "Minimum Username Length", "max-username-length": "Maximum Username Length", "min-password-length": "Minimum Password Length", diff --git a/public/language/ru/error.json b/public/language/ru/error.json index c1aecb322e..822af1d494 100644 --- a/public/language/ru/error.json +++ b/public/language/ru/error.json @@ -1,5 +1,6 @@ { "invalid-data": "Неверные данные", + "invalid-json": "Invalid JSON", "not-logged-in": "Вы не вошли на сайт.", "account-locked": "Учётная запись временно заблокирована", "search-requires-login": "Поиск доступен только для зарегистрированных участников. Пожалуйста, войдите или зарегистрируйтесь.", @@ -12,6 +13,7 @@ "invalid-title": "Неверный заголовок", "invalid-user-data": "Неверные пользовательские данные", "invalid-password": "Неверный пароль", + "invalid-login-credentials": "Invalid login credentials", "invalid-username-or-password": "Пожалуйста, укажите имя пользователя и пароль", "invalid-search-term": "Неверный поисковой запрос", "csrf-invalid": "Нам не удалось вас найти из-за просроченной сессии. Попробуйте ещё раз.", diff --git a/public/language/ru/flags.json b/public/language/ru/flags.json index c4bfed6f23..6a5776a4f2 100644 --- a/public/language/ru/flags.json +++ b/public/language/ru/flags.json @@ -2,59 +2,59 @@ "state": "State", "reporter": "Reporter", "reported-at": "Reported At", - "description": "Description", + "description": "Описание", "no-flags": "Hooray! No flags found.", "assignee": "Assignee", - "update": "Update", - "updated": "Updated", + "update": "Обновить", + "updated": "Обновлено", "target-purged": "The content this flag referred to has been purged and is no longer available.", "quick-filters": "Quick Filters", "filter-active": "There are one or more filters active in this list of flags", - "filter-reset": "Remove Filters", + "filter-reset": "Убрать фильтры", "filters": "Filter Options", "filter-reporterId": "Reporter UID", "filter-targetUid": "Flagged UID", "filter-type": "Flag Type", - "filter-type-all": "All Content", + "filter-type-all": "Весь контент", "filter-type-post": "Post", "filter-state": "State", "filter-assignee": "Assignee UID", - "filter-cid": "Category", + "filter-cid": "Категория", "filter-quick-mine": "Assigned to me", - "filter-cid-all": "All categories", + "filter-cid-all": "Все категории", "apply-filters": "Apply Filters", "quick-links": "Quick Links", "flagged-user": "Flagged User", - "view-profile": "View Profile", - "start-new-chat": "Start New Chat", + "view-profile": "Просмотреть профиль", + "start-new-chat": "Начать новый чат", "go-to-target": "View Flag Target", - "user-view": "View Profile", - "user-edit": "Edit Profile", + "user-view": "Просмотреть профиль", + "user-edit": "Изменить Профиль", "notes": "Flag Notes", - "add-note": "Add Note", + "add-note": "Добавить примечание", "no-notes": "No shared notes.", "history": "Flag History", "back": "Back to Flags List", "no-history": "No flag history.", - "state-all": "All states", - "state-open": "New/Open", + "state-all": "Все государства", + "state-open": "Новый/Открыть", "state-wip": "Work in Progress", - "state-resolved": "Resolved", - "state-rejected": "Rejected", - "no-assignee": "Not Assigned", + "state-resolved": "Решен", + "state-rejected": "Отклонен", + "no-assignee": "Не назначенный ", "note-added": "Note Added", "modal-title": "Report Inappropriate Content", "modal-body": "Please specify your reason for flagging %1 %2 for review. Alternatively, use one of the quick report buttons if applicable.", - "modal-reason-spam": "Spam", + "modal-reason-spam": "Спам", "modal-reason-offensive": "Offensive", "modal-reason-custom": "Reason for reporting this content...", - "modal-submit": "Submit Report", + "modal-submit": "Представить отчет", "modal-submit-success": "Content has been flagged for moderation." } \ No newline at end of file diff --git a/public/language/ru/topic.json b/public/language/ru/topic.json index 45e0d731a3..06e341357a 100644 --- a/public/language/ru/topic.json +++ b/public/language/ru/topic.json @@ -14,6 +14,7 @@ "quote": "Цитировать", "reply": "Ответить", "replies_to_this_post": "%1 Replies", + "one_reply_to_this_post": "1 Reply", "last_reply_time": "Last reply", "reply-as-topic": "Ответить, создав новую тему", "guest-login-reply": "Необходимо авторизоваться на сайте, чтобы оставить сообщение. Пожалуйста, зарегистрируйтесь или войдите на сайт.", diff --git a/public/language/rw/admin/appearance/customise.json b/public/language/rw/admin/appearance/customise.json index 767d443e29..5095f7a937 100644 --- a/public/language/rw/admin/appearance/customise.json +++ b/public/language/rw/admin/appearance/customise.json @@ -5,5 +5,8 @@ "custom-header": "Custom Header", "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", - "custom-header.enable": "Enable Custom Header" + "custom-header.enable": "Enable Custom Header", + + "custom-css.livereload": "Enable Live Reload", + "custom-css.livereload.description": "Enable this to force all sessions on every device under your account to refresh whenever you click save" } \ No newline at end of file diff --git a/public/language/rw/admin/development/info.json b/public/language/rw/admin/development/info.json index b2768ca212..0a4ae6fe2c 100644 --- a/public/language/rw/admin/development/info.json +++ b/public/language/rw/admin/development/info.json @@ -1,10 +1,12 @@ { "you-are-on": "Info - You are on %1:%2", + "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", "pid": "pid", "nodejs": "nodejs", "online": "online", "git": "git", + "memory": "memory", "load": "load", "uptime": "uptime", diff --git a/public/language/rw/admin/general/dashboard.json b/public/language/rw/admin/general/dashboard.json index 02046bd17a..61f4421fb5 100644 --- a/public/language/rw/admin/general/dashboard.json +++ b/public/language/rw/admin/general/dashboard.json @@ -5,9 +5,14 @@ "users": "Users", "posts": "Posts", "topics": "Topics", - "page-views-last-month": "Page views Last Month", - "page-views-this-month": "Page views This Month", - "page-views-last-day": "Page views in last 24 hours", + "page-views-seven": "Last 7 Days", + "page-views-thirty": "Last 30 Days", + "page-views-last-day": "Last 24 hours", + "page-views-custom": "Custom Date Range", + "page-views-custom-start": "Range Start", + "page-views-custom-end": "Range End", + "page-views-custom-help": "Enter a date range of page views you would like to view. If no date picker is available, the accepted format is YYYY-MM-DD", + "page-views-custom-error": "Please enter a valid date range in the format YYYY-MM-DD", "stats.day": "Day", "stats.week": "Week", diff --git a/public/language/rw/admin/general/languages.json b/public/language/rw/admin/general/languages.json index da45cade2c..bdd57849b3 100644 --- a/public/language/rw/admin/general/languages.json +++ b/public/language/rw/admin/general/languages.json @@ -1,5 +1,6 @@ { "language-settings": "Language Settings", "description": "The default language determines the language settings for all users who are visiting your forum.
Individual users can override the default language on their account settings page.", - "default-language": "Default Language" + "default-language": "Default Language", + "auto-detect": "Auto Detect Language Setting for Guests" } \ No newline at end of file diff --git a/public/language/rw/admin/settings/user.json b/public/language/rw/admin/settings/user.json index b8f51c9288..fa8049c3a9 100644 --- a/public/language/rw/admin/settings/user.json +++ b/public/language/rw/admin/settings/user.json @@ -34,6 +34,8 @@ "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", + "invite-expiration": "Invite expiration", + "invite-expiration-help": "# of days invitations expire in.", "min-username-length": "Minimum Username Length", "max-username-length": "Maximum Username Length", "min-password-length": "Minimum Password Length", diff --git a/public/language/rw/error.json b/public/language/rw/error.json index 3e6c5cdeff..42bee55552 100644 --- a/public/language/rw/error.json +++ b/public/language/rw/error.json @@ -1,5 +1,6 @@ { "invalid-data": "Ibyashyizwemo Ntibyemewe", + "invalid-json": "Invalid JSON", "not-logged-in": "Biragaragara ko utinjiyemo.", "account-locked": "Konte yawe yabaye ifunze", "search-requires-login": "Gushaka ikintu bisaba kuba ufite konte - Injiramo cyangwa wiyandike.", @@ -12,6 +13,7 @@ "invalid-title": "Umutwe utemewe!", "invalid-user-data": "Ibyatanzwe Ntibyemewe!", "invalid-password": "Ijambobanga Ntiryemewe", + "invalid-login-credentials": "Invalid login credentials", "invalid-username-or-password": "Tanga izina ukoresha n'ijambobanga", "invalid-search-term": "Icyashatswe nticyemewe", "csrf-invalid": "We were unable to log you in, likely due to an expired session. Please try again", diff --git a/public/language/rw/topic.json b/public/language/rw/topic.json index b8d25791e2..d4f9477ff9 100644 --- a/public/language/rw/topic.json +++ b/public/language/rw/topic.json @@ -14,6 +14,7 @@ "quote": "Terura", "reply": "Subiza", "replies_to_this_post": "%1 Replies", + "one_reply_to_this_post": "1 Reply", "last_reply_time": "Last reply", "reply-as-topic": "Bishyireho nk'ikiganiro", "guest-login-reply": "Injiramo maze usubize", diff --git a/public/language/sc/admin/appearance/customise.json b/public/language/sc/admin/appearance/customise.json index 767d443e29..5095f7a937 100644 --- a/public/language/sc/admin/appearance/customise.json +++ b/public/language/sc/admin/appearance/customise.json @@ -5,5 +5,8 @@ "custom-header": "Custom Header", "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", - "custom-header.enable": "Enable Custom Header" + "custom-header.enable": "Enable Custom Header", + + "custom-css.livereload": "Enable Live Reload", + "custom-css.livereload.description": "Enable this to force all sessions on every device under your account to refresh whenever you click save" } \ No newline at end of file diff --git a/public/language/sc/admin/development/info.json b/public/language/sc/admin/development/info.json index b2768ca212..0a4ae6fe2c 100644 --- a/public/language/sc/admin/development/info.json +++ b/public/language/sc/admin/development/info.json @@ -1,10 +1,12 @@ { "you-are-on": "Info - You are on %1:%2", + "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", "pid": "pid", "nodejs": "nodejs", "online": "online", "git": "git", + "memory": "memory", "load": "load", "uptime": "uptime", diff --git a/public/language/sc/admin/general/dashboard.json b/public/language/sc/admin/general/dashboard.json index 02046bd17a..61f4421fb5 100644 --- a/public/language/sc/admin/general/dashboard.json +++ b/public/language/sc/admin/general/dashboard.json @@ -5,9 +5,14 @@ "users": "Users", "posts": "Posts", "topics": "Topics", - "page-views-last-month": "Page views Last Month", - "page-views-this-month": "Page views This Month", - "page-views-last-day": "Page views in last 24 hours", + "page-views-seven": "Last 7 Days", + "page-views-thirty": "Last 30 Days", + "page-views-last-day": "Last 24 hours", + "page-views-custom": "Custom Date Range", + "page-views-custom-start": "Range Start", + "page-views-custom-end": "Range End", + "page-views-custom-help": "Enter a date range of page views you would like to view. If no date picker is available, the accepted format is YYYY-MM-DD", + "page-views-custom-error": "Please enter a valid date range in the format YYYY-MM-DD", "stats.day": "Day", "stats.week": "Week", diff --git a/public/language/sc/admin/general/languages.json b/public/language/sc/admin/general/languages.json index da45cade2c..bdd57849b3 100644 --- a/public/language/sc/admin/general/languages.json +++ b/public/language/sc/admin/general/languages.json @@ -1,5 +1,6 @@ { "language-settings": "Language Settings", "description": "The default language determines the language settings for all users who are visiting your forum.
Individual users can override the default language on their account settings page.", - "default-language": "Default Language" + "default-language": "Default Language", + "auto-detect": "Auto Detect Language Setting for Guests" } \ No newline at end of file diff --git a/public/language/sc/admin/settings/user.json b/public/language/sc/admin/settings/user.json index b8f51c9288..fa8049c3a9 100644 --- a/public/language/sc/admin/settings/user.json +++ b/public/language/sc/admin/settings/user.json @@ -34,6 +34,8 @@ "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", + "invite-expiration": "Invite expiration", + "invite-expiration-help": "# of days invitations expire in.", "min-username-length": "Minimum Username Length", "max-username-length": "Maximum Username Length", "min-password-length": "Minimum Password Length", diff --git a/public/language/sc/error.json b/public/language/sc/error.json index 35eaf8cbc6..403c0b4aa7 100644 --- a/public/language/sc/error.json +++ b/public/language/sc/error.json @@ -1,5 +1,6 @@ { "invalid-data": "Invalid Data", + "invalid-json": "Invalid JSON", "not-logged-in": "You don't seem to be logged in.", "account-locked": "Your account has been locked temporarily", "search-requires-login": "Searching requires an account - please login or register.", @@ -12,6 +13,7 @@ "invalid-title": "Invalid title!", "invalid-user-data": "Invalid User Data", "invalid-password": "Invalid Password", + "invalid-login-credentials": "Invalid login credentials", "invalid-username-or-password": "Please specify both a username and password", "invalid-search-term": "Invalid search term", "csrf-invalid": "We were unable to log you in, likely due to an expired session. Please try again", diff --git a/public/language/sc/topic.json b/public/language/sc/topic.json index 9ce7552faa..8ab46f4eaa 100644 --- a/public/language/sc/topic.json +++ b/public/language/sc/topic.json @@ -14,6 +14,7 @@ "quote": "Mèntova", "reply": "Risponde", "replies_to_this_post": "%1 Replies", + "one_reply_to_this_post": "1 Reply", "last_reply_time": "Last reply", "reply-as-topic": "Reply as topic", "guest-login-reply": "Log in to reply", diff --git a/public/language/sk/admin/advanced/errors.json b/public/language/sk/admin/advanced/errors.json index 02a4a0c461..c2cc92e033 100644 --- a/public/language/sk/admin/advanced/errors.json +++ b/public/language/sk/admin/advanced/errors.json @@ -1,6 +1,6 @@ { "figure-x": "Znázorniť %1", - "error-events-per-day": "%1 events per day", + "error-events-per-day": "%1 udalostí za deň", "error.404": "404 Nenájdené", "error.503": "503 Služba nie je k dispozícií", "manage-error-log": "Manage Error Log", diff --git a/public/language/sk/admin/appearance/customise.json b/public/language/sk/admin/appearance/customise.json index 8a69b45f84..1cf04a6c75 100644 --- a/public/language/sk/admin/appearance/customise.json +++ b/public/language/sk/admin/appearance/customise.json @@ -1,9 +1,12 @@ { "custom-css": "Vlastné CSS", - "custom-css.description": "Enter your own CSS declarations here, which will be applied after all other styles.", + "custom-css.description": "Zadajte svoje vlastné deklarácie CSS, ktoré budú použité po všetkých ostatných štýloch.", "custom-css.enable": "Enable Custom CSS", "custom-header": "Custom Header", "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", - "custom-header.enable": "Enable Custom Header" + "custom-header.enable": "Enable Custom Header", + + "custom-css.livereload": "Enable Live Reload", + "custom-css.livereload.description": "Enable this to force all sessions on every device under your account to refresh whenever you click save" } \ No newline at end of file diff --git a/public/language/sk/admin/development/info.json b/public/language/sk/admin/development/info.json index b2768ca212..0a4ae6fe2c 100644 --- a/public/language/sk/admin/development/info.json +++ b/public/language/sk/admin/development/info.json @@ -1,10 +1,12 @@ { "you-are-on": "Info - You are on %1:%2", + "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", "pid": "pid", "nodejs": "nodejs", "online": "online", "git": "git", + "memory": "memory", "load": "load", "uptime": "uptime", diff --git a/public/language/sk/admin/development/logger.json b/public/language/sk/admin/development/logger.json index 6ab9558149..1aac321d37 100644 --- a/public/language/sk/admin/development/logger.json +++ b/public/language/sk/admin/development/logger.json @@ -1,6 +1,6 @@ { - "logger-settings": "Logger Settings", - "description": "By enabling the check boxes, you will receive logs to your terminal. If you specify a path, logs will then be saved to a file instead. HTTP logging is useful for collecting statistics about who, when, and what people access on your forum. In addition to logging HTTP requests, we can also log socket.io events. Socket.io logging, in combination with redis-cli monitor, can be very helpful for learning NodeBB's internals.", + "logger-settings": "Nastavenia protokolov", + "description": "Povolením začiarkavacích políčok budete dostávať protokoly do terminálu. Ak zadáte cestu, protokoly sa potom uložia do súboru. HTTP protokolovanie je užitočné pri zbere štatistických údajov o tom, kto, kedy a čo ľudia pristupujú na vaše fórum. Okrem zaznamenávania požiadaviek HTTP môžeme zaznamenať udalosti socket.io. Socket.io protokolovanie v kombinácii s monitorom redis-cli môže byť veľmi užitočné pre učenie NodeBB vstavby.", "explanation": "Simply check/uncheck the logging settings to enable or disable logging on the fly. No restart needed.", "enable-http": "Enable HTTP logging", "enable-socket": "Enable socket.io event logging", diff --git a/public/language/sk/admin/extend/plugins.json b/public/language/sk/admin/extend/plugins.json index 1661a987b7..a5dae9836a 100644 --- a/public/language/sk/admin/extend/plugins.json +++ b/public/language/sk/admin/extend/plugins.json @@ -1,6 +1,6 @@ { - "installed": "Installed", - "active": "Active", + "installed": "Nainštalovaný", + "active": "Aktívny", "inactive": "Inactive", "out-of-date": "Out of Date", "none-found": "No plugins found.", diff --git a/public/language/sk/admin/extend/rewards.json b/public/language/sk/admin/extend/rewards.json index 5383a90b33..413cd9bc83 100644 --- a/public/language/sk/admin/extend/rewards.json +++ b/public/language/sk/admin/extend/rewards.json @@ -1,6 +1,6 @@ { - "rewards": "Rewards", - "condition-if-users": "If User's", + "rewards": "Odmeny", + "condition-if-users": "Ak je používateľ", "condition-is": "Is:", "condition-then": "Then:", "max-claims": "Amount of times reward is claimable", diff --git a/public/language/sk/admin/extend/widgets.json b/public/language/sk/admin/extend/widgets.json index 477bb15e56..5b2da907fe 100644 --- a/public/language/sk/admin/extend/widgets.json +++ b/public/language/sk/admin/extend/widgets.json @@ -1,6 +1,6 @@ { - "available": "Available Widgets", - "explanation": "Select a widget from the dropdown menu and then drag and drop it into a template's widget area on the left.", + "available": "Dostupné miniaplikácie", + "explanation": "V rozbaľovacej ponuke vyberte miniaplikáciu a potom ju presuňte do oblasti miniaplikácií šablóny.", "none-installed": "No widgets found! Activate the essential widgets plugin in the plugins control panel.", "containers.available": "Available Containers", "containers.explanation": "Drag and drop on top of any active widget", diff --git a/public/language/sk/admin/general/dashboard.json b/public/language/sk/admin/general/dashboard.json index 1ffb1c8f76..6ef0ee9fc2 100644 --- a/public/language/sk/admin/general/dashboard.json +++ b/public/language/sk/admin/general/dashboard.json @@ -5,9 +5,14 @@ "users": "Užívatelia", "posts": "Príspevky", "topics": "Témy", - "page-views-last-month": "Zobrazenia stránok za posledný mesiac", - "page-views-this-month": "Zobrazenia stránok za tento mesiac", - "page-views-last-day": "Zobrazenia stránok za posledných 24 hodín", + "page-views-seven": "Last 7 Days", + "page-views-thirty": "Last 30 Days", + "page-views-last-day": "Last 24 hours", + "page-views-custom": "Custom Date Range", + "page-views-custom-start": "Range Start", + "page-views-custom-end": "Range End", + "page-views-custom-help": "Enter a date range of page views you would like to view. If no date picker is available, the accepted format is YYYY-MM-DD", + "page-views-custom-error": "Please enter a valid date range in the format YYYY-MM-DD", "stats.day": "Deň", "stats.week": "Týždeň", diff --git a/public/language/sk/admin/general/homepage.json b/public/language/sk/admin/general/homepage.json index 4866b8baf6..23c407427f 100644 --- a/public/language/sk/admin/general/homepage.json +++ b/public/language/sk/admin/general/homepage.json @@ -1,6 +1,6 @@ { - "home-page": "Home Page", - "description": "Choose what page is shown when users navigate to the root URL of your forum.", + "home-page": "Domovská stránka", + "description": "Vyberte, akú stránku sa zobrazí, keď sa používatelia dostanú do koreňovej adresy URL vášho fóra.", "home-page-route": "Home Page Route", "custom-route": "Custom Route", "allow-user-home-pages": "Allow User Home Pages" diff --git a/public/language/sk/admin/general/languages.json b/public/language/sk/admin/general/languages.json index da45cade2c..d43828e793 100644 --- a/public/language/sk/admin/general/languages.json +++ b/public/language/sk/admin/general/languages.json @@ -1,5 +1,6 @@ { - "language-settings": "Language Settings", + "language-settings": "Jazykové nastavenia", "description": "The default language determines the language settings for all users who are visiting your forum.
Individual users can override the default language on their account settings page.", - "default-language": "Default Language" + "default-language": "Default Language", + "auto-detect": "Auto Detect Language Setting for Guests" } \ No newline at end of file diff --git a/public/language/sk/admin/general/navigation.json b/public/language/sk/admin/general/navigation.json index c4ba0d09ac..215cf9ba10 100644 --- a/public/language/sk/admin/general/navigation.json +++ b/public/language/sk/admin/general/navigation.json @@ -1,5 +1,5 @@ { - "icon": "Icon:", + "icon": "Ikona:", "change-icon": "change", "route": "Route:", "tooltip": "Tooltip:", diff --git a/public/language/sk/admin/general/social.json b/public/language/sk/admin/general/social.json index 23aedfcfaa..5f802719c0 100644 --- a/public/language/sk/admin/general/social.json +++ b/public/language/sk/admin/general/social.json @@ -1,5 +1,5 @@ { - "post-sharing": "Post Sharing", + "post-sharing": "Zdieľanie príspevkov", "info-plugins-additional": "Plugins can add additional networks for sharing posts.", "save-success": "Successfully saved Post Sharing Networks!" } \ No newline at end of file diff --git a/public/language/sk/admin/general/sounds.json b/public/language/sk/admin/general/sounds.json index 95ccbde0f1..e13810f4cb 100644 --- a/public/language/sk/admin/general/sounds.json +++ b/public/language/sk/admin/general/sounds.json @@ -1,5 +1,5 @@ { - "notifications": "Notifications", + "notifications": "Oznámenia", "chat-messages": "Chat Messages", "play-sound": "Play", "incoming-message": "Incoming Message", diff --git a/public/language/sk/admin/manage/categories.json b/public/language/sk/admin/manage/categories.json index 7e2a5ce12e..a76dd051f4 100644 --- a/public/language/sk/admin/manage/categories.json +++ b/public/language/sk/admin/manage/categories.json @@ -1,5 +1,5 @@ { - "settings": "Category Settings", + "settings": "Nastavenia kategórie", "privileges": "Privileges", "name": "Category Name", diff --git a/public/language/sk/admin/manage/groups.json b/public/language/sk/admin/manage/groups.json index c019ec9823..cc3de74004 100644 --- a/public/language/sk/admin/manage/groups.json +++ b/public/language/sk/admin/manage/groups.json @@ -1,5 +1,5 @@ { - "name": "Group Name", + "name": "Názov skupiny", "description": "Group Description", "member-count": "Member Count", "system": "System Group", diff --git a/public/language/sk/admin/manage/ip-blacklist.json b/public/language/sk/admin/manage/ip-blacklist.json index 5106434351..e7aadd2d5e 100644 --- a/public/language/sk/admin/manage/ip-blacklist.json +++ b/public/language/sk/admin/manage/ip-blacklist.json @@ -1,5 +1,5 @@ { - "lead": "Configure your IP blacklist here.", + "lead": "Nakonfigurujte si čierny zoznam IP.", "description": "Occasionally, a user account ban is not enough of a deterrant. Other times, restricting access to the forum to a specific IP or a range of IPs is the best way to protect a forum. In these scenarios, you can add troublesome IP addresses or entire CIDR blocks to this blacklist, and they will be prevented from logging in to or registering a new account.", "active-rules": "Active Rules", "validate": "Validate Blacklist", diff --git a/public/language/sk/admin/manage/registration.json b/public/language/sk/admin/manage/registration.json index f51b4d56e6..04fc0f204e 100644 --- a/public/language/sk/admin/manage/registration.json +++ b/public/language/sk/admin/manage/registration.json @@ -1,5 +1,5 @@ { - "queue": "Queue", + "queue": "Fronta", "description": "There are no users in the registration queue.
To enable this feature, go to Settings → User → User Registration and set Registration Type to \"Admin Approval\".", "list.name": "Name", diff --git a/public/language/sk/admin/manage/tags.json b/public/language/sk/admin/manage/tags.json index 775a9aed63..c0a40543f2 100644 --- a/public/language/sk/admin/manage/tags.json +++ b/public/language/sk/admin/manage/tags.json @@ -1,5 +1,5 @@ { - "none": "Your forum does not have any topics with tags yet.", + "none": "Vaše fórum zatiaľ neobsahuje žiadne témy.", "bg-color": "Background Colour", "text-color": "Text Colour", "create-modify": "Create & Modify Tags", diff --git a/public/language/sk/admin/manage/users.json b/public/language/sk/admin/manage/users.json index 1e808c70fa..24bc916cff 100644 --- a/public/language/sk/admin/manage/users.json +++ b/public/language/sk/admin/manage/users.json @@ -1,5 +1,5 @@ { - "users": "Users", + "users": "Používatelia", "edit": "Edit", "make-admin": "Make Admin", "remove-admin": "Remove Admin", diff --git a/public/language/sk/admin/menu.json b/public/language/sk/admin/menu.json index 0a1c30b63c..25dd937403 100644 --- a/public/language/sk/admin/menu.json +++ b/public/language/sk/admin/menu.json @@ -1,6 +1,6 @@ { "section-general": "Všeobecné", - "general/dashboard": "Dashboard", + "general/dashboard": "Prístrojová doska", "general/homepage": "Home Page", "general/navigation": "Navigation", "general/languages": "Languages", diff --git a/public/language/sk/admin/settings/advanced.json b/public/language/sk/admin/settings/advanced.json index 05a1929cf0..a73064e312 100644 --- a/public/language/sk/admin/settings/advanced.json +++ b/public/language/sk/admin/settings/advanced.json @@ -1,5 +1,5 @@ { - "maintenance-mode": "Maintenance Mode", + "maintenance-mode": "Režim údržby", "maintenance-mode.help": "When the forum is in maintenance mode, all requests will be redirected to a static holding page. Administrators are exempt from this redirection, and are able to access the site normally.", "maintenance-mode.message": "Maintenance Message", "headers": "Headers", diff --git a/public/language/sk/admin/settings/chat.json b/public/language/sk/admin/settings/chat.json index 0b22127341..163a472265 100644 --- a/public/language/sk/admin/settings/chat.json +++ b/public/language/sk/admin/settings/chat.json @@ -1,5 +1,5 @@ { - "chat-settings": "Chat Settings", + "chat-settings": "Nastavenia konverzácie", "disable": "Disable chat", "disable-editing": "Disable chat message editing/deletion", "disable-editing-help": "Administrators and global moderators are exempt from this restriction", diff --git a/public/language/sk/admin/settings/cookies.json b/public/language/sk/admin/settings/cookies.json index f8b0f0538b..7a7d5c2187 100644 --- a/public/language/sk/admin/settings/cookies.json +++ b/public/language/sk/admin/settings/cookies.json @@ -1,5 +1,5 @@ { - "eu-consent": "EU Consent", + "eu-consent": "Súhlas EÚ", "consent.enabled": "Enabled", "consent.message": "Notification message", "consent.acceptance": "Acceptance message", diff --git a/public/language/sk/admin/settings/email.json b/public/language/sk/admin/settings/email.json index 1e92c88490..cf3161d806 100644 --- a/public/language/sk/admin/settings/email.json +++ b/public/language/sk/admin/settings/email.json @@ -1,5 +1,5 @@ { - "email-settings": "Email Settings", + "email-settings": "Nastavenia e-mailu", "address": "Email Address", "address-help": "The following email address refers to the email that the recipient will see in the \"From\" and \"Reply To\" fields.", "from": "From Name", diff --git a/public/language/sk/admin/settings/general.json b/public/language/sk/admin/settings/general.json index 3f2814bd88..e20d726f79 100644 --- a/public/language/sk/admin/settings/general.json +++ b/public/language/sk/admin/settings/general.json @@ -1,5 +1,5 @@ { - "site-settings": "Site Settings", + "site-settings": "Nastavenia lokality", "title": "Site Title", "title.name": "Your Community Name", "title.show-in-header": "Show Site Title in Header", diff --git a/public/language/sk/admin/settings/group.json b/public/language/sk/admin/settings/group.json index 1ae88c9cf5..be6e3cd529 100644 --- a/public/language/sk/admin/settings/group.json +++ b/public/language/sk/admin/settings/group.json @@ -1,5 +1,5 @@ { - "general": "General", + "general": "Všeobecné", "private-groups": "Private Groups", "private-groups.help": "If enabled, joining of groups requires the approval of the group owner (Default: enabled)", "private-groups.warning": "Beware! If this option is disabled and you have private groups, they automatically become public.", diff --git a/public/language/sk/admin/settings/notifications.json b/public/language/sk/admin/settings/notifications.json index 4eff7f341a..c2eb1adbeb 100644 --- a/public/language/sk/admin/settings/notifications.json +++ b/public/language/sk/admin/settings/notifications.json @@ -1,5 +1,5 @@ { - "notifications": "Notifications", + "notifications": "Oznámenia", "welcome-notification": "Welcome Notification", "welcome-notification-link": "Welcome Notification Link" } \ No newline at end of file diff --git a/public/language/sk/admin/settings/pagination.json b/public/language/sk/admin/settings/pagination.json index 27d71b4de5..776160734f 100644 --- a/public/language/sk/admin/settings/pagination.json +++ b/public/language/sk/admin/settings/pagination.json @@ -1,5 +1,5 @@ { - "pagination": "Pagination Settings", + "pagination": "Nastavenia stránkovania", "enable": "Paginate topics and posts instead of using infinite scroll.", "topics": "Topic Pagination", "posts-per-page": "Posts per Page", diff --git a/public/language/sk/admin/settings/post.json b/public/language/sk/admin/settings/post.json index aca8b39d64..573d48fe05 100644 --- a/public/language/sk/admin/settings/post.json +++ b/public/language/sk/admin/settings/post.json @@ -1,9 +1,9 @@ { - "sorting": "Post Sorting", + "sorting": "Zoraďovanie príspevkov", "sorting.post-default": "Default Post Sorting", "sorting.oldest-to-newest": "Oldest to Newest", "sorting.newest-to-oldest": "Newest to Oldest", - "sorting.most-votes": "Most Votes", + "sorting.most-votes": "Najviac hlasov", "sorting.topic-default": "Default Topic Sorting", "restrictions": "Posting Restrictions", "restrictions.seconds-between": "Seconds between Posts", diff --git a/public/language/sk/admin/settings/reputation.json b/public/language/sk/admin/settings/reputation.json index f0e59e8db9..573d2609a1 100644 --- a/public/language/sk/admin/settings/reputation.json +++ b/public/language/sk/admin/settings/reputation.json @@ -2,7 +2,7 @@ "reputation": "Reputation Settings", "disable": "Disable Reputation System", "disable-down-voting": "Disable Down Voting", - "votes-are-public": "All Votes Are Public", + "votes-are-public": "Všetky hlasy sú verejné", "thresholds": "Activity Thresholds", "min-rep-downvote": "Minimum reputation to downvote posts", "min-rep-flag": "Minimum reputation to flag posts" diff --git a/public/language/sk/admin/settings/sockets.json b/public/language/sk/admin/settings/sockets.json index d04ee42fcf..6bfaf49545 100644 --- a/public/language/sk/admin/settings/sockets.json +++ b/public/language/sk/admin/settings/sockets.json @@ -1,5 +1,5 @@ { - "reconnection": "Reconnection Settings", + "reconnection": "Nastavenia opätovného pripojenia", "max-attempts": "Max Reconnection Attempts", "default-placeholder": "Default: %1", "delay": "Reconnection Delay" diff --git a/public/language/sk/admin/settings/tags.json b/public/language/sk/admin/settings/tags.json index 6f31f60ba0..cc8ef4ca4d 100644 --- a/public/language/sk/admin/settings/tags.json +++ b/public/language/sk/admin/settings/tags.json @@ -1,5 +1,5 @@ { - "tag": "Tag Settings", + "tag": "Nastavenie reputácie", "min-per-topic": "Minimum Tags per Topic", "max-per-topic": "Maximum Tags per Topic", "min-length": "Minimum Tag Length", diff --git a/public/language/sk/admin/settings/uploads.json b/public/language/sk/admin/settings/uploads.json index 35eaa5a58f..34848f06e5 100644 --- a/public/language/sk/admin/settings/uploads.json +++ b/public/language/sk/admin/settings/uploads.json @@ -1,5 +1,5 @@ { - "posts": "Posts", + "posts": "Príspevky", "allow-files": "Allow users to upload regular files", "private": "Make uploaded files private", "max-image-width": "Resize images down to specified width (in pixels)", diff --git a/public/language/sk/admin/settings/user.json b/public/language/sk/admin/settings/user.json index b8f51c9288..bff94e851e 100644 --- a/public/language/sk/admin/settings/user.json +++ b/public/language/sk/admin/settings/user.json @@ -1,5 +1,5 @@ { - "authentication": "Authentication", + "authentication": "Overenie pravosti", "allow-local-login": "Allow local login", "require-email-confirmation": "Require Email Confirmation", "email-confirm-interval": "User may not resend a confirmation email until", @@ -34,6 +34,8 @@ "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", + "invite-expiration": "Invite expiration", + "invite-expiration-help": "# of days invitations expire in.", "min-username-length": "Minimum Username Length", "max-username-length": "Maximum Username Length", "min-password-length": "Minimum Password Length", diff --git a/public/language/sk/admin/settings/web-crawler.json b/public/language/sk/admin/settings/web-crawler.json index 2e0d31d12b..49716691ba 100644 --- a/public/language/sk/admin/settings/web-crawler.json +++ b/public/language/sk/admin/settings/web-crawler.json @@ -1,5 +1,5 @@ { - "crawlability-settings": "Crawlability Settings", + "crawlability-settings": "Nastavenia indexového prehľadávania", "robots-txt": "Custom Robots.txt Leave blank for default", "sitemap-feed-settings": "Sitemap & Feed Settings", "disable-rss-feeds": "Disable RSS Feeds", diff --git a/public/language/sk/email.json b/public/language/sk/email.json index 11e7372009..8b665092ea 100644 --- a/public/language/sk/email.json +++ b/public/language/sk/email.json @@ -32,9 +32,9 @@ "notif.post.unsub.info": "Toto oznámenie o príspevkoch ste prijali na základe Vašich nastavení účtu.", "test.text1": "Toto je skúšobný e-mail na overenie funkčnosti e-mailovej aplikácie Vášho NodeBB fóra.", "unsub.cta": "Kliknite sem pre zmenu týchto nastavení", - "banned.subject": "You have been banned from %1", - "banned.text1": "The user %1 has been banned from %2.", - "banned.text2": "This ban will last until %1.", - "banned.text3": "This is the reason why you have been banned:", + "banned.subject": "Boli ste zablokovaný používateľom %1", + "banned.text1": "Používateľ %1 bol zablokovaný používateľom %2.", + "banned.text2": "Toto zablokovanie bude trvať do %1.", + "banned.text3": "To je dôvod, prečo ste boli zablokovaný:", "closing": "Ďakujeme!" } \ No newline at end of file diff --git a/public/language/sk/error.json b/public/language/sk/error.json index 76f54ce089..f387d6a128 100644 --- a/public/language/sk/error.json +++ b/public/language/sk/error.json @@ -1,5 +1,6 @@ { "invalid-data": "Nesprávne údaje", + "invalid-json": "Neplatné JSON", "not-logged-in": "Zdá sa že nie ste prihlásený.", "account-locked": "Váš účet bol dočasne uzamknutý", "search-requires-login": "K vyhľadávaniu je vyžadovaný účet - prosím prihláste sa alebo zaregistrujte.", @@ -12,6 +13,7 @@ "invalid-title": "Nesprávny nadpis!", "invalid-user-data": "Neplatné užívateľské údaje", "invalid-password": "Nesprávne heslo", + "invalid-login-credentials": "Neplatné prihlasovacie údaje", "invalid-username-or-password": "Prosím upresnite užívateľské meno a heslo", "invalid-search-term": "Neplatný hľadaný výraz", "csrf-invalid": "Nie sme schopný Vás znova prihlásiť, pravdepodobne kvôli uplynutiu relácie. Prosíme, zopakujte to neskôr", @@ -30,7 +32,7 @@ "password-too-long": "Heslo je príliš dlhé", "user-banned": "Užívateľ je zablokovaný", "user-banned-reason": "Prepáčte, tento účet bol zablokovaný (Dôvod: %1)", - "user-banned-reason-until": "Sorry, this account has been banned until %1 (Reason: %2)", + "user-banned-reason-until": "Ospravedlňujeme sa, tento účet bol zablokovaný do %1 (Dôvod: %2)", "user-too-new": "Prepáčte, musíte počkať %1 sekúnd(y) predtým, ako vytvoríte svoj prvý príspevok", "blacklisted-ip": "Prepáčte, ale vaša IP adresa bola na tejto komunite zablokovaná. Ak sa cítite poškodený, prosím kontaktujte správcu.", "ban-expiry-missing": "Prosím uveďte dátum ukončenia tohto zablokovania", @@ -105,7 +107,7 @@ "chat-disabled": "Systém konverzácií je zablokovaný", "too-many-messages": "Odoslali ste príliš veľa správ, počkajte chvíľu prosím.", "invalid-chat-message": "Neplatná správa konverzácie", - "chat-message-too-long": "Chat messages can not be longer than %1 characters.", + "chat-message-too-long": "Správy v konverzácií nemôžu byť dlhšie ako %1 znakov.", "cant-edit-chat-message": "Nemáte oprávnenie k úprave tejto správy", "cant-remove-last-user": "Nemôžete odstrániť posledného užívateľa", "cant-delete-chat-message": "Nemáte oprávanie k odstráneniu tejto správy", diff --git a/public/language/sk/flags.json b/public/language/sk/flags.json index c4bfed6f23..281bfd6e14 100644 --- a/public/language/sk/flags.json +++ b/public/language/sk/flags.json @@ -1,9 +1,9 @@ { - "state": "State", + "state": "Stav", "reporter": "Reporter", "reported-at": "Reported At", "description": "Description", - "no-flags": "Hooray! No flags found.", + "no-flags": "Hurá! Žiadne označenia neboli nájdené.", "assignee": "Assignee", "update": "Update", "updated": "Updated", @@ -26,7 +26,7 @@ "apply-filters": "Apply Filters", "quick-links": "Quick Links", - "flagged-user": "Flagged User", + "flagged-user": "Označený používateľ", "view-profile": "View Profile", "start-new-chat": "Start New Chat", "go-to-target": "View Flag Target", diff --git a/public/language/sk/modules.json b/public/language/sk/modules.json index 880a4a0128..e225ee6ead 100644 --- a/public/language/sk/modules.json +++ b/public/language/sk/modules.json @@ -20,7 +20,7 @@ "chat.three_months": "3 mesiace", "chat.delete_message_confirm": "Ste si istý, že chcete odstrániť túto správu?", "chat.add-users-to-room": "Pridať užívateľa do miestnosti", - "chat.confirm-chat-with-dnd-user": "This user has set their status to DnD(Do not disturb). Do you still want to chat with them?", + "chat.confirm-chat-with-dnd-user": "Tento používateľ nastavil svoj stav na DnD (Nevyrušovať). Stále chcete s nimi hovoriť?", "composer.compose": "Zostaviť", "composer.show_preview": "Zobraziť náhľad", "composer.hide_preview": "Skryť náhľad", diff --git a/public/language/sk/notifications.json b/public/language/sk/notifications.json index 5bf882e4d1..956d44f83c 100644 --- a/public/language/sk/notifications.json +++ b/public/language/sk/notifications.json @@ -17,7 +17,7 @@ "follows": "Nasledovatelia", "upvote": "Zahlasované", "new-flags": "Nové označenia", - "my-flags": "Flags assigned to me", + "my-flags": "Priradené značky", "bans": "Zablokované", "new_message_from": "Nova spáva od %1", "upvoted_your_post_in": "%1 dal hlas Vášmu príspevku v %2.", @@ -40,7 +40,7 @@ "user_started_following_you_multiple": "%1 a %2 ďalší Vás začali sledovať.", "new_register": "%1 odoslal žiadosť o registráciu.", "new_register_multiple": "Nachádzajú sa %1 registrácie čakajúce na preskúmanie.", - "flag_assigned_to_you": "Flag %1 has been assigned to you", + "flag_assigned_to_you": "Značka %1 vám bola priradená ", "email-confirmed": "E-mail bol potvrdený", "email-confirmed-message": "Ďakujeme za potvrdenie Vášho e-mailu. Účet je plne aktivovaný.", "email-confirm-error-message": "Vyskytla sa chyba pri overení Vašej e-mailovej adresy. ", diff --git a/public/language/sk/topic.json b/public/language/sk/topic.json index e10b2f7afa..a626bd2777 100644 --- a/public/language/sk/topic.json +++ b/public/language/sk/topic.json @@ -14,6 +14,7 @@ "quote": "Citovať", "reply": "Odpovedať", "replies_to_this_post": "%1 Odpovedí", + "one_reply_to_this_post": "1 Odpoveď", "last_reply_time": "Posledná odpoveď", "reply-as-topic": "Odpovedať ako téma", "guest-login-reply": "Pre odpoveď sa najprv prihláste", diff --git a/public/language/sl/admin/appearance/customise.json b/public/language/sl/admin/appearance/customise.json index 767d443e29..5095f7a937 100644 --- a/public/language/sl/admin/appearance/customise.json +++ b/public/language/sl/admin/appearance/customise.json @@ -5,5 +5,8 @@ "custom-header": "Custom Header", "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", - "custom-header.enable": "Enable Custom Header" + "custom-header.enable": "Enable Custom Header", + + "custom-css.livereload": "Enable Live Reload", + "custom-css.livereload.description": "Enable this to force all sessions on every device under your account to refresh whenever you click save" } \ No newline at end of file diff --git a/public/language/sl/admin/development/info.json b/public/language/sl/admin/development/info.json index b2768ca212..0a4ae6fe2c 100644 --- a/public/language/sl/admin/development/info.json +++ b/public/language/sl/admin/development/info.json @@ -1,10 +1,12 @@ { "you-are-on": "Info - You are on %1:%2", + "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", "pid": "pid", "nodejs": "nodejs", "online": "online", "git": "git", + "memory": "memory", "load": "load", "uptime": "uptime", diff --git a/public/language/sl/admin/general/dashboard.json b/public/language/sl/admin/general/dashboard.json index 02046bd17a..61f4421fb5 100644 --- a/public/language/sl/admin/general/dashboard.json +++ b/public/language/sl/admin/general/dashboard.json @@ -5,9 +5,14 @@ "users": "Users", "posts": "Posts", "topics": "Topics", - "page-views-last-month": "Page views Last Month", - "page-views-this-month": "Page views This Month", - "page-views-last-day": "Page views in last 24 hours", + "page-views-seven": "Last 7 Days", + "page-views-thirty": "Last 30 Days", + "page-views-last-day": "Last 24 hours", + "page-views-custom": "Custom Date Range", + "page-views-custom-start": "Range Start", + "page-views-custom-end": "Range End", + "page-views-custom-help": "Enter a date range of page views you would like to view. If no date picker is available, the accepted format is YYYY-MM-DD", + "page-views-custom-error": "Please enter a valid date range in the format YYYY-MM-DD", "stats.day": "Day", "stats.week": "Week", diff --git a/public/language/sl/admin/general/languages.json b/public/language/sl/admin/general/languages.json index da45cade2c..bdd57849b3 100644 --- a/public/language/sl/admin/general/languages.json +++ b/public/language/sl/admin/general/languages.json @@ -1,5 +1,6 @@ { "language-settings": "Language Settings", "description": "The default language determines the language settings for all users who are visiting your forum.
Individual users can override the default language on their account settings page.", - "default-language": "Default Language" + "default-language": "Default Language", + "auto-detect": "Auto Detect Language Setting for Guests" } \ No newline at end of file diff --git a/public/language/sl/admin/settings/user.json b/public/language/sl/admin/settings/user.json index b8f51c9288..fa8049c3a9 100644 --- a/public/language/sl/admin/settings/user.json +++ b/public/language/sl/admin/settings/user.json @@ -34,6 +34,8 @@ "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", + "invite-expiration": "Invite expiration", + "invite-expiration-help": "# of days invitations expire in.", "min-username-length": "Minimum Username Length", "max-username-length": "Maximum Username Length", "min-password-length": "Minimum Password Length", diff --git a/public/language/sl/error.json b/public/language/sl/error.json index 6c876e99d4..78f719e7b3 100644 --- a/public/language/sl/error.json +++ b/public/language/sl/error.json @@ -1,5 +1,6 @@ { "invalid-data": "Napačni podatki", + "invalid-json": "Invalid JSON", "not-logged-in": "Niste prijavljeni.", "account-locked": "Vaš račun je bil začasno zaklenjen.", "search-requires-login": "Iskanje zahteva uporabniški račun - prosimo, da se prijavite ali registrirate.", @@ -12,6 +13,7 @@ "invalid-title": "Napačen naslov", "invalid-user-data": "Napačni podatki o uporabniku", "invalid-password": "Napačno geslo", + "invalid-login-credentials": "Invalid login credentials", "invalid-username-or-password": "Prosimo, vpišite uporabniško ime in geslo.", "invalid-search-term": "Napačen iskalni izraz", "csrf-invalid": "Prijava ni mogoča, verjetno zaradi potekle seje. Poskusite znova.", diff --git a/public/language/sl/topic.json b/public/language/sl/topic.json index 11fc2e87c6..a5371bab1e 100644 --- a/public/language/sl/topic.json +++ b/public/language/sl/topic.json @@ -14,6 +14,7 @@ "quote": "Citiraj", "reply": "Odgovori", "replies_to_this_post": "%1 Replies", + "one_reply_to_this_post": "1 Reply", "last_reply_time": "Last reply", "reply-as-topic": "Odgovori s temo", "guest-login-reply": "Prijavi se za odgovor", diff --git a/public/language/sr/admin/appearance/customise.json b/public/language/sr/admin/appearance/customise.json index 767d443e29..5095f7a937 100644 --- a/public/language/sr/admin/appearance/customise.json +++ b/public/language/sr/admin/appearance/customise.json @@ -5,5 +5,8 @@ "custom-header": "Custom Header", "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", - "custom-header.enable": "Enable Custom Header" + "custom-header.enable": "Enable Custom Header", + + "custom-css.livereload": "Enable Live Reload", + "custom-css.livereload.description": "Enable this to force all sessions on every device under your account to refresh whenever you click save" } \ No newline at end of file diff --git a/public/language/sr/admin/development/info.json b/public/language/sr/admin/development/info.json index b2768ca212..0a4ae6fe2c 100644 --- a/public/language/sr/admin/development/info.json +++ b/public/language/sr/admin/development/info.json @@ -1,10 +1,12 @@ { "you-are-on": "Info - You are on %1:%2", + "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", "pid": "pid", "nodejs": "nodejs", "online": "online", "git": "git", + "memory": "memory", "load": "load", "uptime": "uptime", diff --git a/public/language/sr/admin/general/dashboard.json b/public/language/sr/admin/general/dashboard.json index 02046bd17a..61f4421fb5 100644 --- a/public/language/sr/admin/general/dashboard.json +++ b/public/language/sr/admin/general/dashboard.json @@ -5,9 +5,14 @@ "users": "Users", "posts": "Posts", "topics": "Topics", - "page-views-last-month": "Page views Last Month", - "page-views-this-month": "Page views This Month", - "page-views-last-day": "Page views in last 24 hours", + "page-views-seven": "Last 7 Days", + "page-views-thirty": "Last 30 Days", + "page-views-last-day": "Last 24 hours", + "page-views-custom": "Custom Date Range", + "page-views-custom-start": "Range Start", + "page-views-custom-end": "Range End", + "page-views-custom-help": "Enter a date range of page views you would like to view. If no date picker is available, the accepted format is YYYY-MM-DD", + "page-views-custom-error": "Please enter a valid date range in the format YYYY-MM-DD", "stats.day": "Day", "stats.week": "Week", diff --git a/public/language/sr/admin/general/languages.json b/public/language/sr/admin/general/languages.json index da45cade2c..bdd57849b3 100644 --- a/public/language/sr/admin/general/languages.json +++ b/public/language/sr/admin/general/languages.json @@ -1,5 +1,6 @@ { "language-settings": "Language Settings", "description": "The default language determines the language settings for all users who are visiting your forum.
Individual users can override the default language on their account settings page.", - "default-language": "Default Language" + "default-language": "Default Language", + "auto-detect": "Auto Detect Language Setting for Guests" } \ No newline at end of file diff --git a/public/language/sr/admin/settings/user.json b/public/language/sr/admin/settings/user.json index b8f51c9288..fa8049c3a9 100644 --- a/public/language/sr/admin/settings/user.json +++ b/public/language/sr/admin/settings/user.json @@ -34,6 +34,8 @@ "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", + "invite-expiration": "Invite expiration", + "invite-expiration-help": "# of days invitations expire in.", "min-username-length": "Minimum Username Length", "max-username-length": "Maximum Username Length", "min-password-length": "Minimum Password Length", diff --git a/public/language/sr/error.json b/public/language/sr/error.json index f05560c926..61708b7f2b 100644 --- a/public/language/sr/error.json +++ b/public/language/sr/error.json @@ -1,5 +1,6 @@ { "invalid-data": "Неисправни подаци", + "invalid-json": "Неважећи JSON", "not-logged-in": "Изгледа да нисте пријављени.", "account-locked": "Ваш налог је привремено закључан", "search-requires-login": "Претраживање захтева налог — пријавите се или се региструјте.", @@ -12,6 +13,7 @@ "invalid-title": "Неисправан наслов!", "invalid-user-data": "Неисправни кориснички подаци", "invalid-password": "Неисправна лозинка", + "invalid-login-credentials": "Неважећи акредитиви за пријављивање", "invalid-username-or-password": "Молимо наведите и корисничко име и лозинку", "invalid-search-term": "Неисправан упит за претрагу", "csrf-invalid": "Нисмо успели да вас пријавимо, вероватно због истека сесије. Молимо покушајте поново", diff --git a/public/language/sr/flags.json b/public/language/sr/flags.json index c4bfed6f23..e60225af70 100644 --- a/public/language/sr/flags.json +++ b/public/language/sr/flags.json @@ -1,60 +1,60 @@ { - "state": "State", - "reporter": "Reporter", - "reported-at": "Reported At", - "description": "Description", - "no-flags": "Hooray! No flags found.", - "assignee": "Assignee", - "update": "Update", - "updated": "Updated", - "target-purged": "The content this flag referred to has been purged and is no longer available.", + "state": "Стање", + "reporter": "Извештач", + "reported-at": "Пријављено", + "description": "Опис", + "no-flags": "Ура! Нема заставица.", + "assignee": "Заступник", + "update": "Ажурирај", + "updated": "Ажурирано", + "target-purged": "Садржај на који се односи ова заставица је очишћен и није више доступан.", - "quick-filters": "Quick Filters", - "filter-active": "There are one or more filters active in this list of flags", - "filter-reset": "Remove Filters", - "filters": "Filter Options", - "filter-reporterId": "Reporter UID", - "filter-targetUid": "Flagged UID", - "filter-type": "Flag Type", - "filter-type-all": "All Content", - "filter-type-post": "Post", - "filter-state": "State", - "filter-assignee": "Assignee UID", - "filter-cid": "Category", - "filter-quick-mine": "Assigned to me", - "filter-cid-all": "All categories", - "apply-filters": "Apply Filters", + "quick-filters": "Брзи филтери", + "filter-active": "Постоји један или више активних филтера на овом списку заставица", + "filter-reset": "Уклони заставице", + "filters": "Опције филтера", + "filter-reporterId": "UID извештача", + "filter-targetUid": "UID означеног", + "filter-type": "Тип заставице", + "filter-type-all": "Сав садржај", + "filter-type-post": "Порука", + "filter-state": "Стање", + "filter-assignee": "UID заступника", + "filter-cid": "Категорија", + "filter-quick-mine": "Додељено мени", + "filter-cid-all": "Све категорије", + "apply-filters": "Примени филтере", - "quick-links": "Quick Links", - "flagged-user": "Flagged User", - "view-profile": "View Profile", - "start-new-chat": "Start New Chat", - "go-to-target": "View Flag Target", + "quick-links": "Брзе везе", + "flagged-user": "Означени корисник", + "view-profile": "Погледај профил", + "start-new-chat": "Започни ново ћаскање", + "go-to-target": "Погледај циљ означавања", - "user-view": "View Profile", - "user-edit": "Edit Profile", + "user-view": "Погледај профил", + "user-edit": "Уреди профил", - "notes": "Flag Notes", - "add-note": "Add Note", - "no-notes": "No shared notes.", + "notes": "Белешке о заставицама", + "add-note": "Додај белешку", + "no-notes": "Нема дељених бележака.", - "history": "Flag History", - "back": "Back to Flags List", - "no-history": "No flag history.", + "history": "Историја заставица", + "back": "Назад на списак заставица", + "no-history": "Нема историје заставица", - "state-all": "All states", - "state-open": "New/Open", - "state-wip": "Work in Progress", - "state-resolved": "Resolved", - "state-rejected": "Rejected", - "no-assignee": "Not Assigned", - "note-added": "Note Added", + "state-all": "Сва стања", + "state-open": "Ново/Отвори", + "state-wip": "Рад у току", + "state-resolved": "Решено", + "state-rejected": "Одбијено", + "no-assignee": "Недодељено", + "note-added": "Белешка је додата", - "modal-title": "Report Inappropriate Content", - "modal-body": "Please specify your reason for flagging %1 %2 for review. Alternatively, use one of the quick report buttons if applicable.", - "modal-reason-spam": "Spam", - "modal-reason-offensive": "Offensive", - "modal-reason-custom": "Reason for reporting this content...", - "modal-submit": "Submit Report", - "modal-submit-success": "Content has been flagged for moderation." + "modal-title": "Пријави неприкладан садржај", + "modal-body": "Наведите разлог за означавање %1 %2 за проверу. Алтернативно, користите један од тастера за брзу пријаву ко је применљиво.", + "modal-reason-spam": "Непожељно", + "modal-reason-offensive": "Увредљиво", + "modal-reason-custom": "Разлог за пријаву овог садржаја...", + "modal-submit": "Пошаљи извештај", + "modal-submit-success": "Садржај је означен за модерацију." } \ No newline at end of file diff --git a/public/language/sr/topic.json b/public/language/sr/topic.json index 95655a8162..675f529a32 100644 --- a/public/language/sr/topic.json +++ b/public/language/sr/topic.json @@ -14,6 +14,7 @@ "quote": "Цитирај", "reply": "Одговори", "replies_to_this_post": "Одговора: %1", + "one_reply_to_this_post": "1 одговор", "last_reply_time": "Последњи одговор", "reply-as-topic": "Постави одговор као тему", "guest-login-reply": "Пријавите се да бисте одговорили", diff --git a/public/language/sv/admin/appearance/customise.json b/public/language/sv/admin/appearance/customise.json index 767d443e29..5095f7a937 100644 --- a/public/language/sv/admin/appearance/customise.json +++ b/public/language/sv/admin/appearance/customise.json @@ -5,5 +5,8 @@ "custom-header": "Custom Header", "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", - "custom-header.enable": "Enable Custom Header" + "custom-header.enable": "Enable Custom Header", + + "custom-css.livereload": "Enable Live Reload", + "custom-css.livereload.description": "Enable this to force all sessions on every device under your account to refresh whenever you click save" } \ No newline at end of file diff --git a/public/language/sv/admin/development/info.json b/public/language/sv/admin/development/info.json index b2768ca212..0a4ae6fe2c 100644 --- a/public/language/sv/admin/development/info.json +++ b/public/language/sv/admin/development/info.json @@ -1,10 +1,12 @@ { "you-are-on": "Info - You are on %1:%2", + "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", "pid": "pid", "nodejs": "nodejs", "online": "online", "git": "git", + "memory": "memory", "load": "load", "uptime": "uptime", diff --git a/public/language/sv/admin/general/dashboard.json b/public/language/sv/admin/general/dashboard.json index 02046bd17a..61f4421fb5 100644 --- a/public/language/sv/admin/general/dashboard.json +++ b/public/language/sv/admin/general/dashboard.json @@ -5,9 +5,14 @@ "users": "Users", "posts": "Posts", "topics": "Topics", - "page-views-last-month": "Page views Last Month", - "page-views-this-month": "Page views This Month", - "page-views-last-day": "Page views in last 24 hours", + "page-views-seven": "Last 7 Days", + "page-views-thirty": "Last 30 Days", + "page-views-last-day": "Last 24 hours", + "page-views-custom": "Custom Date Range", + "page-views-custom-start": "Range Start", + "page-views-custom-end": "Range End", + "page-views-custom-help": "Enter a date range of page views you would like to view. If no date picker is available, the accepted format is YYYY-MM-DD", + "page-views-custom-error": "Please enter a valid date range in the format YYYY-MM-DD", "stats.day": "Day", "stats.week": "Week", diff --git a/public/language/sv/admin/general/languages.json b/public/language/sv/admin/general/languages.json index da45cade2c..bdd57849b3 100644 --- a/public/language/sv/admin/general/languages.json +++ b/public/language/sv/admin/general/languages.json @@ -1,5 +1,6 @@ { "language-settings": "Language Settings", "description": "The default language determines the language settings for all users who are visiting your forum.
Individual users can override the default language on their account settings page.", - "default-language": "Default Language" + "default-language": "Default Language", + "auto-detect": "Auto Detect Language Setting for Guests" } \ No newline at end of file diff --git a/public/language/sv/admin/settings/user.json b/public/language/sv/admin/settings/user.json index b8f51c9288..fa8049c3a9 100644 --- a/public/language/sv/admin/settings/user.json +++ b/public/language/sv/admin/settings/user.json @@ -34,6 +34,8 @@ "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", + "invite-expiration": "Invite expiration", + "invite-expiration-help": "# of days invitations expire in.", "min-username-length": "Minimum Username Length", "max-username-length": "Maximum Username Length", "min-password-length": "Minimum Password Length", diff --git a/public/language/sv/error.json b/public/language/sv/error.json index 2e3ea4bfcb..63f0110096 100644 --- a/public/language/sv/error.json +++ b/public/language/sv/error.json @@ -1,5 +1,6 @@ { "invalid-data": "Ogiltig data", + "invalid-json": "Invalid JSON", "not-logged-in": "Du verkar inte vara inloggad.", "account-locked": "Ditt konto har tillfälligt blivit låst", "search-requires-login": "Sökning kräver ett konto, var god logga in eller registrera dig.", @@ -12,6 +13,7 @@ "invalid-title": "Ogiltig rubrik!", "invalid-user-data": "Ogiltig användardata", "invalid-password": "Ogiltigt lösenord", + "invalid-login-credentials": "Invalid login credentials", "invalid-username-or-password": "Specificera både användarnamn och lösenord", "invalid-search-term": "Ogiltig sökterm", "csrf-invalid": "Det gick inte att logga in dig, sannolikt på grund av en utgången session. Var god försök igen", diff --git a/public/language/sv/topic.json b/public/language/sv/topic.json index 45599c2186..f0d4f5f853 100644 --- a/public/language/sv/topic.json +++ b/public/language/sv/topic.json @@ -14,6 +14,7 @@ "quote": "Citera", "reply": "Svara", "replies_to_this_post": "%1 Replies", + "one_reply_to_this_post": "1 Reply", "last_reply_time": "Last reply", "reply-as-topic": "Svara som ämne", "guest-login-reply": "Logga in för att posta", diff --git a/public/language/th/admin/appearance/customise.json b/public/language/th/admin/appearance/customise.json index 767d443e29..5095f7a937 100644 --- a/public/language/th/admin/appearance/customise.json +++ b/public/language/th/admin/appearance/customise.json @@ -5,5 +5,8 @@ "custom-header": "Custom Header", "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", - "custom-header.enable": "Enable Custom Header" + "custom-header.enable": "Enable Custom Header", + + "custom-css.livereload": "Enable Live Reload", + "custom-css.livereload.description": "Enable this to force all sessions on every device under your account to refresh whenever you click save" } \ No newline at end of file diff --git a/public/language/th/admin/development/info.json b/public/language/th/admin/development/info.json index b2768ca212..0a4ae6fe2c 100644 --- a/public/language/th/admin/development/info.json +++ b/public/language/th/admin/development/info.json @@ -1,10 +1,12 @@ { "you-are-on": "Info - You are on %1:%2", + "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", "pid": "pid", "nodejs": "nodejs", "online": "online", "git": "git", + "memory": "memory", "load": "load", "uptime": "uptime", diff --git a/public/language/th/admin/general/dashboard.json b/public/language/th/admin/general/dashboard.json index 02046bd17a..61f4421fb5 100644 --- a/public/language/th/admin/general/dashboard.json +++ b/public/language/th/admin/general/dashboard.json @@ -5,9 +5,14 @@ "users": "Users", "posts": "Posts", "topics": "Topics", - "page-views-last-month": "Page views Last Month", - "page-views-this-month": "Page views This Month", - "page-views-last-day": "Page views in last 24 hours", + "page-views-seven": "Last 7 Days", + "page-views-thirty": "Last 30 Days", + "page-views-last-day": "Last 24 hours", + "page-views-custom": "Custom Date Range", + "page-views-custom-start": "Range Start", + "page-views-custom-end": "Range End", + "page-views-custom-help": "Enter a date range of page views you would like to view. If no date picker is available, the accepted format is YYYY-MM-DD", + "page-views-custom-error": "Please enter a valid date range in the format YYYY-MM-DD", "stats.day": "Day", "stats.week": "Week", diff --git a/public/language/th/admin/general/languages.json b/public/language/th/admin/general/languages.json index da45cade2c..bdd57849b3 100644 --- a/public/language/th/admin/general/languages.json +++ b/public/language/th/admin/general/languages.json @@ -1,5 +1,6 @@ { "language-settings": "Language Settings", "description": "The default language determines the language settings for all users who are visiting your forum.
Individual users can override the default language on their account settings page.", - "default-language": "Default Language" + "default-language": "Default Language", + "auto-detect": "Auto Detect Language Setting for Guests" } \ No newline at end of file diff --git a/public/language/th/admin/settings/user.json b/public/language/th/admin/settings/user.json index b8f51c9288..fa8049c3a9 100644 --- a/public/language/th/admin/settings/user.json +++ b/public/language/th/admin/settings/user.json @@ -34,6 +34,8 @@ "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", + "invite-expiration": "Invite expiration", + "invite-expiration-help": "# of days invitations expire in.", "min-username-length": "Minimum Username Length", "max-username-length": "Maximum Username Length", "min-password-length": "Minimum Password Length", diff --git a/public/language/th/category.json b/public/language/th/category.json index 1802bb7f1b..8daa641ba5 100644 --- a/public/language/th/category.json +++ b/public/language/th/category.json @@ -1,20 +1,20 @@ { - "category": "Category", - "subcategories": "Subcategories", - "new_topic_button": "กระทู้", - "guest-login-post": "เข้าสู่ระบบเพื่อโพส", + "category": "หมวดหมู่", + "subcategories": "หมวดหมู่ย่อย", + "new_topic_button": "ตั้งกระทู้", + "guest-login-post": "เข้าสู่ระบบเพื่อโพสต์", "no_topics": "ยังไม่มีกระทู้ในหมวดนี้
โพสต์กระทู้แรก?", "browsing": "เรียกดู", "no_replies": "ยังไม่มีใครตอบ", - "no_new_posts": "No new posts.", - "share_this_category": "แชร์ Category นี้", - "watch": "Watch", + "no_new_posts": "ไม่มีกระทู้ใหม่", + "share_this_category": "แชร์หมวดนี้", + "watch": "ตามดู", "ignore": "ไม่ต้องสนใจอีก", - "watching": "Watching", - "ignoring": "Ignoring", - "watching.description": "Show topics in unread", - "ignoring.description": "Do not show topics in unread", - "watch.message": "You are now watching updates from this category and all subcategories", - "ignore.message": "You are now ignoring updates from this category and all subcategories", - "watched-categories": "Watched categories" + "watching": "กำลังตามดู", + "ignoring": "เมินเฉย", + "watching.description": "แสดงกระทู้ที่ยังไม่ได้อ่าน", + "ignoring.description": "ไม่แสดงกระทู้ที่ยังไม่ได้อ่าน", + "watch.message": "ตอนนี้คุณกำลังตามดูอัพเดทจากกระทู้หมวดนี้และหมวดหมู่ย่อยทั้งหมดในนี้", + "ignore.message": "ตอนนี้คุณกำลังเมินเฉยต่ออัพเดทจากกระทู้หมวดนี้และหมวดหมู่ย่อยทั้งหมดในนี้", + "watched-categories": "หมวดหมู่ที่ดูแล้ว" } \ No newline at end of file diff --git a/public/language/th/email.json b/public/language/th/email.json index f6e3cd7e5b..16b41971a7 100644 --- a/public/language/th/email.json +++ b/public/language/th/email.json @@ -1,40 +1,40 @@ { - "password-reset-requested": "Password Reset Requested - %1!", + "password-reset-requested": "ส่งคำขอตั้งค่ารหัสผ่านใหม่แล้ว - %1!", "welcome-to": "ยินดีต้อนรับ %1", - "invite": "Invitation from %1", + "invite": "คำเชิญจาก %1", "greeting_no_name": "สวัสดี", "greeting_with_name": "สวัสดี %1", "welcome.text1": "ขอบคุณที่ลงทะเบียนกับ %1", - "welcome.text2": "To fully activate your account, we need to verify that you own the email address you registered with.", - "welcome.text3": "An administrator has accepted your registration application. You can login with your username/password now.", + "welcome.text2": "เพื่อให้การบัญชีของคุณใช้งานได้อย่างเสร็จสมบูรณ์ เราจำเป็นต้องยืนยันว่าคุณเป็นเจ้าของที่แท้จริงของอีเมล์ที่ใช้สมัครสมาชิก", + "welcome.text3": "ผู้ดูแลระบบได้ทำการยอมรับการสมัครสมาชิกของคุณแล้ว คุณสามารถเข้าสู่ระบบด้วย ชื่อผู้ใช้/รหัสผ่าน ได้แล้วตอนนี้", "welcome.cta": "กดตรงนี้เพื่อยืนยันอีเมลของคุณ", - "invitation.text1": "%1 has invited you to join %2", - "invitation.ctr": "Click here to create your account.", - "reset.text1": "We received a request to reset your password, possibly because you have forgotten it. If this is not the case, please ignore this email.", + "invitation.text1": "%1 ได้เชิญคุณให้เข้าร่วม %2", + "invitation.ctr": "คลิกที่นี่เพื่อสร้างบัญชีของคุณ", + "reset.text1": "เราได้รับคำร้องให้ตั้งค่ารหัสผ่านใหม่ของคุณ อาจจะเป็นเพราะว่าคุณลืมรหัสผ่านและได้ทำการส่งคำขอเข้ามา หากไม่ใช่ กรุณาเพิกเฉยต่ออีเมล์นี้และไม่ต้องดำเนินการใดๆทั้งสิ้น", "reset.text2": "เพื่อดำเนินการตั้งรหัสผ่านใหม่ต่อไป, โปรดกดที่ลิ้งค์นี้:", "reset.cta": "กดตรงนี้เพื่อตั้งรหัสผ่านใหม่", - "reset.notify.subject": "Password successfully changed", - "reset.notify.text1": "We are notifying you that on %1, your password was changed successfully.", - "reset.notify.text2": "If you did not authorise this, please notify an administrator immediately.", + "reset.notify.subject": "ตั้งค่ารหัสผ่านใหม่เรียบร้อยแล้ว", + "reset.notify.text1": "เรากำลังแจ้งคุณว่าตอน %1 รหัสผ่านของคุณถูกเปลี่ยนเรียบร้อยแล้ว", + "reset.notify.text2": "หากคุณไม่ได้เป็นคนอนุญาตสิ่งนี้ กรุณาแจ้งไปยังผู้ดูแลระบบโดยทันที", "digest.notifications": "คุณมีข้อความแจ้งเตือนที่ยังไม่ได้อ่านจาก %1:", "digest.latest_topics": "หัวข้อสนทนาล่าสุดจาก %1", "digest.cta": "กดตรงนี้เพื่อเข้าดู %1", - "digest.unsub.info": "This digest was sent to you due to your subscription settings.", - "digest.no_topics": "There have been no active topics in the past %1", - "digest.day": "day", - "digest.week": "week", - "digest.month": "month", - "digest.subject": "Digest for %1", - "notif.chat.subject": "New chat message received from %1", + "digest.unsub.info": "คำชี้แจงถูกส่งไปให้คุณแล้ว เนื่องมาจากการตั้งค่าสมาชิกของคุณ", + "digest.no_topics": "ไม่มีกระทู้ใดๆเลยใน %1 ที่ผ่านมา", + "digest.day": "วัน", + "digest.week": "สัปดาห์", + "digest.month": "เดือน", + "digest.subject": "คำชี้แจงสำหรับ %1", + "notif.chat.subject": "ได้รับข้อความแชทใหม่จาก %1", "notif.chat.cta": "กดตรงนี้เพื่อกลับไปยังบทสนทนา", - "notif.chat.unsub.info": "This chat notification was sent to you due to your subscription settings.", - "notif.post.cta": "Click here to read the full topic", - "notif.post.unsub.info": "This post notification was sent to you due to your subscription settings.", + "notif.chat.unsub.info": "การแจ้งเตือนแชทนี้ถูกส่งไปหาคุณเนื่องจากการตั้งค่าสมาชิกของคุณ", + "notif.post.cta": "คลิกที่นี่เพื่ออ่านกระทู้ฉบับเต็ม", + "notif.post.unsub.info": "การแจ้งเตือนกระทู้นี้ถูกส่งไปยังคุณเนื่องการตั้งค่าสมาชิกของคุณ", "test.text1": "นี่คืออีเมลทดสอบเพื่อยืนยันว่าระบบอีเมลมีการตั้งค่าที่ถูกต้องสำหรับ NodeBB ของคุณ", "unsub.cta": "กดตรงนี้เพื่อเปลี่ยนแปลงการตั้งค่า", - "banned.subject": "You have been banned from %1", - "banned.text1": "The user %1 has been banned from %2.", - "banned.text2": "This ban will last until %1.", - "banned.text3": "This is the reason why you have been banned:", + "banned.subject": "คุณถูกแบนจาก %1 แล้ว", + "banned.text1": "ผู้ใช้ %1 ได้ถูกแบนจาก %2", + "banned.text2": "การแบนนี้จะใช้เวลาจนถึง %1", + "banned.text3": "นี่คือเหตุผลที่ทำไมคุณถึงถูกแบน", "closing": "ขอบคุณ!" } \ No newline at end of file diff --git a/public/language/th/error.json b/public/language/th/error.json index 4d5cf25465..3e3fac5363 100644 --- a/public/language/th/error.json +++ b/public/language/th/error.json @@ -1,8 +1,9 @@ { "invalid-data": "ข้อมูลไม่ถูกต้อง", + "invalid-json": "Invalid JSON", "not-logged-in": "คุณยังไม่ได้ลงชื่อเข้าระบบ", "account-locked": "บัญชีของคุณถูกระงับการใช้งานชั่วคราว", - "search-requires-login": "Searching requires an account - please login or register.", + "search-requires-login": "\"ฟังก์ชั่นการค้นหา\" ต้องการบัญชีผู้ใช้ กรุณาเข้าสู่ระบบหรือสมัครสมาชิก", "invalid-cid": "Category ID ไม่ถูกต้อง", "invalid-tid": "Topic ID ไม่ถูกต้อง", "invalid-pid": "Post ID ไม่ถูกต้อง", @@ -12,121 +13,122 @@ "invalid-title": "คำนำหน้าชื่อไม่ถูกต้อง", "invalid-user-data": "User Data ไม่ถูกต้อง", "invalid-password": "รหัสผ่านไม่ถูกต้อง", + "invalid-login-credentials": "Invalid login credentials", "invalid-username-or-password": "กรุณาระบุชื่อผู้ใช้และรหัสผ่าน", "invalid-search-term": "ข้อความค้นหาไม่ถูกต้อง", - "csrf-invalid": "We were unable to log you in, likely due to an expired session. Please try again", - "invalid-pagination-value": "Invalid pagination value, must be at least %1 and at most %2", + "csrf-invalid": "เราไม่สามารถนำท่านเข้าสู่ระบบได้ เหมือนกับว่าเซสชั่นหมดอายุแล้ว กรุณาลองใหม่อีกครั้ง", + "invalid-pagination-value": "หมายเลขหน้าไม่ถูกต้อง จำเป็นต้องเป็นตัวเลขอย่างน้อย %1 และอย่างมาก %2", "username-taken": "ชื่อผู้ใช้นี้มีการใช้แล้ว", "email-taken": "อีเมลนี้มีการใช้แล้ว", "email-not-confirmed": "ยังไม่มีการยืนยันอีเมลของคุณ, โปรดกดยืนยันอีเมลของคุณตรงนี้", - "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", - "email-not-confirmed-email-sent": "Your email has not been confirmed yet, please check your inbox for the confirmation email.", + "email-not-confirmed-chat": "คุณไม่สามารถแชทได้จนกว่าอีเมล์ของคุณจะได้รับการยืนยัน กรุณาคลิกที่นี่เพื่อยืนยันอีกมเมล์ของคุณ", + "email-not-confirmed-email-sent": "อีเมล์ของคุณยังไม่ได้รับการยืนยัน กรุณาเช็คกล่องข้อความในอีเมล์เพื่อกดยืนยัน", "no-email-to-confirm": "Forum นี้ต้องการการยืนยันอีเมล กรุณากดที่นี่เพื่อระบุอีเมล", "email-confirm-failed": "เราไม่สามารถยืนยันอีเมลของคุณ ณ ขณะนี้ กรุณาลองใหม่อีกครั้งภายหลัง", - "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", - "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", + "confirm-email-already-sent": "อีเมล์ยืนยันตัวตนถูกส่งไปยังคุณเรียบร้อยแล้ว กรุณารอ %1 นาที(s) ก่อนการตัดสินใจส่งอีกครั้ง", + "sendmail-not-found": "ไม่พบการประมวลผลสำหรับการส่งอีเมล์ กรุณาตรวจสอบให้แน่ใจว่าได้มีการติดตั้งโปรแกรมการประมวลผลแล้วโดยผู้ใช้ที่กำลังใช้ NodeBB", "username-too-short": "ชื่อบัญชีผู้ใช้ สั้นเกินไป", "username-too-long": "ชื่อบัญชีผู้ใช้ ยาวเกินไป", - "password-too-long": "Password too long", - "user-banned": "User banned", - "user-banned-reason": "Sorry, this account has been banned (Reason: %1)", - "user-banned-reason-until": "Sorry, this account has been banned until %1 (Reason: %2)", - "user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post", - "blacklisted-ip": "Sorry, your IP address has been banned from this community. If you feel this is in error, please contact an administrator.", - "ban-expiry-missing": "Please provide an end date for this ban", + "password-too-long": "รหัสผ่านยาวเกินไป", + "user-banned": "ผู้ใช้ได้รับการแบน", + "user-banned-reason": "ขออภัย บัญชีผู้ใช้นี้ได้รับการแบน (เหตุผล : %1)", + "user-banned-reason-until": "ขออภัย บัญชีผู้ใช้นี้ได้รับการแบนจนถึง %1 (เหตุผล : %2)", + "user-too-new": "ขออภัย คุณจำเป็นต้องรอ %1 วินาที(s) ก่อนการสร้างกระทู้แรกของคุณ", + "blacklisted-ip": "ขออภัย IP Address ของคุณถูกแบนจากชุมชนนี้ หากคุณคิดว่านี่เป็นเออเร่อของระบบ กรุณาติดต่อผู้ดูแลระบบ", + "ban-expiry-missing": "กรุณาระบุวันสิ้นสุดสำหรับการแบนในครั้งนี้", "no-category": "ยังไม่มี Category นี้", "no-topic": "ยังไม่มี Topic นี้", "no-post": "ยังไม่มี Post นี้", "no-group": "ยังไม่มี Group นี้", "no-user": "ยังไม่มีผู้ใช้งานนี้", - "no-teaser": "Teaser does not exist", + "no-teaser": "ยังไม่มีทีเซอร์นี้", "no-privileges": "คุณมีสิทธิ์ไม่เพียงพอที่จะทำรายการนี้", "category-disabled": "Category นี้ถูกปิดการใช้งานแล้ว", - "topic-locked": "Topic Locked", - "post-edit-duration-expired": "You are only allowed to edit posts for %1 second(s) after posting", - "post-edit-duration-expired-minutes": "You are only allowed to edit posts for %1 minute(s) after posting", - "post-edit-duration-expired-minutes-seconds": "You are only allowed to edit posts for %1 minute(s) %2 second(s) after posting", - "post-edit-duration-expired-hours": "You are only allowed to edit posts for %1 hour(s) after posting", - "post-edit-duration-expired-hours-minutes": "You are only allowed to edit posts for %1 hour(s) %2 minute(s) after posting", - "post-edit-duration-expired-days": "You are only allowed to edit posts for %1 day(s) after posting", - "post-edit-duration-expired-days-hours": "You are only allowed to edit posts for %1 day(s) %2 hour(s) after posting", - "post-delete-duration-expired": "You are only allowed to delete posts for %1 second(s) after posting", - "post-delete-duration-expired-minutes": "You are only allowed to delete posts for %1 minute(s) after posting", - "post-delete-duration-expired-minutes-seconds": "You are only allowed to delete posts for %1 minute(s) %2 second(s) after posting", - "post-delete-duration-expired-hours": "You are only allowed to delete posts for %1 hour(s) after posting", - "post-delete-duration-expired-hours-minutes": "You are only allowed to delete posts for %1 hour(s) %2 minute(s) after posting", - "post-delete-duration-expired-days": "You are only allowed to delete posts for %1 day(s) after posting", - "post-delete-duration-expired-days-hours": "You are only allowed to delete posts for %1 day(s) %2 hour(s) after posting", - "cant-delete-topic-has-reply": "You can't delete your topic after it has a reply", - "cant-delete-topic-has-replies": "You can't delete your topic after it has %1 replies", - "content-too-short": "Please enter a longer post. Posts should contain at least %1 character(s).", - "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 character(s).", - "title-too-short": "Please enter a longer title. Titles should contain at least %1 character(s).", - "title-too-long": "Please enter a shorter title. Titles can't be longer than %1 character(s).", - "category-not-selected": "Category not selected.", - "too-many-posts": "You can only post once every %1 second(s) - please wait before posting again", - "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again", - "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)", - "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)", - "not-enough-tags": "Not enough tags. Topics must have at least %1 tag(s)", - "too-many-tags": "Too many tags. Topics can't have more than %1 tag(s)", - "still-uploading": "Please wait for uploads to complete.", - "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", - "guest-upload-disabled": "Guest uploading has been disabled", - "already-bookmarked": "You have already bookmarked this post", - "already-unbookmarked": "You have already unbookmarked this post", - "cant-ban-other-admins": "You can't ban other admins!", - "cant-remove-last-admin": "You are the only administrator. Add another user as an administrator before removing yourself as admin", - "cant-delete-admin": "Remove administrator privileges from this account before attempting to delete it.", - "invalid-image-type": "Invalid image type. Allowed types are: %1", - "invalid-image-extension": "Invalid image extension", - "invalid-file-type": "Invalid file type. Allowed types are: %1", - "group-name-too-short": "Group name too short", - "group-name-too-long": "Group name too long", - "group-already-exists": "Group already exists", - "group-name-change-not-allowed": "Group name change not allowed", - "group-already-member": "Already part of this group", - "group-not-member": "Not a member of this group", - "group-needs-owner": "This group requires at least one owner", - "group-already-invited": "This user has already been invited", - "group-already-requested": "Your membership request has already been submitted", - "post-already-deleted": "This post has already been deleted", - "post-already-restored": "This post has already been restored", - "topic-already-deleted": "This topic has already been deleted", - "topic-already-restored": "This topic has already been restored", - "cant-purge-main-post": "You can't purge the main post, please delete the topic instead", - "topic-thumbnails-are-disabled": "Topic thumbnails are disabled.", - "invalid-file": "Invalid File", - "uploads-are-disabled": "Uploads are disabled", - "signature-too-long": "Sorry, your signature cannot be longer than %1 character(s).", - "about-me-too-long": "Sorry, your about me cannot be longer than %1 character(s).", - "cant-chat-with-yourself": "You can't chat with yourself!", - "chat-restricted": "This user has restricted their chat messages. They must follow you before you can chat with them", - "chat-disabled": "Chat system disabled", - "too-many-messages": "You have sent too many messages, please wait awhile.", - "invalid-chat-message": "Invalid chat message", - "chat-message-too-long": "Chat messages can not be longer than %1 characters.", - "cant-edit-chat-message": "You are not allowed to edit this message", - "cant-remove-last-user": "You can't remove the last user", - "cant-delete-chat-message": "You are not allowed to delete this message", - "already-voting-for-this-post": "You have already voted for this post.", - "reputation-system-disabled": "Reputation system is disabled.", - "downvoting-disabled": "Downvoting is disabled", - "not-enough-reputation-to-downvote": "You do not have enough reputation to downvote this post", - "not-enough-reputation-to-flag": "You do not have enough reputation to flag this post", - "already-flagged": "You have already flagged this post", + "topic-locked": "กระทู้ถูกล็อก", + "post-edit-duration-expired": "คุณได้รับอนุญาตให้แก้ไขโพสต์ได้หลังจากโพสต์ไปแล้ว %1  วินาที (s)", + "post-edit-duration-expired-minutes": "คุณได้รับการอนุญาตให้แก้ไขโพสต์ได้หลังจากโพสต์ไปแล้ว %1 นาที (s)", + "post-edit-duration-expired-minutes-seconds": "คุณได้รับการอนุญาตให้แก้ไขโพสต์ได้หลังจากโพสต์ไปแล้ว %1 นาที(s) %2 วินาที(s) ", + "post-edit-duration-expired-hours": "คุณได้รับการอนุญาตให้แก้ไขโพสต์ได้หลังจากโพสต์ไปแล้ว %1 ชั่วโมง(s) ", + "post-edit-duration-expired-hours-minutes": "คุณได้รับการอนุญาตให้แก้ไขโพสต์ได้หลังจากโพสต์ไปแล้ว %1 ชั่วโมง(s) %2 นาที(s)", + "post-edit-duration-expired-days": "คุณได้รับการอนุญาตให้แก้ไขโพสต์ได้หลังจากโพสต์ไปแล้ว %1 วัน(s)", + "post-edit-duration-expired-days-hours": "คุณได้รับการอนุญาตให้แก้ไขโพสต์ได้หลังจากโพสต์ไปแล้ว %1 วัน(s) %2 ชั่วโมง(s) ", + "post-delete-duration-expired": "คุณได้รับการอนุญาตให้ลบโพสต์ได้หลังจากโพสต์ไปแล้ว %1 วินาที(s)", + "post-delete-duration-expired-minutes": "คุณได้รับการอนุญาตให้ลบโพสต์ได้หลังจากโพสต์ไปแล้ว %1 นาที(s)", + "post-delete-duration-expired-minutes-seconds": "คุณได้รับการอนุญาตให้ลบโพสต์ได้หลังจากโพสต์ไปแล้ว %1 นาที(s) %2 วินาที(s)", + "post-delete-duration-expired-hours": "คุณได้รับการอนุญาตให้ลบโพสต์ได้หลังจากโพสต์ไปแล้ว %1 ชั่วโมง(s)", + "post-delete-duration-expired-hours-minutes": "คุณได้รับการอนุญาตให้ลบโพสต์ได้หลังจากโพสต์ไปแล้ว %1 ชั่วโมง(s) %2 นาที(s)", + "post-delete-duration-expired-days": "คุณได้รับการอนุญาตให้ลบโพสต์ได้หลังจากโพสต์ไปแล้ว %1 วัน(s) ", + "post-delete-duration-expired-days-hours": "คุณได้รับการอนุญาตให้ลบโพสต์ได้หลังจากโพสต์ไปแล้ว %1 วัน(s) %2 ชั่วโมง(s) ", + "cant-delete-topic-has-reply": "คุณไม่สามารถลบกระทู้ได้หลังจากกระทู้ของคุณถูกตอบกลับ", + "cant-delete-topic-has-replies": "คุณไม่สามารถลบกระทู้ได้หลังจากกระทู้มีจำนวนตอบกลับ %1 ", + "content-too-short": "กรุณาโพสต์ข้อความให้ยาวขึ้น โพสต์ควรมีข้อความอย่างน้อย %1 ตัวอักษร(s)", + "content-too-long": "กรุณาโพสต์ข้อความให้สั้นลง โพสต์ไม่สามารถยาวกว่า %1 ตัวอักษร(s)", + "title-too-short": "กรุณากรอกชื่อให้ยาวขึ้น ชื่อควรมีข้อความอย่างน้อย %1 ตัวอักษร(s)", + "title-too-long": "กรุณากรอกชื่อให้สั้นลง ชื่อไม่สามารถยาวกว่า %1 ตัวอักษร(s)", + "category-not-selected": "ไม่มีการเลือกหมวดหมู่", + "too-many-posts": "คุณสามารถโพสต์ได้เพียงครั้งเดียวเท่านั้นในทุกๆ %1 วินาที(s) - โปรดรอสักครู่ก่อนการโพสต์อีกครั้ง", + "too-many-posts-newbie": "เนื่องด้วยการเป็นผู้ใช้งานใหม่ คุณสามารถโพสต์ได้เพียงครั้งเดียวเท่านั้นในทุกๆ %1 วินาที(s) จนกว่าคุณจะได้รับ %2 ชื่อเสียง - โปรดรอสักครู่ก่อนการโพสต์อีกครั้ง", + "tag-too-short": "กรุณากรอกแท็กให้ยาวขึ้น แท็กควรมีข้อความอย่างน้อย %1 ตัวอักษร(s)", + "tag-too-long": "กรุณากรอกแท็กให้สั้นลง แท็กไม่สามารถยาวกว่า %1 ตัวอักษร(s)", + "not-enough-tags": "จำนวนแท็กไม่พอ กระทู้ต้องมีอย่างน้อย %1 แท็ก(s)", + "too-many-tags": "แท็กเยอะเกินไป กระทู้ไม่สามารถมีแท็กมากกว่า %1 แท็ก(s)", + "still-uploading": "กรุณารอการอัพโหลดเพื่อเสร็จสิ้น", + "file-too-big": "ขนาดไฟล์ที่ใหญ่ที่สุดที่ได้รับการอนุญาตคือ %1 kB - กรุณาอัพโหลดไฟล์ที่เล็กลง", + "guest-upload-disabled": "การอัพโหลดของ Guest ถูกปิด", + "already-bookmarked": "คุณได้ติดบุ๊กมาร์คของโพสต์นี้แล้ว", + "already-unbookmarked": "คุณได้ลบบุ๊กมาร์คของโพสต์นี้แล้ว", + "cant-ban-other-admins": "คุณแบนแอดมินไม่ได้!!!", + "cant-remove-last-admin": "คุณเป็นแอดมินเพียงคนเดียว กรุณาเพิ่มผู้ใช้คนอื่นเป็นแอดมิน ก่อนการลบตัวเองออกจากแอดมิน", + "cant-delete-admin": "ลบสิทธิพิเศษของแอดมินจากบัญชีผู้ใช้นี้ ก่อนทำการลบ", + "invalid-image-type": "ประเภทรูปภาพไม่ถูกต้อง ประเภทที่ได้รับการอนุญาติคือ : %1", + "invalid-image-extension": "นามสกุลรูปภาพไม่ถูกต้อง", + "invalid-file-type": "ประเภทไฟล์ไม่ถูกต้อง ประเภทที่ได้รับการอนุญาติคือ : %1", + "group-name-too-short": "ชื่อกลุ่มสั้นเกินไป", + "group-name-too-long": "ชื่อกลุ่มยาวเกินไป", + "group-already-exists": "มีกลุ่มนี้อยู่แล้ว", + "group-name-change-not-allowed": "ชื่อกลุ่มที่เปลี่ยน ไม่ได้รับการอนุญาติ", + "group-already-member": "เป็นส่วนหนึ่งของกลุ่มนี้แล้ว", + "group-not-member": "ไม่ได้เป็นสมาชิกในกลุ่มนี้", + "group-needs-owner": "กลุ่มนี้ต้องการเจ้าของอย่างน้อย 1 คน", + "group-already-invited": "ผู้ใช้นี้ถูกเชิญแล้ว", + "group-already-requested": "คำร้องขอเป็นสมาชิกถูกส่งแล้ว", + "post-already-deleted": "โพสต์นี้ได้ถูกลบไปแล้ว", + "post-already-restored": "โพสต์นี้ถูกกู้คืนเรียบร้อยแล้ว", + "topic-already-deleted": "กระทู้นี้ถูกลบไปแล้ว", + "topic-already-restored": "กระทู้นี้ถูกกู้คืนเรียบร้อยแล้ว", + "cant-purge-main-post": "คุณไม่สามารถลบล้างโพสต์หลักได้ กรุณาลบกระทู้แทน ", + "topic-thumbnails-are-disabled": "ภาพตัวอย่างของกระทู้ถูกปิดใช้งาน", + "invalid-file": "ไฟล์ไม่ถูกต้อง", + "uploads-are-disabled": "การอัพโหลดถูกปิดใช้งาน", + "signature-too-long": "ขออภัย ลายเซ็นต์ของคุณไม่สามารถยาวเกิน %1 ตัวอักษร(s)ได้.", + "about-me-too-long": "ขออภัย \"เกี่ยวกับฉัน\" ของคุณไม่สามารถยาวเกิน %1 ตัวอักษร(s) ได้", + "cant-chat-with-yourself": "คุณไม่สามารถแชทกับตัวเองได้นะ!!!", + "chat-restricted": "ผู้ใช้นี้ถูกจำกัดข้อความแชท เขาต้องติดตามคุณก่อน คุณจึงจะสามารถแชทกับเขาได้", + "chat-disabled": "ระบบแชทถูกปิดใช้งาน", + "too-many-messages": "คุณได้ส่งข้อความมากเกินไป กรุณารอสักครู่", + "invalid-chat-message": "ข้อความแชทไม่ถูกต้อง", + "chat-message-too-long": "ข้อความแชทไม่สามารถยาวเกิน %1 ตัวอักษรได้", + "cant-edit-chat-message": "คุณไม่ได้รับอนุญาติให้แก้ไขข้อความ", + "cant-remove-last-user": "คุณไม่สามารถลบผู้ใช้งานล่าสุดได้", + "cant-delete-chat-message": "คุณไม่ได้รับอนุญาตให้ลบข้อความ", + "already-voting-for-this-post": "คุณได้โหวตโพสต์นี้แล้ว", + "reputation-system-disabled": "ระบบชื่อเสียงถูกปิดใช้งาน", + "downvoting-disabled": "\"การโหวตลง\" ถูกปิดใช้งาน", + "not-enough-reputation-to-downvote": "คุณไม่มีชื่อเสียงพอที่จะโหวตโพสต์นี้ลง", + "not-enough-reputation-to-flag": "คุณไม่มีชื่อเสียงพอที่จะปักธงให้โพสต์นี้", + "already-flagged": "คุณได้ปักธงให้โพสต์นี้แล้ว", "reload-failed": "NodeBB encountered a problem while reloading: \"%1\". NodeBB will continue to serve the existing client-side assets, although you should undo what you did just prior to reloading.", - "registration-error": "Registration Error", - "parse-error": "Something went wrong while parsing server response", - "wrong-login-type-email": "Please use your email to login", - "wrong-login-type-username": "Please use your username to login", - "invite-maximum-met": "You have invited the maximum amount of people (%1 out of %2).", - "no-session-found": "No login session found!", - "not-in-room": "User not in room", - "no-users-in-room": "No users in this room", - "cant-kick-self": "You can't kick yourself from the group", - "no-users-selected": "No user(s) selected", - "invalid-home-page-route": "Invalid home page route", - "invalid-session": "Session Mismatch", - "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page." + "registration-error": "การสมัครสมาชิกผิดพลาด", + "parse-error": "มีบางอย่างผิดพลาดขณะรอการตอบกลับจากเซิร์ฟเวอร์", + "wrong-login-type-email": "กรุณาใช้อีเมล์ของคุณในการเข้าสู่ระบบ", + "wrong-login-type-username": "กรุณาใช้ชื่อผู้ใช้ของคุณในการเข้าสู่ระบบ", + "invite-maximum-met": "คุณได้ทำการเชิญผู้คนจำนวนมากที่สุด (%1 out of %2).", + "no-session-found": "ไม่พบการเข้าสู่ระบบ", + "not-in-room": "ผู้ใช้ไม่อยู่ในห้อง", + "no-users-in-room": "ผู้ใช้ไม่อยู่ในห้องนี้", + "cant-kick-self": "คุณไม่สามารถเตะตัวเองออกจากกลุ่มได้", + "no-users-selected": "ไม่มีผู้ใช้ที่เลือก", + "invalid-home-page-route": "เส้นทางไปหน้าแรกผิดพลาด", + "invalid-session": "เซสชั่นไม่ถูกต้อง", + "invalid-session-text": "เหมือนกับว่าการเข้าสู่ระบบของคุณไม่ได้มีอยู่ในระบบ หรือไม่ก็ไม่ได้รับการตอบกลับจากเซิร์ฟเวอร์ กรุณารีเฟรชหน้าเว็บนี้" } \ No newline at end of file diff --git a/public/language/th/flags.json b/public/language/th/flags.json index c4bfed6f23..7d33e77739 100644 --- a/public/language/th/flags.json +++ b/public/language/th/flags.json @@ -1,60 +1,60 @@ { - "state": "State", - "reporter": "Reporter", - "reported-at": "Reported At", - "description": "Description", - "no-flags": "Hooray! No flags found.", - "assignee": "Assignee", - "update": "Update", - "updated": "Updated", - "target-purged": "The content this flag referred to has been purged and is no longer available.", + "state": "สถานะ", + "reporter": "ผู้รายงาน", + "reported-at": "ถูกรายงานที่", + "description": "คำอธิบาย", + "no-flags": "ไชโย ไม่เจอธงใดๆเลย", + "assignee": "ผู้ได้รับมอบหมาย", + "update": "อัพเดท", + "updated": "ได้รับการอัพเดท", + "target-purged": "เนื้อหาที่ธงนี้อ้างถึงถูกลบออกและไม่มีอยู่ในระบบอีกต่อไป", - "quick-filters": "Quick Filters", - "filter-active": "There are one or more filters active in this list of flags", - "filter-reset": "Remove Filters", - "filters": "Filter Options", - "filter-reporterId": "Reporter UID", - "filter-targetUid": "Flagged UID", - "filter-type": "Flag Type", - "filter-type-all": "All Content", - "filter-type-post": "Post", - "filter-state": "State", - "filter-assignee": "Assignee UID", - "filter-cid": "Category", - "filter-quick-mine": "Assigned to me", - "filter-cid-all": "All categories", - "apply-filters": "Apply Filters", + "quick-filters": "ฟิลเตอร์แบบด่วน", + "filter-active": "ไม่มีฟิลเตอร์ใดๆในรายการปักธง", + "filter-reset": "ลบฟิลเตอร์ออก", + "filters": "ตัวเลือกฟิลเตอร์", + "filter-reporterId": "ไอดีผู้รายงาน", + "filter-targetUid": "ไอดีผู้ที่ถูกปักธง", + "filter-type": "ประเภทการปักธง", + "filter-type-all": "เนื้อหาทั้งหมด", + "filter-type-post": "โพสต์", + "filter-state": "สถานะ", + "filter-assignee": "ผู้ได้รับมอบหมาย", + "filter-cid": "หมวดหมู่", + "filter-quick-mine": "ถูกมอบหมายให้ฉัน", + "filter-cid-all": "ทุกหมวดหมู่", + "apply-filters": "ใช้งานฟิลเตอร์", - "quick-links": "Quick Links", - "flagged-user": "Flagged User", - "view-profile": "View Profile", - "start-new-chat": "Start New Chat", - "go-to-target": "View Flag Target", + "quick-links": "ลิ้งค์ด่วน", + "flagged-user": "ผู้ใช้ที่ถูกปักธง", + "view-profile": "ดูโปรไฟล์", + "start-new-chat": "เริ่มแชทใหม่", + "go-to-target": "ดูเป้าหมายการปักธง", - "user-view": "View Profile", - "user-edit": "Edit Profile", + "user-view": "ดูโปรไฟล์", + "user-edit": "แก้ไขโปรไฟล์", - "notes": "Flag Notes", - "add-note": "Add Note", - "no-notes": "No shared notes.", + "notes": "โน๊ตปักธง", + "add-note": "เพิ่มโน้ต", + "no-notes": "ไม่มีโน้ตที่แชร์", - "history": "Flag History", - "back": "Back to Flags List", - "no-history": "No flag history.", + "history": "ประวัติการปักธง", + "back": "กลับไปยังรายการปักธง", + "no-history": "ไม่มีประวัติปักธง", - "state-all": "All states", - "state-open": "New/Open", - "state-wip": "Work in Progress", - "state-resolved": "Resolved", - "state-rejected": "Rejected", - "no-assignee": "Not Assigned", - "note-added": "Note Added", + "state-all": "สถานะทั้งหมด", + "state-open": "เพิ่มใหม่/เปิด", + "state-wip": "อยู่ระหว่างการทำงาน", + "state-resolved": "แก้แล้ว", + "state-rejected": "ถูกปฏิเสธ", + "no-assignee": "ไม่ได้รับการมอบหมาย", + "note-added": "โน้ตถูกเพิ่มแล้ว", - "modal-title": "Report Inappropriate Content", - "modal-body": "Please specify your reason for flagging %1 %2 for review. Alternatively, use one of the quick report buttons if applicable.", - "modal-reason-spam": "Spam", - "modal-reason-offensive": "Offensive", - "modal-reason-custom": "Reason for reporting this content...", - "modal-submit": "Submit Report", - "modal-submit-success": "Content has been flagged for moderation." + "modal-title": "รายงานเนื้อหาไม่เหมาะสม", + "modal-body": "กรุณาระเหตุผลสำหรับการปักธง %1 %2 สำหรับการรีวิว หรือไม่ก็ใช้หนึ่งในปุ่มกดรายงานด่วนถ้าเป็นไปได้", + "modal-reason-spam": "สแปม", + "modal-reason-offensive": "น่ารังเกียจ", + "modal-reason-custom": "เหตุผลว่าทำไมถึงรายงานเนื้อหานี้...", + "modal-submit": "ส่งรายงาน", + "modal-submit-success": "เนื้อหาถูกรายงานตามความเหมาะสมแล้ว" } \ No newline at end of file diff --git a/public/language/th/global.json b/public/language/th/global.json index 21e831157b..17b15b538c 100644 --- a/public/language/th/global.json +++ b/public/language/th/global.json @@ -3,40 +3,40 @@ "search": "ค้นหา", "buttons.close": "ปิด", "403.title": "คุณถูกปฏิเสธการเข้าใช้", - "403.message": "You seem to have stumbled upon a page that you do not have access to.", - "403.login": "Perhaps you should try logging in?", + "403.message": "ดูเหมือนว่าคุณจะได้รับการสกัดกั้นในหน้าเว็บที่คุณไม่สามารถเข้าถึงได้", + "403.login": "บางทีคุณควรจะ พยายามเข้าสู่ระบบภายใน ดูไหม ?", "404.title": "ไม่พบ", - "404.message": "You seem to have stumbled upon a page that does not exist. Return to the home page.", - "500.title": "Internal Error.", + "404.message": "ดูเหมือนว่าคุณจะได้รับการสกัดกั้นในหน้าเว็บที่ไม่มีอยู่ กลับไปยัง หน้าแรก ", + "500.title": "ระบบภายในเกิดข้อผิดพลาด", "500.message": "อุ่ย! มีสิ่งที่ไม่ถูกต้องเกิดขึ้น!", - "400.title": "Bad Request.", - "400.message": "It looks like this link is malformed, please double-check and try again. Otherwise, return to the home page.", + "400.title": "คำร้องขอที่เลวร้าย", + "400.message": "มันเหมือนว่าลิ้งค์นี้ไม่สมประกอบ กรุณาตรวจสอบอีกครั้งและลองอีกครั้ง หรือไม่ก็กลับไปยัง หน้าแรก ", "register": "ลงทะเบียน", "login": "เข้าสู่ระบบ", "please_log_in": "กรุณาเข้าสู่ระบบ", "logout": "ออกจากระบบ", - "posting_restriction_info": "คุณต้องต้องเป็นสมาชิกเพื่อทำการโพสต์ คลิกที่นี่เพื่อเข้าสู่ระบบ", + "posting_restriction_info": "คุณต้องเป็นสมาชิกเพื่อทำการโพสต์ คลิกที่นี่เพื่อเข้าสู่ระบบ", "welcome_back": "ยินดีต้อนรับ", "you_have_successfully_logged_in": "คุณได้เข้าสู่ระบบแล้ว", "save_changes": "บันทึกการเปลี่ยนแปลง", - "save": "Save", + "save": "บันทึก", "close": "ปิด", - "pagination": "ให้เลขหน้า", + "pagination": "การแบ่งหน้า", "pagination.out_of": "%1 จาก %2", - "pagination.enter_index": "Enter index", + "pagination.enter_index": "กรอกหมายเลข", "header.admin": "ผู้ดูแลระบบ", - "header.categories": "Categories", + "header.categories": "หมวดหมู่", "header.recent": "ล่าสุด", "header.unread": "ไม่ได้อ่าน", - "header.tags": "Tag", + "header.tags": "แท็ก", "header.popular": "ฮิต", "header.users": "ผู้ใช้", - "header.groups": "Group", + "header.groups": "กลุ่ม", "header.chats": "สนทนา", "header.notifications": "แจ้งเตือน", "header.search": "ค้นหา", "header.profile": "รายละเอียด", - "header.navigation": "Navigation", + "header.navigation": "เมนูนำทาง", "notifications.loading": "กำลังโหลดข้อแจ้งเตือน", "chats.loading": "กำลังโหลดหัวข้อสนทนา", "motd.welcome": "ยินดีต้อนรับสู่ NodeBB แพลตฟอร์มการสนทนาแห่งอนาคต", @@ -45,63 +45,63 @@ "alert.success": "สำเร็จ", "alert.error": "ผิดพลาด", "alert.banned": "เเบน", - "alert.banned.message": "You have just been banned, you will now be logged out.", + "alert.banned.message": "คุณเพิ่งจะได้รับการแบน คุณจะถูกตัดออกจากระบบเลยตอนนี้", "alert.unfollow": "คุณได้ยกเลิกติดตาม %1 !\n", "alert.follow": "คุณกำลังติดตาม %1 !", "online": "ออนไลน์", - "users": "Users", - "topics": "Topics", + "users": "ผู้ใช้", + "topics": "กระทู้", "posts": "กระทู้", - "best": "Best", - "upvoters": "Upvoters", - "upvoted": "Upvoted", - "downvoters": "Downvoters", - "downvoted": "Downvoted", + "best": "ดีที่สุด", + "upvoters": "ผู้ที่โหวดขึ้น", + "upvoted": "โหวตแล้ว", + "downvoters": "ผู้ที่โหวตลง", + "downvoted": "โหวตลง", "views": "ดู", - "reputation": "Reputation", - "read_more": "read more", - "more": "More", - "posted_ago_by_guest": "posted %1 by Guest", - "posted_ago_by": "posted %1 by %2", - "posted_ago": "posted %1", - "posted_in": "posted in %1", - "posted_in_by": "posted in %1 by %2", - "posted_in_ago": "posted in %1 %2", - "posted_in_ago_by": "posted in %1 %2 by %3", - "user_posted_ago": "%1 posted %2", - "guest_posted_ago": "Guest posted %1", - "last_edited_by": "last edited by %1", + "reputation": "ชื่อเสียง", + "read_more": "อ่านต่อ", + "more": "เพิ่มเติม", + "posted_ago_by_guest": "โพสต์ %1 โดย Guest", + "posted_ago_by": "โพสต์ %1 โดย %2 ", + "posted_ago": "โพสต์ %1 ", + "posted_in": "โพสต์ใน %1 ", + "posted_in_by": "โพสต์ใน %1 โดย %2", + "posted_in_ago": "โพสต์ใน %1 %2", + "posted_in_ago_by": "โพสต์ใน %1 %2 โดย %3", + "user_posted_ago": "%1 โพสต์ %2", + "guest_posted_ago": "Guest โพสต์ %1", + "last_edited_by": "แก้ไขล่าสุดโดย %1", "norecentposts": "ไม่มีกระทู้ล่าสุด", "norecenttopics": "ไม่มีกระทู้ล่าสุด", "recentposts": "กระทู้ล่าสุด", "recentips": "IP ที่ใช้เข้าสู่ระบบล่าสุด", - "moderator_tools": "Moderator Tools", + "moderator_tools": "เครื่องมือผู้ดูแลระบบ", "away": "ไม่อยู่", - "dnd": "Do not disturb", + "dnd": "ห้ามรบกวน", "invisible": "ไม่ปรากฏตัว", "offline": "ออฟไลน์", - "email": "Email", - "language": "Language", + "email": "อีเมล์", + "language": "ภาษา", "guest": "Guest", "guests": "Guests", - "updated.title": "Forum Updated", - "updated.message": "This forum has just been updated to the latest version. Click here to refresh the page.", - "privacy": "Privacy", - "follow": "Follow", - "unfollow": "Unfollow", - "delete_all": "Delete All", - "map": "Map", - "sessions": "Login Sessions", - "ip_address": "IP Address", - "enter_page_number": "Enter page number", - "upload_file": "Upload file", - "upload": "Upload", - "allowed-file-types": "Allowed file types are %1", - "unsaved-changes": "You have unsaved changes. Are you sure you wish to navigate away?", - "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect.", - "play": "Play", - "cookies.message": "This website uses cookies to ensure you get the best experience on our website.", - "cookies.accept": "Got it!", - "cookies.learn_more": "Learn More", - "edited": "Edited" + "updated.title": "ฟอรั่มที่ถูกอัพเดทแล้ว", + "updated.message": "ฟอรั่มนี้เพิ่งได้รับการอัพเดทให้เป็นเวอร์ชั่นล่าสุด คลิกที่นี่เพื่อรีเฟรชหน้าเพจ", + "privacy": "ความเป็นส่วนตัว", + "follow": "ติดตาม", + "unfollow": "เลิกติดตาม", + "delete_all": "ลบทั้งหมด", + "map": "แผนที่", + "sessions": "ข้อมูลการเข้าสู่ระบบ", + "ip_address": "ไอพีแอดเดรส", + "enter_page_number": "กรอกหมายเลขหน้า", + "upload_file": "อัพโหลดไฟล์", + "upload": "อัพโหลด", + "allowed-file-types": "ประเภทไฟล์ที่ได้รับการอนุญาติคือ %1", + "unsaved-changes": "การเปลี่ยนแปลงของคุณจะไม่ได้รับการบันทึก คุณแน่ใจหรือว่าต้องการออกจากที่นี่?", + "reconnecting-message": "เหมือนกับว่าการเชื่อมต่อของคุณเพื่อไปยัง %1 นั้นขาดหาย กรุณารอสักครู่ เรากำลังพยายามเชื่อมต่อใหม่", + "play": "เล่น", + "cookies.message": "เว็บไวต์นี้ใช้คุกกี้เพื่อที่จะทำให้แน่ใจว่า คุณได้รับประสบการณ์ที่เยี่ยมยอดที่สุดในการเข้าใช้เว็บไซต์ของเรา", + "cookies.accept": "เข้าใจแล้ว!!! ", + "cookies.learn_more": "เรียนรู้เพิ่มเติม", + "edited": "ถูกแก้ไขแล้ว" } \ No newline at end of file diff --git a/public/language/th/groups.json b/public/language/th/groups.json index af679cd8c3..1e1f235f9c 100644 --- a/public/language/th/groups.json +++ b/public/language/th/groups.json @@ -1,58 +1,58 @@ { - "groups": "Group", - "view_group": "ดู Group", - "owner": "เจ้าของ Group", - "new_group": "สร้าง Group ใหม่", - "no_groups_found": "ยังไม่มี Group", + "groups": "กลุ่ม", + "view_group": "ดูกลุ่ม", + "owner": "เจ้าของกลุ่ม", + "new_group": "สร้างกลุ่มใหม่", + "no_groups_found": "ยังไม่มีกลุ่ม", "pending.accept": "ยอมรับ", "pending.reject": "ไม่ยอมรับ", - "pending.accept_all": "Accept All", - "pending.reject_all": "Reject All", - "pending.none": "There are no pending members at this time", - "invited.none": "There are no invited members at this time", - "invited.uninvite": "Rescind Invitation", - "invited.search": "Search for a user to invite to this group", - "invited.notification_title": "You have been invited to join %1", - "request.notification_title": "Group Membership Request from %1", - "request.notification_text": "%1 has requested to become a member of %2", + "pending.accept_all": "ยอมรับทั้งหมด", + "pending.reject_all": "ปฏิเสธทั้งหมด", + "pending.none": "ไม่มีสมาชิกที่รอการอนุมัติอยู่ในขณะนี้", + "invited.none": "ไม่มีสมาชิกที่ได้รับการเชิญในขณะนี้", + "invited.uninvite": "ยกเลิกคำเชิญ", + "invited.search": "ค้นหาสมาชิกเพื่อเชิญเข้ากลุ่ม", + "invited.notification_title": "คุณถูกเชิญเข้ากลุ่ม %1", + "request.notification_title": "คำขอเข้ากลุ่มจาก %1", + "request.notification_text": "%1 ได้รับเชิญให้เข้าเป็นสมาชิกของ %2", "cover-save": "บันทึก", "cover-saving": "กำลังบันทึก", - "details.title": "ข้อมูล Group", + "details.title": "ข้อมูลกลุ่ม", "details.members": "รายชื่อสมาชิก", "details.pending": "สมาชิกที่กำลังรอการตอบรับ", - "details.invited": "Invited Members", - "details.has_no_posts": "Group นี้ยังไม่มีโพสจากสมาชิก", + "details.invited": "สมาชิกที่ได้รับเชิญ", + "details.has_no_posts": "กลุ่มนี้ยังไม่มีโพสต์จากสมาชิก", "details.latest_posts": "โพสล่าสุด", "details.private": "ส่วนตัว", - "details.disableJoinRequests": "Disable join requests", - "details.grant": "Grant/Rescind Ownership", + "details.disableJoinRequests": "ปิดคำขอ", + "details.grant": "ให้ / ยกเลิกการเป็นเจ้าของ", "details.kick": "เตะออก", - "details.kick_confirm": "Are you sure you want to remove this member from the group?", - "details.owner_options": "การจัดการ Group", - "details.group_name": "ชื่อ Group", - "details.member_count": "Member Count", - "details.creation_date": "Creation Date", + "details.kick_confirm": "คุณแน่ใจใช่ไหมว่าต้องการลบสมาชิกคนนี้ออกจากกลุ่ม?", + "details.owner_options": "การจัดการกลุ่ม", + "details.group_name": "ชื่อกลุ่ม", + "details.member_count": "จำนวนสมาชิก", + "details.creation_date": "สร้างวันที่", "details.description": "คำอธิบาย", - "details.badge_preview": "Badge Preview", + "details.badge_preview": "สัญลักษณ์พรีวิว", "details.change_icon": "เปลี่ยนไอคอน", "details.change_colour": "เปลี่ยนสี", - "details.badge_text": "Badge Text", - "details.userTitleEnabled": "แสดง Badge", - "details.private_help": "If enabled, joining of groups requires approval from a group owner", + "details.badge_text": "สัญลักษณ์ข้อความ", + "details.userTitleEnabled": "แสดงสัญลักษณ์", + "details.private_help": "หากเป็นไปได้ การเข้าร่วมกลุ่มต้องได้รับการอนุมัติจากเจ้าของกลุ่ม", "details.hidden": "ซ่อน", - "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually", - "details.delete_group": "Delete Group", - "details.private_system_help": "Private groups is disabled at system level, this option does not do anything", - "event.updated": "ข้อมูล Group ได้รับการบันทึกแล้ว", - "event.deleted": "The group \"%1\" has been deleted", - "membership.accept-invitation": "Accept Invitation", - "membership.invitation-pending": "Invitation Pending", - "membership.join-group": "Join Group", - "membership.leave-group": "Leave Group", - "membership.reject": "Reject", - "new-group.group_name": "Group Name:", - "upload-group-cover": "Upload group cover", - "bulk-invite-instructions": "Enter a list of comma separated usernames to invite to this group", - "bulk-invite": "Bulk Invite", - "remove_group_cover_confirm": "Are you sure you want to remove the cover picture?" + "details.hidden_help": "หากเป็นไปได้ จะไม่แสดงในรายชื่อกลุ่ม และผู้ใช้จะต้องได้รับการเชิญเท่านั้นจึงจะเข้าเป็นสมาชิกได้", + "details.delete_group": "ลบกลุ่ม", + "details.private_system_help": "กลุ่มส่วนตัวถูกปิดใช้งานโดยเลเวลระบบ ตัวเลือกนี้จะไม่ได้ทำอะไรทั้งสิ้น", + "event.updated": "ข้อมูลกลุ่มได้รับการบันทึกแล้ว", + "event.deleted": "กลุ่ม \"%1\"  ได้ถูกลบไปแล้ว", + "membership.accept-invitation": "ยอมรับคำเชิญ", + "membership.invitation-pending": "คำเชิญที่รอการอนุมัติ", + "membership.join-group": "เข้าร่วมกลุ่ม", + "membership.leave-group": "ออกจากกลุ่ม", + "membership.reject": "ปฏิเสธ", + "new-group.group_name": "ชื่อกลุ่ม:", + "upload-group-cover": "อัพโหลดหน้าปกกลุ่ม", + "bulk-invite-instructions": "กรอกรายชื่อผู้ใช้ที่ต้องการเชิญเข้ากลุ่ม ถ้ามีจำนวนมากกว่า 1 ให้ใช้เครื่องหมาย คอมม่า , ในการแบ่ง", + "bulk-invite": "เชิญจำนวนมาก", + "remove_group_cover_confirm": "คุณแน่ใจแล้วใช่ไหมว่าต้องการจะลบภาพหน้าปกนี้?" } \ No newline at end of file diff --git a/public/language/th/language.json b/public/language/th/language.json index 8af024bba9..19d323d650 100644 --- a/public/language/th/language.json +++ b/public/language/th/language.json @@ -1,5 +1,5 @@ { - "name": "ภาษาเขียน", + "name": "ภาษาไทย (ไทย)", "code": "th", "dir": "ltr" } \ No newline at end of file diff --git a/public/language/th/login.json b/public/language/th/login.json index bb4729f5c6..86f51f948e 100644 --- a/public/language/th/login.json +++ b/public/language/th/login.json @@ -5,8 +5,8 @@ "remember_me": "จำไว้ในระบบ?", "forgot_password": "ลืมรหัสผ่าน?", "alternative_logins": "เข้าสู่ระบบโดยทางอื่น", - "failed_login_attempt": "Login Unsuccessful", + "failed_login_attempt": "เข้าสู่ระบบสำเร็จ", "login_successful": "คุณเข้าสู่ระบบเรียบร้อยแล้ว", "dont_have_account": "คุณยังไม่มีบัญชีเข้าระบบ?", - "logged-out-due-to-inactivity": "You have been logged out of the Admin Control Panel due to inactivity" + "logged-out-due-to-inactivity": "คุณได้ออกจากระบบ Admin Control Panel แล้ว เนื่องจากว่าไม่มีกิจกรรมใดๆมาสักระยะ" } \ No newline at end of file diff --git a/public/language/th/modules.json b/public/language/th/modules.json index 00a675c2f2..e48c2bb711 100644 --- a/public/language/th/modules.json +++ b/public/language/th/modules.json @@ -1,49 +1,49 @@ { "chat.chatting_with": "แชทกับ ", - "chat.placeholder": "Type chat message here, press enter to send", + "chat.placeholder": "พิมพ์ข้อความแชทที่นี่ กด enter เพื่อส่ง", "chat.send": "ส่ง", "chat.no_active": "คุณไม่มีแชทที่คุยอยู่", - "chat.user_typing": "%1 is typing ...", - "chat.user_has_messaged_you": "%1 has messaged you.", - "chat.see_all": "See all chats", - "chat.mark_all_read": "Mark all chats read", - "chat.no-messages": "Please select a recipient to view chat message history", - "chat.no-users-in-room": "No users in this room", - "chat.recent-chats": "Recent Chats", - "chat.contacts": "Contacts", - "chat.message-history": "Message History", - "chat.pop-out": "Pop out chat", - "chat.minimize": "Minimize", - "chat.maximize": "Maximize", - "chat.seven_days": "7 Days", - "chat.thirty_days": "30 Days", - "chat.three_months": "3 Months", - "chat.delete_message_confirm": "Are you sure you wish to delete this message?", - "chat.add-users-to-room": "Add users to room", - "chat.confirm-chat-with-dnd-user": "This user has set their status to DnD(Do not disturb). Do you still want to chat with them?", - "composer.compose": "Compose", - "composer.show_preview": "Show Preview", - "composer.hide_preview": "Hide Preview", - "composer.user_said_in": "%1 said in %2:", - "composer.user_said": "%1 said:", - "composer.discard": "Are you sure you wish to discard this post?", - "composer.submit_and_lock": "Submit and Lock", - "composer.toggle_dropdown": "Toggle Dropdown", - "composer.uploading": "Uploading %1", - "composer.formatting.bold": "Bold", - "composer.formatting.italic": "Italic", - "composer.formatting.list": "List", - "composer.formatting.strikethrough": "Strikethrough", - "composer.formatting.link": "Link", - "composer.formatting.picture": "Picture", - "composer.upload-picture": "Upload Image", - "composer.upload-file": "Upload File", - "composer.zen_mode": "Zen Mode", - "composer.select_category": "Select a category", - "bootbox.ok": "OK", - "bootbox.cancel": "Cancel", - "bootbox.confirm": "Confirm", - "cover.dragging_title": "Cover Photo Positioning", - "cover.dragging_message": "Drag the cover photo to the desired position and click \"Save\"", - "cover.saved": "Cover photo image and position saved" + "chat.user_typing": "%1 กำลังพิมพ์อยู่ ...", + "chat.user_has_messaged_you": "%1 ได้ส่งข้อความถึงคุณ", + "chat.see_all": "ดูแชททั้งหมด", + "chat.mark_all_read": "เปลี่ยนเป็นอ่านแล้วทั้งหมด", + "chat.no-messages": "กรุณาเลือกผู้รับเพื่อดูประวัติข้อความ", + "chat.no-users-in-room": "ไม่มีผู้ใช้ในห้องนี้", + "chat.recent-chats": "แชทล่าสุด", + "chat.contacts": "ติดต่อ", + "chat.message-history": "ประวัติข้อความ", + "chat.pop-out": "Pop out แชท", + "chat.minimize": "ย่อเล็กสุด", + "chat.maximize": "ขยายใหญ่สุด", + "chat.seven_days": "7 วัน", + "chat.thirty_days": "30 วัน", + "chat.three_months": "3 เดือน", + "chat.delete_message_confirm": "คุณแน่ใจแล้วใช่ไหมว่าต้องการจะลบข้อความนี้?", + "chat.add-users-to-room": "เพิ่มผู้ใช้เข้ามาในห้องแชท", + "chat.confirm-chat-with-dnd-user": "ผู้ใช้นี้ได้ตั้งค่าสถานะเป็น (ห้ามรบกวน) คุณยังอยากจะคุยกับเขาอยู่ไหม?", + "composer.compose": "เขียน", + "composer.show_preview": "แสดงพรีวิว", + "composer.hide_preview": "ซ่อนพรีวิว", + "composer.user_said_in": "%1 พูดใน %2:", + "composer.user_said": "%1 พูด:", + "composer.discard": "คุณแน่ใจแล้วใช่ไหมว่าจะทิ้งโพสต์นี้?", + "composer.submit_and_lock": "ยืนยันและล็อก", + "composer.toggle_dropdown": "ท็อกเกิลดร็อปดาวน์", + "composer.uploading": "กำลังอัพโหลด %1", + "composer.formatting.bold": "ตัวหนา", + "composer.formatting.italic": "ตัวเอียง", + "composer.formatting.list": "รายการ", + "composer.formatting.strikethrough": "ขีดเส้นใต้", + "composer.formatting.link": "ลิ้งค์", + "composer.formatting.picture": "รูปภาพ", + "composer.upload-picture": "อัพโหลดรูปภาพ", + "composer.upload-file": "อัพโหลดไฟล์", + "composer.zen_mode": "เซ็นโหมด", + "composer.select_category": "เลือกหมวดหมู่", + "bootbox.ok": "ตกลง", + "bootbox.cancel": "ยกเลิก", + "bootbox.confirm": "ยืนยัน", + "cover.dragging_title": "ตำแหน่งภาพหน้าปก", + "cover.dragging_message": "ลากภาพหน้าปกเพื่อเลือกตำแหน่งแล้วกด \"บันทึก\"", + "cover.saved": "ภาพหน้าปกและตำแหน่งได้รับการบันทึกแล้ว" } \ No newline at end of file diff --git a/public/language/th/notifications.json b/public/language/th/notifications.json index b40a472c11..86993464d4 100644 --- a/public/language/th/notifications.json +++ b/public/language/th/notifications.json @@ -1,46 +1,46 @@ { "title": "แจ้งเตือน", "no_notifs": "คุณไม่มีข้อแจ้งเตือนใหม่", - "see_all": "See all notifications", - "mark_all_read": "Mark all notifications read", - "back_to_home": "Back to %1", + "see_all": "ดูการแจ้งเตือนทั้งหมด", + "mark_all_read": "ทำให้การแจ้งเตือนทั้งหมดถูกอ่านแล้ว", + "back_to_home": "กลับสู่ %1", "outgoing_link": "ลิงค์ออก", - "outgoing_link_message": "You are now leaving %1", - "continue_to": "Continue to %1", - "return_to": "Return to %1", + "outgoing_link_message": "ตอนนี้คุณกำลังออกจาก %1", + "continue_to": "ดำเนินการต่อไปยัง %1", + "return_to": "กลับสู่ %1", "new_notification": "ข้อความเตือนใหม่", "you_have_unread_notifications": "คุณมีคำเตือนที่ยังไม่ได้อ่าน", - "all": "All", - "topics": "Topics", - "replies": "Replies", - "chat": "Chats", - "follows": "Follows", - "upvote": "Upvotes", - "new-flags": "New Flags", - "my-flags": "Flags assigned to me", - "bans": "Bans", - "new_message_from": "New message from %1", - "upvoted_your_post_in": "%1 has upvoted your post in %2.", - "upvoted_your_post_in_dual": "%1 and %2 have upvoted your post in %3.", - "upvoted_your_post_in_multiple": "%1 and %2 others have upvoted your post in %3.", - "moved_your_post": "%1 has moved your post to %2", - "moved_your_topic": "%1 has moved %2", - "user_flagged_post_in": "%1 flagged a post in %2", - "user_flagged_post_in_dual": "%1 and %2 flagged a post in %3", - "user_flagged_post_in_multiple": "%1 and %2 others flagged a post in %3", - "user_flagged_user": "%1 flagged a user profile (%2)", - "user_flagged_user_dual": "%1 and %2 flagged a user profile (%3)", - "user_flagged_user_multiple": "%1 and %2 others flagged a user profile (%3)", - "user_posted_to": "%1 has posted a reply to: %2", - "user_posted_to_dual": "%1 and %2 have posted replies to: %3", - "user_posted_to_multiple": "%1 and %2 others have posted replies to: %3", - "user_posted_topic": "%1 has posted a new topic: %2", - "user_started_following_you": "%1 started following you.", - "user_started_following_you_dual": "%1 and %2 started following you.", - "user_started_following_you_multiple": "%1 and %2 others started following you.", - "new_register": "%1 sent a registration request.", - "new_register_multiple": "There are %1 registration requests awaiting review.", - "flag_assigned_to_you": "Flag %1 has been assigned to you", + "all": "ทั้งหมด", + "topics": "กระทู้", + "replies": "คำตอบ", + "chat": "แชท", + "follows": "ติดตาม", + "upvote": "โหวตขึ้น", + "new-flags": "ปักธงใหม่", + "my-flags": "ธงที่ถูกปักให้ฉัน", + "bans": "แบน", + "new_message_from": "ข้อความใหม่จาก %1", + "upvoted_your_post_in": "%1 ได้โหวตโพสต์ของคุณขึ้นใน %2", + "upvoted_your_post_in_dual": "%1 และ %2ได้โหวตโพสต์ของคุณขึ้นใน %3 ", + "upvoted_your_post_in_multiple": "%1 และคืนอื่นๆอีก %2 คน ได้โหวตโพสต์ของคุณขึ้นใน %3", + "moved_your_post": "%1 ได้ย้ายโพสต์ของคุณไปยัง %2", + "moved_your_topic": "%1 ได้ย้าย %2", + "user_flagged_post_in": "%1 ได้ปักธงโพสต์ใน %2", + "user_flagged_post_in_dual": "%1และ %2ได้ปักธงโพสต์ใน %3", + "user_flagged_post_in_multiple": "%1 และคนอื่นๆอีก %2 ได้ปักธงโพสต์ใน %3", + "user_flagged_user": "%1 ได้ปักธงโปรไฟล์ผู้ใช้ (%2)", + "user_flagged_user_dual": "%1และ%2ได้ปักธงโปรไฟล์ผู้ใช้ (%3)", + "user_flagged_user_multiple": "%1และคืนอื่นๆอีก %2 ได้ปักธงโปรไฟล์ผู้ใช้ (%3)", + "user_posted_to": "%1 ได้โพสต์คำตอบไปยัง : %2", + "user_posted_to_dual": "%1และ %2ได้โพสต์คำตอบไปยัง : %3 ", + "user_posted_to_multiple": "%1และคนอื่นๆอีก %2 ได้โพสต์คำตอบไปยัง : %3", + "user_posted_topic": "%1ได้โพสต์กระทู้ใหม่ : %2", + "user_started_following_you": "%1 ได้เริ่มติดตามคุณ", + "user_started_following_you_dual": "%1และ%2ได้เริ่มติดตามคุณ", + "user_started_following_you_multiple": "%1และคืนอื่นๆอีก %2  คนได้เริ่มติดตามคุณ", + "new_register": "%1ได้ส่งคำขอสมัครสมาชิก", + "new_register_multiple": "มี%1คำขอสมัครสมาชิกที่รอการรีวิว", + "flag_assigned_to_you": "ปักธง %1ได้ถูกปักธงให้คุณ", "email-confirmed": "Email ได้รับการยืนยันแล้ว", "email-confirmed-message": "ขอบคุณที่ยืนยัน Email ของคุณ บัญชีของคุณสามารถใช้งานได้แล้ว", "email-confirm-error-message": "มีปัญหาในการยืนยัน Email ของคุณ บางทีรหัสไม่ถูกต้องหรือหมดอายุแล้ว", diff --git a/public/language/th/pages.json b/public/language/th/pages.json index 7a92d461eb..e1f1dd8a6a 100644 --- a/public/language/th/pages.json +++ b/public/language/th/pages.json @@ -1,52 +1,52 @@ { "home": "หน้าแรก", "unread": "กระทู้ที่ไม่ได้อ่าน", - "popular-day": "Popular topics today", - "popular-week": "Popular topics this week", - "popular-month": "Popular topics this month", - "popular-alltime": "All time popular topics", + "popular-day": "กระทู้ฮิตวันนี้", + "popular-week": "กระทู้ฮิตสัปดาห์นี้", + "popular-month": "กระทู้ฮิตเดือนนี้", + "popular-alltime": "กระทู้ฮิตตลาดกาล", "recent": "กระทู้ล่าสุด", - "flagged-content": "Flagged Content", - "ip-blacklist": "IP Blacklist", - "users/online": "Online Users", - "users/latest": "Latest Users", - "users/sort-posts": "Users with the most posts", - "users/sort-reputation": "Users with the most reputation", - "users/banned": "Banned Users", - "users/most-flags": "Most flagged users", - "users/search": "User Search", - "notifications": "แจ้งเตือน", - "tags": "Tags", - "tag": "Topics tagged under \"%1\"", - "register": "Register an account", - "registration-complete": "Registration complete", - "login": "Login to your account", - "reset": "Reset your account password", - "categories": "Categories", - "groups": "Groups", - "group": "%1 group", - "chats": "Chats", - "chat": "Chatting with %1", - "flags": "Flags", - "flag-details": "Flag %1 Details", - "account/edit": "Editing \"%1\"", - "account/edit/password": "Editing password of \"%1\"", - "account/edit/username": "Editing username of \"%1\"", - "account/edit/email": "Editing email of \"%1\"", - "account/info": "Account Info", - "account/following": "People %1 follows", - "account/followers": "People who follow %1", - "account/posts": "Posts made by %1", - "account/topics": "Topics created by %1", - "account/groups": "%1's Groups", - "account/bookmarks": "%1's Bookmarked Posts", - "account/settings": "User Settings", - "account/watched": "Topics watched by %1", - "account/upvoted": "Posts upvoted by %1", - "account/downvoted": "Posts downvoted by %1", - "account/best": "Best posts made by %1", - "confirm": "Email Confirmed", + "flagged-content": "เนื้อหาที่ถูกปักธง", + "ip-blacklist": "ไอดีที่ถูกขึ้นบัญชีดำ", + "users/online": "ผู้ใช้ออนไลน์", + "users/latest": "ผู้ใช้ล่าสุด", + "users/sort-posts": "ผู้ใช้ที่โพสต์เยอะที่สุด", + "users/sort-reputation": "ผู้ใช้ที่มีชื่อเสียงโด่งดังที่สุด", + "users/banned": "ผู้ใช้ที่ถูกแบน", + "users/most-flags": "ผู้ใช้ที่ถูกปักธงมากที่สุด", + "users/search": "ค้นหาผู้ใช้", + "notifications": "การแจ้งเตือน", + "tags": "แท็ก", + "tag": "กระทู้ที่ถูกติดแท็กภายใต้ \"%1\"", + "register": "สมัครบัญชีผู้ใช้", + "registration-complete": "สมัครสมาชิกสำเร็จเรียบร้อย", + "login": "เข้าสู่ระบบบัญชีของคุณ", + "reset": "ตั้งค่ารหัสผ่านใหม่ให้บัญชีของคุณ", + "categories": "หมวดหมู่", + "groups": "กลุ่ม", + "group": "%1 กลุ่ม", + "chats": "แชท", + "chat": "กำลังแชทกับ %1 ", + "flags": "ธง", + "flag-details": "ธง %1 รายละเอียด", + "account/edit": "กำลังแก้ไข \"%1\"", + "account/edit/password": "กำลังแก้ไขรหัสผ่านของ \"%1\"", + "account/edit/username": "กำลังแก้ไขชื่อผู้ใช้ \"%1\"", + "account/edit/email": "กำลังแก้ไขอีเมล์ของ \"%1\"", + "account/info": "ข้อมูลบัญชี", + "account/following": "ผู้คน %1 ติดตาม", + "account/followers": "ผู้คนที่ติดตาม %1", + "account/posts": "โพสต์ถูกสร้างโดย %1", + "account/topics": "กระทู้ถูกสร้างโดย %1", + "account/groups": "กลุ่มของ %1", + "account/bookmarks": "บุ๊กมาร์คโพสต์ของ %1", + "account/settings": "การตั้งค่าผู้ใช้", + "account/watched": "กระทู้ที่ถูกดูโดย %1", + "account/upvoted": "โพสต์ที่ถูกโหวตขึ้นโดย %1", + "account/downvoted": "โพสต์ที่โหวตลงโดย %1", + "account/best": "โพสต์ดีที่สุดที่ถูกสร้างโดย %1", + "confirm": "อีเมล์ได้รับการยืนยันแล้ว", "maintenance.text": "%1 กำลังอยู่ระหว่างการปิดปรับปรุงชั่วคราว กรุณาลองใหม่อีกครั้งในภายหลัง", "maintenance.messageIntro": "ผู้ดูแลระบบได้ฝากข้อความต่อไปนี้เอาไว้", - "throttled.text": "%1 is currently unavailable due to excessive load. Please come back another time." + "throttled.text": "%1 ไม่สามารถเข้าถึงได้ในขณะนี้เนื่องจากมีการโหลดที่หนักมากเกินไป กรุณากลับเข้ามาอีกครั้งในภายหลัง" } \ No newline at end of file diff --git a/public/language/th/recent.json b/public/language/th/recent.json index 2a6beb73f4..6e4d87131f 100644 --- a/public/language/th/recent.json +++ b/public/language/th/recent.json @@ -3,17 +3,17 @@ "day": "วัน", "week": "สัปดาห์", "month": "เดือน", - "year": "Year", - "alltime": "All Time", + "year": "ปี", + "alltime": "ตลอดกาล", "no_recent_topics": "ไม่มีกระทู้ล่าสุด", - "no_popular_topics": "There are no popular topics.", - "there-is-a-new-topic": "There is a new topic.", - "there-is-a-new-topic-and-a-new-post": "There is a new topic and a new post.", - "there-is-a-new-topic-and-new-posts": "There is a new topic and %1 new posts.", - "there-are-new-topics": "There are %1 new topics.", - "there-are-new-topics-and-a-new-post": "There are %1 new topics and a new post.", - "there-are-new-topics-and-new-posts": "There are %1 new topics and %2 new posts.", - "there-is-a-new-post": "There is a new post.", - "there-are-new-posts": "There are %1 new posts.", - "click-here-to-reload": "Click here to reload." + "no_popular_topics": "ไม่มีกระทู้ฮิต", + "there-is-a-new-topic": "มีกระทู้ใหม่", + "there-is-a-new-topic-and-a-new-post": "มีกระทู้ใหม่และโพสต์ใหม่", + "there-is-a-new-topic-and-new-posts": "มีกระทู้ใหม่และ %1  โพสต์ใหม่", + "there-are-new-topics": "มี %1  กระทู้ใหม่", + "there-are-new-topics-and-a-new-post": "มี %1  กระทู้ใหม่และโพสต์ใหม่", + "there-are-new-topics-and-new-posts": "มี %1  กระทู้ใหม่และ %2 โพสต์ใหม่", + "there-is-a-new-post": "มีโพสต์ใหม่", + "there-are-new-posts": "มี %1  โพสต์ใหม่", + "click-here-to-reload": "คลิกที่นี่เพื่อโหลดใหม่อีกครั้ง" } \ No newline at end of file diff --git a/public/language/th/register.json b/public/language/th/register.json index 191d023847..bf51eefb19 100644 --- a/public/language/th/register.json +++ b/public/language/th/register.json @@ -1,6 +1,6 @@ { "register": "ลงทะเบียน", - "cancel_registration": "Cancel Registration", + "cancel_registration": "ยกเลิกการสมัคร", "help.email": "ผู้ใช้อื่น ๆ จะไม่สามารถมองเห็นอีเมลของคุณโดยดีฟอลต์", "help.username_restrictions": "ชื่อผู้ใช้ที่ไม่ซ้ำกับผู้อื่น จะต้องมีความยาวระหว่าง% 1% และ %2 ตัวอักษร ผู้ใช้อื่นๆ สามารถพูดถึงคุณโดย @ชื่อผู้ใช้", "help.minimum_password_length": "ความยาวรหัสผ่านของคุณต้องมีอย่างน้อย %1 ตัวอักษร", @@ -16,8 +16,8 @@ "alternative_registration": "เข้าสู่ระบบโดยทางอื่น", "terms_of_use": "เงื่อนไขการใช้งาน", "agree_to_terms_of_use": "ยอมรับข้อตกลงในการใช้งาน", - "terms_of_use_error": "You must agree to the Terms of Use", - "registration-added-to-queue": "Your registration has been added to the approval queue. You will receive an email when it is accepted by an administrator.", - "interstitial.intro": "We require some additional information before we can create your account.", - "interstitial.errors-found": "We could not complete your registration:" + "terms_of_use_error": "คุณต้องยอมรับเงื่อนไขการใช้งานก่อน", + "registration-added-to-queue": "การสมัครใช้งานของถูกเพิ่มเข้าไปยังระบบเพิ่อรอการอนุมัติแล้ว คุณจะได้รับอีเมล์เมื่อการสมัครใช้งานของคุณถูกยอมรับโดยผู้ดูแลระบบหรือแอดมิน", + "interstitial.intro": "เราต้องการข้อมูลบางอย่างเพิ่มเติมก่อนที่เราจะสร้างบัญชีให้คุณ", + "interstitial.errors-found": "เราไม่สามารถทำให้การสมัครสมาชิกของคุณสำเร็จได้:" } \ No newline at end of file diff --git a/public/language/th/reset_password.json b/public/language/th/reset_password.json index b2a61b08d7..be04453dec 100644 --- a/public/language/th/reset_password.json +++ b/public/language/th/reset_password.json @@ -13,5 +13,5 @@ "invalid_email": "อีเมล์ไม่ถูกต้อง / อีเมล์ไม่มีอยู่!", "password_too_short": "รหัสผ่านที่คุณกำหนดยังสั้นเกินไป กรุณากำหนดรหัสผ่านของคุณใหม่", "passwords_do_not_match": "รหัสผ่านทั้ง 2 ที่ใส่ไม่ตรงกัน", - "password_expired": "Your password has expired, please choose a new password" + "password_expired": "รหัสผ่านของคุณหมดอายุแล้ว กรุณาเลือกรหัสผ่านใหม่" } \ No newline at end of file diff --git a/public/language/th/search.json b/public/language/th/search.json index 4dafe32b18..fc250eb3dc 100644 --- a/public/language/th/search.json +++ b/public/language/th/search.json @@ -1,22 +1,22 @@ { "results_matching": "%1 ผลลัพธ์ ตรงตามที่ระบุ \"%2\", (%3 วินาที)", "no-matches": "ไม่พบผลลัพธ์ที่สอดคล้อง", - "advanced-search": "Advanced Search", - "in": "In", + "advanced-search": "การค้นหาแบบละเอียด", + "in": "ใน", "titles": "หัวข้อ", "titles-posts": "หัวข้อ และ ข้อความ", "posted-by": "บันทึกโดย", - "in-categories": "In Categories", - "search-child-categories": "Search child categories", - "has-tags": "Has tags", + "in-categories": "ในหมวดหมู่", + "search-child-categories": "ค้นหาหมวดหมู่ย่อย", + "has-tags": "มีแท็ก", "reply-count": "จำนวนข้อความตอบกลับ", "at-least": "อย่างน้อยที่สุด", "at-most": "อย่างมากที่สุด", - "relevance": "Relevance", - "post-time": "Post time", - "newer-than": "Newer than", - "older-than": "Older than", - "any-date": "Any date", + "relevance": "ที่เกี่ยวข้อง", + "post-time": "เวลาโพสต์", + "newer-than": "ใหม่กว่า", + "older-than": "เก่ากว่า", + "any-date": "วันที่ใดๆ", "yesterday": "เมื่อวาน", "one-week": "1 สัปดาห์", "two-weeks": "2 สัปดาห์", @@ -26,17 +26,17 @@ "one-year": "1 ปี", "sort-by": "จัดเรียงโดย", "last-reply-time": "เวลาตอบกลับล่าสุด", - "topic-title": "Topic title", + "topic-title": "หัวข้อกระทู้", "number-of-replies": "จำนวนข้อความตอบกลับ", "number-of-views": "จำนวนดู", - "topic-start-date": "Topic start date", - "username": "Username", - "category": "Category", + "topic-start-date": "วันที่เริ่มกระทู้", + "username": "ชื่อผู้ใช้", + "category": "หมวดหมู่", "descending": "เรียงจากมากไปน้อย", "ascending": "เรียงจากน้อยไปมาก", - "save-preferences": "Save preferences", - "clear-preferences": "Clear preferences", - "search-preferences-saved": "Search preferences saved", - "search-preferences-cleared": "Search preferences cleared", + "save-preferences": "บันทึกการตั้งค่า", + "clear-preferences": "ล้างการตั้งค่า", + "search-preferences-saved": "ค้นหาการตั้งค่าที่บันทึกไว้", + "search-preferences-cleared": "ค้นหาการตั้งค่าที่ลบล้างไป", "show-results-as": "แสดงผลลัพธ์แบบ" } \ No newline at end of file diff --git a/public/language/th/tags.json b/public/language/th/tags.json index e8bf52df2e..ccafeff224 100644 --- a/public/language/th/tags.json +++ b/public/language/th/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "ไม่มีหัวข้อสนทนาที่เกี่ยวข้องกับป้ายคำศัพท์นี้", "tags": "ป้ายคำศัพท์", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", + "enter_tags_here": "กรอกแท็กที่นี่ จำนวนอักขระอยู่ระหว่าง %1 และ %2 ตัวอักษรต่อ 1 แท็ก", "enter_tags_here_short": "ใส่ป้ายคำศัพท์ ...", "no_tags": "ยังไม่มีป้ายคำศัพท์" } \ No newline at end of file diff --git a/public/language/th/topic.json b/public/language/th/topic.json index 2cd850d1fb..922f949440 100644 --- a/public/language/th/topic.json +++ b/public/language/th/topic.json @@ -5,7 +5,7 @@ "no_topics_found": "ไม่พบกระทู้", "no_posts_found": "ไม่พบโพส", "post_is_deleted": "ลบ Post นี้เรียบร้อยแล้ว!", - "topic_is_deleted": "This topic is deleted!", + "topic_is_deleted": "กระทู้นี้ถูกลบไปแล้ว!", "profile": "รายละเอียด", "posted_by": "โพสโดย %1", "posted_by_guest": "โพสโดย Guest", @@ -13,45 +13,46 @@ "notify_me": "แจ้งเตือนเมื่อการตอบใหม่ในกระทู้นี้", "quote": "คำอ้างอิง", "reply": "ตอบ", - "replies_to_this_post": "%1 Replies", - "last_reply_time": "Last reply", - "reply-as-topic": "Reply as topic", + "replies_to_this_post": " %1 คำตอบ", + "one_reply_to_this_post": "1 Reply", + "last_reply_time": "คำตอบล่าสุด", + "reply-as-topic": "ตอบโดยตั้งกระทู้ใหม่", "guest-login-reply": "เข้าสู่ระบบเพื่อตอบกลับ", "edit": "แก้ไข", "delete": "ลบ", - "purge": "Purge", + "purge": "ล้าง", "restore": "กู้", "move": "ย้าย", "fork": "แยก", "link": "ลิงค์", "share": "แชร์", "tools": "เครื่องมือ", - "locked": "Locked", - "pinned": "Pinned", - "moved": "Moved", - "bookmark_instructions": "Click here to return to the last read post in this thread.", + "locked": "ถูกล็อก", + "pinned": "ถูกปักหมุด", + "moved": "ถูกย้าย", + "bookmark_instructions": "คลิกที่นี่เพื่อกลับไปยังโพสต์ล่าสุดในหัวข้อนี้", "flag_title": "ปักธงโพสต์นี้เพื่อดำเนินการ", "deleted_message": "Topic นี้ถูกลบไปแล้ว เฉพาะผู้ใช้งานที่มีสิทธิ์ในการจัดการ Topic เท่านั้นที่จะมีสิทธิ์ในการเข้าชม", "following_topic.message": "คุณจะได้รับการแจ้งเตือนเมื่อมีคนโพสต์ในกระทู้นี้", - "not_following_topic.message": "You will see this topic in the unread topics list, but you will not receive notifications when somebody posts to this topic.", - "ignoring_topic.message": "You will no longer see this topic in the unread topics list. You will be notified when you are mentioned or your post is up voted.", + "not_following_topic.message": "คุณจะเห็นกระทู้นี้ในรายการของกระทู้ที่ยังไม่ได้อ่าน แต่คุณจะไม่ได้รับการแจ้งเตือนเมื่่อมีคนตอบกระทู้นี้", + "ignoring_topic.message": "คุณจะไม่เห็นกระทู้นี้ในรายการของกระทู้ที่ยังไม่ได้อ่านอีกต่อไป คุณจะได้รับการแจ้งเตือนเมื่อมีคนกล่าวถึงคุณหรือโพสต์ของคุณถูกโหวตขึ้น", "login_to_subscribe": "กรุณาลงทะเบียนหรือเข้าสู่ระบบเพื่อที่จะติดตามกระทู้นี้", "markAsUnreadForAll.success": "ทำเครื่องหมายว่ายังไม่ได้อ่านทั้งหมด", - "mark_unread": "Mark unread", - "mark_unread.success": "Topic marked as unread.", + "mark_unread": "ถูกมาร์คว่ายังไม่ได้อ่าน", + "mark_unread.success": "กระทู้ที่ถูกมาร์คว่ายังไม่ได้อ่าน", "watch": "ติดตาม", "unwatch": "ยังไม่ได้ติดตาม", "watch.title": "ให้แจ้งเตือนเมื่อมีการตอบกลับ Topic นี้", "unwatch.title": "ยกเลิกการติดตาม Topic นี้", "share_this_post": "แชร์โพสต์นี้", - "watching": "Watching", - "not-watching": "Not Watching", - "ignoring": "Ignoring", - "watching.description": "Notify me of new replies.
Show topic in unread.", - "not-watching.description": "Do not notify me of new replies.
Show topic in unread if category is not ignored.", - "ignoring.description": "Do not notify me of new replies.
Do not show topic in unread.", + "watching": "กำลังดู", + "not-watching": "ไม่ดูแล้ว", + "ignoring": "ความเมินเฉย", + "watching.description": "เตือนฉันเมื่อมีคำตอบใหม่
แสดงกระทู้ในรายการที่ยังไม่ได้อ่าน", + "not-watching.description": "อย่าเตือนฉันเมือมีคำตอบใหม่
แสดงกระทู้ในรายการที่ยังไม่ได้อ่านหากหมวดหมู่นี้ไม่ได้รับการเมินเฉย", + "ignoring.description": "อย่าเตือนฉันเมื่อมีคำตอบใหม่
อย่าแสดงกระทู้ในรายการที่ยังไม่ได้อ่าน", "thread_tools.title": "เครื่องมือช่วยจัดการ Topic", - "thread_tools.markAsUnreadForAll": "Mark unread for all", + "thread_tools.markAsUnreadForAll": "มาร์คว่ายังไม่ยังอ่านทั้งหมด", "thread_tools.pin": "ปักหมุดกระทู้", "thread_tools.unpin": "เลิกปักหมุดกระทู้", "thread_tools.lock": "ล็อคกระทู้", @@ -60,40 +61,40 @@ "thread_tools.move_all": "ย้ายทั้งหมด", "thread_tools.fork": "แยกกระทู้", "thread_tools.delete": "ลบกระทู้", - "thread_tools.delete-posts": "Delete Posts", + "thread_tools.delete-posts": "ลบโพสต์", "thread_tools.delete_confirm": "มั่นใจแล้วหรือไม่ที่จะลบ Topic นี้?", "thread_tools.restore": "กู้กระทู้", "thread_tools.restore_confirm": "มั่นใจแล้วหรือไม่ที่จะกู้คืน Topic นี้?", - "thread_tools.purge": "Purge Topic", - "thread_tools.purge_confirm": "Are you sure you want to purge this topic?", - "topic_move_success": "This topic has been successfully moved to %1", - "post_delete_confirm": "Are you sure you want to delete this post?", - "post_restore_confirm": "Are you sure you want to restore this post?", - "post_purge_confirm": "Are you sure you want to purge this post?", + "thread_tools.purge": "ล้างกระทู้", + "thread_tools.purge_confirm": "คุณแน่ใจแล้วใช้ไมว่าต้องการล้างกระทู้นี้?", + "topic_move_success": "กระทู้นี้ได้รับการย้ายไปยัง %1 เรียบร้อยแล้ว", + "post_delete_confirm": "คุณแน่ใจแล้วใช่ไหมว่าต้องการลบโพสต์นี้", + "post_restore_confirm": "คุณแน่ใจแล้วใช้ไหมว่าต้องการกู้คืนโพสต์นี้", + "post_purge_confirm": "คุณแน่ใจแล้วใช่ไหมว่าต้องการล้างโพสต์นี้", "load_categories": "กำลังโหลดหมวดหมู่", "disabled_categories_note": "หมวดหมู่ที่ปิดใช้งานจะเป็นสีเทา", "confirm_move": "ย้าย", "confirm_fork": "แยก", - "bookmark": "Bookmark", - "bookmarks": "Bookmarks", - "bookmarks.has_no_bookmarks": "You haven't bookmarked any posts yet.", + "bookmark": "บุ๊กมาร์ก", + "bookmarks": "บุ๊กมาร์ก", + "bookmarks.has_no_bookmarks": "คุณยังไม่มีบุ๊กมาร์กใดๆเลย", "loading_more_posts": "โหลดโพสเพิ่มเติม", "move_topic": "ย้ายกระทู้", - "move_topics": "Move Topics", + "move_topics": "ย้ายกระทู้", "move_post": "ย้ายโพส", - "post_moved": "Post moved!", + "post_moved": "โพสต์ถูกย้ายแล้ว!", "fork_topic": "แยกกระทู้", "topic_will_be_moved_to": "กระทู้นี้จะถูกย้ายไปที่หมวดหมู่", "fork_topic_instruction": "คลิกที่โพสที่คุณต้องการที่จะแยก", "fork_no_pids": "ไม่มีโพสต์ที่เลือก!", - "fork_pid_count": "%1 post(s) selected", - "fork_success": "Successfully forked topic! Click here to go to the forked topic.", - "delete_posts_instruction": "Click the posts you want to delete/purge", + "fork_pid_count": " %1 โพสต์(s) ที่เลือก", + "fork_success": "แตกกระทู้สำเร็จแล้ว! คลิกที่นี่เพื่อไปยั้งกระทู้ที่คุณแตกประเด็น", + "delete_posts_instruction": "คลิกโพสต์ที่คุณต้องการลบ/ล้าง", "composer.title_placeholder": "ป้อนชื่อกระทู้ของคุณที่นี่ ...", - "composer.handle_placeholder": "Name", + "composer.handle_placeholder": "ชื่อ", "composer.discard": "ยกเลิก", "composer.submit": "ส่ง", - "composer.replying_to": "Replying to %1", + "composer.replying_to": "ตอบไปยัง %1", "composer.new_topic": "กระทู้ใหม่", "composer.uploading": "กำลังอัพโหลด ...", "composer.thumb_url_label": "วาง URL ของภาพของกระทู้นี้", @@ -102,18 +103,18 @@ "composer.thumb_file_label": "หรืออัปโหลดไฟล์", "composer.thumb_remove": "ล้างฟิลด์", "composer.drag_and_drop_images": "ลากและวางภาพที่นี่", - "more_users_and_guests": "%1 more user(s) and %2 guest(s)", - "more_users": "%1 more user(s)", - "more_guests": "%1 more guest(s)", - "users_and_others": "%1 and %2 others", - "sort_by": "Sort by", - "oldest_to_newest": "Oldest to Newest", - "newest_to_oldest": "Newest to Oldest", - "most_votes": "Most votes", - "most_posts": "Most posts", - "stale.title": "Create new topic instead?", - "stale.warning": "The topic you are replying to is quite old. Would you like to create a new topic instead, and reference this one in your reply?", - "stale.create": "Create a new topic", - "stale.reply_anyway": "Reply to this topic anyway", - "link_back": "Re: [%1](%2)" + "more_users_and_guests": "ผู้ใช้อีก %1 คน (s) และ %2 guest(s)", + "more_users": "อีก %1 ผู้ใช้(s)", + "more_guests": "อีก %1 guest(s)", + "users_and_others": " %1 และคนอื่นๆอีก %2 ", + "sort_by": "เรียงตาม", + "oldest_to_newest": "เก่าสุดไปยังใหม่สุด", + "newest_to_oldest": "ใหม่สุดไปยังเก่าสุด", + "most_votes": "โหวตมากสุด", + "most_posts": "โพสต์มากสุด", + "stale.title": "ตั้งกระทู้ใหม่แทนไหม?", + "stale.warning": "กระทู้ที่คุณกำลังตอบเก่าไปหน่อยนะ อยากจะลองตั้งกระทู้ใหม่แทนไหมล่ะ? แล้วก็อ้างอิงกระทู้นี้ไปยังคำตอบของคุณ", + "stale.create": "ตั้งกระทู้ใหม่", + "stale.reply_anyway": "ตอบกระทู้นี้ไม่ว่ายังไงก็ตาม", + "link_back": "ตอบกลับ: [%1](%2)" } \ No newline at end of file diff --git a/public/language/th/unread.json b/public/language/th/unread.json index 00f800a723..10d0de6c3e 100644 --- a/public/language/th/unread.json +++ b/public/language/th/unread.json @@ -5,9 +5,9 @@ "mark_as_read": "ทำเครื่องหมายว่าอ่านแล้ว", "selected": "เลือก", "all": "ทั้งหมด", - "all_categories": "All categories", + "all_categories": "หมวดหมู่ทั้งหมด", "topics_marked_as_read.success": "Topic ถูกทำเครื่องหมายว่าอ่านแล้วเรียบร้อย", - "all-topics": "All Topics", - "new-topics": "New Topics", - "watched-topics": "Watched Topics" + "all-topics": "กระทู้ทั้งหมด", + "new-topics": "ตั้งกระทู้ใหม่", + "watched-topics": "กระทู้ที่ดูแล้ว" } \ No newline at end of file diff --git a/public/language/th/uploads.json b/public/language/th/uploads.json index 1622cb5693..b43c5bcae6 100644 --- a/public/language/th/uploads.json +++ b/public/language/th/uploads.json @@ -1,6 +1,6 @@ { - "uploading-file": "Uploading the file...", - "select-file-to-upload": "Select a file to upload!", - "upload-success": "File uploaded successfully!", - "maximum-file-size": "Maximum %1 kb" + "uploading-file": "กำลังอัพโหลดไฟล์ ...", + "select-file-to-upload": "กรุณาเลือกไฟล์ที่จะอัพโหลด", + "upload-success": "อัพโหลดไฟล์เรียบร้อยแล้ว", + "maximum-file-size": "มากที่สุดได้ %1 kb" } \ No newline at end of file diff --git a/public/language/th/user.json b/public/language/th/user.json index 345583ac68..850e87fba3 100644 --- a/public/language/th/user.json +++ b/public/language/th/user.json @@ -4,14 +4,14 @@ "username": "ชื่อผู้ใช้", "joindate": "วันที่เข้าร่วม", "postcount": "จำนวนโพสต์", - "email": "อีเมล", - "confirm_email": "ยืนยันอีเมล", + "email": "อีเมล์", + "confirm_email": "ยืนยันอีเมล์", "account_info": "ข้อมูลบัญชี", "ban_account": "แบนบัญชี", "ban_account_confirm": "คุณต้องการแบนผู้ใช้นี้หรือไม่?", "unban_account": "ปลดแบน", "delete_account": "ลบบัญชี", - "delete_account_confirm": "คุณต้องการลบบัญชีของคุณใช่หรือไม่?
การกระทำนี้ไม่สามารถกู้คืนได้ ข้อมูลบัญชีของคุณจะถูกลบทั้งหมด

กรอกชื่อผู้ใช้ของคุณ เพื่อยืนยันการลบบัญชีของ", + "delete_account_confirm": "Are you sure you want to delete your account?
This action is irreversible and you will not be able to recover any of your data

Enter your username to confirm that you wish to destroy this account.", "delete_this_account_confirm": "คุณต้องการลบบัญชีนี้ใช่หรือไม่?
การกระทำนี้ไม่สามารถกู้คืนได้ ข้อมูลบัญชีนี้จะถูกลบทั้งหมด", "account-deleted": "บัญชีถูกลบแล้ว", "fullname": "ชื่อเต็ม", @@ -37,7 +37,7 @@ "follow": "ติดตาม", "unfollow": "เลิกติดตาม", "more": "เพิ่มเติม", - "profile_update_success": "ข้อมูลประวัติส่วนตัวได้รับการแก้ไขแล้ว", + "profile_update_success": "Profile has been updated successfully!", "change_picture": "เปลี่ยนรูป", "change_username": "เปลี่ยนชื่อผู้ใช้", "change_email": "เปลี่ยนอีเมล", @@ -60,7 +60,7 @@ "username_taken_workaround": "ชื้อผู้ใช้นี้ถูกใช้แล้ว เราทำการแก้ไขชื่อผู้ใช้ของคุณเล็กน้อยเป็น %1", "password_same_as_username": "คุณใช้รหัสผ่านเดียวกับชื่อผู้ใช้ กรุณาเปลี่ยนรหัสผ่านใหม่", "password_same_as_email": "คุณใช้รหัสผ่านเดียวกับอีเมล กรุณาเปลี่ยนรหัสผ่านใหม่", - "weak_password": "Weak password.", + "weak_password": "พาสเวิร์ดเดาได้ง่าย", "upload_picture": "อัพโหลดรูป", "upload_a_picture": "อัพโหลดรูป", "remove_uploaded_picture": "ลบภาพที่อัพโหลดไว้", @@ -73,8 +73,8 @@ "show_fullname": "แสดงชื่อจริงของฉัน", "restrict_chats": "รับข้อความสนทนาจากคนที่ฉันติดตามเท่านั้น", "digest_label": "สมัครรับข่าวสารจาก Digest", - "digest_description": "สมัครรับอีเมลอัพเดทข้อมูลของบอร์ดสนทนา (ข้อความแจ้งเตือนและหัวข้อใหม่ๆ) ตามรายการที่ตั้งไว้", - "digest_off": "ปิด", + "digest_description": "Subscribe to email updates for this forum (new notifications and topics) according to a set schedule", + "digest_off": "Off", "digest_daily": "รายวัน", "digest_weekly": "รายสัปดาห์", "digest_monthly": "รายเดือน", @@ -103,34 +103,34 @@ "browsing": "เปิดดูการตั้งค่า", "open_links_in_new_tab": "เปิดลิงค์ในแท็บใหม่", "enable_topic_searching": "เปิดใช้การค้นหาแบบ In-Topic", - "topic_search_help": "If enabled, in-topic searching will override the browser's default page search behaviour and allow you to search through the entire topic, instead of what is only shown on screen", - "delay_image_loading": "Delay Image Loading", - "image_load_delay_help": "If enabled, images in topics will not load until they are scrolled into view", - "scroll_to_my_post": "After posting a reply, show the new post", - "follow_topics_you_reply_to": "Watch topics that you reply to", - "follow_topics_you_create": "Watch topics you create", - "grouptitle": "Group Title", - "no-group-title": "No group title", - "select-skin": "Select a Skin", - "select-homepage": "Select a Homepage", - "homepage": "Homepage", - "homepage_description": "Select a page to use as the forum homepage or 'None' to use the default homepage.", - "custom_route": "Custom Homepage Route", - "custom_route_help": "Enter a route name here, without any preceding slash (e.g. \"recent\", or \"popular\")", - "sso.title": "Single Sign-on Services", - "sso.associated": "Associated with", - "sso.not-associated": "Click here to associate with", - "info.latest-flags": "Latest Flags", - "info.no-flags": "No Flagged Posts Found", - "info.ban-history": "Recent Ban History", - "info.no-ban-history": "This user has never been banned", - "info.banned-until": "Banned until %1", - "info.banned-permanently": "Banned permanently", - "info.banned-reason-label": "Reason", - "info.banned-no-reason": "No reason given.", - "info.username-history": "Username History", - "info.email-history": "Email History", - "info.moderation-note": "Moderation Note", - "info.moderation-note.success": "Moderation note saved", - "info.moderation-note.add": "Add note" + "topic_search_help": "หากเปิดใช้งาน, \"การค้นหาภายในกระทู้\" จะแทนที่ระบบ \"การค้นหาจากค่าเริ่มต้นของเบราเซอร์\" และจะทำให้คุณค้นหาข้อมูลต่างๆภายในกระทู้ได้ แทนที่จะเป็นการหาแค่สิ่งที่แสดงบนหน้าจอเท่านั้น", + "delay_image_loading": "การโหลดรูปภาพช้าลง", + "image_load_delay_help": "หากเปิดใช้งาน, รูปภาพในกระทู้จะไม่โหลดจนกว่าจะมีการเลื่อนไปดู", + "scroll_to_my_post": "หลังจากได้ทำการโพสต์ตอบกลับ ให้แสดงโพสต์ใหม่", + "follow_topics_you_reply_to": "ดูกระทู้ที่คุณตอบ", + "follow_topics_you_create": "ดูกระทู้ที่คุณตั้ง", + "grouptitle": "ชื่อกลุ่ม", + "no-group-title": "ไม่มีชื่อกลุ่ม", + "select-skin": "เลือกสกิน", + "select-homepage": "เลือกหน้าแรก", + "homepage": "หน้าแรก", + "homepage_description": "เลือกหน้าที่จะใช้เป็นหน้าแรกของฟอรั่ม หรือเลือก None เพื่อใช้ค่าเริ่มต้น", + "custom_route": "กำหนดเส้นทางไปหน้าแรกเอง", + "custom_route_help": "กรอกเส้นทางที่นี่ โดยไม่มีเครื่องหมาย ทับ (เช่น \"recent\" หรือ \"popular\")", + "sso.title": "บริการ Single Sign-on ", + "sso.associated": "เกี่ยวข้องกับ", + "sso.not-associated": "คลิกที่นี่เพื่อเชื่อมโยงกับ", + "info.latest-flags": "ปักธงล่าสุด", + "info.no-flags": "ไม่พบโพสต์ที่ถูกปักธง", + "info.ban-history": "ประวัติแบนล่าสุด", + "info.no-ban-history": "ผู้ใช้นี้ถูกแบนแล้ว", + "info.banned-until": "แบนจนกว่า %1", + "info.banned-permanently": "แบนอย่างถาวร", + "info.banned-reason-label": "เหตุผล", + "info.banned-no-reason": "ไม่มีเหตุผล", + "info.username-history": "ประวัติผู้ใช้", + "info.email-history": "ประวัติอีเมล์", + "info.moderation-note": "โน๊ตของ Moderation", + "info.moderation-note.success": "โน้ตของ Moderation ถูกบันทึกแล้ว", + "info.moderation-note.add": "เพิ่มโน้ต" } \ No newline at end of file diff --git a/public/language/th/users.json b/public/language/th/users.json index 483057d5cd..c330f2416a 100644 --- a/public/language/th/users.json +++ b/public/language/th/users.json @@ -6,7 +6,7 @@ "search": "ค้นหา", "enter_username": "กรอกชื่อผู้ใช้เพื่อค้นหา", "load_more": "โหลดเพิ่มเติม", - "users-found-search-took": "พบ %1 ผู้ใช้! การค้นหาใช้เวลาทั้งหมด %2 วินาที", + "users-found-search-took": "พบ %1 ผู้ใช้(s)! การค้นหาใช้เวลาทั้งหมด %2 วินาที", "filter-by": "การกรอง", "online-only": "กำลังออนไลน์เท่านั้น", "invite": "เชิญ", diff --git a/public/language/tr/admin/advanced/database.json b/public/language/tr/admin/advanced/database.json index 25989418d7..39fccc540c 100644 --- a/public/language/tr/admin/advanced/database.json +++ b/public/language/tr/admin/advanced/database.json @@ -8,13 +8,13 @@ "mongo": "Mongo", "mongo.version": "MongoDB Sürümü", "mongo.storage-engine": "Storage Engine", - "mongo.collections": "Collections", - "mongo.objects": "Objects", + "mongo.collections": "Koleksiyonlar", + "mongo.objects": "Objeler", "mongo.avg-object-size": "Avg. Object Size", "mongo.data-size": "Veri Boyutu", "mongo.storage-size": "Storage Size", - "mongo.index-size": "Index Size", - "mongo.file-size": "File Size", + "mongo.index-size": "İndex Boyutu", + "mongo.file-size": "Dosya Boyutu", "mongo.resident-memory": "Resident Memory", "mongo.virtual-memory": "Virtual Memory", "mongo.mapped-memory": "Mapped Memory", diff --git a/public/language/tr/admin/advanced/events.json b/public/language/tr/admin/advanced/events.json index 5bac444857..bca47b6a68 100644 --- a/public/language/tr/admin/advanced/events.json +++ b/public/language/tr/admin/advanced/events.json @@ -1,6 +1,6 @@ { "events": "Olaylar", "no-events": "Olay yok", - "control-panel": "Events Control Panel", + "control-panel": "Etkinlik Kontrol Paneli", "delete-events": "Olayları Sil" } \ No newline at end of file diff --git a/public/language/tr/admin/appearance/customise.json b/public/language/tr/admin/appearance/customise.json index 83e506e854..dbb54c7b1f 100644 --- a/public/language/tr/admin/appearance/customise.json +++ b/public/language/tr/admin/appearance/customise.json @@ -1,9 +1,12 @@ { "custom-css": "Özel CSS", - "custom-css.description": "Enter your own CSS declarations here, which will be applied after all other styles.", - "custom-css.enable": "Özel CSS Aktif", + "custom-css.description": "Özel CSS kodlarınızı bu alana girin.", + "custom-css.enable": "Özel CSS Etkinleştir", "custom-header": "Özel Header", - "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", - "custom-header.enable": "Enable Custom Header" + "custom-header.description": "Forumunuzun biçimlendirmesini sağlayacak <head> bölümüne eklenecek özel HTML'yi (ör. JavaScript, Meta Etiketler vb.) Girin.", + "custom-header.enable": "Özel Header'ı Etkinleştir", + + "custom-css.livereload": "Canlı Yenilemeyi Etkinleştir", + "custom-css.livereload.description": "Enable this to force all sessions on every device under your account to refresh whenever you click save" } \ No newline at end of file diff --git a/public/language/tr/admin/appearance/skins.json b/public/language/tr/admin/appearance/skins.json index 57638271e7..335dd89547 100644 --- a/public/language/tr/admin/appearance/skins.json +++ b/public/language/tr/admin/appearance/skins.json @@ -2,8 +2,8 @@ "loading": "Deriler yükleniyor...", "homepage": "Anasayfa", "select-skin": "Deri Seç", - "current-skin": "Current Skin", - "skin-updated": "Skin Updated", - "applied-success": "%1 skin was succesfully applied", - "revert-success": "Skin reverted to base colours" + "current-skin": "Mevcut Deri", + "skin-updated": "Deri Güncellendi", + "applied-success": "%1 deri başarıyla uygulandı", + "revert-success": "Deri taban renkleri geri döndürüldü" } \ No newline at end of file diff --git a/public/language/tr/admin/appearance/themes.json b/public/language/tr/admin/appearance/themes.json index 9cdc64769e..e8df4d06b8 100644 --- a/public/language/tr/admin/appearance/themes.json +++ b/public/language/tr/admin/appearance/themes.json @@ -2,10 +2,10 @@ "checking-for-installed": "Yüklü temalar kontrol ediliyor...", "homepage": "Anasayfa", "select-theme": "Tema Seç", - "current-theme": "Current Theme", - "no-themes": "No installed themes found", - "revert-confirm": "Are you sure you wish to restore the default NodeBB theme?", - "theme-changed": "Theme Changed", - "revert-success": "You have successfully reverted your NodeBB back to it's default theme.", - "restart-to-activate": "Please restart your NodeBB to fully activate this theme" + "current-theme": "Geçerli Tema", + "no-themes": "Yüklü tema bulunamadı", + "revert-confirm": "Varsayılan NodeBB temasını geri yüklemek istediğinizden emin misiniz?", + "theme-changed": "Tema Değiştirildi", + "revert-success": "NodeBB'nin varsayılan temasına başarıyla geri dönüş yaptınız.", + "restart-to-activate": "Temayı tamamen aktif hale getirebilmek için NodeBB'yi yeniden başlat" } \ No newline at end of file diff --git a/public/language/tr/admin/development/info.json b/public/language/tr/admin/development/info.json index 594ac11906..cd8aa5fdbf 100644 --- a/public/language/tr/admin/development/info.json +++ b/public/language/tr/admin/development/info.json @@ -1,10 +1,12 @@ { "you-are-on": "Info - You are on %1:%2", + "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", "pid": "pid", "nodejs": "nodejs", "online": "online", "git": "git", + "memory": "memory", "load": "load", "uptime": "uptime", diff --git a/public/language/tr/admin/extend/rewards.json b/public/language/tr/admin/extend/rewards.json index 624fae6151..efbeadada9 100644 --- a/public/language/tr/admin/extend/rewards.json +++ b/public/language/tr/admin/extend/rewards.json @@ -1,17 +1,17 @@ { "rewards": "Ödüller", "condition-if-users": "If User's", - "condition-is": "Is:", - "condition-then": "Then:", + "condition-is": "İse:", + "condition-then": "Sonra:", "max-claims": "Amount of times reward is claimable", "zero-infinite": "Enter 0 for infinite", - "delete": "Delete", - "enable": "Aktif", - "disable": "Disable", - "control-panel": "Rewards Control", - "new-reward": "New Reward", + "delete": "Sil", + "enable": "Etkinleştir", + "disable": "Devredışı", + "control-panel": "Ödül Kontrol", + "new-reward": "Yeni Ödül", - "alert.delete-success": "Successfully deleted reward", + "alert.delete-success": "Ödül başarıyla silindi", "alert.no-inputs-found": "Illegal reward - no inputs found!", - "alert.save-success": "Successfully saved rewards" + "alert.save-success": "Ödüller başarıyla kaydedildi" } \ No newline at end of file diff --git a/public/language/tr/admin/general/dashboard.json b/public/language/tr/admin/general/dashboard.json index fbc3d434d1..e1145a6e63 100644 --- a/public/language/tr/admin/general/dashboard.json +++ b/public/language/tr/admin/general/dashboard.json @@ -5,9 +5,14 @@ "users": "Kullanıcılar", "posts": "İletiler", "topics": "Başlıklar", - "page-views-last-month": "Geçen ay sayfa görüntüleme", - "page-views-this-month": "Bu ay sayfa görüntüleme", - "page-views-last-day": "Son 24 saatteki sayfa görüntüleme", + "page-views-seven": "Son 7 Gün", + "page-views-thirty": "Son 30 Gün", + "page-views-last-day": "Son 24 saat", + "page-views-custom": "Özel Tarih Aralığı", + "page-views-custom-start": "Başlangıç", + "page-views-custom-end": "Son", + "page-views-custom-help": "Enter a date range of page views you would like to view. If no date picker is available, the accepted format is YYYY-MM-DD", + "page-views-custom-error": "Lütfen tarih aralığını geçerli formatta girin YYYY-MM-DD", "stats.day": "Gün", "stats.week": "Hafta", @@ -31,9 +36,9 @@ "search-plugin-tooltip": "Install a search plugin from the plugin page in order to activate search functionality", "control-panel": "Sistem Kontrol", - "reload": "Tekrar Yükle", - "restart": "Yeniden Başlat", - "restart-warning": "Reloading or Restarting your NodeBB will drop all existing connections for a few seconds.", + "reload": "Reload", + "restart": "Restart", + "restart-warning": "NodeBB yeniden yüklemek veya yeniden başlatmak için mevcut tüm bağlantıları birkaç saniye düşürür.", "maintenance-mode": "Bakım Modu", "maintenance-mode-title": "NodeBB için bakım modunu ayarlamak için buraya tıklayın", "realtime-chart-updates": "Gerçek Zamanlı Grafik Güncellemeleri", @@ -55,7 +60,7 @@ "recent": "Yeni", "unread": "Okunmamış", - "high-presence-topics": "High Presence Topics", + "high-presence-topics": "Öne Çıkan Başlıklar", "graphs.page-views": "Sayfa Gösterimi", "graphs.unique-visitors": "Benzersiz Ziyaretçiler", diff --git a/public/language/tr/admin/general/homepage.json b/public/language/tr/admin/general/homepage.json index e38827a2b3..3dad8ecbce 100644 --- a/public/language/tr/admin/general/homepage.json +++ b/public/language/tr/admin/general/homepage.json @@ -1,7 +1,7 @@ { "home-page": "Ana Sayfa", - "description": "Choose what page is shown when users navigate to the root URL of your forum.", - "home-page-route": "Home Page Route", - "custom-route": "Custom Route", - "allow-user-home-pages": "Allow User Home Pages" + "description": "Kullanıcıların, forumunuzun kök bağlantısına gittiğinde hangi sayfanın görüntüleneceğini seçin.", + "home-page-route": "Anasayfa Yolu", + "custom-route": "Özel Yol", + "allow-user-home-pages": "Kullanıcılara anasayfayı özelleştirmeye izin ver" } \ No newline at end of file diff --git a/public/language/tr/admin/general/languages.json b/public/language/tr/admin/general/languages.json index 7767668448..2ab657f82d 100644 --- a/public/language/tr/admin/general/languages.json +++ b/public/language/tr/admin/general/languages.json @@ -1,5 +1,6 @@ { "language-settings": "Dil Ayarları", "description": "The default language determines the language settings for all users who are visiting your forum.
Individual users can override the default language on their account settings page.", - "default-language": "Default Language" + "default-language": "Default Language", + "auto-detect": "Auto Detect Language Setting for Guests" } \ No newline at end of file diff --git a/public/language/tr/admin/general/sounds.json b/public/language/tr/admin/general/sounds.json index b2c52aa9f1..be203d3582 100644 --- a/public/language/tr/admin/general/sounds.json +++ b/public/language/tr/admin/general/sounds.json @@ -2,8 +2,8 @@ "notifications": "Bildiriler", "chat-messages": "Sohbet Mesajları", "play-sound": "Oynat", - "incoming-message": "Incoming Message", - "outgoing-message": "Outgoing Message", + "incoming-message": "Gelen İleti", + "outgoing-message": "Giden İleti", "upload-new-sound": "Yeni Ses Yükle", - "saved": "Settings Saved" + "saved": "Ayarlar Kaydedildi" } \ No newline at end of file diff --git a/public/language/tr/admin/manage/categories.json b/public/language/tr/admin/manage/categories.json index d5cb9e7729..930d9590bf 100644 --- a/public/language/tr/admin/manage/categories.json +++ b/public/language/tr/admin/manage/categories.json @@ -1,30 +1,30 @@ { "settings": "Kategori Ayarları", - "privileges": "Privileges", + "privileges": "İzinler", "name": "Kategori Adı", - "description": "Category Description", - "bg-color": "Background Colour", + "description": "Kategori Açıklama", + "bg-color": "Arkaplan Rengi", "text-color": "Yazı Rengi", "bg-image-size": "Arkaplan Görseli Boyutu", "custom-class": "Özel Sınıf", "num-recent-replies": "# of Recent Replies", - "ext-link": "External Link", + "ext-link": "Harici Bağlantı", "upload-image": "Görsel Yükle", - "delete-image": "Remove", - "category-image": "Category Image", + "delete-image": "Sil", + "category-image": "Kategori Görseli", "parent-category": "Parent Category", "optional-parent-category": "(Optional) Parent Category", - "parent-category-none": "(None)", + "parent-category-none": "(Hiçbiri)", "copy-settings": "Copy Settings From", "optional-clone-settings": "(Optional) Clone Settings From Category", "purge": "Purge Category", - "enable": "Enable", - "disable": "Disable", - "edit": "Edit", + "enable": "Etkinleştir", + "disable": "Devredışı", + "edit": "Düzenle", - "select-category": "Select Category", + "select-category": "Kategori Seç", "set-parent-category": "Set Parent Category", "privileges.description": "You can configure the access control privileges for this category in this section. Privileges can be granted on a per-user or a per-group basis. You can add a new user to this table by searching for them in the form below.", @@ -32,27 +32,27 @@ "privileges.section-viewing": "Viewing Privileges", "privileges.section-posting": "Posting Privileges", "privileges.section-moderation": "Moderation Privileges", - "privileges.section-user": "User", - "privileges.search-user": "Add User", + "privileges.section-user": "Kullanıcı", + "privileges.search-user": "Kullanıcı Ekle", "privileges.no-users": "No user-specific privileges in this category.", - "privileges.section-group": "Group", - "privileges.group-private": "This group is private", - "privileges.search-group": "Add Group", + "privileges.section-group": "Grup", + "privileges.group-private": "Bu grup gizlidir", + "privileges.search-group": "Grup Ekle", "privileges.copy-to-children": "Copy to Children", "privileges.copy-from-category": "Copy from Category", "privileges.inherit": "If the registered-users group is granted a specific privilege, all other groups receive an implicit privilege, even if they are not explicitly defined/checked. This implicit privilege is shown to you because all users are part of the registered-users user group, and so, privileges for additional groups need not be explicitly granted.", - "analytics.back": "Back to Categories List", + "analytics.back": "Kategori listesine geri dön", "analytics.title": "Analytics for \"%1\" category", "analytics.pageviews-hourly": "Figure 1 – Hourly page views for this category", "analytics.pageviews-daily": "Figure 2 – Daily page views for this category", "analytics.topics-daily": "Figure 3 – Daily topics created in this category", "analytics.posts-daily": "Figure 4 – Daily posts made in this category", - "alert.created": "Created", + "alert.created": "Yaratıldı", "alert.create-success": "Category successfully created!", "alert.none-active": "You have no active categories.", - "alert.create": "Create a Category", + "alert.create": "Bir Kategori Yarat", "alert.confirm-moderate": "Are you sure you wish to grant the moderation privilege to this user group? This group is public, and any users can join at will.", "alert.confirm-purge": "

Do you really want to purge this category \"%1\"?

Warning! All topics and posts in this category will be purged!

Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

", "alert.purge-success": "Category purged!", @@ -61,7 +61,7 @@ "alert.updated": "Updated Categories", "alert.updated-success": "Category IDs %1 successfully updated.", "alert.upload-image": "Kategori görseli yükle", - "alert.find-user": "Find a User", + "alert.find-user": "Bir Kullanıcı Ara", "alert.user-search": "Search for a user here...", "alert.find-group": "Find a Group", "alert.group-search": "Search for a group here..." diff --git a/public/language/tr/admin/manage/users.json b/public/language/tr/admin/manage/users.json index 0f1a1c7b8d..6cacd0e9b9 100644 --- a/public/language/tr/admin/manage/users.json +++ b/public/language/tr/admin/manage/users.json @@ -2,7 +2,7 @@ "users": "Kullanıcılar", "edit": "Düzenle", "make-admin": "Yönetici Yap", - "remove-admin": "Remove Admin", + "remove-admin": "Yöneticiliği Sil", "validate-email": "Validate Email", "send-validation-email": "Send Validation Email", "password-reset-email": "Send Password Reset Email", @@ -10,7 +10,7 @@ "temp-ban": "Ban User(s) Temporarily", "unban": "Unban User(s)", "reset-lockout": "Reset Lockout", - "reset-flags": "Reset Flags", + "reset-flags": "Bayrakları Sıfırla", "delete": "Delete User(s)", "purge": "Delete User(s) and Content", "download-csv": "Download CSV", @@ -24,7 +24,7 @@ "pills.top-rep": "Most Reputation", "pills.inactive": "Inactive", "pills.flagged": "Most Flagged", - "pills.banned": "Banned", + "pills.banned": "Yasaklandı", "pills.search": "User Search", "search.username": "By User Name", diff --git a/public/language/tr/admin/settings/reputation.json b/public/language/tr/admin/settings/reputation.json index d2eeff7b75..76f75d840e 100644 --- a/public/language/tr/admin/settings/reputation.json +++ b/public/language/tr/admin/settings/reputation.json @@ -1,6 +1,6 @@ { "reputation": "Oylama Ayarları", - "disable": "Disable Reputation System", + "disable": "Oylama Sistemini Devredışı", "disable-down-voting": "Eksi oyu devredışı bırak", "votes-are-public": "All Votes Are Public", "thresholds": "Activity Thresholds", diff --git a/public/language/tr/admin/settings/sockets.json b/public/language/tr/admin/settings/sockets.json index 38817dfed4..f0155deb5c 100644 --- a/public/language/tr/admin/settings/sockets.json +++ b/public/language/tr/admin/settings/sockets.json @@ -1,6 +1,6 @@ { "reconnection": "Tekrar Bağlantı Ayarları", - "max-attempts": "Max Reconnection Attempts", + "max-attempts": "Maks Tekrar Bağlanma Denemesi", "default-placeholder": "Varsayılan: %1", - "delay": "Reconnection Delay" + "delay": "Yeniden Bağlanma Gecikmesi" } \ No newline at end of file diff --git a/public/language/tr/admin/settings/uploads.json b/public/language/tr/admin/settings/uploads.json index 4daa55400b..b260563c77 100644 --- a/public/language/tr/admin/settings/uploads.json +++ b/public/language/tr/admin/settings/uploads.json @@ -8,19 +8,19 @@ "max-file-size-help": "(in kilobytes, default: 2048 KiB)", "allow-topic-thumbnails": "Allow users to upload topic thumbnails", "topic-thumb-size": "Topic Thumb Size", - "allowed-file-extensions": "Allowed File Extensions", + "allowed-file-extensions": "İzin Verilen Dosya Uzantıları", "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc). An empty list means all extensions are allowed.", - "profile-avatars": "Profile Avatars", + "profile-avatars": "Profil Avatarları", "allow-profile-image-uploads": "Allow users to upload profile images", "convert-profile-image-png": "Convert profile image uploads to PNG", "default-avatar": "Custom Default Avatar", "upload": "Yükle", - "profile-image-dimension": "Profile Image Dimension", - "profile-image-dimension-help": "(in pixels, default: 128 pixels)", + "profile-image-dimension": "Profil Resmi Boyutu", + "profile-image-dimension-help": "(Piksel cinsinden, varsayılan: 128 piksel)", "max-profile-image-size": "Maximum Profile Image File Size", - "max-profile-image-size-help": "(in kilobytes, default: 256 KiB)", + "max-profile-image-size-help": "(Kilobayt, varsayılan: 256 KiB)", "max-cover-image-size": "Maksimum Kapak Görseli Dosya Boyutu", - "max-cover-image-size-help": "(in kilobytes, default: 2,048 KiB)", + "max-cover-image-size-help": "(Kilobayt, varsayılan: 2,048 KiB)", "keep-all-user-images": "Keep old versions of avatars and profile covers on the server", "profile-covers": "Profil Kapakları", "default-covers": "Varsayılan Kapak Görseli", diff --git a/public/language/tr/admin/settings/user.json b/public/language/tr/admin/settings/user.json index 0aa97f45e8..d0037cf8fc 100644 --- a/public/language/tr/admin/settings/user.json +++ b/public/language/tr/admin/settings/user.json @@ -1,7 +1,7 @@ { "authentication": "Kimlik Doğrulama", - "allow-local-login": "Allow local login", - "require-email-confirmation": "Require Email Confirmation", + "allow-local-login": "Yerel girişe izin ver", + "require-email-confirmation": "E-posta Onayı Gerektirir", "email-confirm-interval": "User may not resend a confirmation email until", "email-confirm-email2": "minutes have elapsed", "allow-login-with": "Allow login with", @@ -16,7 +16,7 @@ "user-info-private": "Kullanıcı bilgilerini gizli yap", "themes": "Temalar", "disable-user-skins": "Prevent users from choosing a custom skin", - "account-protection": "Account Protection", + "account-protection": "Hesap Koruma", "login-attempts": "Login attempts per hour", "login-attempts-help": "If login attempts to a user's account exceeds this threshold, that account will be locked for a pre-configured amount of time", "lockout-duration": "Account Lockout Duration (minutes)", @@ -34,17 +34,19 @@ "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", - "min-username-length": "Minimum Username Length", - "max-username-length": "Maximum Username Length", - "min-password-length": "Minimum Password Length", - "min-password-strength": "Minimum Password Strength", - "max-about-me-length": "Maximum About Me Length", - "terms-of-use": "Forum Terms of Use (Leave blank to disable)", - "user-search": "User Search", + "invite-expiration": "Invite expiration", + "invite-expiration-help": "# of days invitations expire in.", + "min-username-length": "Minimum Kullanıcı Adı Uzunluğu", + "max-username-length": "Maksimum Kullanıcı Adı Uzunluğu", + "min-password-length": "Minimum Parola Uzunluğu", + "min-password-strength": "Minimum Parola Gücü", + "max-about-me-length": "Maksimum Hakkımda Uzunluğu", + "terms-of-use": "Forum Kullanım Şartları (Devre dışı bırakmak için boş bırakın) ", + "user-search": "Kullanıcı Ara", "user-search-results-per-page": "Number of results to display", "default-user-settings": "Default User Settings", - "show-email": "Show email", - "show-fullname": "Show fullname", + "show-email": "Email Göster", + "show-fullname": "Full Adı Göster", "restrict-chat": "Only allow chat messages from users I follow", "outgoing-new-tab": "Open outgoing links in new tab", "topic-search": "Enable In-Topic Searching", diff --git a/public/language/tr/email.json b/public/language/tr/email.json index 4cf508e292..5c1233f451 100644 --- a/public/language/tr/email.json +++ b/public/language/tr/email.json @@ -32,9 +32,9 @@ "notif.post.unsub.info": "Bu yazı bildirimi size abonelik ayarlarınız nedeni ile gönderilmiştir.", "test.text1": "Bu ileti NodeBB e-posta ayarlarınızın doğru çalışıp çalışmadığını kontrol etmek için gönderildi.", "unsub.cta": "Buraya tıklayarak ayarlarınızı değiştirebilirsiniz.", - "banned.subject": "You have been banned from %1", - "banned.text1": "The user %1 has been banned from %2.", - "banned.text2": "This ban will last until %1.", - "banned.text3": "This is the reason why you have been banned:", + "banned.subject": "%1 'den yasaklandınız", + "banned.text1": "%1 kullanıcısı %2 'den yasaklandı.", + "banned.text2": "Bu yasak %1 'e kadar sürecek.", + "banned.text3": "Yasaklanmanın nedeni:", "closing": "Teşekkürler!" } \ No newline at end of file diff --git a/public/language/tr/error.json b/public/language/tr/error.json index 16c3a33815..7ff507c2f0 100644 --- a/public/language/tr/error.json +++ b/public/language/tr/error.json @@ -1,5 +1,6 @@ { "invalid-data": "Geçersiz Veri", + "invalid-json": "Geçersiz JSON", "not-logged-in": "Giriş yapmamış görünüyorsunuz.", "account-locked": "Hesabınız geçici olarak kitlendi", "search-requires-login": "Arama hesap gerektiriyor. Lütfen giriş yapın ya da kaydolun.", @@ -12,6 +13,7 @@ "invalid-title": "Geçersiz başlık!", "invalid-user-data": "Geçersiz Kullancı Verisi", "invalid-password": "Geçersiz Şifre", + "invalid-login-credentials": "Geçersiz kimlik bilgileri", "invalid-username-or-password": "Lütfen kullanıcı ismi ve parola girin.", "invalid-search-term": "Geçersiz arama", "csrf-invalid": "Büyük olasılıkla süresi dolmuş oturum nedeniyle girişinizi geçersiz kıldık. Lütfen tekrar deneyiniz.", @@ -30,7 +32,7 @@ "password-too-long": "Parola çok uzun", "user-banned": "Kullanıcı Yasaklı", "user-banned-reason": "Maalesef, bu hesap yasaklandı (Sebep:% 1)", - "user-banned-reason-until": "Sorry, this account has been banned until %1 (Reason: %2)", + "user-banned-reason-until": "Maalesef, bu hesap %1 kadar yasaklandı (Sebep: %2)", "user-too-new": "Özür dileriz, ilk iletinizi yapmadan önce %1 saniye beklemeniz gerekiyor", "blacklisted-ip": "Üzgünüz, IP adresiniz, bu toplulukta yasaklandı. Bunun bir hata olduğunu düşünüyorsanız, bir yönetici ile irtibata geçiniz.", "ban-expiry-missing": "Bu yasak için bir bitiş tarihi girin", @@ -105,7 +107,7 @@ "chat-disabled": "Sohbet özelliği kapalı", "too-many-messages": "Ardı ardına çok fazla mesaj yolladınız, lütfen biraz bekleyiniz.", "invalid-chat-message": "Geçersiz sohbet mesajı", - "chat-message-too-long": "Chat messages can not be longer than %1 characters.", + "chat-message-too-long": "Sohbet mesajı %1 karakterden daha uzun olamaz.", "cant-edit-chat-message": "Bu mesajı düzenlemek için izin verilmez", "cant-remove-last-user": "Son kullanıcıyı silemezsiniz", "cant-delete-chat-message": "Bu mesajı silmek için izin verilmez", diff --git a/public/language/tr/flags.json b/public/language/tr/flags.json index c4bfed6f23..612ccb6500 100644 --- a/public/language/tr/flags.json +++ b/public/language/tr/flags.json @@ -1,60 +1,60 @@ { - "state": "State", - "reporter": "Reporter", - "reported-at": "Reported At", - "description": "Description", - "no-flags": "Hooray! No flags found.", - "assignee": "Assignee", - "update": "Update", - "updated": "Updated", - "target-purged": "The content this flag referred to has been purged and is no longer available.", + "state": "Bildiri", + "reporter": "Muhabir", + "reported-at": "Bildirildi", + "description": "Açıklama", + "no-flags": "Yaşasın! Bayrak bulunamadı.", + "assignee": "Vekil", + "update": "Güncelle", + "updated": "Güncellendi", + "target-purged": "İlgili bayrağın içeriği temizlendi ve artık mevcut değil.", - "quick-filters": "Quick Filters", - "filter-active": "There are one or more filters active in this list of flags", - "filter-reset": "Remove Filters", - "filters": "Filter Options", - "filter-reporterId": "Reporter UID", - "filter-targetUid": "Flagged UID", - "filter-type": "Flag Type", - "filter-type-all": "All Content", - "filter-type-post": "Post", - "filter-state": "State", - "filter-assignee": "Assignee UID", - "filter-cid": "Category", - "filter-quick-mine": "Assigned to me", - "filter-cid-all": "All categories", - "apply-filters": "Apply Filters", + "quick-filters": "Akıllı Filtre", + "filter-active": "Bayraklar listesinde etkin olan bir veya daha fazla filtre var", + "filter-reset": "Filtreleri Kaldır", + "filters": "Filtre Ayarı", + "filter-reporterId": "Muhabir UID", + "filter-targetUid": "Bayraklanan UID", + "filter-type": "Bayrak Tipi", + "filter-type-all": "Bütün İçerik", + "filter-type-post": "İleti", + "filter-state": "Bildiri", + "filter-assignee": "Vekil UID", + "filter-cid": "Kategori", + "filter-quick-mine": "Vekil atandı", + "filter-cid-all": "Bütün Kategoriler", + "apply-filters": "Filtreleri Onayla", - "quick-links": "Quick Links", - "flagged-user": "Flagged User", - "view-profile": "View Profile", - "start-new-chat": "Start New Chat", - "go-to-target": "View Flag Target", + "quick-links": "Akıllı Bağlantılar", + "flagged-user": "Bayraklanan Kullanıcı", + "view-profile": "Profili Gör", + "start-new-chat": "Yeni Sohbet Başlat", + "go-to-target": "Bayrak Hedefini Gör", - "user-view": "View Profile", - "user-edit": "Edit Profile", + "user-view": "Profili Gör", + "user-edit": "Profili Düzenle", - "notes": "Flag Notes", - "add-note": "Add Note", - "no-notes": "No shared notes.", + "notes": "Bayrak Notu", + "add-note": "Not Ekle", + "no-notes": "Not paylaşılmadı", - "history": "Flag History", - "back": "Back to Flags List", - "no-history": "No flag history.", + "history": "Bayrak Geçmişi", + "back": "Bayrak Listesine Geri Dön", + "no-history": "Bayrak geçmişi yok", - "state-all": "All states", - "state-open": "New/Open", - "state-wip": "Work in Progress", - "state-resolved": "Resolved", - "state-rejected": "Rejected", - "no-assignee": "Not Assigned", - "note-added": "Note Added", + "state-all": "Bütün Bildiriler", + "state-open": "Yeni/Açık", + "state-wip": "Yapım Aşamasında", + "state-resolved": "Çözüldü", + "state-rejected": "Reddedildi", + "no-assignee": "Atanmadı", + "note-added": "Not eklendi", - "modal-title": "Report Inappropriate Content", - "modal-body": "Please specify your reason for flagging %1 %2 for review. Alternatively, use one of the quick report buttons if applicable.", - "modal-reason-spam": "Spam", - "modal-reason-offensive": "Offensive", - "modal-reason-custom": "Reason for reporting this content...", - "modal-submit": "Submit Report", - "modal-submit-success": "Content has been flagged for moderation." + "modal-title": "Uygunsuz İçeriği Rapor Et", + "modal-body": "%1 %2 için bayraklama nedenini belirtin. Alternatif olarak hızlı rapor butonlarından birinini kullanabilirsin.", + "modal-reason-spam": "Gereksiz", + "modal-reason-offensive": "Saldırgan", + "modal-reason-custom": "Bir içeriği bildirme nedeni...", + "modal-submit": "Raporu Gönder", + "modal-submit-success": "İçerik, denetlemek için bayraklandı." } \ No newline at end of file diff --git a/public/language/tr/modules.json b/public/language/tr/modules.json index a96b07be46..0ec408ba31 100644 --- a/public/language/tr/modules.json +++ b/public/language/tr/modules.json @@ -20,7 +20,7 @@ "chat.three_months": "3 Ay", "chat.delete_message_confirm": "Bu mesajı silmek istediğinden emin misin?", "chat.add-users-to-room": "Odaya Kullanıcı Ekle", - "chat.confirm-chat-with-dnd-user": "This user has set their status to DnD(Do not disturb). Do you still want to chat with them?", + "chat.confirm-chat-with-dnd-user": "Bu kullanıcı durumunu rahatsız etmeyin olarak ayarladı. Hala onunla sohbet etmek istiyor musun?", "composer.compose": "Yaz", "composer.show_preview": "Önizleme Göster", "composer.hide_preview": "Önizleme Sakla", diff --git a/public/language/tr/notifications.json b/public/language/tr/notifications.json index b4e317f224..dce29e6f2b 100644 --- a/public/language/tr/notifications.json +++ b/public/language/tr/notifications.json @@ -40,7 +40,7 @@ "user_started_following_you_multiple": "%1 ve %2 kişi daha seni takip etmeye başladı.", "new_register": "%1 kayıt olma isteği gönderdi.", "new_register_multiple": "Beklemede %1 kayıt olma isteği bulunmaktadır.", - "flag_assigned_to_you": "Flag %1 has been assigned to you", + "flag_assigned_to_you": "Bayrak %1 size devredildi", "email-confirmed": "E-posta onaylandı", "email-confirmed-message": "E-postanızı onaylandığınız için teşekkürler. Hesabınız tamamen aktive edildi.", "email-confirm-error-message": "E-posta adresinizi onaylarken bir hata oluştu. Kodunuz geçersiz ya da eski olabilir.", diff --git a/public/language/tr/topic.json b/public/language/tr/topic.json index ad57a76331..770dd68107 100644 --- a/public/language/tr/topic.json +++ b/public/language/tr/topic.json @@ -14,6 +14,7 @@ "quote": "Alıntı", "reply": "Cevap", "replies_to_this_post": "%1 Cevap", + "one_reply_to_this_post": "1 Cevap", "last_reply_time": "Son cevap", "reply-as-topic": "İletiye Cevap Ver", "guest-login-reply": "Cevaplamak için giriş yapın", diff --git a/public/language/uk/admin/advanced/database.json b/public/language/uk/admin/advanced/database.json index 66b2956c90..3c4dc1cd6f 100644 --- a/public/language/uk/admin/advanced/database.json +++ b/public/language/uk/admin/advanced/database.json @@ -1,7 +1,7 @@ { "x-b": "%1 б", "x-mb": "%1 мб", - "x-gb": "%1 gb", + "x-gb": "%1 ГБ", "uptime-seconds": "Uptime в секундах", "uptime-days": "Uptime в днях", diff --git a/public/language/uk/admin/appearance/customise.json b/public/language/uk/admin/appearance/customise.json index e14527f2b6..57d0599759 100644 --- a/public/language/uk/admin/appearance/customise.json +++ b/public/language/uk/admin/appearance/customise.json @@ -5,5 +5,8 @@ "custom-header": "Користувацький заголовок", "custom-header.description": "Уведіть власний HTML (JavaScript, мета теги, тощо), що буде додано до секції <head> вашого форуму.", - "custom-header.enable": "Увімкнути користувацький заголовок" + "custom-header.enable": "Увімкнути користувацький заголовок", + + "custom-css.livereload": "Enable Live Reload", + "custom-css.livereload.description": "Enable this to force all sessions on every device under your account to refresh whenever you click save" } \ No newline at end of file diff --git a/public/language/uk/admin/development/info.json b/public/language/uk/admin/development/info.json index e70699c869..6830b7bed0 100644 --- a/public/language/uk/admin/development/info.json +++ b/public/language/uk/admin/development/info.json @@ -1,10 +1,12 @@ { "you-are-on": "Інформація - Ви знаходитесь на %1:%2", + "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", "pid": "pid", "nodejs": "nodejs", "online": "online", "git": "git", + "memory": "memory", "load": "load", "uptime": "uptime", diff --git a/public/language/uk/admin/general/dashboard.json b/public/language/uk/admin/general/dashboard.json index a53c7f5ba9..9e90a211ea 100644 --- a/public/language/uk/admin/general/dashboard.json +++ b/public/language/uk/admin/general/dashboard.json @@ -5,9 +5,14 @@ "users": "Користувачі", "posts": "Пости", "topics": "Теми", - "page-views-last-month": "Переглядів останнього місяця", - "page-views-this-month": "Переглядів цього місяця", - "page-views-last-day": "Переглядів за останні 24 години", + "page-views-seven": "Останні 7 Днів", + "page-views-thirty": "Останні 30 Днів", + "page-views-last-day": "Останні 24 Години", + "page-views-custom": "Заданий Період", + "page-views-custom-start": "Початок Періоду", + "page-views-custom-end": "Кінець Періоду", + "page-views-custom-help": "Вкажіть календарний період, за який ви хочете побачити переглянуті сторінки. Якщо ви не можете використати селектор дат, допустимий формат дати YYYY-MM-DD", + "page-views-custom-error": "Будь-ласка вкажіть календарний період у форматі YYYY-MM-DD", "stats.day": "День", "stats.week": "Тиждень", diff --git a/public/language/uk/admin/general/languages.json b/public/language/uk/admin/general/languages.json index 4db88abb21..61f8e39b73 100644 --- a/public/language/uk/admin/general/languages.json +++ b/public/language/uk/admin/general/languages.json @@ -1,5 +1,6 @@ { "language-settings": "Налаштування мов", "description": "Мова за замовчуванням задає мову для всіх користувачів, що відвідують форум.
Кожен користувач може перевизначити мову в своїх налаштуваннях акаунта.", - "default-language": "Мова за замовчуванням" + "default-language": "Мова за замовчуванням", + "auto-detect": "Auto Detect Language Setting for Guests" } \ No newline at end of file diff --git a/public/language/uk/admin/manage/groups.json b/public/language/uk/admin/manage/groups.json index 9758b901c8..d3b65abb46 100644 --- a/public/language/uk/admin/manage/groups.json +++ b/public/language/uk/admin/manage/groups.json @@ -1,7 +1,7 @@ { "name": "Назва групи", "description": "Опис групи", - "member-count": "Member Count", + "member-count": "Кількість Учасників", "system": "Системна група", "edit": "Редагувати", "search-placeholder": "Пошук", diff --git a/public/language/uk/admin/manage/users.json b/public/language/uk/admin/manage/users.json index 9de068acca..e8559022b6 100644 --- a/public/language/uk/admin/manage/users.json +++ b/public/language/uk/admin/manage/users.json @@ -18,7 +18,7 @@ "new": "Новий користувач", "pills.latest": "Останні користувачі", - "pills.unvalidated": "Не підтвердженні", + "pills.unvalidated": "Не підтверджені", "pills.no-posts": "Без постів", "pills.top-posters": "Кращі автори", "pills.top-rep": "Найбільша репутація", diff --git a/public/language/uk/admin/settings/advanced.json b/public/language/uk/admin/settings/advanced.json index 4f96f25c9b..e858adf80d 100644 --- a/public/language/uk/admin/settings/advanced.json +++ b/public/language/uk/admin/settings/advanced.json @@ -6,7 +6,7 @@ "headers.allow-from": "Задати ALLOW-FROM для розміщення NodeBB в iFrame", "headers.powered-by": "Налаштувати заголовок \"Powered By\", котрий відправляє NodeBB", "headers.acao": "Access-Control-Allow-Origin", - "headers.acao-help": "To deny access to all sites, leave empty", + "headers.acao-help": "Щоб заборонити доступ до всіх сайтів, залиште незаповненим", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", "traffic-management": "Керування трафіком", diff --git a/public/language/uk/admin/settings/post.json b/public/language/uk/admin/settings/post.json index ea770e1463..0be4036412 100644 --- a/public/language/uk/admin/settings/post.json +++ b/public/language/uk/admin/settings/post.json @@ -29,8 +29,8 @@ "unread": "Налаштування непрочитаних", "unread.cutoff": "За скільки днів показувати непрочитані", "unread.min-track-last": "Мінімальна кількість постів у темі перш ніж відслідковувати останні прочитані", - "recent": "Recent Settings", - "recent.categoryFilter.disable": "Disable filtering of topics in ignored categories on the /recent page", + "recent": "Останні Налаштування", + "recent.categoryFilter.disable": "Відключити фільтрування тем в ігнорованих категоріях на сторінці /recent", "signature": "Налаштування підписів", "signature.disable": "Вимкнути підписи", "signature.no-links": "Вимкнути посилання в підписах", diff --git a/public/language/uk/admin/settings/user.json b/public/language/uk/admin/settings/user.json index dc463f9ecd..83753d78f3 100644 --- a/public/language/uk/admin/settings/user.json +++ b/public/language/uk/admin/settings/user.json @@ -34,10 +34,12 @@ "registration.max-invites": "Кількість запрошень на користувача", "max-invites": "Кількість запрошень на користувача", "max-invites-help": "0 — без обмежень. Адміни отримуют необмежену кількість.
Працює лише з типом реєстрації \"По запрошенню\".", + "invite-expiration": "Invite expiration", + "invite-expiration-help": "# of days invitations expire in.", "min-username-length": "Мінімальна довжина імені користувача", "max-username-length": "Максимальна довжина імені користувача", "min-password-length": "Мінімальна довжина пароля", - "min-password-strength": "Minimum Password Strength", + "min-password-strength": "Мінімальна Довжина Паролю", "max-about-me-length": "Максимальна довжина розділу \"Про мене\"", "terms-of-use": "Умови користування форумом (Залиште пустим, щоб вимкнути)", "user-search": "Пошук користувачів", diff --git a/public/language/uk/email.json b/public/language/uk/email.json index 236a1f3978..eddbf7c236 100644 --- a/public/language/uk/email.json +++ b/public/language/uk/email.json @@ -32,9 +32,9 @@ "notif.post.unsub.info": "Це поштове повідомлення було вислано вам, згідно ваших налаштувань підписки", "test.text1": "Це пробний лист для верифікації поштової служби. Всі налаштування вірні для NodeBB.", "unsub.cta": "Натисніть тут, щоб змінити ці налаштування", - "banned.subject": "You have been banned from %1", - "banned.text1": "The user %1 has been banned from %2.", - "banned.text2": "This ban will last until %1.", - "banned.text3": "This is the reason why you have been banned:", + "banned.subject": "Ви були забанені на %1", + "banned.text1": "Користувач %1 був забанений на %2.", + "banned.text2": "Тривалість бану - до %1.", + "banned.text3": "Це причина, чому ви були забанені:", "closing": "Дякуємо!" } \ No newline at end of file diff --git a/public/language/uk/error.json b/public/language/uk/error.json index 2cc9650c8e..cdffc47872 100644 --- a/public/language/uk/error.json +++ b/public/language/uk/error.json @@ -1,5 +1,6 @@ { "invalid-data": "Невірні дані", + "invalid-json": "Invalid JSON", "not-logged-in": "Не схоже, що ви увійшли в систему.", "account-locked": "Ваш акаунт тимчасово заблоковано", "search-requires-login": "Для пошуку потрібен акаунт — будь ласка, увійдіть чи зареєструйтесь.", @@ -12,6 +13,7 @@ "invalid-title": "Невірний заголовок!", "invalid-user-data": "Невірні користувацькі дані", "invalid-password": "Невірний пароль", + "invalid-login-credentials": "Invalid login credentials", "invalid-username-or-password": "Вкажіть, будь ласка, ім'я користувача та пароль", "invalid-search-term": "Невірний пошуковий запит", "csrf-invalid": "Нам не вдалося вас пустити, ймовірно, через прострочену сесію. Будь ласка, спробуйте ще раз", @@ -30,7 +32,7 @@ "password-too-long": "Пароль задовгий", "user-banned": "Користувача забанено", "user-banned-reason": "Вибачте, але цей акаунт було забанено (Причина: %1)", - "user-banned-reason-until": "Sorry, this account has been banned until %1 (Reason: %2)", + "user-banned-reason-until": "Вибачте, цей акаунт забанений до %1 (Причина: %2)", "user-too-new": "Вибачте, але вам необхідно зачекати %1 секунд(и), перед першим постом", "blacklisted-ip": "Вибачте, але ваша IP-адреса була забанена в цій спільноті. Якщо ви гадаєте, що це сталось помилково, зв'яжіться з адміністратором.", "ban-expiry-missing": "Вкажіть, будь ласка, кінцеву дату бану", @@ -105,7 +107,7 @@ "chat-disabled": "Чат вимкнено", "too-many-messages": "Ви надіслали забагато повідомлень, зачекайте трішки.", "invalid-chat-message": "Невірне повідомлення чату", - "chat-message-too-long": "Chat messages can not be longer than %1 characters.", + "chat-message-too-long": "Повідомлення чату не можуть бути довшими за %1 символів.", "cant-edit-chat-message": "Ви не можете редагувати повідомлення", "cant-remove-last-user": "Ви не можете видалити останнього користувача", "cant-delete-chat-message": "Ви не можете видалити це повідомлення", diff --git a/public/language/uk/modules.json b/public/language/uk/modules.json index 6cb7697cc5..ef440ec8ff 100644 --- a/public/language/uk/modules.json +++ b/public/language/uk/modules.json @@ -20,7 +20,7 @@ "chat.three_months": "3 місяці", "chat.delete_message_confirm": "Ви впевнені, що хочете видалити це повідомлення?", "chat.add-users-to-room": "Додати користувачів до кімнати", - "chat.confirm-chat-with-dnd-user": "This user has set their status to DnD(Do not disturb). Do you still want to chat with them?", + "chat.confirm-chat-with-dnd-user": "Користувач змінив свій статус на DnD (Не турбувати). Ви дійсно бажаєте надіслати йому повідомлення в чат?", "composer.compose": "Редактор повідомлень", "composer.show_preview": "Показати попередній перегляд", "composer.hide_preview": "Сховати попередній перегляд", diff --git a/public/language/uk/topic.json b/public/language/uk/topic.json index 111efb25d9..ad17502811 100644 --- a/public/language/uk/topic.json +++ b/public/language/uk/topic.json @@ -14,6 +14,7 @@ "quote": "Цитувати", "reply": "Відповісти", "replies_to_this_post": "%1 відповідей", + "one_reply_to_this_post": "1 Reply", "last_reply_time": "Остання відповідь", "reply-as-topic": "Відповісти темою", "guest-login-reply": "Увійти для відповіді", @@ -30,7 +31,7 @@ "pinned": "Закріплена", "moved": "Переміщена", "bookmark_instructions": "Натисніть тут, щоб повернутися до останнього прочитаного посту у цій темі.", - "flag_title": "Поскаржитись цей пост модератору", + "flag_title": "Поскаржитись на цей пост модератору", "deleted_message": "Цю тему було видалено. Лише користувачі з правом керування темами можуть її бачити.", "following_topic.message": "Відтепер ви будете отримувати сповіщення коли хтось постить в цю тему.", "not_following_topic.message": "Ви будете бачити цю тему в списку непрочитаних, але ви не будете отримувати сповіщень, коли хтось постить до неї.", diff --git a/public/language/uk/user.json b/public/language/uk/user.json index 0d5e93857f..20d3dfe51f 100644 --- a/public/language/uk/user.json +++ b/public/language/uk/user.json @@ -60,7 +60,7 @@ "username_taken_workaround": "Ім'я користувача, що ви обрали, вже було зайняте, то ж ми його трішки змінили. Ви тепер відомі як %1", "password_same_as_username": "Ваш пароль співпадає з іменем користувача. Оберіть інший пароль, будь ласка.", "password_same_as_email": "Ваш пароль співпадає з електронною поштою. Оберіть інший пароль, будь ласка.", - "weak_password": "Weak password.", + "weak_password": "Слабкий пароль", "upload_picture": "Завантажити зображення", "upload_a_picture": "Завантажити зображення", "remove_uploaded_picture": "Видалити завантажене зображення", diff --git a/public/language/vi/admin/appearance/customise.json b/public/language/vi/admin/appearance/customise.json index 767d443e29..5095f7a937 100644 --- a/public/language/vi/admin/appearance/customise.json +++ b/public/language/vi/admin/appearance/customise.json @@ -5,5 +5,8 @@ "custom-header": "Custom Header", "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", - "custom-header.enable": "Enable Custom Header" + "custom-header.enable": "Enable Custom Header", + + "custom-css.livereload": "Enable Live Reload", + "custom-css.livereload.description": "Enable this to force all sessions on every device under your account to refresh whenever you click save" } \ No newline at end of file diff --git a/public/language/vi/admin/development/info.json b/public/language/vi/admin/development/info.json index b2768ca212..0a4ae6fe2c 100644 --- a/public/language/vi/admin/development/info.json +++ b/public/language/vi/admin/development/info.json @@ -1,10 +1,12 @@ { "you-are-on": "Info - You are on %1:%2", + "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", "pid": "pid", "nodejs": "nodejs", "online": "online", "git": "git", + "memory": "memory", "load": "load", "uptime": "uptime", diff --git a/public/language/vi/admin/general/dashboard.json b/public/language/vi/admin/general/dashboard.json index 02046bd17a..61f4421fb5 100644 --- a/public/language/vi/admin/general/dashboard.json +++ b/public/language/vi/admin/general/dashboard.json @@ -5,9 +5,14 @@ "users": "Users", "posts": "Posts", "topics": "Topics", - "page-views-last-month": "Page views Last Month", - "page-views-this-month": "Page views This Month", - "page-views-last-day": "Page views in last 24 hours", + "page-views-seven": "Last 7 Days", + "page-views-thirty": "Last 30 Days", + "page-views-last-day": "Last 24 hours", + "page-views-custom": "Custom Date Range", + "page-views-custom-start": "Range Start", + "page-views-custom-end": "Range End", + "page-views-custom-help": "Enter a date range of page views you would like to view. If no date picker is available, the accepted format is YYYY-MM-DD", + "page-views-custom-error": "Please enter a valid date range in the format YYYY-MM-DD", "stats.day": "Day", "stats.week": "Week", diff --git a/public/language/vi/admin/general/languages.json b/public/language/vi/admin/general/languages.json index da45cade2c..bdd57849b3 100644 --- a/public/language/vi/admin/general/languages.json +++ b/public/language/vi/admin/general/languages.json @@ -1,5 +1,6 @@ { "language-settings": "Language Settings", "description": "The default language determines the language settings for all users who are visiting your forum.
Individual users can override the default language on their account settings page.", - "default-language": "Default Language" + "default-language": "Default Language", + "auto-detect": "Auto Detect Language Setting for Guests" } \ No newline at end of file diff --git a/public/language/vi/admin/settings/user.json b/public/language/vi/admin/settings/user.json index b8f51c9288..fa8049c3a9 100644 --- a/public/language/vi/admin/settings/user.json +++ b/public/language/vi/admin/settings/user.json @@ -34,6 +34,8 @@ "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", + "invite-expiration": "Invite expiration", + "invite-expiration-help": "# of days invitations expire in.", "min-username-length": "Minimum Username Length", "max-username-length": "Maximum Username Length", "min-password-length": "Minimum Password Length", diff --git a/public/language/vi/error.json b/public/language/vi/error.json index a833820d5c..1d4265594e 100644 --- a/public/language/vi/error.json +++ b/public/language/vi/error.json @@ -1,5 +1,6 @@ { "invalid-data": "Dữ liệu không hợp lệ", + "invalid-json": "Invalid JSON", "not-logged-in": "Có vẻ bạn chưa đăng nhập.", "account-locked": "Tài khoản của bạn đang tạm thời bị khóa", "search-requires-login": "Bạn cần phải có tài khoản để tìm kiếm - vui lòng đăng nhập hoặc đăng ký.", @@ -12,6 +13,7 @@ "invalid-title": "Tiêu đề không hợp lệ!", "invalid-user-data": "Dữ liệu tài khoản không hợp lệ", "invalid-password": "Mật khẩu không hợp lệ", + "invalid-login-credentials": "Invalid login credentials", "invalid-username-or-password": "Xin hãy nhập cả tên đăng nhập và mật khẩu", "invalid-search-term": "Từ khóa không hợp lệ", "csrf-invalid": "Hệ thống không cho phép bạn đăng nhập, có vẻ như phiên đăng nhập cũ đã hết hạn. Hãy thử đăng nhập lại", diff --git a/public/language/vi/topic.json b/public/language/vi/topic.json index 5c1cd238c7..899685fe0c 100644 --- a/public/language/vi/topic.json +++ b/public/language/vi/topic.json @@ -14,6 +14,7 @@ "quote": "Trích dẫn", "reply": "Trả lời", "replies_to_this_post": "%1 trả lời", + "one_reply_to_this_post": "1 Reply", "last_reply_time": "Trả lời cuối cùng", "reply-as-topic": "Trả lời dưới dạng chủ đề", "guest-login-reply": "Hãy đăng nhập để trả lời", diff --git a/public/language/zh-CN/admin/appearance/customise.json b/public/language/zh-CN/admin/appearance/customise.json index e609257a2f..c332dd4249 100644 --- a/public/language/zh-CN/admin/appearance/customise.json +++ b/public/language/zh-CN/admin/appearance/customise.json @@ -5,5 +5,8 @@ "custom-header": "自定义 Header", "custom-header.description": "请输入自定义的 HTML 代码 (如 JavaScript,Meta Tags 等),这些代码会被添加到论坛的 <head> 部分。", - "custom-header.enable": "启用自定义 Header" + "custom-header.enable": "启用自定义 Header", + + "custom-css.livereload": "Enable Live Reload", + "custom-css.livereload.description": "Enable this to force all sessions on every device under your account to refresh whenever you click save" } \ No newline at end of file diff --git a/public/language/zh-CN/admin/development/info.json b/public/language/zh-CN/admin/development/info.json index 0eba4d219c..81708963ce 100644 --- a/public/language/zh-CN/admin/development/info.json +++ b/public/language/zh-CN/admin/development/info.json @@ -1,10 +1,12 @@ { "you-are-on": "信息 - 你正在 %1:%2 上", + "nodes-responded": "%1 nodes responded within %2ms!", "host": "主机", "pid": "pid", "nodejs": "nodejs", "online": "在线", "git": "git", + "memory": "memory", "load": "载入", "uptime": "正常运行时间", diff --git a/public/language/zh-CN/admin/general/dashboard.json b/public/language/zh-CN/admin/general/dashboard.json index 9a17c65e68..b99b3b2bcf 100644 --- a/public/language/zh-CN/admin/general/dashboard.json +++ b/public/language/zh-CN/admin/general/dashboard.json @@ -5,9 +5,14 @@ "users": "用户", "posts": "发帖", "topics": "主题", - "page-views-last-month": "上个月 PV 数量", - "page-views-this-month": "本月 PV 数量", - "page-views-last-day": "过去24小时 PV 数量", + "page-views-seven": "Last 7 Days", + "page-views-thirty": "Last 30 Days", + "page-views-last-day": "Last 24 hours", + "page-views-custom": "Custom Date Range", + "page-views-custom-start": "Range Start", + "page-views-custom-end": "Range End", + "page-views-custom-help": "Enter a date range of page views you would like to view. If no date picker is available, the accepted format is YYYY-MM-DD", + "page-views-custom-error": "Please enter a valid date range in the format YYYY-MM-DD", "stats.day": "日", "stats.week": "周", diff --git a/public/language/zh-CN/admin/general/languages.json b/public/language/zh-CN/admin/general/languages.json index f7cff12294..d145c2c427 100644 --- a/public/language/zh-CN/admin/general/languages.json +++ b/public/language/zh-CN/admin/general/languages.json @@ -1,5 +1,6 @@ { "language-settings": "语言设置", "description": "默认语言会决定所有用户的语言设定。
单一用户可以各自在帐户设置中覆盖此项设定。", - "default-language": "默认语言" + "default-language": "默认语言", + "auto-detect": "Auto Detect Language Setting for Guests" } \ No newline at end of file diff --git a/public/language/zh-CN/admin/settings/user.json b/public/language/zh-CN/admin/settings/user.json index d147da2ccc..8afc431b07 100644 --- a/public/language/zh-CN/admin/settings/user.json +++ b/public/language/zh-CN/admin/settings/user.json @@ -34,6 +34,8 @@ "registration.max-invites": "每个用户最大邀请数", "max-invites": "每个用户最大邀请数", "max-invites-help": "无限制填 0 。管理员没有邀请限制
仅在邀请制时可用", + "invite-expiration": "Invite expiration", + "invite-expiration-help": "# of days invitations expire in.", "min-username-length": "最小用户名长度", "max-username-length": "最大用户名长度", "min-password-length": "最小密码长度", diff --git a/public/language/zh-CN/error.json b/public/language/zh-CN/error.json index 89f130c7ff..4d438d1927 100644 --- a/public/language/zh-CN/error.json +++ b/public/language/zh-CN/error.json @@ -1,5 +1,6 @@ { "invalid-data": "无效数据", + "invalid-json": "Invalid JSON", "not-logged-in": "您还没有登录。", "account-locked": "您的帐号已被临时锁定", "search-requires-login": "搜索功能仅限会员使用 - 请先登录或者注册。", @@ -12,6 +13,7 @@ "invalid-title": "无效标题!", "invalid-user-data": "无效用户数据", "invalid-password": "无效密码", + "invalid-login-credentials": "Invalid login credentials", "invalid-username-or-password": "请确认用户名和密码", "invalid-search-term": "无效的搜索关键字", "csrf-invalid": "可能是由于会话过期,登录失败。请重试。", diff --git a/public/language/zh-CN/flags.json b/public/language/zh-CN/flags.json index c4bfed6f23..189330bdfd 100644 --- a/public/language/zh-CN/flags.json +++ b/public/language/zh-CN/flags.json @@ -1,60 +1,60 @@ { - "state": "State", - "reporter": "Reporter", - "reported-at": "Reported At", - "description": "Description", - "no-flags": "Hooray! No flags found.", - "assignee": "Assignee", - "update": "Update", - "updated": "Updated", - "target-purged": "The content this flag referred to has been purged and is no longer available.", + "state": "状态", + "reporter": "举报人", + "reported-at": "举报于", + "description": "描述", + "no-flags": "啊哈!没发现任何的举报。", + "assignee": "受委托人", + "update": "更新", + "updated": "已更新", + "target-purged": "被举报的内容已经被清除,不再可用。", - "quick-filters": "Quick Filters", - "filter-active": "There are one or more filters active in this list of flags", - "filter-reset": "Remove Filters", - "filters": "Filter Options", - "filter-reporterId": "Reporter UID", - "filter-targetUid": "Flagged UID", - "filter-type": "Flag Type", - "filter-type-all": "All Content", - "filter-type-post": "Post", - "filter-state": "State", - "filter-assignee": "Assignee UID", - "filter-cid": "Category", - "filter-quick-mine": "Assigned to me", - "filter-cid-all": "All categories", - "apply-filters": "Apply Filters", + "quick-filters": "快速过滤器", + "filter-active": "该列中有一个或更多激活的过滤器", + "filter-reset": "删除过滤器", + "filters": "过滤器选项", + "filter-reporterId": "举报者UID", + "filter-targetUid": "被举报者 UID", + "filter-type": "举报类型", + "filter-type-all": "所有内容", + "filter-type-post": "帖子", + "filter-state": "状态", + "filter-assignee": "受委托人 UID", + "filter-cid": "版块", + "filter-quick-mine": "委托给我", + "filter-cid-all": "全部版块", + "apply-filters": "应用过滤器", - "quick-links": "Quick Links", - "flagged-user": "Flagged User", - "view-profile": "View Profile", - "start-new-chat": "Start New Chat", - "go-to-target": "View Flag Target", + "quick-links": "快速链接", + "flagged-user": "被举报的用户", + "view-profile": "查看个人资料", + "start-new-chat": "开始新会话", + "go-to-target": "查看举报目标", - "user-view": "View Profile", - "user-edit": "Edit Profile", + "user-view": "查看资料", + "user-edit": "编辑资料", - "notes": "Flag Notes", - "add-note": "Add Note", - "no-notes": "No shared notes.", + "notes": "举报备注", + "add-note": "添加备注", + "no-notes": "没有共享的备注内容。", - "history": "Flag History", - "back": "Back to Flags List", - "no-history": "No flag history.", + "history": "举报历史", + "back": "返回举报列表", + "no-history": "没有举报历史。", - "state-all": "All states", - "state-open": "New/Open", - "state-wip": "Work in Progress", - "state-resolved": "Resolved", - "state-rejected": "Rejected", - "no-assignee": "Not Assigned", - "note-added": "Note Added", + "state-all": "所有状态", + "state-open": "新建/打开", + "state-wip": "正在处理", + "state-resolved": "已解决", + "state-rejected": "已拒绝", + "no-assignee": "未指派", + "note-added": "备注已添加", - "modal-title": "Report Inappropriate Content", - "modal-body": "Please specify your reason for flagging %1 %2 for review. Alternatively, use one of the quick report buttons if applicable.", - "modal-reason-spam": "Spam", - "modal-reason-offensive": "Offensive", - "modal-reason-custom": "Reason for reporting this content...", - "modal-submit": "Submit Report", - "modal-submit-success": "Content has been flagged for moderation." + "modal-title": "举报不适内容", + "modal-body": "请选择或者输入您举报 %1%2 的原因以便版主进行审核。", + "modal-reason-spam": "垃圾信息", + "modal-reason-offensive": "人身攻击", + "modal-reason-custom": "举报此内容的理由……", + "modal-submit": "提交举报", + "modal-submit-success": "已举报此内容。" } \ No newline at end of file diff --git a/public/language/zh-CN/topic.json b/public/language/zh-CN/topic.json index cbd70048ef..f1448d4bd0 100644 --- a/public/language/zh-CN/topic.json +++ b/public/language/zh-CN/topic.json @@ -14,6 +14,7 @@ "quote": "引用", "reply": "回复", "replies_to_this_post": "回复 %1", + "one_reply_to_this_post": "1 Reply", "last_reply_time": "最后回复", "reply-as-topic": "在新帖中回复", "guest-login-reply": "登录后回复", diff --git a/public/language/zh-TW/admin/appearance/customise.json b/public/language/zh-TW/admin/appearance/customise.json index 767d443e29..5095f7a937 100644 --- a/public/language/zh-TW/admin/appearance/customise.json +++ b/public/language/zh-TW/admin/appearance/customise.json @@ -5,5 +5,8 @@ "custom-header": "Custom Header", "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", - "custom-header.enable": "Enable Custom Header" + "custom-header.enable": "Enable Custom Header", + + "custom-css.livereload": "Enable Live Reload", + "custom-css.livereload.description": "Enable this to force all sessions on every device under your account to refresh whenever you click save" } \ No newline at end of file diff --git a/public/language/zh-TW/admin/appearance/themes.json b/public/language/zh-TW/admin/appearance/themes.json index 3148a01337..6a3008132b 100644 --- a/public/language/zh-TW/admin/appearance/themes.json +++ b/public/language/zh-TW/admin/appearance/themes.json @@ -1,11 +1,11 @@ { - "checking-for-installed": "Checking for installed themes...", - "homepage": "Homepage", - "select-theme": "Select Theme", - "current-theme": "Current Theme", - "no-themes": "No installed themes found", - "revert-confirm": "Are you sure you wish to restore the default NodeBB theme?", - "theme-changed": "Theme Changed", - "revert-success": "You have successfully reverted your NodeBB back to it's default theme.", - "restart-to-activate": "Please restart your NodeBB to fully activate this theme" + "checking-for-installed": "正在載入已安裝的主題...", + "homepage": "首頁", + "select-theme": "選擇主題", + "current-theme": "目前的主題", + "no-themes": "沒有找到任何已安裝的主題", + "revert-confirm": "你確定要回復預設的主題嗎?", + "theme-changed": "主題已更換", + "revert-success": "已經成功回復為預設主題。", + "restart-to-activate": "請重新啟動你的NodeBB以啟動主題。" } \ No newline at end of file diff --git a/public/language/zh-TW/admin/development/info.json b/public/language/zh-TW/admin/development/info.json index b2768ca212..0a4ae6fe2c 100644 --- a/public/language/zh-TW/admin/development/info.json +++ b/public/language/zh-TW/admin/development/info.json @@ -1,10 +1,12 @@ { "you-are-on": "Info - You are on %1:%2", + "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", "pid": "pid", "nodejs": "nodejs", "online": "online", "git": "git", + "memory": "memory", "load": "load", "uptime": "uptime", diff --git a/public/language/zh-TW/admin/extend/plugins.json b/public/language/zh-TW/admin/extend/plugins.json index 1661a987b7..cb19a6761d 100644 --- a/public/language/zh-TW/admin/extend/plugins.json +++ b/public/language/zh-TW/admin/extend/plugins.json @@ -1,45 +1,45 @@ { - "installed": "Installed", - "active": "Active", - "inactive": "Inactive", - "out-of-date": "Out of Date", - "none-found": "No plugins found.", - "none-active": "No Active Plugins", - "find-plugins": "Find Plugins", + "installed": "已安裝", + "active": "已啟用", + "inactive": "未啟用", + "out-of-date": "需要更新", + "none-found": "沒有找到外掛。", + "none-active": "沒有啟用中的外掛。", + "find-plugins": "搜尋外掛", - "plugin-search": "Plugin Search", - "plugin-search-placeholder": "Search for plugin...", - "reorder-plugins": "Re-order Plugins", - "order-active": "Order Active Plugins", - "dev-interested": "Interested in writing plugins for NodeBB?", + "plugin-search": "搜尋外掛", + "plugin-search-placeholder": "搜尋想找的外掛...", + "reorder-plugins": "重新排序", + "order-active": "排序已啟用的外掛", + "dev-interested": "對開發NodeBB的外掛有興趣嗎?", "docs-info": "Full documentation regarding plugin authoring can be found in the NodeBB Docs Portal.", "order.description": "Certain plugins work ideally when they are initialised before/after other plugins.", "order.explanation": "Plugins load in the order specified here, from top to bottom", - "plugin-item.themes": "Themes", - "plugin-item.deactivate": "Deactivate", - "plugin-item.activate": "Activate", - "plugin-item.install": "Install", - "plugin-item.uninstall": "Uninstall", - "plugin-item.settings": "Settings", - "plugin-item.installed": "Installed", - "plugin-item.latest": "Latest", - "plugin-item.upgrade": "Upgrade", - "plugin-item.more-info": "For more information:", - "plugin-item.unknown": "Unknown", - "plugin-item.unknown-explanation": "The state of this plugin could not be determined, possibly due to a misconfiguration error.", + "plugin-item.themes": "佈景主題", + "plugin-item.deactivate": "停用", + "plugin-item.activate": "啟用", + "plugin-item.install": "安裝", + "plugin-item.uninstall": "解除安裝", + "plugin-item.settings": "設定", + "plugin-item.installed": "已安裝", + "plugin-item.latest": "最新", + "plugin-item.upgrade": "升級", + "plugin-item.more-info": "更多資訊:", + "plugin-item.unknown": "未知", + "plugin-item.unknown-explanation": "無法取得此外掛的狀態,可能是由於設置錯誤。", - "alert.enabled": "Plugin Enabled", - "alert.disabled": "Plugin Disabled", - "alert.upgraded": "Plugin Upgraded", - "alert.installed": "Plugin Installed", - "alert.uninstalled": "Plugin Uninstalled", - "alert.activate-success": "Please restart your NodeBB to fully activate this plugin", - "alert.deactivate-success": "Plugin successfully deactivated", - "alert.upgrade-success": "Please reload your NodeBB to fully upgrade this plugin", - "alert.install-success": "Plugin successfully installed, please activate the plugin.", - "alert.uninstall-success": "The plugin has been successfully deactivated and uninstalled.", + "alert.enabled": "外掛已啟用", + "alert.disabled": "外掛已停用", + "alert.upgraded": "外掛已升級", + "alert.installed": "外掛已安裝", + "alert.uninstalled": "外掛已移除", + "alert.activate-success": "請重新啟動你的NodeBB來完成外掛的啟用", + "alert.deactivate-success": "外掛已成功停用", + "alert.upgrade-success": "請重新載入你的NodeBB來完成外掛的升級", + "alert.install-success": "外掛已成功安裝,請啟用外掛。", + "alert.uninstall-success": "外掛已成功停用並且移除。", "alert.suggest-error": "

NodeBB could not reach the package manager, proceed with installation of latest version?

Server returned (%1): %2
", "alert.package-manager-unreachable": "

NodeBB could not reach the package manager, an upgrade is not suggested at this time.

", "alert.incompatible": "

Your version of NodeBB (v%1) is only cleared to upgrade to v%2 of this plugin. Please update your NodeBB if you wish to install a newer version of this plugin.

", diff --git a/public/language/zh-TW/admin/extend/rewards.json b/public/language/zh-TW/admin/extend/rewards.json index 5383a90b33..eb554e441c 100644 --- a/public/language/zh-TW/admin/extend/rewards.json +++ b/public/language/zh-TW/admin/extend/rewards.json @@ -1,15 +1,15 @@ { - "rewards": "Rewards", - "condition-if-users": "If User's", - "condition-is": "Is:", - "condition-then": "Then:", - "max-claims": "Amount of times reward is claimable", - "zero-infinite": "Enter 0 for infinite", - "delete": "Delete", - "enable": "Enable", - "disable": "Disable", - "control-panel": "Rewards Control", - "new-reward": "New Reward", + "rewards": "獎勵", + "condition-if-users": "若用戶的", + "condition-is": "為:", + "condition-then": "那麼:", + "max-claims": "獎勵可以領取的次數", + "zero-infinite": "輸入 0 表示不限", + "delete": "刪除", + "enable": "啟用", + "disable": "停用", + "control-panel": "獎勵設定", + "new-reward": "新的獎勵", "alert.delete-success": "Successfully deleted reward", "alert.no-inputs-found": "Illegal reward - no inputs found!", diff --git a/public/language/zh-TW/admin/general/dashboard.json b/public/language/zh-TW/admin/general/dashboard.json index 02046bd17a..61f4421fb5 100644 --- a/public/language/zh-TW/admin/general/dashboard.json +++ b/public/language/zh-TW/admin/general/dashboard.json @@ -5,9 +5,14 @@ "users": "Users", "posts": "Posts", "topics": "Topics", - "page-views-last-month": "Page views Last Month", - "page-views-this-month": "Page views This Month", - "page-views-last-day": "Page views in last 24 hours", + "page-views-seven": "Last 7 Days", + "page-views-thirty": "Last 30 Days", + "page-views-last-day": "Last 24 hours", + "page-views-custom": "Custom Date Range", + "page-views-custom-start": "Range Start", + "page-views-custom-end": "Range End", + "page-views-custom-help": "Enter a date range of page views you would like to view. If no date picker is available, the accepted format is YYYY-MM-DD", + "page-views-custom-error": "Please enter a valid date range in the format YYYY-MM-DD", "stats.day": "Day", "stats.week": "Week", diff --git a/public/language/zh-TW/admin/general/languages.json b/public/language/zh-TW/admin/general/languages.json index da45cade2c..bdd57849b3 100644 --- a/public/language/zh-TW/admin/general/languages.json +++ b/public/language/zh-TW/admin/general/languages.json @@ -1,5 +1,6 @@ { "language-settings": "Language Settings", "description": "The default language determines the language settings for all users who are visiting your forum.
Individual users can override the default language on their account settings page.", - "default-language": "Default Language" + "default-language": "Default Language", + "auto-detect": "Auto Detect Language Setting for Guests" } \ No newline at end of file diff --git a/public/language/zh-TW/admin/settings/user.json b/public/language/zh-TW/admin/settings/user.json index b8f51c9288..fa8049c3a9 100644 --- a/public/language/zh-TW/admin/settings/user.json +++ b/public/language/zh-TW/admin/settings/user.json @@ -34,6 +34,8 @@ "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", + "invite-expiration": "Invite expiration", + "invite-expiration-help": "# of days invitations expire in.", "min-username-length": "Minimum Username Length", "max-username-length": "Maximum Username Length", "min-password-length": "Minimum Password Length", diff --git a/public/language/zh-TW/error.json b/public/language/zh-TW/error.json index 9ac4e1f494..7ce8059d6d 100644 --- a/public/language/zh-TW/error.json +++ b/public/language/zh-TW/error.json @@ -1,5 +1,6 @@ { "invalid-data": "無效的資料", + "invalid-json": "Invalid JSON", "not-logged-in": "你似乎還沒有登入喔!", "account-locked": "你的帳戶暫時被鎖定!", "search-requires-login": "進行搜尋需要有帳號 - 請先註冊或登入", @@ -12,6 +13,7 @@ "invalid-title": "無效的主題!", "invalid-user-data": "無效的使用者資料", "invalid-password": "無效的密碼", + "invalid-login-credentials": "Invalid login credentials", "invalid-username-or-password": "請指定帳號和密碼", "invalid-search-term": "無效的搜索字詞", "csrf-invalid": "我們無法讓你登入,似乎是因為連線階段已到期。請再重試一次。", diff --git a/public/language/zh-TW/flags.json b/public/language/zh-TW/flags.json index c4bfed6f23..ff94526eac 100644 --- a/public/language/zh-TW/flags.json +++ b/public/language/zh-TW/flags.json @@ -2,14 +2,14 @@ "state": "State", "reporter": "Reporter", "reported-at": "Reported At", - "description": "Description", + "description": "描述", "no-flags": "Hooray! No flags found.", "assignee": "Assignee", - "update": "Update", + "update": "更新", "updated": "Updated", "target-purged": "The content this flag referred to has been purged and is no longer available.", - "quick-filters": "Quick Filters", + "quick-filters": "快速篩選", "filter-active": "There are one or more filters active in this list of flags", "filter-reset": "Remove Filters", "filters": "Filter Options", @@ -17,12 +17,12 @@ "filter-targetUid": "Flagged UID", "filter-type": "Flag Type", "filter-type-all": "All Content", - "filter-type-post": "Post", + "filter-type-post": "文章", "filter-state": "State", "filter-assignee": "Assignee UID", - "filter-cid": "Category", + "filter-cid": "分類", "filter-quick-mine": "Assigned to me", - "filter-cid-all": "All categories", + "filter-cid-all": "所有分類", "apply-filters": "Apply Filters", "quick-links": "Quick Links", @@ -50,10 +50,10 @@ "no-assignee": "Not Assigned", "note-added": "Note Added", - "modal-title": "Report Inappropriate Content", + "modal-title": "回報不適當的內容", "modal-body": "Please specify your reason for flagging %1 %2 for review. Alternatively, use one of the quick report buttons if applicable.", - "modal-reason-spam": "Spam", - "modal-reason-offensive": "Offensive", + "modal-reason-spam": "垃圾評論", + "modal-reason-offensive": "惡意評論", "modal-reason-custom": "Reason for reporting this content...", "modal-submit": "Submit Report", "modal-submit-success": "Content has been flagged for moderation." diff --git a/public/language/zh-TW/topic.json b/public/language/zh-TW/topic.json index 292490d858..f11b6f3806 100644 --- a/public/language/zh-TW/topic.json +++ b/public/language/zh-TW/topic.json @@ -14,6 +14,7 @@ "quote": "引用", "reply": "回覆", "replies_to_this_post": "%1 Replies", + "one_reply_to_this_post": "1 Reply", "last_reply_time": "Last reply", "reply-as-topic": "回復為另一個新主題", "guest-login-reply": "登入以回覆", diff --git a/public/language/zh-TW/user.json b/public/language/zh-TW/user.json index 3a1874a4a4..cc6df85986 100644 --- a/public/language/zh-TW/user.json +++ b/public/language/zh-TW/user.json @@ -60,14 +60,14 @@ "username_taken_workaround": "你想要註冊的帳號已經被使用了,所以我們將它略作改變。你現在的帳號名稱是 %1", "password_same_as_username": "你的密碼和帳號是一樣的,請選擇另一組密碼。", "password_same_as_email": "你的密碼和電子郵件是一樣的,請選擇另一組密碼。", - "weak_password": "Weak password.", + "weak_password": "密碼強度過弱。", "upload_picture": "上傳頭像", "upload_a_picture": "上傳一張照片", "remove_uploaded_picture": "移除上傳的圖片", "upload_cover_picture": "上傳封面圖片", - "remove_cover_picture_confirm": "Are you sure you want to remove the cover picture?", - "crop_picture": "Crop picture", - "upload_cropped_picture": "Crop and upload", + "remove_cover_picture_confirm": "你確定要移除封面圖片嗎?", + "crop_picture": "裁切圖片", + "upload_cropped_picture": "裁切並且上傳", "settings": "設定", "show_email": "顯示我的電子郵件地址", "show_fullname": "顯示我的全名", @@ -99,7 +99,7 @@ "incoming-message-sound": "收到訊息音效", "outgoing-message-sound": "發出訊息音效", "notification-sound": "通知音效", - "no-sound": "No sound", + "no-sound": "沒有聲音", "browsing": "瀏覽設定", "open_links_in_new_tab": "在新的資料標籤裡打開外部的連結", "enable_topic_searching": "啟用在主題中的搜尋", diff --git a/public/less/admin/admin.less b/public/less/admin/admin.less index a37682ab83..0e4c590d00 100644 --- a/public/less/admin/admin.less +++ b/public/less/admin/admin.less @@ -1,4 +1,4 @@ -@import "../../node_modules/bootstrap/less/bootstrap"; +@import "bootstrap/less/bootstrap"; @import "./paper/variables"; @import "./paper/bootswatch"; @import "./mixins"; @@ -232,6 +232,11 @@ body { } } +.category-dropdown-menu { + max-height: 600px; + overflow-y: auto; +} + .table-reordering { tr:hover { cursor: move; diff --git a/public/less/admin/general/dashboard.less b/public/less/admin/general/dashboard.less index 12e542e32a..6bbb49fc86 100644 --- a/public/less/admin/general/dashboard.less +++ b/public/less/admin/general/dashboard.less @@ -130,8 +130,6 @@ } .pageview-stats { - width:33%; - strong { font-size: 22px; } diff --git a/public/src/admin/appearance/customise.js b/public/src/admin/appearance/customise.js index 268d8480af..e95ea5ba30 100644 --- a/public/src/admin/appearance/customise.js +++ b/public/src/admin/appearance/customise.js @@ -28,6 +28,12 @@ define('admin/appearance/customise', ['admin/settings', 'ace/ace'], function (Se app.flags._unsaved = true; $('#customHTML-holder').val(customHTML.getValue()); }); + + $('#save').on('click', function () { + if ($('#enableLiveReload').is(':checked')) { + socket.emit('admin.reloadAllSessions'); + } + }); }); }; diff --git a/public/src/admin/general/dashboard.js b/public/src/admin/general/dashboard.js index 71ad4e3738..6b544ae29c 100644 --- a/public/src/admin/general/dashboard.js +++ b/public/src/admin/general/dashboard.js @@ -294,17 +294,70 @@ define('admin/general/dashboard', ['semver', 'Chart', 'translator'], function (s $(window).on('resize', adjustPieCharts); adjustPieCharts(); - $('[data-action="updateGraph"]').on('click', function () { - var until; - switch ($(this).attr('data-until')) { - case 'last-month': - var lastMonth = new Date(); - lastMonth.setDate(lastMonth.getDate() - 30); - until = lastMonth.getTime(); + $('[data-action="updateGraph"]:not([data-units="custom"])').on('click', function () { + var until = new Date(); + var amount = $(this).attr('data-amount'); + if ($(this).attr('data-units') === 'days') { + until.setHours(0, 0, 0, 0); } - updateTrafficGraph($(this).attr('data-units'), until); + until = until.getTime(); + updateTrafficGraph($(this).attr('data-units'), until, amount); $('[data-action="updateGraph"]').removeClass('active'); $(this).addClass('active'); + + require(['translator'], function (translator) { + translator.translate('[[admin/general/dashboard:page-views-custom]]', function (translated) { + $('[data-action="updateGraph"][data-units="custom"]').text(translated); + }); + }); + }); + $('[data-action="updateGraph"][data-units="custom"]').on('click', function () { + var targetEl = $(this); + + templates.parse('admin/partials/pageviews-range-select', {}, function (html) { + var modal = bootbox.dialog({ + title: '[[admin/general/dashboard:page-views-custom]]', + message: html, + buttons: { + submit: { + label: '[[global:search]]', + className: 'btn-primary', + callback: submit, + }, + }, + }); + + function submit() { + // NEED TO ADD VALIDATION HERE FOR YYYY-MM-DD + var formData = modal.find('form').serializeObject(); + var validRegexp = /\d{4}-\d{2}-\d{2}/; + + // Input validation + if (!formData.startRange && !formData.endRange) { + // No range? Assume last 30 days + updateTrafficGraph('days'); + $('[data-action="updateGraph"]').removeClass('active'); + $('[data-action="updateGraph"][data-units="days"]').addClass('active'); + return; + } else if (!validRegexp.test(formData.startRange) || !validRegexp.test(formData.endRange)) { + // Invalid Input + modal.find('.alert-danger').removeClass('hidden'); + return false; + } + + var until = new Date(formData.endRange); + until.setDate(until.getDate() + 1); + until = until.getTime(); + var amount = (until - new Date(formData.startRange).getTime()) / (1000 * 60 * 60 * 24); + + updateTrafficGraph('days', until, amount); + $('[data-action="updateGraph"]').removeClass('active'); + targetEl.addClass('active'); + + // Update "custom range" label + targetEl.html(formData.startRange + ' – ' + formData.endRange); + } + }); }); socket.emit('admin.rooms.getAll', Admin.updateRoomUsage); @@ -325,7 +378,9 @@ define('admin/general/dashboard', ['semver', 'Chart', 'translator'], function (s }); } - function updateTrafficGraph(units, until) { + function updateTrafficGraph(units, until, amount) { + // until and amount are optional + if (!app.isFocused) { return; } @@ -334,6 +389,7 @@ define('admin/general/dashboard', ['semver', 'Chart', 'translator'], function (s graph: 'traffic', units: units || 'hours', until: until, + amount: amount, }, function (err, data) { if (err) { return app.alertError(err.message); @@ -345,15 +401,15 @@ define('admin/general/dashboard', ['semver', 'Chart', 'translator'], function (s graphData.traffic = data; if (units === 'days') { - graphs.traffic.data.xLabels = utils.getDaysArray(until); + graphs.traffic.data.xLabels = utils.getDaysArray(until, amount); } else { graphs.traffic.data.xLabels = utils.getHoursArray(); - $('#pageViewsThisMonth').html(data.monthlyPageViews.thisMonth); - $('#pageViewsLastMonth').html(data.monthlyPageViews.lastMonth); + $('#pageViewsThirty').html(data.summary.thirty); + $('#pageViewsSeven').html(data.summary.seven); $('#pageViewsPastDay').html(data.pastDay); - utils.addCommasToNumbers($('#pageViewsThisMonth')); - utils.addCommasToNumbers($('#pageViewsLastMonth')); + utils.addCommasToNumbers($('#pageViewsThirty')); + utils.addCommasToNumbers($('#pageViewsSeven')); utils.addCommasToNumbers($('#pageViewsPastDay')); } @@ -364,6 +420,7 @@ define('admin/general/dashboard', ['semver', 'Chart', 'translator'], function (s graphs.traffic.update(); currentGraph.units = units; currentGraph.until = until; + currentGraph.amount = amount; }); } @@ -450,7 +507,7 @@ define('admin/general/dashboard', ['semver', 'Chart', 'translator'], function (s }, realtime ? DEFAULTS.realtimeInterval : DEFAULTS.roomInterval); intervals.graphs = setInterval(function () { - updateTrafficGraph(currentGraph.units, currentGraph.until); + updateTrafficGraph(currentGraph.units, currentGraph.until, currentGraph.amount); }, realtime ? DEFAULTS.realtimeInterval : DEFAULTS.graphInterval); } diff --git a/public/src/admin/manage/category.js b/public/src/admin/manage/category.js index 22fc5d77ec..70bcb571b2 100644 --- a/public/src/admin/manage/category.js +++ b/public/src/admin/manage/category.js @@ -7,30 +7,21 @@ define('admin/manage/category', [ 'admin/modules/colorpicker', 'autocomplete', 'translator', -], function (uploader, iconSelect, colorpicker, autocomplete, translator) { + 'categorySelector', +], function (uploader, iconSelect, colorpicker, autocomplete, translator, categorySelector) { var Category = {}; var modified_categories = {}; Category.init = function () { - var modified_categories = {}; - - function modified(el) { - var cid = $(el).parents('form').attr('data-cid'); - - if (cid) { - modified_categories[cid] = modified_categories[cid] || {}; - modified_categories[cid][$(el).attr('data-name')] = $(el).val(); - - app.flags = app.flags || {}; - app.flags._unsaved = true; - } - } - - $('.blockclass, form.category select').each(function () { + $('#category-settings select').each(function () { var $this = $(this); $this.val($this.attr('data-value')); }); + $('#category-selector').on('change', function () { + ajaxify.go('admin/manage/categories/' + $(this).val()); + }); + function enableColorPicker(idx, inputEl) { var $inputEl = $(inputEl); var previewEl = $inputEl.parents('[data-cid]').find('.category-preview'); @@ -47,7 +38,7 @@ define('admin/manage/category', [ } - $('form.category input, form.category select').not($('.privilege-table-container input')) + $('#category-settings input, #category-settings select').not($('.privilege-table-container input')) .on('change', function (ev) { modified(ev.target); }) @@ -156,6 +147,10 @@ define('admin/manage/category', [ iconSelect.init($(this).find('i'), modified); }); + $('[type="checkbox"]').on('change', function () { + modified($(this)); + }); + $('button[data-action="setParent"], button[data-action="changeParent"]').on('click', Category.launchParentSelector); $('button[data-action="removeParent"]').on('click', function () { var payload = {}; @@ -182,8 +177,15 @@ define('admin/manage/category', [ var cid = ajaxify.data.category.cid; if (cid) { + var value; + if ($(el).is(':checkbox')) { + value = $(el).is(':checked') ? 1 : 0; + } else { + value = $(el).val(); + } + modified_categories[cid] = modified_categories[cid] || {}; - modified_categories[cid][$(el).attr('data-name')] = $(el).val(); + modified_categories[cid][$(el).attr('data-name')] = value; app.flags = app.flags || {}; app.flags._unsaved = true; @@ -296,47 +298,30 @@ define('admin/manage/category', [ }; Category.launchParentSelector = function () { - socket.emit('categories.get', function (err, categories) { - if (err) { - return app.alertError(err.message); - } - - categories = categories.filter(function (category) { - return category && !category.disabled && parseInt(category.cid, 10) !== parseInt(ajaxify.data.category.cid, 10); - }); - - templates.parse('partials/category_list', { - categories: categories, - }, function (html) { - var modal = bootbox.dialog({ - message: html, - title: '[[admin/manage/categories:alert.set-parent-category]]', - }); - - modal.find('li[data-cid]').on('click', function () { - var parentCid = $(this).attr('data-cid'); - var payload = {}; + var categories = ajaxify.data.allCategories.filter(function (category) { + return category && !category.disabled && parseInt(category.cid, 10) !== parseInt(ajaxify.data.category.cid, 10); + }); - payload[ajaxify.data.category.cid] = { - parentCid: parentCid, - }; + selectCategoryModal(categories, function (parentCid) { + var payload = {}; - socket.emit('admin.categories.update', payload, function (err) { - if (err) { - return app.alertError(err.message); - } - var parent = categories.filter(function (category) { - return category && parseInt(category.cid, 10) === parseInt(parentCid, 10); - }); - parent = parent[0]; + payload[ajaxify.data.category.cid] = { + parentCid: parentCid, + }; - modal.modal('hide'); - $('button[data-action="removeParent"]').parent().removeClass('hide'); - $('button[data-action="setParent"]').addClass('hide'); - var buttonHtml = ' ' + parent.name; - $('button[data-action="changeParent"]').html(buttonHtml).parent().removeClass('hide'); - }); + socket.emit('admin.categories.update', payload, function (err) { + if (err) { + return app.alertError(err.message); + } + var parent = ajaxify.data.allCategories.filter(function (category) { + return category && parseInt(category.cid, 10) === parseInt(parentCid, 10); }); + parent = parent[0]; + + $('button[data-action="removeParent"]').parent().removeClass('hide'); + $('button[data-action="setParent"]').addClass('hide'); + var buttonHtml = ' ' + parent.name; + $('button[data-action="changeParent"]').html(buttonHtml).parent().removeClass('hide'); }); }); }; @@ -417,41 +402,41 @@ define('admin/manage/category', [ }); }; - function selectCategoryModal(callback) { - socket.emit('admin.categories.getNames', function (err, categories) { - if (err) { - return app.alertError(err.message); - } - - templates.parse('admin/partials/categories/select-category', { - categories: categories, - }, function (html) { - translator.translate(html, function (html) { - var modal = bootbox.dialog({ - title: 'Select a Category', - message: html, - buttons: { - save: { - label: 'Copy', - className: 'btn-primary', - callback: submit, - }, + function selectCategoryModal(categories, callback) { + if (typeof categories === 'function') { + callback = categories; + categories = ajaxify.data.allCategories; + } + templates.parse('admin/partials/categories/select-category', { + categories: categories, + }, function (html) { + translator.translate(html, function (html) { + var modal = bootbox.dialog({ + title: '[[modules:composer.select_category]]', + message: html, + buttons: { + save: { + label: '[[global:select]]', + className: 'btn-primary', + callback: submit, }, - }); - - function submit() { - var formData = modal.find('form').serializeObject(); - callback(formData['select-cid']); + }, + }); + categorySelector.init(modal.find('[component="category-selector"]')); + function submit(ev) { + ev.preventDefault(); + var selectedCategory = categorySelector.getSelectedCategory(); + if (selectedCategory) { + callback(selectedCategory.cid); modal.modal('hide'); - return false; } + return false; + } - modal.find('form').on('submit', submit); - }); + modal.find('form').on('submit', submit); }); }); } - return Category; }); diff --git a/public/src/admin/settings/email.js b/public/src/admin/settings/email.js index d25fa05c30..d6a1983102 100644 --- a/public/src/admin/settings/email.js +++ b/public/src/admin/settings/email.js @@ -8,6 +8,7 @@ define('admin/settings/email', ['ace/ace', 'admin/settings'], function (ace) { module.init = function () { configureEmailTester(); configureEmailEditor(); + handleDigestHourChange(); $(window).on('action:admin.settingsLoaded action:admin.settingsSaved', handleDigestHourChange); $(window).on('action:admin.settingsSaved', function () { diff --git a/public/src/ajaxify.js b/public/src/ajaxify.js index 93eb4791b0..26c9950254 100644 --- a/public/src/ajaxify.js +++ b/public/src/ajaxify.js @@ -395,6 +395,10 @@ $(document).ready(function () { } if (app.flags && app.flags.hasOwnProperty('_unsaved') && app.flags._unsaved === true) { + if (e.ctrlKey) { + return; + } + translator.translate('[[global:unsaved-changes]]', function (text) { bootbox.confirm(text, function (navigate) { if (navigate) { diff --git a/public/src/app.js b/public/src/app.js index 81ebe4f891..ccd324b68c 100644 --- a/public/src/app.js +++ b/public/src/app.js @@ -72,6 +72,11 @@ app.cacheBuster = null; }); } }); + socket.on('event:livereload', function () { + if (app.user.isAdmin && !ajaxify.currentPage.match(/admin/)) { + window.location.reload(); + } + }); require(['taskbar', 'helpers', 'forum/pagination'], function (taskbar, helpers, pagination) { taskbar.init(); diff --git a/public/src/client/account/edit.js b/public/src/client/account/edit.js index 02c1e57200..dd8cbd8406 100644 --- a/public/src/client/account/edit.js +++ b/public/src/client/account/edit.js @@ -60,7 +60,9 @@ define('forum/account/edit', ['forum/account/header', 'translator', 'components' if (parseInt(ajaxify.data.theirid, 10) !== parseInt(ajaxify.data.yourid, 10)) { return; } - + if (!picture && ajaxify.data.defaultAvatar) { + picture = ajaxify.data.defaultAvatar; + } components.get('header/userpicture')[picture ? 'show' : 'hide'](); components.get('header/usericon')[!picture ? 'show' : 'hide'](); if (picture) { @@ -85,6 +87,8 @@ define('forum/account/edit', ['forum/account/header', 'translator', 'components' templates.parse('partials/modals/change_picture_modal', { pictures: pictures, uploaded: uploaded, + icon: { text: ajaxify.data['icon:text'], bgColor: ajaxify.data['icon:bgColor'] }, + defaultAvatar: ajaxify.data.defaultAvatar, allowProfileImageUploads: ajaxify.data.allowProfileImageUploads, }, function (html) { translator.translate(html, function (html) { @@ -115,12 +119,6 @@ define('forum/account/edit', ['forum/account/header', 'translator', 'components' handleImageUpload(modal); function updateImages() { - var userIcon = modal.find('.user-icon'); - - userIcon - .css('background-color', ajaxify.data['icon:bgColor']) - .text(ajaxify.data['icon:text']); - // Check to see which one is the active picture if (!ajaxify.data.picture) { modal.find('.list-group-item .user-icon').parents('.list-group-item').addClass('active'); @@ -219,8 +217,6 @@ define('forum/account/edit', ['forum/account/header', 'translator', 'components' paramValue: ajaxify.data.theirid, fileSize: ajaxify.data.maximumProfileImageSize, allowSkippingCrop: false, - restrictImageDimension: true, - imageDimension: ajaxify.data.profileImageDimension, title: '[[user:upload_picture]]', description: '[[user:upload_a_picture]]', accept: '.png,.jpg,.bmp', @@ -258,8 +254,6 @@ define('forum/account/edit', ['forum/account/header', 'translator', 'components' socketMethod: 'user.uploadCroppedPicture', aspectRatio: '1 / 1', allowSkippingCrop: false, - restrictImageDimension: true, - imageDimension: ajaxify.data.profileImageDimension, paramName: 'uid', paramValue: ajaxify.data.theirid, }, onUploadComplete); diff --git a/public/src/client/category.js b/public/src/client/category.js index 504f132697..4cdd18ca2b 100644 --- a/public/src/client/category.js +++ b/public/src/client/category.js @@ -345,7 +345,7 @@ define('forum/category', [ } if (!topicSelect.getSelectedTids().length) { - infinitescroll.removeExtra($('[component="category/topic"]'), direction, 60); + infinitescroll.removeExtra($('[component="category/topic"]'), direction, config.topicsPerPage * 3); } html.find('.timeago').timeago(); diff --git a/public/src/client/footer.js b/public/src/client/footer.js index dc10e84d1f..25444f0912 100644 --- a/public/src/client/footer.js +++ b/public/src/client/footer.js @@ -7,7 +7,7 @@ define('forum/footer', ['notifications', 'chat', 'components', 'translator'], fu translator.prepareDOM(); function updateUnreadTopicCount(url, count) { - $('#main-nav a[href="' + config.relative_path + url + '"] i') + $('a[href="' + config.relative_path + url + '"] i') .toggleClass('unread-count', count > 0) .attr('data-content', count > 99 ? '99+' : count); } diff --git a/public/src/client/topic/move.js b/public/src/client/topic/move.js index 5ff9a02c49..0b969ef6b9 100644 --- a/public/src/client/topic/move.js +++ b/public/src/client/topic/move.js @@ -1,10 +1,10 @@ 'use strict'; -define('forum/topic/move', function () { +define('forum/topic/move', ['categorySelector'], function (categorySelector) { var Move = {}; var modal; - var selectedEl; + var selectedCategory; Move.init = function (tids, currentCid, onComplete) { Move.tids = tids; @@ -31,9 +31,7 @@ define('forum/topic/move', function () { modal.find('.modal-header h3').translateText('[[topic:move_topics]]'); } - modal.on('click', '.category-list li[data-cid]', function () { - selectCategory($(this)); - }); + categorySelector.init(modal.find('[component="category-selector"]'), onCategorySelected); modal.find('#move_thread_commit').on('click', onCommitClicked); @@ -42,60 +40,22 @@ define('forum/topic/move', function () { } function parseModal(categories, callback) { - templates.parse('partials/move_thread_modal', { categories: [] }, function (html) { - require(['translator'], function (translator) { - translator.translate(html, function (html) { - modal = $(html); - categories.forEach(function (category) { - if (!category.link) { - buildRecursive(modal.find('.category-list'), category, ''); - } - }); - callback(); - }); - }); - }); - } - - function buildRecursive(parentEl, category, level) { - var categoryEl = $('
  • '); + app.parseAndTranslate('partials/move_thread_modal', { categories: categories }, function (html) { + modal = $(html); - if (category.bgColor) { - categoryEl.css('background-color', category.bgColor); - } - if (category.color) { - categoryEl.css('color', category.color); - } - categoryEl.toggleClass('disabled', !!category.disabled); - categoryEl.attr('data-cid', category.cid); - categoryEl.attr('data-icon', category.icon); - categoryEl.attr('data-name', category.name); - categoryEl.html(' ' + category.name); - - parentEl.append(level); - parentEl.append(categoryEl); - parentEl.append('
    '); - - var indent = '      '; - category.children.forEach(function (childCategory) { - if (!childCategory.link) { - buildRecursive(parentEl, childCategory, indent + level); - } + callback(); }); } - function selectCategory(category) { - modal.find('#confirm-category-name').html(category.html()); - modal.find('#move-confirm').removeClass('hide'); - - selectedEl = category; + function onCategorySelected(category) { + selectedCategory = category; modal.find('#move_thread_commit').prop('disabled', false); } function onCommitClicked() { var commitEl = modal.find('#move_thread_commit'); - if (!commitEl.prop('disabled') && selectedEl.attr('data-cid')) { + if (!commitEl.prop('disabled') && selectedCategory && selectedCategory.cid) { commitEl.prop('disabled', true); moveTopics(); @@ -105,7 +65,7 @@ define('forum/topic/move', function () { function moveTopics() { socket.emit(Move.moveAll ? 'topics.moveAll' : 'topics.move', { tids: Move.tids, - cid: selectedEl.attr('data-cid'), + cid: selectedCategory.cid, currentCid: Move.currentCid, }, function (err) { modal.modal('hide'); @@ -114,7 +74,7 @@ define('forum/topic/move', function () { return app.alertError(err.message); } - app.alertSuccess('[[topic:topic_move_success, ' + selectedEl.attr('data-name') + ']] '); + app.alertSuccess('[[topic:topic_move_success, ' + selectedCategory.name + ']]'); if (typeof Move.onComplete === 'function') { Move.onComplete(); } diff --git a/public/src/client/topic/postTools.js b/public/src/client/topic/postTools.js index 8bbda4d79c..707a9a5b0f 100644 --- a/public/src/client/topic/postTools.js +++ b/public/src/client/topic/postTools.js @@ -367,7 +367,8 @@ define('forum/topic/postTools', [ } function showStaleWarning(callback) { - if (staleReplyAnyway || ajaxify.data.lastposttime >= (Date.now() - (1000 * 60 * 60 * 24 * ajaxify.data.topicStaleDays))) { + var staleThreshold = Math.min(Date.now() - (1000 * 60 * 60 * 24 * ajaxify.data.topicStaleDays), 8640000000000000); + if (staleReplyAnyway || ajaxify.data.lastposttime >= staleThreshold) { return callback(); } diff --git a/public/src/client/topic/posts.js b/public/src/client/topic/posts.js index fb9074b3be..1773357122 100644 --- a/public/src/client/topic/posts.js +++ b/public/src/client/topic/posts.js @@ -18,6 +18,11 @@ define('forum/topic/posts', [ data.loggedIn = !!app.user.uid; data.privileges = ajaxify.data.privileges; + + // prevent timeago in future by setting timestamp to 1 sec behind now + data.posts[0].timestamp = Date.now() - 1000; + data.posts[0].timestampISO = utils.toISOString(data.posts[0].timestamp); + Posts.modifyPostsByPrivileges(data.posts); updatePostCounts(data.posts); @@ -192,7 +197,7 @@ define('forum/topic/posts', [ components.get('topic').append(html); } - infinitescroll.removeExtra($('[component="post"]'), direction, 40); + infinitescroll.removeExtra($('[component="post"]'), direction, config.postsPerPage * 2); $(window).trigger('action:posts.loaded', { posts: data.posts }); diff --git a/public/src/client/topic/replies.js b/public/src/client/topic/replies.js index 7d9b9474bc..37ddd1912b 100644 --- a/public/src/client/topic/replies.js +++ b/public/src/client/topic/replies.js @@ -89,8 +89,19 @@ define('forum/topic/replies', ['navigator', 'components', 'forum/topic/posts'], var timestamp = replyCount.find('.timeago').attr('title', post.timestampISO); countEl.attr('data-replies', count); - replyCount.toggleClass('hidden', !count); - countEl.translateText('[[topic:replies_to_this_post, ' + count + ']]'); + replyCount.toggleClass('hidden', count <= 0); + if (count > 1) { + countEl.translateText('[[topic:replies_to_this_post, ' + count + ']]'); + } else { + countEl.translateText('[[topic:one_reply_to_this_post]]'); + } + + if (!avatars.find('[data-uid="' + post.uid + '"]').length && count < 7) { + app.parseAndTranslate('topic', 'posts', { posts: [{ replies: { users: [post.user] } }] }, function (html) { + avatars.prepend(html.find('[component="post/reply-count/avatars"] [component="user/picture"]')); + }); + } + avatars.addClass('hasMore'); timestamp.data('timeago', null).timeago(); diff --git a/public/src/modules/categorySelector.js b/public/src/modules/categorySelector.js new file mode 100644 index 0000000000..51b71e7117 --- /dev/null +++ b/public/src/modules/categorySelector.js @@ -0,0 +1,33 @@ +'use strict'; + + +define('categorySelector', function () { + var categorySelector = {}; + var selectedCategory; + var el; + categorySelector.init = function (_el, callback) { + callback = callback || function () {}; + el = _el; + el.on('click', '[data-cid]', function () { + var categoryEl = $(this); + categorySelector.selectCategory(categoryEl.attr('data-cid')); + callback(selectedCategory); + }); + }; + + categorySelector.getSelectedCategory = function () { + return selectedCategory; + }; + + categorySelector.selectCategory = function (cid) { + var categoryEl = el.find('[data-cid="' + cid + '"]'); + selectedCategory = { + cid: cid, + name: categoryEl.attr('data-name'), + }; + el.find('[component="category-selector-selected"]').html(categoryEl.find('[component="category-markup"]').html()); + }; + + return categorySelector; +}); + diff --git a/public/src/modules/helpers.js b/public/src/modules/helpers.js index e1cf620607..548e0ba47a 100644 --- a/public/src/modules/helpers.js +++ b/public/src/modules/helpers.js @@ -1,16 +1,38 @@ 'use strict'; -(function (exports) { - /* globals define, utils, config */ - - // export the class if we are in a Node-like system. - if (typeof module === 'object' && module.exports === exports) { - exports = module.exports/* = SemVer*/; +(function (factory) { + if (typeof module === 'object' && module.exports) { + var relative_path = require('nconf').get('relative_path'); + module.exports = factory(require('../utils'), require('templates.js'), require('string'), relative_path); + } else if (typeof define === 'function' && define.amd) { + define('helpers', ['string'], function (string) { + return factory(utils, templates, string, config.relative_path); + }); + } else { + window.helpers = factory(utils, templates, window.String, config.relative_path); } +}(function (utils, templates, S, relative_path) { + var helpers = { + displayMenuItem: displayMenuItem, + buildMetaTag: buildMetaTag, + buildLinkTag: buildLinkTag, + stringify: stringify, + escape: escape, + stripTags: stripTags, + generateCategoryBackground: generateCategoryBackground, + generateChildrenCategories: generateChildrenCategories, + generateTopicClass: generateTopicClass, + displayUserSearch: displayUserSearch, + membershipBtn: membershipBtn, + spawnPrivilegeStates: spawnPrivilegeStates, + localeToHTML: localeToHTML, + renderTopicImage: renderTopicImage, + renderDigestAvatar: renderDigestAvatar, + userAgentIcons: userAgentIcons, + register: register, + }; - var helpers = exports; - - helpers.displayMenuItem = function (data, index) { + function displayMenuItem(data, index) { var item = data.navigation[index]; if (!item) { return false; @@ -35,17 +57,17 @@ } return true; - }; + } - helpers.buildMetaTag = function (tag) { + function buildMetaTag(tag) { var name = tag.name ? 'name="' + tag.name + '" ' : ''; var property = tag.property ? 'property="' + tag.property + '" ' : ''; var content = tag.content ? 'content="' + tag.content.replace(/\n/g, ' ') + '" ' : ''; return '\n\t'; - }; + } - helpers.buildLinkTag = function (tag) { + function buildLinkTag(tag) { var link = tag.link ? 'link="' + tag.link + '" ' : ''; var rel = tag.rel ? 'rel="' + tag.rel + '" ' : ''; var type = tag.type ? 'type="' + tag.type + '" ' : ''; @@ -53,29 +75,22 @@ var sizes = tag.sizes ? 'sizes="' + tag.sizes + '" ' : ''; return '\n\t'; - }; + } - helpers.stringify = function (obj) { + function stringify(obj) { // Turns the incoming object into a JSON string return JSON.stringify(obj).replace(/&/gm, '&').replace(//gm, '>').replace(/"/g, '"'); - }; + } - helpers.escape = function (str) { - if (typeof utils !== 'undefined') { - return utils.escapeHTML(str); - } - return require('../utils').escapeHTML(str); - }; + function escape(str) { + return utils.escapeHTML(str); + } - helpers.stripTags = function (str) { - if (typeof window !== 'undefined' && window.S) { - return window.S(String(str)).stripTags().s; - } - var S = require('string'); + function stripTags(str) { return S(String(str)).stripTags().s; - }; + } - helpers.generateCategoryBackground = function (category) { + function generateCategoryBackground(category) { if (!category) { return ''; } @@ -97,16 +112,15 @@ } return style.join('; ') + ';'; - }; + } - helpers.generateChildrenCategories = function (category) { + function generateChildrenCategories(category) { var html = ''; - var relative_path = (typeof config !== 'undefined' ? config.relative_path : require('nconf').get('relative_path')); if (!category || !category.children || !category.children.length) { return html; } category.children.forEach(function (child) { - if (child) { + if (child && !child.isSection) { var link = child.link ? child.link : (relative_path + '/category/' + child.slug); html += '' + '' + @@ -117,9 +131,9 @@ }); html = html ? ('' + html + '') : html; return html; - }; + } - helpers.generateTopicClass = function (topic) { + function generateTopicClass(topic) { var style = []; if (topic.locked) { @@ -139,14 +153,14 @@ } return style.join(' '); - }; + } - helpers.displayUserSearch = function (data, allowGuestUserSearching) { + function displayUserSearch(data, allowGuestUserSearching) { return data.loggedIn || allowGuestUserSearching === 'true'; - }; + } // Groups helpers - helpers.membershipBtn = function (groupObj) { + function membershipBtn(groupObj) { if (groupObj.isMember && groupObj.name !== 'administrators') { return ''; } @@ -159,9 +173,9 @@ return ''; } return ''; - }; + } - helpers.spawnPrivilegeStates = function (member, privileges) { + function spawnPrivilegeStates(member, privileges) { var states = []; for (var priv in privileges) { if (privileges.hasOwnProperty(priv)) { @@ -174,21 +188,21 @@ return states.map(function (priv) { return ''; }).join(''); - }; + } - helpers.localeToHTML = function (locale, fallback) { + function localeToHTML(locale, fallback) { locale = locale || fallback || 'en-GB'; return locale.replace('_', '-'); - }; + } - helpers.renderTopicImage = function (topicObj) { + function renderTopicImage(topicObj) { if (topicObj.thumb) { return ''; } return ''; - }; + } - helpers.renderDigestAvatar = function (block) { + function renderDigestAvatar(block) { if (block.teaser) { if (block.teaser.user.picture) { return ''; @@ -199,9 +213,9 @@ return ''; } return '
    ' + block.user['icon:text'] + '
    '; - }; + } - helpers.userAgentIcons = function (data) { + function userAgentIcons(data) { var icons = ''; switch (data.platform) { @@ -251,29 +265,13 @@ } return icons; - }; - - exports.register = function () { - var templates; - - if (typeof module === 'object') { - templates = require('templates.js'); - } else { - templates = window.templates; - } + } + function register() { Object.keys(helpers).forEach(function (helperName) { templates.registerHelper(helperName, helpers[helperName]); }); - }; - - // export the class if we are in a Node-like system. - if (typeof module === 'object' && module.exports === exports) { - exports = module.exports/* = SemVer*/; - } else if (typeof define === 'function' && define.amd) { - // Use the define() function if we're in AMD land - define('helpers', exports); - } else if (typeof window === 'object') { - window.helpers = exports; } -}(typeof exports === 'object' ? exports : {})); + + return helpers; +})); diff --git a/public/src/modules/pictureCropper.js b/public/src/modules/pictureCropper.js index bbe0a76735..d413c3d156 100644 --- a/public/src/modules/pictureCropper.js +++ b/public/src/modules/pictureCropper.js @@ -37,9 +37,15 @@ define('pictureCropper', ['translator', 'cropper'], function (translator, croppe }, function (cropperHtml) { translator.translate(cropperHtml, function (translated) { var cropperModal = $(translated); - cropperModal.modal('show'); + cropperModal.modal({ + backdrop: 'static', + }).modal('show'); + // Set cropper image max-height based on viewport + var cropBoxHeight = parseInt($(window).height() / 2, 10); var img = document.getElementById('cropped-image'); + $(img).css('max-height', cropBoxHeight); + var cropperTool = new cropper.default(img, { aspectRatio: data.aspectRatio, autoCropArea: 1, diff --git a/public/src/modules/settings.js b/public/src/modules/settings.js index ecd99a9521..93583d6ed9 100644 --- a/public/src/modules/settings.js +++ b/public/src/modules/settings.js @@ -461,7 +461,9 @@ define('settings', function () { for (var key in values) { if (values.hasOwnProperty(key)) { try { - values[key] = JSON.parse(values[key]); + if (!utils.isNumber(values[key])) { + values[key] = JSON.parse(values[key]); + } } catch (e) { // Leave the value as is } diff --git a/public/src/modules/translator.js b/public/src/modules/translator.js index afd64317ef..5296e1eef4 100644 --- a/public/src/modules/translator.js +++ b/public/src/modules/translator.js @@ -304,7 +304,7 @@ * Load translation file (or use a cached version), and optionally return the translation of a certain key * @param {string} namespace - The file name of the translation namespace * @param {string} [key] - The key of the specific translation to getJSON - * @returns {Promise|Promise} + * @returns {Promise<{ [key: string]: string }>|Promise} */ Translator.prototype.getTranslation = function getTranslation(namespace, key) { var translation; @@ -324,6 +324,70 @@ return translation; }; + /** + * @param {Node} node + * @returns {Node[]} + */ + function descendantTextNodes(node) { + var textNodes = []; + + function helper(node) { + if (node.nodeType === 3) { + textNodes.push(node); + } else { + for (var i = 0, c = node.childNodes, l = c.length; i < l; i += 1) { + helper(c[i]); + } + } + } + + helper(node); + return textNodes; + } + + /** + * Recursively translate a DOM element in place + * @param {Element} element - Root element to translate + * @param {string[]} [attributes] - Array of node attributes to translate + * @returns {Promise} + */ + Translator.prototype.translateInPlace = function translateInPlace(element, attributes) { + attributes = attributes || ['placeholder', 'title']; + + var nodes = descendantTextNodes(element); + var text = nodes.map(function (node) { + return node.nodeValue; + }).join(' || '); + + var attrNodes = attributes.reduce(function (prev, attr) { + var tuples = Array.prototype.map.call(element.querySelectorAll('[' + attr + '*="[["]'), function (el) { + return [attr, el]; + }); + return prev.concat(tuples); + }, []); + var attrText = attrNodes.map(function (node) { + return node[1].getAttribute(node[0]); + }).join(' || '); + + return Promise.all([ + this.translate(text), + this.translate(attrText), + ]).then(function (ref) { + var translated = ref[0]; + var translatedAttrs = ref[1]; + if (translated) { + translated.split(' || ').forEach(function (html, i) { + $(nodes[i]).replaceWith(html); + }); + } + if (translatedAttrs) { + translatedAttrs.split(' || ').forEach(function (text, i) { + attrNodes[i][1].setAttribute(attrNodes[i][0], text); + }); + } + }); + }; + /** * Get the language of the current environment, falling back to defaults * @returns {string} diff --git a/public/src/utils.js b/public/src/utils.js index 8f2dcb8e87..fe655c2e3b 100644 --- a/public/src/utils.js +++ b/public/src/utils.js @@ -197,7 +197,14 @@ return ''; } - return Date.prototype.toISOString ? new Date(parseInt(timestamp, 10)).toISOString() : timestamp; + // Prevent too-high values to be passed to Date object + timestamp = Math.min(timestamp, 8640000000000000); + + try { + return Date.prototype.toISOString ? new Date(parseInt(timestamp, 10)).toISOString() : timestamp; + } catch (e) { + return timestamp; + } }, tags: ['a', 'abbr', 'acronym', 'address', 'applet', 'area', 'article', 'aside', 'audio', 'b', 'base', 'basefont', 'bdi', 'bdo', 'big', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'command', 'datalist', 'dd', 'del', 'details', 'dfn', 'dialog', 'dir', 'div', 'dl', 'dt', 'em', 'embed', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'frame', 'frameset', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hr', 'html', 'i', 'iframe', 'img', 'input', 'ins', 'kbd', 'keygen', 'label', 'legend', 'li', 'link', 'map', 'mark', 'menu', 'meta', 'meter', 'nav', 'noframes', 'noscript', 'object', 'ol', 'optgroup', 'option', 'output', 'p', 'param', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'script', 'section', 'select', 'small', 'source', 'span', 'strike', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'textarea', 'tfoot', 'th', 'thead', 'time', 'title', 'tr', 'track', 'tt', 'u', 'ul', 'var', 'video', 'wbr'], @@ -267,13 +274,13 @@ return labels.reverse(); }, - getDaysArray: function (from) { + getDaysArray: function (from, amount) { var currentDay = new Date(from || Date.now()).getTime(); var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; var labels = []; var tmpDate; - for (var x = 29; x >= 0; x -= 1) { + for (var x = (amount || 30) - 1; x >= 0; x -= 1) { tmpDate = new Date(currentDay - (1000 * 60 * 60 * 24 * x)); labels.push(months[tmpDate.getMonth()] + ' ' + tmpDate.getDate()); } @@ -339,9 +346,7 @@ }, urlToLocation: function (url) { - var a = document.createElement('a'); - a.href = url; - return a; + return $('')[0]; }, // return boolean if string 'true' or string 'false', or if a parsable string which is a number @@ -405,9 +410,13 @@ (relative_path.length > 0 ? targetLocation.pathname.indexOf(relative_path) === 0 : true) // Subfolder installs need this additional check ); }, + + rtrim: function (str) { + return str.replace(/\s+$/g, ''); + }, }; - /* eslint "no-extend-native": "off" */ + /* eslint "no-extend-native": "off" */ if (typeof String.prototype.startsWith !== 'function') { String.prototype.startsWith = function (prefix) { if (this.length < prefix.length) { @@ -429,9 +438,11 @@ }; } + // DEPRECATED: remove in 1.6 if (typeof String.prototype.rtrim !== 'function') { String.prototype.rtrim = function () { - return this.replace(/\s+$/g, ''); + console.warn('[deprecated] `String.prototype.rtrim` is deprecated as of NodeBB v1.5; use `utils.rtrim` instead.'); + return utils.rtrim(this); }; } diff --git a/public/vendor/bootbox/wrapper.js b/public/vendor/bootbox/wrapper.js index 505b42788f..35efdd8305 100644 --- a/public/vendor/bootbox/wrapper.js +++ b/public/vendor/bootbox/wrapper.js @@ -1,67 +1,20 @@ /* global bootbox */ require(['translator'], function (shim) { - "use strict"; - - function descendantTextNodes(node) { - var textNodes = []; - - function helper(node) { - if (node.nodeType === 3) { - textNodes.push(node); - } else { - for (var i = 0, c = node.childNodes, l = c.length; i < l; i += 1) { - helper(c[i]); - } - } - } - - helper(node); - return textNodes; - } + 'use strict'; var translator = shim.Translator.create(); var dialog = bootbox.dialog; var attrsToTranslate = ['placeholder', 'title', 'value']; bootbox.dialog = function (options) { - var show, $elem, nodes, text, attrNodes, attrText; - - show = options.show !== false; + var show = options.show !== false; options.show = false; - $elem = dialog.call(bootbox, options); + var $elem = dialog.call(bootbox, options); + var element = $elem[0]; - if (/\[\[.+\]\]/.test($elem[0].outerHTML)) { - nodes = descendantTextNodes($elem[0]); - text = nodes.map(function (node) { - return node.nodeValue; - }).join(' || '); - - attrNodes = attrsToTranslate.reduce(function (prev, attr) { - return prev.concat(nodes.map.call($elem.find('[' + attr + '*="[["]'), function (el) { - return [attr, el]; - })); - }, []); - attrText = attrNodes.map(function (node) { - return node[1].getAttribute(node[0]); - }).join(' || '); - - Promise.all([ - translator.translate(text), - translator.translate(attrText), - ]).then(function (ref) { - var translated = ref[0]; - var translatedAttrs = ref[1]; - if (translated) { - translated.split(' || ').forEach(function (html, i) { - $(nodes[i]).replaceWith(html); - }); - } - if (translatedAttrs) { - translatedAttrs.split(' || ').forEach(function (text, i) { - attrNodes[i][1].setAttribute(attrNodes[i][0], text); - }); - } + if (/\[\[.+\]\]/.test(element.outerHTML)) { + translator.translateInPlace(element, attrsToTranslate).then(function () { if (show) { $elem.modal('show'); } @@ -84,7 +37,7 @@ require(['translator'], function (shim) { CANCEL: translations[1], CONFIRM: translations[2], }); - + bootbox.setLocale(lang); }); }); diff --git a/public/vendor/jquery/js/jquery.js b/public/vendor/jquery/js/jquery.js deleted file mode 100644 index 7554b8b747..0000000000 --- a/public/vendor/jquery/js/jquery.js +++ /dev/null @@ -1,9921 +0,0 @@ -/*! - * jQuery JavaScript Library v1.10.2 - * http://jquery.com/ - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * - * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2013-07-03T13:48Z - */ -(function (window, undefined) { - - // Can't do this because several apps including ASP.NET trace - // the stack via arguments.caller.callee and Firefox dies if - // you try to trace through "use strict" call chains. (#13335) - // Support: Firefox 18+ - //"use strict"; - var - // The deferred used on DOM ready - readyList, - - // A central reference to the root jQuery(document) - rootjQuery, - - // Support: IE<10 - // For `typeof xmlNode.method` instead of `xmlNode.method !== undefined` - core_strundefined = typeof undefined, - - // Use the correct document accordingly with window argument (sandbox) - location = window.location, - document = window.document, - docElem = document.documentElement, - - // Map over jQuery in case of overwrite - _jQuery = window.jQuery, - - // Map over the $ in case of overwrite - _$ = window.$, - - // [[Class]] -> type pairs - class2type = {}, - - // List of deleted data cache ids, so we can reuse them - core_deletedIds = [], - - core_version = "1.10.2", - - // Save a reference to some core methods - core_concat = core_deletedIds.concat, - core_push = core_deletedIds.push, - core_slice = core_deletedIds.slice, - core_indexOf = core_deletedIds.indexOf, - core_toString = class2type.toString, - core_hasOwn = class2type.hasOwnProperty, - core_trim = core_version.trim, - - // Define a local copy of jQuery - jQuery = function (selector, context) { - // The jQuery object is actually just the init constructor 'enhanced' - return new jQuery.fn.init(selector, context, rootjQuery); - }, - - // Used for matching numbers - core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source, - - // Used for splitting on whitespace - core_rnotwhite = /\S+/g, - - // Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE) - rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, - - // Match a standalone tag - rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/, - - // JSON RegExp - rvalidchars = /^[\],:{}\s]*$/, - rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, - rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g, - rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g, - - // Matches dashed string for camelizing - rmsPrefix = /^-ms-/, - rdashAlpha = /-([\da-z])/gi, - - // Used by jQuery.camelCase as callback to replace() - fcamelCase = function (all, letter) { - return letter.toUpperCase(); - }, - - // The ready event handler - completed = function (event) { - - // readyState === "complete" is good enough for us to call the dom ready in oldIE - if (document.addEventListener || event.type === "load" || document.readyState === "complete") { - detach(); - jQuery.ready(); - } - }, - // Clean-up method for dom ready events - detach = function () { - if (document.addEventListener) { - document.removeEventListener("DOMContentLoaded", completed, false); - window.removeEventListener("load", completed, false); - - } else { - document.detachEvent("onreadystatechange", completed); - window.detachEvent("onload", completed); - } - }; - - jQuery.fn = jQuery.prototype = { - // The current version of jQuery being used - jquery: core_version, - - constructor: jQuery, - init: function (selector, context, rootjQuery) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if (!selector) { - return this; - } - - // Handle HTML strings - if (typeof selector === "string") { - if (selector.charAt(0) === "<" && selector.charAt(selector.length - 1) === ">" && selector.length >= 3) { - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [null, selector, null]; - - } else { - match = rquickExpr.exec(selector); - } - - // Match html or make sure no context is specified for #id - if (match && (match[1] || !context)) { - - // HANDLE: $(html) -> $(array) - if (match[1]) { - context = context instanceof jQuery ? context[0] : context; - - // scripts is true for back-compat - jQuery.merge(this, jQuery.parseHTML( - match[1], - context && context.nodeType ? context.ownerDocument || context : document, - true - )); - - // HANDLE: $(html, props) - if (rsingleTag.test(match[1]) && jQuery.isPlainObject(context)) { - for (match in context) { - // Properties of context are called as methods if possible - if (jQuery.isFunction(this[match])) { - this[match](context[match]); - - // ...and otherwise set as attributes - } else { - this.attr(match, context[match]); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById(match[2]); - - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - if (elem && elem.parentNode) { - // Handle the case where IE and Opera return items - // by name instead of ID - if (elem.id !== match[2]) { - return rootjQuery.find(selector); - } - - // Otherwise, we inject the element directly into the jQuery object - this.length = 1; - this[0] = elem; - } - - this.context = document; - this.selector = selector; - return this; - } - - // HANDLE: $(expr, $(...)) - } else if (!context || context.jquery) { - return (context || rootjQuery).find(selector); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor(context).find(selector); - } - - // HANDLE: $(DOMElement) - } else if (selector.nodeType) { - this.context = this[0] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if (jQuery.isFunction(selector)) { - return rootjQuery.ready(selector); - } - - if (selector.selector !== undefined) { - this.selector = selector.selector; - this.context = selector.context; - } - - return jQuery.makeArray(selector, this); - }, - - // Start with an empty selector - selector: "", - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function () { - return core_slice.call(this); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function (num) { - return num == null ? - - // Return a 'clean' array - this.toArray() : - - // Return just the object - (num < 0 ? this[this.length + num] : this[num]); - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function (elems) { - - // Build a new jQuery matched element set - var ret = jQuery.merge(this.constructor(), elems); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - ret.context = this.context; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - // (You can seed the arguments with an array of args, but this is - // only used internally.) - each: function (callback, args) { - return jQuery.each(this, callback, args); - }, - - ready: function (fn) { - // Add the callback - jQuery.ready.promise().done(fn); - - return this; - }, - - slice: function () { - return this.pushStack(core_slice.apply(this, arguments)); - }, - - first: function () { - return this.eq(0); - }, - - last: function () { - return this.eq(-1); - }, - - eq: function (i) { - var len = this.length, - j = +i + (i < 0 ? len : 0); - return this.pushStack(j >= 0 && j < len ? [this[j]] : []); - }, - - map: function (callback) { - return this.pushStack(jQuery.map(this, function (elem, i) { - return callback.call(elem, i, elem); - })); - }, - - end: function () { - return this.prevObject || this.constructor(null); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: core_push, - sort: [].sort, - splice: [].splice - }; - - // Give the init function the jQuery prototype for later instantiation - jQuery.fn.init.prototype = jQuery.fn; - - jQuery.extend = jQuery.fn.extend = function () { - var src, copyIsArray, copy, name, options, clone, - target = arguments[0] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if (typeof target === "boolean") { - deep = target; - target = arguments[1] || {}; - // skip the boolean and the target - i = 2; - } - - // Handle case when target is a string or something (possible in deep copy) - if (typeof target !== "object" && !jQuery.isFunction(target)) { - target = {}; - } - - // extend jQuery itself if only one argument is passed - if (length === i) { - target = this; - --i; - } - - for (; i < length; i++) { - // Only deal with non-null/undefined values - if ((options = arguments[i]) != null) { - // Extend the base object - for (name in options) { - src = target[name]; - copy = options[name]; - - // Prevent never-ending loop - if (target === copy) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if (deep && copy && (jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)))) { - if (copyIsArray) { - copyIsArray = false; - clone = src && jQuery.isArray(src) ? src : []; - - } else { - clone = src && jQuery.isPlainObject(src) ? src : {}; - } - - // Never move original objects, clone them - target[name] = jQuery.extend(deep, clone, copy); - - // Don't bring in undefined values - } else if (copy !== undefined) { - target[name] = copy; - } - } - } - } - - // Return the modified object - return target; - }; - - jQuery.extend({ - // Unique for each copy of jQuery on the page - // Non-digits removed to match rinlinejQuery - expando: "jQuery" + (core_version + Math.random()).replace(/\D/g, ""), - - noConflict: function (deep) { - if (window.$ === jQuery) { - window.$ = _$; - } - - if (deep && window.jQuery === jQuery) { - window.jQuery = _jQuery; - } - - return jQuery; - }, - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Hold (or release) the ready event - holdReady: function (hold) { - if (hold) { - jQuery.readyWait++; - } else { - jQuery.ready(true); - } - }, - - // Handle when the DOM is ready - ready: function (wait) { - - // Abort if there are pending holds or we're already ready - if (wait === true ? --jQuery.readyWait : jQuery.isReady) { - return; - } - - // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). - if (!document.body) { - return setTimeout(jQuery.ready); - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if (wait !== true && --jQuery.readyWait > 0) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith(document, [jQuery]); - - // Trigger any bound ready events - if (jQuery.fn.trigger) { - jQuery(document).trigger("ready").off("ready"); - } - }, - - // See test/unit/core.js for details concerning isFunction. - // Since version 1.3, DOM methods and functions like alert - // aren't supported. They return false on IE (#2968). - isFunction: function (obj) { - return jQuery.type(obj) === "function"; - }, - - isArray: Array.isArray || function (obj) { - return jQuery.type(obj) === "array"; - }, - - isWindow: function (obj) { - /* jshint eqeqeq: false */ - return obj != null && obj == obj.window; - }, - - isNumeric: function (obj) { - return !isNaN(parseFloat(obj)) && isFinite(obj); - }, - - type: function (obj) { - if (obj == null) { - return String(obj); - } - return typeof obj === "object" || typeof obj === "function" ? - class2type[core_toString.call(obj)] || "object" : - typeof obj; - }, - - isPlainObject: function (obj) { - var key; - - // Must be an Object. - // Because of IE, we also have to check the presence of the constructor property. - // Make sure that DOM nodes and window objects don't pass through, as well - if (!obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow(obj)) { - return false; - } - - try { - // Not own constructor property must be Object - if (obj.constructor && !core_hasOwn.call(obj, "constructor") && !core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf")) { - return false; - } - } catch (e) { - // IE8,9 Will throw exceptions on certain host objects #9897 - return false; - } - - // Support: IE<9 - // Handle iteration over inherited properties before own properties. - if (jQuery.support.ownLast) { - for (key in obj) { - return core_hasOwn.call(obj, key); - } - } - - // Own properties are enumerated firstly, so to speed up, - // if last one is own, then all properties are own. - for (key in obj) {} - - return key === undefined || core_hasOwn.call(obj, key); - }, - - isEmptyObject: function (obj) { - var name; - for (name in obj) { - return false; - } - return true; - }, - - error: function (msg) { - throw new Error(msg); - }, - - // data: string of html - // context (optional): If specified, the fragment will be created in this context, defaults to document - // keepScripts (optional): If true, will include scripts passed in the html string - parseHTML: function (data, context, keepScripts) { - if (!data || typeof data !== "string") { - return null; - } - if (typeof context === "boolean") { - keepScripts = context; - context = false; - } - context = context || document; - - var parsed = rsingleTag.exec(data), - scripts = !keepScripts && []; - - // Single tag - if (parsed) { - return [context.createElement(parsed[1])]; - } - - parsed = jQuery.buildFragment([data], context, scripts); - if (scripts) { - jQuery(scripts).remove(); - } - return jQuery.merge([], parsed.childNodes); - }, - - parseJSON: function (data) { - // Attempt to parse using the native JSON parser first - if (window.JSON && window.JSON.parse) { - return window.JSON.parse(data); - } - - if (data === null) { - return data; - } - - if (typeof data === "string") { - - // Make sure leading/trailing whitespace is removed (IE can't handle it) - data = jQuery.trim(data); - - if (data) { - // Make sure the incoming data is actual JSON - // Logic borrowed from http://json.org/json2.js - if (rvalidchars.test(data.replace(rvalidescape, "@") - .replace(rvalidtokens, "]") - .replace(rvalidbraces, ""))) { - - return (new Function("return " + data))(); - } - } - } - - jQuery.error("Invalid JSON: " + data); - }, - - // Cross-browser xml parsing - parseXML: function (data) { - var xml, tmp; - if (!data || typeof data !== "string") { - return null; - } - try { - if (window.DOMParser) { // Standard - tmp = new DOMParser(); - xml = tmp.parseFromString(data, "text/xml"); - } else { // IE - xml = new ActiveXObject("Microsoft.XMLDOM"); - xml.async = "false"; - xml.loadXML(data); - } - } catch (e) { - xml = undefined; - } - if (!xml || !xml.documentElement || xml.getElementsByTagName("parsererror").length) { - jQuery.error("Invalid XML: " + data); - } - return xml; - }, - - noop: function () {}, - - // Evaluates a script in a global context - // Workarounds based on findings by Jim Driscoll - // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context - globalEval: function (data) { - if (data && jQuery.trim(data)) { - // We use execScript on Internet Explorer - // We use an anonymous function so that context is window - // rather than jQuery in Firefox - (window.execScript || function (data) { - window["eval"].call(window, data); - })(data); - } - }, - - // Convert dashed to camelCase; used by the css and data modules - // Microsoft forgot to hump their vendor prefix (#9572) - camelCase: function (string) { - return string.replace(rmsPrefix, "ms-").replace(rdashAlpha, fcamelCase); - }, - - nodeName: function (elem, name) { - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - }, - - // args is for internal usage only - each: function (obj, callback, args) { - var value, - i = 0, - length = obj.length, - isArray = isArraylike(obj); - - if (args) { - if (isArray) { - for (; i < length; i++) { - value = callback.apply(obj[i], args); - - if (value === false) { - break; - } - } - } else { - for (i in obj) { - value = callback.apply(obj[i], args); - - if (value === false) { - break; - } - } - } - - // A special, fast, case for the most common use of each - } else { - if (isArray) { - for (; i < length; i++) { - value = callback.call(obj[i], i, obj[i]); - - if (value === false) { - break; - } - } - } else { - for (i in obj) { - value = callback.call(obj[i], i, obj[i]); - - if (value === false) { - break; - } - } - } - } - - return obj; - }, - - // Use native String.trim function wherever possible - trim: core_trim && !core_trim.call("\uFEFF\xA0") ? function (text) { - return text == null ? - "" : - core_trim.call(text); - } : - - // Otherwise use our own trimming functionality - - function (text) { - return text == null ? - "" : - (text + "").replace(rtrim, ""); - }, - - // results is for internal usage only - makeArray: function (arr, results) { - var ret = results || []; - - if (arr != null) { - if (isArraylike(Object(arr))) { - jQuery.merge(ret, - typeof arr === "string" ? - [arr] : arr - ); - } else { - core_push.call(ret, arr); - } - } - - return ret; - }, - - inArray: function (elem, arr, i) { - var len; - - if (arr) { - if (core_indexOf) { - return core_indexOf.call(arr, elem, i); - } - - len = arr.length; - i = i ? i < 0 ? Math.max(0, len + i) : i : 0; - - for (; i < len; i++) { - // Skip accessing in sparse arrays - if (i in arr && arr[i] === elem) { - return i; - } - } - } - - return -1; - }, - - merge: function (first, second) { - var l = second.length, - i = first.length, - j = 0; - - if (typeof l === "number") { - for (; j < l; j++) { - first[i++] = second[j]; - } - } else { - while (second[j] !== undefined) { - first[i++] = second[j++]; - } - } - - first.length = i; - - return first; - }, - - grep: function (elems, callback, inv) { - var retVal, - ret = [], - i = 0, - length = elems.length; - inv = !! inv; - - // Go through the array, only saving the items - // that pass the validator function - for (; i < length; i++) { - retVal = !! callback(elems[i], i); - if (inv !== retVal) { - ret.push(elems[i]); - } - } - - return ret; - }, - - // arg is for internal usage only - map: function (elems, callback, arg) { - var value, - i = 0, - length = elems.length, - isArray = isArraylike(elems), - ret = []; - - // Go through the array, translating each of the items to their - if (isArray) { - for (; i < length; i++) { - value = callback(elems[i], i, arg); - - if (value != null) { - ret[ret.length] = value; - } - } - - // Go through every key on the object, - } else { - for (i in elems) { - value = callback(elems[i], i, arg); - - if (value != null) { - ret[ret.length] = value; - } - } - } - - // Flatten any nested arrays - return core_concat.apply([], ret); - }, - - // A global GUID counter for objects - guid: 1, - - // Bind a function to a context, optionally partially applying any - // arguments. - proxy: function (fn, context) { - var args, proxy, tmp; - - if (typeof context === "string") { - tmp = fn[context]; - context = fn; - fn = tmp; - } - - // Quick check to determine if target is callable, in the spec - // this throws a TypeError, but we will just return undefined. - if (!jQuery.isFunction(fn)) { - return undefined; - } - - // Simulated bind - args = core_slice.call(arguments, 2); - proxy = function () { - return fn.apply(context || this, args.concat(core_slice.call(arguments))); - }; - - // Set the guid of unique handler to the same of original handler, so it can be removed - proxy.guid = fn.guid = fn.guid || jQuery.guid++; - - return proxy; - }, - - // Multifunctional method to get and set values of a collection - // The value/s can optionally be executed if it's a function - access: function (elems, fn, key, value, chainable, emptyGet, raw) { - var i = 0, - length = elems.length, - bulk = key == null; - - // Sets many values - if (jQuery.type(key) === "object") { - chainable = true; - for (i in key) { - jQuery.access(elems, fn, i, key[i], true, emptyGet, raw); - } - - // Sets one value - } else if (value !== undefined) { - chainable = true; - - if (!jQuery.isFunction(value)) { - raw = true; - } - - if (bulk) { - // Bulk operations run against the entire set - if (raw) { - fn.call(elems, value); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function (elem, key, value) { - return bulk.call(jQuery(elem), value); - }; - } - } - - if (fn) { - for (; i < length; i++) { - fn(elems[i], key, raw ? value : value.call(elems[i], i, fn(elems[i], key))); - } - } - } - - return chainable ? - elems : - - // Gets - bulk ? - fn.call(elems) : - length ? fn(elems[0], key) : emptyGet; - }, - - now: function () { - return (new Date()).getTime(); - }, - - // A method for quickly swapping in/out CSS properties to get correct calculations. - // Note: this method belongs to the css module but it's needed here for the support module. - // If support gets modularized, this method should be moved back to the css module. - swap: function (elem, options, callback, args) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for (name in options) { - old[name] = elem.style[name]; - elem.style[name] = options[name]; - } - - ret = callback.apply(elem, args || []); - - // Revert the old values - for (name in options) { - elem.style[name] = old[name]; - } - - return ret; - } - }); - - jQuery.ready.promise = function (obj) { - if (!readyList) { - - readyList = jQuery.Deferred(); - - // Catch cases where $(document).ready() is called after the browser event has already occurred. - // we once tried to use readyState "interactive" here, but it caused issues like the one - // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 - if (document.readyState === "complete") { - // Handle it asynchronously to allow scripts the opportunity to delay ready - setTimeout(jQuery.ready); - - // Standards-based browsers support DOMContentLoaded - } else if (document.addEventListener) { - // Use the handy event callback - document.addEventListener("DOMContentLoaded", completed, false); - - // A fallback to window.onload, that will always work - window.addEventListener("load", completed, false); - - // If IE event model is used - } else { - // Ensure firing before onload, maybe late but safe also for iframes - document.attachEvent("onreadystatechange", completed); - - // A fallback to window.onload, that will always work - window.attachEvent("onload", completed); - - // If IE and not a frame - // continually check to see if the document is ready - var top = false; - - try { - top = window.frameElement == null && document.documentElement; - } catch (e) {} - - if (top && top.doScroll) { - (function doScrollCheck() { - if (!jQuery.isReady) { - - try { - // Use the trick by Diego Perini - // http://javascript.nwbox.com/IEContentLoaded/ - top.doScroll("left"); - } catch (e) { - return setTimeout(doScrollCheck, 50); - } - - // detach all dom ready events - detach(); - - // and execute any waiting functions - jQuery.ready(); - } - })(); - } - } - } - return readyList.promise(obj); - }; - - // Populate the class2type map - jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function (i, name) { - class2type["[object " + name + "]"] = name.toLowerCase(); - }); - - function isArraylike(obj) { - var length = obj.length, - type = jQuery.type(obj); - - if (jQuery.isWindow(obj)) { - return false; - } - - if (obj.nodeType === 1 && length) { - return true; - } - - return type === "array" || type !== "function" && - (length === 0 || - typeof length === "number" && length > 0 && (length - 1) in obj); - } - - // All jQuery objects should point back to these - rootjQuery = jQuery(document); - /*! - * Sizzle CSS Selector Engine v1.10.2 - * http://sizzlejs.com/ - * - * Copyright 2013 jQuery Foundation, Inc. and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2013-07-03 - */ - (function (window, undefined) { - - var i, - support, - cachedruns, - Expr, - getText, - isXML, - compile, - outermostContext, - sortInput, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + -(new Date()), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - hasDuplicate = false, - sortOrder = function (a, b) { - if (a === b) { - hasDuplicate = true; - return 0; - } - return 0; - }, - - // General-purpose constants - strundefined = typeof undefined, - MAX_NEGATIVE = 1 << 31, - - // Instance methods - hasOwn = ({}).hasOwnProperty, - arr = [], - pop = arr.pop, - push_native = arr.push, - push = arr.push, - slice = arr.slice, - // Use a stripped-down indexOf if we can't use a native one - indexOf = arr.indexOf || function (elem) { - var i = 0, - len = this.length; - for (; i < len; i++) { - if (this[i] === elem) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - // http://www.w3.org/TR/css3-syntax/#characters - characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", - - // Loosely modeled on CSS identifier characters - // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors - // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier - identifier = characterEncoding.replace("w", "w#"), - - // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace + - "*(?:([*^$|!~]?=)" + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]", - - // Prefer arguments quoted, - // then not containing pseudos/brackets, - // then attribute selectors/non-parenthetical expressions, - // then anything else - // These preferences are here to reduce the number of selectors - // needing tokenize in the PSEUDO preFilter - pseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace(3, 8) + ")*)|.*)\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rtrim = new RegExp("^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g"), - - rcomma = new RegExp("^" + whitespace + "*," + whitespace + "*"), - rcombinators = new RegExp("^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*"), - - rsibling = new RegExp(whitespace + "*[+~]"), - rattributeQuotes = new RegExp("=" + whitespace + "*([^\\]'\"]*)" + whitespace + "*\\]", "g"), - - rpseudo = new RegExp(pseudos), - ridentifier = new RegExp("^" + identifier + "$"), - - matchExpr = { - "ID": new RegExp("^#(" + characterEncoding + ")"), - "CLASS": new RegExp("^\\.(" + characterEncoding + ")"), - "TAG": new RegExp("^(" + characterEncoding.replace("w", "w*") + ")"), - "ATTR": new RegExp("^" + attributes), - "PSEUDO": new RegExp("^" + pseudos), - "CHILD": new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + - "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + - "*(\\d+)|))" + whitespace + "*\\)|)", "i"), - "bool": new RegExp("^(?:" + booleans + ")$", "i"), - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp("^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + - whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i") - }, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rescape = /'|\\/g, - - // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp("\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig"), - funescape = function (_, escaped, escapedWhitespace) { - var high = "0x" + escaped - 0x10000; - // NaN means non-codepoint - // Support: Firefox - // Workaround erroneous numeric interpretation of +"0x" - return high !== high || escapedWhitespace ? - escaped : - // BMP codepoint - high < 0 ? - String.fromCharCode(high + 0x10000) : - // Supplemental Plane codepoint (surrogate pair) - String.fromCharCode(high >> 10 | 0xD800, high & 0x3FF | 0xDC00); - }; - - // Optimize for push.apply( _, NodeList ) - try { - push.apply( - (arr = slice.call(preferredDoc.childNodes)), - preferredDoc.childNodes - ); - // Support: Android<4.0 - // Detect silently failing push.apply - arr[preferredDoc.childNodes.length].nodeType; - } catch (e) { - push = { - apply: arr.length ? - - // Leverage slice if possible - - function (target, els) { - push_native.apply(target, slice.call(els)); - } : - - // Support: IE<9 - // Otherwise append directly - - function (target, els) { - var j = target.length, - i = 0; - // Can't trust NodeList.length - while ((target[j++] = els[i++])) {} - target.length = j - 1; - } - }; - } - - function Sizzle(selector, context, results, seed) { - var match, elem, m, nodeType, - // QSA vars - i, groups, old, nid, newContext, newSelector; - - if ((context ? context.ownerDocument || context : preferredDoc) !== document) { - setDocument(context); - } - - context = context || document; - results = results || []; - - if (!selector || typeof selector !== "string") { - return results; - } - - if ((nodeType = context.nodeType) !== 1 && nodeType !== 9) { - return []; - } - - if (documentIsHTML && !seed) { - - // Shortcuts - if ((match = rquickExpr.exec(selector))) { - // Speed-up: Sizzle("#ID") - if ((m = match[1])) { - if (nodeType === 9) { - elem = context.getElementById(m); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - if (elem && elem.parentNode) { - // Handle the case where IE, Opera, and Webkit return items - // by name instead of ID - if (elem.id === m) { - results.push(elem); - return results; - } - } else { - return results; - } - } else { - // Context is not a document - if (context.ownerDocument && (elem = context.ownerDocument.getElementById(m)) && - contains(context, elem) && elem.id === m) { - results.push(elem); - return results; - } - } - - // Speed-up: Sizzle("TAG") - } else if (match[2]) { - push.apply(results, context.getElementsByTagName(selector)); - return results; - - // Speed-up: Sizzle(".CLASS") - } else if ((m = match[3]) && support.getElementsByClassName && context.getElementsByClassName) { - push.apply(results, context.getElementsByClassName(m)); - return results; - } - } - - // QSA path - if (support.qsa && (!rbuggyQSA || !rbuggyQSA.test(selector))) { - nid = old = expando; - newContext = context; - newSelector = nodeType === 9 && selector; - - // qSA works strangely on Element-rooted queries - // We can work around this by specifying an extra ID on the root - // and working up from there (Thanks to Andrew Dupont for the technique) - // IE 8 doesn't work on object elements - if (nodeType === 1 && context.nodeName.toLowerCase() !== "object") { - groups = tokenize(selector); - - if ((old = context.getAttribute("id"))) { - nid = old.replace(rescape, "\\$&"); - } else { - context.setAttribute("id", nid); - } - nid = "[id='" + nid + "'] "; - - i = groups.length; - while (i--) { - groups[i] = nid + toSelector(groups[i]); - } - newContext = rsibling.test(selector) && context.parentNode || context; - newSelector = groups.join(","); - } - - if (newSelector) { - try { - push.apply(results, - newContext.querySelectorAll(newSelector) - ); - return results; - } catch (qsaError) {} finally { - if (!old) { - context.removeAttribute("id"); - } - } - } - } - } - - // All others - return select(selector.replace(rtrim, "$1"), context, results, seed); - } - - /** - * Create key-value caches of limited size - * @returns {Function(string, Object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ - - function createCache() { - var keys = []; - - function cache(key, value) { - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if (keys.push(key += " ") > Expr.cacheLength) { - // Only keep the most recent entries - delete cache[keys.shift()]; - } - return (cache[key] = value); - } - return cache; - } - - /** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ - - function markFunction(fn) { - fn[expando] = true; - return fn; - } - - /** - * Support testing using an element - * @param {Function} fn Passed the created div and expects a boolean result - */ - - function assert(fn) { - var div = document.createElement("div"); - - try { - return !!fn(div); - } catch (e) { - return false; - } finally { - // Remove from its parent by default - if (div.parentNode) { - div.parentNode.removeChild(div); - } - // release memory in IE - div = null; - } - } - - /** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ - - function addHandle(attrs, handler) { - var arr = attrs.split("|"), - i = attrs.length; - - while (i--) { - Expr.attrHandle[arr[i]] = handler; - } - } - - /** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ - - function siblingCheck(a, b) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - (~b.sourceIndex || MAX_NEGATIVE) - - (~a.sourceIndex || MAX_NEGATIVE); - - // Use IE sourceIndex if available on both nodes - if (diff) { - return diff; - } - - // Check if b follows a - if (cur) { - while ((cur = cur.nextSibling)) { - if (cur === b) { - return -1; - } - } - } - - return a ? 1 : -1; - } - - /** - * Returns a function to use in pseudos for input types - * @param {String} type - */ - - function createInputPseudo(type) { - return function (elem) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; - } - - /** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ - - function createButtonPseudo(type) { - return function (elem) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && elem.type === type; - }; - } - - /** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ - - function createPositionalPseudo(fn) { - return markFunction(function (argument) { - argument = +argument; - return markFunction(function (seed, matches) { - var j, - matchIndexes = fn([], seed.length, argument), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while (i--) { - if (seed[(j = matchIndexes[i])]) { - seed[j] = !(matches[j] = seed[j]); - } - } - }); - }); - } - - /** - * Detect xml - * @param {Element|Object} elem An element or a document - */ - isXML = Sizzle.isXML = function (elem) { - // documentElement is verified for cases where it doesn't yet exist - // (such as loading iframes in IE - #4833) - var documentElement = elem && (elem.ownerDocument || elem).documentElement; - return documentElement ? documentElement.nodeName !== "HTML" : false; - }; - - // Expose support vars for convenience - support = Sizzle.support = {}; - - /** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ - setDocument = Sizzle.setDocument = function (node) { - var doc = node ? node.ownerDocument || node : preferredDoc, - parent = doc.defaultView; - - // If no document and documentElement is available, return - if (doc === document || doc.nodeType !== 9 || !doc.documentElement) { - return document; - } - - // Set our document - document = doc; - docElem = doc.documentElement; - - // Support tests - documentIsHTML = !isXML(doc); - - // Support: IE>8 - // If iframe document is assigned to "document" variable and if iframe has been reloaded, - // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936 - // IE6-8 do not support the defaultView property so parent will be undefined - if (parent && parent.attachEvent && parent !== parent.top) { - parent.attachEvent("onbeforeunload", function () { - setDocument(); - }); - } - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans) - support.attributes = assert(function (div) { - div.className = "i"; - return !div.getAttribute("className"); - }); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert(function (div) { - div.appendChild(doc.createComment("")); - return !div.getElementsByTagName("*").length; - }); - - // Check if getElementsByClassName can be trusted - support.getElementsByClassName = assert(function (div) { - div.innerHTML = "
    "; - - // Support: Safari<4 - // Catch class over-caching - div.firstChild.className = "i"; - // Support: Opera<10 - // Catch gEBCN failure to find non-leading classes - return div.getElementsByClassName("i").length === 2; - }); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert(function (div) { - docElem.appendChild(div).id = expando; - return !doc.getElementsByName || !doc.getElementsByName(expando).length; - }); - - // ID find and filter - if (support.getById) { - Expr.find["ID"] = function (id, context) { - if (typeof context.getElementById !== strundefined && documentIsHTML) { - var m = context.getElementById(id); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - return m && m.parentNode ? [m] : []; - } - }; - Expr.filter["ID"] = function (id) { - var attrId = id.replace(runescape, funescape); - return function (elem) { - return elem.getAttribute("id") === attrId; - }; - }; - } else { - // Support: IE6/7 - // getElementById is not reliable as a find shortcut - delete Expr.find["ID"]; - - Expr.filter["ID"] = function (id) { - var attrId = id.replace(runescape, funescape); - return function (elem) { - var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id"); - return node && node.value === attrId; - }; - }; - } - - // Tag - Expr.find["TAG"] = support.getElementsByTagName ? - function (tag, context) { - if (typeof context.getElementsByTagName !== strundefined) { - return context.getElementsByTagName(tag); - } - } : - function (tag, context) { - var elem, - tmp = [], - i = 0, - results = context.getElementsByTagName(tag); - - // Filter out possible comments - if (tag === "*") { - while ((elem = results[i++])) { - if (elem.nodeType === 1) { - tmp.push(elem); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find["CLASS"] = support.getElementsByClassName && function (className, context) { - if (typeof context.getElementsByClassName !== strundefined && documentIsHTML) { - return context.getElementsByClassName(className); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See http://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ((support.qsa = rnative.test(doc.querySelectorAll))) { - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert(function (div) { - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // http://bugs.jquery.com/ticket/12359 - div.innerHTML = ""; - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if (!div.querySelectorAll("[selected]").length) { - rbuggyQSA.push("\\[" + whitespace + "*(?:value|" + booleans + ")"); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if (!div.querySelectorAll(":checked").length) { - rbuggyQSA.push(":checked"); - } - }); - - assert(function (div) { - - // Support: Opera 10-12/IE8 - // ^= $= *= and empty values - // Should not select anything - // Support: Windows 8 Native Apps - // The type attribute is restricted during .innerHTML assignment - var input = doc.createElement("input"); - input.setAttribute("type", "hidden"); - div.appendChild(input).setAttribute("t", ""); - - if (div.querySelectorAll("[t^='']").length) { - rbuggyQSA.push("[*^$]=" + whitespace + "*(?:''|\"\")"); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if (!div.querySelectorAll(":enabled").length) { - rbuggyQSA.push(":enabled", ":disabled"); - } - - // Opera 10-11 does not throw on post-comma invalid pseudos - div.querySelectorAll("*,:x"); - rbuggyQSA.push(",.*:"); - }); - } - - if ((support.matchesSelector = rnative.test((matches = docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector)))) { - - assert(function (div) { - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call(div, "div"); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call(div, "[s!='']:x"); - rbuggyMatches.push("!=", pseudos); - }); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp(rbuggyQSA.join("|")); - rbuggyMatches = rbuggyMatches.length && new RegExp(rbuggyMatches.join("|")); - - /* Contains - ---------------------------------------------------------------------- */ - - // Element contains another - // Purposefully does not implement inclusive descendent - // As in, an element does not contain itself - contains = rnative.test(docElem.contains) || docElem.compareDocumentPosition ? - function (a, b) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !! (bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains(bup) : - a.compareDocumentPosition && a.compareDocumentPosition(bup) & 16 - )); - } : - function (a, b) { - if (b) { - while ((b = b.parentNode)) { - if (b === a) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = docElem.compareDocumentPosition ? - function (a, b) { - - // Flag for duplicate removal - if (a === b) { - hasDuplicate = true; - return 0; - } - - var compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition(b); - - if (compare) { - // Disconnected nodes - if (compare & 1 || - (!support.sortDetached && b.compareDocumentPosition(a) === compare)) { - - // Choose the first element that is related to our preferred document - if (a === doc || contains(preferredDoc, a)) { - return -1; - } - if (b === doc || contains(preferredDoc, b)) { - return 1; - } - - // Maintain original order - return sortInput ? - (indexOf.call(sortInput, a) - indexOf.call(sortInput, b)) : - 0; - } - - return compare & 4 ? -1 : 1; - } - - // Not directly comparable, sort on existence of method - return a.compareDocumentPosition ? -1 : 1; - } : - function (a, b) { - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [a], - bp = [b]; - - // Exit early if the nodes are identical - if (a === b) { - hasDuplicate = true; - return 0; - - // Parentless nodes are either documents or disconnected - } else if (!aup || !bup) { - return a === doc ? -1 : - b === doc ? 1 : - aup ? -1 : - bup ? 1 : - sortInput ? - (indexOf.call(sortInput, a) - indexOf.call(sortInput, b)) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if (aup === bup) { - return siblingCheck(a, b); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ((cur = cur.parentNode)) { - ap.unshift(cur); - } - cur = b; - while ((cur = cur.parentNode)) { - bp.unshift(cur); - } - - // Walk down the tree looking for a discrepancy - while (ap[i] === bp[i]) { - i++; - } - - return i ? - // Do a sibling check if the nodes have a common ancestor - siblingCheck(ap[i], bp[i]) : - - // Otherwise nodes in our document sort first - ap[i] === preferredDoc ? -1 : - bp[i] === preferredDoc ? 1 : - 0; - }; - - return doc; - }; - - Sizzle.matches = function (expr, elements) { - return Sizzle(expr, null, null, elements); - }; - - Sizzle.matchesSelector = function (elem, expr) { - // Set document vars if needed - if ((elem.ownerDocument || elem) !== document) { - setDocument(elem); - } - - // Make sure that attribute selectors are quoted - expr = expr.replace(rattributeQuotes, "='$1']"); - - if (support.matchesSelector && documentIsHTML && - (!rbuggyMatches || !rbuggyMatches.test(expr)) && - (!rbuggyQSA || !rbuggyQSA.test(expr))) { - - try { - var ret = matches.call(elem, expr); - - // IE 9's matchesSelector returns false on disconnected nodes - if (ret || support.disconnectedMatch || - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11) { - return ret; - } - } catch (e) {} - } - - return Sizzle(expr, document, null, [elem]).length > 0; - }; - - Sizzle.contains = function (context, elem) { - // Set document vars if needed - if ((context.ownerDocument || context) !== document) { - setDocument(context); - } - return contains(context, elem); - }; - - Sizzle.attr = function (elem, name) { - // Set document vars if needed - if ((elem.ownerDocument || elem) !== document) { - setDocument(elem); - } - - var fn = Expr.attrHandle[name.toLowerCase()], - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call(Expr.attrHandle, name.toLowerCase()) ? - fn(elem, name, !documentIsHTML) : - undefined; - - return val === undefined ? - support.attributes || !documentIsHTML ? - elem.getAttribute(name) : - (val = elem.getAttributeNode(name)) && val.specified ? - val.value : - null : - val; - }; - - Sizzle.error = function (msg) { - throw new Error("Syntax error, unrecognized expression: " + msg); - }; - - /** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ - Sizzle.uniqueSort = function (results) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice(0); - results.sort(sortOrder); - - if (hasDuplicate) { - while ((elem = results[i++])) { - if (elem === results[i]) { - j = duplicates.push(i); - } - } - while (j--) { - results.splice(duplicates[j], 1); - } - } - - return results; - }; - - /** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ - getText = Sizzle.getText = function (elem) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if (!nodeType) { - // If no nodeType, this is expected to be an array - for (; - (node = elem[i]); i++) { - // Do not traverse comment nodes - ret += getText(node); - } - } else if (nodeType === 1 || nodeType === 9 || nodeType === 11) { - // Use textContent for elements - // innerText usage removed for consistency of new lines (see #11153) - if (typeof elem.textContent === "string") { - return elem.textContent; - } else { - // Traverse its children - for (elem = elem.firstChild; elem; elem = elem.nextSibling) { - ret += getText(elem); - } - } - } else if (nodeType === 3 || nodeType === 4) { - return elem.nodeValue; - } - // Do not include comment or processing instruction nodes - - return ret; - }; - - Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { - dir: "parentNode", - first: true - }, - " ": { - dir: "parentNode" - }, - "+": { - dir: "previousSibling", - first: true - }, - "~": { - dir: "previousSibling" - } - }, - - preFilter: { - "ATTR": function (match) { - match[1] = match[1].replace(runescape, funescape); - - // Move the given value to match[3] whether quoted or unquoted - match[3] = (match[4] || match[5] || "").replace(runescape, funescape); - - if (match[2] === "~=") { - match[3] = " " + match[3] + " "; - } - - return match.slice(0, 4); - }, - - "CHILD": function (match) { - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[1] = match[1].toLowerCase(); - - if (match[1].slice(0, 3) === "nth") { - // nth-* requires argument - if (!match[3]) { - Sizzle.error(match[0]); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[4] = +(match[4] ? match[5] + (match[6] || 1) : 2 * (match[3] === "even" || match[3] === "odd")); - match[5] = +((match[7] + match[8]) || match[3] === "odd"); - - // other types prohibit arguments - } else if (match[3]) { - Sizzle.error(match[0]); - } - - return match; - }, - - "PSEUDO": function (match) { - var excess, - unquoted = !match[5] && match[2]; - - if (matchExpr["CHILD"].test(match[0])) { - return null; - } - - // Accept quoted arguments as-is - if (match[3] && match[4] !== undefined) { - match[2] = match[4]; - - // Strip excess characters from unquoted arguments - } else if (unquoted && rpseudo.test(unquoted) && - // Get excess from tokenize (recursively) - (excess = tokenize(unquoted, true)) && - // advance to the next closing parenthesis - (excess = unquoted.indexOf(")", unquoted.length - excess) - unquoted.length)) { - - // excess is a negative index - match[0] = match[0].slice(0, excess); - match[2] = unquoted.slice(0, excess); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice(0, 3); - } - }, - - filter: { - - "TAG": function (nodeNameSelector) { - var nodeName = nodeNameSelector.replace(runescape, funescape).toLowerCase(); - return nodeNameSelector === "*" ? - function () { - return true; - } : - function (elem) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function (className) { - var pattern = classCache[className + " "]; - - return pattern || - (pattern = new RegExp("(^|" + whitespace + ")" + className + "(" + whitespace + "|$)")) && - classCache(className, function (elem) { - return pattern.test(typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || ""); - }); - }, - - "ATTR": function (name, operator, check) { - return function (elem) { - var result = Sizzle.attr(elem, name); - - if (result == null) { - return operator === "!="; - } - if (!operator) { - return true; - } - - result += ""; - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf(check) === 0 : - operator === "*=" ? check && result.indexOf(check) > -1 : - operator === "$=" ? check && result.slice(-check.length) === check : - operator === "~=" ? (" " + result + " ").indexOf(check) > -1 : - operator === "|=" ? result === check || result.slice(0, check.length + 1) === check + "-" : - false; - }; - }, - - "CHILD": function (type, what, argument, first, last) { - var simple = type.slice(0, 3) !== "nth", - forward = type.slice(-4) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - - function (elem) { - return !!elem.parentNode; - } : - - function (elem, context, xml) { - var cache, outerCache, node, diff, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType; - - if (parent) { - - // :(first|last|only)-(child|of-type) - if (simple) { - while (dir) { - node = elem; - while ((node = node[dir])) { - if (ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1) { - return false; - } - } - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [forward ? parent.firstChild : parent.lastChild]; - - // non-xml :nth-child(...) stores cache data on `parent` - if (forward && useCache) { - // Seek `elem` from a previously-cached index - outerCache = parent[expando] || (parent[expando] = {}); - cache = outerCache[type] || []; - nodeIndex = cache[0] === dirruns && cache[1]; - diff = cache[0] === dirruns && cache[2]; - node = nodeIndex && parent.childNodes[nodeIndex]; - - while ((node = ++nodeIndex && node && node[dir] || - - // Fallback to seeking `elem` from the start - (diff = nodeIndex = 0) || start.pop())) { - - // When found, cache indexes on `parent` and break - if (node.nodeType === 1 && ++diff && node === elem) { - outerCache[type] = [dirruns, nodeIndex, diff]; - break; - } - } - - // Use previously-cached element index if available - } else if (useCache && (cache = (elem[expando] || (elem[expando] = {}))[type]) && cache[0] === dirruns) { - diff = cache[1]; - - // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...) - } else { - // Use the same loop as above to seek `elem` from the start - while ((node = ++nodeIndex && node && node[dir] || - (diff = nodeIndex = 0) || start.pop())) { - - if ((ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1) && ++diff) { - // Cache the index of each encountered element - if (useCache) { - (node[expando] || (node[expando] = {}))[type] = [dirruns, diff]; - } - - if (node === elem) { - break; - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || (diff % first === 0 && diff / first >= 0); - } - }; - }, - - "PSEUDO": function (pseudo, argument) { - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[pseudo] || Expr.setFilters[pseudo.toLowerCase()] || - Sizzle.error("unsupported pseudo: " + pseudo); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if (fn[expando]) { - return fn(argument); - } - - // But maintain support for old signatures - if (fn.length > 1) { - args = [pseudo, pseudo, "", argument]; - return Expr.setFilters.hasOwnProperty(pseudo.toLowerCase()) ? - markFunction(function (seed, matches) { - var idx, - matched = fn(seed, argument), - i = matched.length; - while (i--) { - idx = indexOf.call(seed, matched[i]); - seed[idx] = !(matches[idx] = matched[i]); - } - }) : - function (elem) { - return fn(elem, 0, args); - }; - } - - return fn; - } - }, - - pseudos: { - // Potentially complex pseudos - "not": markFunction(function (selector) { - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile(selector.replace(rtrim, "$1")); - - return matcher[expando] ? - markFunction(function (seed, matches, context, xml) { - var elem, - unmatched = matcher(seed, null, xml, []), - i = seed.length; - - // Match elements unmatched by `matcher` - while (i--) { - if ((elem = unmatched[i])) { - seed[i] = !(matches[i] = elem); - } - } - }) : - function (elem, context, xml) { - input[0] = elem; - matcher(input, null, xml, results); - return !results.pop(); - }; - }), - - "has": markFunction(function (selector) { - return function (elem) { - return Sizzle(selector, elem).length > 0; - }; - }), - - "contains": markFunction(function (text) { - return function (elem) { - return (elem.textContent || elem.innerText || getText(elem)).indexOf(text) > -1; - }; - }), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction(function (lang) { - // lang value must be a valid identifier - if (!ridentifier.test(lang || "")) { - Sizzle.error("unsupported lang: " + lang); - } - lang = lang.replace(runescape, funescape).toLowerCase(); - return function (elem) { - var elemLang; - do { - if ((elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute("xml:lang") || elem.getAttribute("lang"))) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf(lang + "-") === 0; - } - } while ((elem = elem.parentNode) && elem.nodeType === 1); - return false; - }; - }), - - // Miscellaneous - "target": function (elem) { - var hash = window.location && window.location.hash; - return hash && hash.slice(1) === elem.id; - }, - - "root": function (elem) { - return elem === docElem; - }, - - "focus": function (elem) { - return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !! (elem.type || elem.href || ~elem.tabIndex); - }, - - // Boolean properties - "enabled": function (elem) { - return elem.disabled === false; - }, - - "disabled": function (elem) { - return elem.disabled === true; - }, - - "checked": function (elem) { - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return (nodeName === "input" && !! elem.checked) || (nodeName === "option" && !! elem.selected); - }, - - "selected": function (elem) { - // Accessing this property makes selected-by-default - // options in Safari work properly - if (elem.parentNode) { - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function (elem) { - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is only affected by element nodes and content nodes(including text(3), cdata(4)), - // not comment, processing instructions, or others - // Thanks to Diego Perini for the nodeName shortcut - // Greater than "@" means alpha characters (specifically not starting with "#" or "?") - for (elem = elem.firstChild; elem; elem = elem.nextSibling) { - if (elem.nodeName > "@" || elem.nodeType === 3 || elem.nodeType === 4) { - return false; - } - } - return true; - }, - - "parent": function (elem) { - return !Expr.pseudos["empty"](elem); - }, - - // Element/input types - "header": function (elem) { - return rheader.test(elem.nodeName); - }, - - "input": function (elem) { - return rinputs.test(elem.nodeName); - }, - - "button": function (elem) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function (elem) { - var attr; - // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) - // use getAttribute instead to test this case - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - ((attr = elem.getAttribute("type")) == null || attr.toLowerCase() === elem.type); - }, - - // Position-in-collection - "first": createPositionalPseudo(function () { - return [0]; - }), - - "last": createPositionalPseudo(function (matchIndexes, length) { - return [length - 1]; - }), - - "eq": createPositionalPseudo(function (matchIndexes, length, argument) { - return [argument < 0 ? argument + length : argument]; - }), - - "even": createPositionalPseudo(function (matchIndexes, length) { - var i = 0; - for (; i < length; i += 2) { - matchIndexes.push(i); - } - return matchIndexes; - }), - - "odd": createPositionalPseudo(function (matchIndexes, length) { - var i = 1; - for (; i < length; i += 2) { - matchIndexes.push(i); - } - return matchIndexes; - }), - - "lt": createPositionalPseudo(function (matchIndexes, length, argument) { - var i = argument < 0 ? argument + length : argument; - for (; --i >= 0;) { - matchIndexes.push(i); - } - return matchIndexes; - }), - - "gt": createPositionalPseudo(function (matchIndexes, length, argument) { - var i = argument < 0 ? argument + length : argument; - for (; ++i < length;) { - matchIndexes.push(i); - } - return matchIndexes; - }) - } - }; - - Expr.pseudos["nth"] = Expr.pseudos["eq"]; - - // Add button/input type pseudos - for (i in { - radio: true, - checkbox: true, - file: true, - password: true, - image: true - }) { - Expr.pseudos[i] = createInputPseudo(i); - } - for (i in { - submit: true, - reset: true - }) { - Expr.pseudos[i] = createButtonPseudo(i); - } - - // Easy API for creating new setFilters - - function setFilters() {} - setFilters.prototype = Expr.filters = Expr.pseudos; - Expr.setFilters = new setFilters(); - - function tokenize(selector, parseOnly) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[selector + " "]; - - if (cached) { - return parseOnly ? 0 : cached.slice(0); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while (soFar) { - - // Comma and first run - if (!matched || (match = rcomma.exec(soFar))) { - if (match) { - // Don't consume trailing commas as valid - soFar = soFar.slice(match[0].length) || soFar; - } - groups.push(tokens = []); - } - - matched = false; - - // Combinators - if ((match = rcombinators.exec(soFar))) { - matched = match.shift(); - tokens.push({ - value: matched, - // Cast descendant combinators to space - type: match[0].replace(rtrim, " ") - }); - soFar = soFar.slice(matched.length); - } - - // Filters - for (type in Expr.filter) { - if ((match = matchExpr[type].exec(soFar)) && (!preFilters[type] || - (match = preFilters[type](match)))) { - matched = match.shift(); - tokens.push({ - value: matched, - type: type, - matches: match - }); - soFar = soFar.slice(matched.length); - } - } - - if (!matched) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error(selector) : - // Cache the tokens - tokenCache(selector, groups).slice(0); - } - - function toSelector(tokens) { - var i = 0, - len = tokens.length, - selector = ""; - for (; i < len; i++) { - selector += tokens[i].value; - } - return selector; - } - - function addCombinator(matcher, combinator, base) { - var dir = combinator.dir, - checkNonElements = base && dir === "parentNode", - doneName = done++; - - return combinator.first ? - // Check against closest ancestor/preceding element - - function (elem, context, xml) { - while ((elem = elem[dir])) { - if (elem.nodeType === 1 || checkNonElements) { - return matcher(elem, context, xml); - } - } - } : - - // Check against all ancestor/preceding elements - - function (elem, context, xml) { - var data, cache, outerCache, - dirkey = dirruns + " " + doneName; - - // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching - if (xml) { - while ((elem = elem[dir])) { - if (elem.nodeType === 1 || checkNonElements) { - if (matcher(elem, context, xml)) { - return true; - } - } - } - } else { - while ((elem = elem[dir])) { - if (elem.nodeType === 1 || checkNonElements) { - outerCache = elem[expando] || (elem[expando] = {}); - if ((cache = outerCache[dir]) && cache[0] === dirkey) { - if ((data = cache[1]) === true || data === cachedruns) { - return data === true; - } - } else { - cache = outerCache[dir] = [dirkey]; - cache[1] = matcher(elem, context, xml) || cachedruns; - if (cache[1] === true) { - return true; - } - } - } - } - } - }; - } - - function elementMatcher(matchers) { - return matchers.length > 1 ? - function (elem, context, xml) { - var i = matchers.length; - while (i--) { - if (!matchers[i](elem, context, xml)) { - return false; - } - } - return true; - } : - matchers[0]; - } - - function condense(unmatched, map, filter, context, xml) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for (; i < len; i++) { - if ((elem = unmatched[i])) { - if (!filter || filter(elem, context, xml)) { - newUnmatched.push(elem); - if (mapped) { - map.push(i); - } - } - } - } - - return newUnmatched; - } - - function setMatcher(preFilter, selector, matcher, postFilter, postFinder, postSelector) { - if (postFilter && !postFilter[expando]) { - postFilter = setMatcher(postFilter); - } - if (postFinder && !postFinder[expando]) { - postFinder = setMatcher(postFinder, postSelector); - } - return markFunction(function (seed, results, context, xml) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts(selector || "*", context.nodeType ? [context] : context, []), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && (seed || !selector) ? - condense(elems, preMap, preFilter, context, xml) : - elems, - - matcherOut = matcher ? - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || (seed ? preFilter : preexisting || postFilter) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if (matcher) { - matcher(matcherIn, matcherOut, context, xml); - } - - // Apply postFilter - if (postFilter) { - temp = condense(matcherOut, postMap); - postFilter(temp, [], context, xml); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while (i--) { - if ((elem = temp[i])) { - matcherOut[postMap[i]] = !(matcherIn[postMap[i]] = elem); - } - } - } - - if (seed) { - if (postFinder || preFilter) { - if (postFinder) { - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while (i--) { - if ((elem = matcherOut[i])) { - // Restore matcherIn since elem is not yet a final match - temp.push((matcherIn[i] = elem)); - } - } - postFinder(null, (matcherOut = []), temp, xml); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while (i--) { - if ((elem = matcherOut[i]) && - (temp = postFinder ? indexOf.call(seed, elem) : preMap[i]) > -1) { - - seed[temp] = !(results[temp] = elem); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice(preexisting, matcherOut.length) : - matcherOut - ); - if (postFinder) { - postFinder(null, results, matcherOut, xml); - } else { - push.apply(results, matcherOut); - } - } - }); - } - - function matcherFromTokens(tokens) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[tokens[0].type], - implicitRelative = leadingRelative || Expr.relative[" "], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator(function (elem) { - return elem === checkContext; - }, implicitRelative, true), - matchAnyContext = addCombinator(function (elem) { - return indexOf.call(checkContext, elem) > -1; - }, implicitRelative, true), - matchers = [ - function (elem, context, xml) { - return (!leadingRelative && (xml || context !== outermostContext)) || ( - (checkContext = context).nodeType ? - matchContext(elem, context, xml) : - matchAnyContext(elem, context, xml)); - } - ]; - - for (; i < len; i++) { - if ((matcher = Expr.relative[tokens[i].type])) { - matchers = [addCombinator(elementMatcher(matchers), matcher)]; - } else { - matcher = Expr.filter[tokens[i].type].apply(null, tokens[i].matches); - - // Return special upon seeing a positional matcher - if (matcher[expando]) { - // Find the next relative operator (if any) for proper handling - j = ++i; - for (; j < len; j++) { - if (Expr.relative[tokens[j].type]) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher(matchers), - i > 1 && toSelector( - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens.slice(0, i - 1).concat({ - value: tokens[i - 2].type === " " ? "*" : "" - }) - ).replace(rtrim, "$1"), - matcher, - i < j && matcherFromTokens(tokens.slice(i, j)), - j < len && matcherFromTokens((tokens = tokens.slice(j))), - j < len && toSelector(tokens) - ); - } - matchers.push(matcher); - } - } - - return elementMatcher(matchers); - } - - function matcherFromGroupMatchers(elementMatchers, setMatchers) { - // A counter to specify which element is currently being matched - var matcherCachedRuns = 0, - bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function (seed, context, xml, results, expandContext) { - var elem, j, matcher, - setMatched = [], - matchedCount = 0, - i = "0", - unmatched = seed && [], - outermost = expandContext != null, - contextBackup = outermostContext, - // We must always have either seed elements or context - elems = seed || byElement && Expr.find["TAG"]("*", expandContext && context.parentNode || context), - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1); - - if (outermost) { - outermostContext = context !== document && context; - cachedruns = matcherCachedRuns; - } - - // Add elements passing elementMatchers directly to results - // Keep `i` a string if there are no elements so `matchedCount` will be "00" below - for (; - (elem = elems[i]) != null; i++) { - if (byElement && elem) { - j = 0; - while ((matcher = elementMatchers[j++])) { - if (matcher(elem, context, xml)) { - results.push(elem); - break; - } - } - if (outermost) { - dirruns = dirrunsUnique; - cachedruns = ++matcherCachedRuns; - } - } - - // Track unmatched elements for set filters - if (bySet) { - // They will have gone through all possible matchers - if ((elem = !matcher && elem)) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if (seed) { - unmatched.push(elem); - } - } - } - - // Apply set filters to unmatched elements - matchedCount += i; - if (bySet && i !== matchedCount) { - j = 0; - while ((matcher = setMatchers[j++])) { - matcher(unmatched, setMatched, context, xml); - } - - if (seed) { - // Reintegrate element matches to eliminate the need for sorting - if (matchedCount > 0) { - while (i--) { - if (!(unmatched[i] || setMatched[i])) { - setMatched[i] = pop.call(results); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense(setMatched); - } - - // Add matches to results - push.apply(results, setMatched); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if (outermost && !seed && setMatched.length > 0 && - (matchedCount + setMatchers.length) > 1) { - - Sizzle.uniqueSort(results); - } - } - - // Override manipulation of globals by nested matchers - if (outermost) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction(superMatcher) : - superMatcher; - } - - compile = Sizzle.compile = function (selector, group /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[selector + " "]; - - if (!cached) { - // Generate a function of recursive functions that can be used to check each element - if (!group) { - group = tokenize(selector); - } - i = group.length; - while (i--) { - cached = matcherFromTokens(group[i]); - if (cached[expando]) { - setMatchers.push(cached); - } else { - elementMatchers.push(cached); - } - } - - // Cache the compiled function - cached = compilerCache(selector, matcherFromGroupMatchers(elementMatchers, setMatchers)); - } - return cached; - }; - - function multipleContexts(selector, contexts, results) { - var i = 0, - len = contexts.length; - for (; i < len; i++) { - Sizzle(selector, contexts[i], results); - } - return results; - } - - function select(selector, context, results, seed) { - var i, tokens, token, type, find, - match = tokenize(selector); - - if (!seed) { - // Try to minimize operations if there is only one group - if (match.length === 1) { - - // Take a shortcut and set the context if the root selector is an ID - tokens = match[0] = match[0].slice(0); - if (tokens.length > 2 && (token = tokens[0]).type === "ID" && - support.getById && context.nodeType === 9 && documentIsHTML && - Expr.relative[tokens[1].type]) { - - context = (Expr.find["ID"](token.matches[0].replace(runescape, funescape), context) || [])[0]; - if (!context) { - return results; - } - selector = selector.slice(tokens.shift().value.length); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr["needsContext"].test(selector) ? 0 : tokens.length; - while (i--) { - token = tokens[i]; - - // Abort if we hit a combinator - if (Expr.relative[(type = token.type)]) { - break; - } - if ((find = Expr.find[type])) { - // Search, expanding context for leading sibling combinators - if ((seed = find( - token.matches[0].replace(runescape, funescape), - rsibling.test(tokens[0].type) && context.parentNode || context - ))) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice(i, 1); - selector = seed.length && toSelector(tokens); - if (!selector) { - push.apply(results, seed); - return results; - } - - break; - } - } - } - } - } - - // Compile and execute a filtering function - // Provide `match` to avoid retokenization if we modified the selector above - compile(selector, match)( - seed, - context, !documentIsHTML, - results, - rsibling.test(selector) - ); - return results; - } - - // One-time assignments - - // Sort stability - support.sortStable = expando.split("").sort(sortOrder).join("") === expando; - - // Support: Chrome<14 - // Always assume duplicates if they aren't passed to the comparison function - support.detectDuplicates = hasDuplicate; - - // Initialize against the default document - setDocument(); - - // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) - // Detached nodes confoundingly follow *each other* - support.sortDetached = assert(function (div1) { - // Should return 1, but returns 4 (following) - return div1.compareDocumentPosition(document.createElement("div")) & 1; - }); - - // Support: IE<8 - // Prevent attribute/property "interpolation" - // http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx - if (!assert(function (div) { - div.innerHTML = "
    "; - return div.firstChild.getAttribute("href") === "#"; - })) { - addHandle("type|href|height|width", function (elem, name, isXML) { - if (!isXML) { - return elem.getAttribute(name, name.toLowerCase() === "type" ? 1 : 2); - } - }); - } - - // Support: IE<9 - // Use defaultValue in place of getAttribute("value") - if (!support.attributes || !assert(function (div) { - div.innerHTML = ""; - div.firstChild.setAttribute("value", ""); - return div.firstChild.getAttribute("value") === ""; - })) { - addHandle("value", function (elem, name, isXML) { - if (!isXML && elem.nodeName.toLowerCase() === "input") { - return elem.defaultValue; - } - }); - } - - // Support: IE<9 - // Use getAttributeNode to fetch booleans when getAttribute lies - if (!assert(function (div) { - return div.getAttribute("disabled") == null; - })) { - addHandle(booleans, function (elem, name, isXML) { - var val; - if (!isXML) { - return (val = elem.getAttributeNode(name)) && val.specified ? - val.value : - elem[name] === true ? name.toLowerCase() : null; - } - }); - } - - jQuery.find = Sizzle; - jQuery.expr = Sizzle.selectors; - jQuery.expr[":"] = jQuery.expr.pseudos; - jQuery.unique = Sizzle.uniqueSort; - jQuery.text = Sizzle.getText; - jQuery.isXMLDoc = Sizzle.isXML; - jQuery.contains = Sizzle.contains; - - - })(window); - // String to Object options format cache - var optionsCache = {}; - - // Convert String-formatted options into Object-formatted ones and store in cache - - function createOptions(options) { - var object = optionsCache[options] = {}; - jQuery.each(options.match(core_rnotwhite) || [], function (_, flag) { - object[flag] = true; - }); - return object; - } - - /* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ - jQuery.Callbacks = function (options) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - (optionsCache[options] || createOptions(options)) : - jQuery.extend({}, options); - - var // Flag to know if list is currently firing - firing, - // Last fire value (for non-forgettable lists) - memory, - // Flag to know if list was already fired - fired, - // End of the loop when firing - firingLength, - // Index of currently firing callback (modified by remove if needed) - firingIndex, - // First callback to fire (used internally by add and fireWith) - firingStart, - // Actual callback list - list = [], - // Stack of fire calls for repeatable lists - stack = !options.once && [], - // Fire callbacks - fire = function (data) { - memory = options.memory && data; - fired = true; - firingIndex = firingStart || 0; - firingStart = 0; - firingLength = list.length; - firing = true; - for (; list && firingIndex < firingLength; firingIndex++) { - if (list[firingIndex].apply(data[0], data[1]) === false && options.stopOnFalse) { - memory = false; // To prevent further calls using add - break; - } - } - firing = false; - if (list) { - if (stack) { - if (stack.length) { - fire(stack.shift()); - } - } else if (memory) { - list = []; - } else { - self.disable(); - } - } - }, - // Actual Callbacks object - self = { - // Add a callback or a collection of callbacks to the list - add: function () { - if (list) { - // First, we save the current length - var start = list.length; - (function add(args) { - jQuery.each(args, function (_, arg) { - var type = jQuery.type(arg); - if (type === "function") { - if (!options.unique || !self.has(arg)) { - list.push(arg); - } - } else if (arg && arg.length && type !== "string") { - // Inspect recursively - add(arg); - } - }); - })(arguments); - // Do we need to add the callbacks to the - // current firing batch? - if (firing) { - firingLength = list.length; - // With memory, if we're not firing then - // we should call right away - } else if (memory) { - firingStart = start; - fire(memory); - } - } - return this; - }, - // Remove a callback from the list - remove: function () { - if (list) { - jQuery.each(arguments, function (_, arg) { - var index; - while ((index = jQuery.inArray(arg, list, index)) > -1) { - list.splice(index, 1); - // Handle firing indexes - if (firing) { - if (index <= firingLength) { - firingLength--; - } - if (index <= firingIndex) { - firingIndex--; - } - } - } - }); - } - return this; - }, - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function (fn) { - return fn ? jQuery.inArray(fn, list) > -1 : !! (list && list.length); - }, - // Remove all callbacks from the list - empty: function () { - list = []; - firingLength = 0; - return this; - }, - // Have the list do nothing anymore - disable: function () { - list = stack = memory = undefined; - return this; - }, - // Is it disabled? - disabled: function () { - return !list; - }, - // Lock the list in its current state - lock: function () { - stack = undefined; - if (!memory) { - self.disable(); - } - return this; - }, - // Is it locked? - locked: function () { - return !stack; - }, - // Call all callbacks with the given context and arguments - fireWith: function (context, args) { - if (list && (!fired || stack)) { - args = args || []; - args = [context, args.slice ? args.slice() : args]; - if (firing) { - stack.push(args); - } else { - fire(args); - } - } - return this; - }, - // Call all the callbacks with the given arguments - fire: function () { - self.fireWith(this, arguments); - return this; - }, - // To know if the callbacks have already been called at least once - fired: function () { - return !!fired; - } - }; - - return self; - }; - jQuery.extend({ - - Deferred: function (func) { - var tuples = [ - // action, add listener, listener list, final state - ["resolve", "done", jQuery.Callbacks("once memory"), "resolved"], - ["reject", "fail", jQuery.Callbacks("once memory"), "rejected"], - ["notify", "progress", jQuery.Callbacks("memory")] - ], - state = "pending", - promise = { - state: function () { - return state; - }, - always: function () { - deferred.done(arguments).fail(arguments); - return this; - }, - then: function ( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - return jQuery.Deferred(function (newDefer) { - jQuery.each(tuples, function (i, tuple) { - var action = tuple[0], - fn = jQuery.isFunction(fns[i]) && fns[i]; - // deferred[ done | fail | progress ] for forwarding actions to newDefer - deferred[tuple[1]](function () { - var returned = fn && fn.apply(this, arguments); - if (returned && jQuery.isFunction(returned.promise)) { - returned.promise() - .done(newDefer.resolve) - .fail(newDefer.reject) - .progress(newDefer.notify); - } else { - newDefer[action + "With"](this === promise ? newDefer.promise() : this, fn ? [returned] : arguments); - } - }); - }); - fns = null; - }).promise(); - }, - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function (obj) { - return obj != null ? jQuery.extend(obj, promise) : promise; - } - }, - deferred = {}; - - // Keep pipe for back-compat - promise.pipe = promise.then; - - // Add list-specific methods - jQuery.each(tuples, function (i, tuple) { - var list = tuple[2], - stateString = tuple[3]; - - // promise[ done | fail | progress ] = list.add - promise[tuple[1]] = list.add; - - // Handle state - if (stateString) { - list.add(function () { - // state = [ resolved | rejected ] - state = stateString; - - // [ reject_list | resolve_list ].disable; progress_list.lock - }, tuples[i ^ 1][2].disable, tuples[2][2].lock); - } - - // deferred[ resolve | reject | notify ] - deferred[tuple[0]] = function () { - deferred[tuple[0] + "With"](this === deferred ? promise : this, arguments); - return this; - }; - deferred[tuple[0] + "With"] = list.fireWith; - }); - - // Make the deferred a promise - promise.promise(deferred); - - // Call given func if any - if (func) { - func.call(deferred, deferred); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function (subordinate /* , ..., subordinateN */ ) { - var i = 0, - resolveValues = core_slice.call(arguments), - length = resolveValues.length, - - // the count of uncompleted subordinates - remaining = length !== 1 || (subordinate && jQuery.isFunction(subordinate.promise)) ? length : 0, - - // the master Deferred. If resolveValues consist of only a single Deferred, just use that. - deferred = remaining === 1 ? subordinate : jQuery.Deferred(), - - // Update function for both resolve and progress values - updateFunc = function (i, contexts, values) { - return function (value) { - contexts[i] = this; - values[i] = arguments.length > 1 ? core_slice.call(arguments) : value; - if (values === progressValues) { - deferred.notifyWith(contexts, values); - } else if (!(--remaining)) { - deferred.resolveWith(contexts, values); - } - }; - }, - - progressValues, progressContexts, resolveContexts; - - // add listeners to Deferred subordinates; treat others as resolved - if (length > 1) { - progressValues = new Array(length); - progressContexts = new Array(length); - resolveContexts = new Array(length); - for (; i < length; i++) { - if (resolveValues[i] && jQuery.isFunction(resolveValues[i].promise)) { - resolveValues[i].promise() - .done(updateFunc(i, resolveContexts, resolveValues)) - .fail(deferred.reject) - .progress(updateFunc(i, progressContexts, progressValues)); - } else { - --remaining; - } - } - } - - // if we're not waiting on anything, resolve the master - if (!remaining) { - deferred.resolveWith(resolveContexts, resolveValues); - } - - return deferred.promise(); - } - }); - jQuery.support = (function (support) { - - var all, a, input, select, fragment, opt, eventName, isSupported, i, - div = document.createElement("div"); - - // Setup - div.setAttribute("className", "t"); - div.innerHTML = "
    a"; - - // Finish early in limited (non-browser) environments - all = div.getElementsByTagName("*") || []; - a = div.getElementsByTagName("a")[0]; - if (!a || !a.style || !all.length) { - return support; - } - - // First batch of tests - select = document.createElement("select"); - opt = select.appendChild(document.createElement("option")); - input = div.getElementsByTagName("input")[0]; - - a.style.cssText = "top:1px;float:left;opacity:.5"; - - // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) - support.getSetAttribute = div.className !== "t"; - - // IE strips leading whitespace when .innerHTML is used - support.leadingWhitespace = div.firstChild.nodeType === 3; - - // Make sure that tbody elements aren't automatically inserted - // IE will insert them into empty tables - support.tbody = !div.getElementsByTagName("tbody").length; - - // Make sure that link elements get serialized correctly by innerHTML - // This requires a wrapper element in IE - support.htmlSerialize = !! div.getElementsByTagName("link").length; - - // Get the style information from getAttribute - // (IE uses .cssText instead) - support.style = /top/.test(a.getAttribute("style")); - - // Make sure that URLs aren't manipulated - // (IE normalizes it by default) - support.hrefNormalized = a.getAttribute("href") === "/a"; - - // Make sure that element opacity exists - // (IE uses filter instead) - // Use a regex to work around a WebKit issue. See #5145 - support.opacity = /^0.5/.test(a.style.opacity); - - // Verify style float existence - // (IE uses styleFloat instead of cssFloat) - support.cssFloat = !! a.style.cssFloat; - - // Check the default checkbox/radio value ("" on WebKit; "on" elsewhere) - support.checkOn = !! input.value; - - // Make sure that a selected-by-default option has a working selected property. - // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) - support.optSelected = opt.selected; - - // Tests for enctype support on a form (#6743) - support.enctype = !! document.createElement("form").enctype; - - // Makes sure cloning an html5 element does not cause problems - // Where outerHTML is undefined, this still works - support.html5Clone = document.createElement("nav").cloneNode(true).outerHTML !== "<:nav>"; - - // Will be defined later - support.inlineBlockNeedsLayout = false; - support.shrinkWrapBlocks = false; - support.pixelPosition = false; - support.deleteExpando = true; - support.noCloneEvent = true; - support.reliableMarginRight = true; - support.boxSizingReliable = true; - - // Make sure checked status is properly cloned - input.checked = true; - support.noCloneChecked = input.cloneNode(true).checked; - - // Make sure that the options inside disabled selects aren't marked as disabled - // (WebKit marks them as disabled) - select.disabled = true; - support.optDisabled = !opt.disabled; - - // Support: IE<9 - try { - delete div.test; - } catch (e) { - support.deleteExpando = false; - } - - // Check if we can trust getAttribute("value") - input = document.createElement("input"); - input.setAttribute("value", ""); - support.input = input.getAttribute("value") === ""; - - // Check if an input maintains its value after becoming a radio - input.value = "t"; - input.setAttribute("type", "radio"); - support.radioValue = input.value === "t"; - - // #11217 - WebKit loses check when the name is after the checked attribute - input.setAttribute("checked", "t"); - input.setAttribute("name", "t"); - - fragment = document.createDocumentFragment(); - fragment.appendChild(input); - - // Check if a disconnected checkbox will retain its checked - // value of true after appended to the DOM (IE6/7) - support.appendChecked = input.checked; - - // WebKit doesn't clone checked state correctly in fragments - support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked; - - // Support: IE<9 - // Opera does not clone events (and typeof div.attachEvent === undefined). - // IE9-10 clones events bound via attachEvent, but they don't trigger with .click() - if (div.attachEvent) { - div.attachEvent("onclick", function () { - support.noCloneEvent = false; - }); - - div.cloneNode(true).click(); - } - - // Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin event) - // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP) - for (i in { - submit: true, - change: true, - focusin: true - }) { - div.setAttribute(eventName = "on" + i, "t"); - - support[i + "Bubbles"] = eventName in window || div.attributes[eventName].expando === false; - } - - div.style.backgroundClip = "content-box"; - div.cloneNode(true).style.backgroundClip = ""; - support.clearCloneStyle = div.style.backgroundClip === "content-box"; - - // Support: IE<9 - // Iteration over object's inherited properties before its own. - for (i in jQuery(support)) { - break; - } - support.ownLast = i !== "0"; - - // Run tests that need a body at doc ready - jQuery(function () { - var container, marginDiv, tds, - divReset = "padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;", - body = document.getElementsByTagName("body")[0]; - - if (!body) { - // Return for frameset docs that don't have a body - return; - } - - container = document.createElement("div"); - container.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px"; - - body.appendChild(container).appendChild(div); - - // Support: IE8 - // Check if table cells still have offsetWidth/Height when they are set - // to display:none and there are still other visible table cells in a - // table row; if so, offsetWidth/Height are not reliable for use when - // determining if an element has been hidden directly using - // display:none (it is still safe to use offsets if a parent element is - // hidden; don safety goggles and see bug #4512 for more information). - div.innerHTML = "
    t
    "; - tds = div.getElementsByTagName("td"); - tds[0].style.cssText = "padding:0;margin:0;border:0;display:none"; - isSupported = (tds[0].offsetHeight === 0); - - tds[0].style.display = ""; - tds[1].style.display = "none"; - - // Support: IE8 - // Check if empty table cells still have offsetWidth/Height - support.reliableHiddenOffsets = isSupported && (tds[0].offsetHeight === 0); - - // Check box-sizing and margin behavior. - div.innerHTML = ""; - div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;"; - - // Workaround failing boxSizing test due to offsetWidth returning wrong value - // with some non-1 values of body zoom, ticket #13543 - jQuery.swap(body, body.style.zoom != null ? { - zoom: 1 - } : {}, function () { - support.boxSizing = div.offsetWidth === 4; - }); - - // Use window.getComputedStyle because jsdom on node.js will break without it. - if (window.getComputedStyle) { - support.pixelPosition = (window.getComputedStyle(div, null) || {}).top !== "1%"; - support.boxSizingReliable = (window.getComputedStyle(div, null) || { - width: "4px" - }).width === "4px"; - - // Check if div with explicit width and no margin-right incorrectly - // gets computed margin-right based on width of container. (#3333) - // Fails in WebKit before Feb 2011 nightlies - // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right - marginDiv = div.appendChild(document.createElement("div")); - marginDiv.style.cssText = div.style.cssText = divReset; - marginDiv.style.marginRight = marginDiv.style.width = "0"; - div.style.width = "1px"; - - support.reliableMarginRight = !parseFloat((window.getComputedStyle(marginDiv, null) || {}).marginRight); - } - - if (typeof div.style.zoom !== core_strundefined) { - // Support: IE<8 - // Check if natively block-level elements act like inline-block - // elements when setting their display to 'inline' and giving - // them layout - div.innerHTML = ""; - div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1"; - support.inlineBlockNeedsLayout = (div.offsetWidth === 3); - - // Support: IE6 - // Check if elements with layout shrink-wrap their children - div.style.display = "block"; - div.innerHTML = "
    "; - div.firstChild.style.width = "5px"; - support.shrinkWrapBlocks = (div.offsetWidth !== 3); - - if (support.inlineBlockNeedsLayout) { - // Prevent IE 6 from affecting layout for positioned elements #11048 - // Prevent IE from shrinking the body in IE 7 mode #12869 - // Support: IE<8 - body.style.zoom = 1; - } - } - - body.removeChild(container); - - // Null elements to avoid leaks in IE - container = div = tds = marginDiv = null; - }); - - // Null elements to avoid leaks in IE - all = select = fragment = opt = a = input = null; - - return support; - })({}); - - var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/, - rmultiDash = /([A-Z])/g; - - function internalData(elem, name, data, pvt /* Internal Use Only */ ) { - if (!jQuery.acceptData(elem)) { - return; - } - - var ret, thisCache, - internalKey = jQuery.expando, - - // We have to handle DOM nodes and JS objects differently because IE6-7 - // can't GC object references properly across the DOM-JS boundary - isNode = elem.nodeType, - - // Only DOM nodes need the global jQuery cache; JS object data is - // attached directly to the object so GC can occur automatically - cache = isNode ? jQuery.cache : elem, - - // Only defining an ID for JS objects if its cache already exists allows - // the code to shortcut on the same path as a DOM node with no cache - id = isNode ? elem[internalKey] : elem[internalKey] && internalKey; - - // Avoid doing any more work than we need to when trying to get data on an - // object that has no data at all - if ((!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === "string") { - return; - } - - if (!id) { - // Only DOM nodes need a new unique ID for each element since their data - // ends up in the global cache - if (isNode) { - id = elem[internalKey] = core_deletedIds.pop() || jQuery.guid++; - } else { - id = internalKey; - } - } - - if (!cache[id]) { - // Avoid exposing jQuery metadata on plain JS objects when the object - // is serialized using JSON.stringify - cache[id] = isNode ? {} : { - toJSON: jQuery.noop - }; - } - - // An object can be passed to jQuery.data instead of a key/value pair; this gets - // shallow copied over onto the existing cache - if (typeof name === "object" || typeof name === "function") { - if (pvt) { - cache[id] = jQuery.extend(cache[id], name); - } else { - cache[id].data = jQuery.extend(cache[id].data, name); - } - } - - thisCache = cache[id]; - - // jQuery data() is stored in a separate object inside the object's internal data - // cache in order to avoid key collisions between internal data and user-defined - // data. - if (!pvt) { - if (!thisCache.data) { - thisCache.data = {}; - } - - thisCache = thisCache.data; - } - - if (data !== undefined) { - thisCache[jQuery.camelCase(name)] = data; - } - - // Check for both converted-to-camel and non-converted data property names - // If a data property was specified - if (typeof name === "string") { - - // First Try to find as-is property data - ret = thisCache[name]; - - // Test for null|undefined property data - if (ret == null) { - - // Try to find the camelCased property - ret = thisCache[jQuery.camelCase(name)]; - } - } else { - ret = thisCache; - } - - return ret; - } - - function internalRemoveData(elem, name, pvt) { - if (!jQuery.acceptData(elem)) { - return; - } - - var thisCache, i, - isNode = elem.nodeType, - - // See jQuery.data for more information - cache = isNode ? jQuery.cache : elem, - id = isNode ? elem[jQuery.expando] : jQuery.expando; - - // If there is already no cache entry for this object, there is no - // purpose in continuing - if (!cache[id]) { - return; - } - - if (name) { - - thisCache = pvt ? cache[id] : cache[id].data; - - if (thisCache) { - - // Support array or space separated string names for data keys - if (!jQuery.isArray(name)) { - - // try the string as a key before any manipulation - if (name in thisCache) { - name = [name]; - } else { - - // split the camel cased version by spaces unless a key with the spaces exists - name = jQuery.camelCase(name); - if (name in thisCache) { - name = [name]; - } else { - name = name.split(" "); - } - } - } else { - // If "name" is an array of keys... - // When data is initially created, via ("key", "val") signature, - // keys will be converted to camelCase. - // Since there is no way to tell _how_ a key was added, remove - // both plain key and camelCase key. #12786 - // This will only penalize the array argument path. - name = name.concat(jQuery.map(name, jQuery.camelCase)); - } - - i = name.length; - while (i--) { - delete thisCache[name[i]]; - } - - // If there is no data left in the cache, we want to continue - // and let the cache object itself get destroyed - if (pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache)) { - return; - } - } - } - - // See jQuery.data for more information - if (!pvt) { - delete cache[id].data; - - // Don't destroy the parent cache unless the internal data object - // had been the only thing left in it - if (!isEmptyDataObject(cache[id])) { - return; - } - } - - // Destroy the cache - if (isNode) { - jQuery.cleanData([elem], true); - - // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080) - /* jshint eqeqeq: false */ - } else if (jQuery.support.deleteExpando || cache != cache.window) { - /* jshint eqeqeq: true */ - delete cache[id]; - - // When all else fails, null - } else { - cache[id] = null; - } - } - - jQuery.extend({ - cache: {}, - - // The following elements throw uncatchable exceptions if you - // attempt to add expando properties to them. - noData: { - "applet": true, - "embed": true, - // Ban all objects except for Flash (which handle expandos) - "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" - }, - - hasData: function (elem) { - elem = elem.nodeType ? jQuery.cache[elem[jQuery.expando]] : elem[jQuery.expando]; - return !!elem && !isEmptyDataObject(elem); - }, - - data: function (elem, name, data) { - return internalData(elem, name, data); - }, - - removeData: function (elem, name) { - return internalRemoveData(elem, name); - }, - - // For internal use only. - _data: function (elem, name, data) { - return internalData(elem, name, data, true); - }, - - _removeData: function (elem, name) { - return internalRemoveData(elem, name, true); - }, - - // A method for determining if a DOM node can handle the data expando - acceptData: function (elem) { - // Do not set data on non-element because it will not be cleared (#8335). - if (elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9) { - return false; - } - - var noData = elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]; - - // nodes accept data unless otherwise specified; rejection can be conditional - return !noData || noData !== true && elem.getAttribute("classid") === noData; - } - }); - - jQuery.fn.extend({ - data: function (key, value) { - var attrs, name, - data = null, - i = 0, - elem = this[0]; - - // Special expections of .data basically thwart jQuery.access, - // so implement the relevant behavior ourselves - - // Gets all values - if (key === undefined) { - if (this.length) { - data = jQuery.data(elem); - - if (elem.nodeType === 1 && !jQuery._data(elem, "parsedAttrs")) { - attrs = elem.attributes; - for (; i < attrs.length; i++) { - name = attrs[i].name; - - if (name.indexOf("data-") === 0) { - name = jQuery.camelCase(name.slice(5)); - - dataAttr(elem, name, data[name]); - } - } - jQuery._data(elem, "parsedAttrs", true); - } - } - - return data; - } - - // Sets multiple values - if (typeof key === "object") { - return this.each(function () { - jQuery.data(this, key); - }); - } - - return arguments.length > 1 ? - - // Sets one value - this.each(function () { - jQuery.data(this, key, value); - }) : - - // Gets one value - // Try to fetch any internally stored data first - elem ? dataAttr(elem, key, jQuery.data(elem, key)) : null; - }, - - removeData: function (key) { - return this.each(function () { - jQuery.removeData(this, key); - }); - } - }); - - function dataAttr(elem, key, data) { - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if (data === undefined && elem.nodeType === 1) { - - var name = "data-" + key.replace(rmultiDash, "-$1").toLowerCase(); - - data = elem.getAttribute(name); - - if (typeof data === "string") { - try { - data = data === "true" ? true : - data === "false" ? false : - data === "null" ? null : - // Only convert to a number if it doesn't change the string - +data + "" === data ? +data : - rbrace.test(data) ? jQuery.parseJSON(data) : - data; - } catch (e) {} - - // Make sure we set the data so it isn't changed later - jQuery.data(elem, key, data); - - } else { - data = undefined; - } - } - - return data; - } - - // checks a cache object for emptiness - - function isEmptyDataObject(obj) { - var name; - for (name in obj) { - - // if the public data object is empty, the private is still empty - if (name === "data" && jQuery.isEmptyObject(obj[name])) { - continue; - } - if (name !== "toJSON") { - return false; - } - } - - return true; - } - jQuery.extend({ - queue: function (elem, type, data) { - var queue; - - if (elem) { - type = (type || "fx") + "queue"; - queue = jQuery._data(elem, type); - - // Speed up dequeue by getting out quickly if this is just a lookup - if (data) { - if (!queue || jQuery.isArray(data)) { - queue = jQuery._data(elem, type, jQuery.makeArray(data)); - } else { - queue.push(data); - } - } - return queue || []; - } - }, - - dequeue: function (elem, type) { - type = type || "fx"; - - var queue = jQuery.queue(elem, type), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks(elem, type), - next = function () { - jQuery.dequeue(elem, type); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if (fn === "inprogress") { - fn = queue.shift(); - startLength--; - } - - if (fn) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if (type === "fx") { - queue.unshift("inprogress"); - } - - // clear up the last queue stop function - delete hooks.stop; - fn.call(elem, next, hooks); - } - - if (!startLength && hooks) { - hooks.empty.fire(); - } - }, - - // not intended for public consumption - generates a queueHooks object, or returns the current one - _queueHooks: function (elem, type) { - var key = type + "queueHooks"; - return jQuery._data(elem, key) || jQuery._data(elem, key, { - empty: jQuery.Callbacks("once memory").add(function () { - jQuery._removeData(elem, type + "queue"); - jQuery._removeData(elem, key); - }) - }); - } - }); - - jQuery.fn.extend({ - queue: function (type, data) { - var setter = 2; - - if (typeof type !== "string") { - data = type; - type = "fx"; - setter--; - } - - if (arguments.length < setter) { - return jQuery.queue(this[0], type); - } - - return data === undefined ? - this : - this.each(function () { - var queue = jQuery.queue(this, type, data); - - // ensure a hooks for this queue - jQuery._queueHooks(this, type); - - if (type === "fx" && queue[0] !== "inprogress") { - jQuery.dequeue(this, type); - } - }); - }, - dequeue: function (type) { - return this.each(function () { - jQuery.dequeue(this, type); - }); - }, - // Based off of the plugin by Clint Helfers, with permission. - // http://blindsignals.com/index.php/2009/07/jquery-delay/ - delay: function (time, type) { - time = jQuery.fx ? jQuery.fx.speeds[time] || time : time; - type = type || "fx"; - - return this.queue(type, function (next, hooks) { - var timeout = setTimeout(next, time); - hooks.stop = function () { - clearTimeout(timeout); - }; - }); - }, - clearQueue: function (type) { - return this.queue(type || "fx", []); - }, - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function (type, obj) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function () { - if (!(--count)) { - defer.resolveWith(elements, [elements]); - } - }; - - if (typeof type !== "string") { - obj = type; - type = undefined; - } - type = type || "fx"; - - while (i--) { - tmp = jQuery._data(elements[i], type + "queueHooks"); - if (tmp && tmp.empty) { - count++; - tmp.empty.add(resolve); - } - } - resolve(); - return defer.promise(obj); - } - }); - var nodeHook, boolHook, - rclass = /[\t\r\n\f]/g, - rreturn = /\r/g, - rfocusable = /^(?:input|select|textarea|button|object)$/i, - rclickable = /^(?:a|area)$/i, - ruseDefault = /^(?:checked|selected)$/i, - getSetAttribute = jQuery.support.getSetAttribute, - getSetInput = jQuery.support.input; - - jQuery.fn.extend({ - attr: function (name, value) { - return jQuery.access(this, jQuery.attr, name, value, arguments.length > 1); - }, - - removeAttr: function (name) { - return this.each(function () { - jQuery.removeAttr(this, name); - }); - }, - - prop: function (name, value) { - return jQuery.access(this, jQuery.prop, name, value, arguments.length > 1); - }, - - removeProp: function (name) { - name = jQuery.propFix[name] || name; - return this.each(function () { - // try/catch handles cases where IE balks (such as removing a property on window) - try { - this[name] = undefined; - delete this[name]; - } catch (e) {} - }); - }, - - addClass: function (value) { - var classes, elem, cur, clazz, j, - i = 0, - len = this.length, - proceed = typeof value === "string" && value; - - if (jQuery.isFunction(value)) { - return this.each(function (j) { - jQuery(this).addClass(value.call(this, j, this.className)); - }); - } - - if (proceed) { - // The disjunction here is for better compressibility (see removeClass) - classes = (value || "").match(core_rnotwhite) || []; - - for (; i < len; i++) { - elem = this[i]; - cur = elem.nodeType === 1 && (elem.className ? - (" " + elem.className + " ").replace(rclass, " ") : - " " - ); - - if (cur) { - j = 0; - while ((clazz = classes[j++])) { - if (cur.indexOf(" " + clazz + " ") < 0) { - cur += clazz + " "; - } - } - elem.className = jQuery.trim(cur); - - } - } - } - - return this; - }, - - removeClass: function (value) { - var classes, elem, cur, clazz, j, - i = 0, - len = this.length, - proceed = arguments.length === 0 || typeof value === "string" && value; - - if (jQuery.isFunction(value)) { - return this.each(function (j) { - jQuery(this).removeClass(value.call(this, j, this.className)); - }); - } - if (proceed) { - classes = (value || "").match(core_rnotwhite) || []; - - for (; i < len; i++) { - elem = this[i]; - // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && (elem.className ? - (" " + elem.className + " ").replace(rclass, " ") : - "" - ); - - if (cur) { - j = 0; - while ((clazz = classes[j++])) { - // Remove *all* instances - while (cur.indexOf(" " + clazz + " ") >= 0) { - cur = cur.replace(" " + clazz + " ", " "); - } - } - elem.className = value ? jQuery.trim(cur) : ""; - } - } - } - - return this; - }, - - toggleClass: function (value, stateVal) { - var type = typeof value; - - if (typeof stateVal === "boolean" && type === "string") { - return stateVal ? this.addClass(value) : this.removeClass(value); - } - - if (jQuery.isFunction(value)) { - return this.each(function (i) { - jQuery(this).toggleClass(value.call(this, i, this.className, stateVal), stateVal); - }); - } - - return this.each(function () { - if (type === "string") { - // toggle individual class names - var className, - i = 0, - self = jQuery(this), - classNames = value.match(core_rnotwhite) || []; - - while ((className = classNames[i++])) { - // check each className given, space separated list - if (self.hasClass(className)) { - self.removeClass(className); - } else { - self.addClass(className); - } - } - - // Toggle whole class name - } else if (type === core_strundefined || type === "boolean") { - if (this.className) { - // store className if set - jQuery._data(this, "__className__", this.className); - } - - // If the element has a class name or if we're passed "false", - // then remove the whole classname (if there was one, the above saved it). - // Otherwise bring back whatever was previously saved (if anything), - // falling back to the empty string if nothing was stored. - this.className = this.className || value === false ? "" : jQuery._data(this, "__className__") || ""; - } - }); - }, - - hasClass: function (selector) { - var className = " " + selector + " ", - i = 0, - l = this.length; - for (; i < l; i++) { - if (this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf(className) >= 0) { - return true; - } - } - - return false; - }, - - val: function (value) { - var ret, hooks, isFunction, - elem = this[0]; - - if (!arguments.length) { - if (elem) { - hooks = jQuery.valHooks[elem.type] || jQuery.valHooks[elem.nodeName.toLowerCase()]; - - if (hooks && "get" in hooks && (ret = hooks.get(elem, "value")) !== undefined) { - return ret; - } - - ret = elem.value; - - return typeof ret === "string" ? - // handle most common string cases - ret.replace(rreturn, "") : - // handle cases where value is null/undef or number - ret == null ? "" : ret; - } - - return; - } - - isFunction = jQuery.isFunction(value); - - return this.each(function (i) { - var val; - - if (this.nodeType !== 1) { - return; - } - - if (isFunction) { - val = value.call(this, i, jQuery(this).val()); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if (val == null) { - val = ""; - } else if (typeof val === "number") { - val += ""; - } else if (jQuery.isArray(val)) { - val = jQuery.map(val, function (value) { - return value == null ? "" : value + ""; - }); - } - - hooks = jQuery.valHooks[this.type] || jQuery.valHooks[this.nodeName.toLowerCase()]; - - // If set returns undefined, fall back to normal setting - if (!hooks || !("set" in hooks) || hooks.set(this, val, "value") === undefined) { - this.value = val; - } - }); - } - }); - - jQuery.extend({ - valHooks: { - option: { - get: function (elem) { - // Use proper attribute retrieval(#6932, #12072) - var val = jQuery.find.attr(elem, "value"); - return val != null ? - val : - elem.text; - } - }, - select: { - get: function (elem) { - var value, option, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one" || index < 0, - values = one ? null : [], - max = one ? index + 1 : options.length, - i = index < 0 ? - max : - one ? index : 0; - - // Loop through all the selected options - for (; i < max; i++) { - option = options[i]; - - // oldIE doesn't update selected after form reset (#2551) - if ((option.selected || i === index) && - // Don't return options that are disabled or in a disabled optgroup - (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && - (!option.parentNode.disabled || !jQuery.nodeName(option.parentNode, "optgroup"))) { - - // Get the specific value for the option - value = jQuery(option).val(); - - // We don't need an array for one selects - if (one) { - return value; - } - - // Multi-Selects return an array - values.push(value); - } - } - - return values; - }, - - set: function (elem, value) { - var optionSet, option, - options = elem.options, - values = jQuery.makeArray(value), - i = options.length; - - while (i--) { - option = options[i]; - if ((option.selected = jQuery.inArray(jQuery(option).val(), values) >= 0)) { - optionSet = true; - } - } - - // force browsers to behave consistently when non-matching value is set - if (!optionSet) { - elem.selectedIndex = -1; - } - return values; - } - } - }, - - attr: function (elem, name, value) { - var hooks, ret, - nType = elem.nodeType; - - // don't get/set attributes on text, comment and attribute nodes - if (!elem || nType === 3 || nType === 8 || nType === 2) { - return; - } - - // Fallback to prop when attributes are not supported - if (typeof elem.getAttribute === core_strundefined) { - return jQuery.prop(elem, name, value); - } - - // All attributes are lowercase - // Grab necessary hook if one is defined - if (nType !== 1 || !jQuery.isXMLDoc(elem)) { - name = name.toLowerCase(); - hooks = jQuery.attrHooks[name] || - (jQuery.expr.match.bool.test(name) ? boolHook : nodeHook); - } - - if (value !== undefined) { - - if (value === null) { - jQuery.removeAttr(elem, name); - - } else if (hooks && "set" in hooks && (ret = hooks.set(elem, value, name)) !== undefined) { - return ret; - - } else { - elem.setAttribute(name, value + ""); - return value; - } - - } else if (hooks && "get" in hooks && (ret = hooks.get(elem, name)) !== null) { - return ret; - - } else { - ret = jQuery.find.attr(elem, name); - - // Non-existent attributes return null, we normalize to undefined - return ret == null ? - undefined : - ret; - } - }, - - removeAttr: function (elem, value) { - var name, propName, - i = 0, - attrNames = value && value.match(core_rnotwhite); - - if (attrNames && elem.nodeType === 1) { - while ((name = attrNames[i++])) { - propName = jQuery.propFix[name] || name; - - // Boolean attributes get special treatment (#10870) - if (jQuery.expr.match.bool.test(name)) { - // Set corresponding property to false - if (getSetInput && getSetAttribute || !ruseDefault.test(name)) { - elem[propName] = false; - // Support: IE<9 - // Also clear defaultChecked/defaultSelected (if appropriate) - } else { - elem[jQuery.camelCase("default-" + name)] = - elem[propName] = false; - } - - // See #9699 for explanation of this approach (setting first, then removal) - } else { - jQuery.attr(elem, name, ""); - } - - elem.removeAttribute(getSetAttribute ? name : propName); - } - } - }, - - attrHooks: { - type: { - set: function (elem, value) { - if (!jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input")) { - // Setting the type on a radio button after the value resets the value in IE6-9 - // Reset value to default in case type is set after value during creation - var val = elem.value; - elem.setAttribute("type", value); - if (val) { - elem.value = val; - } - return value; - } - } - } - }, - - propFix: { - "for": "htmlFor", - "class": "className" - }, - - prop: function (elem, name, value) { - var ret, hooks, notxml, - nType = elem.nodeType; - - // don't get/set properties on text, comment and attribute nodes - if (!elem || nType === 3 || nType === 8 || nType === 2) { - return; - } - - notxml = nType !== 1 || !jQuery.isXMLDoc(elem); - - if (notxml) { - // Fix name and attach hooks - name = jQuery.propFix[name] || name; - hooks = jQuery.propHooks[name]; - } - - if (value !== undefined) { - return hooks && "set" in hooks && (ret = hooks.set(elem, value, name)) !== undefined ? - ret : - (elem[name] = value); - - } else { - return hooks && "get" in hooks && (ret = hooks.get(elem, name)) !== null ? - ret : - elem[name]; - } - }, - - propHooks: { - tabIndex: { - get: function (elem) { - // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set - // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - // Use proper attribute retrieval(#12072) - var tabindex = jQuery.find.attr(elem, "tabindex"); - - return tabindex ? - parseInt(tabindex, 10) : - rfocusable.test(elem.nodeName) || rclickable.test(elem.nodeName) && elem.href ? - 0 : -1; - } - } - } - }); - - // Hooks for boolean attributes - boolHook = { - set: function (elem, value, name) { - if (value === false) { - // Remove boolean attributes when set to false - jQuery.removeAttr(elem, name); - } else if (getSetInput && getSetAttribute || !ruseDefault.test(name)) { - // IE<8 needs the *property* name - elem.setAttribute(!getSetAttribute && jQuery.propFix[name] || name, name); - - // Use defaultChecked and defaultSelected for oldIE - } else { - elem[jQuery.camelCase("default-" + name)] = elem[name] = true; - } - - return name; - } - }; - jQuery.each(jQuery.expr.match.bool.source.match(/\w+/g), function (i, name) { - var getter = jQuery.expr.attrHandle[name] || jQuery.find.attr; - - jQuery.expr.attrHandle[name] = getSetInput && getSetAttribute || !ruseDefault.test(name) ? - function (elem, name, isXML) { - var fn = jQuery.expr.attrHandle[name], - ret = isXML ? - undefined : - /* jshint eqeqeq: false */ - (jQuery.expr.attrHandle[name] = undefined) != - getter(elem, name, isXML) ? - - name.toLowerCase() : - null; - jQuery.expr.attrHandle[name] = fn; - return ret; - } : - function (elem, name, isXML) { - return isXML ? - undefined : - elem[jQuery.camelCase("default-" + name)] ? - name.toLowerCase() : - null; - }; - }); - - // fix oldIE attroperties - if (!getSetInput || !getSetAttribute) { - jQuery.attrHooks.value = { - set: function (elem, value, name) { - if (jQuery.nodeName(elem, "input")) { - // Does not return so that setAttribute is also used - elem.defaultValue = value; - } else { - // Use nodeHook if defined (#1954); otherwise setAttribute is fine - return nodeHook && nodeHook.set(elem, value, name); - } - } - }; - } - - // IE6/7 do not support getting/setting some attributes with get/setAttribute - if (!getSetAttribute) { - - // Use this for any attribute in IE6/7 - // This fixes almost every IE6/7 issue - nodeHook = { - set: function (elem, value, name) { - // Set the existing or create a new attribute node - var ret = elem.getAttributeNode(name); - if (!ret) { - elem.setAttributeNode( - (ret = elem.ownerDocument.createAttribute(name)) - ); - } - - ret.value = value += ""; - - // Break association with cloned elements by also using setAttribute (#9646) - return name === "value" || value === elem.getAttribute(name) ? - value : - undefined; - } - }; - jQuery.expr.attrHandle.id = jQuery.expr.attrHandle.name = jQuery.expr.attrHandle.coords = - // Some attributes are constructed with empty-string values when not defined - - function (elem, name, isXML) { - var ret; - return isXML ? - undefined : - (ret = elem.getAttributeNode(name)) && ret.value !== "" ? - ret.value : - null; - }; - jQuery.valHooks.button = { - get: function (elem, name) { - var ret = elem.getAttributeNode(name); - return ret && ret.specified ? - ret.value : - undefined; - }, - set: nodeHook.set - }; - - // Set contenteditable to false on removals(#10429) - // Setting to empty string throws an error as an invalid value - jQuery.attrHooks.contenteditable = { - set: function (elem, value, name) { - nodeHook.set(elem, value === "" ? false : value, name); - } - }; - - // Set width and height to auto instead of 0 on empty string( Bug #8150 ) - // This is for removals - jQuery.each(["width", "height"], function (i, name) { - jQuery.attrHooks[name] = { - set: function (elem, value) { - if (value === "") { - elem.setAttribute(name, "auto"); - return value; - } - } - }; - }); - } - - - // Some attributes require a special call on IE - // http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx - if (!jQuery.support.hrefNormalized) { - // href/src property should get the full normalized URL (#10299/#12915) - jQuery.each(["href", "src"], function (i, name) { - jQuery.propHooks[name] = { - get: function (elem) { - return elem.getAttribute(name, 4); - } - }; - }); - } - - if (!jQuery.support.style) { - jQuery.attrHooks.style = { - get: function (elem) { - // Return undefined in the case of empty string - // Note: IE uppercases css property names, but if we were to .toLowerCase() - // .cssText, that would destroy case senstitivity in URL's, like in "background" - return elem.style.cssText || undefined; - }, - set: function (elem, value) { - return (elem.style.cssText = value + ""); - } - }; - } - - // Safari mis-reports the default selected property of an option - // Accessing the parent's selectedIndex property fixes it - if (!jQuery.support.optSelected) { - jQuery.propHooks.selected = { - get: function (elem) { - var parent = elem.parentNode; - - if (parent) { - parent.selectedIndex; - - // Make sure that it also works with optgroups, see #5701 - if (parent.parentNode) { - parent.parentNode.selectedIndex; - } - } - return null; - } - }; - } - - jQuery.each([ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" - ], function () { - jQuery.propFix[this.toLowerCase()] = this; - }); - - // IE6/7 call enctype encoding - if (!jQuery.support.enctype) { - jQuery.propFix.enctype = "encoding"; - } - - // Radios and checkboxes getter/setter - jQuery.each(["radio", "checkbox"], function () { - jQuery.valHooks[this] = { - set: function (elem, value) { - if (jQuery.isArray(value)) { - return (elem.checked = jQuery.inArray(jQuery(elem).val(), value) >= 0); - } - } - }; - if (!jQuery.support.checkOn) { - jQuery.valHooks[this].get = function (elem) { - // Support: Webkit - // "" is returned instead of "on" if a value isn't specified - return elem.getAttribute("value") === null ? "on" : elem.value; - }; - } - }); - var rformElems = /^(?:input|select|textarea)$/i, - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|contextmenu)|click/, - rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)$/; - - function returnTrue() { - return true; - } - - function returnFalse() { - return false; - } - - function safeActiveElement() { - try { - return document.activeElement; - } catch (err) {} - } - - /* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ - jQuery.event = { - - global: {}, - - add: function (elem, types, handler, data, selector) { - var tmp, events, t, handleObjIn, - special, eventHandle, handleObj, - handlers, type, namespaces, origType, - elemData = jQuery._data(elem); - - // Don't attach events to noData or text/comment nodes (but allow plain objects) - if (!elemData) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if (handler.handler) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if (!handler.guid) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if (!(events = elemData.events)) { - events = elemData.events = {}; - } - if (!(eventHandle = elemData.handle)) { - eventHandle = elemData.handle = function (e) { - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ? - jQuery.event.dispatch.apply(eventHandle.elem, arguments) : - undefined; - }; - // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events - eventHandle.elem = elem; - } - - // Handle multiple events separated by a space - types = (types || "").match(core_rnotwhite) || [""]; - t = types.length; - while (t--) { - tmp = rtypenamespace.exec(types[t]) || []; - type = origType = tmp[1]; - namespaces = (tmp[2] || "").split(".").sort(); - - // There *must* be a type, no attaching namespace-only handlers - if (!type) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[type] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = (selector ? special.delegateType : special.bindType) || type; - - // Update special based on newly reset type - special = jQuery.event.special[type] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend({ - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test(selector), - namespace: namespaces.join(".") - }, handleObjIn); - - // Init the event handler queue if we're the first - if (!(handlers = events[type])) { - handlers = events[type] = []; - handlers.delegateCount = 0; - - // Only use addEventListener/attachEvent if the special events handler returns false - if (!special.setup || special.setup.call(elem, data, namespaces, eventHandle) === false) { - // Bind the global event handler to the element - if (elem.addEventListener) { - elem.addEventListener(type, eventHandle, false); - - } else if (elem.attachEvent) { - elem.attachEvent("on" + type, eventHandle); - } - } - } - - if (special.add) { - special.add.call(elem, handleObj); - - if (!handleObj.handler.guid) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if (selector) { - handlers.splice(handlers.delegateCount++, 0, handleObj); - } else { - handlers.push(handleObj); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[type] = true; - } - - // Nullify elem to prevent memory leaks in IE - elem = null; - }, - - // Detach an event or set of events from an element - remove: function (elem, types, handler, selector, mappedTypes) { - var j, handleObj, tmp, - origCount, t, events, - special, handlers, type, - namespaces, origType, - elemData = jQuery.hasData(elem) && jQuery._data(elem); - - if (!elemData || !(events = elemData.events)) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = (types || "").match(core_rnotwhite) || [""]; - t = types.length; - while (t--) { - tmp = rtypenamespace.exec(types[t]) || []; - type = origType = tmp[1]; - namespaces = (tmp[2] || "").split(".").sort(); - - // Unbind all events (on this namespace, if provided) for the element - if (!type) { - for (type in events) { - jQuery.event.remove(elem, type + types[t], handler, selector, true); - } - continue; - } - - special = jQuery.event.special[type] || {}; - type = (selector ? special.delegateType : special.bindType) || type; - handlers = events[type] || []; - tmp = tmp[2] && new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)"); - - // Remove matching events - origCount = j = handlers.length; - while (j--) { - handleObj = handlers[j]; - - if ((mappedTypes || origType === handleObj.origType) && - (!handler || handler.guid === handleObj.guid) && - (!tmp || tmp.test(handleObj.namespace)) && - (!selector || selector === handleObj.selector || selector === "**" && handleObj.selector)) { - handlers.splice(j, 1); - - if (handleObj.selector) { - handlers.delegateCount--; - } - if (special.remove) { - special.remove.call(elem, handleObj); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if (origCount && !handlers.length) { - if (!special.teardown || special.teardown.call(elem, namespaces, elemData.handle) === false) { - jQuery.removeEvent(elem, type, elemData.handle); - } - - delete events[type]; - } - } - - // Remove the expando if it's no longer used - if (jQuery.isEmptyObject(events)) { - delete elemData.handle; - - // removeData also checks for emptiness and clears the expando if empty - // so use it instead of delete - jQuery._removeData(elem, "events"); - } - }, - - trigger: function (event, data, elem, onlyHandlers) { - var handle, ontype, cur, - bubbleType, special, tmp, i, - eventPath = [elem || document], - type = core_hasOwn.call(event, "type") ? event.type : event, - namespaces = core_hasOwn.call(event, "namespace") ? event.namespace.split(".") : []; - - cur = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if (elem.nodeType === 3 || elem.nodeType === 8) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if (rfocusMorph.test(type + jQuery.event.triggered)) { - return; - } - - if (type.indexOf(".") >= 0) { - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split("."); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf(":") < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[jQuery.expando] ? - event : - new jQuery.Event(type, typeof event === "object" && event); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join("."); - event.namespace_re = event.namespace ? - new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if (!event.target) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [event] : - jQuery.makeArray(data, [event]); - - // Allow special events to draw outside the lines - special = jQuery.event.special[type] || {}; - if (!onlyHandlers && special.trigger && special.trigger.apply(elem, data) === false) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if (!onlyHandlers && !special.noBubble && !jQuery.isWindow(elem)) { - - bubbleType = special.delegateType || type; - if (!rfocusMorph.test(bubbleType + type)) { - cur = cur.parentNode; - } - for (; cur; cur = cur.parentNode) { - eventPath.push(cur); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if (tmp === (elem.ownerDocument || document)) { - eventPath.push(tmp.defaultView || tmp.parentWindow || window); - } - } - - // Fire handlers on the event path - i = 0; - while ((cur = eventPath[i++]) && !event.isPropagationStopped()) { - - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = (jQuery._data(cur, "events") || {})[event.type] && jQuery._data(cur, "handle"); - if (handle) { - handle.apply(cur, data); - } - - // Native handler - handle = ontype && cur[ontype]; - if (handle && jQuery.acceptData(cur) && handle.apply && handle.apply(cur, data) === false) { - event.preventDefault(); - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if (!onlyHandlers && !event.isDefaultPrevented()) { - - if ((!special._default || special._default.apply(eventPath.pop(), data) === false) && - jQuery.acceptData(elem)) { - - // Call a native DOM method on the target with the same name name as the event. - // Can't use an .isFunction() check here because IE6/7 fails that test. - // Don't do default actions on window, that's where global variables be (#6170) - if (ontype && elem[type] && !jQuery.isWindow(elem)) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ontype]; - - if (tmp) { - elem[ontype] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - try { - elem[type](); - } catch (e) { - // IE<9 dies on focus/blur to hidden element (#1486,#12518) - // only reproducible on winXP IE8 native, not IE9 in IE8 mode - } - jQuery.event.triggered = undefined; - - if (tmp) { - elem[ontype] = tmp; - } - } - } - } - - return event.result; - }, - - dispatch: function (event) { - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix(event); - - var i, ret, handleObj, matched, j, - handlerQueue = [], - args = core_slice.call(arguments), - handlers = (jQuery._data(this, "events") || {})[event.type] || [], - special = jQuery.event.special[event.type] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[0] = event; - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if (special.preDispatch && special.preDispatch.call(this, event) === false) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call(this, event, handlers); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ((matched = handlerQueue[i++]) && !event.isPropagationStopped()) { - event.currentTarget = matched.elem; - - j = 0; - while ((handleObj = matched.handlers[j++]) && !event.isImmediatePropagationStopped()) { - - // Triggered event must either 1) have no namespace, or - // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). - if (!event.namespace_re || event.namespace_re.test(handleObj.namespace)) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ((jQuery.event.special[handleObj.origType] || {}).handle || handleObj.handler) - .apply(matched.elem, args); - - if (ret !== undefined) { - if ((event.result = ret) === false) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if (special.postDispatch) { - special.postDispatch.call(this, event); - } - - return event.result; - }, - - handlers: function (event, handlers) { - var sel, handleObj, matches, i, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - // Black-hole SVG instance trees (#13180) - // Avoid non-left-click bubbling in Firefox (#3861) - if (delegateCount && cur.nodeType && (!event.button || event.type !== "click")) { - - /* jshint eqeqeq: false */ - for (; cur != this; cur = cur.parentNode || this) { - /* jshint eqeqeq: true */ - - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if (cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click")) { - matches = []; - for (i = 0; i < delegateCount; i++) { - handleObj = handlers[i]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if (matches[sel] === undefined) { - matches[sel] = handleObj.needsContext ? - jQuery(sel, this).index(cur) >= 0 : - jQuery.find(sel, this, null, [cur]).length; - } - if (matches[sel]) { - matches.push(handleObj); - } - } - if (matches.length) { - handlerQueue.push({ - elem: cur, - handlers: matches - }); - } - } - } - } - - // Add the remaining (directly-bound) handlers - if (delegateCount < handlers.length) { - handlerQueue.push({ - elem: this, - handlers: handlers.slice(delegateCount) - }); - } - - return handlerQueue; - }, - - fix: function (event) { - if (event[jQuery.expando]) { - return event; - } - - // Create a writable copy of the event object and normalize some properties - var i, prop, copy, - type = event.type, - originalEvent = event, - fixHook = this.fixHooks[type]; - - if (!fixHook) { - this.fixHooks[type] = fixHook = - rmouseEvent.test(type) ? this.mouseHooks : - rkeyEvent.test(type) ? this.keyHooks : {}; - } - copy = fixHook.props ? this.props.concat(fixHook.props) : this.props; - - event = new jQuery.Event(originalEvent); - - i = copy.length; - while (i--) { - prop = copy[i]; - event[prop] = originalEvent[prop]; - } - - // Support: IE<9 - // Fix target property (#1925) - if (!event.target) { - event.target = originalEvent.srcElement || document; - } - - // Support: Chrome 23+, Safari? - // Target should not be a text node (#504, #13143) - if (event.target.nodeType === 3) { - event.target = event.target.parentNode; - } - - // Support: IE<9 - // For mouse/key events, metaKey==false if it's undefined (#3368, #11328) - event.metaKey = !! event.metaKey; - - return fixHook.filter ? fixHook.filter(event, originalEvent) : event; - }, - - // Includes some event props shared by KeyEvent and MouseEvent - props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), - - fixHooks: {}, - - keyHooks: { - props: "char charCode key keyCode".split(" "), - filter: function (event, original) { - - // Add which for key events - if (event.which == null) { - event.which = original.charCode != null ? original.charCode : original.keyCode; - } - - return event; - } - }, - - mouseHooks: { - props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), - filter: function (event, original) { - var body, eventDoc, doc, - button = original.button, - fromElement = original.fromElement; - - // Calculate pageX/Y if missing and clientX/Y available - if (event.pageX == null && original.clientX != null) { - eventDoc = event.target.ownerDocument || document; - doc = eventDoc.documentElement; - body = eventDoc.body; - - event.pageX = original.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0); - event.pageY = original.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0); - } - - // Add relatedTarget, if necessary - if (!event.relatedTarget && fromElement) { - event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - // Note: button is not normalized, so don't use it - if (!event.which && button !== undefined) { - event.which = (button & 1 ? 1 : (button & 2 ? 3 : (button & 4 ? 2 : 0))); - } - - return event; - } - }, - - special: { - load: { - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - focus: { - // Fire native event if possible so blur/focus sequence is correct - trigger: function () { - if (this !== safeActiveElement() && this.focus) { - try { - this.focus(); - return false; - } catch (e) { - // Support: IE<9 - // If we error on focus to hidden element (#1486, #12518), - // let .trigger() run the handlers - } - } - }, - delegateType: "focusin" - }, - blur: { - trigger: function () { - if (this === safeActiveElement() && this.blur) { - this.blur(); - return false; - } - }, - delegateType: "focusout" - }, - click: { - // For checkbox, fire native event so checked state will be right - trigger: function () { - if (jQuery.nodeName(this, "input") && this.type === "checkbox" && this.click) { - this.click(); - return false; - } - }, - - // For cross-browser consistency, don't fire native .click() on links - _default: function (event) { - return jQuery.nodeName(event.target, "a"); - } - }, - - beforeunload: { - postDispatch: function (event) { - - // Even when returnValue equals to undefined Firefox will still show alert - if (event.result !== undefined) { - event.originalEvent.returnValue = event.result; - } - } - } - }, - - simulate: function (type, elem, event, bubble) { - // Piggyback on a donor event to simulate a different one. - // Fake originalEvent to avoid donor's stopPropagation, but if the - // simulated event prevents default then we do the same on the donor. - var e = jQuery.extend( - new jQuery.Event(), - event, { - type: type, - isSimulated: true, - originalEvent: {} - } - ); - if (bubble) { - jQuery.event.trigger(e, null, elem); - } else { - jQuery.event.dispatch.call(elem, e); - } - if (e.isDefaultPrevented()) { - event.preventDefault(); - } - } - }; - - jQuery.removeEvent = document.removeEventListener ? - function (elem, type, handle) { - if (elem.removeEventListener) { - elem.removeEventListener(type, handle, false); - } - } : - function (elem, type, handle) { - var name = "on" + type; - - if (elem.detachEvent) { - - // #8545, #7054, preventing memory leaks for custom events in IE6-8 - // detachEvent needed property on element, by name of that event, to properly expose it to GC - if (typeof elem[name] === core_strundefined) { - elem[name] = null; - } - - elem.detachEvent(name, handle); - } - }; - - jQuery.Event = function (src, props) { - // Allow instantiation without the 'new' keyword - if (!(this instanceof jQuery.Event)) { - return new jQuery.Event(src, props); - } - - // Event object - if (src && src.type) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false || - src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if (props) { - jQuery.extend(this, props); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || jQuery.now(); - - // Mark it as fixed - this[jQuery.expando] = true; - }; - - // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding - // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html - jQuery.Event.prototype = { - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - - preventDefault: function () { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - if (!e) { - return; - } - - // If preventDefault exists, run it on the original event - if (e.preventDefault) { - e.preventDefault(); - - // Support: IE - // Otherwise set the returnValue property of the original event to false - } else { - e.returnValue = false; - } - }, - stopPropagation: function () { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - if (!e) { - return; - } - // If stopPropagation exists, run it on the original event - if (e.stopPropagation) { - e.stopPropagation(); - } - - // Support: IE - // Set the cancelBubble property of the original event to true - e.cancelBubble = true; - }, - stopImmediatePropagation: function () { - this.isImmediatePropagationStopped = returnTrue; - this.stopPropagation(); - } - }; - - // Create mouseenter/leave events using mouseover/out and event-time checks - jQuery.each({ - mouseenter: "mouseover", - mouseleave: "mouseout" - }, function (orig, fix) { - jQuery.event.special[orig] = { - delegateType: fix, - bindType: fix, - - handle: function (event) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mousenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if (!related || (related !== target && !jQuery.contains(target, related))) { - event.type = handleObj.origType; - ret = handleObj.handler.apply(this, arguments); - event.type = fix; - } - return ret; - } - }; - }); - - // IE submit delegation - if (!jQuery.support.submitBubbles) { - - jQuery.event.special.submit = { - setup: function () { - // Only need this for delegated form submit events - if (jQuery.nodeName(this, "form")) { - return false; - } - - // Lazy-add a submit handler when a descendant form may potentially be submitted - jQuery.event.add(this, "click._submit keypress._submit", function (e) { - // Node name check avoids a VML-related crash in IE (#9807) - var elem = e.target, - form = jQuery.nodeName(elem, "input") || jQuery.nodeName(elem, "button") ? elem.form : undefined; - if (form && !jQuery._data(form, "submitBubbles")) { - jQuery.event.add(form, "submit._submit", function (event) { - event._submit_bubble = true; - }); - jQuery._data(form, "submitBubbles", true); - } - }); - // return undefined since we don't need an event listener - }, - - postDispatch: function (event) { - // If form was submitted by the user, bubble the event up the tree - if (event._submit_bubble) { - delete event._submit_bubble; - if (this.parentNode && !event.isTrigger) { - jQuery.event.simulate("submit", this.parentNode, event, true); - } - } - }, - - teardown: function () { - // Only need this for delegated form submit events - if (jQuery.nodeName(this, "form")) { - return false; - } - - // Remove delegated handlers; cleanData eventually reaps submit handlers attached above - jQuery.event.remove(this, "._submit"); - } - }; - } - - // IE change delegation and checkbox/radio fix - if (!jQuery.support.changeBubbles) { - - jQuery.event.special.change = { - - setup: function () { - - if (rformElems.test(this.nodeName)) { - // IE doesn't fire change on a check/radio until blur; trigger it on click - // after a propertychange. Eat the blur-change in special.change.handle. - // This still fires onchange a second time for check/radio after blur. - if (this.type === "checkbox" || this.type === "radio") { - jQuery.event.add(this, "propertychange._change", function (event) { - if (event.originalEvent.propertyName === "checked") { - this._just_changed = true; - } - }); - jQuery.event.add(this, "click._change", function (event) { - if (this._just_changed && !event.isTrigger) { - this._just_changed = false; - } - // Allow triggered, simulated change events (#11500) - jQuery.event.simulate("change", this, event, true); - }); - } - return false; - } - // Delegated event; lazy-add a change handler on descendant inputs - jQuery.event.add(this, "beforeactivate._change", function (e) { - var elem = e.target; - - if (rformElems.test(elem.nodeName) && !jQuery._data(elem, "changeBubbles")) { - jQuery.event.add(elem, "change._change", function (event) { - if (this.parentNode && !event.isSimulated && !event.isTrigger) { - jQuery.event.simulate("change", this.parentNode, event, true); - } - }); - jQuery._data(elem, "changeBubbles", true); - } - }); - }, - - handle: function (event) { - var elem = event.target; - - // Swallow native change events from checkbox/radio, we already triggered them above - if (this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox")) { - return event.handleObj.handler.apply(this, arguments); - } - }, - - teardown: function () { - jQuery.event.remove(this, "._change"); - - return !rformElems.test(this.nodeName); - } - }; - } - - // Create "bubbling" focus and blur events - if (!jQuery.support.focusinBubbles) { - jQuery.each({ - focus: "focusin", - blur: "focusout" - }, function (orig, fix) { - - // Attach a single capturing handler while someone wants focusin/focusout - var attaches = 0, - handler = function (event) { - jQuery.event.simulate(fix, event.target, jQuery.event.fix(event), true); - }; - - jQuery.event.special[fix] = { - setup: function () { - if (attaches++ === 0) { - document.addEventListener(orig, handler, true); - } - }, - teardown: function () { - if (--attaches === 0) { - document.removeEventListener(orig, handler, true); - } - } - }; - }); - } - - jQuery.fn.extend({ - - on: function (types, selector, data, fn, /*INTERNAL*/ one) { - var type, origFn; - - // Types can be a map of types/handlers - if (typeof types === "object") { - // ( types-Object, selector, data ) - if (typeof selector !== "string") { - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for (type in types) { - this.on(type, selector, data, types[type], one); - } - return this; - } - - if (data == null && fn == null) { - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if (fn == null) { - if (typeof selector === "string") { - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if (fn === false) { - fn = returnFalse; - } else if (!fn) { - return this; - } - - if (one === 1) { - origFn = fn; - fn = function (event) { - // Can use an empty set, since event contains the info - jQuery().off(event); - return origFn.apply(this, arguments); - }; - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || (origFn.guid = jQuery.guid++); - } - return this.each(function () { - jQuery.event.add(this, types, fn, data, selector); - }); - }, - one: function (types, selector, data, fn) { - return this.on(types, selector, data, fn, 1); - }, - off: function (types, selector, fn) { - var handleObj, type; - if (types && types.preventDefault && types.handleObj) { - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery(types.delegateTarget).off( - handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if (typeof types === "object") { - // ( types-object [, selector] ) - for (type in types) { - this.off(type, selector, types[type]); - } - return this; - } - if (selector === false || typeof selector === "function") { - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if (fn === false) { - fn = returnFalse; - } - return this.each(function () { - jQuery.event.remove(this, types, fn, selector); - }); - }, - - trigger: function (type, data) { - return this.each(function () { - jQuery.event.trigger(type, data, this); - }); - }, - triggerHandler: function (type, data) { - var elem = this[0]; - if (elem) { - return jQuery.event.trigger(type, data, elem, true); - } - } - }); - var isSimple = /^.[^:#\[\.,]*$/, - rparentsprev = /^(?:parents|prev(?:Until|All))/, - rneedsContext = jQuery.expr.match.needsContext, - // methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - - jQuery.fn.extend({ - find: function (selector) { - var i, - ret = [], - self = this, - len = self.length; - - if (typeof selector !== "string") { - return this.pushStack(jQuery(selector).filter(function () { - for (i = 0; i < len; i++) { - if (jQuery.contains(self[i], this)) { - return true; - } - } - })); - } - - for (i = 0; i < len; i++) { - jQuery.find(selector, self[i], ret); - } - - // Needed because $( selector, context ) becomes $( context ).find( selector ) - ret = this.pushStack(len > 1 ? jQuery.unique(ret) : ret); - ret.selector = this.selector ? this.selector + " " + selector : selector; - return ret; - }, - - has: function (target) { - var i, - targets = jQuery(target, this), - len = targets.length; - - return this.filter(function () { - for (i = 0; i < len; i++) { - if (jQuery.contains(this, targets[i])) { - return true; - } - } - }); - }, - - not: function (selector) { - return this.pushStack(winnow(this, selector || [], true)); - }, - - filter: function (selector) { - return this.pushStack(winnow(this, selector || [], false)); - }, - - is: function (selector) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test(selector) ? - jQuery(selector) : - selector || [], - false - ).length; - }, - - closest: function (selectors, context) { - var cur, - i = 0, - l = this.length, - ret = [], - pos = rneedsContext.test(selectors) || typeof selectors !== "string" ? - jQuery(selectors, context || this.context) : - 0; - - for (; i < l; i++) { - for (cur = this[i]; cur && cur !== context; cur = cur.parentNode) { - // Always skip document fragments - if (cur.nodeType < 11 && (pos ? - pos.index(cur) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector(cur, selectors))) { - - cur = ret.push(cur); - break; - } - } - } - - return this.pushStack(ret.length > 1 ? jQuery.unique(ret) : ret); - }, - - // Determine the position of an element within - // the matched set of elements - index: function (elem) { - - // No argument, return index in parent - if (!elem) { - return (this[0] && this[0].parentNode) ? this.first().prevAll().length : -1; - } - - // index in selector - if (typeof elem === "string") { - return jQuery.inArray(this[0], jQuery(elem)); - } - - // Locate the position of the desired element - return jQuery.inArray( - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[0] : elem, this); - }, - - add: function (selector, context) { - var set = typeof selector === "string" ? - jQuery(selector, context) : - jQuery.makeArray(selector && selector.nodeType ? [selector] : selector), - all = jQuery.merge(this.get(), set); - - return this.pushStack(jQuery.unique(all)); - }, - - addBack: function (selector) { - return this.add(selector == null ? - this.prevObject : this.prevObject.filter(selector) - ); - } - }); - - function sibling(cur, dir) { - do { - cur = cur[dir]; - } while (cur && cur.nodeType !== 1); - - return cur; - } - - jQuery.each({ - parent: function (elem) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function (elem) { - return jQuery.dir(elem, "parentNode"); - }, - parentsUntil: function (elem, i, until) { - return jQuery.dir(elem, "parentNode", until); - }, - next: function (elem) { - return sibling(elem, "nextSibling"); - }, - prev: function (elem) { - return sibling(elem, "previousSibling"); - }, - nextAll: function (elem) { - return jQuery.dir(elem, "nextSibling"); - }, - prevAll: function (elem) { - return jQuery.dir(elem, "previousSibling"); - }, - nextUntil: function (elem, i, until) { - return jQuery.dir(elem, "nextSibling", until); - }, - prevUntil: function (elem, i, until) { - return jQuery.dir(elem, "previousSibling", until); - }, - siblings: function (elem) { - return jQuery.sibling((elem.parentNode || {}).firstChild, elem); - }, - children: function (elem) { - return jQuery.sibling(elem.firstChild); - }, - contents: function (elem) { - return jQuery.nodeName(elem, "iframe") ? - elem.contentDocument || elem.contentWindow.document : - jQuery.merge([], elem.childNodes); - } - }, function (name, fn) { - jQuery.fn[name] = function (until, selector) { - var ret = jQuery.map(this, fn, until); - - if (name.slice(-5) !== "Until") { - selector = until; - } - - if (selector && typeof selector === "string") { - ret = jQuery.filter(selector, ret); - } - - if (this.length > 1) { - // Remove duplicates - if (!guaranteedUnique[name]) { - ret = jQuery.unique(ret); - } - - // Reverse order for parents* and prev-derivatives - if (rparentsprev.test(name)) { - ret = ret.reverse(); - } - } - - return this.pushStack(ret); - }; - }); - - jQuery.extend({ - filter: function (expr, elems, not) { - var elem = elems[0]; - - if (not) { - expr = ":not(" + expr + ")"; - } - - return elems.length === 1 && elem.nodeType === 1 ? - jQuery.find.matchesSelector(elem, expr) ? [elem] : [] : - jQuery.find.matches(expr, jQuery.grep(elems, function (elem) { - return elem.nodeType === 1; - })); - }, - - dir: function (elem, dir, until) { - var matched = [], - cur = elem[dir]; - - while (cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery(cur).is(until))) { - if (cur.nodeType === 1) { - matched.push(cur); - } - cur = cur[dir]; - } - return matched; - }, - - sibling: function (n, elem) { - var r = []; - - for (; n; n = n.nextSibling) { - if (n.nodeType === 1 && n !== elem) { - r.push(n); - } - } - - return r; - } - }); - - // Implement the identical functionality for filter and not - - function winnow(elements, qualifier, not) { - if (jQuery.isFunction(qualifier)) { - return jQuery.grep(elements, function (elem, i) { - /* jshint -W018 */ - return !!qualifier.call(elem, i, elem) !== not; - }); - - } - - if (qualifier.nodeType) { - return jQuery.grep(elements, function (elem) { - return (elem === qualifier) !== not; - }); - - } - - if (typeof qualifier === "string") { - if (isSimple.test(qualifier)) { - return jQuery.filter(qualifier, elements, not); - } - - qualifier = jQuery.filter(qualifier, elements); - } - - return jQuery.grep(elements, function (elem) { - return (jQuery.inArray(elem, qualifier) >= 0) !== not; - }); - } - - function createSafeFragment(document) { - var list = nodeNames.split("|"), - safeFrag = document.createDocumentFragment(); - - if (safeFrag.createElement) { - while (list.length) { - safeFrag.createElement( - list.pop() - ); - } - } - return safeFrag; - } - - var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" + - "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", - rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g, - rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"), - rleadingWhitespace = /^\s+/, - rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, - rtagName = /<([\w:]+)/, - rtbody = /\s*$/g, - - // We have to close these tags to support XHTML (#13200) - wrapMap = { - option: [1, ""], - legend: [1, "
    ", "
    "], - area: [1, "", ""], - param: [1, "", ""], - thead: [1, "", "
    "], - tr: [2, "", "
    "], - col: [2, "", "
    "], - td: [3, "", "
    "], - - // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags, - // unless wrapped in a div with non-breaking characters in front of it. - _default: jQuery.support.htmlSerialize ? [0, "", ""] : [1, "X
    ", "
    "] - }, - safeFragment = createSafeFragment(document), - fragmentDiv = safeFragment.appendChild(document.createElement("div")); - - wrapMap.optgroup = wrapMap.option; - wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; - wrapMap.th = wrapMap.td; - - jQuery.fn.extend({ - text: function (value) { - return jQuery.access(this, function (value) { - return value === undefined ? - jQuery.text(this) : - this.empty().append((this[0] && this[0].ownerDocument || document).createTextNode(value)); - }, null, value, arguments.length); - }, - - append: function () { - return this.domManip(arguments, function (elem) { - if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) { - var target = manipulationTarget(this, elem); - target.appendChild(elem); - } - }); - }, - - prepend: function () { - return this.domManip(arguments, function (elem) { - if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) { - var target = manipulationTarget(this, elem); - target.insertBefore(elem, target.firstChild); - } - }); - }, - - before: function () { - return this.domManip(arguments, function (elem) { - if (this.parentNode) { - this.parentNode.insertBefore(elem, this); - } - }); - }, - - after: function () { - return this.domManip(arguments, function (elem) { - if (this.parentNode) { - this.parentNode.insertBefore(elem, this.nextSibling); - } - }); - }, - - // keepData is for internal use only--do not document - remove: function (selector, keepData) { - var elem, - elems = selector ? jQuery.filter(selector, this) : this, - i = 0; - - for (; - (elem = elems[i]) != null; i++) { - - if (!keepData && elem.nodeType === 1) { - jQuery.cleanData(getAll(elem)); - } - - if (elem.parentNode) { - if (keepData && jQuery.contains(elem.ownerDocument, elem)) { - setGlobalEval(getAll(elem, "script")); - } - elem.parentNode.removeChild(elem); - } - } - - return this; - }, - - empty: function () { - var elem, - i = 0; - - for (; - (elem = this[i]) != null; i++) { - // Remove element nodes and prevent memory leaks - if (elem.nodeType === 1) { - jQuery.cleanData(getAll(elem, false)); - } - - // Remove any remaining nodes - while (elem.firstChild) { - elem.removeChild(elem.firstChild); - } - - // If this is a select, ensure that it displays empty (#12336) - // Support: IE<9 - if (elem.options && jQuery.nodeName(elem, "select")) { - elem.options.length = 0; - } - } - - return this; - }, - - clone: function (dataAndEvents, deepDataAndEvents) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map(function () { - return jQuery.clone(this, dataAndEvents, deepDataAndEvents); - }); - }, - - html: function (value) { - return jQuery.access(this, function (value) { - var elem = this[0] || {}, - i = 0, - l = this.length; - - if (value === undefined) { - return elem.nodeType === 1 ? - elem.innerHTML.replace(rinlinejQuery, "") : - undefined; - } - - // See if we can take a shortcut and just use innerHTML - if (typeof value === "string" && !rnoInnerhtml.test(value) && - (jQuery.support.htmlSerialize || !rnoshimcache.test(value)) && - (jQuery.support.leadingWhitespace || !rleadingWhitespace.test(value)) && !wrapMap[(rtagName.exec(value) || ["", ""])[1].toLowerCase()]) { - - value = value.replace(rxhtmlTag, "<$1>"); - - try { - for (; i < l; i++) { - // Remove element nodes and prevent memory leaks - elem = this[i] || {}; - if (elem.nodeType === 1) { - jQuery.cleanData(getAll(elem, false)); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch (e) {} - } - - if (elem) { - this.empty().append(value); - } - }, null, value, arguments.length); - }, - - replaceWith: function () { - var - // Snapshot the DOM in case .domManip sweeps something relevant into its fragment - args = jQuery.map(this, function (elem) { - return [elem.nextSibling, elem.parentNode]; - }), - i = 0; - - // Make the changes, replacing each context element with the new content - this.domManip(arguments, function (elem) { - var next = args[i++], - parent = args[i++]; - - if (parent) { - // Don't use the snapshot next if it has moved (#13810) - if (next && next.parentNode !== parent) { - next = this.nextSibling; - } - jQuery(this).remove(); - parent.insertBefore(elem, next); - } - // Allow new content to include elements from the context set - }, true); - - // Force removal if there was no new content (e.g., from empty arguments) - return i ? this : this.remove(); - }, - - detach: function (selector) { - return this.remove(selector, true); - }, - - domManip: function (args, callback, allowIntersection) { - - // Flatten any nested arrays - args = core_concat.apply([], args); - - var first, node, hasScripts, - scripts, doc, fragment, - i = 0, - l = this.length, - set = this, - iNoClone = l - 1, - value = args[0], - isFunction = jQuery.isFunction(value); - - // We can't cloneNode fragments that contain checked, in WebKit - if (isFunction || !(l <= 1 || typeof value !== "string" || jQuery.support.checkClone || !rchecked.test(value))) { - return this.each(function (index) { - var self = set.eq(index); - if (isFunction) { - args[0] = value.call(this, index, self.html()); - } - self.domManip(args, callback, allowIntersection); - }); - } - - if (l) { - fragment = jQuery.buildFragment(args, this[0].ownerDocument, false, !allowIntersection && this); - first = fragment.firstChild; - - if (fragment.childNodes.length === 1) { - fragment = first; - } - - if (first) { - scripts = jQuery.map(getAll(fragment, "script"), disableScript); - hasScripts = scripts.length; - - // Use the original fragment for the last item instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for (; i < l; i++) { - node = fragment; - - if (i !== iNoClone) { - node = jQuery.clone(node, true, true); - - // Keep references to cloned scripts for later restoration - if (hasScripts) { - jQuery.merge(scripts, getAll(node, "script")); - } - } - - callback.call(this[i], node, i); - } - - if (hasScripts) { - doc = scripts[scripts.length - 1].ownerDocument; - - // Reenable scripts - jQuery.map(scripts, restoreScript); - - // Evaluate executable scripts on first document insertion - for (i = 0; i < hasScripts; i++) { - node = scripts[i]; - if (rscriptType.test(node.type || "") && !jQuery._data(node, "globalEval") && jQuery.contains(doc, node)) { - - if (node.src) { - // Hope ajax is available... - jQuery._evalUrl(node.src); - } else { - jQuery.globalEval((node.text || node.textContent || node.innerHTML || "").replace(rcleanScript, "")); - } - } - } - } - - // Fix #11809: Avoid leaking memory - fragment = first = null; - } - } - - return this; - } - }); - - // Support: IE<8 - // Manipulating tables requires a tbody - - function manipulationTarget(elem, content) { - return jQuery.nodeName(elem, "table") && - jQuery.nodeName(content.nodeType === 1 ? content : content.firstChild, "tr") ? - - elem.getElementsByTagName("tbody")[0] || - elem.appendChild(elem.ownerDocument.createElement("tbody")) : - elem; - } - - // Replace/restore the type attribute of script elements for safe DOM manipulation - - function disableScript(elem) { - elem.type = (jQuery.find.attr(elem, "type") !== null) + "/" + elem.type; - return elem; - } - - function restoreScript(elem) { - var match = rscriptTypeMasked.exec(elem.type); - if (match) { - elem.type = match[1]; - } else { - elem.removeAttribute("type"); - } - return elem; - } - - // Mark scripts as having already been evaluated - - function setGlobalEval(elems, refElements) { - var elem, - i = 0; - for (; - (elem = elems[i]) != null; i++) { - jQuery._data(elem, "globalEval", !refElements || jQuery._data(refElements[i], "globalEval")); - } - } - - function cloneCopyEvent(src, dest) { - - if (dest.nodeType !== 1 || !jQuery.hasData(src)) { - return; - } - - var type, i, l, - oldData = jQuery._data(src), - curData = jQuery._data(dest, oldData), - events = oldData.events; - - if (events) { - delete curData.handle; - curData.events = {}; - - for (type in events) { - for (i = 0, l = events[type].length; i < l; i++) { - jQuery.event.add(dest, type, events[type][i]); - } - } - } - - // make the cloned public data object a copy from the original - if (curData.data) { - curData.data = jQuery.extend({}, curData.data); - } - } - - function fixCloneNodeIssues(src, dest) { - var nodeName, e, data; - - // We do not need to do anything for non-Elements - if (dest.nodeType !== 1) { - return; - } - - nodeName = dest.nodeName.toLowerCase(); - - // IE6-8 copies events bound via attachEvent when using cloneNode. - if (!jQuery.support.noCloneEvent && dest[jQuery.expando]) { - data = jQuery._data(dest); - - for (e in data.events) { - jQuery.removeEvent(dest, e, data.handle); - } - - // Event data gets referenced instead of copied if the expando gets copied too - dest.removeAttribute(jQuery.expando); - } - - // IE blanks contents when cloning scripts, and tries to evaluate newly-set text - if (nodeName === "script" && dest.text !== src.text) { - disableScript(dest).text = src.text; - restoreScript(dest); - - // IE6-10 improperly clones children of object elements using classid. - // IE10 throws NoModificationAllowedError if parent is null, #12132. - } else if (nodeName === "object") { - if (dest.parentNode) { - dest.outerHTML = src.outerHTML; - } - - // This path appears unavoidable for IE9. When cloning an object - // element in IE9, the outerHTML strategy above is not sufficient. - // If the src has innerHTML and the destination does not, - // copy the src.innerHTML into the dest.innerHTML. #10324 - if (jQuery.support.html5Clone && (src.innerHTML && !jQuery.trim(dest.innerHTML))) { - dest.innerHTML = src.innerHTML; - } - - } else if (nodeName === "input" && manipulation_rcheckableType.test(src.type)) { - // IE6-8 fails to persist the checked state of a cloned checkbox - // or radio button. Worse, IE6-7 fail to give the cloned element - // a checked appearance if the defaultChecked value isn't also set - - dest.defaultChecked = dest.checked = src.checked; - - // IE6-7 get confused and end up setting the value of a cloned - // checkbox/radio button to an empty string instead of "on" - if (dest.value !== src.value) { - dest.value = src.value; - } - - // IE6-8 fails to return the selected option to the default selected - // state when cloning options - } else if (nodeName === "option") { - dest.defaultSelected = dest.selected = src.defaultSelected; - - // IE6-8 fails to set the defaultValue to the correct value when - // cloning other types of input fields - } else if (nodeName === "input" || nodeName === "textarea") { - dest.defaultValue = src.defaultValue; - } - } - - jQuery.each({ - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" - }, function (name, original) { - jQuery.fn[name] = function (selector) { - var elems, - i = 0, - ret = [], - insert = jQuery(selector), - last = insert.length - 1; - - for (; i <= last; i++) { - elems = i === last ? this : this.clone(true); - jQuery(insert[i])[original](elems); - - // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get() - core_push.apply(ret, elems.get()); - } - - return this.pushStack(ret); - }; - }); - - function getAll(context, tag) { - var elems, elem, - i = 0, - found = typeof context.getElementsByTagName !== core_strundefined ? context.getElementsByTagName(tag || "*") : - typeof context.querySelectorAll !== core_strundefined ? context.querySelectorAll(tag || "*") : - undefined; - - if (!found) { - for (found = [], elems = context.childNodes || context; - (elem = elems[i]) != null; i++) { - if (!tag || jQuery.nodeName(elem, tag)) { - found.push(elem); - } else { - jQuery.merge(found, getAll(elem, tag)); - } - } - } - - return tag === undefined || tag && jQuery.nodeName(context, tag) ? - jQuery.merge([context], found) : - found; - } - - // Used in buildFragment, fixes the defaultChecked property - - function fixDefaultChecked(elem) { - if (manipulation_rcheckableType.test(elem.type)) { - elem.defaultChecked = elem.checked; - } - } - - jQuery.extend({ - clone: function (elem, dataAndEvents, deepDataAndEvents) { - var destElements, node, clone, i, srcElements, - inPage = jQuery.contains(elem.ownerDocument, elem); - - if (jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test("<" + elem.nodeName + ">")) { - clone = elem.cloneNode(true); - - // IE<=8 does not properly clone detached, unknown element nodes - } else { - fragmentDiv.innerHTML = elem.outerHTML; - fragmentDiv.removeChild(clone = fragmentDiv.firstChild); - } - - if ((!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) && - (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem)) { - - // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 - destElements = getAll(clone); - srcElements = getAll(elem); - - // Fix all IE cloning issues - for (i = 0; - (node = srcElements[i]) != null; ++i) { - // Ensure that the destination node is not null; Fixes #9587 - if (destElements[i]) { - fixCloneNodeIssues(node, destElements[i]); - } - } - } - - // Copy the events from the original to the clone - if (dataAndEvents) { - if (deepDataAndEvents) { - srcElements = srcElements || getAll(elem); - destElements = destElements || getAll(clone); - - for (i = 0; - (node = srcElements[i]) != null; i++) { - cloneCopyEvent(node, destElements[i]); - } - } else { - cloneCopyEvent(elem, clone); - } - } - - // Preserve script evaluation history - destElements = getAll(clone, "script"); - if (destElements.length > 0) { - setGlobalEval(destElements, !inPage && getAll(elem, "script")); - } - - destElements = srcElements = node = null; - - // Return the cloned set - return clone; - }, - - buildFragment: function (elems, context, scripts, selection) { - var j, elem, contains, - tmp, tag, tbody, wrap, - l = elems.length, - - // Ensure a safe fragment - safe = createSafeFragment(context), - - nodes = [], - i = 0; - - for (; i < l; i++) { - elem = elems[i]; - - if (elem || elem === 0) { - - // Add nodes directly - if (jQuery.type(elem) === "object") { - jQuery.merge(nodes, elem.nodeType ? [elem] : elem); - - // Convert non-html into a text node - } else if (!rhtml.test(elem)) { - nodes.push(context.createTextNode(elem)); - - // Convert html into DOM nodes - } else { - tmp = tmp || safe.appendChild(context.createElement("div")); - - // Deserialize a standard representation - tag = (rtagName.exec(elem) || ["", ""])[1].toLowerCase(); - wrap = wrapMap[tag] || wrapMap._default; - - tmp.innerHTML = wrap[1] + elem.replace(rxhtmlTag, "<$1>") + wrap[2]; - - // Descend through wrappers to the right content - j = wrap[0]; - while (j--) { - tmp = tmp.lastChild; - } - - // Manually add leading whitespace removed by IE - if (!jQuery.support.leadingWhitespace && rleadingWhitespace.test(elem)) { - nodes.push(context.createTextNode(rleadingWhitespace.exec(elem)[0])); - } - - // Remove IE's autoinserted from table fragments - if (!jQuery.support.tbody) { - - // String was a , *may* have spurious - elem = tag === "table" && !rtbody.test(elem) ? - tmp.firstChild : - - // String was a bare or - wrap[1] === "
    " && !rtbody.test(elem) ? - tmp : - 0; - - j = elem && elem.childNodes.length; - while (j--) { - if (jQuery.nodeName((tbody = elem.childNodes[j]), "tbody") && !tbody.childNodes.length) { - elem.removeChild(tbody); - } - } - } - - jQuery.merge(nodes, tmp.childNodes); - - // Fix #12392 for WebKit and IE > 9 - tmp.textContent = ""; - - // Fix #12392 for oldIE - while (tmp.firstChild) { - tmp.removeChild(tmp.firstChild); - } - - // Remember the top-level container for proper cleanup - tmp = safe.lastChild; - } - } - } - - // Fix #11356: Clear elements from fragment - if (tmp) { - safe.removeChild(tmp); - } - - // Reset defaultChecked for any radios and checkboxes - // about to be appended to the DOM in IE 6/7 (#8060) - if (!jQuery.support.appendChecked) { - jQuery.grep(getAll(nodes, "input"), fixDefaultChecked); - } - - i = 0; - while ((elem = nodes[i++])) { - - // #4087 - If origin and destination elements are the same, and this is - // that element, do not do anything - if (selection && jQuery.inArray(elem, selection) !== -1) { - continue; - } - - contains = jQuery.contains(elem.ownerDocument, elem); - - // Append to fragment - tmp = getAll(safe.appendChild(elem), "script"); - - // Preserve script evaluation history - if (contains) { - setGlobalEval(tmp); - } - - // Capture executables - if (scripts) { - j = 0; - while ((elem = tmp[j++])) { - if (rscriptType.test(elem.type || "")) { - scripts.push(elem); - } - } - } - } - - tmp = null; - - return safe; - }, - - cleanData: function (elems, /* internal */ acceptData) { - var elem, type, id, data, - i = 0, - internalKey = jQuery.expando, - cache = jQuery.cache, - deleteExpando = jQuery.support.deleteExpando, - special = jQuery.event.special; - - for (; - (elem = elems[i]) != null; i++) { - - if (acceptData || jQuery.acceptData(elem)) { - - id = elem[internalKey]; - data = id && cache[id]; - - if (data) { - if (data.events) { - for (type in data.events) { - if (special[type]) { - jQuery.event.remove(elem, type); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent(elem, type, data.handle); - } - } - } - - // Remove cache only if it was not already removed by jQuery.event.remove - if (cache[id]) { - - delete cache[id]; - - // IE does not allow us to delete expando properties from nodes, - // nor does it have a removeAttribute function on Document nodes; - // we must handle all of these cases - if (deleteExpando) { - delete elem[internalKey]; - - } else if (typeof elem.removeAttribute !== core_strundefined) { - elem.removeAttribute(internalKey); - - } else { - elem[internalKey] = null; - } - - core_deletedIds.push(id); - } - } - } - } - }, - - _evalUrl: function (url) { - return jQuery.ajax({ - url: url, - type: "GET", - dataType: "script", - async: false, - global: false, - "throws": true - }); - } - }); - jQuery.fn.extend({ - wrapAll: function (html) { - if (jQuery.isFunction(html)) { - return this.each(function (i) { - jQuery(this).wrapAll(html.call(this, i)); - }); - } - - if (this[0]) { - // The elements to wrap the target around - var wrap = jQuery(html, this[0].ownerDocument).eq(0).clone(true); - - if (this[0].parentNode) { - wrap.insertBefore(this[0]); - } - - wrap.map(function () { - var elem = this; - - while (elem.firstChild && elem.firstChild.nodeType === 1) { - elem = elem.firstChild; - } - - return elem; - }).append(this); - } - - return this; - }, - - wrapInner: function (html) { - if (jQuery.isFunction(html)) { - return this.each(function (i) { - jQuery(this).wrapInner(html.call(this, i)); - }); - } - - return this.each(function () { - var self = jQuery(this), - contents = self.contents(); - - if (contents.length) { - contents.wrapAll(html); - - } else { - self.append(html); - } - }); - }, - - wrap: function (html) { - var isFunction = jQuery.isFunction(html); - - return this.each(function (i) { - jQuery(this).wrapAll(isFunction ? html.call(this, i) : html); - }); - }, - - unwrap: function () { - return this.parent().each(function () { - if (!jQuery.nodeName(this, "body")) { - jQuery(this).replaceWith(this.childNodes); - } - }).end(); - } - }); - var iframe, getStyles, curCSS, - ralpha = /alpha\([^)]*\)/i, - ropacity = /opacity\s*=\s*([^)]*)/, - rposition = /^(top|right|bottom|left)$/, - // swappable if display is none or starts with table except "table", "table-cell", or "table-caption" - // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rmargin = /^margin/, - rnumsplit = new RegExp("^(" + core_pnum + ")(.*)$", "i"), - rnumnonpx = new RegExp("^(" + core_pnum + ")(?!px)[a-z%]+$", "i"), - rrelNum = new RegExp("^([+-])=(" + core_pnum + ")", "i"), - elemdisplay = { - BODY: "block" - }, - - cssShow = { - position: "absolute", - visibility: "hidden", - display: "block" - }, - cssNormalTransform = { - letterSpacing: 0, - fontWeight: 400 - }, - - cssExpand = ["Top", "Right", "Bottom", "Left"], - cssPrefixes = ["Webkit", "O", "Moz", "ms"]; - - // return a css property mapped to a potentially vendor prefixed property - - function vendorPropName(style, name) { - - // shortcut for names that are not vendor prefixed - if (name in style) { - return name; - } - - // check for vendor prefixed names - var capName = name.charAt(0).toUpperCase() + name.slice(1), - origName = name, - i = cssPrefixes.length; - - while (i--) { - name = cssPrefixes[i] + capName; - if (name in style) { - return name; - } - } - - return origName; - } - - function isHidden(elem, el) { - // isHidden might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - return jQuery.css(elem, "display") === "none" || !jQuery.contains(elem.ownerDocument, elem); - } - - function showHide(elements, show) { - var display, elem, hidden, - values = [], - index = 0, - length = elements.length; - - for (; index < length; index++) { - elem = elements[index]; - if (!elem.style) { - continue; - } - - values[index] = jQuery._data(elem, "olddisplay"); - display = elem.style.display; - if (show) { - // Reset the inline display of this element to learn if it is - // being hidden by cascaded rules or not - if (!values[index] && display === "none") { - elem.style.display = ""; - } - - // Set elements which have been overridden with display: none - // in a stylesheet to whatever the default browser style is - // for such an element - if (elem.style.display === "" && isHidden(elem)) { - values[index] = jQuery._data(elem, "olddisplay", css_defaultDisplay(elem.nodeName)); - } - } else { - - if (!values[index]) { - hidden = isHidden(elem); - - if (display && display !== "none" || !hidden) { - jQuery._data(elem, "olddisplay", hidden ? display : jQuery.css(elem, "display")); - } - } - } - } - - // Set the display of most of the elements in a second loop - // to avoid the constant reflow - for (index = 0; index < length; index++) { - elem = elements[index]; - if (!elem.style) { - continue; - } - if (!show || elem.style.display === "none" || elem.style.display === "") { - elem.style.display = show ? values[index] || "" : "none"; - } - } - - return elements; - } - - jQuery.fn.extend({ - css: function (name, value) { - return jQuery.access(this, function (elem, name, value) { - var len, styles, - map = {}, - i = 0; - - if (jQuery.isArray(name)) { - styles = getStyles(elem); - len = name.length; - - for (; i < len; i++) { - map[name[i]] = jQuery.css(elem, name[i], false, styles); - } - - return map; - } - - return value !== undefined ? - jQuery.style(elem, name, value) : - jQuery.css(elem, name); - }, name, value, arguments.length > 1); - }, - show: function () { - return showHide(this, true); - }, - hide: function () { - return showHide(this); - }, - toggle: function (state) { - if (typeof state === "boolean") { - return state ? this.show() : this.hide(); - } - - return this.each(function () { - if (isHidden(this)) { - jQuery(this).show(); - } else { - jQuery(this).hide(); - } - }); - } - }); - - jQuery.extend({ - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function (elem, computed) { - if (computed) { - // We should always get a number back from opacity - var ret = curCSS(elem, "opacity"); - return ret === "" ? "1" : ret; - } - } - } - }, - - // Don't automatically add "px" to these possibly-unitless properties - cssNumber: { - "columnCount": true, - "fillOpacity": true, - "fontWeight": true, - "lineHeight": true, - "opacity": true, - "order": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: { - // normalize float css property - "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat" - }, - - // Get and set the style property on a DOM Node - style: function (elem, name, value, extra) { - // Don't set styles on text and comment nodes - if (!elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = jQuery.camelCase(name), - style = elem.style; - - name = jQuery.cssProps[origName] || (jQuery.cssProps[origName] = vendorPropName(style, origName)); - - // gets hook for the prefixed version - // followed by the unprefixed version - hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName]; - - // Check if we're setting a value - if (value !== undefined) { - type = typeof value; - - // convert relative number strings (+= or -=) to relative numbers. #7345 - if (type === "string" && (ret = rrelNum.exec(value))) { - value = (ret[1] + 1) * ret[2] + parseFloat(jQuery.css(elem, name)); - // Fixes bug #9237 - type = "number"; - } - - // Make sure that NaN and null values aren't set. See: #7116 - if (value == null || type === "number" && isNaN(value)) { - return; - } - - // If a number was passed in, add 'px' to the (except for certain CSS properties) - if (type === "number" && !jQuery.cssNumber[origName]) { - value += "px"; - } - - // Fixes #8908, it can be done more correctly by specifing setters in cssHooks, - // but it would mean to define eight (for every problematic property) identical functions - if (!jQuery.support.clearCloneStyle && value === "" && name.indexOf("background") === 0) { - style[name] = "inherit"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if (!hooks || !("set" in hooks) || (value = hooks.set(elem, value, extra)) !== undefined) { - - // Wrapped to prevent IE from throwing errors when 'invalid' values are provided - // Fixes bug #5509 - try { - style[name] = value; - } catch (e) {} - } - - } else { - // If a hook was provided get the non-computed value from there - if (hooks && "get" in hooks && (ret = hooks.get(elem, false, extra)) !== undefined) { - return ret; - } - - // Otherwise just get the value from the style object - return style[name]; - } - }, - - css: function (elem, name, extra, styles) { - var num, val, hooks, - origName = jQuery.camelCase(name); - - // Make sure that we're working with the right name - name = jQuery.cssProps[origName] || (jQuery.cssProps[origName] = vendorPropName(elem.style, origName)); - - // gets hook for the prefixed version - // followed by the unprefixed version - hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName]; - - // If a hook was provided get the computed value from there - if (hooks && "get" in hooks) { - val = hooks.get(elem, true, extra); - } - - // Otherwise, if a way to get the computed value exists, use that - if (val === undefined) { - val = curCSS(elem, name, styles); - } - - //convert "normal" to computed value - if (val === "normal" && name in cssNormalTransform) { - val = cssNormalTransform[name]; - } - - // Return, converting to number if forced or a qualifier was provided and val looks numeric - if (extra === "" || extra) { - num = parseFloat(val); - return extra === true || jQuery.isNumeric(num) ? num || 0 : val; - } - return val; - } - }); - - // NOTE: we've included the "window" in window.getComputedStyle - // because jsdom on node.js will break without it. - if (window.getComputedStyle) { - getStyles = function (elem) { - return window.getComputedStyle(elem, null); - }; - - curCSS = function (elem, name, _computed) { - var width, minWidth, maxWidth, - computed = _computed || getStyles(elem), - - // getPropertyValue is only needed for .css('filter') in IE9, see #12537 - ret = computed ? computed.getPropertyValue(name) || computed[name] : undefined, - style = elem.style; - - if (computed) { - - if (ret === "" && !jQuery.contains(elem.ownerDocument, elem)) { - ret = jQuery.style(elem, name); - } - - // A tribute to the "awesome hack by Dean Edwards" - // Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right - // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels - // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values - if (rnumnonpx.test(ret) && rmargin.test(name)) { - - // Remember the original values - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - // Put in the new values to get a computed value out - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - // Revert the changed values - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - return ret; - }; - } else if (document.documentElement.currentStyle) { - getStyles = function (elem) { - return elem.currentStyle; - }; - - curCSS = function (elem, name, _computed) { - var left, rs, rsLeft, - computed = _computed || getStyles(elem), - ret = computed ? computed[name] : undefined, - style = elem.style; - - // Avoid setting ret to empty string here - // so we don't default to auto - if (ret == null && style && style[name]) { - ret = style[name]; - } - - // From the awesome hack by Dean Edwards - // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 - - // If we're not dealing with a regular pixel number - // but a number that has a weird ending, we need to convert it to pixels - // but not position css attributes, as those are proportional to the parent element instead - // and we can't measure the parent instead because it might trigger a "stacking dolls" problem - if (rnumnonpx.test(ret) && !rposition.test(name)) { - - // Remember the original values - left = style.left; - rs = elem.runtimeStyle; - rsLeft = rs && rs.left; - - // Put in the new values to get a computed value out - if (rsLeft) { - rs.left = elem.currentStyle.left; - } - style.left = name === "fontSize" ? "1em" : ret; - ret = style.pixelLeft + "px"; - - // Revert the changed values - style.left = left; - if (rsLeft) { - rs.left = rsLeft; - } - } - - return ret === "" ? "auto" : ret; - }; - } - - function setPositiveNumber(elem, value, subtract) { - var matches = rnumsplit.exec(value); - return matches ? - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max(0, matches[1] - (subtract || 0)) + (matches[2] || "px") : - value; - } - - function augmentWidthOrHeight(elem, name, extra, isBorderBox, styles) { - var i = extra === (isBorderBox ? "border" : "content") ? - // If we already have the right measurement, avoid augmentation - 4 : - // Otherwise initialize for horizontal or vertical properties - name === "width" ? 1 : 0, - - val = 0; - - for (; i < 4; i += 2) { - // both box models exclude margin, so add it if we want it - if (extra === "margin") { - val += jQuery.css(elem, extra + cssExpand[i], true, styles); - } - - if (isBorderBox) { - // border-box includes padding, so remove it if we want content - if (extra === "content") { - val -= jQuery.css(elem, "padding" + cssExpand[i], true, styles); - } - - // at this point, extra isn't border nor margin, so remove border - if (extra !== "margin") { - val -= jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles); - } - } else { - // at this point, extra isn't content, so add padding - val += jQuery.css(elem, "padding" + cssExpand[i], true, styles); - - // at this point, extra isn't content nor padding, so add border - if (extra !== "padding") { - val += jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles); - } - } - } - - return val; - } - - function getWidthOrHeight(elem, name, extra) { - - // Start with offset property, which is equivalent to the border-box value - var valueIsBorderBox = true, - val = name === "width" ? elem.offsetWidth : elem.offsetHeight, - styles = getStyles(elem), - isBorderBox = jQuery.support.boxSizing && jQuery.css(elem, "boxSizing", false, styles) === "border-box"; - - // some non-html elements return undefined for offsetWidth, so check for null/undefined - // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285 - // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668 - if (val <= 0 || val == null) { - // Fall back to computed then uncomputed css if necessary - val = curCSS(elem, name, styles); - if (val < 0 || val == null) { - val = elem.style[name]; - } - - // Computed unit is not pixels. Stop here and return. - if (rnumnonpx.test(val)) { - return val; - } - - // we need the check for style in case a browser which returns unreliable values - // for getComputedStyle silently falls back to the reliable elem.style - valueIsBorderBox = isBorderBox && (jQuery.support.boxSizingReliable || val === elem.style[name]); - - // Normalize "", auto, and prepare for extra - val = parseFloat(val) || 0; - } - - // use the active box-sizing model to add/subtract irrelevant styles - return (val + - augmentWidthOrHeight( - elem, - name, - extra || (isBorderBox ? "border" : "content"), - valueIsBorderBox, - styles - ) - ) + "px"; - } - - // Try to determine the default display value of an element - - function css_defaultDisplay(nodeName) { - var doc = document, - display = elemdisplay[nodeName]; - - if (!display) { - display = actualDisplay(nodeName, doc); - - // If the simple way fails, read from inside an iframe - if (display === "none" || !display) { - // Use the already-created iframe if possible - iframe = (iframe || - jQuery("