diff --git a/.eslintignore b/.eslintignore index 0799652254..250640f954 100644 --- a/.eslintignore +++ b/.eslintignore @@ -18,3 +18,4 @@ logs/ *.ipr *.iws /coverage +/build diff --git a/.tx/config b/.tx/config index a745278980..e85414a079 100644 --- a/.tx/config +++ b/.tx/config @@ -43,6 +43,7 @@ trans.sr = public/language/sr/category.json trans.sv = public/language/sv/category.json trans.th = public/language/th/category.json trans.tr = public/language/tr/category.json +trans.uk = public/language/uk/category.json trans.vi = public/language/vi/category.json trans.zh_CN = public/language/zh-CN/category.json trans.zh_TW = public/language/zh-TW/category.json @@ -90,6 +91,7 @@ trans.sr = public/language/sr/login.json trans.sv = public/language/sv/login.json trans.th = public/language/th/login.json trans.tr = public/language/tr/login.json +trans.uk = public/language/uk/login.json trans.vi = public/language/vi/login.json trans.zh_CN = public/language/zh-CN/login.json trans.zh_TW = public/language/zh-TW/login.json @@ -137,6 +139,7 @@ trans.sr = public/language/sr/recent.json trans.sv = public/language/sv/recent.json trans.th = public/language/th/recent.json trans.tr = public/language/tr/recent.json +trans.uk = public/language/uk/recent.json trans.vi = public/language/vi/recent.json trans.zh_CN = public/language/zh-CN/recent.json trans.zh_TW = public/language/zh-TW/recent.json @@ -184,6 +187,7 @@ trans.sr = public/language/sr/unread.json trans.sv = public/language/sv/unread.json trans.th = public/language/th/unread.json trans.tr = public/language/tr/unread.json +trans.uk = public/language/uk/unread.json trans.vi = public/language/vi/unread.json trans.zh_CN = public/language/zh-CN/unread.json trans.zh_TW = public/language/zh-TW/unread.json @@ -231,6 +235,7 @@ trans.sr = public/language/sr/modules.json trans.sv = public/language/sv/modules.json trans.th = public/language/th/modules.json trans.tr = public/language/tr/modules.json +trans.uk = public/language/uk/modules.json trans.vi = public/language/vi/modules.json trans.zh_CN = public/language/zh-CN/modules.json trans.zh_TW = public/language/zh-TW/modules.json @@ -278,6 +283,7 @@ trans.sr = public/language/sr/register.json trans.sv = public/language/sv/register.json trans.th = public/language/th/register.json trans.tr = public/language/tr/register.json +trans.uk = public/language/uk/register.json trans.vi = public/language/vi/register.json trans.zh_CN = public/language/zh-CN/register.json trans.zh_TW = public/language/zh-TW/register.json @@ -325,6 +331,7 @@ trans.sr = public/language/sr/user.json trans.sv = public/language/sv/user.json trans.th = public/language/th/user.json trans.tr = public/language/tr/user.json +trans.uk = public/language/uk/user.json trans.vi = public/language/vi/user.json trans.zh_CN = public/language/zh-CN/user.json trans.zh_TW = public/language/zh-TW/user.json @@ -372,6 +379,7 @@ trans.sr = public/language/sr/global.json trans.sv = public/language/sv/global.json trans.th = public/language/th/global.json trans.tr = public/language/tr/global.json +trans.uk = public/language/uk/global.json trans.vi = public/language/vi/global.json trans.zh_CN = public/language/zh-CN/global.json trans.zh_TW = public/language/zh-TW/global.json @@ -419,6 +427,7 @@ trans.sr = public/language/sr/notifications.json trans.sv = public/language/sv/notifications.json trans.th = public/language/th/notifications.json trans.tr = public/language/tr/notifications.json +trans.uk = public/language/uk/notifications.json trans.vi = public/language/vi/notifications.json trans.zh_CN = public/language/zh-CN/notifications.json trans.zh_TW = public/language/zh-TW/notifications.json @@ -466,6 +475,7 @@ trans.sr = public/language/sr/reset_password.json trans.sv = public/language/sv/reset_password.json trans.th = public/language/th/reset_password.json trans.tr = public/language/tr/reset_password.json +trans.uk = public/language/uk/reset_password.json trans.vi = public/language/vi/reset_password.json trans.zh_CN = public/language/zh-CN/reset_password.json trans.zh_TW = public/language/zh-TW/reset_password.json @@ -513,6 +523,7 @@ trans.sr = public/language/sr/users.json trans.sv = public/language/sv/users.json trans.th = public/language/th/users.json trans.tr = public/language/tr/users.json +trans.uk = public/language/uk/users.json trans.vi = public/language/vi/users.json trans.zh_CN = public/language/zh-CN/users.json trans.zh_TW = public/language/zh-TW/users.json @@ -560,6 +571,7 @@ trans.sr = public/language/sr/language.json trans.sv = public/language/sv/language.json trans.th = public/language/th/language.json trans.tr = public/language/tr/language.json +trans.uk = public/language/uk/language.json trans.vi = public/language/vi/language.json trans.zh_CN = public/language/zh-CN/language.json trans.zh_TW = public/language/zh-TW/language.json @@ -607,6 +619,7 @@ trans.sr = public/language/sr/pages.json trans.sv = public/language/sv/pages.json trans.th = public/language/th/pages.json trans.tr = public/language/tr/pages.json +trans.uk = public/language/uk/pages.json trans.vi = public/language/vi/pages.json trans.zh_CN = public/language/zh-CN/pages.json trans.zh_TW = public/language/zh-TW/pages.json @@ -654,6 +667,7 @@ trans.sr = public/language/sr/topic.json trans.sv = public/language/sv/topic.json trans.th = public/language/th/topic.json trans.tr = public/language/tr/topic.json +trans.uk = public/language/uk/topic.json trans.vi = public/language/vi/topic.json trans.zh_CN = public/language/zh-CN/topic.json trans.zh_TW = public/language/zh-TW/topic.json @@ -701,6 +715,7 @@ trans.sr = public/language/sr/success.json trans.sv = public/language/sv/success.json trans.th = public/language/th/success.json trans.tr = public/language/tr/success.json +trans.uk = public/language/uk/success.json trans.vi = public/language/vi/success.json trans.zh_CN = public/language/zh-CN/success.json trans.zh_TW = public/language/zh-TW/success.json @@ -748,6 +763,7 @@ trans.sr = public/language/sr/error.json trans.sv = public/language/sv/error.json trans.th = public/language/th/error.json trans.tr = public/language/tr/error.json +trans.uk = public/language/uk/error.json trans.vi = public/language/vi/error.json trans.zh_CN = public/language/zh-CN/error.json trans.zh_TW = public/language/zh-TW/error.json @@ -795,6 +811,7 @@ trans.sr = public/language/sr/tags.json trans.sv = public/language/sv/tags.json trans.th = public/language/th/tags.json trans.tr = public/language/tr/tags.json +trans.uk = public/language/uk/tags.json trans.vi = public/language/vi/tags.json trans.zh_CN = public/language/zh-CN/tags.json trans.zh_TW = public/language/zh-TW/tags.json @@ -842,6 +859,7 @@ trans.sr = public/language/sr/email.json trans.sv = public/language/sv/email.json trans.th = public/language/th/email.json trans.tr = public/language/tr/email.json +trans.uk = public/language/uk/email.json trans.vi = public/language/vi/email.json trans.zh_CN = public/language/zh-CN/email.json trans.zh_TW = public/language/zh-TW/email.json @@ -889,6 +907,7 @@ trans.sr = public/language/sr/search.json trans.sv = public/language/sv/search.json trans.th = public/language/th/search.json trans.tr = public/language/tr/search.json +trans.uk = public/language/uk/search.json trans.vi = public/language/vi/search.json trans.zh_CN = public/language/zh-CN/search.json trans.zh_TW = public/language/zh-TW/search.json @@ -936,6 +955,7 @@ trans.sr = public/language/sr/groups.json trans.sv = public/language/sv/groups.json trans.th = public/language/th/groups.json trans.tr = public/language/tr/groups.json +trans.uk = public/language/uk/groups.json trans.vi = public/language/vi/groups.json trans.zh_CN = public/language/zh-CN/groups.json trans.zh_TW = public/language/zh-TW/groups.json @@ -983,6 +1003,7 @@ trans.sr = public/language/sr/uploads.json trans.sv = public/language/sv/uploads.json trans.th = public/language/th/uploads.json trans.tr = public/language/tr/uploads.json +trans.uk = public/language/uk/uploads.json trans.vi = public/language/vi/uploads.json trans.zh_CN = public/language/zh-CN/uploads.json trans.zh_TW = public/language/zh-TW/uploads.json @@ -1030,6 +1051,7 @@ trans.sr = public/language/sr/admin/admin.json trans.sv = public/language/sv/admin/admin.json trans.th = public/language/th/admin/admin.json trans.tr = public/language/tr/admin/admin.json +trans.uk = public/language/uk/admin/admin.json trans.vi = public/language/vi/admin/admin.json trans.zh_CN = public/language/zh-CN/admin/admin.json trans.zh_TW = public/language/zh-TW/admin/admin.json @@ -1077,6 +1099,7 @@ trans.sr = public/language/sr/admin/menu.json trans.sv = public/language/sv/admin/menu.json trans.th = public/language/th/admin/menu.json trans.tr = public/language/tr/admin/menu.json +trans.uk = public/language/uk/admin/menu.json trans.vi = public/language/vi/admin/menu.json trans.zh_CN = public/language/zh-CN/admin/menu.json trans.zh_TW = public/language/zh-TW/admin/menu.json @@ -1124,6 +1147,7 @@ trans.sr = public/language/sr/admin/advanced/cache.json trans.sv = public/language/sv/admin/advanced/cache.json trans.th = public/language/th/admin/advanced/cache.json trans.tr = public/language/tr/admin/advanced/cache.json +trans.uk = public/language/uk/admin/advanced/cache.json trans.vi = public/language/vi/admin/advanced/cache.json trans.zh_CN = public/language/zh-CN/admin/advanced/cache.json trans.zh_TW = public/language/zh-TW/admin/advanced/cache.json @@ -1171,6 +1195,7 @@ trans.sr = public/language/sr/admin/advanced/database.json trans.sv = public/language/sv/admin/advanced/database.json trans.th = public/language/th/admin/advanced/database.json trans.tr = public/language/tr/admin/advanced/database.json +trans.uk = public/language/uk/admin/advanced/database.json trans.vi = public/language/vi/admin/advanced/database.json trans.zh_CN = public/language/zh-CN/admin/advanced/database.json trans.zh_TW = public/language/zh-TW/admin/advanced/database.json @@ -1218,6 +1243,7 @@ trans.sr = public/language/sr/admin/advanced/errors.json trans.sv = public/language/sv/admin/advanced/errors.json trans.th = public/language/th/admin/advanced/errors.json trans.tr = public/language/tr/admin/advanced/errors.json +trans.uk = public/language/uk/admin/advanced/errors.json trans.vi = public/language/vi/admin/advanced/errors.json trans.zh_CN = public/language/zh-CN/admin/advanced/errors.json trans.zh_TW = public/language/zh-TW/admin/advanced/errors.json @@ -1265,6 +1291,7 @@ trans.sr = public/language/sr/admin/advanced/events.json trans.sv = public/language/sv/admin/advanced/events.json trans.th = public/language/th/admin/advanced/events.json trans.tr = public/language/tr/admin/advanced/events.json +trans.uk = public/language/uk/admin/advanced/events.json trans.vi = public/language/vi/admin/advanced/events.json trans.zh_CN = public/language/zh-CN/admin/advanced/events.json trans.zh_TW = public/language/zh-TW/admin/advanced/events.json @@ -1312,6 +1339,7 @@ trans.sr = public/language/sr/admin/advanced/logs.json trans.sv = public/language/sv/admin/advanced/logs.json trans.th = public/language/th/admin/advanced/logs.json trans.tr = public/language/tr/admin/advanced/logs.json +trans.uk = public/language/uk/admin/advanced/logs.json trans.vi = public/language/vi/admin/advanced/logs.json trans.zh_CN = public/language/zh-CN/admin/advanced/logs.json trans.zh_TW = public/language/zh-TW/admin/advanced/logs.json @@ -1359,6 +1387,7 @@ trans.sr = public/language/sr/admin/appearance/customise.json trans.sv = public/language/sv/admin/appearance/customise.json trans.th = public/language/th/admin/appearance/customise.json trans.tr = public/language/tr/admin/appearance/customise.json +trans.uk = public/language/uk/admin/appearance/customise.json trans.vi = public/language/vi/admin/appearance/customise.json trans.zh_CN = public/language/zh-CN/admin/appearance/customise.json trans.zh_TW = public/language/zh-TW/admin/appearance/customise.json @@ -1406,6 +1435,7 @@ trans.sr = public/language/sr/admin/appearance/skins.json trans.sv = public/language/sv/admin/appearance/skins.json trans.th = public/language/th/admin/appearance/skins.json trans.tr = public/language/tr/admin/appearance/skins.json +trans.uk = public/language/uk/admin/appearance/skins.json trans.vi = public/language/vi/admin/appearance/skins.json trans.zh_CN = public/language/zh-CN/admin/appearance/skins.json trans.zh_TW = public/language/zh-TW/admin/appearance/skins.json @@ -1453,6 +1483,7 @@ trans.sr = public/language/sr/admin/appearance/themes.json trans.sv = public/language/sv/admin/appearance/themes.json trans.th = public/language/th/admin/appearance/themes.json trans.tr = public/language/tr/admin/appearance/themes.json +trans.uk = public/language/uk/admin/appearance/themes.json trans.vi = public/language/vi/admin/appearance/themes.json trans.zh_CN = public/language/zh-CN/admin/appearance/themes.json trans.zh_TW = public/language/zh-TW/admin/appearance/themes.json @@ -1500,6 +1531,7 @@ trans.sr = public/language/sr/admin/development/info.json trans.sv = public/language/sv/admin/development/info.json trans.th = public/language/th/admin/development/info.json trans.tr = public/language/tr/admin/development/info.json +trans.uk = public/language/uk/admin/development/info.json trans.vi = public/language/vi/admin/development/info.json trans.zh_CN = public/language/zh-CN/admin/development/info.json trans.zh_TW = public/language/zh-TW/admin/development/info.json @@ -1547,6 +1579,7 @@ trans.sr = public/language/sr/admin/development/logger.json trans.sv = public/language/sv/admin/development/logger.json trans.th = public/language/th/admin/development/logger.json trans.tr = public/language/tr/admin/development/logger.json +trans.uk = public/language/uk/admin/development/logger.json trans.vi = public/language/vi/admin/development/logger.json trans.zh_CN = public/language/zh-CN/admin/development/logger.json trans.zh_TW = public/language/zh-TW/admin/development/logger.json @@ -1594,6 +1627,7 @@ trans.sr = public/language/sr/admin/extend/plugins.json trans.sv = public/language/sv/admin/extend/plugins.json trans.th = public/language/th/admin/extend/plugins.json trans.tr = public/language/tr/admin/extend/plugins.json +trans.uk = public/language/uk/admin/extend/plugins.json trans.vi = public/language/vi/admin/extend/plugins.json trans.zh_CN = public/language/zh-CN/admin/extend/plugins.json trans.zh_TW = public/language/zh-TW/admin/extend/plugins.json @@ -1641,6 +1675,7 @@ trans.sr = public/language/sr/admin/extend/rewards.json trans.sv = public/language/sv/admin/extend/rewards.json trans.th = public/language/th/admin/extend/rewards.json trans.tr = public/language/tr/admin/extend/rewards.json +trans.uk = public/language/uk/admin/extend/rewards.json trans.vi = public/language/vi/admin/extend/rewards.json trans.zh_CN = public/language/zh-CN/admin/extend/rewards.json trans.zh_TW = public/language/zh-TW/admin/extend/rewards.json @@ -1688,6 +1723,7 @@ trans.sr = public/language/sr/admin/extend/widgets.json trans.sv = public/language/sv/admin/extend/widgets.json trans.th = public/language/th/admin/extend/widgets.json trans.tr = public/language/tr/admin/extend/widgets.json +trans.uk = public/language/uk/admin/extend/widgets.json trans.vi = public/language/vi/admin/extend/widgets.json trans.zh_CN = public/language/zh-CN/admin/extend/widgets.json trans.zh_TW = public/language/zh-TW/admin/extend/widgets.json @@ -1735,6 +1771,7 @@ trans.sr = public/language/sr/admin/general/dashboard.json trans.sv = public/language/sv/admin/general/dashboard.json trans.th = public/language/th/admin/general/dashboard.json trans.tr = public/language/tr/admin/general/dashboard.json +trans.uk = public/language/uk/admin/general/dashboard.json trans.vi = public/language/vi/admin/general/dashboard.json trans.zh_CN = public/language/zh-CN/admin/general/dashboard.json trans.zh_TW = public/language/zh-TW/admin/general/dashboard.json @@ -1782,6 +1819,7 @@ trans.sr = public/language/sr/admin/general/homepage.json trans.sv = public/language/sv/admin/general/homepage.json trans.th = public/language/th/admin/general/homepage.json trans.tr = public/language/tr/admin/general/homepage.json +trans.uk = public/language/uk/admin/general/homepage.json trans.vi = public/language/vi/admin/general/homepage.json trans.zh_CN = public/language/zh-CN/admin/general/homepage.json trans.zh_TW = public/language/zh-TW/admin/general/homepage.json @@ -1829,6 +1867,7 @@ trans.sr = public/language/sr/admin/general/languages.json trans.sv = public/language/sv/admin/general/languages.json trans.th = public/language/th/admin/general/languages.json trans.tr = public/language/tr/admin/general/languages.json +trans.uk = public/language/uk/admin/general/languages.json trans.vi = public/language/vi/admin/general/languages.json trans.zh_CN = public/language/zh-CN/admin/general/languages.json trans.zh_TW = public/language/zh-TW/admin/general/languages.json @@ -1876,6 +1915,7 @@ trans.sr = public/language/sr/admin/general/navigation.json trans.sv = public/language/sv/admin/general/navigation.json trans.th = public/language/th/admin/general/navigation.json trans.tr = public/language/tr/admin/general/navigation.json +trans.uk = public/language/uk/admin/general/navigation.json trans.vi = public/language/vi/admin/general/navigation.json trans.zh_CN = public/language/zh-CN/admin/general/navigation.json trans.zh_TW = public/language/zh-TW/admin/general/navigation.json @@ -1923,6 +1963,7 @@ trans.sr = public/language/sr/admin/general/social.json trans.sv = public/language/sv/admin/general/social.json trans.th = public/language/th/admin/general/social.json trans.tr = public/language/tr/admin/general/social.json +trans.uk = public/language/uk/admin/general/social.json trans.vi = public/language/vi/admin/general/social.json trans.zh_CN = public/language/zh-CN/admin/general/social.json trans.zh_TW = public/language/zh-TW/admin/general/social.json @@ -1970,6 +2011,7 @@ trans.sr = public/language/sr/admin/general/sounds.json trans.sv = public/language/sv/admin/general/sounds.json trans.th = public/language/th/admin/general/sounds.json trans.tr = public/language/tr/admin/general/sounds.json +trans.uk = public/language/uk/admin/general/sounds.json trans.vi = public/language/vi/admin/general/sounds.json trans.zh_CN = public/language/zh-CN/admin/general/sounds.json trans.zh_TW = public/language/zh-TW/admin/general/sounds.json @@ -2017,6 +2059,7 @@ trans.sr = public/language/sr/admin/manage/categories.json trans.sv = public/language/sv/admin/manage/categories.json trans.th = public/language/th/admin/manage/categories.json trans.tr = public/language/tr/admin/manage/categories.json +trans.uk = public/language/uk/admin/manage/categories.json trans.vi = public/language/vi/admin/manage/categories.json trans.zh_CN = public/language/zh-CN/admin/manage/categories.json trans.zh_TW = public/language/zh-TW/admin/manage/categories.json @@ -2064,6 +2107,7 @@ trans.sr = public/language/sr/admin/manage/flags.json trans.sv = public/language/sv/admin/manage/flags.json trans.th = public/language/th/admin/manage/flags.json trans.tr = public/language/tr/admin/manage/flags.json +trans.uk = public/language/uk/admin/manage/flags.json trans.vi = public/language/vi/admin/manage/flags.json trans.zh_CN = public/language/zh-CN/admin/manage/flags.json trans.zh_TW = public/language/zh-TW/admin/manage/flags.json @@ -2111,6 +2155,7 @@ trans.sr = public/language/sr/admin/manage/groups.json trans.sv = public/language/sv/admin/manage/groups.json trans.th = public/language/th/admin/manage/groups.json trans.tr = public/language/tr/admin/manage/groups.json +trans.uk = public/language/uk/admin/manage/groups.json trans.vi = public/language/vi/admin/manage/groups.json trans.zh_CN = public/language/zh-CN/admin/manage/groups.json trans.zh_TW = public/language/zh-TW/admin/manage/groups.json @@ -2158,6 +2203,7 @@ trans.sr = public/language/sr/admin/manage/ip-blacklist.json trans.sv = public/language/sv/admin/manage/ip-blacklist.json trans.th = public/language/th/admin/manage/ip-blacklist.json trans.tr = public/language/tr/admin/manage/ip-blacklist.json +trans.uk = public/language/uk/admin/manage/ip-blacklist.json trans.vi = public/language/vi/admin/manage/ip-blacklist.json trans.zh_CN = public/language/zh-CN/admin/manage/ip-blacklist.json trans.zh_TW = public/language/zh-TW/admin/manage/ip-blacklist.json @@ -2205,6 +2251,7 @@ trans.sr = public/language/sr/admin/manage/registration.json trans.sv = public/language/sv/admin/manage/registration.json trans.th = public/language/th/admin/manage/registration.json trans.tr = public/language/tr/admin/manage/registration.json +trans.uk = public/language/uk/admin/manage/registration.json trans.vi = public/language/vi/admin/manage/registration.json trans.zh_CN = public/language/zh-CN/admin/manage/registration.json trans.zh_TW = public/language/zh-TW/admin/manage/registration.json @@ -2252,6 +2299,7 @@ trans.sr = public/language/sr/admin/manage/tags.json trans.sv = public/language/sv/admin/manage/tags.json trans.th = public/language/th/admin/manage/tags.json trans.tr = public/language/tr/admin/manage/tags.json +trans.uk = public/language/uk/admin/manage/tags.json trans.vi = public/language/vi/admin/manage/tags.json trans.zh_CN = public/language/zh-CN/admin/manage/tags.json trans.zh_TW = public/language/zh-TW/admin/manage/tags.json @@ -2299,6 +2347,7 @@ trans.sr = public/language/sr/admin/manage/users.json trans.sv = public/language/sv/admin/manage/users.json trans.th = public/language/th/admin/manage/users.json trans.tr = public/language/tr/admin/manage/users.json +trans.uk = public/language/uk/admin/manage/users.json trans.vi = public/language/vi/admin/manage/users.json trans.zh_CN = public/language/zh-CN/admin/manage/users.json trans.zh_TW = public/language/zh-TW/admin/manage/users.json @@ -2346,6 +2395,7 @@ trans.sr = public/language/sr/admin/settings/advanced.json trans.sv = public/language/sv/admin/settings/advanced.json trans.th = public/language/th/admin/settings/advanced.json trans.tr = public/language/tr/admin/settings/advanced.json +trans.uk = public/language/uk/admin/settings/advanced.json trans.vi = public/language/vi/admin/settings/advanced.json trans.zh_CN = public/language/zh-CN/admin/settings/advanced.json trans.zh_TW = public/language/zh-TW/admin/settings/advanced.json @@ -2393,6 +2443,7 @@ trans.sr = public/language/sr/admin/settings/cookies.json trans.sv = public/language/sv/admin/settings/cookies.json trans.th = public/language/th/admin/settings/cookies.json trans.tr = public/language/tr/admin/settings/cookies.json +trans.uk = public/language/uk/admin/settings/cookies.json trans.vi = public/language/vi/admin/settings/cookies.json trans.zh_CN = public/language/zh-CN/admin/settings/cookies.json trans.zh_TW = public/language/zh-TW/admin/settings/cookies.json @@ -2440,6 +2491,7 @@ trans.sr = public/language/sr/admin/settings/general.json trans.sv = public/language/sv/admin/settings/general.json trans.th = public/language/th/admin/settings/general.json trans.tr = public/language/tr/admin/settings/general.json +trans.uk = public/language/uk/admin/settings/general.json trans.vi = public/language/vi/admin/settings/general.json trans.zh_CN = public/language/zh-CN/admin/settings/general.json trans.zh_TW = public/language/zh-TW/admin/settings/general.json @@ -2487,6 +2539,7 @@ trans.sr = public/language/sr/admin/settings/guest.json trans.sv = public/language/sv/admin/settings/guest.json trans.th = public/language/th/admin/settings/guest.json trans.tr = public/language/tr/admin/settings/guest.json +trans.uk = public/language/uk/admin/settings/guest.json trans.vi = public/language/vi/admin/settings/guest.json trans.zh_CN = public/language/zh-CN/admin/settings/guest.json trans.zh_TW = public/language/zh-TW/admin/settings/guest.json @@ -2534,6 +2587,7 @@ trans.sr = public/language/sr/admin/settings/pagination.json trans.sv = public/language/sv/admin/settings/pagination.json trans.th = public/language/th/admin/settings/pagination.json trans.tr = public/language/tr/admin/settings/pagination.json +trans.uk = public/language/uk/admin/settings/pagination.json trans.vi = public/language/vi/admin/settings/pagination.json trans.zh_CN = public/language/zh-CN/admin/settings/pagination.json trans.zh_TW = public/language/zh-TW/admin/settings/pagination.json @@ -2581,6 +2635,7 @@ trans.sr = public/language/sr/admin/settings/reputation.json trans.sv = public/language/sv/admin/settings/reputation.json trans.th = public/language/th/admin/settings/reputation.json trans.tr = public/language/tr/admin/settings/reputation.json +trans.uk = public/language/uk/admin/settings/reputation.json trans.vi = public/language/vi/admin/settings/reputation.json trans.zh_CN = public/language/zh-CN/admin/settings/reputation.json trans.zh_TW = public/language/zh-TW/admin/settings/reputation.json @@ -2628,6 +2683,7 @@ trans.sr = public/language/sr/admin/settings/tags.json trans.sv = public/language/sv/admin/settings/tags.json trans.th = public/language/th/admin/settings/tags.json trans.tr = public/language/tr/admin/settings/tags.json +trans.uk = public/language/uk/admin/settings/tags.json trans.vi = public/language/vi/admin/settings/tags.json trans.zh_CN = public/language/zh-CN/admin/settings/tags.json trans.zh_TW = public/language/zh-TW/admin/settings/tags.json @@ -2675,6 +2731,7 @@ trans.sr = public/language/sr/admin/settings/user.json trans.sv = public/language/sv/admin/settings/user.json trans.th = public/language/th/admin/settings/user.json trans.tr = public/language/tr/admin/settings/user.json +trans.uk = public/language/uk/admin/settings/user.json trans.vi = public/language/vi/admin/settings/user.json trans.zh_CN = public/language/zh-CN/admin/settings/user.json trans.zh_TW = public/language/zh-TW/admin/settings/user.json @@ -2722,6 +2779,7 @@ trans.sr = public/language/sr/admin/settings/chat.json trans.sv = public/language/sv/admin/settings/chat.json trans.th = public/language/th/admin/settings/chat.json trans.tr = public/language/tr/admin/settings/chat.json +trans.uk = public/language/uk/admin/settings/chat.json trans.vi = public/language/vi/admin/settings/chat.json trans.zh_CN = public/language/zh-CN/admin/settings/chat.json trans.zh_TW = public/language/zh-TW/admin/settings/chat.json @@ -2769,6 +2827,7 @@ trans.sr = public/language/sr/admin/settings/email.json trans.sv = public/language/sv/admin/settings/email.json trans.th = public/language/th/admin/settings/email.json trans.tr = public/language/tr/admin/settings/email.json +trans.uk = public/language/uk/admin/settings/email.json trans.vi = public/language/vi/admin/settings/email.json trans.zh_CN = public/language/zh-CN/admin/settings/email.json trans.zh_TW = public/language/zh-TW/admin/settings/email.json @@ -2816,6 +2875,7 @@ trans.sr = public/language/sr/admin/settings/group.json trans.sv = public/language/sv/admin/settings/group.json trans.th = public/language/th/admin/settings/group.json trans.tr = public/language/tr/admin/settings/group.json +trans.uk = public/language/uk/admin/settings/group.json trans.vi = public/language/vi/admin/settings/group.json trans.zh_CN = public/language/zh-CN/admin/settings/group.json trans.zh_TW = public/language/zh-TW/admin/settings/group.json @@ -2863,6 +2923,7 @@ trans.sr = public/language/sr/admin/settings/notifications.json trans.sv = public/language/sv/admin/settings/notifications.json trans.th = public/language/th/admin/settings/notifications.json trans.tr = public/language/tr/admin/settings/notifications.json +trans.uk = public/language/uk/admin/settings/notifications.json trans.vi = public/language/vi/admin/settings/notifications.json trans.zh_CN = public/language/zh-CN/admin/settings/notifications.json trans.zh_TW = public/language/zh-TW/admin/settings/notifications.json @@ -2910,6 +2971,7 @@ trans.sr = public/language/sr/admin/settings/post.json trans.sv = public/language/sv/admin/settings/post.json trans.th = public/language/th/admin/settings/post.json trans.tr = public/language/tr/admin/settings/post.json +trans.uk = public/language/uk/admin/settings/post.json trans.vi = public/language/vi/admin/settings/post.json trans.zh_CN = public/language/zh-CN/admin/settings/post.json trans.zh_TW = public/language/zh-TW/admin/settings/post.json @@ -2957,6 +3019,7 @@ trans.sr = public/language/sr/admin/settings/sockets.json trans.sv = public/language/sv/admin/settings/sockets.json trans.th = public/language/th/admin/settings/sockets.json trans.tr = public/language/tr/admin/settings/sockets.json +trans.uk = public/language/uk/admin/settings/sockets.json trans.vi = public/language/vi/admin/settings/sockets.json trans.zh_CN = public/language/zh-CN/admin/settings/sockets.json trans.zh_TW = public/language/zh-TW/admin/settings/sockets.json @@ -3004,6 +3067,7 @@ trans.sr = public/language/sr/admin/settings/uploads.json trans.sv = public/language/sv/admin/settings/uploads.json trans.th = public/language/th/admin/settings/uploads.json trans.tr = public/language/tr/admin/settings/uploads.json +trans.uk = public/language/uk/admin/settings/uploads.json trans.vi = public/language/vi/admin/settings/uploads.json trans.zh_CN = public/language/zh-CN/admin/settings/uploads.json trans.zh_TW = public/language/zh-TW/admin/settings/uploads.json @@ -3051,6 +3115,7 @@ trans.sr = public/language/sr/admin/settings/web-crawler.json trans.sv = public/language/sv/admin/settings/web-crawler.json trans.th = public/language/th/admin/settings/web-crawler.json trans.tr = public/language/tr/admin/settings/web-crawler.json +trans.uk = public/language/uk/admin/settings/web-crawler.json trans.vi = public/language/vi/admin/settings/web-crawler.json trans.zh_CN = public/language/zh-CN/admin/settings/web-crawler.json trans.zh_TW = public/language/zh-TW/admin/settings/web-crawler.json diff --git a/Gruntfile.js b/Gruntfile.js index ca5d4dad49..f3c4f1723e 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -1,24 +1,24 @@ "use strict"; -var fork = require('child_process').fork, - env = process.env, - worker, updateWorker, - incomplete = [], - running = 0; - +var fork = require('child_process').fork; +var env = process.env; +var worker, updateWorker, initWorker; +var incomplete = []; +var running = 0; module.exports = function (grunt) { var args = []; + var initArgs = ['--build']; if (!grunt.option('verbose')) { args.push('--log-level=info'); + initArgs.push('--log-level=info'); } function update(action, filepath, target) { - var updateArgs = args.slice(), - fromFile = '', - compiling = '', - time = Date.now(); - + var updateArgs = args.slice(); + var compiling = ''; + var time = Date.now(); + if (target === 'lessUpdated_Client') { compiling = 'clientCSS'; } else if (target === 'lessUpdated_Admin') { @@ -44,12 +44,16 @@ module.exports = function (grunt) { if (updateWorker) { updateWorker.kill('SIGKILL'); } - updateWorker = fork('app.js', updateArgs, { env: env }); + updateWorker = fork('app.js', updateArgs, { + env: env + }); ++running; updateWorker.on('exit', function () { --running; if (running === 0) { - worker = fork('app.js', args, { env: env }); + worker = fork('app.js', args, { + env: env + }); worker.on('message', function () { if (incomplete.length) { incomplete = []; @@ -71,10 +75,16 @@ module.exports = function (grunt) { 'node_modules/nodebb-*/*.less', 'node_modules/nodebb-*/**/*.less', '!node_modules/nodebb-*/node_modules/**', '!node_modules/nodebb-*/.git/**' - ] + ], + options: { + interval: 1000 + } }, lessUpdated_Admin: { - files: ['public/**/*.less'] + files: ['public/**/*.less'], + options: { + interval: 1000 + } }, clientUpdated: { files: [ @@ -83,10 +93,16 @@ module.exports = function (grunt) { '!node_modules/nodebb-*/node_modules/**', 'node_modules/templates.js/lib/templates.js', '!node_modules/nodebb-*/.git/**' - ] + ], + options: { + interval: 1000 + } }, serverUpdated: { - files: ['*.js', 'install/*.js', 'src/**/*.js'] + files: ['*.js', 'install/*.js', 'src/**/*.js'], + options: { + interval: 1000 + } }, templatesUpdated: { files: [ @@ -94,7 +110,10 @@ module.exports = function (grunt) { 'node_modules/nodebb-*/*.tpl', 'node_modules/nodebb-*/**/*.tpl', '!node_modules/nodebb-*/node_modules/**', '!node_modules/nodebb-*/.git/**' - ] + ], + options: { + interval: 1000 + } }, langUpdated: { files: [ @@ -107,21 +126,33 @@ module.exports = function (grunt) { '!node_modules/nodebb-*/package.json', '!node_modules/nodebb-*/theme.json', ], + options: { + interval: 1000 + } }, } }); grunt.loadNpmTasks('grunt-contrib-watch'); - if (grunt.option('skip')) { - grunt.registerTask('default', ['watch:serverUpdated']); - } else { - grunt.registerTask('default', ['watch']); - } - - + grunt.registerTask('default', ['watch']); env.NODE_ENV = 'development'; - worker = fork('app.js', args, { env: env }); + if (grunt.option('skip')) { + worker = fork('app.js', args, { + env: env + }); + } else { + initWorker = fork('app.js', initArgs, { + env: env + }); + + initWorker.on('exit', function () { + worker = fork('app.js', args, { + env: env + }); + }); + } + grunt.event.on('watch', update); -}; \ No newline at end of file +}; diff --git a/app.js b/app.js index b6d7d07829..57c57d61b6 100644 --- a/app.js +++ b/app.js @@ -75,7 +75,7 @@ if (nconf.get('setup') || nconf.get('install')) { } else if (nconf.get('reset')) { async.waterfall([ async.apply(require('./src/reset').reset), - async.apply(require('./build').buildAll) + async.apply(require('./src/meta/build').buildAll) ], function (err) { process.exit(err ? 1 : 0); }); @@ -84,7 +84,7 @@ if (nconf.get('setup') || nconf.get('install')) { } else if (nconf.get('plugins')) { listPlugins(); } else if (nconf.get('build')) { - require('./build').build(nconf.get('build')); + require('./src/meta/build').build(nconf.get('build')); } else { require('./src/start').start(); } @@ -99,7 +99,8 @@ function loadConfig(callback) { nconf.defaults({ base_dir: __dirname, themes_path: path.join(__dirname, 'node_modules'), - views_dir: path.join(__dirname, 'public/templates'), + upload_path: 'public/uploads', + views_dir: path.join(__dirname, 'build/public/templates'), version: pkg.version }); @@ -112,11 +113,24 @@ function loadConfig(callback) { nconf.set('themes_path', path.resolve(__dirname, nconf.get('themes_path'))); nconf.set('core_templates_path', path.join(__dirname, 'src/views')); nconf.set('base_templates_path', path.join(nconf.get('themes_path'), 'nodebb-theme-persona/templates')); + + nconf.set('upload_path', path.resolve(nconf.get('base_dir'), nconf.get('upload_path'))); if (nconf.get('url')) { nconf.set('url_parsed', url.parse(nconf.get('url'))); } + // Explicitly cast 'jobsDisabled' as Bool + var castAsBool = ['jobsDisabled']; + nconf.stores.env.readOnly = false; + castAsBool.forEach(function (prop) { + var value = nconf.get(prop); + if (value) { + nconf.set(prop, typeof value === 'boolean' ? value : String(value).toLowerCase() === 'true'); + } + }); + nconf.stores.env.readOnly = true; + if (typeof callback === 'function') { callback(); } @@ -126,7 +140,7 @@ function setup() { winston.info('NodeBB Setup Triggered via Command Line'); var install = require('./src/install'); - var build = require('./build'); + var build = require('./src/meta/build'); process.stdout.write('\nWelcome to NodeBB!\n'); process.stdout.write('\nThis looks like a new installation, so you\'ll have to answer a few questions about your environment before we can proceed.\n'); @@ -174,7 +188,7 @@ function upgrade() { var db = require('./src/database'); var meta = require('./src/meta'); var upgrade = require('./src/upgrade'); - var build = require('./build'); + var build = require('./src/meta/build'); async.series([ async.apply(db.init), diff --git a/nodebb b/nodebb index e1a4ab7fbf..ee87b24288 100755 --- a/nodebb +++ b/nodebb @@ -1,15 +1,17 @@ #!/usr/bin/env node +'use strict'; + try { - var colors = require('colors'), - cproc = require('child_process'), - argv = require('minimist')(process.argv.slice(2)), - fs = require('fs'), - path = require('path'), - request = require('request'), - semver = require('semver'), - prompt = require('prompt'), - async = require('async'); + require('colors'); + var cproc = require('child_process'); + var args = require('minimist')(process.argv.slice(2)); + var fs = require('fs'); + var path = require('path'); + var request = require('request'); + var semver = require('semver'); + var prompt = require('prompt'); + var async = require('async'); } catch (e) { if (e.code === 'MODULE_NOT_FOUND') { process.stdout.write('NodeBB could not be started because it\'s dependencies have not been installed.\n'); @@ -21,407 +23,460 @@ try { } } -var getRunningPid = function (callback) { - fs.readFile(__dirname + '/pidfile', { - encoding: 'utf-8' - }, function (err, pid) { - if (err) { - return callback(err); +if (args.dev) { + process.env.NODE_ENV = 'development'; +} + +function getRunningPid(callback) { + fs.readFile(__dirname + '/pidfile', { + encoding: 'utf-8' + }, function (err, pid) { + if (err) { + return callback(err); + } + + try { + process.kill(parseInt(pid, 10), 0); + callback(null, parseInt(pid, 10)); + } catch(e) { + callback(e); + } + }); +} +function getCurrentVersion(callback) { + fs.readFile(path.join(__dirname, 'package.json'), { encoding: 'utf-8' }, function (err, pkg) { + if (err) { + return callback(err); + } + + try { + pkg = JSON.parse(pkg); + return callback(null, pkg.version); + } catch(err) { + return callback(err); + } + }); +} +function fork(args) { + return cproc.fork('app.js', args, { + cwd: __dirname, + silent: false + }); +} +function getInstalledPlugins(callback) { + async.parallel({ + files: async.apply(fs.readdir, path.join(__dirname, 'node_modules')), + deps: async.apply(fs.readFile, path.join(__dirname, 'package.json'), { encoding: 'utf-8' }) + }, function (err, payload) { + if (err) { + return callback(err); + } + + var isNbbModule = /^nodebb-(?:plugin|theme|widget|rewards)-[\w\-]+$/, + moduleName, isGitRepo; + + payload.files = payload.files.filter(function (file) { + return isNbbModule.test(file); + }); + + try { + payload.deps = JSON.parse(payload.deps).dependencies; + payload.bundled = []; + payload.installed = []; + } catch (err) { + return callback(err); + } + + for (moduleName in payload.deps) { + if (isNbbModule.test(moduleName)) { + payload.bundled.push(moduleName); + } + } + + // Whittle down deps to send back only extraneously installed plugins/themes/etc + payload.files.forEach(function (moduleName) { + try { + fs.accessSync(path.join(__dirname, 'node_modules/' + moduleName, '.git')); + isGitRepo = true; + } catch(e) { + isGitRepo = false; } - try { - process.kill(parseInt(pid, 10), 0); - callback(null, parseInt(pid, 10)); - } catch(e) { - callback(e); + if ( + payload.files.indexOf(moduleName) !== -1 && // found in `node_modules/` + payload.bundled.indexOf(moduleName) === -1 && // not found in `package.json` + !fs.lstatSync(path.join(__dirname, 'node_modules/' + moduleName)).isSymbolicLink() && // is not a symlink + !isGitRepo // .git/ does not exist, so it is not a git repository + ) { + payload.installed.push(moduleName); } }); - }, - getCurrentVersion = function (callback) { - fs.readFile(path.join(__dirname, 'package.json'), { encoding: 'utf-8' }, function (err, pkg) { + + getModuleVersions(payload.installed, callback); + }); +} +function getModuleVersions(modules, callback) { + var versionHash = {}; + + async.eachLimit(modules, 50, function (module, next) { + fs.readFile(path.join(__dirname, 'node_modules/' + module + '/package.json'), { encoding: 'utf-8' }, function (err, pkg) { if (err) { - return callback(err); + return next(err); } try { pkg = JSON.parse(pkg); - return callback(null, pkg.version); - } catch(err) { - return callback(err); - } - }); - }, - fork = function (args) { - cproc.fork('app.js', args, { - cwd: __dirname, - silent: false - }); - }, - getInstalledPlugins = function (callback) { - async.parallel({ - files: async.apply(fs.readdir, path.join(__dirname, 'node_modules')), - deps: async.apply(fs.readFile, path.join(__dirname, 'package.json'), { encoding: 'utf-8' }) - }, function (err, payload) { - if (err) { - return callback(err); - } - - var isNbbModule = /^nodebb-(?:plugin|theme|widget|rewards)-[\w\-]+$/, - moduleName, isGitRepo; - - payload.files = payload.files.filter(function (file) { - return isNbbModule.test(file); - }); - - try { - payload.deps = JSON.parse(payload.deps).dependencies; - payload.bundled = []; - payload.installed = []; + versionHash[module] = pkg.version; + next(); } catch (err) { - return callback(err); + next(err); } - - for (moduleName in payload.deps) { - if (isNbbModule.test(moduleName)) { - payload.bundled.push(moduleName); - } - } - - // Whittle down deps to send back only extraneously installed plugins/themes/etc - payload.files.forEach(function (moduleName) { - try { - fs.accessSync(path.join(__dirname, 'node_modules/' + moduleName, '.git')); - isGitRepo = true; - } catch(e) { - isGitRepo = false; - } - - if ( - payload.files.indexOf(moduleName) !== -1 // found in `node_modules/` - && payload.bundled.indexOf(moduleName) === -1 // not found in `package.json` - && !fs.lstatSync(path.join(__dirname, 'node_modules/' + moduleName)).isSymbolicLink() // is not a symlink - && !isGitRepo // .git/ does not exist, so it is not a git repository - ) { - payload.installed.push(moduleName); - } - }); - - getModuleVersions(payload.installed, callback); }); - }, - getModuleVersions = function (modules, callback) { - var versionHash = {}; + }, function (err) { + callback(err, versionHash); + }); +} +function checkPlugins(standalone, callback) { + if (standalone) { + process.stdout.write('Checking installed plugins and themes for updates... '); + } - async.eachLimit(modules, 50, function (module, next) { - fs.readFile(path.join(__dirname, 'node_modules/' + module + '/package.json'), { encoding: 'utf-8' }, function (err, pkg) { + async.waterfall([ + async.apply(async.parallel, { + plugins: async.apply(getInstalledPlugins), + version: async.apply(getCurrentVersion) + }), + function (payload, next) { + var toCheck = Object.keys(payload.plugins); + + if (!toCheck.length) { + process.stdout.write('OK'.green + '\n'.reset); + return next(null, []); // no extraneous plugins installed + } + + request({ + method: 'GET', + url: 'https://packages.nodebb.org/api/v1/suggest?version=' + payload.version + '&package[]=' + toCheck.join('&package[]='), + json: true + }, function (err, res, body) { if (err) { + process.stdout.write('error'.red + '\n'.reset); return next(err); } + process.stdout.write('OK'.green + '\n'.reset); - try { - pkg = JSON.parse(pkg); - versionHash[module] = pkg.version; - next(); - } catch (err) { - next(err); + if (!Array.isArray(body) && toCheck.length === 1) { + body = [body]; } + + var current, suggested, + upgradable = body.map(function (suggestObj) { + current = payload.plugins[suggestObj.package]; + suggested = suggestObj.version; + + if (suggestObj.code === 'match-found' && semver.gt(suggested, current)) { + return { + name: suggestObj.package, + current: current, + suggested: suggested + }; + } else { + return null; + } + }).filter(Boolean); + + next(null, upgradable); }); - }, function (err) { - callback(err, versionHash); - }); - }, - checkPlugins = function (standalone, callback) { - if (standalone) { - process.stdout.write('Checking installed plugins and themes for updates... '); + } + ], callback); +} +function upgradePlugins(callback) { + var standalone = false; + if (typeof callback !== 'function') { + callback = function () {}; + standalone = true; + } + + checkPlugins(standalone, function (err, found) { + if (err) { + process.stdout.write('\Warning'.yellow + ': An unexpected error occured when attempting to verify plugin upgradability\n'.reset); + return callback(err); } - async.waterfall([ - async.apply(async.parallel, { - plugins: async.apply(getInstalledPlugins), - version: async.apply(getCurrentVersion) - }), - function (payload, next) { - var toCheck = Object.keys(payload.plugins); - - if (!toCheck.length) { - process.stdout.write('OK'.green + '\n'.reset); - return next(null, []); // no extraneous plugins installed - } - - request({ - method: 'GET', - url: 'https://packages.nodebb.org/api/v1/suggest?version=' + payload.version + '&package[]=' + toCheck.join('&package[]='), - json: true - }, function (err, res, body) { - if (err) { - process.stdout.write('error'.red + '\n'.reset); - return next(err); - } - process.stdout.write('OK'.green + '\n'.reset); - - if (!Array.isArray(body) && toCheck.length === 1) { - body = [body]; - } - - var current, suggested, - upgradable = body.map(function (suggestObj) { - current = payload.plugins[suggestObj.package]; - suggested = suggestObj.version; - - if (suggestObj.code === 'match-found' && semver.gt(suggested, current)) { - return { - name: suggestObj.package, - current: current, - suggested: suggested - }; - } else { - return null; - } - }).filter(Boolean); - - next(null, upgradable); - }); + if (found && found.length) { + process.stdout.write('\nA total of ' + String(found.length).bold + ' package(s) can be upgraded:\n'); + found.forEach(function (suggestObj) { + process.stdout.write(' * '.yellow + suggestObj.name.reset + ' (' + suggestObj.current.yellow + ' -> '.reset + suggestObj.suggested.green + ')\n'.reset); + }); + process.stdout.write('\n'); + } else { + if (standalone) { + process.stdout.write('\nAll packages up-to-date!'.green + '\n'.reset); } - ], callback); - }, - upgradePlugins = function (callback) { - var standalone = false; - if (typeof callback !== 'function') { - callback = function () {}; - standalone = true; - }; + return callback(); + } - checkPlugins(standalone, function (err, found) { + prompt.message = ''; + prompt.delimiter = ''; + + prompt.start(); + prompt.get({ + name: 'upgrade', + description: 'Proceed with upgrade (y|n)?'.reset, + type: 'string' + }, function (err, result) { if (err) { - process.stdout.write('\Warning'.yellow + ': An unexpected error occured when attempting to verify plugin upgradability\n'.reset); return callback(err); } - if (found && found.length) { - process.stdout.write('\nA total of ' + String(found.length).bold + ' package(s) can be upgraded:\n'); + if (['y', 'Y', 'yes', 'YES'].indexOf(result.upgrade) !== -1) { + process.stdout.write('\nUpgrading packages...'); + var args = ['i']; found.forEach(function (suggestObj) { - process.stdout.write(' * '.yellow + suggestObj.name.reset + ' (' + suggestObj.current.yellow + ' -> '.reset + suggestObj.suggested.green + ')\n'.reset); + args.push(suggestObj.name + '@' + suggestObj.suggested); + }); + + cproc.execFile((process.platform === 'win32') ? 'npm.cmd' : 'npm', args, { stdio: 'ignore' }, function (err) { + if (!err) { + process.stdout.write(' OK\n'.green); + } + + callback(err); }); - process.stdout.write('\n'); } else { - if (standalone) { - process.stdout.write('\nAll packages up-to-date!'.green + '\n'.reset); - } - return callback(); + process.stdout.write('\nPackage upgrades skipped'.yellow + '. Check for upgrades at any time by running "'.reset + './nodebb upgrade-plugins'.green + '".\n'.reset); + callback(); } + }); + }); +} - prompt.message = ''; - prompt.delimiter = ''; - - prompt.start(); - prompt.get({ - name: 'upgrade', - description: 'Proceed with upgrade (y|n)?'.reset, - type: 'string' - }, function (err, result) { - if (err) { - return callback(err); - } - - if (['y', 'Y', 'yes', 'YES'].indexOf(result.upgrade) !== -1) { - process.stdout.write('\nUpgrading packages...'); - var args = ['npm', 'i']; - found.forEach(function (suggestObj) { - args.push(suggestObj.name + '@' + suggestObj.suggested); - }); - - require('child_process').execFile('/usr/bin/env', args, { stdio: 'ignore' }, function (err) { - if (!err) { - process.stdout.write(' OK\n'.green); - } - - callback(err); - }); +var commands = { + status: { + description: 'View the status of the NodeBB server', + usage: 'Usage: ' + './nodebb status'.yellow, + handler: function () { + getRunningPid(function (err, pid) { + if (!err) { + process.stdout.write('\nNodeBB Running '.bold + '(pid '.cyan + pid.toString().cyan + ')\n'.cyan); + process.stdout.write('\t"' + './nodebb stop'.yellow + '" to stop the NodeBB server\n'); + process.stdout.write('\t"' + './nodebb log'.yellow + '" to view server output\n'); + process.stdout.write('\t"' + './nodebb restart'.yellow + '" to restart NodeBB\n\n'); } else { - process.stdout.write('\nPackage upgrades skipped'.yellow + '. Check for upgrades at any time by running "'.reset + './nodebb upgrade-plugins'.green + '".\n'.reset); - callback(); + process.stdout.write('\nNodeBB is not running\n'.bold); + process.stdout.write('\t"' + './nodebb start'.yellow + '" to launch the NodeBB server\n\n'.reset); } }); - }); - }; + }, + }, + start: { + description: 'Start the NodeBB server', + usage: 'Usage: ' + './nodebb start'.yellow, + handler: function () { + process.stdout.write('\nStarting NodeBB\n'.bold); + process.stdout.write(' "' + './nodebb stop'.yellow + '" to stop the NodeBB server\n'); + process.stdout.write(' "' + './nodebb log'.yellow + '" to view server output\n'); + process.stdout.write(' "' + './nodebb restart'.yellow + '" to restart NodeBB\n\n'.reset); -switch(process.argv[2]) { - case 'status': - getRunningPid(function (err, pid) { - if (!err) { - process.stdout.write('\nNodeBB Running '.bold + '(pid '.cyan + pid.toString().cyan + ')\n'.cyan); - process.stdout.write('\t"' + './nodebb stop'.yellow + '" to stop the NodeBB server\n'); - process.stdout.write('\t"' + './nodebb log'.yellow + '" to view server output\n'); - process.stdout.write('\t"' + './nodebb restart'.yellow + '" to restart NodeBB\n\n'); - } else { - process.stdout.write('\nNodeBB is not running\n'.bold); - process.stdout.write('\t"' + './nodebb start'.yellow + '" to launch the NodeBB server\n\n'.reset); + // Spawn a new NodeBB process + cproc.fork(__dirname + '/loader.js', { + env: process.env + }); + }, + }, + stop: { + description: 'Stop the NodeBB server', + usage: 'Usage: ' + './nodebb stop'.yellow, + handler: function () { + getRunningPid(function (err, pid) { + if (!err) { + process.kill(pid, 'SIGTERM'); + process.stdout.write('Stopping NodeBB. Goodbye!\n'); + } else { + process.stdout.write('NodeBB is already stopped.\n'); + } + }); + }, + }, + restart: { + description: 'Restart the NodeBB server', + usage: 'Usage: ' + './nodebb restart'.yellow, + handler: function () { + getRunningPid(function (err, pid) { + if (!err) { + process.kill(pid, 'SIGHUP'); + process.stdout.write('\nRestarting NodeBB\n'.bold); + } else { + process.stdout.write('NodeBB could not be restarted, as a running instance could not be found.\n'); + } + }); + }, + }, + log: { + description: 'Open the output log (useful for debugging)', + usage: 'Usage: ' + './nodebb log'.yellow, + handler: function () { + process.stdout.write('\nHit '.red + 'Ctrl-C '.bold + 'to exit'.red); + process.stdout.write('\n\n'.reset); + cproc.spawn('tail', ['-F', './logs/output.log'], { + cwd: __dirname, + stdio: 'inherit' + }); + }, + }, + slog: { + description: 'Start the NodeBB server and view the live output log', + usage: 'Usage: ' + './nodebb slog'.yellow, + handler: function () { + process.stdout.write('\nStarting NodeBB with logging output\n'.bold); + process.stdout.write('\nHit '.red + 'Ctrl-C '.bold + 'to exit'.red); + process.stdout.write('\n\n'.reset); + + // Spawn a new NodeBB process + cproc.fork(__dirname + '/loader.js', { + env: process.env + }); + cproc.spawn('tail', ['-F', './logs/output.log'], { + cwd: __dirname, + stdio: 'inherit' + }); + }, + }, + dev: { + description: 'Start NodeBB in verbose development mode', + usage: 'Usage: ' + './nodebb dev'.yellow, + handler: function () { + process.env.NODE_ENV = 'development'; + cproc.fork(__dirname + '/loader.js', ['--no-daemon', '--no-silent'], { + env: process.env + }); + }, + }, + build: { + description: 'Compile static assets (CSS, Javascript, etc)', + usage: 'Usage: ' + './nodebb build'.yellow + ' [js,clientCSS,acpCSS,tpl,lang]'.red + '\n' + + ' e.g. ' + './nodebb build js,tpl'.yellow + '\tbuilds JS and templates\n' + + ' ' + './nodebb build'.yellow + '\t\tbuilds all targets\n', + handler: function () { + var arr = ['--build'].concat(process.argv.slice(3)); + fork(arr); + }, + }, + setup: { + description: 'Run the NodeBB setup script', + usage: 'Usage: ' + './nodebb setup'.yellow, + handler: function () { + var arr = ['--setup'].concat(process.argv.slice(3)); + fork(arr); + }, + }, + reset: { + description: 'Disable plugins and restore the default theme', + usage: 'Usage: ' + './nodebb reset '.yellow + '{-t|-p|-w|-s|-a}'.red + '\n' + + ' -t \tuse specified theme\n' + + ' -p \tdisable specified plugin\n' + + '\n' + + ' -t\t\tuse default theme\n' + + ' -p\t\tdisable all but core plugins\n' + + ' -w\t\twidgets\n' + + ' -s\t\tsettings\n' + + ' -a\t\tall of the above\n', + handler: function () { + var arr = ['--reset'].concat(process.argv.slice(3)); + fork(arr); + }, + }, + activate: { + description: 'Activate a plugin for the next startup of NodeBB', + usage: 'Usage: ' + './nodebb activate '.yellow, + handler: function () { + var arr = ['--activate=' + args._[1]].concat(process.argv.slice(4)); + fork(arr); + }, + }, + plugins: { + description: 'List all installed plugins', + usage: 'Usage: ' + './nodebb plugins'.yellow, + handler: function () { + var arr = ['--plugins'].concat(process.argv.slice(3)); + fork(arr); + }, + }, + upgrade: { + description: 'Run NodeBB upgrade scripts, ensure packages are up-to-date', + usage: 'Usage: ' + './nodebb upgrade'.yellow, + handler: function () { + async.series([ + function (next) { + process.stdout.write('1. '.bold + 'Bringing base dependencies up to date... '.yellow); + cproc.exec('npm i --production', { cwd: __dirname, stdio: 'ignore' }, next); + }, + function (next) { + process.stdout.write('OK\n'.green); + process.stdout.write('2. '.bold + 'Checking installed plugins for updates... '.yellow); + upgradePlugins(next); + }, + function (next) { + process.stdout.write('3. '.bold + 'Updating NodeBB data store schema...\n'.yellow); + var arr = ['--upgrade'].concat(process.argv.slice(3)); + var upgradeProc = fork(arr); + + upgradeProc.on('close', next); + } + ], function (err) { + if (err) { + process.stdout.write('\nError'.red + ': ' + err.message + '\n'); + } else { + var message = 'NodeBB Upgrade Complete!'; + // some consoles will return undefined/zero columns, so just use 2 spaces in upgrade script if we can't get our column count + var columns = process.stdout.columns; + var spaces = columns ? new Array(Math.floor(columns / 2) - (message.length / 2) + 1).join(' ') : " "; + + process.stdout.write('OK\n'.green); + process.stdout.write('\n' + spaces + message.green.bold + '\n\n'.reset); + } + }); + }, + }, + upgradePlugins: { + hidden: true, + description: '', + handler: function () { + upgradePlugins(); + }, + }, + help: { + description: 'Display the help message for a given command', + usage: 'Usage: ' + './nodebb help '.yellow, + handler: function () { + var command = commands[args._[1]]; + if (command) { + process.stdout.write(command.description + '\n'.reset); + process.stdout.write(command.usage + '\n'.reset); + + return; } - }); - break; + var keys = Object.keys(commands).filter(function (key) { + return !commands[key].hidden; + }); - case 'start': - process.stdout.write('\nStarting NodeBB\n'.bold); - process.stdout.write(' "' + './nodebb stop'.yellow + '" to stop the NodeBB server\n'); - process.stdout.write(' "' + './nodebb log'.yellow + '" to view server output\n'); - process.stdout.write(' "' + './nodebb restart'.yellow + '" to restart NodeBB\n\n'.reset); + process.stdout.write('\nWelcome to NodeBB\n\n'.bold); + process.stdout.write('Usage: ./nodebb {' + keys.join('|') + '}\n\n'); - // Spawn a new NodeBB process - cproc.fork(__dirname + '/loader.js', { - env: process.env - }); - break; - - case 'slog': - process.stdout.write('\nStarting NodeBB with logging output\n'.bold); - process.stdout.write('\nHit '.red + 'Ctrl-C '.bold + 'to exit'.red); - process.stdout.write('\n\n'.reset); + var usage = keys.map(function (key) { + var line = '\t' + key.yellow + (key.length < 8 ? '\t\t' : '\t'); + return line + commands[key].description; + }).join('\n'); - // Spawn a new NodeBB process - cproc.fork(__dirname + '/loader.js', { - env: process.env - }); - cproc.spawn('tail', ['-F', './logs/output.log'], { - cwd: __dirname, - stdio: 'inherit' - }); - break; + process.stdout.write(usage + '\n'.reset); + }, + }, +}; - case 'stop': - getRunningPid(function (err, pid) { - if (!err) { - process.kill(pid, 'SIGTERM'); - process.stdout.write('Stopping NodeBB. Goodbye!\n'); - } else { - process.stdout.write('NodeBB is already stopped.\n'); - } - }); - break; +commands['upgrade-plugins'] = commands.upgradePlugins; - case 'restart': - getRunningPid(function (err, pid) { - if (!err) { - process.kill(pid, 'SIGHUP'); - process.stdout.write('\nRestarting NodeBB\n'.bold); - } else { - process.stdout.write('NodeBB could not be restarted, as a running instance could not be found.\n'); - } - }); - break; - - case 'reload': - getRunningPid(function (err, pid) { - if (!err) { - process.kill(pid, 'SIGUSR2'); - } else { - process.stdout.write('NodeBB could not be reloaded, as a running instance could not be found.\n'); - } - }); - break; - - case 'dev': - process.env.NODE_ENV = 'development'; - cproc.fork(__dirname + '/loader.js', ['--no-daemon', '--no-silent'], { - env: process.env - }); - break; - - case 'log': - process.stdout.write('\nHit '.red + 'Ctrl-C '.bold + 'to exit'.red); - process.stdout.write('\n\n'.reset); - cproc.spawn('tail', ['-F', './logs/output.log'], { - cwd: __dirname, - stdio: 'inherit' - }); - break; - - case 'build': - var args = process.argv.slice(0); - args[2] = '--' + args[2]; - - fork(args); - break; - - case 'setup': - cproc.fork('app.js', ['--setup'], { - cwd: __dirname, - silent: false - }); - break; - - case 'reset': - var args = process.argv.slice(0); - args.unshift('--reset'); - fork(args); - break; - - case 'activate': - var args = process.argv.slice(0); - args.unshift('--activate=' + process.argv[3]); - fork(args); - break; - - case 'plugins': - var args = process.argv.slice(0); - args.unshift('--plugins'); - fork(args); - break; - - case 'upgrade-plugins': - upgradePlugins(); - break; - - case 'upgrade': - async.series([ - function (next) { - process.stdout.write('1. '.bold + 'Bringing base dependencies up to date... '.yellow); - cproc.exec('npm i --production', { cwd: __dirname, stdio: 'ignore' }, next); - }, - function (next) { - process.stdout.write('OK\n'.green); - process.stdout.write('2. '.bold + 'Checking installed plugins for updates... '.yellow); - upgradePlugins(next); - }, - function (next) { - process.stdout.write('3. '.bold + 'Updating NodeBB data store schema...\n'.yellow); - var upgradeProc = cproc.fork('app.js', ['--upgrade'], { - cwd: __dirname, - silent: false - }); - - upgradeProc.on('close', next); - } - ], function (err) { - if (err) { - process.stdout.write('\nError'.red + ': ' + err.message + '\n'); - } else { - var message = 'NodeBB Upgrade Complete!'; - // some consoles will return undefined/zero columns, so just use 2 spaces in upgrade script if we can't get our column count - var columns = process.stdout.columns; - var spaces = columns ? new Array(Math.floor(columns / 2) - (message.length / 2) + 1).join(' ') : " "; - - process.stdout.write('OK\n'.green); - process.stdout.write('\n' + spaces + message.green.bold + '\n\n'.reset); - } - }); - break; - - default: - process.stdout.write('\nWelcome to NodeBB\n\n'.bold); - process.stdout.write('Usage: ./nodebb {start|slog|stop|reload|restart|log|build|setup|reset|upgrade|dev}\n\n'); - process.stdout.write('\t' + 'start'.yellow + '\t\tStart the NodeBB server\n'); - process.stdout.write('\t' + 'slog'.yellow + '\t\tStarts the NodeBB server and displays the live output log\n'); - process.stdout.write('\t' + 'stop'.yellow + '\t\tStops the NodeBB server\n'); - process.stdout.write('\t' + 'reload'.yellow + '\t\tRestarts NodeBB\n'); - process.stdout.write('\t' + 'restart'.yellow + '\t\tRestarts NodeBB\n'); - process.stdout.write('\t' + 'log'.yellow + '\t\tOpens the logging interface (useful for debugging)\n'); - process.stdout.write('\t' + 'build'.yellow + '\t\tCompiles javascript, css stylesheets, and templates\n'); - process.stdout.write('\t' + 'setup'.yellow + '\t\tRuns the NodeBB setup script\n'); - process.stdout.write('\t' + 'reset'.yellow + '\t\tDisables all plugins, restores the default theme.\n'); - process.stdout.write('\t' + 'activate'.yellow + '\tActivates a plugin for the next startup of NodeBB.\n'); - process.stdout.write('\t' + 'plugins'.yellow + '\t\tList all plugins that have been installed.\n'); - process.stdout.write('\t' + 'upgrade'.yellow + '\t\tRun NodeBB upgrade scripts, ensure packages are up-to-date\n'); - process.stdout.write('\t' + 'dev'.yellow + '\t\tStart NodeBB in interactive development mode\n'); - process.stdout.write('\n'.reset); - break; +if (!commands[args._[0]]) { + commands.help.handler(); +} else { + commands[args._[0]].handler(); } diff --git a/package.json b/package.json index ed0069f85a..325ff48f0a 100644 --- a/package.json +++ b/package.json @@ -31,11 +31,12 @@ "connect-redis": "~3.1.0", "cookie-parser": "^1.3.3", "cron": "^1.0.5", + "cropperjs": "^0.8.1", "csurf": "^1.6.1", "daemon": "~1.1.0", "express": "^4.14.0", "express-session": "^1.8.2", - "express-useragent": "1.0.4", + "express-useragent": "1.0.7", "html-to-text": "2.1.3", "ip": "1.1.3", "jimp": "0.2.27", @@ -51,18 +52,18 @@ "morgan": "^1.3.2", "mousetrap": "^1.5.3", "nconf": "~0.8.2", - "nodebb-plugin-composer-default": "4.3.8", + "nodebb-plugin-composer-default": "4.4.1", "nodebb-plugin-dbsearch": "1.0.5", "nodebb-plugin-emoji-extended": "1.1.1", "nodebb-plugin-emoji-one": "1.1.5", - "nodebb-plugin-markdown": "7.0.3", + "nodebb-plugin-markdown": "7.1.1", "nodebb-plugin-mentions": "1.1.3", - "nodebb-plugin-soundpack-default": "0.1.6", + "nodebb-plugin-soundpack-default": "1.0.0", "nodebb-plugin-spam-be-gone": "0.4.10", "nodebb-rewards-essentials": "0.0.9", "nodebb-theme-lavender": "3.0.15", - "nodebb-theme-persona": "4.1.95", - "nodebb-theme-vanilla": "5.1.59", + "nodebb-theme-persona": "4.2.4", + "nodebb-theme-vanilla": "5.2.0", "nodebb-widget-essentials": "2.0.13", "nodemailer": "2.6.4", "nodemailer-sendmail-transport": "1.0.0", diff --git a/public/language/ar/admin/advanced/errors.json b/public/language/ar/admin/advanced/errors.json index 963e68b116..546f0f1508 100644 --- a/public/language/ar/admin/advanced/errors.json +++ b/public/language/ar/admin/advanced/errors.json @@ -8,7 +8,7 @@ "clear-error-log": "Clear Error Log", "route": "Route", "count": "Count", - "no-routes-not-found": "Hooray! There are no routes that were not found.", + "no-routes-not-found": "Hooray! No 404 errors!", "clear404-confirm": "Are you sure you wish to clear the 404 error logs?", "clear404-success": "\"404 Not Found\" errors cleared" } \ No newline at end of file diff --git a/public/language/ar/admin/general/dashboard.json b/public/language/ar/admin/general/dashboard.json index b82802db1b..a70dda322e 100644 --- a/public/language/ar/admin/general/dashboard.json +++ b/public/language/ar/admin/general/dashboard.json @@ -2,6 +2,9 @@ "forum-traffic": "Forum Traffic", "page-views": "Page Views", "unique-visitors": "Unique Visitors", + "users": "Users", + "posts": "Posts", + "topics": "Topics", "page-views-last-month": "Page views Last Month", "page-views-this-month": "Page views This Month", "page-views-last-day": "Page views in last 24 hours", @@ -20,6 +23,11 @@ "prerelease-warning": "

This is a pre-release version of NodeBB. Unintended bugs may occur.

", "notices": "Notices", + "restart-not-required": "Restart not required", + "restart-required": "Restart required", + "search-plugin-installed": "Search Plugin installed", + "search-plugin-not-installed": "Search Plugin not installed", + "search-plugin-tooltip": "Install a search plugin from the plugin page in order to activate search functionality", "control-panel": "System Control", "reload": "Reload", @@ -52,4 +60,4 @@ "graphs.unique-visitors": "Unique Visitors", "graphs.registered-users": "Registered Users", "graphs.anonymous-users": "Anonymous Users" -} \ No newline at end of file +} diff --git a/public/language/ar/admin/menu.json b/public/language/ar/admin/menu.json index 6a4995ea6e..985c540e8a 100644 --- a/public/language/ar/admin/menu.json +++ b/public/language/ar/admin/menu.json @@ -13,7 +13,6 @@ "manage/users": "Users", "manage/registration": "Registration Queue", "manage/groups": "Groups", - "manage/flags": "Flags", "manage/ip-blacklist": "IP Blacklist", "section-settings": "Settings", diff --git a/public/language/ar/admin/settings/general.json b/public/language/ar/admin/settings/general.json index c26740ee4f..72ecfe641f 100644 --- a/public/language/ar/admin/settings/general.json +++ b/public/language/ar/admin/settings/general.json @@ -26,5 +26,6 @@ "touch-icon.upload": "Upload", "touch-icon.help": "Recommended size and format: 192x192, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.", "outgoing-links": "Outgoing Links", - "outgoing-links.warning-page": "Use Outgoing Links Warning Page" + "outgoing-links.warning-page": "Use Outgoing Links Warning Page", + "search-default-sort-by": "Search default sort by" } \ No newline at end of file diff --git a/public/language/ar/admin/settings/uploads.json b/public/language/ar/admin/settings/uploads.json index 8a56c85663..35eaa5a58f 100644 --- a/public/language/ar/admin/settings/uploads.json +++ b/public/language/ar/admin/settings/uploads.json @@ -9,7 +9,7 @@ "allow-topic-thumbnails": "Allow users to upload topic thumbnails", "topic-thumb-size": "Topic Thumb Size", "allowed-file-extensions": "Allowed File Extensions", - "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc).\n\t\t\t\t\tAn empty list means all extensions are allowed.", + "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc). An empty list means all extensions are allowed.", "profile-avatars": "Profile Avatars", "allow-profile-image-uploads": "Allow users to upload profile images", "convert-profile-image-png": "Convert profile image uploads to PNG", @@ -25,4 +25,4 @@ "profile-covers": "Profile Covers", "default-covers": "Default Cover Images", "default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image" -} \ No newline at end of file +} diff --git a/public/language/ar/notifications.json b/public/language/ar/notifications.json index 9df1e7e355..382e346f84 100644 --- a/public/language/ar/notifications.json +++ b/public/language/ar/notifications.json @@ -19,6 +19,9 @@ "user_flagged_post_in": "%1 أشعَرَ بمشاركة مخلة في %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 أضاف ردا إلى: %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", diff --git a/public/language/ar/pages.json b/public/language/ar/pages.json index 678658b058..c978c623b3 100644 --- a/public/language/ar/pages.json +++ b/public/language/ar/pages.json @@ -6,7 +6,7 @@ "popular-month": "المواضيع الشائعة هذا الشهر", "popular-alltime": "المواضيع الشائعة منذ القدم", "recent": "المواضيع الحديثة", - "flagged-posts": "Flagged Posts", + "flagged-content": "Flagged Content", "ip-blacklist": "IP Blacklist", "users/online": "اﻷعضاء المتصلون", "users/latest": "أحدث اﻷعضاء", @@ -27,6 +27,8 @@ "group": "%1 مجموعة", "chats": "محادثات", "chat": "Chatting with %1", + "flags": "Flags", + "flag-details": "Flag %1 Details", "account/edit": "Editing \"%1\"", "account/edit/password": "Editing password of \"%1\"", "account/edit/username": "Editing username of \"%1\"", diff --git a/public/language/ar/search.json b/public/language/ar/search.json index c654f721f2..a0b00fb092 100644 --- a/public/language/ar/search.json +++ b/public/language/ar/search.json @@ -12,6 +12,7 @@ "reply-count": "عدد المشاركات", "at-least": "على اﻷقل", "at-most": "على اﻷكثر", + "relevance": "Relevance", "post-time": "تاريخ المشاركة", "newer-than": "أحدث من", "older-than": "أقدم من", diff --git a/public/language/ar/topic.json b/public/language/ar/topic.json index 0247a147d6..34c6750ea8 100644 --- a/public/language/ar/topic.json +++ b/public/language/ar/topic.json @@ -13,7 +13,8 @@ "notify_me": "تلق تنبيهات بالردود الجديدة في هذا الموضوع", "quote": "اقتبس", "reply": "رد", - "replies_to_this_post": "Replies: %1", + "replies_to_this_post": "%1 Replies", + "last_reply_time": "Last reply", "reply-as-topic": "رد بموضوع", "guest-login-reply": "يجب عليك تسجيل الدخول للرد", "edit": "تعديل", @@ -25,28 +26,11 @@ "link": "رابط", "share": "نشر", "tools": "أدوات", - "flag": "تبليغ", "locked": "مقفل", "pinned": "مثبت", "moved": "منقول", "bookmark_instructions": "اضغط هنا للعودة لأخر مشاركة مقروءة في الموضوع", "flag_title": "إشعار بمشاركة مخلة.", - "flag_success": "تم الإشعار بهذه المشاركة على أنها مخلة", - "flag_manage_title": "Flagged post in %1", - "flag_manage_history": "Action History", - "flag_manage_no_history": "No event history to report", - "flag_manage_assignee": "Assignee", - "flag_manage_state": "State", - "flag_manage_state_open": "New/Open", - "flag_manage_state_wip": "Work in Progress", - "flag_manage_state_resolved": "Resolved", - "flag_manage_state_rejected": "Rejected", - "flag_manage_notes": "Shared Notes", - "flag_manage_update": "Update Flag Status", - "flag_manage_history_assignee": "Assigned to %1", - "flag_manage_history_state": "Updated state to %1", - "flag_manage_history_notes": "Updated flag notes", - "flag_manage_saved": "Flag Details Updated", "deleted_message": "هذه المشاركة محذوفة. فقط من لهم صلاحية الإشراف على ا لمشاركات يمكنهم معاينتها.", "following_topic.message": "ستستلم تنبيها عند كل مشاركة جديدة في هذا الموضوع.", "not_following_topic.message": "You will see this topic in the unread topics list, but you will not receive notifications when somebody posts to this topic.", @@ -131,8 +115,5 @@ "stale.warning": "The topic you are replying to is quite old. Would you like to create a new topic instead, and reference this one in your reply?", "stale.create": "موضوع جديد", "stale.reply_anyway": "الرد على هذا الموضوع ", - "link_back": "رد: [%1](%2)", - "spam": "سبام", - "offensive": "مسيئ", - "custom-flag-reason": "أدخل سبب التبليغ" + "link_back": "رد: [%1](%2)" } \ No newline at end of file diff --git a/public/language/ar/user.json b/public/language/ar/user.json index f765a7458a..08b44d2ef8 100644 --- a/public/language/ar/user.json +++ b/public/language/ar/user.json @@ -33,6 +33,7 @@ "chat": "محادثة", "chat_with": "Continue chat with %1", "new_chat_with": "Start new chat with %1", + "flag-profile": "Flag Profile", "follow": "تابع", "unfollow": "إلغاء المتابعة", "more": "المزيد", @@ -64,6 +65,8 @@ "remove_uploaded_picture": "Remove Uploaded Picture", "upload_cover_picture": "Upload cover picture", "remove_cover_picture_confirm": "Are you sure you want to remove the cover picture?", + "crop_picture": "Crop picture", + "upload_cropped_picture": "Crop and upload", "settings": "خيارات", "show_email": "أظهر بريدي الإلكتروني", "show_fullname": "أظهر اسمي الكامل", diff --git a/public/language/bg/admin/advanced/errors.json b/public/language/bg/admin/advanced/errors.json index 904a75e3d4..42a05713fa 100644 --- a/public/language/bg/admin/advanced/errors.json +++ b/public/language/bg/admin/advanced/errors.json @@ -8,7 +8,7 @@ "clear-error-log": "Изчистване на журнала за грешки", "route": "Маршрут", "count": "Брой", - "no-routes-not-found": "Ура! Няма неоткрити маршрути.", + "no-routes-not-found": "Ура! Няма грешки от вида „404“!", "clear404-confirm": "Наистина ли искате да изчистите журналите за грешки от вида 404?", "clear404-success": "Грешките от вида „Страницата не е намерена (Грешка 404)“ бяха изчистени." } \ No newline at end of file diff --git a/public/language/bg/admin/general/dashboard.json b/public/language/bg/admin/general/dashboard.json index 357fbcba2d..e0f09b639a 100644 --- a/public/language/bg/admin/general/dashboard.json +++ b/public/language/bg/admin/general/dashboard.json @@ -2,6 +2,9 @@ "forum-traffic": "Трафик на форума", "page-views": "Преглеждания на страниците", "unique-visitors": "Уникални посетители", + "users": "Потребители", + "posts": "Публикации", + "topics": "Теми", "page-views-last-month": "Преглеждания на страниците през последния месец", "page-views-this-month": "Преглеждания на страниците този месец", "page-views-last-day": "Преглеждания на страниците през последните 24 часа", @@ -20,6 +23,11 @@ "prerelease-warning": "

Това е версия за предварителен преглед на NodeBB. Възможно е да има неочаквани неизправности.

", "notices": "Забележки", + "restart-not-required": "Не се изисква рестартиране", + "restart-required": "Изисква се рестартиране", + "search-plugin-installed": "Добавката за търсене е инсталирана", + "search-plugin-not-installed": "Добавката за търсене не е инсталирана", + "search-plugin-tooltip": "Инсталирайте добавка за търсене от страницата с добавките, за да включите функционалността за търсене", "control-panel": "Системен контрол", "reload": "Презареждане", @@ -52,4 +60,4 @@ "graphs.unique-visitors": "Уникални посетители", "graphs.registered-users": "Регистрирани потребители", "graphs.anonymous-users": "Анонимни потребители" -} \ No newline at end of file +} diff --git a/public/language/bg/admin/manage/categories.json b/public/language/bg/admin/manage/categories.json index 8ab87e6984..934bf262ff 100644 --- a/public/language/bg/admin/manage/categories.json +++ b/public/language/bg/admin/manage/categories.json @@ -59,7 +59,7 @@ "alert.copy-success": "Настройките са копирани!", "alert.set-parent-category": "Задаване на базова категория", "alert.updated": "Обновени категории", - "alert.updated-success": "Category IDs %1 successfully updated.", + "alert.updated-success": "Категориите с идентификатори %1 са обновени успешно.", "alert.upload-image": "Качване на изображение за категорията", "alert.find-user": "Търсене на потребител", "alert.user-search": "Потърсете потребител тук…", diff --git a/public/language/bg/admin/menu.json b/public/language/bg/admin/menu.json index 78ddd79b7c..4870901b68 100644 --- a/public/language/bg/admin/menu.json +++ b/public/language/bg/admin/menu.json @@ -13,7 +13,6 @@ "manage/users": "Потребители", "manage/registration": "Регистрационна опашка", "manage/groups": "Групи", - "manage/flags": "Доклади", "manage/ip-blacklist": "Черен списък за IP адреси", "section-settings": "Настройки", diff --git a/public/language/bg/admin/settings/general.json b/public/language/bg/admin/settings/general.json index a0566d8e91..850a3df2a3 100644 --- a/public/language/bg/admin/settings/general.json +++ b/public/language/bg/admin/settings/general.json @@ -26,5 +26,6 @@ "touch-icon.upload": "Качване", "touch-icon.help": "Препоръчителен размер и формат: 192x192, само във формат „PNG“. Ако не е посочена иконка за начален екран на мобилно устройство, NodeBB ще използва иконката на уеб сайта.", "outgoing-links": "Изходящи връзки", - "outgoing-links.warning-page": "Показване на предупредителна страница при щракване върху външни връзки" + "outgoing-links.warning-page": "Показване на предупредителна страница при щракване върху външни връзки", + "search-default-sort-by": "Подредба по подразбиране при търсене" } \ No newline at end of file diff --git a/public/language/bg/admin/settings/uploads.json b/public/language/bg/admin/settings/uploads.json index 834b707706..3c1d0d7c59 100644 --- a/public/language/bg/admin/settings/uploads.json +++ b/public/language/bg/admin/settings/uploads.json @@ -9,7 +9,7 @@ "allow-topic-thumbnails": "Позволяване на потребителите да качват миниатюрни изображения за темите", "topic-thumb-size": "Размер на миниатюрите за темите", "allowed-file-extensions": "Разрешени файлови разширения", - "allowed-file-extensions-help": "Въведете файловите разширения тук, разделени със запетаи (напр. pdf,xls,doc).\n\\t\\t\\t\\t\\tАко списъкът е празен, всички файлови разширения ще бъдат разрешени.", + "allowed-file-extensions-help": "Въведете файловите разширения, разделени със запетаи (пример: pdf,xls,doc). Ако списъкът е празен, всички файлови разширения ще бъдат разрешени.", "profile-avatars": "Профилни изображения", "allow-profile-image-uploads": "Позволяване на потребителите да качват профилни изображения", "convert-profile-image-png": "Превръщане на качените профилни изображения във формата „PNG“", @@ -25,4 +25,4 @@ "profile-covers": "Корици на профила", "default-covers": "Стандартни изображения за корицата", "default-covers-help": "Добавете стандартни изображения на корицата (разделени със запетаи) за акаунтите, които нямат качено такова." -} \ No newline at end of file +} diff --git a/public/language/bg/notifications.json b/public/language/bg/notifications.json index 1b0c4b9a93..2367060bc8 100644 --- a/public/language/bg/notifications.json +++ b/public/language/bg/notifications.json @@ -19,6 +19,9 @@ "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", diff --git a/public/language/bg/pages.json b/public/language/bg/pages.json index 1425f091da..39def92b24 100644 --- a/public/language/bg/pages.json +++ b/public/language/bg/pages.json @@ -6,7 +6,7 @@ "popular-month": "Популярните теми този месец", "popular-alltime": "Популярните теми за всички времена", "recent": "Скорошни теми", - "flagged-posts": "Докладвани публикации", + "flagged-content": "Докладвано съдържание", "ip-blacklist": "Черен списък за IP адреси", "users/online": "Потребители на линия", "users/latest": "Последни потребители", @@ -27,6 +27,8 @@ "group": "Група %1", "chats": "Разговори", "chat": "Разговаря с %1", + "flags": "Доклади", + "flag-details": "Подробности за доклад %1", "account/edit": "Редактиране на „%1“", "account/edit/password": "Редактиране на паролата на „%1“", "account/edit/username": "Редактиране на потребителското име на „%1“", diff --git a/public/language/bg/search.json b/public/language/bg/search.json index b113c049ae..7165aace30 100644 --- a/public/language/bg/search.json +++ b/public/language/bg/search.json @@ -12,6 +12,7 @@ "reply-count": "Брой на отговорите", "at-least": "Поне", "at-most": "Най-много", + "relevance": "Уместност", "post-time": "Време на публикуване", "newer-than": "По-нови от", "older-than": "По-стари от", diff --git a/public/language/bg/topic.json b/public/language/bg/topic.json index 09088b1b95..4f0827c267 100644 --- a/public/language/bg/topic.json +++ b/public/language/bg/topic.json @@ -13,7 +13,8 @@ "notify_me": "Получавайте известия за новите отговори в тази тема", "quote": "Цитат", "reply": "Отговор", - "replies_to_this_post": "Отговори: %1", + "replies_to_this_post": "%1 отговора", + "last_reply_time": "Последен отговор", "reply-as-topic": "Отговор в нова тема", "guest-login-reply": "Впишете се, за да отговорите", "edit": "Редактиране", @@ -25,28 +26,11 @@ "link": "Връзка", "share": "Споделяне", "tools": "Инструменти", - "flag": "Докладване", "locked": "Заключена", "pinned": "Закачена", "moved": "Преместена", "bookmark_instructions": "Щракнете тук, за да се върнете към последно прочетената публикация в тази тема.", "flag_title": "Докладване на тази публикация до модератор", - "flag_success": "Тази публикация е била докладвана до модератор.", - "flag_manage_title": "Докладвана публикация в %1", - "flag_manage_history": "История на дейността", - "flag_manage_no_history": "Няма история на събитията", - "flag_manage_assignee": "Назначен", - "flag_manage_state": "Състояние", - "flag_manage_state_open": "Нов/отворен", - "flag_manage_state_wip": "В процес на работа", - "flag_manage_state_resolved": "Разрешен", - "flag_manage_state_rejected": "Отхвърлен", - "flag_manage_notes": "Споделени бележки", - "flag_manage_update": "Обновяване на състоянието на доклада", - "flag_manage_history_assignee": "Разпределен на %1", - "flag_manage_history_state": "Състоянието е променено на „%1“", - "flag_manage_history_notes": "Бележките към доклада са обновени", - "flag_manage_saved": "Подробностите за доклада са обновени", "deleted_message": "Темата е изтрита. Само потребители с права за управление на темите могат да я видят.", "following_topic.message": "Вече ще получавате известия когато някой публикува коментар в тази тема.", "not_following_topic.message": "Ще виждате тази тема в списъка с непрочетени теми, но няма да получавате известия, когато хората публикуват нещо в нея.", @@ -131,8 +115,5 @@ "stale.warning": "Темата, в която отговаряте, е доста стара. Искате ли вместо това да създадете нова и да направите препратка към тази в отговора си?", "stale.create": "Създаване на нова тема", "stale.reply_anyway": "Отговаряне в тази тема въпреки това", - "link_back": "Отговор: [%1](%2)", - "spam": "Спам", - "offensive": "Обидно", - "custom-flag-reason": "Изберете причина за докладване" + "link_back": "Отговор: [%1](%2)" } \ No newline at end of file diff --git a/public/language/bg/user.json b/public/language/bg/user.json index 3836c26357..926ecc3735 100644 --- a/public/language/bg/user.json +++ b/public/language/bg/user.json @@ -33,6 +33,7 @@ "chat": "Разговор", "chat_with": "Продължаване на разговора с %1", "new_chat_with": "Започване на нов разговор с %1", + "flag-profile": "Докладване на профила", "follow": "Следване", "unfollow": "Спиране на следването", "more": "Още", @@ -64,6 +65,8 @@ "remove_uploaded_picture": "Премахване на качената снимка", "upload_cover_picture": "Качване на снимка на корицата", "remove_cover_picture_confirm": "Наистина ли искате да премахнете снимката на корицата?", + "crop_picture": "Орязване на снимката", + "upload_cropped_picture": "Орязване и качване", "settings": "Настройки", "show_email": "Да се показва е-пощата ми", "show_fullname": "Да се показва цялото ми име", diff --git a/public/language/bn/admin/advanced/errors.json b/public/language/bn/admin/advanced/errors.json index 963e68b116..546f0f1508 100644 --- a/public/language/bn/admin/advanced/errors.json +++ b/public/language/bn/admin/advanced/errors.json @@ -8,7 +8,7 @@ "clear-error-log": "Clear Error Log", "route": "Route", "count": "Count", - "no-routes-not-found": "Hooray! There are no routes that were not found.", + "no-routes-not-found": "Hooray! No 404 errors!", "clear404-confirm": "Are you sure you wish to clear the 404 error logs?", "clear404-success": "\"404 Not Found\" errors cleared" } \ No newline at end of file diff --git a/public/language/bn/admin/general/dashboard.json b/public/language/bn/admin/general/dashboard.json index b82802db1b..a70dda322e 100644 --- a/public/language/bn/admin/general/dashboard.json +++ b/public/language/bn/admin/general/dashboard.json @@ -2,6 +2,9 @@ "forum-traffic": "Forum Traffic", "page-views": "Page Views", "unique-visitors": "Unique Visitors", + "users": "Users", + "posts": "Posts", + "topics": "Topics", "page-views-last-month": "Page views Last Month", "page-views-this-month": "Page views This Month", "page-views-last-day": "Page views in last 24 hours", @@ -20,6 +23,11 @@ "prerelease-warning": "

This is a pre-release version of NodeBB. Unintended bugs may occur.

", "notices": "Notices", + "restart-not-required": "Restart not required", + "restart-required": "Restart required", + "search-plugin-installed": "Search Plugin installed", + "search-plugin-not-installed": "Search Plugin not installed", + "search-plugin-tooltip": "Install a search plugin from the plugin page in order to activate search functionality", "control-panel": "System Control", "reload": "Reload", @@ -52,4 +60,4 @@ "graphs.unique-visitors": "Unique Visitors", "graphs.registered-users": "Registered Users", "graphs.anonymous-users": "Anonymous Users" -} \ No newline at end of file +} diff --git a/public/language/bn/admin/menu.json b/public/language/bn/admin/menu.json index 6a4995ea6e..985c540e8a 100644 --- a/public/language/bn/admin/menu.json +++ b/public/language/bn/admin/menu.json @@ -13,7 +13,6 @@ "manage/users": "Users", "manage/registration": "Registration Queue", "manage/groups": "Groups", - "manage/flags": "Flags", "manage/ip-blacklist": "IP Blacklist", "section-settings": "Settings", diff --git a/public/language/bn/admin/settings/general.json b/public/language/bn/admin/settings/general.json index c26740ee4f..72ecfe641f 100644 --- a/public/language/bn/admin/settings/general.json +++ b/public/language/bn/admin/settings/general.json @@ -26,5 +26,6 @@ "touch-icon.upload": "Upload", "touch-icon.help": "Recommended size and format: 192x192, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.", "outgoing-links": "Outgoing Links", - "outgoing-links.warning-page": "Use Outgoing Links Warning Page" + "outgoing-links.warning-page": "Use Outgoing Links Warning Page", + "search-default-sort-by": "Search default sort by" } \ No newline at end of file diff --git a/public/language/bn/admin/settings/uploads.json b/public/language/bn/admin/settings/uploads.json index 8a56c85663..35eaa5a58f 100644 --- a/public/language/bn/admin/settings/uploads.json +++ b/public/language/bn/admin/settings/uploads.json @@ -9,7 +9,7 @@ "allow-topic-thumbnails": "Allow users to upload topic thumbnails", "topic-thumb-size": "Topic Thumb Size", "allowed-file-extensions": "Allowed File Extensions", - "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc).\n\t\t\t\t\tAn empty list means all extensions are allowed.", + "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc). An empty list means all extensions are allowed.", "profile-avatars": "Profile Avatars", "allow-profile-image-uploads": "Allow users to upload profile images", "convert-profile-image-png": "Convert profile image uploads to PNG", @@ -25,4 +25,4 @@ "profile-covers": "Profile Covers", "default-covers": "Default Cover Images", "default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image" -} \ No newline at end of file +} diff --git a/public/language/bn/notifications.json b/public/language/bn/notifications.json index f139fe03fc..4c1a057d10 100644 --- a/public/language/bn/notifications.json +++ b/public/language/bn/notifications.json @@ -19,6 +19,9 @@ "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 একটি উত্তর দিয়েছেন: %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", diff --git a/public/language/bn/pages.json b/public/language/bn/pages.json index c68042e529..e08fb8f743 100644 --- a/public/language/bn/pages.json +++ b/public/language/bn/pages.json @@ -6,7 +6,7 @@ "popular-month": "Popular topics this month", "popular-alltime": "All time popular topics", "recent": "সাম্প্রতিক টপিক", - "flagged-posts": "Flagged Posts", + "flagged-content": "Flagged Content", "ip-blacklist": "IP Blacklist", "users/online": "Online Users", "users/latest": "Latest Users", @@ -27,6 +27,8 @@ "group": "%1 group", "chats": "Chats", "chat": "Chatting with %1", + "flags": "Flags", + "flag-details": "Flag %1 Details", "account/edit": "Editing \"%1\"", "account/edit/password": "Editing password of \"%1\"", "account/edit/username": "Editing username of \"%1\"", diff --git a/public/language/bn/search.json b/public/language/bn/search.json index ee8f11b7b0..143c2456bc 100644 --- a/public/language/bn/search.json +++ b/public/language/bn/search.json @@ -12,6 +12,7 @@ "reply-count": "রিপ্লাই কাউন্ট", "at-least": "কমপক্ষে", "at-most": "সর্বোচ্চ", + "relevance": "Relevance", "post-time": "পোস্টের সময়", "newer-than": "Newer than", "older-than": "Older than", diff --git a/public/language/bn/topic.json b/public/language/bn/topic.json index afdc93df1d..66863ac28b 100644 --- a/public/language/bn/topic.json +++ b/public/language/bn/topic.json @@ -13,7 +13,8 @@ "notify_me": "এই টপিকে নতুন উত্তর আসলে জানুন", "quote": "উদ্ধৃতি", "reply": "উত্তর", - "replies_to_this_post": "Replies: %1", + "replies_to_this_post": "%1 Replies", + "last_reply_time": "Last reply", "reply-as-topic": "Reply as topic", "guest-login-reply": "Log in to reply", "edit": "সম্পাদণা", @@ -25,28 +26,11 @@ "link": "লিঙ্ক", "share": "শেয়ার", "tools": "টুলস", - "flag": "ফ্ল্যাগ", "locked": "বন্ধ", "pinned": "Pinned", "moved": "Moved", "bookmark_instructions": "Click here to return to the last read post in this thread.", "flag_title": "মডারেশনের জন্য এই পোস্টটি ফ্ল্যাগ করুন", - "flag_success": "এই পোস্টটি মডারেশনের জন্য ফ্ল্যাগ করা হয়েছে।", - "flag_manage_title": "Flagged post in %1", - "flag_manage_history": "Action History", - "flag_manage_no_history": "No event history to report", - "flag_manage_assignee": "Assignee", - "flag_manage_state": "State", - "flag_manage_state_open": "New/Open", - "flag_manage_state_wip": "Work in Progress", - "flag_manage_state_resolved": "Resolved", - "flag_manage_state_rejected": "Rejected", - "flag_manage_notes": "Shared Notes", - "flag_manage_update": "Update Flag Status", - "flag_manage_history_assignee": "Assigned to %1", - "flag_manage_history_state": "Updated state to %1", - "flag_manage_history_notes": "Updated flag notes", - "flag_manage_saved": "Flag Details Updated", "deleted_message": "এই টপিকটি মুছে ফেলা হয়েছে। শুধুমাত্র টপিক ব্যবস্থাপনার ক্ষমতাপ্রাপ্ত সদস্যগণ এটি দেখতে পারবেন।", "following_topic.message": "এখন থেকে এই টপিকে অন্যকেউ পোস্ট করলে আপনি নোটিফিকেশন পাবেন।", "not_following_topic.message": "You will see this topic in the unread topics list, but you will not receive notifications when somebody posts to this topic.", @@ -131,8 +115,5 @@ "stale.warning": "The topic you are replying to is quite old. Would you like to create a new topic instead, and reference this one in your reply?", "stale.create": "Create a new topic", "stale.reply_anyway": "Reply to this topic anyway", - "link_back": "Re: [%1](%2)", - "spam": "Spam", - "offensive": "Offensive", - "custom-flag-reason": "Enter a flagging reason" + "link_back": "Re: [%1](%2)" } \ No newline at end of file diff --git a/public/language/bn/user.json b/public/language/bn/user.json index f28036d574..1c5685a7bb 100644 --- a/public/language/bn/user.json +++ b/public/language/bn/user.json @@ -33,6 +33,7 @@ "chat": "বার্তালাপ", "chat_with": "Continue chat with %1", "new_chat_with": "Start new chat with %1", + "flag-profile": "Flag Profile", "follow": "অনুসরন করুন", "unfollow": "অনুসরন করা থেকে বিরত থাকুন", "more": "আরো...", @@ -64,6 +65,8 @@ "remove_uploaded_picture": "আপলোড করা ছবিটি সরিয়ে নাও", "upload_cover_picture": "Upload cover picture", "remove_cover_picture_confirm": "Are you sure you want to remove the cover picture?", + "crop_picture": "Crop picture", + "upload_cropped_picture": "Crop and upload", "settings": "সেটিংস", "show_email": "আমার ইমেইল দেখাও", "show_fullname": "আমার সম্পূর্ণ নাম দেখাও", diff --git a/public/language/cs/admin/advanced/errors.json b/public/language/cs/admin/advanced/errors.json index 963e68b116..546f0f1508 100644 --- a/public/language/cs/admin/advanced/errors.json +++ b/public/language/cs/admin/advanced/errors.json @@ -8,7 +8,7 @@ "clear-error-log": "Clear Error Log", "route": "Route", "count": "Count", - "no-routes-not-found": "Hooray! There are no routes that were not found.", + "no-routes-not-found": "Hooray! No 404 errors!", "clear404-confirm": "Are you sure you wish to clear the 404 error logs?", "clear404-success": "\"404 Not Found\" errors cleared" } \ No newline at end of file diff --git a/public/language/cs/admin/appearance/skins.json b/public/language/cs/admin/appearance/skins.json index 64edb7c071..c84298d5a2 100644 --- a/public/language/cs/admin/appearance/skins.json +++ b/public/language/cs/admin/appearance/skins.json @@ -1,9 +1,9 @@ { "loading": "Načítání motivů…", - "homepage": "Homepage", - "select-skin": "Select Skin", - "current-skin": "Current Skin", - "skin-updated": "Skin Updated", + "homepage": "Domovská stránka", + "select-skin": "Vyber motiv", + "current-skin": "Současný motiv", + "skin-updated": "Motiv aktualizován", "applied-success": "%1 skin was succesfully applied", "revert-success": "Skin reverted to base colours" } \ No newline at end of file diff --git a/public/language/cs/admin/general/dashboard.json b/public/language/cs/admin/general/dashboard.json index 4a41012de9..7b53dd6562 100644 --- a/public/language/cs/admin/general/dashboard.json +++ b/public/language/cs/admin/general/dashboard.json @@ -2,6 +2,9 @@ "forum-traffic": "Forum Traffic", "page-views": "Page Views", "unique-visitors": "Unique Visitors", + "users": "Users", + "posts": "Posts", + "topics": "Topics", "page-views-last-month": "Page views Last Month", "page-views-this-month": "Page views This Month", "page-views-last-day": "Page views in last 24 hours", @@ -20,6 +23,11 @@ "prerelease-warning": "

This is a pre-release version of NodeBB. Unintended bugs may occur.

", "notices": "Notices", + "restart-not-required": "Restart not required", + "restart-required": "Restart required", + "search-plugin-installed": "Search Plugin installed", + "search-plugin-not-installed": "Search Plugin not installed", + "search-plugin-tooltip": "Install a search plugin from the plugin page in order to activate search functionality", "control-panel": "System Control", "reload": "Reload", @@ -52,4 +60,4 @@ "graphs.unique-visitors": "Unique Visitors", "graphs.registered-users": "Registered Users", "graphs.anonymous-users": "Anonymous Users" -} \ No newline at end of file +} diff --git a/public/language/cs/admin/manage/categories.json b/public/language/cs/admin/manage/categories.json index beb2feaf70..a6702766ce 100644 --- a/public/language/cs/admin/manage/categories.json +++ b/public/language/cs/admin/manage/categories.json @@ -8,7 +8,7 @@ "text-color": "Text Colour", "bg-image-size": "Background Image Size", "custom-class": "Custom Class", - "num-recent-replies": "# of Recent Replies", + "num-recent-replies": "# nedávných odpovědí", "ext-link": "External Link", "upload-image": "Upload Image", "delete-image": "Remove", diff --git a/public/language/cs/admin/menu.json b/public/language/cs/admin/menu.json index 68ad626681..4ac4eb1a01 100644 --- a/public/language/cs/admin/menu.json +++ b/public/language/cs/admin/menu.json @@ -13,7 +13,6 @@ "manage/users": "Users", "manage/registration": "Registration Queue", "manage/groups": "Groups", - "manage/flags": "Flags", "manage/ip-blacklist": "IP Blacklist", "section-settings": "Settings", diff --git a/public/language/cs/admin/settings/general.json b/public/language/cs/admin/settings/general.json index c26740ee4f..72ecfe641f 100644 --- a/public/language/cs/admin/settings/general.json +++ b/public/language/cs/admin/settings/general.json @@ -26,5 +26,6 @@ "touch-icon.upload": "Upload", "touch-icon.help": "Recommended size and format: 192x192, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.", "outgoing-links": "Outgoing Links", - "outgoing-links.warning-page": "Use Outgoing Links Warning Page" + "outgoing-links.warning-page": "Use Outgoing Links Warning Page", + "search-default-sort-by": "Search default sort by" } \ No newline at end of file diff --git a/public/language/cs/admin/settings/uploads.json b/public/language/cs/admin/settings/uploads.json index 8a56c85663..35eaa5a58f 100644 --- a/public/language/cs/admin/settings/uploads.json +++ b/public/language/cs/admin/settings/uploads.json @@ -9,7 +9,7 @@ "allow-topic-thumbnails": "Allow users to upload topic thumbnails", "topic-thumb-size": "Topic Thumb Size", "allowed-file-extensions": "Allowed File Extensions", - "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc).\n\t\t\t\t\tAn empty list means all extensions are allowed.", + "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc). An empty list means all extensions are allowed.", "profile-avatars": "Profile Avatars", "allow-profile-image-uploads": "Allow users to upload profile images", "convert-profile-image-png": "Convert profile image uploads to PNG", @@ -25,4 +25,4 @@ "profile-covers": "Profile Covers", "default-covers": "Default Cover Images", "default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image" -} \ 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 bdabb075e9..607a2fbd92 100644 --- a/public/language/cs/admin/settings/user.json +++ b/public/language/cs/admin/settings/user.json @@ -1,21 +1,21 @@ { - "authentication": "Authentication", - "allow-local-login": "Allow local login", - "require-email-confirmation": "Require Email Confirmation", + "authentication": "Ověření", + "allow-local-login": "Povolit místní přihlášení", + "require-email-confirmation": "Vyžadovat potvrzení e-mailem", "email-confirm-interval": "User may not resend a confirmation email until", - "email-confirm-email2": "minutes have elapsed", + "email-confirm-email2": "minut uplynulo", "allow-login-with": "Allow login with", - "allow-login-with.username-email": "Username or Email", - "allow-login-with.username": "Username Only", - "allow-login-with.email": "Email Only", - "account-settings": "Account Settings", - "disable-username-changes": "Disable username changes", - "disable-email-changes": "Disable email changes", - "disable-password-changes": "Disable password changes", - "allow-account-deletion": "Allow account deletion", + "allow-login-with.username-email": "Uživatelské jméno nebo e-mail", + "allow-login-with.username": "Pouze uživatelské jméno", + "allow-login-with.email": "Pouze e-mail", + "account-settings": "Nastavení účtu", + "disable-username-changes": "Zakázat změnu uživatelského jména", + "disable-email-changes": "Zakázat změnu e-mailu", + "disable-password-changes": "Zakázat změnu hesla", + "allow-account-deletion": "Povolit smazání účtu", "user-info-private": "Make user info private", - "themes": "Themes", - "disable-user-skins": "Prevent users from choosing a custom skin", + "themes": "Témata", + "disable-user-skins": "Zabránit uživateli ve výběru vlastního vzhledu", "account-protection": "Account Protection", "login-attempts": "Login attempts per hour", "login-attempts-help": "If login attempts to a user's account exceeds this threshold, that account will be locked for a pre-configured amount of time", @@ -34,10 +34,10 @@ "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", - "min-username-length": "Minimum Username Length", - "max-username-length": "Maximum Username Length", - "min-password-length": "Minimum Password Length", - "max-about-me-length": "Maximum About Me Length", + "min-username-length": "Minimální délka uživatelského jména", + "max-username-length": "Maximální délka uživatelského jména", + "min-password-length": "Minimální délka hesla", + "max-about-me-length": "Maximální délka hesla", "terms-of-use": "Forum Terms of Use (Leave blank to disable)", "user-search": "User Search", "user-search-results-per-page": "Number of results to display", @@ -48,10 +48,10 @@ "outgoing-new-tab": "Open outgoing links in new tab", "topic-search": "Enable In-Topic Searching", "digest-freq": "Subscribe to Digest", - "digest-freq.off": "Off", - "digest-freq.daily": "Daily", - "digest-freq.weekly": "Weekly", - "digest-freq.monthly": "Monthly", + "digest-freq.off": "Vypnuto", + "digest-freq.daily": "Denně", + "digest-freq.weekly": "Týdně", + "digest-freq.monthly": "Měsíčně", "email-chat-notifs": "Send an email if a new chat message arrives and I am not online", "email-post-notif": "Send an email when replies are made to topics I am subscribed to", "follow-created-topics": "Follow topics you create", diff --git a/public/language/cs/category.json b/public/language/cs/category.json index 4a0009323c..fa0e52e759 100644 --- a/public/language/cs/category.json +++ b/public/language/cs/category.json @@ -10,11 +10,11 @@ "share_this_category": "Share this category", "watch": "Sledovat", "ignore": "Ignorovat", - "watching": "Watching", + "watching": "Sledováno", "ignoring": "Ignoring", "watching.description": "Show topics in unread", "ignoring.description": "Do not show topics in unread", - "watch.message": "You are now watching updates from this category and all subcategories", + "watch.message": "Nyní sledujete všechny aktualizace z této kategorie a všech podkategorií", "ignore.message": "You are now ignoring updates from this category and all subcategories", "watched-categories": "Sledované kategorie" } \ No newline at end of file diff --git a/public/language/cs/error.json b/public/language/cs/error.json index 690b3423fb..d0959ae770 100644 --- a/public/language/cs/error.json +++ b/public/language/cs/error.json @@ -57,7 +57,7 @@ "post-delete-duration-expired-days": "You are only allowed to delete posts for %1 day(s) after posting", "post-delete-duration-expired-days-hours": "You are only allowed to delete posts for %1 day(s) %2 hour(s) after posting", "cant-delete-topic-has-reply": "You can't delete your topic after it has a reply", - "cant-delete-topic-has-replies": "You can't delete your topic after it has %1 replies", + "cant-delete-topic-has-replies": "Téma nelze odstranit poté, co obsahuje %1 odpovědí", "content-too-short": "Please enter a longer post. Posts should contain at least %1 character(s).", "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 character(s).", "title-too-short": "Please enter a longer title. Titles should contain at least %1 character(s).", diff --git a/public/language/cs/login.json b/public/language/cs/login.json index 8d189a2d0e..e8652b4d33 100644 --- a/public/language/cs/login.json +++ b/public/language/cs/login.json @@ -8,5 +8,5 @@ "failed_login_attempt": "Přihlášení neúspěšné", "login_successful": "Přihlášení proběhlo úspěšně!", "dont_have_account": "Nemáte účet?", - "logged-out-due-to-inactivity": "You have been logged out of the Admin Control Panel due to inactivity" + "logged-out-due-to-inactivity": "Z důvodu nečinnosti jste byl odhlášen z ovládacího panelu administrátora" } \ No newline at end of file diff --git a/public/language/cs/modules.json b/public/language/cs/modules.json index 28a90319de..84afa3b052 100644 --- a/public/language/cs/modules.json +++ b/public/language/cs/modules.json @@ -13,7 +13,7 @@ "chat.contacts": "Kontakty", "chat.message-history": "Historie zpráv", "chat.pop-out": "Skrýt chat", - "chat.minimize": "Minimize", + "chat.minimize": "Minimalizovat", "chat.maximize": "Maximalizovat", "chat.seven_days": "7 dní", "chat.thirty_days": "30 dní", diff --git a/public/language/cs/notifications.json b/public/language/cs/notifications.json index 04b05c0c0b..f25c7ac701 100644 --- a/public/language/cs/notifications.json +++ b/public/language/cs/notifications.json @@ -19,9 +19,12 @@ "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_to_dual": "%1%2 odpověděli v tématu %3", + "user_posted_to_multiple": "%1 a %2 další odpověděli v tématu %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.", diff --git a/public/language/cs/pages.json b/public/language/cs/pages.json index 64902c40c0..0619e12dcc 100644 --- a/public/language/cs/pages.json +++ b/public/language/cs/pages.json @@ -6,7 +6,7 @@ "popular-month": "Oblíbená témata pro tento měsíc", "popular-alltime": "Oblíbená témata za celou dobu", "recent": "Aktuální témata", - "flagged-posts": "Označené příspěvky", + "flagged-content": "Flagged Content", "ip-blacklist": "IP Blacklist", "users/online": "Uživatelé online", "users/latest": "Nejnovější uživatelé", @@ -27,6 +27,8 @@ "group": "%1 skupina", "chats": "Chaty", "chat": "Chatovat s %1", + "flags": "Flags", + "flag-details": "Flag %1 Details", "account/edit": "Editing \"%1\"", "account/edit/password": "Editing password of \"%1\"", "account/edit/username": "Editing username of \"%1\"", @@ -39,7 +41,7 @@ "account/groups": "%1's skupiny", "account/bookmarks": "%1's Bookmarked Posts", "account/settings": "Uživatelské nastavení", - "account/watched": "Topics watched by %1", + "account/watched": "Témata sledovaná uživatelem %1", "account/upvoted": "Posts upvoted by %1", "account/downvoted": "Posts downvoted by %1", "account/best": "Nejlepší příspěvky od %1", diff --git a/public/language/cs/register.json b/public/language/cs/register.json index fae5335f6a..fccff9ac25 100644 --- a/public/language/cs/register.json +++ b/public/language/cs/register.json @@ -1,6 +1,6 @@ { "register": "Registrace", - "cancel_registration": "Cancel Registration", + "cancel_registration": "Zrušit registraci", "help.email": "Ve výchozím nastavení bude váš e-mail skrytý.", "help.username_restrictions": "Jedinečné uživatelské jméno dlouhé %1 až %2 znaků. Ostatní uživatelé Vás mohou zmínit jako @uživatelské-jméno.", "help.minimum_password_length": "Délka vašeho hesla musí být alespoň %1 znaků.", diff --git a/public/language/cs/search.json b/public/language/cs/search.json index ca96e0613d..b4ae4ca7db 100644 --- a/public/language/cs/search.json +++ b/public/language/cs/search.json @@ -12,6 +12,7 @@ "reply-count": "Reply Count", "at-least": "At least", "at-most": "At most", + "relevance": "Relevance", "post-time": "Post time", "newer-than": "Novější než", "older-than": "Starší než", @@ -24,9 +25,9 @@ "six-months": "Šest měsíců", "one-year": "Jeden rok", "sort-by": "Řadit dle", - "last-reply-time": "Last reply time", + "last-reply-time": "Čas poslední odpovědi", "topic-title": "Topic title", - "number-of-replies": "Number of replies", + "number-of-replies": "Počet odpovědí", "number-of-views": "Number of views", "topic-start-date": "Topic start date", "username": "Uživatelské jméno", diff --git a/public/language/cs/topic.json b/public/language/cs/topic.json index cdebbe7c33..67a774b3e8 100644 --- a/public/language/cs/topic.json +++ b/public/language/cs/topic.json @@ -10,10 +10,11 @@ "posted_by": "Přidal %1", "posted_by_guest": "Přidal Host", "chat": "Chat", - "notify_me": "Sledovat toto téma", + "notify_me": "Dostávat upozornění na nové odpovědi", "quote": "Citovat", "reply": "Odpovědět", - "replies_to_this_post": "Replies: %1", + "replies_to_this_post": "%1 Replies", + "last_reply_time": "Last reply", "reply-as-topic": "Odpovědět jako Téma", "guest-login-reply": "Přihlásit se pro odpověď", "edit": "Upravit", @@ -25,28 +26,11 @@ "link": "Odkaz", "share": "Sdílet", "tools": "Nástroje", - "flag": "Flag", "locked": "Uzamčeno", "pinned": "Pinned", "moved": "Moved", "bookmark_instructions": "Click here to return to the last read post in this thread.", "flag_title": "Flag this post for moderation", - "flag_success": "This post has been flagged for moderation.", - "flag_manage_title": "Flagged post in %1", - "flag_manage_history": "Action History", - "flag_manage_no_history": "No event history to report", - "flag_manage_assignee": "Assignee", - "flag_manage_state": "State", - "flag_manage_state_open": "New/Open", - "flag_manage_state_wip": "Work in Progress", - "flag_manage_state_resolved": "Resolved", - "flag_manage_state_rejected": "Rejected", - "flag_manage_notes": "Shared Notes", - "flag_manage_update": "Update Flag Status", - "flag_manage_history_assignee": "Assigned to %1", - "flag_manage_history_state": "Updated state to %1", - "flag_manage_history_notes": "Updated flag notes", - "flag_manage_saved": "Flag Details Updated", "deleted_message": "This topic has been deleted. Only users with topic management privileges can see it.", "following_topic.message": "You will now be receiving notifications when somebody posts to this topic.", "not_following_topic.message": "You will see this topic in the unread topics list, but you will not receive notifications when somebody posts to this topic.", @@ -56,12 +40,12 @@ "mark_unread": "Označ za nepřečtené", "mark_unread.success": "Téma označeno jako nepřečtené", "watch": "Sledovat", - "unwatch": "Unwatch", + "unwatch": "Přesta sledovat", "watch.title": "Be notified of new replies in this topic", - "unwatch.title": "Stop watching this topic", + "unwatch.title": "Přestat sledovat toto téma", "share_this_post": "Sdílet toto téma", - "watching": "Watching", - "not-watching": "Not Watching", + "watching": "Sledováno", + "not-watching": "Nesledováno", "ignoring": "Ignoring", "watching.description": "Notify me of new replies.
Show topic in unread.", "not-watching.description": "Do not notify me of new replies.
Show topic in unread if category is not ignored.", @@ -109,7 +93,7 @@ "composer.handle_placeholder": "Jméno", "composer.discard": "Zrušit", "composer.submit": "Odeslat", - "composer.replying_to": "Replying to %1", + "composer.replying_to": "Odpovídání na %1", "composer.new_topic": "Nové téma", "composer.uploading": "nahrávání…", "composer.thumb_url_label": "Vložit URL náhled tématu", @@ -131,8 +115,5 @@ "stale.warning": "Reagujete na starší téma. Nechcete raději vytvořit téma nové a na původní v něm odkázat?", "stale.create": "Vytvořit nové téma", "stale.reply_anyway": "Přesto reagovat na toto téma", - "link_back": "Re: [%1](%2)", - "spam": "Spam", - "offensive": "Urážlivé", - "custom-flag-reason": "Vložte důvod oznámení" + "link_back": "Re: [%1](%2)" } \ No newline at end of file diff --git a/public/language/cs/user.json b/public/language/cs/user.json index 4551664422..25b2599e43 100644 --- a/public/language/cs/user.json +++ b/public/language/cs/user.json @@ -33,6 +33,7 @@ "chat": "Chat", "chat_with": "Continue chat with %1", "new_chat_with": "Start new chat with %1", + "flag-profile": "Flag Profile", "follow": "Sledovat", "unfollow": "Nesledovat", "more": "Více", @@ -64,6 +65,8 @@ "remove_uploaded_picture": "Odstranit nahraný obrázek", "upload_cover_picture": "Náhrát titulní obrázek", "remove_cover_picture_confirm": "Are you sure you want to remove the cover picture?", + "crop_picture": "Crop picture", + "upload_cropped_picture": "Crop and upload", "settings": "Nastavení", "show_email": "Zobrazovat můj e-mail v profilu", "show_fullname": "Zobrazovat celé jméno", @@ -81,7 +84,7 @@ "follows_no_one": "Tento uživatel nikoho nesleduje :(", "has_no_posts": "This user hasn't posted anything yet.", "has_no_topics": "This user hasn't posted any topics yet.", - "has_no_watched_topics": "This user hasn't watched any topics yet.", + "has_no_watched_topics": "Tento uživatel zatím nesleduje žádná témata.", "has_no_upvoted_posts": "This user hasn't upvoted any posts yet.", "has_no_downvoted_posts": "This user hasn't downvoted any posts yet.", "has_no_voted_posts": "This user has no voted posts", @@ -91,7 +94,7 @@ "topics_per_page": "Témat na stránce", "posts_per_page": "Příspěvků na stránce", "notification_sounds": "Přehrát zvuk když dostanete notifikaci", - "notifications_and_sounds": "Notifications & Sounds", + "notifications_and_sounds": "Upozornění a zvuky", "incoming-message-sound": "Incoming message sound", "outgoing-message-sound": "Outgoing message sound", "notification-sound": "Notification sound", @@ -103,8 +106,8 @@ "delay_image_loading": "Delay Image Loading", "image_load_delay_help": "If enabled, images in topics will not load until they are scrolled into view", "scroll_to_my_post": "After posting a reply, show the new post", - "follow_topics_you_reply_to": "Watch topics that you reply to", - "follow_topics_you_create": "Watch topics you create", + "follow_topics_you_reply_to": "Sledovat témata, do kterých přispějete", + "follow_topics_you_create": "Sledovat témata, která vytvoříte", "grouptitle": "Nadpis skupiny", "no-group-title": "Žádný nadpis skupiny", "select-skin": "Vybrat skin", diff --git a/public/language/da/admin/advanced/errors.json b/public/language/da/admin/advanced/errors.json index 963e68b116..546f0f1508 100644 --- a/public/language/da/admin/advanced/errors.json +++ b/public/language/da/admin/advanced/errors.json @@ -8,7 +8,7 @@ "clear-error-log": "Clear Error Log", "route": "Route", "count": "Count", - "no-routes-not-found": "Hooray! There are no routes that were not found.", + "no-routes-not-found": "Hooray! No 404 errors!", "clear404-confirm": "Are you sure you wish to clear the 404 error logs?", "clear404-success": "\"404 Not Found\" errors cleared" } \ No newline at end of file diff --git a/public/language/da/admin/general/dashboard.json b/public/language/da/admin/general/dashboard.json index 1ceda1053c..23153a3f1b 100644 --- a/public/language/da/admin/general/dashboard.json +++ b/public/language/da/admin/general/dashboard.json @@ -2,6 +2,9 @@ "forum-traffic": "Forum Traffik", "page-views": "Side Visninger", "unique-visitors": "Unikke Besøgere", + "users": "Users", + "posts": "Posts", + "topics": "Topics", "page-views-last-month": "Side Visninger Sidste Måned", "page-views-this-month": "Side Visninger Denne Måned", "page-views-last-day": "Side visninger i de sidste 24 timer", @@ -20,6 +23,11 @@ "prerelease-warning": "

Dette er en pre-release udgave af NodeBB. Uforventede bugs kan forekomme.

", "notices": "Varsler", + "restart-not-required": "Restart not required", + "restart-required": "Restart required", + "search-plugin-installed": "Search Plugin installed", + "search-plugin-not-installed": "Search Plugin not installed", + "search-plugin-tooltip": "Install a search plugin from the plugin page in order to activate search functionality", "control-panel": "System Kontrol", "reload": "Genindlæs", @@ -52,4 +60,4 @@ "graphs.unique-visitors": "Unique Visitors", "graphs.registered-users": "Registered Users", "graphs.anonymous-users": "Anonymous Users" -} \ No newline at end of file +} diff --git a/public/language/da/admin/menu.json b/public/language/da/admin/menu.json index 6a4995ea6e..985c540e8a 100644 --- a/public/language/da/admin/menu.json +++ b/public/language/da/admin/menu.json @@ -13,7 +13,6 @@ "manage/users": "Users", "manage/registration": "Registration Queue", "manage/groups": "Groups", - "manage/flags": "Flags", "manage/ip-blacklist": "IP Blacklist", "section-settings": "Settings", diff --git a/public/language/da/admin/settings/general.json b/public/language/da/admin/settings/general.json index c26740ee4f..72ecfe641f 100644 --- a/public/language/da/admin/settings/general.json +++ b/public/language/da/admin/settings/general.json @@ -26,5 +26,6 @@ "touch-icon.upload": "Upload", "touch-icon.help": "Recommended size and format: 192x192, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.", "outgoing-links": "Outgoing Links", - "outgoing-links.warning-page": "Use Outgoing Links Warning Page" + "outgoing-links.warning-page": "Use Outgoing Links Warning Page", + "search-default-sort-by": "Search default sort by" } \ No newline at end of file diff --git a/public/language/da/admin/settings/uploads.json b/public/language/da/admin/settings/uploads.json index 8a56c85663..35eaa5a58f 100644 --- a/public/language/da/admin/settings/uploads.json +++ b/public/language/da/admin/settings/uploads.json @@ -9,7 +9,7 @@ "allow-topic-thumbnails": "Allow users to upload topic thumbnails", "topic-thumb-size": "Topic Thumb Size", "allowed-file-extensions": "Allowed File Extensions", - "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc).\n\t\t\t\t\tAn empty list means all extensions are allowed.", + "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc). An empty list means all extensions are allowed.", "profile-avatars": "Profile Avatars", "allow-profile-image-uploads": "Allow users to upload profile images", "convert-profile-image-png": "Convert profile image uploads to PNG", @@ -25,4 +25,4 @@ "profile-covers": "Profile Covers", "default-covers": "Default Cover Images", "default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image" -} \ No newline at end of file +} diff --git a/public/language/da/notifications.json b/public/language/da/notifications.json index d05a19fa4b..659a87cafe 100644 --- a/public/language/da/notifications.json +++ b/public/language/da/notifications.json @@ -19,6 +19,9 @@ "user_flagged_post_in": "%1 har anmeldt et indlæg i %2", "user_flagged_post_in_dual": "%1 og %2 har anmeldt et indlæg i %3", "user_flagged_post_in_multiple": "%1 og %2 andre har anmeldt et indlæg i %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 har skrevet et svar til: %2", "user_posted_to_dual": "%1 og %2 har skrevet svar til: %3", "user_posted_to_multiple": "%1 og %2 andre har skrevet svar til: %3", diff --git a/public/language/da/pages.json b/public/language/da/pages.json index ea3ccbf48c..40c5478269 100644 --- a/public/language/da/pages.json +++ b/public/language/da/pages.json @@ -6,7 +6,7 @@ "popular-month": "Populære tråde denne måned", "popular-alltime": "Top populære tråde", "recent": "Seneste tråde", - "flagged-posts": "Anmeldte Indlæg", + "flagged-content": "Flagged Content", "ip-blacklist": "IP Blacklist", "users/online": "Online brugere", "users/latest": "Seneste brugere", @@ -27,6 +27,8 @@ "group": "%1 gruppe", "chats": "Chats", "chat": "Chatter med %1", + "flags": "Flags", + "flag-details": "Flag %1 Details", "account/edit": "Redigere \"%1\"", "account/edit/password": "Redigerer adgangskode for \"%1\"", "account/edit/username": "Redigerer brugernavn for \"%1\"", diff --git a/public/language/da/search.json b/public/language/da/search.json index d989086b05..6da46f494d 100644 --- a/public/language/da/search.json +++ b/public/language/da/search.json @@ -12,6 +12,7 @@ "reply-count": "Svar antal", "at-least": "Mindst", "at-most": "Højst", + "relevance": "Relevance", "post-time": "Skrevet", "newer-than": "Nyere end", "older-than": "Ældre end", diff --git a/public/language/da/topic.json b/public/language/da/topic.json index 5bd68c4a12..54d4114614 100644 --- a/public/language/da/topic.json +++ b/public/language/da/topic.json @@ -13,7 +13,8 @@ "notify_me": "Bliv notificeret ved nye svar i dette emne", "quote": "Citer", "reply": "Svar", - "replies_to_this_post": "Svar %1", + "replies_to_this_post": "%1 Replies", + "last_reply_time": "Last reply", "reply-as-topic": "Svar som emne", "guest-login-reply": "Login for at svare", "edit": "Rediger", @@ -25,28 +26,11 @@ "link": "Link", "share": "Del", "tools": "Værktøjer", - "flag": "Marker", "locked": "Låst", "pinned": "Pinned", "moved": "Flyttet", "bookmark_instructions": "Klik her for at vende tilbage til den sidst læste indlæg i denne tråd.", "flag_title": "Meld dette indlæg til moderation", - "flag_success": "Dette indlæg er blevet meldt til moderation.", - "flag_manage_title": "Markeret indlæg %1", - "flag_manage_history": "Action History", - "flag_manage_no_history": "No event history to report", - "flag_manage_assignee": "Assignee", - "flag_manage_state": "State", - "flag_manage_state_open": "Ny/Åben", - "flag_manage_state_wip": "Work in Progress", - "flag_manage_state_resolved": "Løst", - "flag_manage_state_rejected": "Afvist", - "flag_manage_notes": "Delte Noter", - "flag_manage_update": "Opdater Markerings Status", - "flag_manage_history_assignee": "Assigned to %1", - "flag_manage_history_state": "Updated state to %1", - "flag_manage_history_notes": "Updated flag notes", - "flag_manage_saved": "Flag Details Updated", "deleted_message": "Denne tråd er blevet slettet. Kun brugere med emne behandlings privilegier kan se den.", "following_topic.message": "Du vil nu modtage notifikationer når nogle skriver et indlæg i dette emne.", "not_following_topic.message": "You will see this topic in the unread topics list, but you will not receive notifications when somebody posts to this topic.", @@ -131,8 +115,5 @@ "stale.warning": "Emnet du svarer på er ret gammelt. Vil du oprette et nyt emne istedet og referere dette indlæg i dit svar?", "stale.create": "Opret nyt emne", "stale.reply_anyway": "Svar dette emne alligevel", - "link_back": "Svar: [%1](%2)", - "spam": "Spam", - "offensive": "Stødende", - "custom-flag-reason": "Indsæt en markeringsgrund" + "link_back": "Svar: [%1](%2)" } \ No newline at end of file diff --git a/public/language/da/user.json b/public/language/da/user.json index 077dc27577..7e1b09b453 100644 --- a/public/language/da/user.json +++ b/public/language/da/user.json @@ -33,6 +33,7 @@ "chat": "Chat", "chat_with": "Fortsæt chatte med %1", "new_chat_with": "Start en ny chat med %1", + "flag-profile": "Flag Profile", "follow": "Følg", "unfollow": "Følg ikke", "more": "Mere", @@ -64,6 +65,8 @@ "remove_uploaded_picture": "Fjern uploaded billede", "upload_cover_picture": "Upload coverbillede", "remove_cover_picture_confirm": "Are you sure you want to remove the cover picture?", + "crop_picture": "Crop picture", + "upload_cropped_picture": "Crop and upload", "settings": "Indstillinger", "show_email": "Vis min emailaddresse", "show_fullname": "Vis mit fulde navn", diff --git a/public/language/de/admin/admin.json b/public/language/de/admin/admin.json index 70c096f86b..69c5847a82 100644 --- a/public/language/de/admin/admin.json +++ b/public/language/de/admin/admin.json @@ -2,6 +2,6 @@ "alert.confirm-reload": "Bist du sicher, dass du NodeBB neu laden möchtest?", "alert.confirm-restart": "Bist du sicher, dass du NodeBB neu starten möchtest?", - "acp-title": "%1 | NodeBB Admin Control Panel", + "acp-title": "%1 | NodeBB Admin Systemsteuerung", "settings-header-contents": "Inhalte" } \ No newline at end of file diff --git a/public/language/de/admin/advanced/database.json b/public/language/de/admin/advanced/database.json index 71c4feb1a1..eebefbb703 100644 --- a/public/language/de/admin/advanced/database.json +++ b/public/language/de/admin/advanced/database.json @@ -1,6 +1,6 @@ { - "x-b": "%1 b", - "x-mb": "%1 mb", + "x-b": "%1 B", + "x-mb": "%1 MB", "uptime-seconds": "Laufzeit in Sekunden", "uptime-days": "Laufzeit in Tagen", @@ -14,9 +14,9 @@ "mongo.storage-size": "Speichergröße", "mongo.index-size": "Indexgröße", "mongo.file-size": "Dateigröße", - "mongo.resident-memory": "Resident Memory", - "mongo.virtual-memory": "virtueller Speicher", - "mongo.mapped-memory": "Mapped Memory", + "mongo.resident-memory": "Permanenter Speicher", + "mongo.virtual-memory": "Virtueller Speicher", + "mongo.mapped-memory": "Zugeordneter Speicher", "mongo.raw-info": "MongoDB Rohinfo", "redis": "Redis", @@ -29,7 +29,7 @@ "redis.total-connections-recieved": "Insgesamt Verbindungen empfangen", "redis.total-commands-processed": "Insgesamt Kommandos ausgeführt", "redis.iops": "Durchschnittliche Anzahl von Ein-/Ausgaben pro Sekunde", - "redis.keyspace-hits": "Keyspace Hits", - "redis.keyspace-misses": "Keyspace Misses", + "redis.keyspace-hits": "Schlüsselraum Treffer", + "redis.keyspace-misses": "Schlüsselraum Verfehlungen", "redis.raw-info": "Redis Rohinfo" } \ No newline at end of file diff --git a/public/language/de/admin/advanced/errors.json b/public/language/de/admin/advanced/errors.json index 837b211595..42c26ee8af 100644 --- a/public/language/de/admin/advanced/errors.json +++ b/public/language/de/admin/advanced/errors.json @@ -3,12 +3,12 @@ "error-events-per-day": "%1 Ereignisse pro Tag", "error.404": "404 Not Found", "error.503": "503 Service Unavailable", - "manage-error-log": "Aktionen Fehlerprotokoll", + "manage-error-log": "Fehlerprotokoll verwalten", "export-error-log": "Exportiere das Fehlerprotokoll (CSV)", - "clear-error-log": "Lösche Fehlerprotokoll", + "clear-error-log": "Fehlerprotokoll leeren", "route": "Zielroute", "count": "Anzahl", - "no-routes-not-found": "Hurra! Es gibt keine Zielrouten, die nicht gefunden wurden.", + "no-routes-not-found": "Hurra! Keine 404 Fehler!", "clear404-confirm": "Bist du dir sicher, dass du das 404 Fehlerprotokoll löschen möchtest?", "clear404-success": "\"404 Not Found\" Fehler gelöscht" } \ No newline at end of file diff --git a/public/language/de/admin/appearance/customise.json b/public/language/de/admin/appearance/customise.json index 8d04a48eb8..029a9de35b 100644 --- a/public/language/de/admin/appearance/customise.json +++ b/public/language/de/admin/appearance/customise.json @@ -1,9 +1,9 @@ { "custom-css": "Benutzerdefiniertes CSS", "custom-css.description": "Füge hier deine eigenen CSS-Eigenschaften ein, sie werden als letztes angewendet.", - "custom-css.enable": "Aktiviere benutzerdefiniertes CSS", + "custom-css.enable": "Benutzerdefiniertes CSS aktivieren", "custom-header": "Benutzerdefinierter Kopfbereich", - "custom-header.description": "Füge hier dein benutzerdefiniertes HTML (z.B. Javascript, Meta Tags, usw.) ein, welches vor dem <head> Tag eingefügt wird.", - "custom-header.enable": "Aktiviere benutzerdefinierten Kopfbereich" + "custom-header.description": "Füge hier dein benutzerdefiniertes HTML (z.B. Javascript, Meta Tags, usw.) ein, welches in den <head> Tag eingefügt werden soll.", + "custom-header.enable": "Benutzerdefinierten Kopfbereich aktivieren" } \ No newline at end of file diff --git a/public/language/de/admin/appearance/skins.json b/public/language/de/admin/appearance/skins.json index c82e310246..960c3196a7 100644 --- a/public/language/de/admin/appearance/skins.json +++ b/public/language/de/admin/appearance/skins.json @@ -1,9 +1,9 @@ { "loading": "Lade Aussehen...", "homepage": "Homepage", - "select-skin": "Wähle Aussehen", + "select-skin": "Aussehen auswählen", "current-skin": "Aktuelles Aussehen", "skin-updated": "Aussehen aktualisiert", - "applied-success": "%1 Aussehen wurde erfolgreich angewendet", - "revert-success": "Aussehen wieder auf Basisfarben zurückgestellt." + "applied-success": "Aussehen %1 wurde erfolgreich angewendet", + "revert-success": "Aussehen auf Basisfarben zurückgestellt." } \ No newline at end of file diff --git a/public/language/de/admin/appearance/themes.json b/public/language/de/admin/appearance/themes.json index adff70212a..2dede042b2 100644 --- a/public/language/de/admin/appearance/themes.json +++ b/public/language/de/admin/appearance/themes.json @@ -6,6 +6,6 @@ "no-themes": "Keine installierten Designs gefunden.", "revert-confirm": "Bist du dir sicher, dass du das standard NodeBB Design wieder herstellen willst?", "theme-changed": "Design geändert", - "revert-success": "Du hast erfolgreich dein NodeBB wieder auf das Standarddesign gewechselt.", + "revert-success": "Du hast dein NodeBB erfolgreich wieder auf das Standarddesign zurückgesetzt.", "restart-to-activate": "Bitte starte dein NodeBB neu um das Design voll zu aktivieren." } \ 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 b2768ca212..601de896a5 100644 --- a/public/language/de/admin/development/info.json +++ b/public/language/de/admin/development/info.json @@ -1,16 +1,16 @@ { - "you-are-on": "Info - You are on %1:%2", - "host": "host", - "pid": "pid", - "nodejs": "nodejs", - "online": "online", + "you-are-on": "Info - Sie verwenden %1:%2", + "host": "Host", + "pid": "PID", + "nodejs": "Node.js Version", + "online": "Online", "git": "git", - "load": "load", - "uptime": "uptime", + "load": "Auslastung", + "uptime": "Online Zeit", - "registered": "Registered", + "registered": "Registriert", "sockets": "Sockets", - "guests": "Guests", + "guests": "Gäste", "info": "Info" } \ No newline at end of file diff --git a/public/language/de/admin/development/logger.json b/public/language/de/admin/development/logger.json index 6ab9558149..bf4f4a16ac 100644 --- a/public/language/de/admin/development/logger.json +++ b/public/language/de/admin/development/logger.json @@ -1,12 +1,12 @@ { - "logger-settings": "Logger Settings", - "description": "By enabling the check boxes, you will receive logs to your terminal. If you specify a path, logs will then be saved to a file instead. HTTP logging is useful for collecting statistics about who, when, and what people access on your forum. In addition to logging HTTP requests, we can also log socket.io events. Socket.io logging, in combination with redis-cli monitor, can be very helpful for learning NodeBB's internals.", - "explanation": "Simply check/uncheck the logging settings to enable or disable logging on the fly. No restart needed.", - "enable-http": "Enable HTTP logging", - "enable-socket": "Enable socket.io event logging", - "file-path": "Path to log file", - "file-path-placeholder": "/path/to/log/file.log ::: leave blank to log to your terminal", + "logger-settings": "Protokollierungseinstellungen", + "description": "Durch das markieren der Auswahlkästchen werden sie Protokolle in ihrem Terminal finden. Wenn sie einen Dateipfad angeben, werden die Protokolle stattdessen in einer Datei gespeichert. HTTP-Logging ist nützlich um Statistiken zu sammeln darüber, wer, wann was in ihrem Forum angesehen hat. Zusätzlich kann NodeBB auch Socket.io Events Protokollieren. In Kombination mit dem redis-cli Monitor kann dies ziemlich hilfreich sein um mehr über die Interne Struktur von NodeBB zu lernen.", + "explanation": "Markiere die Protokollierungseinstellungen nebenher um die Protokollierung zu (de-)aktivieren. Ein Neustart wird nicht benötigt.", + "enable-http": "HTTP-Protokollierung aktivieren", + "enable-socket": "Socket.io-Event-Protokollierung aktivieren", + "file-path": "Dateipfad zur Protokolldatei", + "file-path-placeholder": "/pfad/zur/protokoll/datei.log ::: Feld leer lassen um im Terminal zu protokollieren", - "control-panel": "Logger Control Panel", - "update-settings": "Update Logger Settings" + "control-panel": "Protokollsteuerung", + "update-settings": "Protokollierungseinstellungen aktualisieren" } \ No newline at end of file diff --git a/public/language/de/admin/extend/plugins.json b/public/language/de/admin/extend/plugins.json index 9aeea05ca2..355b20b0cd 100644 --- a/public/language/de/admin/extend/plugins.json +++ b/public/language/de/admin/extend/plugins.json @@ -5,43 +5,43 @@ "out-of-date": "Veraltet", "none-found": "Keine Plugins gefunden.", "none-active": "Keine aktiven Plugins", - "find-plugins": "Find Plugins", + "find-plugins": "Plugins finden", - "plugin-search": "Plugin Search", - "plugin-search-placeholder": "Search for plugin...", - "reorder-plugins": "Re-order Plugins", - "order-active": "Order Active Plugins", - "dev-interested": "Interested in writing plugins for NodeBB?", - "docs-info": "Full documentation regarding plugin authoring can be found in the NodeBB Docs Portal.", + "plugin-search": "Plugin Suche", + "plugin-search-placeholder": "Nach Plugin suchen...", + "reorder-plugins": "Plugins neu sortieren", + "order-active": "Aktive Plugins sortieren", + "dev-interested": "Daran interessiert selbst Plugins für NodeBB zu schreiben?", + "docs-info": "Die komplette Dokumentation zur erstellung von Plugins kann im NodeBB Dokumentations Portal gefunden werden.", - "order.description": "Certain plugins work ideally when they are initialised before/after other plugins.", - "order.explanation": "Plugins load in the order specified here, from top to bottom", + "order.description": "Bestimmte Plugins funktionieren ideal, wenn diese for/nach anderen Plugins initialisiert werden.", + "order.explanation": "Die Plugins werden in der hier spezifizierten Reihenfolge geladen, von Oben nach Unten", - "plugin-item.themes": "Themes", - "plugin-item.deactivate": "Deactivate", - "plugin-item.activate": "Activate", - "plugin-item.install": "Install", - "plugin-item.uninstall": "Uninstall", + "plugin-item.themes": "Designs", + "plugin-item.deactivate": "Deaktivieren", + "plugin-item.activate": "Aktivieren", + "plugin-item.install": "Installieren", + "plugin-item.uninstall": "Deinstallieren", "plugin-item.settings": "Einstellungen", - "plugin-item.installed": "Installed", - "plugin-item.latest": "Latest", - "plugin-item.upgrade": "Upgrade", - "plugin-item.more-info": "For more information:", - "plugin-item.unknown": "Unknown", - "plugin-item.unknown-explanation": "The state of this plugin could not be determined, possibly due to a misconfiguration error.", + "plugin-item.installed": "Installiert", + "plugin-item.latest": "Neueste", + "plugin-item.upgrade": "Aktualisieren", + "plugin-item.more-info": "Für weitere Informationen:", + "plugin-item.unknown": "Unbekannt", + "plugin-item.unknown-explanation": "Der Status dieses Plugins konnte nicht bestimmt werden, möglicherweise aufgrund eines Fehlkonfigurationsfehlers.", - "alert.enabled": "Plugin Enabled", - "alert.disabled": "Plugin Disabled", - "alert.upgraded": "Plugin Upgraded", - "alert.installed": "Plugin Installed", - "alert.uninstalled": "Plugin Uninstalled", - "alert.activate-success": "Please restart your NodeBB to fully activate this plugin", - "alert.deactivate-success": "Plugin successfully deactivated", - "alert.upgrade-success": "Please reload your NodeBB to fully upgrade this plugin", - "alert.install-success": "Plugin successfully installed, please activate the plugin.", - "alert.uninstall-success": "The plugin has been successfully deactivated and uninstalled.", - "alert.suggest-error": "

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.

", - "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?

" + "alert.enabled": "Plugin aktiviert", + "alert.disabled": "Plugin deaktiviert", + "alert.upgraded": "Plugin aktualisiert", + "alert.installed": "Plugin installiert", + "alert.uninstalled": "Plugin deinstalliert", + "alert.activate-success": "Bitte starten Sie ihr NodeBB neu, um dieses Plugin vollständig zu aktivieren", + "alert.deactivate-success": "Plugin erfolgreich deaktiviert", + "alert.upgrade-success": "Bitte laden Sie ihr NodeBB neu um dieses Plugin vollständig zu aktualisieren", + "alert.install-success": "Plugin erfolgreich installiert. Bitte aktivieren Sie das Plugin", + "alert.uninstall-success": "Das Plugin wurde erfolgreich deaktiviert und deinstalliert.", + "alert.suggest-error": "

NodeBB konnte den Paket-Manager nicht erreichen, wollen Sie mit der Installation der neuesten Version fortfahren

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

NodeBB konnte den Paket-manager nicht erreichen, eine aktualisierung wird momentan nicht empfohlen.

", + "alert.incompatible": "

Ihre NodeBB Version (v%1) ist nur für aktualisierungen bis v%2 dieses Plugins bestimmt. Bitte aktualisieren Sie NodeBB wenn Sie eine neuere Version dieses plugins installieren wollen.

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

Keine Kompatibilitätsinformationen gefunden

Dieses Plugin legte keine spezifische NodeBB version fest, welche für die Installation benötigt wird. Volle Kompatibilität kann nicht gewährleistet werden, was dazu führen könnte, dass ihr NodeBB nicht mehr korrekt startet.

Für den Fall, dass NodeBB nicht mehr ordnungsgemäß startet:

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

Soll mit der installation der neuesten Version dieses Plugins fortgefahren werden?

" } diff --git a/public/language/de/admin/extend/rewards.json b/public/language/de/admin/extend/rewards.json index 5383a90b33..5d4e5cb3da 100644 --- a/public/language/de/admin/extend/rewards.json +++ b/public/language/de/admin/extend/rewards.json @@ -1,17 +1,17 @@ { - "rewards": "Rewards", - "condition-if-users": "If User's", - "condition-is": "Is:", - "condition-then": "Then:", - "max-claims": "Amount of times reward is claimable", - "zero-infinite": "Enter 0 for infinite", - "delete": "Delete", - "enable": "Enable", - "disable": "Disable", - "control-panel": "Rewards Control", - "new-reward": "New Reward", + "rewards": "Belohnungen", + "condition-if-users": "Wenn des Benutzers", + "condition-is": "Ist:", + "condition-then": "Dann:", + "max-claims": "Anzahl der male, die diese Belohnung beansprucht werden kann", + "zero-infinite": "Geben sie 0 für unendlich ein", + "delete": "Entfernen", + "enable": "Aktivieren", + "disable": "Deaktivieren", + "control-panel": "Belohnungseinstellungen", + "new-reward": "Neue Belohnung", - "alert.delete-success": "Successfully deleted reward", - "alert.no-inputs-found": "Illegal reward - no inputs found!", - "alert.save-success": "Successfully saved rewards" + "alert.delete-success": "Die Belohnung wurde erfolgreich gelöscht", + "alert.no-inputs-found": "Ungültige Belohnung - keine Eingaben gefunden!", + "alert.save-success": "Belohnungen erfolgreich gespeichert" } \ No newline at end of file diff --git a/public/language/de/admin/extend/widgets.json b/public/language/de/admin/extend/widgets.json index 477bb15e56..73308e9c16 100644 --- a/public/language/de/admin/extend/widgets.json +++ b/public/language/de/admin/extend/widgets.json @@ -1,19 +1,19 @@ { - "available": "Available Widgets", - "explanation": "Select a widget from the dropdown menu and then drag and drop it into a template's widget area on the left.", - "none-installed": "No widgets found! Activate the essential widgets plugin in the plugins control panel.", - "containers.available": "Available Containers", - "containers.explanation": "Drag and drop on top of any active widget", - "containers.none": "None", - "container.well": "Well", + "available": "Verfügbare Widgets", + "explanation": "Wählen Sie ein Widget vom Dropdown-Menu aus und ziehen Sie es anschließend links in den Widget-Bereich einer Vorlage.", + "none-installed": "Keine Widgets gefunden! Aktivieren Sie das \"essential widgets\"-Plugin in den Plugin-Einstellungen.", + "containers.available": "Verfügbare Container", + "containers.explanation": "Ziehen Sie sie auf ein beliebiges aktives Widget", + "containers.none": "Nichts", + "container.well": "Brunnen", "container.jumbotron": "Jumbotron", "container.panel": "Panel", - "container.panel-header": "Panel Header", - "container.panel-body": "Panel Body", - "container.alert": "Alert", + "container.panel-header": "Panel Kopfbereich", + "container.panel-body": "Panel Körper", + "container.alert": "Alarm", - "alert.confirm-delete": "Are you sure you wish to delete this widget?", - "alert.updated": "Widgets Updated", - "alert.update-success": "Successfully updated widgets" + "alert.confirm-delete": "Sind Sie sicher, dass Sie dieses Widget löschen wollen?", + "alert.updated": "Widgets aktualisiert", + "alert.update-success": "Widgets erfolgreich aktualisiert" } \ No newline at end of file diff --git a/public/language/de/admin/general/dashboard.json b/public/language/de/admin/general/dashboard.json index 6c87767148..451b7434cf 100644 --- a/public/language/de/admin/general/dashboard.json +++ b/public/language/de/admin/general/dashboard.json @@ -1,55 +1,63 @@ { "forum-traffic": "Forum Traffic", "page-views": "Seitenaufrufe", - "unique-visitors": "Besucher", + "unique-visitors": "Individuelle Besucher", + "users": "Benutzer", + "posts": "Beiträge", + "topics": "Themen", "page-views-last-month": "Aufrufe im letzten Monat", "page-views-this-month": "Aufrufe in diesem Monat", "page-views-last-day": "Aufrufe in den letzten 24 Stunden", - "stats.day": "diesen Tag", - "stats.week": "diese Woche", - "stats.month": "diesen Monat", + "stats.day": "Diesen Tag", + "stats.week": "Diese Woche", + "stats.month": "Diesen Monat", "stats.all": "Alle", "updates": "Updates", - "running-version": "Es läuft NodeBB v%1.", - "keep-updated": "Stelle immer sicher, dass dein NodeBB auf dem neuesten Stand ist für die neuesten Sicherheits-Patches und Bug-fixes.", - "up-to-date": "

System ist aktuell

", - "upgrade-available": "

Version (v%1) wurde veröffentlicht. Beachte um ein NodeBB Upgrade durchzuführen.

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

Das ist eine veraltete pre-release Version von NodeBB. Version (v%1) wurde veröffentlicht. Beachte um ein NodeBB Upgrade durchzuführen.

", - "prerelease-warning": "

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

", + "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": "

System ist aktuell

", + "upgrade-available": "

Version (v%1) wurde veröffentlicht. Beachte um ein NodeBB Upgrade durchzuführen.

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

Das ist eine veraltete pre-release Version von NodeBB. Version (v%1) wurde veröffentlicht. Beachte um ein NodeBB Upgrade durchzuführen.

", + "prerelease-warning": "

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

", "notices": "Hinweise", + "restart-not-required": "Neustart nicht benötigt", + "restart-required": "Neustart benötigt", + "search-plugin-installed": "Such-Plugin installiert", + "search-plugin-not-installed": "Such-Plugin nicht installiert", + "search-plugin-tooltip": "Installieren Sie ein Such-Plugin auf der Plugin seite um die Such-Funktionalität zu aktivieren", "control-panel": "Systemsteuerung", "reload": "Reload", "restart": "Neustart", "restart-warning": "Ein Reload oder Neustart trennt die Verbindung für ein paar Sekunden.", "maintenance-mode": "Wartungsmodus", - "maintenance-mode-title": "Hier klicken um NodeBB in den Wartungsmodus zu setzen", + "maintenance-mode-title": "Hier klicken um NodeBB in den Wartungsmodus zu versetzen", "realtime-chart-updates": "Echtzeit Chartaktualisierung", - "active-users": "aktive Benutzer", + "active-users": "Aktive Benutzer", "active-users.users": "Benutzer", "active-users.guests": "Gäste", "active-users.total": "Gesamt", "active-users.connections": "Verbindungen", - "anonymous-registered-users": "anonyme vs registrierte Benutzer", + "anonymous-registered-users": "Anonyme vs Registrierte Benutzer", "anonymous": "Anonym", "registered": "Registriert", "user-presence": "Benutzerpräsenz", - "on-categories": "auf Kategorie Übersicht", - "reading-posts": "Beiträge lesen", - "browsing-topics": "Themen durchsuchen", + "on-categories": "Auf Kategorieübersicht", + "reading-posts": "Beiträge lesend", + "browsing-topics": "Themen durchsuchend", "recent": "Aktuell", "unread": "Ungelesen", "high-presence-topics": "Meist besuchte Themen", "graphs.page-views": "Seitenaufrufe", - "graphs.unique-visitors": "verschiedene Besucher", - "graphs.registered-users": "registrierte Benutzer", - "graphs.anonymous-users": "anonyme Benutzer" -} \ No newline at end of file + "graphs.unique-visitors": "Verschiedene Besucher", + "graphs.registered-users": "Registrierte Benutzer", + "graphs.anonymous-users": "Anonyme Benutzer" +} diff --git a/public/language/de/admin/general/homepage.json b/public/language/de/admin/general/homepage.json index 737296b223..3b8b02333e 100644 --- a/public/language/de/admin/general/homepage.json +++ b/public/language/de/admin/general/homepage.json @@ -3,5 +3,5 @@ "description": "Wähle aus, welche Seite angezeigt werden soll, wenn Nutzer zur Startseite des Forums navigieren.", "home-page-route": "Startseitenpfad", "custom-route": "Eigener Startseitenpfad", - "allow-user-home-pages": "Benutzer eigene Startseiten erlauben" + "allow-user-home-pages": "Benutzern eigene Startseiten erlauben" } \ No newline at end of file diff --git a/public/language/de/admin/general/languages.json b/public/language/de/admin/general/languages.json index 6940df18c3..ffea3c3f7d 100644 --- a/public/language/de/admin/general/languages.json +++ b/public/language/de/admin/general/languages.json @@ -1,5 +1,5 @@ { "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 mit den Kontoeinstellungen überschreiben.", - "default-language": "Standartsprache" + "default-language": "Standardsprache" } \ No newline at end of file diff --git a/public/language/de/admin/general/navigation.json b/public/language/de/admin/general/navigation.json index 7848f3aa43..408b4537c5 100644 --- a/public/language/de/admin/general/navigation.json +++ b/public/language/de/admin/general/navigation.json @@ -4,17 +4,17 @@ "route": "Pfad:", "tooltip": "Tooltip:", "text": "Text:", - "text-class": "Text Stil: optional", + "text-class": "Text Klasse: optional", "id": "ID: optional", "properties": "Eigenschaften:", - "only-admins": "Nur sichtbar für Admins", - "only-global-mods-and-admins": "Nur sichtbar für Globale Moderatoren und Admins", - "only-logged-in": "Nur sichtbar für angemeldete Benutzer", + "only-admins": "Nur für Admins sichtbar", + "only-global-mods-and-admins": "Nur für Globale Moderatoren und Admins sichtbar", + "only-logged-in": "Nur für angemeldete Benutzer sichtbar", "open-new-window": "In neuem Fenster öffnen", - "installed-plugins-required": "Installierte Plugins notwendig:", - "search-plugin": "Search plugin", + "installed-plugins-required": "Benötigte installierte Plugins:", + "search-plugin": "Such-Plugin", "btn.delete": "Löschen", "btn.disable": "Deaktivieren", diff --git a/public/language/de/admin/manage/categories.json b/public/language/de/admin/manage/categories.json index aea5937fb5..0bc48e206c 100644 --- a/public/language/de/admin/manage/categories.json +++ b/public/language/de/admin/manage/categories.json @@ -1,22 +1,22 @@ { - "settings": "Kategorie Einstellungen", + "settings": "Kategorieeinstellungen", "privileges": "Berechtigungen", - "name": "Kategorie Name", - "description": "Kategorie Beschreibung", + "name": "Kategoriename", + "description": "Kategorie-Beschreibung", "bg-color": "Hintergrundfarbe", "text-color": "Textfarbe", - "bg-image-size": "Größe Hintergrundbild", - "custom-class": "Benutzderdefinierter Stil", + "bg-image-size": "Hintergrundbildgröße", + "custom-class": "Benutzderdefinierte Klasse", "num-recent-replies": "Anzahl neuer Antworten", "ext-link": "Externer Link", "upload-image": "Bild hochladen", "delete-image": "Entfernen", - "category-image": "Kategorie Bild", + "category-image": "Kategoriebild", "parent-category": "Übergeordnete Kategorie", "optional-parent-category": "(Optional) Übergeordnete Kategorie", "parent-category-none": "(Keine)", - "copy-settings": "kopiere Einstellungen von", + "copy-settings": "Kopiere Einstellungen von", "optional-clone-settings": "(Optional) dubliziere Einstellungen von Kategorie", "purge": "Kategorie löschen", @@ -24,10 +24,10 @@ "disable": "Deaktivieren", "edit": "Bearbeiten", - "select-category": "Wähle Kategorie", + "select-category": "Kategorie auswählen", "set-parent-category": "Übergeordnete Kategorie festlegen", - "privileges.description": "In diesem Bereich können die Zugriffsberechtigungen für diese Kategorie konfiguriert werden. Berechtigungen können pro-Benutzer oder pro-Gruppe gewährt werden. Du kannst einen neuen Benutzer zu dieser Tabelle hinzufügen, indem du sie in dem folgenden Formular suchst.", + "privileges.description": "In diesem Bereich können die Zugriffsberechtigungen für diese Kategorie konfiguriert werden. Berechtigungen können pro Benutzer oder pro Gruppe gewährt werden. Du kannst einen neuen Benutzer zu dieser Tabelle hinzufügen, indem du sie in dem folgenden Formular suchst.", "privileges.warning": "Hinweis: Die Zugriffsberechtigungen werden sofort wirksam. Es ist nicht notwendig, die Kategorie zu speichern, nachdem du die Einstellungen angepasst hast.", "privileges.section-viewing": "Ansichtsberechtigungen", "privileges.section-posting": "Schreibberechtigungen", @@ -43,7 +43,7 @@ "privileges.inherit": "Wenn der Gruppe registered-users eine bestimmte Berechtigung erteilt wird, erhalten alle anderen Gruppen eine implizite Berechtigung, auch wenn sie nicht explizit definiert / ausgewählt werden. Diese implizite Berechtigung wird dir angezeigt, da alle Benutzer Teil der Gruppe registered-users sind und daher keine Berechtigungen für zusätzliche Gruppen explizit erteilt werden müssen.", "analytics.back": "Zurück zur Kategorien Übersicht", - "analytics.title": "Analyse für \\\"%1\\\" Kategorie", + "analytics.title": "Analyse für \"%1\" Kategorie", "analytics.pageviews-hourly": "Diagramm 1 – Stündliche Seitenaufrufe in dieser Kategorie", "analytics.pageviews-daily": "Diagramm 2 – Tägliche Seitenaufrufe in dieser Kategorie", "analytics.topics-daily": "Diagramm 3 – Täglich erstellte Themen in dieser Kategorie", @@ -54,13 +54,13 @@ "alert.none-active": "Du hast keine aktiven Kategorien.", "alert.create": "Erstelle eine Kategorie", "alert.confirm-moderate": "Bist du sicher, dass du dieser Gruppe das Moderationsrecht gewähren möchtest? Diese Gruppe ist öffentlich, und alle Benutzer können nach Belieben beitreten.", - "alert.confirm-purge": "

Möchtest du die Kategorie \\\"%1\\\" wirklich löschen?

Warnung! Alle Themen und Beiträge in dieser Kategorie werden gelöscht!

Löschen einer Kategorie wird alle Themen und Beiträge zu entfernen, und die Kategorie aus der Datenbank löschen. Falls du eine Kategorie temporär entfernen möchstest, dann kannst du sie stattdessen \\\"deaktivieren\\\".", + "alert.confirm-purge": "

Möchtest du die Kategorie \"%1\" wirklich löschen?

Warnung! Alle Themen und Beiträge in dieser Kategorie werden gelöscht!

Löschen einer Kategorie wird alle Themen und Beiträge zu entfernen, und die Kategorie aus der Datenbank löschen. Falls du eine Kategorie temporär entfernen möchstest, dann kannst du sie stattdessen \"deaktivieren\".", "alert.purge-success": "Kategorie gelöscht!", "alert.copy-success": "Einstellungen kopiert!", "alert.set-parent-category": "Übergeordnete Kategorie festlegen", "alert.updated": "Kategorien aktualisiert", "alert.updated-success": "Kategorie IDs %1 erfolgreich aktualisiert.", - "alert.upload-image": "Kategorie Bild hochladen", + "alert.upload-image": "Kategoriebild hochladen", "alert.find-user": "Benutzer finden", "alert.user-search": "Hier nach einem Benutzer suchen...", "alert.find-group": "Gruppe finden", diff --git a/public/language/de/admin/manage/flags.json b/public/language/de/admin/manage/flags.json index bfc488a409..b215a75901 100644 --- a/public/language/de/admin/manage/flags.json +++ b/public/language/de/admin/manage/flags.json @@ -1,19 +1,19 @@ { - "daily": "Daily flags", - "by-user": "Flags by user", - "by-user-search": "Search flagged posts by username", - "category": "Category", - "sort-by": "Sort By", - "sort-by.most-flags": "Most Flags", - "sort-by.most-recent": "Most Recent", - "search": "Search", - "dismiss-all": "Dismiss All", - "none-flagged": "No flagged posts!", - "posted-in": "Posted in %1", - "read-more": "Read More", - "flagged-x-times": "This post has been flagged %1 time(s):", - "dismiss": "Dismiss this Flag", - "delete-post": "Delete the Post", + "daily": "Tägliche Meldungen", + "by-user": "Meldungen des Benutzers", + "by-user-search": "Nach gemeldeten Beiträgen anhand des Benutzernamens Suchen", + "category": "Kategorie", + "sort-by": "Sortieren nach:", + "sort-by.most-flags": "Meiste Meldungen", + "sort-by.most-recent": "Neueste", + "search": "Suche", + "dismiss-all": "Alle verwerfen", + "none-flagged": "Keine gemeldeten Beiträge", + "posted-in": "Gepostet am %1", + "read-more": "Mehr Lesen", + "flagged-x-times": "Dieser Beitrag wurde %1 mal gemeldet:", + "dismiss": "Diese Meldung verwerfen", + "delete-post": "Beitrag löschen", - "alerts.confirm-delete-post": "Do you really want to delete this post?" + "alerts.confirm-delete-post": "Sind Sie sicher, dass Sie diesen beitrag löschen wollen?" } \ 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 b5e526aacf..818d721601 100644 --- a/public/language/de/admin/manage/groups.json +++ b/public/language/de/admin/manage/groups.json @@ -1,34 +1,34 @@ { - "name": "Group Name", - "description": "Group Description", - "system": "System Group", - "edit": "Edit", - "search-placeholder": "Search", - "create": "Create Group", - "description-placeholder": "A short description about your group", - "create-button": "Create", + "name": "Gruppenname", + "description": "Gruppenbeschreibung", + "system": "System-Gruppe", + "edit": "Ändern", + "search-placeholder": "Suchen", + "create": "Gruppe erstellen", + "description-placeholder": "Eine kurze Beschreibung deiner Gruppe", + "create-button": "Erstellen", - "alerts.create-failure": "Uh-Oh

There was a problem creating your group. Please try again later!

", - "alerts.confirm-delete": "Are you sure you wish to delete this group?", + "alerts.create-failure": "Oh Oh

Ein Problem ist beim erstellen deiner Gruppe aufgetreten. Bitte versuche es später noch mal!

", + "alerts.confirm-delete": "Sind Sie sicher, dass Sie diese Gruppe löschen wollen?", "edit.name": "Name", - "edit.description": "Description", - "edit.user-title": "Title of Members", - "edit.icon": "Group Icon", - "edit.label-color": "Group Label Color", - "edit.show-badge": "Show Badge", - "edit.private-details": "If enabled, joining of groups requires approval from a group owner.", - "edit.private-override": "Warning: Private groups is disabled at system level, which overrides this option.", - "edit.disable-requests": "Disable join requests", - "edit.hidden": "Hidden", - "edit.hidden-details": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually", - "edit.add-user": "Add User to Group", - "edit.add-user-search": "Search Users", - "edit.members": "Member List", - "control-panel": "Groups Control Panel", - "revert": "Revert", + "edit.description": "Beschreibung", + "edit.user-title": "Titel der Mitglieder", + "edit.icon": "Gruppenbild", + "edit.label-color": "Gruppenlabelfarbe", + "edit.show-badge": "Abzeichen zeigen", + "edit.private-details": "Wenn aktiviert, benögt das Beitreten von Gruppen das Einverständnis eines Gruppenbesitzers", + "edit.private-override": "Warnung: Private Gruppen sind auf System-Level deaktiviert, was diese Option überschreibt.", + "edit.disable-requests": "Gruppenbeitrittsanfragen deaktivieren", + "edit.hidden": "Versteckt", + "edit.hidden-details": "Wenn aktiviert, wird diese Gruppe nicht im Gruppen-Listing angezeigt und Benutzer müssten manuell eingeladen werden.", + "edit.add-user": "Benutzer zur Gruppe hinzufügen", + "edit.add-user-search": "Benutzer suchen", + "edit.members": "Mitgliederliste", + "control-panel": "Gruppeneinstellungen", + "revert": "Rückgängig machen", - "edit.no-users-found": "No Users Found", - "edit.confirm-remove-user": "Are you sure you want to remove this user?", - "edit.save-success": "Changes saved!" + "edit.no-users-found": "Keine Benutzer gefunden", + "edit.confirm-remove-user": "Sind Sie sicher, dass Sie diesen Benutzer entfernen wollen?", + "edit.save-success": "Änderungen gespeichert!" } \ No newline at end of file diff --git a/public/language/de/admin/manage/ip-blacklist.json b/public/language/de/admin/manage/ip-blacklist.json index 5106434351..e98633eee8 100644 --- a/public/language/de/admin/manage/ip-blacklist.json +++ b/public/language/de/admin/manage/ip-blacklist.json @@ -1,15 +1,15 @@ { - "lead": "Configure your IP blacklist here.", - "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", - "apply": "Apply Blacklist", - "hints": "Syntax Hints", - "hint-1": "Define a single IP addresses per line. You can add IP blocks as long as they follow the CIDR format (e.g. 192.168.100.0/22).", - "hint-2": "You can add in comments by starting lines with the # symbol.", + "lead": "Konfiguriere hier deine IP-Blacklist", + "description": "Manchmal ist ein User-Bann nicht abschreckend genug. In vielen Fällen ist es daher sinvoll, den Zugriff auf ein Forum für eine bestimmte Reihe von IP-Adressen zu blockieren. In diesen Fällen können Sie problematische IP-Adressen oder komplette CIDR Blöcke zu dieser Blacklist hinzufügen, welche dann daran gehindert werden sich einzuloggen, oder einen neuen Account zu erstellen.", + "active-rules": "Aktive Regeln", + "validate": "Blacklist validieren", + "apply": "Blacklist anwenden", + "hints": "Syntax Hinweise", + "hint-1": "Fügen Sie einzelne IP-Adresses pro Zeile ein. Sie können IP-Blöcke hinzufügen, so lange diese im CIDR Format (z.b. 192.168.100.0/22) eingegeben werden.", + "hint-2": "Sie können Kommentare hinzufügen, indem Sie die Zeilen mit dem # Symbol beginnen.", - "validate.x-valid": "%1 out of %2 rule(s) valid.", - "validate.x-invalid": "The following %1 rules are invalid:", + "validate.x-valid": "%1 von %2 Regel(n) zulässig.", + "validate.x-invalid": "Die folgenden %1 Regeln sind unzulässig:", - "alerts.applied-success": "Blacklist Applied" + "alerts.applied-success": "Blacklist angewandt" } \ No newline at end of file diff --git a/public/language/de/admin/manage/registration.json b/public/language/de/admin/manage/registration.json index f51b4d56e6..f8e1f5f4ad 100644 --- a/public/language/de/admin/manage/registration.json +++ b/public/language/de/admin/manage/registration.json @@ -1,20 +1,20 @@ { - "queue": "Queue", - "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\".", + "queue": "Schlange", + "description": "Es sind keine Benutzer in der Registrierungsschlange.
Um diese Funktion zu aktivieren, gehen SIe zur Einstellungen → Benutzer → Benutzer registrierung und ändern sie Registrierungsart auf \"Admin Genehmigung\".", "list.name": "Name", "list.email": "Email", - "list.ip": "IP", - "list.time": "Time", - "list.username-spam": "Frequency: %1 Appears: %2 Confidence: %3", - "list.email-spam": "Frequency: %1 Appears: %2", - "list.ip-spam": "Frequency: %1 Appears: %2", + "list.ip": "IP-Adresse", + "list.time": "Zeit", + "list.username-spam": "Häufigkeit: %1 Erscheint: %2 Sicherheit: %3", + "list.email-spam": "Häufigkeit: %1 Erscheint: %2", + "list.ip-spam": "Häufigkeit: %1 Erscheint: %2", - "invitations": "Invitations", - "invitations.description": "Below is a complete list of invitations sent. Use ctrl-f to search through the list by email or username.

The username will be displayed to the right of the emails for users who have redeemed their invitations.", - "invitations.inviter-username": "Inviter Username", - "invitations.invitee-email": "Invitee Email", - "invitations.invitee-username": "Invitee Username (if registered)", + "invitations": "Einladungen", + "invitations.description": "Unterhalb ist eine komplette Liste der versandten Einladungen. Benutze Strg+F um die Liste per Email oder Nutzername zu durchsuchen.

Der Nutzername wird für die Nutzer die ihre einladung angenommen haben Rechts von den Emails angezeigt.", + "invitations.inviter-username": "Nutzername des Einladenden", + "invitations.invitee-email": "Email des eingeladenen", + "invitations.invitee-username": "Nutzername des eingeladenen (Wenn registriert)", - "invitations.confirm-delete": "Are you sure you wish to delete this invitation?" + "invitations.confirm-delete": "Sind Sie sicher, dass Sie diese Einladung löschen wollen?" } \ No newline at end of file diff --git a/public/language/de/admin/manage/tags.json b/public/language/de/admin/manage/tags.json index db40e9f098..d9230c2253 100644 --- a/public/language/de/admin/manage/tags.json +++ b/public/language/de/admin/manage/tags.json @@ -1,18 +1,18 @@ { - "none": "Your forum does not have any topics with tags yet.", - "bg-color": "Background Colour", - "text-color": "Text Colour", - "create-modify": "Create & Modify Tags", - "description": "Select tags via clicking and/or dragging, use shift to select multiple.", - "create": "Create Tag", - "modify": "Modify Tags", - "delete": "Delete Selected Tags", - "search": "Search for tags...", - "settings": "Click here to visit the tag settings page.", - "name": "Tag Name", + "none": "Ihr Form hat bisher noch keine Themen mit Tags.", + "bg-color": "Hintergrundfarbe", + "text-color": "Textfarbe", + "create-modify": "Tags erstellen & bearbeiten", + "description": "Wählen sie Tags aus indem sie klicken und/oder ziehen, drücken die Shift um mehrere auszuwählen", + "create": "Tag erstellen", + "modify": "Tag bearbeiten", + "delete": "Ausgewählte Tags entfernen", + "search": "Nach Tags suchen", + "settings": "Klicken Sie hier um die Tag-Einstellungsseite zu öffnen.", + "name": "Tagname", - "alerts.editing-multiple": "Editing multiple tags", - "alerts.editing-x": "Editing \"%1\" tag", - "alerts.confirm-delete": "Do you want to delete the selected tags?", - "alerts.update-success": "Tag Updated!" + "alerts.editing-multiple": "Bearbeite mehrere Tags", + "alerts.editing-x": "Bearbeite Tag \"%1\"", + "alerts.confirm-delete": "Wollen Sie die ausgewählten Tags löschen?", + "alerts.update-success": "Tag aktualisiert!" } \ No newline at end of file diff --git a/public/language/de/admin/manage/users.json b/public/language/de/admin/manage/users.json index f1651a814b..277b0a200e 100644 --- a/public/language/de/admin/manage/users.json +++ b/public/language/de/admin/manage/users.json @@ -1,91 +1,91 @@ { - "users": "Users", - "edit": "Edit", - "make-admin": "Make Admin", - "remove-admin": "Remove Admin", - "validate-email": "Validate Email", - "send-validation-email": "Send Validation Email", - "password-reset-email": "Send Password Reset Email", - "ban": "Ban User(s)", - "temp-ban": "Ban User(s) Temporarily", - "unban": "Unban User(s)", - "reset-lockout": "Reset Lockout", - "reset-flags": "Reset Flags", - "delete": "Delete User(s)", - "purge": "Delete User(s) and Content", - "download-csv": "Download CSV", - "invite": "Invite", - "new": "New User", + "users": "Benutzer", + "edit": "Bearbeiten", + "make-admin": "Zum Administrator befördern", + "remove-admin": "Adminstatus entfernen", + "validate-email": "Email bestätigen", + "send-validation-email": "Bestätigungsemail senden", + "password-reset-email": "Passwortreset email senden", + "ban": "Benutzer verbannen", + "temp-ban": "Benutzer temporär verbannen", + "unban": "Benutzer entbannen", + "reset-lockout": "Ausschließungen zurücksetzen", + "reset-flags": "Meldungen zurücksetzen", + "delete": "Benutzer Löschen", + "purge": "Benutzer mit Beiträgen löschen", + "download-csv": "CSV herunterladen", + "invite": "Einladen", + "new": "Neuer Benutzer", - "pills.latest": "Latest Users", - "pills.unvalidated": "Not Validated", - "pills.no-posts": "No Posts", - "pills.top-posters": "Top Posters", - "pills.top-rep": "Most Reputation", - "pills.inactive": "Inactive", - "pills.flagged": "Most Flagged", - "pills.banned": "Banned", - "pills.search": "User Search", + "pills.latest": "Neueste Benutzer", + "pills.unvalidated": "Nicht bestätigt", + "pills.no-posts": "Keine Beiträge", + "pills.top-posters": "Top Poster", + "pills.top-rep": "Größtes Ansehen", + "pills.inactive": "Inaktiv", + "pills.flagged": "Meist gemeldetster", + "pills.banned": "Gebannt", + "pills.search": "Benutzer Suche", - "search.username": "By User Name", - "search.username-placeholder": "Enter a username to search", - "search.email": "By Email", - "search.email-placeholder": "Enter a email to search", - "search.ip": "By IP Address", - "search.ip-placeholder": "Enter an IP Address to search", - "search.not-found": "User not found!", + "search.username": "Nach Nutzernamen", + "search.username-placeholder": "Geben Sie einen Nutzernamen ein um danach zu suchen", + "search.email": "Nach Email", + "search.email-placeholder": "Geben Sie eine Email Adresse ein um danach zu suchen", + "search.ip": "Nach IP-Adresse", + "search.ip-placeholder": "Geben Sie eine IP Adresse ein um danach zu suchen", + "search.not-found": "Benutzer nicht gefunden!", - "inactive.3-months": "3 months", - "inactive.6-months": "6 months", - "inactive.12-months": "12 months", + "inactive.3-months": "3 Monate", + "inactive.6-months": "6 Monate", + "inactive.12-months": "12 Monate", - "users.uid": "uid", - "users.username": "username", - "users.email": "email", - "users.postcount": "postcount", - "users.reputation": "reputation", - "users.flags": "flags", - "users.joined": "joined", - "users.last-online": "last online", - "users.banned": "banned", + "users.uid": "UID", + "users.username": "Nutzername", + "users.email": "Email", + "users.postcount": "Anzahl der Beiträge", + "users.reputation": "Ansehen", + "users.flags": "Meldungen", + "users.joined": "Beigetreten am", + "users.last-online": "Letztes mal online", + "users.banned": "Gebannt", - "create.username": "User Name", + "create.username": "Benutzername", "create.email": "Email", - "create.email-placeholder": "Email of this user", - "create.password": "Password", - "create.password-confirm": "Confirm Password", + "create.email-placeholder": "Email dieses Benutzers", + "create.password": "Passwort", + "create.password-confirm": "Passwort bestätigen", - "temp-ban.length": "Ban Length", - "temp-ban.reason": "Reason (Optional)", - "temp-ban.hours": "Hours", - "temp-ban.days": "Days", - "temp-ban.explanation": "Enter the length of time for the ban. Note that a time of 0 will be a considered a permanent ban.", + "temp-ban.length": "Banndauer", + "temp-ban.reason": "Grund (Optional)", + "temp-ban.hours": "Stunden", + "temp-ban.days": "Tage", + "temp-ban.explanation": "Geben Sie die dauer des Bans an. Beachten Sie, dass eine Zeit von 0 als permanent interpretiert wird.", - "alerts.confirm-ban": "Do you really want to ban this user permanently?", - "alerts.confirm-ban-multi": "Do you really want to ban these users permanently?", - "alerts.ban-success": "User(s) banned!", - "alerts.button-ban-x": "Ban %1 user(s)", - "alerts.unban-success": "User(s) unbanned!", - "alerts.lockout-reset-success": "Lockout(s) reset!", - "alerts.flag-reset-success": "Flags(s) reset!", - "alerts.no-remove-yourself-admin": "You can't remove yourself as Administrator!", - "alerts.make-admin-success": "User(s) are now administrators.", - "alerts.confirm-remove-admin": "Do you really want to remove admins?", - "alerts.remove-admin-success": "User(s) are no longer administrators.", - "alerts.confirm-validate-email": "Do you want to validate email(s) of these user(s)?", - "alerts.validate-email-success": "Emails validated", - "alerts.password-reset-confirm": "Do you want to send password reset email(s) to these user(s)?", - "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": "User(s) Deleted!", - "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": "Create User", - "alerts.button-create": "Create", - "alerts.button-cancel": "Cancel", - "alerts.error-passwords-different": "Passwords must match!", - "alerts.error-x": "Error

%1

", - "alerts.create-success": "User created!", + "alerts.confirm-ban": "Wollen Sie diesen Nutzer wirklich permanent bannen?", + "alerts.confirm-ban-multi": "Wollen Sie diese Nutzer wirklich permanent bannen?", + "alerts.ban-success": "Benutzer gebannt!", + "alerts.button-ban-x": "%1 Nutzer bannen", + "alerts.unban-success": "Benutzer entbannt!", + "alerts.lockout-reset-success": "Ausschlüsse zurückgesetzt", + "alerts.flag-reset-success": "Meldung(en) zurückgesetzt!", + "alerts.no-remove-yourself-admin": "Du kannst dich nicht selbst als Administrator degradieren!", + "alerts.make-admin-success": "Die Benutzer sind nun Administratoren.", + "alerts.confirm-remove-admin": "Möchtest du wirklich Admins entfernen?", + "alerts.remove-admin-success": "Diese(r) Nutzer sind/ist kein(e) Administrator(en) mehr ", + "alerts.confirm-validate-email": "Möchten Sie wirklich die Emails dieser benutzer/dieses benutzers bestätigen?", + "alerts.validate-email-success": "Emails bestätigt", + "alerts.password-reset-confirm": "Möchten Sie wirklich (eine) Passwort-Reset-Email(s) an diese(n) Benutzer schicken?", + "alerts.confirm-delete": "Warnung!
Wollen Sie wirklich diese(n) Benutzer löschen?
Diese Aktion kann nicht rückgängig gemacht werden! Nur der Account wird dabei gelöscht. Deren Themen und Beiträge bleiben dabei erhalten.", + "alerts.delete-success": "Benutzer gelöscht!", + "alerts.confirm-purge": "Warnung!
Sind Sie sicher, dass Sie diese Nutzer und deren Beiträge löschen wollen?
Diese Aktion kann nicht rückgängig gemacht werden! Alle Nutzerdaten und Beiträge werden dabei gelöscht!", + "alerts.create": "Nutzer Erstellen", + "alerts.button-create": "Erstellen", + "alerts.button-cancel": "Abbrechen", + "alerts.error-passwords-different": "Die Passwörter müssen übereinstimmen", + "alerts.error-x": "Fehler

%1

", + "alerts.create-success": "Nutzer erstellt", - "alerts.prompt-email": "Email: ", - "alerts.email-sent-to": "An invitation email has been sent to %1", - "alerts.x-users-found": "%1 user(s) found! Search took %2 ms." + "alerts.prompt-email": "Email:", + "alerts.email-sent-to": "Eine Einladungsemail wurde an %1 gesendet", + "alerts.x-users-found": "%1 Nutzer gefunden! Die Suche dauerte %2ms." } \ No newline at end of file diff --git a/public/language/de/admin/menu.json b/public/language/de/admin/menu.json index fa0afa7405..98af5b0481 100644 --- a/public/language/de/admin/menu.json +++ b/public/language/de/admin/menu.json @@ -9,11 +9,10 @@ "section-manage": "Verwalten", "manage/categories": "Kategorien", - "manage/tags": "Schlagworte", + "manage/tags": "Tags", "manage/users": "Benutzer", "manage/registration": "Warteliste", "manage/groups": "Gruppen", - "manage/flags": "Markierungen", "manage/ip-blacklist": "IP Blacklist", "section-settings": "Einstellungen", @@ -27,7 +26,7 @@ "settings/post": "Beiträge", "settings/chat": "Chat", "settings/pagination": "Seitennummerierung", - "settings/tags": "Schlagworte", + "settings/tags": "Tags", "settings/notifications": "Benachrichtigungen", "settings/cookies": "Cookies", "settings/web-crawler": "Web Crawler", @@ -39,7 +38,7 @@ "section-appearance": "Aussehen", "appearance/themes": "Themes", "appearance/skins": "Skins", - "appearance/customise": "Eigene HTML & CSS", + "appearance/customise": "Benutzerdefiniertes HTML & CSS", "section-extend": "Erweitert", "extend/plugins": "Plugins", diff --git a/public/language/de/admin/settings/advanced.json b/public/language/de/admin/settings/advanced.json index b023528d04..29a3d7c701 100644 --- a/public/language/de/admin/settings/advanced.json +++ b/public/language/de/admin/settings/advanced.json @@ -1,19 +1,19 @@ { - "maintenance-mode": "Maintenance Mode", - "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", + "maintenance-mode": "Wartungsmodus", + "maintenance-mode.help": "Während das Forum im Wartungsmodus ist werden alle Anfragen zu einer statischen Seite weitergeleitet. Administratoren sind von dieser Weiterleitung ausgenommen und können die Seite normal aufrufen.", + "maintenance-mode.message": "Wartungsnachricht", "headers": "Headers", - "headers.allow-from": "Set ALLOW-FROM to Place NodeBB in an iFrame", - "headers.powered-by": "Customise the \"Powered By\" header sent by NodeBB", + "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 or set to null", + "headers.acao-help": "Um den Zugriff auf alle Seiten zu blockieren, leer lassen oder auf null setzen", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", "traffic-management": "Traffic Management", - "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", - "traffic.enable": "Enable Traffic Management", - "traffic.event-lag": "Event Loop Lag Threshold (in milliseconds)", - "traffic.event-lag-help": "Lowering this value decreases wait times for page loads, but will also show the \"excessive load\" message to more users. (Restart required)", - "traffic.lag-check-interval": "Check Interval (in milliseconds)", - "traffic.lag-check-interval-help": "Lowering this value causes NodeBB to become more sensitive to spikes in load, but may also cause the check to become too sensitive. (Restart required)" + "traffic.help": "NodeBB wird mit einem module geliefert, welches automatisch anfragen in \"High-Traffic\" situationen blockiert. Sie können diese Einstellungen hier Fine-Tunen, auch wenn die Standardeinstellungen einen guten Anfang darstellen sollten", + "traffic.enable": "Traffic Management aktivieren", + "traffic.event-lag": "Eventschleifenverzögerungsschwelle (in Millisekunden)", + "traffic.event-lag-help": "Das Heruntersetzen dieses Werts reduziert die Ladezeiten, aber wird auch dafür sorgen, dass die \"Übermäßige Belastung\" nachricht öfter angezeigt wird. (Neustart erforderlich)", + "traffic.lag-check-interval": "Prüfungsintervall (in Millisekunden)", + "traffic.lag-check-interval-help": "Das Heruntersetzen dieses Werts sorgt dafür, dass NodeBB empfindlicher auf Auslastungs-Spikes reagiert, aber könnte auch dafür sorgen, dass der Test zu empfindlich werden könnte. (Neustart erforderlich)" } \ No newline at end of file diff --git a/public/language/de/admin/settings/chat.json b/public/language/de/admin/settings/chat.json index 0b22127341..b1e6539576 100644 --- a/public/language/de/admin/settings/chat.json +++ b/public/language/de/admin/settings/chat.json @@ -1,9 +1,9 @@ { - "chat-settings": "Chat Settings", - "disable": "Disable chat", - "disable-editing": "Disable chat message editing/deletion", - "disable-editing-help": "Administrators and global moderators are exempt from this restriction", - "max-length": "Maximum length of chat messages", - "max-room-size": "Maximum number of users in chat rooms", - "delay": "Time between chat messages in milliseconds" + "chat-settings": "Chateinstellungen", + "disable": "Chat deaktivieren", + "disable-editing": "Chatnachrichtenbearbeitung/löschung deaktivieren", + "disable-editing-help": "Administratoren und globale Moderatoren sind von dieser Einschränkung ausgenommen", + "max-length": "Maximale Chatnachrichtenlänge", + "max-room-size": "Maximale Anzahl an Nutzern pro Chat-Room", + "delay": "Zeit zwischen Chatnachrichten in Millisekunden" } \ No newline at end of file diff --git a/public/language/de/admin/settings/cookies.json b/public/language/de/admin/settings/cookies.json index f8b0f0538b..6d818fd893 100644 --- a/public/language/de/admin/settings/cookies.json +++ b/public/language/de/admin/settings/cookies.json @@ -1,11 +1,11 @@ { - "eu-consent": "EU Consent", - "consent.enabled": "Enabled", - "consent.message": "Notification message", - "consent.acceptance": "Acceptance message", - "consent.link-text": "Policy Link Text", - "consent.blank-localised-default": "Leave blank to use NodeBB localised defaults", - "settings": "Settings", - "cookie-domain": "Session cookie domain", - "blank-default": "Leave blank for default" + "eu-consent": "EU-Konsens", + "consent.enabled": "Aktiviert", + "consent.message": "Benachrichtigung", + "consent.acceptance": "Akzeptierungsnachricht", + "consent.link-text": "Police Link Text", + "consent.blank-localised-default": "Leer lassen um NodeBB lokalisierte Standards zu benutzen", + "settings": "Einstellungen", + "cookie-domain": "Session Cookie Domain", + "blank-default": "Leer lassen für Standardwert" } \ No newline at end of file diff --git a/public/language/de/admin/settings/email.json b/public/language/de/admin/settings/email.json index 1e92c88490..83b3683e91 100644 --- a/public/language/de/admin/settings/email.json +++ b/public/language/de/admin/settings/email.json @@ -1,25 +1,25 @@ { - "email-settings": "Email Settings", - "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", - "from-help": "The from name to display in the email.", + "email-settings": "Email-Einstellungen", + "address": "E-Mail Adresse", + "address-help": "Die folgende Email-Adresse ist die Emai-Adresse, welche dem Empfänger im \"Von\" und \"Antworten\" Bereich sehen wird.", + "from": "Name des Absenders", + "from-help": "Der Name des Absenders, welcher in der Email angezeigt werden soll.", "gmail-routing": "Gmail Routing", - "gmail-routing-help1": "There have been reports of Gmail Routing not working on accounts with heightened security. In those scenarios, you will have to configure your GMail account to allow less secure apps.", - "gmail-routing-help2": "For more information about this workaround, please consult this NodeMailer article on the issue. An alternative would be to utilise a third-party emailer plugin such as SendGrid, Mailgun, etc. Browse available plugins here.", - "gmail-transport": "Route emails through a Gmail/Google Apps account", - "gmail-transport.username": "Username", - "gmail-transport.username-help": "Enter the full email address here, especially if you are using a Google Apps managed domain.", - "gmail-transport.password": "Password", - "template": "Edit Email Template", - "template.select": "Select Email Template", - "template.revert": "Revert to Original", - "testing": "Email Testing", - "testing.select": "Select Email Template", - "testing.send": "Send Test Email", - "testing.send-help": "The test email will be sent to the currently logged in user's email address.", - "subscriptions": "Email Subscriptions", - "subscriptions.disable": "Disable subscriber notification emails", - "subscriptions.hour": "Digest Hour", - "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
The approximate server time is:
The next daily digest is scheduled to be sent " + "gmail-routing-help1": "Es gab Berichte bezüglich des \"Gmail Routing\", welches nicht auf Accounts mit erhöhten Sicherheitseinstellungen funktionierte (Standardeinstellung). In diesem Fall müssen sie ihren Gmail Account konfigurieren weniger sichere Apps zu erlauben.", + "gmail-routing-help2": "Für mehr informationen zu diesem Workaround, konsultieren Sie bitte diesen NodeMailer Artikel über dieses Problem. Eine alternative wäre ein Plugin von Drittherstellern wie SendGrid, mailgun etc. zu verwenden. Verfügbare Plugins durchsuchen.", + "gmail-transport": "Emails über einen Gmail/Google Apps account verschicken", + "gmail-transport.username": "Benutzername", + "gmail-transport.username-help": "Geben Sie die volle Email-Adresse hier ein, insbesondere wenn Sie eine Google-Apps verwaltete domain verwenden.", + "gmail-transport.password": "Passwort", + "template": "Email Vorlage bearbeiten", + "template.select": "Email Vorlage auswählen", + "template.revert": "Original wiederherstellen", + "testing": "Emailtests", + "testing.select": "Wählen Sie die Email Vorlage", + "testing.send": "Test-Email versenden", + "testing.send-help": "Die Test-Email wird an die Email des momentan eingeloggten Nutzers geschickt.", + "subscriptions": "Email Abonnements", + "subscriptions.disable": "Email-Benachrichtigungsmails deaktivieren", + "subscriptions.hour": "Sende Zeit", + "subscriptions.hour-help": "Bitte geben Sie eine Nummer ein, welche die Stunde repräsentiert zu welcher geplante Emails versandt werden sollen (z.B. 0 für Mitternacht, 17 für 5 Uhr Nachmittags). Beachten Sie, dass die Zeit auf der Serverzeit basiert und daher nicht umbedingt mit ihrer Systemzeit übereinstimmen muss.
Die ungefähre Serverzeit ist:
Die nächste tägliche Sendung ist um geplant" } \ No newline at end of file diff --git a/public/language/de/admin/settings/general.json b/public/language/de/admin/settings/general.json index c26740ee4f..e06ca77db0 100644 --- a/public/language/de/admin/settings/general.json +++ b/public/language/de/admin/settings/general.json @@ -1,30 +1,31 @@ { - "site-settings": "Site Settings", - "title": "Site Title", - "title.name": "Your Community Name", - "title.show-in-header": "Show Site Title in Header", - "browser-title": "Browser Title", - "browser-title-help": "If no browser title is specified, the site title will be used", - "title-layout": "Title Layout", - "title-layout-help": "Define how the browser title will be structured ie. {pageTitle} | {browserTitle}", - "description.placeholder": "A short description about your community", - "description": "Site Description", - "keywords": "Site Keywords", - "keywords-placeholder": "Keywords describing your community, comma-separated", - "logo": "Site Logo", - "logo.image": "Image", - "logo.image-placeholder": "Path to a logo to display on forum header", - "logo.upload": "Upload", + "site-settings": "Seiteneinstellungen", + "title": "Seiten Titel", + "title.name": "Ihr Community Name", + "title.show-in-header": "Seitentitel im Header anzeigen", + "browser-title": "Browser Titel", + "browser-title-help": "Wenn kein Browser-Titel spezifiziert wurde, wird der Seitentitel verwendet", + "title-layout": "Titel Layout", + "title-layout-help": "Definieren Sie, wie der Browser Titel Strukturiert wird d.h.z.B. {pageTitle} | {browserTitle}", + "description.placeholder": "Eine kurze Beschreibung ihrer Community", + "description": "Seitenbeschreibung", + "keywords": "Seiten-Schlüsselworte", + "keywords-placeholder": "Schlüsselworte, die ihre Community beschreiben, mit komma getrennt", + "logo": "Seiten-Logo", + "logo.image": "Bild", + "logo.image-placeholder": "Pfad zu einem Logo, welches im Kopfbereich des Forums angezeigt werden soll", + "logo.upload": "Hochladen", "logo.url": "URL", - "logo.url-placeholder": "The URL of the site logo", - "logo.url-help": "When the logo is clicked, send users to this address. If left blank, user will be sent to the forum index.", - "logo.alt-text": "Alt Text", - "log.alt-text-placeholder": "Alternative text for accessibility", + "logo.url-placeholder": "Die URL des Seiten-Logos", + "logo.url-help": "Wenn das Logo angeklickt wird, wird der Nutzer an diese Adresse weitergeleitet. Wenn das Feld leer gelassen wird, wird der Nutzer zur Startseite geleitet.", + "logo.alt-text": "Alternativer Text", + "log.alt-text-placeholder": "Alternativer text, falls das Bild nicht angezeigt werden kann", "favicon": "Favicon", - "favicon.upload": "Upload", + "favicon.upload": "Hochladen", "touch-icon": "Homescreen/Touch Icon", - "touch-icon.upload": "Upload", - "touch-icon.help": "Recommended size and format: 192x192, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.", - "outgoing-links": "Outgoing Links", - "outgoing-links.warning-page": "Use Outgoing Links Warning Page" + "touch-icon.upload": "Hochladen", + "touch-icon.help": "Empfohlene Größe und Format: 192x192, ausschließlich PNG Format. Wenn kein Icon angegeben wird, wird NodeBB das Favicon verwenden.", + "outgoing-links": "Ausgehende Links", + "outgoing-links.warning-page": "Warnseite für ausgehende links verwenden", + "search-default-sort-by": "Standardmäßige Such-Sortierung" } \ No newline at end of file diff --git a/public/language/de/admin/settings/group.json b/public/language/de/admin/settings/group.json index 1ae88c9cf5..bce69d2f53 100644 --- a/public/language/de/admin/settings/group.json +++ b/public/language/de/admin/settings/group.json @@ -1,12 +1,12 @@ { - "general": "General", - "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.", - "allow-creation": "Allow Group Creation", - "allow-creation-help": "If enabled, users can create groups (Default: disabled)", - "max-name-length": "Maximum Group Name Length", - "cover-image": "Group Cover Image", - "default-cover": "Default Cover Images", - "default-cover-help": "Add comma-separated default cover images for groups that don't have an uploaded cover image" + "general": "Allgemein", + "private-groups": "Private Gruppen", + "private-groups.help": "Wenn aktiviert, benötigt das beitreten einer Gruppe die Bestätigung des jeweiligen Besitzers(Standard: aktiviert)", + "private-groups.warning": "Vorsicht! Wenn diese Option deaktiviert ist, und Sie private Gruppen haben, werden diese automatisch Öffentlich.", + "allow-creation": "Erstellung von Gruppen erlauben", + "allow-creation-help": "Wenn aktiviert können Nutzer Gruppen erstellen (Standard: deaktiviert)", + "max-name-length": "Maximale Länge von Gruppennamen", + "cover-image": "Gruppen-Deckbild", + "default-cover": "Standard-Deckbild", + "default-cover-help": "Fügen Sie Komma-getrennte standard-Deckbilder für Gruppen hinzu, welche kein Deckbild hochgeladen haben" } \ No newline at end of file diff --git a/public/language/de/admin/settings/guest.json b/public/language/de/admin/settings/guest.json index 6b2ac2c8b2..b515580c87 100644 --- a/public/language/de/admin/settings/guest.json +++ b/public/language/de/admin/settings/guest.json @@ -1,8 +1,8 @@ { - "handles": "Guest Handles", - "handles.enabled": "Allow guest handles", - "handles.enabled-help": "This option exposes a new field that allows guests to pick a name to associate with each post they make. If disabled, they will simply be called \"Guest\"", - "privileges": "Guest Privileges", - "privileges.can-search": "Allow guests to search without logging in", - "privileges.can-search-users": "Allow guests to search users without logging in" + "handles": "Gastzugang", + "handles.enabled": "Gastzugänge erlauben", + "handles.enabled-help": "Diese option offenbart ein neues Feld, welches Gästen erlaubt einen Nutzernamen zu wählen, welcher Sie mit jedem Beitrag assoziiert den sie erstellen. Wenn diese option deaktiviert ist, werden sie einfach \"Gast\" genannt", + "privileges": "Gast-Berechtigungen", + "privileges.can-search": "Gästen erlauben das Forum zu durchsuchen ohne eingeloggt zu sein", + "privileges.can-search-users": "Gästen erlauben nach Benutzern zu suchen ohne eingeloggt zu sein" } \ No newline at end of file diff --git a/public/language/de/admin/settings/notifications.json b/public/language/de/admin/settings/notifications.json index 4eff7f341a..38a30ccbb1 100644 --- a/public/language/de/admin/settings/notifications.json +++ b/public/language/de/admin/settings/notifications.json @@ -1,5 +1,5 @@ { - "notifications": "Notifications", - "welcome-notification": "Welcome Notification", - "welcome-notification-link": "Welcome Notification Link" + "notifications": "Benachrichtigungen", + "welcome-notification": "Wilkommensnachricht", + "welcome-notification-link": "Wilkommensnachrichtslink" } \ No newline at end of file diff --git a/public/language/de/admin/settings/pagination.json b/public/language/de/admin/settings/pagination.json index 27d71b4de5..33bed37f3f 100644 --- a/public/language/de/admin/settings/pagination.json +++ b/public/language/de/admin/settings/pagination.json @@ -1,9 +1,9 @@ { - "pagination": "Pagination Settings", - "enable": "Paginate topics and posts instead of using infinite scroll.", - "topics": "Topic Pagination", - "posts-per-page": "Posts per Page", - "categories": "Category Pagination", - "topics-per-page": "Topics per Page", - "initial-num-load": "Initial Number of Topics to Load on Unread, Recent, and Popular" + "pagination": "Seitennummerierungseinstellungen", + "enable": "Themen in Seiten einteilen anstatt unendlich weit zu scrollen", + "topics": "Themen Seitennummerierung", + "posts-per-page": "Beiträge pro Seite", + "categories": "Kategorie Seitennummerierung", + "topics-per-page": "Themen pro Seite", + "initial-num-load": "Ursprüngliche anzahl an Themen, die bei Ungelesen, Aktuell und beliebt geladen werden sollen" } \ No newline at end of file diff --git a/public/language/de/admin/settings/post.json b/public/language/de/admin/settings/post.json index f293e554d9..3c4d0b97d6 100644 --- a/public/language/de/admin/settings/post.json +++ b/public/language/de/admin/settings/post.json @@ -1,44 +1,44 @@ { - "sorting": "Post Sorting", - "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.topic-default": "Default Topic Sorting", - "restrictions": "Posting Restrictions", - "restrictions.seconds-between": "Seconds between Posts", - "restrictions.seconds-between-new": "Seconds between Posts for New Users", - "restrictions.rep-threshold": "Reputation threshold before this restriction is lifted", - "restrictions.seconds-defore-new": "Seconds before new user can post", - "restrictions.seconds-edit-after": "Number of seconds users are allowed to edit posts after posting. (0 disabled)", - "restrictions.seconds-delete-after": "Number of seconds users are allowed to delete posts after posting. (0 disabled)", - "restrictions.replies-no-delete": "Number of replies after users are disallowed to delete their own topics. (0 disabled)", - "restrictions.min-title-length": "Minimum Title Length", - "restrictions.max-title-length": "Maximum Title Length", - "restrictions.min-post-length": "Minimum Post Length", - "restrictions.max-post-length": "Maximum Post Length", - "restrictions.days-until-stale": "Days until Topic is considered stale", - "restrictions.stale-help": "If a topic is considered \"stale\", then a warning will be shown to users who attempt to reply to that topic.", - "timestamp": "Timestamp", - "timestamp.cut-off": "Date cut-off (in days)", - "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": "Teaser Post", - "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": "First", - "unread": "Unread Settings", - "unread.cutoff": "Unread cutoff days", - "unread.min-track-last": "Minimum posts in topic before tracking last read", - "signature": "Signature Settings", - "signature.disable": "Disable signatures", - "signature.no-links": "Disable links in signatures", - "signature.no-images": "Disable images in signatures", - "signature.max-length": "Maximum Signature Length", - "composer": "Composer Settings", - "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": "Show \"Help\" tab", - "composer.enable-plugin-help": "Allow plugins to add content to the help tab", - "composer.custom-help": "Custom Help Text", - "ip-tracking": "IP Tracking", - "ip-tracking.each-post": "Track IP Address for each post" + "sorting": "Beitragssortierung", + "sorting.post-default": "Standardmäßige sortierung von Beiträgen", + "sorting.oldest-to-newest": "Von Alt bis Neu", + "sorting.newest-to-oldest": "Von Neu zu Alt", + "sorting.most-votes": "Meiste Bewertungen", + "sorting.topic-default": "Standardmäßige Themensortierung", + "restrictions": "Posting beschränkungen", + "restrictions.seconds-between": "Zeit zwischen der Erstellung von Beiträgen", + "restrictions.seconds-between-new": "Zeit zwischen der Erstellung von Beiträgen für neue Nutzer", + "restrictions.rep-threshold": "Vorrausgesetztes Ansehen um diese Beschränkung aufzuheben", + "restrictions.seconds-defore-new": "Sekunden befor ein neuer Nutzer einen Beitrag erstellen kann", + "restrictions.seconds-edit-after": "Zeit in Sekunden in der ein Nutzer nach erstellung eines Beitrags diesen bearbeiten kann. (0 = deaktiviert)", + "restrictions.seconds-delete-after": "Zeit in Sekunden in der ein Nutzer nach erstellung eines Beitrags diesen löschen kann. (0 = deaktiviert)", + "restrictions.replies-no-delete": "Anzahl der Antworten auf einen Thema, die Benötigt werden um das löschen des Themas durch den Besitzer zu verhindern. (0 = deaktiviert)", + "restrictions.min-title-length": "Minimale Titellänge", + "restrictions.max-title-length": "Maximale Titellänge", + "restrictions.min-post-length": "Minimale Beitragslänge", + "restrictions.max-post-length": "Maximale Beitragslänge", + "restrictions.days-until-stale": "Anzahl der Tage nachdem ein Thema als veraltet angesehen wird", + "restrictions.stale-help": "Wenn ein Thema als \"veraltet\" angesehen wird, wird Nutzern die versuchen diesem Thema zu antworten eine Warnung gezeigt", + "timestamp": "Zeitstempel", + "timestamp.cut-off": "Tageslimit für Relative Zeitangaben (in Tagen)", + "timestamp.cut-off-help": "Tage & Zeiten werden relativ angezeigt (z.B. \"vor 3 Stunden\" / \"vor 5 Tagen\"), und in viele Sprachen übersetzt. Nach einem bestimmten Zeitpunkt, kann dieses Text durch das übersetzte Datum selbst ersetzt werden (z.B. 5 Nov 2016 15:30).
(Standard: 30, oder ein Monat). Auf 0 setzen um immer Daten anzuzeigen, leer lassung um immer relative Zeiten anzuzeigen.", + "teaser": "Teaser-Beitrag", + "teaser.last-post": "Letzter - Den neuesten Beitrag anzeigen, den originalen Beitrag innbegriffen, wenn es keine Antworten gibt", + "teaser.last-reply": "Letzter - Den neuesten Beitrag oder einen \"Keine Antworten\" Platzhalter, wenn es keine Antworten gibt anzeigen", + "teaser.first": "Erster", + "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", + "signature": "Signatureinstellungen", + "signature.disable": "Signaturen deaktivieren", + "signature.no-links": "Links in signaturen deaktivieren", + "signature.no-images": "Bilder in Signaturen deaktivieren", + "signature.max-length": "Maximale Signaturlänge", + "composer": "Editor Einstellungen", + "composer-help": "Die folgenden Einstellungen bestimmen die funktionalität und/oder das Aussehen des Beitragseditors, der Nutzern angezeigt wird, webb sie neue Themen erstellen, oder bereits existierenden Antworten.", + "composer.show-help": "\"Hilfe\"-Tab anzeigen", + "composer.enable-plugin-help": "Plugins erlauben Inhalte dem \"Help\"-Tab hinzuzufügen", + "composer.custom-help": "Benutzerdefinierter Hilfe-Text", + "ip-tracking": "IP-Verfolgung", + "ip-tracking.each-post": "IP-Adresse für jeden Beitrag speichern" } \ No newline at end of file diff --git a/public/language/de/admin/settings/reputation.json b/public/language/de/admin/settings/reputation.json index 11d6184721..99ed3d4ce4 100644 --- a/public/language/de/admin/settings/reputation.json +++ b/public/language/de/admin/settings/reputation.json @@ -1,8 +1,8 @@ { - "reputation": "Reputation Settings", - "disable": "Disable Reputation System", - "disable-down-voting": "Disable Down Voting", - "thresholds": "Activity Thresholds", - "min-rep-downvote": "Minimum reputation to downvote posts", - "min-rep-flag": "Minimum reputation to flag posts" + "reputation": "Ansehenseinstellungen", + "disable": "Ansehenssystem deaktivieren", + "disable-down-voting": "Negative Bewertungen deaktivieren", + "thresholds": "Aktivitätsschwelle", + "min-rep-downvote": "Minimales Ansehen um Beiträge negativ zu bewerten", + "min-rep-flag": "Minimales Ansehen und Beiträge zu melden" } \ No newline at end of file diff --git a/public/language/de/admin/settings/sockets.json b/public/language/de/admin/settings/sockets.json index d04ee42fcf..2fa6475bef 100644 --- a/public/language/de/admin/settings/sockets.json +++ b/public/language/de/admin/settings/sockets.json @@ -1,6 +1,6 @@ { - "reconnection": "Reconnection Settings", - "max-attempts": "Max Reconnection Attempts", - "default-placeholder": "Default: %1", - "delay": "Reconnection Delay" + "reconnection": "Neuverbindungseinstellungen", + "max-attempts": "Maximale Anzahl von Neuverbindungsversuchen", + "default-placeholder": "Standard: %1", + "delay": "Neuverbindungsverzögerung" } \ No newline at end of file diff --git a/public/language/de/admin/settings/tags.json b/public/language/de/admin/settings/tags.json index 6f31f60ba0..ae52d414ae 100644 --- a/public/language/de/admin/settings/tags.json +++ b/public/language/de/admin/settings/tags.json @@ -1,12 +1,12 @@ { - "tag": "Tag Settings", - "min-per-topic": "Minimum Tags per Topic", - "max-per-topic": "Maximum Tags per Topic", - "min-length": "Minimum Tag Length", - "max-length": "Maximum Tag Length", - "goto-manage": "Click here to visit the tag management page.", - "privacy": "Privacy", - "list-private": "Make the tags list private", - "related-topics": "Related Topics", - "max-related-topics": "Maximum related topics to display (if supported by theme)" + "tag": "Tag-Einstellungen", + "min-per-topic": "Minimale Tags pro Thema", + "max-per-topic": "Maximale Tags pro Thema", + "min-length": "Minimale Tag Länge", + "max-length": "Maximale Tag Länge", + "goto-manage": "Klicken Sie hier um die Tag Managementseite aufzurufen.", + "privacy": "Privatsphäre", + "list-private": "Tag-Liste privatisieren", + "related-topics": "Zusammenhängende Themen", + "max-related-topics": "Maximale Anzahl an Zusammenhängenden Themen die angezeigt werden sollen (Wenn vom Design unterstützt)" } \ No newline at end of file diff --git a/public/language/de/admin/settings/uploads.json b/public/language/de/admin/settings/uploads.json index 8a56c85663..c6cc165d88 100644 --- a/public/language/de/admin/settings/uploads.json +++ b/public/language/de/admin/settings/uploads.json @@ -1,28 +1,28 @@ { - "posts": "Posts", - "allow-files": "Allow users to upload regular files", - "private": "Make uploaded files private", - "max-image-width": "Resize images down to specified width (in pixels)", - "max-image-width-help": "(in pixels, default: 760 pixels, set to 0 to disable)", - "max-file-size": "Maximum File Size (in KiB)", - "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-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc).\n\t\t\t\t\tAn empty list means all extensions are allowed.", - "profile-avatars": "Profile Avatars", - "allow-profile-image-uploads": "Allow users to upload profile images", - "convert-profile-image-png": "Convert profile image uploads to PNG", - "default-avatar": "Custom Default Avatar", - "upload": "Upload", - "profile-image-dimension": "Profile Image Dimension", - "profile-image-dimension-help": "(in pixels, default: 128 pixels)", - "max-profile-image-size": "Maximum Profile Image File Size", - "max-profile-image-size-help": "(in kilobytes, default: 256 KiB)", - "max-cover-image-size": "Maximum Cover Image File Size", - "max-cover-image-size-help": "(in kilobytes, default: 2,048 KiB)", - "keep-all-user-images": "Keep old versions of avatars and profile covers on the server", - "profile-covers": "Profile Covers", - "default-covers": "Default Cover Images", - "default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image" -} \ No newline at end of file + "posts": "Beiträge", + "allow-files": "Nutzern erlauben normale Dateien hochzuladen", + "private": "Hochgeladene Dateien privatisieren", + "max-image-width": "Bilder zu einer bestimmten Breite runterskalieren", + "max-image-width-help": "(in Pixeln, standard 760 pixel, auf 0 setzen um zu deaktivieren)", + "max-file-size": "Maximale Dateigröße (in KiB)", + "max-file-size-help": "(Standard: 2048 KiB)", + "allow-topic-thumbnails": "Nutzern erlauben Themen Thumbnails hochzuladen", + "topic-thumb-size": "Thema Thumbnailgröße", + "allowed-file-extensions": "Erlaubte Dateiendungen", + "allowed-file-extensions-help": "Komma-getrennte Liste der Dateiendungen hier einfügen (z.B. pdf,xls,doc). Eine leere Liste bedeutet, dass alle Dateiendungen erlaubt sind.", + "profile-avatars": "Profil Avatare", + "allow-profile-image-uploads": "Nutzern erlauben Profilbilder hochzuladen", + "convert-profile-image-png": "Hochgeladene Profilbilder in PNG konvertieren", + "default-avatar": "Benutzerdefinierter Standardavatar", + "upload": "Hochladen", + "profile-image-dimension": "Profilbild-Abmessungen", + "profile-image-dimension-help": "(in pixeln, standard: 128 pixel)", + "max-profile-image-size": "Maximale Profibild-Dateigröße", + "max-profile-image-size-help": "(in Kilobytes, standard: 256 KiB)", + "max-cover-image-size": "Maximale Deckbild-Dateigröße", + "max-cover-image-size-help": "(in Kilobytes, standard: 2.048 KiB)", + "keep-all-user-images": "Alte Avatar- und Deckbild-Versionen auf dem Server lassen", + "profile-covers": "Profil Deckbilder", + "default-covers": "Standard Profil-Deckbilder", + "default-covers-help": "Komma-getrennte standard Deckbilder für Accounts, die kein Deckbild hochgeladen haben" +} diff --git a/public/language/de/admin/settings/user.json b/public/language/de/admin/settings/user.json index 3c0124ff89..c0309d47fb 100644 --- a/public/language/de/admin/settings/user.json +++ b/public/language/de/admin/settings/user.json @@ -18,9 +18,9 @@ "disable-user-skins": "Verhindere das Benutzer eigene Skins verwenden", "account-protection": "Kontosicherheit", "login-attempts": "Login-Versuche pro Stunde", - "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", + "login-attempts-help": "Wenn die loginversuche zu einem Account diese Schwelle überschreiten, wird dieser Account für eine festgelegte Zeit gesperrt", "lockout-duration": "Account Aussperrzeitraum (Minuten)", - "login-days": "Days to remember user login sessions", + "login-days": "Anzahl der tage die login sessions bestehen bleiben sollen", "password-expiry-days": "Erzwinge ein Passwortreset nach x Tagen", "registration": "Benutzer Registrierung", "registration-type": "Registrierungart", diff --git a/public/language/de/notifications.json b/public/language/de/notifications.json index 18cc3b5e77..1b78cace74 100644 --- a/public/language/de/notifications.json +++ b/public/language/de/notifications.json @@ -19,6 +19,9 @@ "user_flagged_post_in": "%1 hat einen Beitrag in %2 gemeldet", "user_flagged_post_in_dual": "%1 und %2 haben einen Beitrag in %3 gemeldet", "user_flagged_post_in_multiple": "%1 und %2 andere Nutzer haben einen Beitrag in %3 gemeldet", + "user_flagged_user": "%1 meldete ein Nutzerprofil (%2)", + "user_flagged_user_dual": "%1 und %2 meldeten ein Nutzerprofil (%3)", + "user_flagged_user_multiple": "%1 und %2 weitere meldeten ein Nutzerprofil (%3)", "user_posted_to": "%1 hat auf %2 geantwortet.", "user_posted_to_dual": "%1 und %2 haben auf %3 geantwortet.", "user_posted_to_multiple": "%1 und %2 andere Nutzer haben auf %3 geantwortet.", diff --git a/public/language/de/pages.json b/public/language/de/pages.json index 5c47502a3c..ce67bbcc10 100644 --- a/public/language/de/pages.json +++ b/public/language/de/pages.json @@ -6,7 +6,7 @@ "popular-month": "Beliebte Themen dieses Monats", "popular-alltime": "Beliebteste Themen", "recent": "Neueste Themen", - "flagged-posts": "Gemeldete Beiträge", + "flagged-content": "Gemeldeter Inhalt", "ip-blacklist": "IP Blacklist", "users/online": "Benutzer online", "users/latest": "Neuste Benutzer", @@ -27,6 +27,8 @@ "group": "%1 Gruppe", "chats": "Chats", "chat": "Chatte mit %1", + "flags": "Meldungen", + "flag-details": "%1 Details melden", "account/edit": "Bearbeite %1", "account/edit/password": "Bearbeite Passwort von \"%1\"", "account/edit/username": "Bearbeite Benutzernamen von \"%1\"", diff --git a/public/language/de/search.json b/public/language/de/search.json index 40a25a6f83..e752a96c87 100644 --- a/public/language/de/search.json +++ b/public/language/de/search.json @@ -12,6 +12,7 @@ "reply-count": "Anzahl Antworten", "at-least": "Mindestens", "at-most": "Höchstens", + "relevance": "Relevanz", "post-time": "Verfaßt am", "newer-than": "Neuer als", "older-than": "Älter als", diff --git a/public/language/de/topic.json b/public/language/de/topic.json index 736ae69582..76861f0d00 100644 --- a/public/language/de/topic.json +++ b/public/language/de/topic.json @@ -13,7 +13,8 @@ "notify_me": "Erhalte eine Benachrichtigung bei neuen Antworten zu diesem Thema.", "quote": "Zitieren", "reply": "Antworten", - "replies_to_this_post": "Antworten: %1", + "replies_to_this_post": "%1 Antworten", + "last_reply_time": "Letzte Antwort", "reply-as-topic": "In einem neuen Thema antworten", "guest-login-reply": "Anmelden zum Antworten", "edit": "Bearbeiten", @@ -25,28 +26,11 @@ "link": "Link", "share": "Teilen", "tools": "Werkzeuge", - "flag": "Markieren", "locked": "Gesperrt", "pinned": "Angepinnt", "moved": "Verschoben", "bookmark_instructions": "Klicke hier, um zum letzten gelesenen Beitrag des Themas zurückzukehren.", "flag_title": "Diesen Beitrag zur Moderation markieren", - "flag_success": "Dieser Beitrag wurde erfolgreich für die Moderation markiert.", - "flag_manage_title": "Gemeldeter Beitrag in %1", - "flag_manage_history": "Aktions-Verlauf", - "flag_manage_no_history": "Kein Ereignisverlauf zum Bericht", - "flag_manage_assignee": "Zugeordnete Person", - "flag_manage_state": "Zustand", - "flag_manage_state_open": "Neu/Offen", - "flag_manage_state_wip": "In Arbeit", - "flag_manage_state_resolved": "Gelöst", - "flag_manage_state_rejected": "Abgelehnt", - "flag_manage_notes": "Geteilte Notizen", - "flag_manage_update": "Meldungsstatus aktualisieren", - "flag_manage_history_assignee": "%1 zugewiesen", - "flag_manage_history_state": "Status zu %1 aktualisiert", - "flag_manage_history_notes": "Meldungsnotizen aktualisiert", - "flag_manage_saved": "Meldungsdetails aktualisiert", "deleted_message": "Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.", "following_topic.message": "Du erhälst nun eine Benachrichtigung, wenn jemand einen Beitrag zu diesem Thema verfasst.", "not_following_topic.message": "Ungelesene Beiträge in diesem Thema werden angezeigt, aber du erhältst keine Benachrichtigung wenn jemand einen Beitrag zu diesem Thema verfasst.", @@ -131,8 +115,5 @@ "stale.warning": "Das Thema auf das du antworten möchtest ist ziemlich alt. Möchtest du stattdessen ein neues Thema erstellen und auf dieses in deiner Antwort hinweisen?", "stale.create": "Ein neues Thema erstellen", "stale.reply_anyway": "Auf dieses Thema trotzdem antworten", - "link_back": "Re: [%1](%2)", - "spam": "Spam", - "offensive": "Beleidigend", - "custom-flag-reason": "Gib einen Grund für die Markierung ein" + "link_back": "Re: [%1](%2)" } \ No newline at end of file diff --git a/public/language/de/user.json b/public/language/de/user.json index 2d3361df73..3ab19523a4 100644 --- a/public/language/de/user.json +++ b/public/language/de/user.json @@ -33,6 +33,7 @@ "chat": "Chat", "chat_with": "Führe deinen Chat mit %1 fort", "new_chat_with": "Beginne einen neuen Chat mit %1", + "flag-profile": "Profil Melden", "follow": "Folgen", "unfollow": "Nicht mehr folgen", "more": "Mehr", @@ -64,6 +65,8 @@ "remove_uploaded_picture": "Hochgeladenes Bild entfernen", "upload_cover_picture": "Titelbild hochladen", "remove_cover_picture_confirm": "Bist du sicher, dass du dein Titelbild entfernen möchtest?", + "crop_picture": "Bild zuschneiden", + "upload_cropped_picture": "Zuschneiden und Hochladen", "settings": "Einstellungen", "show_email": "Zeige meine E-Mail Adresse an.", "show_fullname": "Zeige meinen kompletten Namen an", diff --git a/public/language/el/admin/advanced/errors.json b/public/language/el/admin/advanced/errors.json index 963e68b116..546f0f1508 100644 --- a/public/language/el/admin/advanced/errors.json +++ b/public/language/el/admin/advanced/errors.json @@ -8,7 +8,7 @@ "clear-error-log": "Clear Error Log", "route": "Route", "count": "Count", - "no-routes-not-found": "Hooray! There are no routes that were not found.", + "no-routes-not-found": "Hooray! No 404 errors!", "clear404-confirm": "Are you sure you wish to clear the 404 error logs?", "clear404-success": "\"404 Not Found\" errors cleared" } \ No newline at end of file diff --git a/public/language/el/admin/general/dashboard.json b/public/language/el/admin/general/dashboard.json index b82802db1b..a70dda322e 100644 --- a/public/language/el/admin/general/dashboard.json +++ b/public/language/el/admin/general/dashboard.json @@ -2,6 +2,9 @@ "forum-traffic": "Forum Traffic", "page-views": "Page Views", "unique-visitors": "Unique Visitors", + "users": "Users", + "posts": "Posts", + "topics": "Topics", "page-views-last-month": "Page views Last Month", "page-views-this-month": "Page views This Month", "page-views-last-day": "Page views in last 24 hours", @@ -20,6 +23,11 @@ "prerelease-warning": "

This is a pre-release version of NodeBB. Unintended bugs may occur.

", "notices": "Notices", + "restart-not-required": "Restart not required", + "restart-required": "Restart required", + "search-plugin-installed": "Search Plugin installed", + "search-plugin-not-installed": "Search Plugin not installed", + "search-plugin-tooltip": "Install a search plugin from the plugin page in order to activate search functionality", "control-panel": "System Control", "reload": "Reload", @@ -52,4 +60,4 @@ "graphs.unique-visitors": "Unique Visitors", "graphs.registered-users": "Registered Users", "graphs.anonymous-users": "Anonymous Users" -} \ No newline at end of file +} diff --git a/public/language/el/admin/menu.json b/public/language/el/admin/menu.json index 6a4995ea6e..985c540e8a 100644 --- a/public/language/el/admin/menu.json +++ b/public/language/el/admin/menu.json @@ -13,7 +13,6 @@ "manage/users": "Users", "manage/registration": "Registration Queue", "manage/groups": "Groups", - "manage/flags": "Flags", "manage/ip-blacklist": "IP Blacklist", "section-settings": "Settings", diff --git a/public/language/el/admin/settings/general.json b/public/language/el/admin/settings/general.json index c26740ee4f..72ecfe641f 100644 --- a/public/language/el/admin/settings/general.json +++ b/public/language/el/admin/settings/general.json @@ -26,5 +26,6 @@ "touch-icon.upload": "Upload", "touch-icon.help": "Recommended size and format: 192x192, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.", "outgoing-links": "Outgoing Links", - "outgoing-links.warning-page": "Use Outgoing Links Warning Page" + "outgoing-links.warning-page": "Use Outgoing Links Warning Page", + "search-default-sort-by": "Search default sort by" } \ No newline at end of file diff --git a/public/language/el/admin/settings/uploads.json b/public/language/el/admin/settings/uploads.json index 8a56c85663..35eaa5a58f 100644 --- a/public/language/el/admin/settings/uploads.json +++ b/public/language/el/admin/settings/uploads.json @@ -9,7 +9,7 @@ "allow-topic-thumbnails": "Allow users to upload topic thumbnails", "topic-thumb-size": "Topic Thumb Size", "allowed-file-extensions": "Allowed File Extensions", - "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc).\n\t\t\t\t\tAn empty list means all extensions are allowed.", + "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc). An empty list means all extensions are allowed.", "profile-avatars": "Profile Avatars", "allow-profile-image-uploads": "Allow users to upload profile images", "convert-profile-image-png": "Convert profile image uploads to PNG", @@ -25,4 +25,4 @@ "profile-covers": "Profile Covers", "default-covers": "Default Cover Images", "default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image" -} \ No newline at end of file +} diff --git a/public/language/el/notifications.json b/public/language/el/notifications.json index 00903465f5..1a4328a085 100644 --- a/public/language/el/notifications.json +++ b/public/language/el/notifications.json @@ -19,6 +19,9 @@ "user_flagged_post_in": "Ο/Η %1 επεσήμανε μια δημοσίευσή σου στο %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 έγραψε μια απάντηση στο: %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", diff --git a/public/language/el/pages.json b/public/language/el/pages.json index 18a7dd1ef8..243f8511da 100644 --- a/public/language/el/pages.json +++ b/public/language/el/pages.json @@ -6,7 +6,7 @@ "popular-month": "Popular topics this month", "popular-alltime": "All time popular topics", "recent": "Πρόσφατα Θέματα", - "flagged-posts": "Flagged Posts", + "flagged-content": "Flagged Content", "ip-blacklist": "IP Blacklist", "users/online": "Online Users", "users/latest": "Latest Users", @@ -27,6 +27,8 @@ "group": "%1 group", "chats": "Chats", "chat": "Chatting with %1", + "flags": "Flags", + "flag-details": "Flag %1 Details", "account/edit": "Editing \"%1\"", "account/edit/password": "Editing password of \"%1\"", "account/edit/username": "Editing username of \"%1\"", diff --git a/public/language/el/search.json b/public/language/el/search.json index 67397669a1..61aa1e3128 100644 --- a/public/language/el/search.json +++ b/public/language/el/search.json @@ -12,6 +12,7 @@ "reply-count": "Reply Count", "at-least": "At least", "at-most": "At most", + "relevance": "Relevance", "post-time": "Post time", "newer-than": "Newer than", "older-than": "Older than", diff --git a/public/language/el/topic.json b/public/language/el/topic.json index d175de6bfa..0d382c2407 100644 --- a/public/language/el/topic.json +++ b/public/language/el/topic.json @@ -13,7 +13,8 @@ "notify_me": "Να ειδοποιούμαι για νέες απαντήσεις σε αυτό το θέμα", "quote": "Παράθεση", "reply": "Απάντηση", - "replies_to_this_post": "Replies: %1", + "replies_to_this_post": "%1 Replies", + "last_reply_time": "Last reply", "reply-as-topic": "Reply as topic", "guest-login-reply": "Log in to reply", "edit": "Επεξεργασία", @@ -25,28 +26,11 @@ "link": "Σύνδεσμος", "share": "Μοιράσου το", "tools": "Εργαλεία", - "flag": "Σημαία", "locked": "Κλειδωμένο", "pinned": "Pinned", "moved": "Moved", "bookmark_instructions": "Click here to return to the last read post in this thread.", "flag_title": "Επισήμανση αυτής της δημοσίευσης για συντονισμό", - "flag_success": "Αυτή η δημοσίευση έχει επισημανθεί για συντονισμό.", - "flag_manage_title": "Flagged post in %1", - "flag_manage_history": "Action History", - "flag_manage_no_history": "No event history to report", - "flag_manage_assignee": "Assignee", - "flag_manage_state": "State", - "flag_manage_state_open": "New/Open", - "flag_manage_state_wip": "Work in Progress", - "flag_manage_state_resolved": "Resolved", - "flag_manage_state_rejected": "Rejected", - "flag_manage_notes": "Shared Notes", - "flag_manage_update": "Update Flag Status", - "flag_manage_history_assignee": "Assigned to %1", - "flag_manage_history_state": "Updated state to %1", - "flag_manage_history_notes": "Updated flag notes", - "flag_manage_saved": "Flag Details Updated", "deleted_message": "Το θέμα αυτό έχει διαγραφεί. Μόνο οι χρήστες με δικαιώματα διαχειριστή θεμάτων μπορούν να το δουν.", "following_topic.message": "Θα λαμβάνεις ειδοποιήσεις όποτε κάποιος δημοσιεύει κάτι σε αυτό το θέμα.", "not_following_topic.message": "You will see this topic in the unread topics list, but you will not receive notifications when somebody posts to this topic.", @@ -131,8 +115,5 @@ "stale.warning": "The topic you are replying to is quite old. Would you like to create a new topic instead, and reference this one in your reply?", "stale.create": "Create a new topic", "stale.reply_anyway": "Reply to this topic anyway", - "link_back": "Re: [%1](%2)", - "spam": "Spam", - "offensive": "Offensive", - "custom-flag-reason": "Enter a flagging reason" + "link_back": "Re: [%1](%2)" } \ No newline at end of file diff --git a/public/language/el/user.json b/public/language/el/user.json index 3fd3a376a4..622b41ab30 100644 --- a/public/language/el/user.json +++ b/public/language/el/user.json @@ -33,6 +33,7 @@ "chat": "Συνομιλία", "chat_with": "Continue chat with %1", "new_chat_with": "Start new chat with %1", + "flag-profile": "Flag Profile", "follow": "Ακολούθησε", "unfollow": "Μην Ακολουθείς", "more": "More", @@ -64,6 +65,8 @@ "remove_uploaded_picture": "Remove Uploaded Picture", "upload_cover_picture": "Upload cover picture", "remove_cover_picture_confirm": "Are you sure you want to remove the cover picture?", + "crop_picture": "Crop picture", + "upload_cropped_picture": "Crop and upload", "settings": "Επιλογές", "show_email": "Εμφάνιση του email μου", "show_fullname": "Show My Full Name", diff --git a/public/language/en-GB/admin/advanced/errors.json b/public/language/en-GB/admin/advanced/errors.json index 963e68b116..546f0f1508 100644 --- a/public/language/en-GB/admin/advanced/errors.json +++ b/public/language/en-GB/admin/advanced/errors.json @@ -8,7 +8,7 @@ "clear-error-log": "Clear Error Log", "route": "Route", "count": "Count", - "no-routes-not-found": "Hooray! There are no routes that were not found.", + "no-routes-not-found": "Hooray! No 404 errors!", "clear404-confirm": "Are you sure you wish to clear the 404 error logs?", "clear404-success": "\"404 Not Found\" errors cleared" } \ No newline at end of file diff --git a/public/language/en-GB/admin/general/dashboard.json b/public/language/en-GB/admin/general/dashboard.json index a70dda322e..02046bd17a 100644 --- a/public/language/en-GB/admin/general/dashboard.json +++ b/public/language/en-GB/admin/general/dashboard.json @@ -21,6 +21,7 @@ "upgrade-available": "

A new version (v%1) has been released. Consider upgrading your NodeBB.

", "prerelease-upgrade-available": "

This is an outdated pre-release version of NodeBB. A new version (v%1) has been released. Consider upgrading your NodeBB.

", "prerelease-warning": "

This is a pre-release version of NodeBB. Unintended bugs may occur.

", + "running-in-development": "Forum is running in development mode. The forum may be open to potential vulnerabilities; please contact your system administrator.", "notices": "Notices", "restart-not-required": "Restart not required", diff --git a/public/language/en-GB/user.json b/public/language/en-GB/user.json index 6215486cb3..4013d5898c 100644 --- a/public/language/en-GB/user.json +++ b/public/language/en-GB/user.json @@ -68,6 +68,8 @@ "remove_uploaded_picture" : "Remove Uploaded Picture", "upload_cover_picture": "Upload cover picture", "remove_cover_picture_confirm": "Are you sure you want to remove the cover picture?", + "crop_picture": "Crop picture", + "upload_cropped_picture": "Crop and upload", "settings": "Settings", "show_email": "Show My Email", diff --git a/public/language/en-US/admin/advanced/errors.json b/public/language/en-US/admin/advanced/errors.json index 963e68b116..546f0f1508 100644 --- a/public/language/en-US/admin/advanced/errors.json +++ b/public/language/en-US/admin/advanced/errors.json @@ -8,7 +8,7 @@ "clear-error-log": "Clear Error Log", "route": "Route", "count": "Count", - "no-routes-not-found": "Hooray! There are no routes that were not found.", + "no-routes-not-found": "Hooray! No 404 errors!", "clear404-confirm": "Are you sure you wish to clear the 404 error logs?", "clear404-success": "\"404 Not Found\" errors cleared" } \ No newline at end of file diff --git a/public/language/en-US/admin/general/dashboard.json b/public/language/en-US/admin/general/dashboard.json index b82802db1b..a70dda322e 100644 --- a/public/language/en-US/admin/general/dashboard.json +++ b/public/language/en-US/admin/general/dashboard.json @@ -2,6 +2,9 @@ "forum-traffic": "Forum Traffic", "page-views": "Page Views", "unique-visitors": "Unique Visitors", + "users": "Users", + "posts": "Posts", + "topics": "Topics", "page-views-last-month": "Page views Last Month", "page-views-this-month": "Page views This Month", "page-views-last-day": "Page views in last 24 hours", @@ -20,6 +23,11 @@ "prerelease-warning": "

This is a pre-release version of NodeBB. Unintended bugs may occur.

", "notices": "Notices", + "restart-not-required": "Restart not required", + "restart-required": "Restart required", + "search-plugin-installed": "Search Plugin installed", + "search-plugin-not-installed": "Search Plugin not installed", + "search-plugin-tooltip": "Install a search plugin from the plugin page in order to activate search functionality", "control-panel": "System Control", "reload": "Reload", @@ -52,4 +60,4 @@ "graphs.unique-visitors": "Unique Visitors", "graphs.registered-users": "Registered Users", "graphs.anonymous-users": "Anonymous Users" -} \ No newline at end of file +} diff --git a/public/language/en-US/admin/menu.json b/public/language/en-US/admin/menu.json index 6a4995ea6e..985c540e8a 100644 --- a/public/language/en-US/admin/menu.json +++ b/public/language/en-US/admin/menu.json @@ -13,7 +13,6 @@ "manage/users": "Users", "manage/registration": "Registration Queue", "manage/groups": "Groups", - "manage/flags": "Flags", "manage/ip-blacklist": "IP Blacklist", "section-settings": "Settings", diff --git a/public/language/en-US/admin/settings/general.json b/public/language/en-US/admin/settings/general.json index c26740ee4f..72ecfe641f 100644 --- a/public/language/en-US/admin/settings/general.json +++ b/public/language/en-US/admin/settings/general.json @@ -26,5 +26,6 @@ "touch-icon.upload": "Upload", "touch-icon.help": "Recommended size and format: 192x192, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.", "outgoing-links": "Outgoing Links", - "outgoing-links.warning-page": "Use Outgoing Links Warning Page" + "outgoing-links.warning-page": "Use Outgoing Links Warning Page", + "search-default-sort-by": "Search default sort by" } \ No newline at end of file diff --git a/public/language/en-US/admin/settings/uploads.json b/public/language/en-US/admin/settings/uploads.json index f7f9d2daa6..35eaa5a58f 100644 --- a/public/language/en-US/admin/settings/uploads.json +++ b/public/language/en-US/admin/settings/uploads.json @@ -9,7 +9,7 @@ "allow-topic-thumbnails": "Allow users to upload topic thumbnails", "topic-thumb-size": "Topic Thumb Size", "allowed-file-extensions": "Allowed File Extensions", - "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc).\n\\t\\t\\t\\t\\tAn empty list means all extensions are allowed.", + "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc). An empty list means all extensions are allowed.", "profile-avatars": "Profile Avatars", "allow-profile-image-uploads": "Allow users to upload profile images", "convert-profile-image-png": "Convert profile image uploads to PNG", @@ -25,4 +25,4 @@ "profile-covers": "Profile Covers", "default-covers": "Default Cover Images", "default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image" -} \ No newline at end of file +} diff --git a/public/language/en-US/notifications.json b/public/language/en-US/notifications.json index 580e697548..e2ab96c850 100644 --- a/public/language/en-US/notifications.json +++ b/public/language/en-US/notifications.json @@ -19,6 +19,9 @@ "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", diff --git a/public/language/en-US/pages.json b/public/language/en-US/pages.json index af720e865c..dcbb38b5b9 100644 --- a/public/language/en-US/pages.json +++ b/public/language/en-US/pages.json @@ -6,7 +6,7 @@ "popular-month": "Popular topics this month", "popular-alltime": "All time popular topics", "recent": "Recent Topics", - "flagged-posts": "Flagged Posts", + "flagged-content": "Flagged Content", "ip-blacklist": "IP Blacklist", "users/online": "Online Users", "users/latest": "Latest Users", @@ -27,6 +27,8 @@ "group": "%1 group", "chats": "Chats", "chat": "Chatting with %1", + "flags": "Flags", + "flag-details": "Flag %1 Details", "account/edit": "Editing \"%1\"", "account/edit/password": "Editing password of \"%1\"", "account/edit/username": "Editing username of \"%1\"", diff --git a/public/language/en-US/search.json b/public/language/en-US/search.json index 3ba6d73916..1f4d555f92 100644 --- a/public/language/en-US/search.json +++ b/public/language/en-US/search.json @@ -12,6 +12,7 @@ "reply-count": "Reply Count", "at-least": "At least", "at-most": "At most", + "relevance": "Relevance", "post-time": "Post time", "newer-than": "Newer than", "older-than": "Older than", diff --git a/public/language/en-US/topic.json b/public/language/en-US/topic.json index c4a9109252..519cc5cd74 100644 --- a/public/language/en-US/topic.json +++ b/public/language/en-US/topic.json @@ -13,7 +13,8 @@ "notify_me": "Be notified of new replies in this topic", "quote": "Quote", "reply": "Reply", - "replies_to_this_post": "Replies: %1", + "replies_to_this_post": "%1 Replies", + "last_reply_time": "Last reply", "reply-as-topic": "Reply as topic", "guest-login-reply": "Log in to reply", "edit": "Edit", @@ -25,28 +26,11 @@ "link": "Link", "share": "Share", "tools": "Tools", - "flag": "Flag", "locked": "Locked", "pinned": "Pinned", "moved": "Moved", "bookmark_instructions": "Click here to return to the last read post in this thread.", "flag_title": "Flag this post for moderation", - "flag_success": "This post has been flagged for moderation.", - "flag_manage_title": "Flagged post in %1", - "flag_manage_history": "Action History", - "flag_manage_no_history": "No event history to report", - "flag_manage_assignee": "Assignee", - "flag_manage_state": "State", - "flag_manage_state_open": "New/Open", - "flag_manage_state_wip": "Work in Progress", - "flag_manage_state_resolved": "Resolved", - "flag_manage_state_rejected": "Rejected", - "flag_manage_notes": "Shared Notes", - "flag_manage_update": "Update Flag Status", - "flag_manage_history_assignee": "Assigned to %1", - "flag_manage_history_state": "Updated state to %1", - "flag_manage_history_notes": "Updated flag notes", - "flag_manage_saved": "Flag Details Updated", "deleted_message": "This topic has been deleted. Only users with topic management privileges can see it.", "following_topic.message": "You will now be receiving notifications when somebody posts to this topic.", "not_following_topic.message": "You will see this topic in the unread topics list, but you will not receive notifications when somebody posts to this topic.", @@ -131,8 +115,5 @@ "stale.warning": "The topic you are replying to is quite old. Would you like to create a new topic instead, and reference this one in your reply?", "stale.create": "Create a new topic", "stale.reply_anyway": "Reply to this topic anyway", - "link_back": "Re: [%1](%2)", - "spam": "Spam", - "offensive": "Offensive", - "custom-flag-reason": "Enter a flagging reason" + "link_back": "Re: [%1](%2)" } \ No newline at end of file diff --git a/public/language/en-US/user.json b/public/language/en-US/user.json index 4718cd00a0..61f103e7d5 100644 --- a/public/language/en-US/user.json +++ b/public/language/en-US/user.json @@ -33,6 +33,7 @@ "chat": "Chat", "chat_with": "Continue chat with %1", "new_chat_with": "Start new chat with %1", + "flag-profile": "Flag Profile", "follow": "Follow", "unfollow": "Unfollow", "more": "More", @@ -64,6 +65,8 @@ "remove_uploaded_picture": "Remove Uploaded Picture", "upload_cover_picture": "Upload cover picture", "remove_cover_picture_confirm": "Are you sure you want to remove the cover picture?", + "crop_picture": "Crop picture", + "upload_cropped_picture": "Crop and upload", "settings": "Settings", "show_email": "Show My Email", "show_fullname": "Show My Full Name", diff --git a/public/language/en-x-pirate/admin/advanced/errors.json b/public/language/en-x-pirate/admin/advanced/errors.json index 963e68b116..546f0f1508 100644 --- a/public/language/en-x-pirate/admin/advanced/errors.json +++ b/public/language/en-x-pirate/admin/advanced/errors.json @@ -8,7 +8,7 @@ "clear-error-log": "Clear Error Log", "route": "Route", "count": "Count", - "no-routes-not-found": "Hooray! There are no routes that were not found.", + "no-routes-not-found": "Hooray! No 404 errors!", "clear404-confirm": "Are you sure you wish to clear the 404 error logs?", "clear404-success": "\"404 Not Found\" errors cleared" } \ No newline at end of file diff --git a/public/language/en-x-pirate/admin/general/dashboard.json b/public/language/en-x-pirate/admin/general/dashboard.json index b82802db1b..a70dda322e 100644 --- a/public/language/en-x-pirate/admin/general/dashboard.json +++ b/public/language/en-x-pirate/admin/general/dashboard.json @@ -2,6 +2,9 @@ "forum-traffic": "Forum Traffic", "page-views": "Page Views", "unique-visitors": "Unique Visitors", + "users": "Users", + "posts": "Posts", + "topics": "Topics", "page-views-last-month": "Page views Last Month", "page-views-this-month": "Page views This Month", "page-views-last-day": "Page views in last 24 hours", @@ -20,6 +23,11 @@ "prerelease-warning": "

This is a pre-release version of NodeBB. Unintended bugs may occur.

", "notices": "Notices", + "restart-not-required": "Restart not required", + "restart-required": "Restart required", + "search-plugin-installed": "Search Plugin installed", + "search-plugin-not-installed": "Search Plugin not installed", + "search-plugin-tooltip": "Install a search plugin from the plugin page in order to activate search functionality", "control-panel": "System Control", "reload": "Reload", @@ -52,4 +60,4 @@ "graphs.unique-visitors": "Unique Visitors", "graphs.registered-users": "Registered Users", "graphs.anonymous-users": "Anonymous Users" -} \ No newline at end of file +} diff --git a/public/language/en-x-pirate/admin/menu.json b/public/language/en-x-pirate/admin/menu.json index 6a4995ea6e..985c540e8a 100644 --- a/public/language/en-x-pirate/admin/menu.json +++ b/public/language/en-x-pirate/admin/menu.json @@ -13,7 +13,6 @@ "manage/users": "Users", "manage/registration": "Registration Queue", "manage/groups": "Groups", - "manage/flags": "Flags", "manage/ip-blacklist": "IP Blacklist", "section-settings": "Settings", diff --git a/public/language/en-x-pirate/admin/settings/general.json b/public/language/en-x-pirate/admin/settings/general.json index c26740ee4f..72ecfe641f 100644 --- a/public/language/en-x-pirate/admin/settings/general.json +++ b/public/language/en-x-pirate/admin/settings/general.json @@ -26,5 +26,6 @@ "touch-icon.upload": "Upload", "touch-icon.help": "Recommended size and format: 192x192, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.", "outgoing-links": "Outgoing Links", - "outgoing-links.warning-page": "Use Outgoing Links Warning Page" + "outgoing-links.warning-page": "Use Outgoing Links Warning Page", + "search-default-sort-by": "Search default sort by" } \ No newline at end of file diff --git a/public/language/en-x-pirate/admin/settings/uploads.json b/public/language/en-x-pirate/admin/settings/uploads.json index 8a56c85663..35eaa5a58f 100644 --- a/public/language/en-x-pirate/admin/settings/uploads.json +++ b/public/language/en-x-pirate/admin/settings/uploads.json @@ -9,7 +9,7 @@ "allow-topic-thumbnails": "Allow users to upload topic thumbnails", "topic-thumb-size": "Topic Thumb Size", "allowed-file-extensions": "Allowed File Extensions", - "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc).\n\t\t\t\t\tAn empty list means all extensions are allowed.", + "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc). An empty list means all extensions are allowed.", "profile-avatars": "Profile Avatars", "allow-profile-image-uploads": "Allow users to upload profile images", "convert-profile-image-png": "Convert profile image uploads to PNG", @@ -25,4 +25,4 @@ "profile-covers": "Profile Covers", "default-covers": "Default Cover Images", "default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image" -} \ No newline at end of file +} diff --git a/public/language/en-x-pirate/notifications.json b/public/language/en-x-pirate/notifications.json index c6dedd3eb0..8f54b7b7df 100644 --- a/public/language/en-x-pirate/notifications.json +++ b/public/language/en-x-pirate/notifications.json @@ -19,6 +19,9 @@ "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", diff --git a/public/language/en-x-pirate/pages.json b/public/language/en-x-pirate/pages.json index af720e865c..dcbb38b5b9 100644 --- a/public/language/en-x-pirate/pages.json +++ b/public/language/en-x-pirate/pages.json @@ -6,7 +6,7 @@ "popular-month": "Popular topics this month", "popular-alltime": "All time popular topics", "recent": "Recent Topics", - "flagged-posts": "Flagged Posts", + "flagged-content": "Flagged Content", "ip-blacklist": "IP Blacklist", "users/online": "Online Users", "users/latest": "Latest Users", @@ -27,6 +27,8 @@ "group": "%1 group", "chats": "Chats", "chat": "Chatting with %1", + "flags": "Flags", + "flag-details": "Flag %1 Details", "account/edit": "Editing \"%1\"", "account/edit/password": "Editing password of \"%1\"", "account/edit/username": "Editing username of \"%1\"", diff --git a/public/language/en-x-pirate/search.json b/public/language/en-x-pirate/search.json index 3ba6d73916..1f4d555f92 100644 --- a/public/language/en-x-pirate/search.json +++ b/public/language/en-x-pirate/search.json @@ -12,6 +12,7 @@ "reply-count": "Reply Count", "at-least": "At least", "at-most": "At most", + "relevance": "Relevance", "post-time": "Post time", "newer-than": "Newer than", "older-than": "Older than", diff --git a/public/language/en-x-pirate/topic.json b/public/language/en-x-pirate/topic.json index c4a9109252..519cc5cd74 100644 --- a/public/language/en-x-pirate/topic.json +++ b/public/language/en-x-pirate/topic.json @@ -13,7 +13,8 @@ "notify_me": "Be notified of new replies in this topic", "quote": "Quote", "reply": "Reply", - "replies_to_this_post": "Replies: %1", + "replies_to_this_post": "%1 Replies", + "last_reply_time": "Last reply", "reply-as-topic": "Reply as topic", "guest-login-reply": "Log in to reply", "edit": "Edit", @@ -25,28 +26,11 @@ "link": "Link", "share": "Share", "tools": "Tools", - "flag": "Flag", "locked": "Locked", "pinned": "Pinned", "moved": "Moved", "bookmark_instructions": "Click here to return to the last read post in this thread.", "flag_title": "Flag this post for moderation", - "flag_success": "This post has been flagged for moderation.", - "flag_manage_title": "Flagged post in %1", - "flag_manage_history": "Action History", - "flag_manage_no_history": "No event history to report", - "flag_manage_assignee": "Assignee", - "flag_manage_state": "State", - "flag_manage_state_open": "New/Open", - "flag_manage_state_wip": "Work in Progress", - "flag_manage_state_resolved": "Resolved", - "flag_manage_state_rejected": "Rejected", - "flag_manage_notes": "Shared Notes", - "flag_manage_update": "Update Flag Status", - "flag_manage_history_assignee": "Assigned to %1", - "flag_manage_history_state": "Updated state to %1", - "flag_manage_history_notes": "Updated flag notes", - "flag_manage_saved": "Flag Details Updated", "deleted_message": "This topic has been deleted. Only users with topic management privileges can see it.", "following_topic.message": "You will now be receiving notifications when somebody posts to this topic.", "not_following_topic.message": "You will see this topic in the unread topics list, but you will not receive notifications when somebody posts to this topic.", @@ -131,8 +115,5 @@ "stale.warning": "The topic you are replying to is quite old. Would you like to create a new topic instead, and reference this one in your reply?", "stale.create": "Create a new topic", "stale.reply_anyway": "Reply to this topic anyway", - "link_back": "Re: [%1](%2)", - "spam": "Spam", - "offensive": "Offensive", - "custom-flag-reason": "Enter a flagging reason" + "link_back": "Re: [%1](%2)" } \ No newline at end of file diff --git a/public/language/en-x-pirate/user.json b/public/language/en-x-pirate/user.json index fcf518c200..350326450d 100644 --- a/public/language/en-x-pirate/user.json +++ b/public/language/en-x-pirate/user.json @@ -33,6 +33,7 @@ "chat": "Chat", "chat_with": "Continue chat with %1", "new_chat_with": "Start new chat with %1", + "flag-profile": "Flag Profile", "follow": "Follow", "unfollow": "Unfollow", "more": "More", @@ -64,6 +65,8 @@ "remove_uploaded_picture": "Remove Uploaded Picture", "upload_cover_picture": "Upload cover picture", "remove_cover_picture_confirm": "Are you sure you want to remove the cover picture?", + "crop_picture": "Crop picture", + "upload_cropped_picture": "Crop and upload", "settings": "Settings", "show_email": "Show My Email", "show_fullname": "Show My Full Name", diff --git a/public/language/es/admin/advanced/errors.json b/public/language/es/admin/advanced/errors.json index 8c6e0a5bab..e053348013 100644 --- a/public/language/es/admin/advanced/errors.json +++ b/public/language/es/admin/advanced/errors.json @@ -8,7 +8,7 @@ "clear-error-log": "Cerrar Log de Error", "route": "Ruta", "count": "Contar", - "no-routes-not-found": "Hurra! No hay rutas rutas que no fueran encontradas.", + "no-routes-not-found": "¡Hurra! ¡No hay errores 404!", "clear404-confirm": "¿Estas seguro que desea borrar los registros de errores 404?", "clear404-success": "\"404 no encontrado\" Errores borrados" } \ 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 1661a987b7..4bb8cff1c1 100644 --- a/public/language/es/admin/extend/plugins.json +++ b/public/language/es/admin/extend/plugins.json @@ -1,5 +1,5 @@ { - "installed": "Installed", + "installed": "Instalado", "active": "Active", "inactive": "Inactive", "out-of-date": "Out of Date", diff --git a/public/language/es/admin/extend/rewards.json b/public/language/es/admin/extend/rewards.json index 5383a90b33..27560eee28 100644 --- a/public/language/es/admin/extend/rewards.json +++ b/public/language/es/admin/extend/rewards.json @@ -1,5 +1,5 @@ { - "rewards": "Rewards", + "rewards": "Recompensas", "condition-if-users": "If User's", "condition-is": "Is:", "condition-then": "Then:", diff --git a/public/language/es/admin/general/dashboard.json b/public/language/es/admin/general/dashboard.json index b82802db1b..a70dda322e 100644 --- a/public/language/es/admin/general/dashboard.json +++ b/public/language/es/admin/general/dashboard.json @@ -2,6 +2,9 @@ "forum-traffic": "Forum Traffic", "page-views": "Page Views", "unique-visitors": "Unique Visitors", + "users": "Users", + "posts": "Posts", + "topics": "Topics", "page-views-last-month": "Page views Last Month", "page-views-this-month": "Page views This Month", "page-views-last-day": "Page views in last 24 hours", @@ -20,6 +23,11 @@ "prerelease-warning": "

This is a pre-release version of NodeBB. Unintended bugs may occur.

", "notices": "Notices", + "restart-not-required": "Restart not required", + "restart-required": "Restart required", + "search-plugin-installed": "Search Plugin installed", + "search-plugin-not-installed": "Search Plugin not installed", + "search-plugin-tooltip": "Install a search plugin from the plugin page in order to activate search functionality", "control-panel": "System Control", "reload": "Reload", @@ -52,4 +60,4 @@ "graphs.unique-visitors": "Unique Visitors", "graphs.registered-users": "Registered Users", "graphs.anonymous-users": "Anonymous Users" -} \ No newline at end of file +} diff --git a/public/language/es/admin/general/navigation.json b/public/language/es/admin/general/navigation.json index c4ba0d09ac..e2a66f7af2 100644 --- a/public/language/es/admin/general/navigation.json +++ b/public/language/es/admin/general/navigation.json @@ -1,5 +1,5 @@ { - "icon": "Icon:", + "icon": "Icono:", "change-icon": "change", "route": "Route:", "tooltip": "Tooltip:", diff --git a/public/language/es/admin/general/sounds.json b/public/language/es/admin/general/sounds.json index 95ccbde0f1..29c441db26 100644 --- a/public/language/es/admin/general/sounds.json +++ b/public/language/es/admin/general/sounds.json @@ -1,5 +1,5 @@ { - "notifications": "Notifications", + "notifications": "Notificaciones", "chat-messages": "Chat Messages", "play-sound": "Play", "incoming-message": "Incoming Message", diff --git a/public/language/es/admin/manage/registration.json b/public/language/es/admin/manage/registration.json index f51b4d56e6..defa4f1b30 100644 --- a/public/language/es/admin/manage/registration.json +++ b/public/language/es/admin/manage/registration.json @@ -1,5 +1,5 @@ { - "queue": "Queue", + "queue": "Cola", "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/es/admin/manage/users.json b/public/language/es/admin/manage/users.json index f1651a814b..da98ea0b09 100644 --- a/public/language/es/admin/manage/users.json +++ b/public/language/es/admin/manage/users.json @@ -1,5 +1,5 @@ { - "users": "Users", + "users": "Usuarios", "edit": "Edit", "make-admin": "Make Admin", "remove-admin": "Remove Admin", @@ -76,14 +76,14 @@ "alerts.validate-email-success": "Emails validated", "alerts.password-reset-confirm": "Do you want to send password reset email(s) to these user(s)?", "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": "User(s) Deleted!", + "alerts.delete-success": "¡Usuario(s) Borrado(s)!", "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": "Create User", - "alerts.button-create": "Create", - "alerts.button-cancel": "Cancel", + "alerts.create": "Crear Usuario", + "alerts.button-create": "Crear", + "alerts.button-cancel": "Cancelar", "alerts.error-passwords-different": "Passwords must match!", "alerts.error-x": "Error

%1

", - "alerts.create-success": "User created!", + "alerts.create-success": "¡Usuario creado!", "alerts.prompt-email": "Email: ", "alerts.email-sent-to": "An invitation email has been sent to %1", diff --git a/public/language/es/admin/menu.json b/public/language/es/admin/menu.json index 41bbd5ee3b..7cb50e1dc5 100644 --- a/public/language/es/admin/menu.json +++ b/public/language/es/admin/menu.json @@ -13,7 +13,6 @@ "manage/users": "Usuarios", "manage/registration": "Cola de Registro", "manage/groups": "Grupos", - "manage/flags": "Reportes", "manage/ip-blacklist": "Lista negra de IP", "section-settings": "Opciones", diff --git a/public/language/es/admin/settings/advanced.json b/public/language/es/admin/settings/advanced.json index b023528d04..31a15df457 100644 --- a/public/language/es/admin/settings/advanced.json +++ b/public/language/es/admin/settings/advanced.json @@ -1,5 +1,5 @@ { - "maintenance-mode": "Maintenance Mode", + "maintenance-mode": "Modo de Mantenimiento", "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/es/admin/settings/general.json b/public/language/es/admin/settings/general.json index c26740ee4f..72ecfe641f 100644 --- a/public/language/es/admin/settings/general.json +++ b/public/language/es/admin/settings/general.json @@ -26,5 +26,6 @@ "touch-icon.upload": "Upload", "touch-icon.help": "Recommended size and format: 192x192, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.", "outgoing-links": "Outgoing Links", - "outgoing-links.warning-page": "Use Outgoing Links Warning Page" + "outgoing-links.warning-page": "Use Outgoing Links Warning Page", + "search-default-sort-by": "Search default sort by" } \ No newline at end of file diff --git a/public/language/es/admin/settings/notifications.json b/public/language/es/admin/settings/notifications.json index 4eff7f341a..7cfd68f3d6 100644 --- a/public/language/es/admin/settings/notifications.json +++ b/public/language/es/admin/settings/notifications.json @@ -1,5 +1,5 @@ { - "notifications": "Notifications", + "notifications": "Notificaciones", "welcome-notification": "Welcome Notification", "welcome-notification-link": "Welcome Notification Link" } \ No newline at end of file diff --git a/public/language/es/admin/settings/uploads.json b/public/language/es/admin/settings/uploads.json index 8a56c85663..c48d591d9f 100644 --- a/public/language/es/admin/settings/uploads.json +++ b/public/language/es/admin/settings/uploads.json @@ -1,5 +1,5 @@ { - "posts": "Posts", + "posts": "Mensajes", "allow-files": "Allow users to upload regular files", "private": "Make uploaded files private", "max-image-width": "Resize images down to specified width (in pixels)", @@ -9,7 +9,7 @@ "allow-topic-thumbnails": "Allow users to upload topic thumbnails", "topic-thumb-size": "Topic Thumb Size", "allowed-file-extensions": "Allowed File Extensions", - "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc).\n\t\t\t\t\tAn empty list means all extensions are allowed.", + "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc). An empty list means all extensions are allowed.", "profile-avatars": "Profile Avatars", "allow-profile-image-uploads": "Allow users to upload profile images", "convert-profile-image-png": "Convert profile image uploads to PNG", @@ -25,4 +25,4 @@ "profile-covers": "Profile Covers", "default-covers": "Default Cover Images", "default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image" -} \ 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 bdabb075e9..8e231827ca 100644 --- a/public/language/es/admin/settings/user.json +++ b/public/language/es/admin/settings/user.json @@ -1,5 +1,5 @@ { - "authentication": "Authentication", + "authentication": "Autentificación", "allow-local-login": "Allow local login", "require-email-confirmation": "Require Email Confirmation", "email-confirm-interval": "User may not resend a confirmation email until", diff --git a/public/language/es/global.json b/public/language/es/global.json index 31a0064c3d..37608b7c42 100644 --- a/public/language/es/global.json +++ b/public/language/es/global.json @@ -103,5 +103,5 @@ "cookies.message": "Esta web usa cookies para asegurar que usted recibe la mejor experiencia de navegación.", "cookies.accept": "De Acuerdo!", "cookies.learn_more": "Quiero saber más", - "edited": "Edited" + "edited": "Editado" } \ No newline at end of file diff --git a/public/language/es/notifications.json b/public/language/es/notifications.json index b0391106db..6c634a81d6 100644 --- a/public/language/es/notifications.json +++ b/public/language/es/notifications.json @@ -19,6 +19,9 @@ "user_flagged_post_in": "%1 ha reportado una respuesta en %2", "user_flagged_post_in_dual": "%1 y %2 han reportado un post en %3", "user_flagged_post_in_multiple": "%1 y otras %2 personas han reportado un post en %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 ha respondido a: %2", "user_posted_to_dual": "%1 y %2 han respondido a %3", "user_posted_to_multiple": "%1 y otras %2 personas han respondido a: %3", diff --git a/public/language/es/pages.json b/public/language/es/pages.json index 0f56b570df..59b1e2624d 100644 --- a/public/language/es/pages.json +++ b/public/language/es/pages.json @@ -6,7 +6,7 @@ "popular-month": "Temas populares del mes", "popular-alltime": "Temas populares de siempre", "recent": "Temas recientes", - "flagged-posts": "Posts reportados", + "flagged-content": "Flagged Content", "ip-blacklist": "Lista negra de IPS", "users/online": "Conectados", "users/latest": "Últimos usuarios", @@ -27,6 +27,8 @@ "group": "Grupo de %1", "chats": "Chats", "chat": "Chatear con %1", + "flags": "Flags", + "flag-details": "Flag %1 Details", "account/edit": "Editar \"%1\"", "account/edit/password": "Editar contraseña de \"%1\"", "account/edit/username": "Editar nombre de usuario de \"%1\"", diff --git a/public/language/es/search.json b/public/language/es/search.json index 999f48a73a..bcdf74fc68 100644 --- a/public/language/es/search.json +++ b/public/language/es/search.json @@ -12,6 +12,7 @@ "reply-count": "Número de Respuestas", "at-least": "De mínimo", "at-most": "De máximo", + "relevance": "Relevance", "post-time": "Fecha de publicación", "newer-than": "Más reciente que", "older-than": "Más antiguo que", diff --git a/public/language/es/topic.json b/public/language/es/topic.json index 0e21d90b24..a6cc026d23 100644 --- a/public/language/es/topic.json +++ b/public/language/es/topic.json @@ -13,7 +13,8 @@ "notify_me": "Serás notificado cuando haya nuevas respuestas en este tema", "quote": "Citar", "reply": "Responder", - "replies_to_this_post": "Respuestas: %1", + "replies_to_this_post": "%1 Replies", + "last_reply_time": "Last reply", "reply-as-topic": "Responder como tema", "guest-login-reply": "Accede para responder", "edit": "Editar", @@ -25,28 +26,11 @@ "link": "Link", "share": "Compartir", "tools": "Herramientas", - "flag": "Reportar", "locked": "Cerrado", "pinned": "Fijo", "moved": "Movido", "bookmark_instructions": "Haz click aquí para volver a tu último mensaje leído en este tema", "flag_title": "Reportar este mensaje", - "flag_success": "Este mensaje ha sido reportado para moderación.", - "flag_manage_title": "Mensaje reportado en %1", - "flag_manage_history": "Historial de acciones", - "flag_manage_no_history": "Sin histórico de eventos", - "flag_manage_assignee": "Asignado", - "flag_manage_state": "Estado", - "flag_manage_state_open": "Nuevo/Abrir", - "flag_manage_state_wip": "En revisión", - "flag_manage_state_resolved": "Resuelto", - "flag_manage_state_rejected": "Rechazado", - "flag_manage_notes": "Notas compartidas", - "flag_manage_update": "Actualizar estado de reporte", - "flag_manage_history_assignee": "Asignado a %1", - "flag_manage_history_state": "Actualizado estado a %1", - "flag_manage_history_notes": "Actualizar notas de reporte", - "flag_manage_saved": "Detalles de reporte actualizados", "deleted_message": "Este tema ha sido borrado. Solo los usuarios que tengan privilegios de administración de temas pueden verlo.", "following_topic.message": "Ahora recibiras notificaciones cuando alguien publique en este tema.", "not_following_topic.message": "Podras ver este tema en la lista de no leidos, pero no recibirás notificaciones cuando alguien escriba en él.", @@ -131,8 +115,5 @@ "stale.warning": "El hilo al que estás respondiendo es muy antiguo. ¿Quieres crear un nuevo hilo en su lugar y añadir una referencia a este en tu mensaje?", "stale.create": "Crear un nuevo hilo", "stale.reply_anyway": "Publicar este hilo de todos modos.", - "link_back": "Re: [%1](%2)", - "spam": "SPAM", - "offensive": "Ofensivo", - "custom-flag-reason": "Introduzca una razón indicatoria." + "link_back": "Re: [%1](%2)" } \ No newline at end of file diff --git a/public/language/es/user.json b/public/language/es/user.json index 2fabed751a..3e16137749 100644 --- a/public/language/es/user.json +++ b/public/language/es/user.json @@ -33,6 +33,7 @@ "chat": "Chat", "chat_with": "Continuar chat con %1", "new_chat_with": "Empezar chat con %1", + "flag-profile": "Flag Profile", "follow": "Seguir", "unfollow": "Dejar de seguir", "more": "Más", @@ -64,6 +65,8 @@ "remove_uploaded_picture": "Borrar Imagen subida", "upload_cover_picture": "Subir imagen de portada", "remove_cover_picture_confirm": "Are you sure you want to remove the cover picture?", + "crop_picture": "Crop picture", + "upload_cropped_picture": "Crop and upload", "settings": "Opciones", "show_email": "Mostrar mi correo electrónico", "show_fullname": "Mostrar mi nombre completo", diff --git a/public/language/et/admin/advanced/errors.json b/public/language/et/admin/advanced/errors.json index 963e68b116..546f0f1508 100644 --- a/public/language/et/admin/advanced/errors.json +++ b/public/language/et/admin/advanced/errors.json @@ -8,7 +8,7 @@ "clear-error-log": "Clear Error Log", "route": "Route", "count": "Count", - "no-routes-not-found": "Hooray! There are no routes that were not found.", + "no-routes-not-found": "Hooray! No 404 errors!", "clear404-confirm": "Are you sure you wish to clear the 404 error logs?", "clear404-success": "\"404 Not Found\" errors cleared" } \ No newline at end of file diff --git a/public/language/et/admin/general/dashboard.json b/public/language/et/admin/general/dashboard.json index b82802db1b..a70dda322e 100644 --- a/public/language/et/admin/general/dashboard.json +++ b/public/language/et/admin/general/dashboard.json @@ -2,6 +2,9 @@ "forum-traffic": "Forum Traffic", "page-views": "Page Views", "unique-visitors": "Unique Visitors", + "users": "Users", + "posts": "Posts", + "topics": "Topics", "page-views-last-month": "Page views Last Month", "page-views-this-month": "Page views This Month", "page-views-last-day": "Page views in last 24 hours", @@ -20,6 +23,11 @@ "prerelease-warning": "

This is a pre-release version of NodeBB. Unintended bugs may occur.

", "notices": "Notices", + "restart-not-required": "Restart not required", + "restart-required": "Restart required", + "search-plugin-installed": "Search Plugin installed", + "search-plugin-not-installed": "Search Plugin not installed", + "search-plugin-tooltip": "Install a search plugin from the plugin page in order to activate search functionality", "control-panel": "System Control", "reload": "Reload", @@ -52,4 +60,4 @@ "graphs.unique-visitors": "Unique Visitors", "graphs.registered-users": "Registered Users", "graphs.anonymous-users": "Anonymous Users" -} \ No newline at end of file +} diff --git a/public/language/et/admin/menu.json b/public/language/et/admin/menu.json index 6a4995ea6e..985c540e8a 100644 --- a/public/language/et/admin/menu.json +++ b/public/language/et/admin/menu.json @@ -13,7 +13,6 @@ "manage/users": "Users", "manage/registration": "Registration Queue", "manage/groups": "Groups", - "manage/flags": "Flags", "manage/ip-blacklist": "IP Blacklist", "section-settings": "Settings", diff --git a/public/language/et/admin/settings/general.json b/public/language/et/admin/settings/general.json index c26740ee4f..72ecfe641f 100644 --- a/public/language/et/admin/settings/general.json +++ b/public/language/et/admin/settings/general.json @@ -26,5 +26,6 @@ "touch-icon.upload": "Upload", "touch-icon.help": "Recommended size and format: 192x192, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.", "outgoing-links": "Outgoing Links", - "outgoing-links.warning-page": "Use Outgoing Links Warning Page" + "outgoing-links.warning-page": "Use Outgoing Links Warning Page", + "search-default-sort-by": "Search default sort by" } \ No newline at end of file diff --git a/public/language/et/admin/settings/uploads.json b/public/language/et/admin/settings/uploads.json index 8a56c85663..35eaa5a58f 100644 --- a/public/language/et/admin/settings/uploads.json +++ b/public/language/et/admin/settings/uploads.json @@ -9,7 +9,7 @@ "allow-topic-thumbnails": "Allow users to upload topic thumbnails", "topic-thumb-size": "Topic Thumb Size", "allowed-file-extensions": "Allowed File Extensions", - "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc).\n\t\t\t\t\tAn empty list means all extensions are allowed.", + "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc). An empty list means all extensions are allowed.", "profile-avatars": "Profile Avatars", "allow-profile-image-uploads": "Allow users to upload profile images", "convert-profile-image-png": "Convert profile image uploads to PNG", @@ -25,4 +25,4 @@ "profile-covers": "Profile Covers", "default-covers": "Default Cover Images", "default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image" -} \ No newline at end of file +} diff --git a/public/language/et/notifications.json b/public/language/et/notifications.json index c804914ee1..ba85a69ba5 100644 --- a/public/language/et/notifications.json +++ b/public/language/et/notifications.json @@ -19,6 +19,9 @@ "user_flagged_post_in": "%1 raporteeris postitust %2", "user_flagged_post_in_dual": "%1 ja %2 märgistasid postituse: %3", "user_flagged_post_in_multiple": "%1 ja %2 teist märgistasid postituse: %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": "Kasutaja %1 postitas vastuse teemasse %2", "user_posted_to_dual": "%1 ja %2 on postitanud vastused: %3", "user_posted_to_multiple": "%1 ja %2 teist on postitanud vastused: %3", diff --git a/public/language/et/pages.json b/public/language/et/pages.json index 938fc79e13..e3ca3603dc 100644 --- a/public/language/et/pages.json +++ b/public/language/et/pages.json @@ -6,7 +6,7 @@ "popular-month": "Populaarsed teemad sel kuul", "popular-alltime": "Populaarseimad teemad üldse", "recent": "Hiljutised teemad", - "flagged-posts": "Märgistatud postitused", + "flagged-content": "Flagged Content", "ip-blacklist": "IP Blacklist", "users/online": "Sisseloginud kasutajad", "users/latest": "Hiljutised kasutajad", @@ -27,6 +27,8 @@ "group": "Kasutaja %1 grupp", "chats": "Vestlused", "chat": "Vestlus kasutajaga %1", + "flags": "Flags", + "flag-details": "Flag %1 Details", "account/edit": "Muudan \"%1\"", "account/edit/password": "Redigeerid \"%1\" parooli", "account/edit/username": "Redigeerid \"%1\" kasutajanime", diff --git a/public/language/et/search.json b/public/language/et/search.json index 387dd9b816..68b9661789 100644 --- a/public/language/et/search.json +++ b/public/language/et/search.json @@ -12,6 +12,7 @@ "reply-count": "Vastuste arv", "at-least": "Rohkemalt", "at-most": "Vähemalt", + "relevance": "Relevance", "post-time": "Postitamise aeg", "newer-than": "Uuem kui", "older-than": "Vanem kui", diff --git a/public/language/et/topic.json b/public/language/et/topic.json index 91c9e354c0..63d556f10d 100644 --- a/public/language/et/topic.json +++ b/public/language/et/topic.json @@ -13,7 +13,8 @@ "notify_me": "Saa teateid uutest postitustest selles teemas", "quote": "Tsiteeri", "reply": "Vasta", - "replies_to_this_post": "Replies: %1", + "replies_to_this_post": "%1 Replies", + "last_reply_time": "Last reply", "reply-as-topic": "Vasta teemana", "guest-login-reply": "Logi sisse, et vastata", "edit": "Muuda", @@ -25,28 +26,11 @@ "link": "Ühenda", "share": "Jaga", "tools": "Tööriistad", - "flag": "Märgista", "locked": "Lukustatud", "pinned": "Märgistatud", "moved": "Liigutatud", "bookmark_instructions": "Vajuta siia, et tagasi minna viimati loetud postituse juurde siin teemas.", "flag_title": "Märgista see postitus modereerimiseks", - "flag_success": "See postitus on nüüd märgistatud modereerimiseks.", - "flag_manage_title": "Flagged post in %1", - "flag_manage_history": "Action History", - "flag_manage_no_history": "No event history to report", - "flag_manage_assignee": "Assignee", - "flag_manage_state": "State", - "flag_manage_state_open": "New/Open", - "flag_manage_state_wip": "Work in Progress", - "flag_manage_state_resolved": "Resolved", - "flag_manage_state_rejected": "Rejected", - "flag_manage_notes": "Shared Notes", - "flag_manage_update": "Update Flag Status", - "flag_manage_history_assignee": "Assigned to %1", - "flag_manage_history_state": "Updated state to %1", - "flag_manage_history_notes": "Updated flag notes", - "flag_manage_saved": "Flag Details Updated", "deleted_message": "See teema on kustutatud. Ainult kasutajad kellel on piisavalt õigusi saavad seda näha.", "following_topic.message": "Sulle ei edastata enam teateid uutest postitustest kui keegi postitab siia teemasse.", "not_following_topic.message": "Sa näed seda postitust lugemata postituste nimekirjas, kuid sa ei näe selle kohta teateid, kui keegi sinna postitab.", @@ -131,8 +115,5 @@ "stale.warning": "Teema, millele vastad on küllaltki vana. Kas sooviksid hoopiski uue teema luua ning viidata sellele sinu vastuses?", "stale.create": "Loo uus teema/alapealkiri", "stale.reply_anyway": "Vasta sellele teemale siiski", - "link_back": "Re: [%1](%2)", - "spam": "Rämpspost", - "offensive": "Solvav", - "custom-flag-reason": "Sisesta teavitamise põhjus" + "link_back": "Re: [%1](%2)" } \ No newline at end of file diff --git a/public/language/et/user.json b/public/language/et/user.json index 5da27588e1..ba2738c38e 100644 --- a/public/language/et/user.json +++ b/public/language/et/user.json @@ -33,6 +33,7 @@ "chat": "Vestlus", "chat_with": "Continue chat with %1", "new_chat_with": "Start new chat with %1", + "flag-profile": "Flag Profile", "follow": "Jälgi", "unfollow": "Ära jälgi enam", "more": "Rohkem", @@ -64,6 +65,8 @@ "remove_uploaded_picture": "Eemalda üleslaetud pilt", "upload_cover_picture": "Lae üles katte pilt", "remove_cover_picture_confirm": "Are you sure you want to remove the cover picture?", + "crop_picture": "Crop picture", + "upload_cropped_picture": "Crop and upload", "settings": "Seaded", "show_email": "Näita minu emaili", "show_fullname": "Näita minu täisnime", diff --git a/public/language/fa-IR/admin/advanced/errors.json b/public/language/fa-IR/admin/advanced/errors.json index 963e68b116..546f0f1508 100644 --- a/public/language/fa-IR/admin/advanced/errors.json +++ b/public/language/fa-IR/admin/advanced/errors.json @@ -8,7 +8,7 @@ "clear-error-log": "Clear Error Log", "route": "Route", "count": "Count", - "no-routes-not-found": "Hooray! There are no routes that were not found.", + "no-routes-not-found": "Hooray! No 404 errors!", "clear404-confirm": "Are you sure you wish to clear the 404 error logs?", "clear404-success": "\"404 Not Found\" errors cleared" } \ No newline at end of file diff --git a/public/language/fa-IR/admin/general/dashboard.json b/public/language/fa-IR/admin/general/dashboard.json index b82802db1b..a70dda322e 100644 --- a/public/language/fa-IR/admin/general/dashboard.json +++ b/public/language/fa-IR/admin/general/dashboard.json @@ -2,6 +2,9 @@ "forum-traffic": "Forum Traffic", "page-views": "Page Views", "unique-visitors": "Unique Visitors", + "users": "Users", + "posts": "Posts", + "topics": "Topics", "page-views-last-month": "Page views Last Month", "page-views-this-month": "Page views This Month", "page-views-last-day": "Page views in last 24 hours", @@ -20,6 +23,11 @@ "prerelease-warning": "

This is a pre-release version of NodeBB. Unintended bugs may occur.

", "notices": "Notices", + "restart-not-required": "Restart not required", + "restart-required": "Restart required", + "search-plugin-installed": "Search Plugin installed", + "search-plugin-not-installed": "Search Plugin not installed", + "search-plugin-tooltip": "Install a search plugin from the plugin page in order to activate search functionality", "control-panel": "System Control", "reload": "Reload", @@ -52,4 +60,4 @@ "graphs.unique-visitors": "Unique Visitors", "graphs.registered-users": "Registered Users", "graphs.anonymous-users": "Anonymous Users" -} \ No newline at end of file +} diff --git a/public/language/fa-IR/admin/menu.json b/public/language/fa-IR/admin/menu.json index 6a4995ea6e..985c540e8a 100644 --- a/public/language/fa-IR/admin/menu.json +++ b/public/language/fa-IR/admin/menu.json @@ -13,7 +13,6 @@ "manage/users": "Users", "manage/registration": "Registration Queue", "manage/groups": "Groups", - "manage/flags": "Flags", "manage/ip-blacklist": "IP Blacklist", "section-settings": "Settings", diff --git a/public/language/fa-IR/admin/settings/general.json b/public/language/fa-IR/admin/settings/general.json index c26740ee4f..72ecfe641f 100644 --- a/public/language/fa-IR/admin/settings/general.json +++ b/public/language/fa-IR/admin/settings/general.json @@ -26,5 +26,6 @@ "touch-icon.upload": "Upload", "touch-icon.help": "Recommended size and format: 192x192, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.", "outgoing-links": "Outgoing Links", - "outgoing-links.warning-page": "Use Outgoing Links Warning Page" + "outgoing-links.warning-page": "Use Outgoing Links Warning Page", + "search-default-sort-by": "Search default sort by" } \ No newline at end of file diff --git a/public/language/fa-IR/admin/settings/uploads.json b/public/language/fa-IR/admin/settings/uploads.json index ff98119762..fdf0ff5c1c 100644 --- a/public/language/fa-IR/admin/settings/uploads.json +++ b/public/language/fa-IR/admin/settings/uploads.json @@ -9,7 +9,7 @@ "allow-topic-thumbnails": "Allow users to upload topic thumbnails", "topic-thumb-size": "Topic Thumb Size", "allowed-file-extensions": "Allowed File Extensions", - "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc).\n\t\t\t\t\tAn empty list means all extensions are allowed.", + "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc). An empty list means all extensions are allowed.", "profile-avatars": "Profile Avatars", "allow-profile-image-uploads": "Allow users to upload profile images", "convert-profile-image-png": "Convert profile image uploads to PNG", @@ -25,4 +25,4 @@ "profile-covers": "Profile Covers", "default-covers": "Default Cover Images", "default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image" -} \ No newline at end of file +} diff --git a/public/language/fa-IR/notifications.json b/public/language/fa-IR/notifications.json index 6d49770f07..c60fde1b95 100644 --- a/public/language/fa-IR/notifications.json +++ b/public/language/fa-IR/notifications.json @@ -19,6 +19,9 @@ "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 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": "پاسخ دادن به %2 از سوی %1", "user_posted_to_dual": "%1 و %2 پاسخ به پست دادند در: %3", "user_posted_to_multiple": "%1 و %2 نفر دیگر به پست شما پاسخ ارسال کرده‌اند در: %3", diff --git a/public/language/fa-IR/pages.json b/public/language/fa-IR/pages.json index 2b0c51f60c..9b55e53351 100644 --- a/public/language/fa-IR/pages.json +++ b/public/language/fa-IR/pages.json @@ -6,7 +6,7 @@ "popular-month": "موضوعات پربازدید این ماه", "popular-alltime": "پربازدیدترین موضوعات", "recent": "موضوع‌های تازه", - "flagged-posts": "پست نشانه گذاری شده", + "flagged-content": "Flagged Content", "ip-blacklist": "لیست سیاه آی‌پی", "users/online": "کاربران آنلاین", "users/latest": "آخرین کاربران", @@ -27,6 +27,8 @@ "group": "%1 گروه", "chats": "چتها", "chat": "چت با %1", + "flags": "Flags", + "flag-details": "Flag %1 Details", "account/edit": "ویرایش \"%1\"", "account/edit/password": "ویرایش کلمه ی عبورِ \"%1\"", "account/edit/username": "ویرایش نام کاربریِ \"%1\"", diff --git a/public/language/fa-IR/search.json b/public/language/fa-IR/search.json index 69a504e6e7..d948cd996c 100644 --- a/public/language/fa-IR/search.json +++ b/public/language/fa-IR/search.json @@ -12,6 +12,7 @@ "reply-count": "تعداد پاسخ", "at-least": "حداقل", "at-most": "حداکثر", + "relevance": "Relevance", "post-time": "زمان ارسال", "newer-than": "جدیدتر از", "older-than": "قدیمی تر از", diff --git a/public/language/fa-IR/topic.json b/public/language/fa-IR/topic.json index 0e0ca2714a..48adb9b76c 100644 --- a/public/language/fa-IR/topic.json +++ b/public/language/fa-IR/topic.json @@ -13,7 +13,8 @@ "notify_me": "از پاسخ‌های تازه در موضوع آگاه شوید", "quote": "نقل قول", "reply": "پاسخ", - "replies_to_this_post": "پاسخ‌ها: %1", + "replies_to_this_post": "%1 Replies", + "last_reply_time": "Last reply", "reply-as-topic": "پاسخ به موضوع", "guest-login-reply": "وارد شوید تا پست بفرستید", "edit": "ویرایش", @@ -25,28 +26,11 @@ "link": "پیوند", "share": "اشتراک‌گذاری", "tools": "ابزارها", - "flag": "پرچم", "locked": "قفل شده است", "pinned": "سنجاق شده", "moved": "منتقل شده", "bookmark_instructions": "برای بازگشت به آخرین پست در این موضوع اینجا را کلیک کنید.", "flag_title": "پرچم‌گذاری این موضوع برای بررسی ناظران", - "flag_success": "این موضوع برای بررسی ناظران پرچم گذاشته شد.", - "flag_manage_title": "پست نشانه‌گذاری شده در %1", - "flag_manage_history": "تاریخچه عملیات", - "flag_manage_no_history": "هیچ تاریخ رویدادی برای گزارش نیست", - "flag_manage_assignee": "نماینده", - "flag_manage_state": "حالت", - "flag_manage_state_open": "جدید/باز‌‌کردن", - "flag_manage_state_wip": "کار در حال انجام", - "flag_manage_state_resolved": "دوباره حل‌ شده", - "flag_manage_state_rejected": "رد شده", - "flag_manage_notes": "یادداشت‌ها به اشتراک گذاشته شده", - "flag_manage_update": "به‌روزرسانی وضعیت نشانه", - "flag_manage_history_assignee": "اختصاص داده شده به %1", - "flag_manage_history_state": "وضعیت به‌روزرسانی شد به %1", - "flag_manage_history_notes": "یادداشت‌های نشانه به‌روزرسانی شد", - "flag_manage_saved": "جزئیات نشانه به‌روزرسانی شد", "deleted_message": "این موضوع پاک شده است. تنها کاربرانِ با حق مدیریت موضوع می‌توانند آن را ببینند.", "following_topic.message": "از این پس اگر کسی در این موضوع پست بگذارد، شما آگاه خواهید شد.", "not_following_topic.message": "شما این موضوع را تو فهرست موضوعات خوانده نشده می‌بینید، اما وقتی پست جدیدی ارسال می‌شود آگاه‌سازی دریافت نمی‌کنید.", @@ -131,8 +115,5 @@ "stale.warning": "موضوعی که شما در حال پاسخگویی به آن هستید قدیمی می باشد. آیا میلید به جای آن یک موضوع جدید ایجاد کنید و در آن به این موضوع ارجاع دهید؟", "stale.create": "ایجاد یک موضوع جدید", "stale.reply_anyway": "در هر صورت می خواهم به این موضوع پاسخ دهم", - "link_back": "پاسخ: [%1](%2)", - "spam": "اسپم", - "offensive": "توهین آمیز", - "custom-flag-reason": "وارد کردن دلیل پرچمگذاری" + "link_back": "پاسخ: [%1](%2)" } \ No newline at end of file diff --git a/public/language/fa-IR/user.json b/public/language/fa-IR/user.json index 98ffef7085..0c57c4f7a8 100644 --- a/public/language/fa-IR/user.json +++ b/public/language/fa-IR/user.json @@ -33,6 +33,7 @@ "chat": "چت", "chat_with": "ادامه چت با %1", "new_chat_with": "شروع چت جدید با %1", + "flag-profile": "Flag Profile", "follow": "دنبال کن", "unfollow": "دنبال نکن", "more": "بیشتر", @@ -64,6 +65,8 @@ "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", "settings": "تنظیمات", "show_email": "نمایش ایمیل‌های من", "show_fullname": "نام کامل من را نشان بده", diff --git a/public/language/fi/admin/advanced/errors.json b/public/language/fi/admin/advanced/errors.json index 963e68b116..546f0f1508 100644 --- a/public/language/fi/admin/advanced/errors.json +++ b/public/language/fi/admin/advanced/errors.json @@ -8,7 +8,7 @@ "clear-error-log": "Clear Error Log", "route": "Route", "count": "Count", - "no-routes-not-found": "Hooray! There are no routes that were not found.", + "no-routes-not-found": "Hooray! No 404 errors!", "clear404-confirm": "Are you sure you wish to clear the 404 error logs?", "clear404-success": "\"404 Not Found\" errors cleared" } \ No newline at end of file diff --git a/public/language/fi/admin/general/dashboard.json b/public/language/fi/admin/general/dashboard.json index b82802db1b..a70dda322e 100644 --- a/public/language/fi/admin/general/dashboard.json +++ b/public/language/fi/admin/general/dashboard.json @@ -2,6 +2,9 @@ "forum-traffic": "Forum Traffic", "page-views": "Page Views", "unique-visitors": "Unique Visitors", + "users": "Users", + "posts": "Posts", + "topics": "Topics", "page-views-last-month": "Page views Last Month", "page-views-this-month": "Page views This Month", "page-views-last-day": "Page views in last 24 hours", @@ -20,6 +23,11 @@ "prerelease-warning": "

This is a pre-release version of NodeBB. Unintended bugs may occur.

", "notices": "Notices", + "restart-not-required": "Restart not required", + "restart-required": "Restart required", + "search-plugin-installed": "Search Plugin installed", + "search-plugin-not-installed": "Search Plugin not installed", + "search-plugin-tooltip": "Install a search plugin from the plugin page in order to activate search functionality", "control-panel": "System Control", "reload": "Reload", @@ -52,4 +60,4 @@ "graphs.unique-visitors": "Unique Visitors", "graphs.registered-users": "Registered Users", "graphs.anonymous-users": "Anonymous Users" -} \ No newline at end of file +} diff --git a/public/language/fi/admin/menu.json b/public/language/fi/admin/menu.json index 6a4995ea6e..985c540e8a 100644 --- a/public/language/fi/admin/menu.json +++ b/public/language/fi/admin/menu.json @@ -13,7 +13,6 @@ "manage/users": "Users", "manage/registration": "Registration Queue", "manage/groups": "Groups", - "manage/flags": "Flags", "manage/ip-blacklist": "IP Blacklist", "section-settings": "Settings", diff --git a/public/language/fi/admin/settings/general.json b/public/language/fi/admin/settings/general.json index c26740ee4f..72ecfe641f 100644 --- a/public/language/fi/admin/settings/general.json +++ b/public/language/fi/admin/settings/general.json @@ -26,5 +26,6 @@ "touch-icon.upload": "Upload", "touch-icon.help": "Recommended size and format: 192x192, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.", "outgoing-links": "Outgoing Links", - "outgoing-links.warning-page": "Use Outgoing Links Warning Page" + "outgoing-links.warning-page": "Use Outgoing Links Warning Page", + "search-default-sort-by": "Search default sort by" } \ No newline at end of file diff --git a/public/language/fi/admin/settings/uploads.json b/public/language/fi/admin/settings/uploads.json index 8a56c85663..35eaa5a58f 100644 --- a/public/language/fi/admin/settings/uploads.json +++ b/public/language/fi/admin/settings/uploads.json @@ -9,7 +9,7 @@ "allow-topic-thumbnails": "Allow users to upload topic thumbnails", "topic-thumb-size": "Topic Thumb Size", "allowed-file-extensions": "Allowed File Extensions", - "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc).\n\t\t\t\t\tAn empty list means all extensions are allowed.", + "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc). An empty list means all extensions are allowed.", "profile-avatars": "Profile Avatars", "allow-profile-image-uploads": "Allow users to upload profile images", "convert-profile-image-png": "Convert profile image uploads to PNG", @@ -25,4 +25,4 @@ "profile-covers": "Profile Covers", "default-covers": "Default Cover Images", "default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image" -} \ No newline at end of file +} diff --git a/public/language/fi/notifications.json b/public/language/fi/notifications.json index b10e43729c..2869a9e5e5 100644 --- a/public/language/fi/notifications.json +++ b/public/language/fi/notifications.json @@ -19,6 +19,9 @@ "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 on vastannut viestiin: %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", diff --git a/public/language/fi/pages.json b/public/language/fi/pages.json index 4ac31974c4..a5e8b87187 100644 --- a/public/language/fi/pages.json +++ b/public/language/fi/pages.json @@ -6,7 +6,7 @@ "popular-month": "Suositut aiheet tässä kuussa", "popular-alltime": "Suositut aiheet koko ajalta", "recent": "Viimeisimmät aiheet", - "flagged-posts": "Liputetut viestit", + "flagged-content": "Flagged Content", "ip-blacklist": "IP Blacklist", "users/online": "Paikalla olevat käyttäjät", "users/latest": "Viimeisimmat käyttäjät", @@ -27,6 +27,8 @@ "group": "%1 group", "chats": "Keskustelut", "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\"", diff --git a/public/language/fi/search.json b/public/language/fi/search.json index a8aae53cba..4c221d43f2 100644 --- a/public/language/fi/search.json +++ b/public/language/fi/search.json @@ -12,6 +12,7 @@ "reply-count": "Vastausten määrä", "at-least": "Vähintään", "at-most": "Enintään", + "relevance": "Relevance", "post-time": "Julkaisuaika", "newer-than": "Uudemmat kuin", "older-than": "Vanhemmat kuin", diff --git a/public/language/fi/topic.json b/public/language/fi/topic.json index 933c042445..56f51da9bf 100644 --- a/public/language/fi/topic.json +++ b/public/language/fi/topic.json @@ -13,7 +13,8 @@ "notify_me": "Ilmoita, kun tähän keskusteluun tulee uusia viestejä", "quote": "Lainaa", "reply": "Vastaa", - "replies_to_this_post": "Replies: %1", + "replies_to_this_post": "%1 Replies", + "last_reply_time": "Last reply", "reply-as-topic": "Reply as topic", "guest-login-reply": "Kirjaudu sisään voidaksesi vastata", "edit": "Muokkaa", @@ -25,28 +26,11 @@ "link": "Linkitä", "share": "Jaa", "tools": "Työkalut", - "flag": "Ilmianna", "locked": "Lukittu", "pinned": "Pinned", "moved": "Moved", "bookmark_instructions": "Click here to return to the last read post in this thread.", "flag_title": "Ilmianna tämä viesti moderaattoreille", - "flag_success": "Tämä viesti ilmiannettiin moderaattoreille.", - "flag_manage_title": "Flagged post in %1", - "flag_manage_history": "Action History", - "flag_manage_no_history": "No event history to report", - "flag_manage_assignee": "Assignee", - "flag_manage_state": "State", - "flag_manage_state_open": "New/Open", - "flag_manage_state_wip": "Work in Progress", - "flag_manage_state_resolved": "Resolved", - "flag_manage_state_rejected": "Rejected", - "flag_manage_notes": "Shared Notes", - "flag_manage_update": "Update Flag Status", - "flag_manage_history_assignee": "Assigned to %1", - "flag_manage_history_state": "Updated state to %1", - "flag_manage_history_notes": "Updated flag notes", - "flag_manage_saved": "Flag Details Updated", "deleted_message": "Tämä aihe on poistettu. Vain käyttäjät, joilla on aiheen hallintaoikeudet, voivat nähdä sen.", "following_topic.message": "Saat nyt ilmoituksen, kun joku kirjoittaa tähän aiheeseen.", "not_following_topic.message": "You will see this topic in the unread topics list, but you will not receive notifications when somebody posts to this topic.", @@ -131,8 +115,5 @@ "stale.warning": "The topic you are replying to is quite old. Would you like to create a new topic instead, and reference this one in your reply?", "stale.create": "Create a new topic", "stale.reply_anyway": "Reply to this topic anyway", - "link_back": "Re: [%1](%2)", - "spam": "Spam", - "offensive": "Offensive", - "custom-flag-reason": "Enter a flagging reason" + "link_back": "Re: [%1](%2)" } \ No newline at end of file diff --git a/public/language/fi/user.json b/public/language/fi/user.json index c657c38b38..1495e20b8f 100644 --- a/public/language/fi/user.json +++ b/public/language/fi/user.json @@ -33,6 +33,7 @@ "chat": "Keskustele", "chat_with": "Continue chat with %1", "new_chat_with": "Start new chat with %1", + "flag-profile": "Flag Profile", "follow": "Seuraa", "unfollow": "Älä seuraa", "more": "More", @@ -64,6 +65,8 @@ "remove_uploaded_picture": "Remove Uploaded Picture", "upload_cover_picture": "Upload cover picture", "remove_cover_picture_confirm": "Are you sure you want to remove the cover picture?", + "crop_picture": "Crop picture", + "upload_cropped_picture": "Crop and upload", "settings": "Asetukset", "show_email": "Näytä sähköpostiosoitteeni", "show_fullname": "Näytä koko nimeni", diff --git a/public/language/fr/admin/advanced/errors.json b/public/language/fr/admin/advanced/errors.json index 86637472a9..2884db0eaf 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": "Hourra ! Aucune route n'a pas été trouvée.", + "no-routes-not-found": "Hooray! No 404 errors!", "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/general/dashboard.json b/public/language/fr/admin/general/dashboard.json index 3123167d2a..a4d59944f8 100644 --- a/public/language/fr/admin/general/dashboard.json +++ b/public/language/fr/admin/general/dashboard.json @@ -2,6 +2,9 @@ "forum-traffic": "Trafic du forum", "page-views": "Pages vues", "unique-visitors": "Visiteurs uniques", + "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", @@ -20,6 +23,11 @@ "prerelease-warning": "

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

", "notices": "Informations", + "restart-not-required": "Pas de redémarrage nécessaire", + "restart-required": "Redémarrage requis", + "search-plugin-installed": "Recherche un plugin installé", + "search-plugin-not-installed": "Rechercher un plugin non installé", + "search-plugin-tooltip": "Installer un plugin de recherche depuis la page des plugins pour activer la fonctionnalité de recherche", "control-panel": "Contrôle du système", "reload": "Recharger", @@ -52,4 +60,4 @@ "graphs.unique-visitors": "Visiteurs uniques", "graphs.registered-users": "Utilisateurs enregistrés", "graphs.anonymous-users": "Utilisateurs anonymes" -} \ No newline at end of file +} diff --git a/public/language/fr/admin/manage/categories.json b/public/language/fr/admin/manage/categories.json index e4454455f6..ab807c22af 100644 --- a/public/language/fr/admin/manage/categories.json +++ b/public/language/fr/admin/manage/categories.json @@ -27,10 +27,10 @@ "select-category": "Sélectionner une catégorie", "set-parent-category": "Définissez une catégorie parente", - "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.", + "privileges.description": "Vous pouvez configurer les contrôles d'accès et de privilège pour cette catégorie dans cette section. Les privilège peuvent être donnés par rapport à un utilisateur ou par rapport à un groupe. Vous pouvez ajouter un nouvel utilisateur à cette table en cherchant dans le formulaire ci-dessous.", "privileges.warning": "Note: Les paramètres de privilège prennent effet instantanément . Il n'est pas nécessaire de sauvegarder la catégorie après avoir ajuster ces paramètres.", "privileges.section-viewing": "Afficher les Privilèges", - "privileges.section-posting": "Posting Privileges", + "privileges.section-posting": "Privilège de posting", "privileges.section-moderation": "Privilèges de modération", "privileges.section-user": "Utilisateur", "privileges.search-user": "Ajouter un utilisateur", @@ -43,7 +43,7 @@ "privileges.inherit": "Si le groupe utilisateurs enregistrés bénéficie d'un privilège supplémentaire, tous les autres groupes recevront un privilège implicite, même s'ils ne sont pas explicitement définis. Ce privilège implicite vous est montré car tous les utilisateurs font partie du groupe utilisateurs enregistrés ainsi, les privilèges accordés aux autres groupes ne doivent pas nécessairement être explicitement accordés.", "analytics.back": "Revenir à la liste des catégories", - "analytics.title": "Analytics for \"%1\" category", + "analytics.title": "Analytique pour la catégorie \"%1\"", "analytics.pageviews-hourly": "Figure 1 – Pages vues par heure pour cette catégorie", "analytics.pageviews-daily": "Figure 2 – Pages vues par jour pour cette catégorie", "analytics.topics-daily": "Figure 3 – Sujets créés par jour dans catégorie", @@ -54,13 +54,13 @@ "alert.none-active": "Vous n'avez aucune catégorie active.", "alert.create": "Créer une catégorie", "alert.confirm-moderate": "Êtes-vous sûr de vouloir accorder à ce groupe les privilèges de modération ? Ce groupe est public, et n'importe qui peut s'y joindre.", - "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.confirm-purge": "

Voulez-vous vraiment purger cette catégorie\"%1\"?

Attention!Tous les sujets et posts dans cette catégorie vont être supprimés

Purger une catégorie va enlever tous les sujets et les posts, et supprimer la catégorie de la base de données. Si vous voulez seulement enlevez une catégorietemporairement, il faut plutôt \"désactiver\" la catégorie.", "alert.purge-success": "Catégorie purgée !", "alert.copy-success": "Paramètres copiés !", "alert.set-parent-category": "Définir une catégorie parent", "alert.updated": "Catégories mises à jour", - "alert.updated-success": "Category IDs %1 successfully updated.", - "alert.upload-image": "Upload category image", + "alert.updated-success": "L' ID de la catégorie %1 a été mis à jour avec succès", + "alert.upload-image": "Uploader une image de catégorie", "alert.find-user": "Trouver un utilisateur", "alert.user-search": "Chercher un utilisateur ici...", "alert.find-group": "Trouver un groupe", diff --git a/public/language/fr/admin/manage/flags.json b/public/language/fr/admin/manage/flags.json index ab8c5e51a6..7245441880 100644 --- a/public/language/fr/admin/manage/flags.json +++ b/public/language/fr/admin/manage/flags.json @@ -7,12 +7,12 @@ "sort-by.most-flags": "Les plus signalés", "sort-by.most-recent": "Les plus récents", "search": "Rechercher", - "dismiss-all": "Tout rejeté", + "dismiss-all": "Tout classer", "none-flagged": "Aucun sujet signalé !", "posted-in": "Posté dans 1%", "read-more": "Lire la suite", "flagged-x-times": "Ce sujet a été signalé %1 fois :", - "dismiss": "Rejeté ce signalement", + "dismiss": "Classer ce signalement", "delete-post": "Supprimer le message", "alerts.confirm-delete-post": "Voulez vous réellement supprimer ce message ?" diff --git a/public/language/fr/admin/manage/ip-blacklist.json b/public/language/fr/admin/manage/ip-blacklist.json index 10c9742e35..b4a6efd3c6 100644 --- a/public/language/fr/admin/manage/ip-blacklist.json +++ b/public/language/fr/admin/manage/ip-blacklist.json @@ -1,15 +1,15 @@ { "lead": "Configurez votre liste noire d'adresses IP ici.", - "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.", + "description": "Quelques fois, bannir un utilisateur ne suffit pas. Restreindre l'accès au forum à une adresse IP ou un ensemble d'adresses IP peut être le meilleur moyen de protection. Dans ce cas, vous pouvez ajouter les adresses IP problématiques ou des blocks CIDR entiers à cette liste noire, et ceux ci ne pourront ni s'identifier ni créer un nouveau compte.", "active-rules": "Règles actives", "validate": "Valider la liste noire", "apply": "Appliquer la liste noire", - "hints": "Syntax Hints", - "hint-1": "Define a single IP addresses per line. You can add IP blocks as long as they follow the CIDR format (e.g. 192.168.100.0/22).", + "hints": "astuces de syntaxe", + "hint-1": "Définissez une seule adresse IP par ligne. Vous pouvez ajouter des blocs IP, du moment qu'ils respectent le format CIDR (par ex. 192.168.100.0/22).", "hint-2": "Vous pouvez ajouter en commentaire en commençant la ligne pas le symbole #.", - "validate.x-valid": "%1 out of %2 rule(s) valid.", - "validate.x-invalid": "The following %1 rules are invalid:", + "validate.x-valid": "%1 sur %2 règle(s) valide(s).", + "validate.x-invalid": "Les règles suivantes %1 sont invalides:", "alerts.applied-success": "Liste noire appliquée" } \ No newline at end of file diff --git a/public/language/fr/admin/manage/registration.json b/public/language/fr/admin/manage/registration.json index 3548f7cb11..fddcd613e3 100644 --- a/public/language/fr/admin/manage/registration.json +++ b/public/language/fr/admin/manage/registration.json @@ -6,15 +6,15 @@ "list.email": "E-mail", "list.ip": "IP", "list.time": "Date", - "list.username-spam": "Frequency: %1 Appears: %2 Confidence: %3", - "list.email-spam": "Frequency: %1 Appears: %2", - "list.ip-spam": "Frequency: %1 Appears: %2", + "list.username-spam": "Fréquence : %1 Apparait : %2 Confiance : %3", + "list.email-spam": "Fréquence : %1 Apparait : %2", + "list.ip-spam": "Fréquence : %1 Apparait : %2", "invitations": "Invitations", - "invitations.description": "Below is a complete list of invitations sent. Use ctrl-f to search through the list by email or username.

The username will be displayed to the right of the emails for users who have redeemed their invitations.", - "invitations.inviter-username": "Inviter Username", - "invitations.invitee-email": "Invitee Email", - "invitations.invitee-username": "Invitee Username (if registered)", + "invitations.description": "Ci-dessous se trouve une liste complète des invitations envoyées. Utilisez ctrl-f pour rechercher un email ou nom d'utilisateur dans la liste.
\n
Le nom d'utilisateur sera afficher à droite des emails pour les utilisateurs qui ont accepté leur invitation.", + "invitations.inviter-username": "Nom d'utilisateur qui a invité", + "invitations.invitee-email": "Email invité", + "invitations.invitee-username": "Nom d'utilisateur de l'invité (si inscrit)", "invitations.confirm-delete": "Êtes-vous sûr de vouloir supprimer l'invitation ?" } \ No newline at end of file diff --git a/public/language/fr/admin/menu.json b/public/language/fr/admin/menu.json index c4fa00ba0c..4552354510 100644 --- a/public/language/fr/admin/menu.json +++ b/public/language/fr/admin/menu.json @@ -13,7 +13,6 @@ "manage/users": "Utilisateurs", "manage/registration": "File d'inscription", "manage/groups": "Groupes", - "manage/flags": "Signalements", "manage/ip-blacklist": "Liste noire d'IPs", "section-settings": "Réglages", diff --git a/public/language/fr/admin/settings/advanced.json b/public/language/fr/admin/settings/advanced.json index 700cd158a3..cdd7373c15 100644 --- a/public/language/fr/admin/settings/advanced.json +++ b/public/language/fr/admin/settings/advanced.json @@ -7,13 +7,13 @@ "headers.powered-by": "Personnaliser l'en-tête \"Propulsé par\" envoyé par NodeBB", "headers.acao": "Access-Control-Allow-Origin", "headers.acao-help": "Pour interdire l'accès à tous les sites, laisser vide ou définissez comme null", - "headers.acam": "Access-Control-Allow-Methods", - "headers.acah": "Access-Control-Allow-Headers", + "headers.acam": "\nAccess-Control-Allow-Methods", + "headers.acah": "\nAccess-Control-Allow-Headers", "traffic-management": "Gestion du trafic", - "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", + "traffic.help": "NodeBB est déployé équipé d'un module qui refuse les requêtes en cas de situation de haut traffic. Vous pouvez changer les paramètres ici, bien que les paramètres par défaut sont un bon commencement.", "traffic.enable": "Activé la gestion du trafic", - "traffic.event-lag": "Event Loop Lag Threshold (in milliseconds)", - "traffic.event-lag-help": "Lowering this value decreases wait times for page loads, but will also show the \"excessive load\" message to more users. (Restart required)", + "traffic.event-lag": "Seuil de lag des boucles d'événements (en millisecondes) ", + "traffic.event-lag-help": "Descendre cette valeur réduit le temps d'attente pour le chargement de s pages, mais montrera le message \"charge excessive\" à plus d'utilisateurs. (redémarrage requis)", "traffic.lag-check-interval": "Vérifier l’intervalle (en millisecondes)", - "traffic.lag-check-interval-help": "Lowering this value causes NodeBB to become more sensitive to spikes in load, but may also cause the check to become too sensitive. (Restart required)" + "traffic.lag-check-interval-help": "Descendre cette valeur rend NodeBB plus sensible aux pics dans le chargement, mais rend aussi le contrôle trop sensible. (redémarrage requis)" } \ No newline at end of file diff --git a/public/language/fr/admin/settings/email.json b/public/language/fr/admin/settings/email.json index 21de940251..493427ed8c 100644 --- a/public/language/fr/admin/settings/email.json +++ b/public/language/fr/admin/settings/email.json @@ -5,11 +5,11 @@ "from": "Nom de l’expéditeur", "from-help": "Le nom de l’expéditeur à afficher dans l'e-mail", "gmail-routing": "Routing Gmail", - "gmail-routing-help1": "There have been reports of Gmail Routing not working on accounts with heightened security. In those scenarios, you will have to configure your GMail account to allow less secure apps.", - "gmail-routing-help2": "For more information about this workaround, please consult this NodeMailer article on the issue. An alternative would be to utilise a third-party emailer plugin such as SendGrid, Mailgun, etc. Browse available plugins here.", + "gmail-routing-help1": "Il y a eu des rapports selon lesquels le routage Gmail ne fonctionne pas avec les comptes ayant une sécurité plus élevée. Dans ce cas vous devezconfiguer votre compte Gmail pour qu'il autorise les applications moins sécurisées.", + "gmail-routing-help2": "Pour plus d'information sur cette astuce, merci de consulter l'article de NodeMailer sur ce sujet. Une alternative serait d'utiliser un service tiers d'envoi d'email tel que SendGrid, Mailgun, etc. Afficher les plugins disponibles ici.", "gmail-transport": "Router les e-mails via un compte Gmail/Google Apps", "gmail-transport.username": "Nom d'utilisateur", - "gmail-transport.username-help": "Entrer l'adresse e-mail complète ici, surtout si vous utilisez un domaine géré par Google Aps.", + "gmail-transport.username-help": "Entrer l'adresse e-mail complète ici, surtout si vous utilisez un domaine géré par Google Apps.", "gmail-transport.password": "Mot de passe", "template": "Modifier le modèle d'e-mail", "template.select": "Sélectionner un modèle d'e-mail ", @@ -20,6 +20,6 @@ "testing.send-help": "Le test d'e-mail sera envoyé à l'adresse e-mail de l'utilisateur actuellement connecté.", "subscriptions": "Abonnements d'e-mail", "subscriptions.disable": "Désactiver les e-mails de notification des abonnés", - "subscriptions.hour": "Digest Hour", - "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
The approximate server time is:
The next daily digest is scheduled to be sent " + "subscriptions.hour": "Heure d'envoi", + "subscriptions.hour-help": "Veuillez entrer un nombre représentant l'heure à laquelle envoyer les emails de résumé (c'est à dire 0 pour minuit, 17 pour 5:00 pm). Gardez à l'esprit qu'il s'agit de l'heure du serveur, et peut ne pas correspondre à votre heure locale.
L'heure du serveur est :
Le prochain mail de resumé sera envoyé à " } \ No newline at end of file diff --git a/public/language/fr/admin/settings/general.json b/public/language/fr/admin/settings/general.json index b82c95113e..660f4b7e99 100644 --- a/public/language/fr/admin/settings/general.json +++ b/public/language/fr/admin/settings/general.json @@ -26,5 +26,6 @@ "touch-icon.upload": "Télécharger", "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" + "outgoing-links.warning-page": "Utiliser la page d'avertissement pour liens sortants", + "search-default-sort-by": "Search default sort by" } \ No newline at end of file diff --git a/public/language/fr/admin/settings/guest.json b/public/language/fr/admin/settings/guest.json index 083b57f173..7824006bf6 100644 --- a/public/language/fr/admin/settings/guest.json +++ b/public/language/fr/admin/settings/guest.json @@ -1,8 +1,8 @@ { - "handles": "Guest Handles", - "handles.enabled": "Allow guest handles", - "handles.enabled-help": "This option exposes a new field that allows guests to pick a name to associate with each post they make. If disabled, they will simply be called \"Guest\"", - "privileges": "Privilèges invités", + "handles": "Gestion des invités", + "handles.enabled": "Autoriser les invités à poster", + "handles.enabled-help": "Cette option affiche un nouveau champ qui permet aux invités de choisir un nom qui sera associé à chaque message qu'ils rédigent. Si désactivé, il seront simplement nommés \"Invité\".", + "privileges": "Privilèges des invités", "privileges.can-search": "Autoriser les invités à faire des recherches sans se connecter.", "privileges.can-search-users": "Autoriser les invités à rechercher un utilisateur sans se connecter." } \ 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 071f020427..fdec928a98 100644 --- a/public/language/fr/admin/settings/post.json +++ b/public/language/fr/admin/settings/post.json @@ -20,22 +20,22 @@ "restrictions.days-until-stale": "Nombre de jours avant qu'un sujet soit considéré comme périmé", "restrictions.stale-help": "Si un sujet est considéré comme \"périmé\", un message sera affiché aux utilisateurs tentant de répondre au sujet", "timestamp": "Horodatage", - "timestamp.cut-off": "Date cut-off (in days)", - "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": "Teaser Post", + "timestamp.cut-off": "Date de coupure (en jours)", + "timestamp.cut-off-help": "Les dates et heures seront affichées de façon relative (par exemple \"il y a 3 heures\", \"il y a 5 jours\"), et localisées. Après un certain point, le texte peut afficher la date emlle-même (par exemple 5 Novembre 2016, 15:30).
(Défaut : 30, ou un mois). Régler à 0 pour toujours afficher des dates, laisser vide pour toujours afficher des dates relatives.", + "teaser": "Message d'aperçu", "teaser.last-post": "Dernier – Affiche le dernier message, ou celui d'origine, si il n'y a pas de réponse", "teaser.last-reply": "Dernier – Affiche le dernier message, ou \"Aucune réponse\" si il n'y a pas de réponse", "teaser.first": "Premier", "unread": "Paramètres des messages non lus", - "unread.cutoff": "Unread cutoff days", - "unread.min-track-last": "Minimum posts in topic before tracking last read", + "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", "signature": "Paramètres de signature", "signature.disable": "Désactiver les signatures", "signature.no-links": "Désactiver les liens en signature", "signature.no-images": "Désactiver les images en signature ", "signature.max-length": "Longueur maximum des signatures", - "composer": "Composer Settings", - "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": "Paramètres Composer", + "composer-help": "Les réglages suivants permettent de choisir les fonctionnalités et/ou l'apparence du composeur de message affiché\n\\t\\t\\t\\taux utilisateurs quand ils créent de nouveaux sujets ou répondent à des sujets existants.", "composer.show-help": "Afficher l'onglet \"Aide\"", "composer.enable-plugin-help": "Autoriser les plugins à modifier l'onglet d'aide", "composer.custom-help": "Message d'aide personnalisé", diff --git a/public/language/fr/admin/settings/uploads.json b/public/language/fr/admin/settings/uploads.json index d4b789766f..a03fbe3a4b 100644 --- a/public/language/fr/admin/settings/uploads.json +++ b/public/language/fr/admin/settings/uploads.json @@ -9,7 +9,7 @@ "allow-topic-thumbnails": "Autoriser les utilisateurs à télécharger des miniatures de sujet", "topic-thumb-size": "Miniature du sujet", "allowed-file-extensions": "Extensions de fichier autorisés", - "allowed-file-extensions-help": "Entrer une liste d'extensions autorisées, séparées par des virgules (par exemple : pdf, xls, doc).\n\\t\\t\\t\\t\\tUne liste vide signifie que toutes les extensions sont autorisés.", + "allowed-file-extensions-help": "Entrer une liste d’extensions de fichier séparés par une virgule (ex : pdf,xls,doc). Une liste vide signifie que toutes les extensions sont autorisées.", "profile-avatars": "Avatar", "allow-profile-image-uploads": "Autoriser les utilisateurs à télécharger des avatars", "convert-profile-image-png": "Convertir les avatars téléchargés au format PNG", @@ -25,4 +25,4 @@ "profile-covers": "Image de couverture", "default-covers": "Image de couverture par défaut", "default-covers-help": "Ajouter des images de couvertures par défaut séparées par des virgules pour les comptes n'ayant pas téléchargé d'image de couverture" -} \ No newline at end of file +} diff --git a/public/language/fr/notifications.json b/public/language/fr/notifications.json index e13aba7ee4..531b3d9273 100644 --- a/public/language/fr/notifications.json +++ b/public/language/fr/notifications.json @@ -19,6 +19,9 @@ "user_flagged_post_in": "%1 a signalé un message dans %2.", "user_flagged_post_in_dual": "%1 et %2 ont signalé un message dans %3", "user_flagged_post_in_multiple": "%1 et %2 autres on signalé un message dans %3", + "user_flagged_user": "%1 a signalé un profil utilisateur (%2)", + "user_flagged_user_dual": "%1 et %2 ont signalé un profil utilisateur (%3)", + "user_flagged_user_multiple": "%1 et %2 autres utilisateurs ont signalé un profil utilisateur (%3)", "user_posted_to": "%1 a répondu à : %2", "user_posted_to_dual": "%1 et %2 ont posté une réponse à : %3", "user_posted_to_multiple": "%1 et %2 autres ont posté une réponse à : %3", diff --git a/public/language/fr/pages.json b/public/language/fr/pages.json index 898d6c84ce..740b7f70fc 100644 --- a/public/language/fr/pages.json +++ b/public/language/fr/pages.json @@ -6,7 +6,7 @@ "popular-month": "Sujets populaires ce mois-ci", "popular-alltime": "Sujets populaires depuis toujours", "recent": "Sujets récents", - "flagged-posts": "Messages signalés", + "flagged-content": "Contenu signalé", "ip-blacklist": "Liste noire d'adresses IP", "users/online": "Utilisateurs en ligne", "users/latest": "Derniers inscrits", @@ -27,6 +27,8 @@ "group": "%1 groupe", "chats": "Discussions", "chat": "Conversation avec %1", + "flags": "Signalements", + "flag-details": "Détails signalement %1", "account/edit": "Édition de \"%1\"", "account/edit/password": "Édition du mot de passe de \"%1\"", "account/edit/username": "Édition du nom d'utilisateur de \"%1\"", diff --git a/public/language/fr/search.json b/public/language/fr/search.json index 4640c8a2f6..139a6e512e 100644 --- a/public/language/fr/search.json +++ b/public/language/fr/search.json @@ -12,6 +12,7 @@ "reply-count": "Nombre de réponses", "at-least": "Au moins", "at-most": "Au plus", + "relevance": "Relevance", "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 51dee037a4..71efbb71c5 100644 --- a/public/language/fr/topic.json +++ b/public/language/fr/topic.json @@ -13,7 +13,8 @@ "notify_me": "Être notifié des réponses dans ce sujet", "quote": "Citer", "reply": "Répondre", - "replies_to_this_post": "Réponses : %1", + "replies_to_this_post": "%1 Replies", + "last_reply_time": "Last reply", "reply-as-topic": "Répondre à l'aide d'un sujet", "guest-login-reply": "Se connecter pour répondre", "edit": "Éditer", @@ -25,28 +26,11 @@ "link": "Lien", "share": "Partager", "tools": "Outils", - "flag": "Signaler", "locked": "Verrouillé", "pinned": "Épinglé", "moved": "Déplacé", "bookmark_instructions": "Cliquez ici pour retourner au dernier message lu de ce fil.", "flag_title": "Signaler ce message à la modération", - "flag_success": "Ce message a bien été signalé aux modérateurs.", - "flag_manage_title": "Post signalé dans %1", - "flag_manage_history": "Historique des actions", - "flag_manage_no_history": "Aucun historique d'évènement à reporter", - "flag_manage_assignee": "Assigné à", - "flag_manage_state": "État", - "flag_manage_state_open": "Nouveau/Ouvert", - "flag_manage_state_wip": "En cours", - "flag_manage_state_resolved": "Résolu", - "flag_manage_state_rejected": "Rejeté", - "flag_manage_notes": "Notes partagées", - "flag_manage_update": "Mettre à jour l'état du signalement", - "flag_manage_history_assignee": "Assigné à %1", - "flag_manage_history_state": "État mis à jour à %1", - "flag_manage_history_notes": "Notes du signalement à jour", - "flag_manage_saved": "Détails du signalement à jour", "deleted_message": "Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.", "following_topic.message": "Vous recevrez désormais des notifications lorsque quelqu'un postera dans ce sujet.", "not_following_topic.message": "Vous verrez ce sujet dans la liste des sujets non-lus, mais vous ne recevrez pas de notification lorsque quelqu'un postera dans ce sujet.", @@ -131,8 +115,5 @@ "stale.warning": "Le sujet auquel vous répondez est assez ancien. Ne voudriez-vous pas créer un nouveau sujet à la place et placer une référence vers celui-ci dans votre réponse ?", "stale.create": "Créer un nouveau sujet", "stale.reply_anyway": "Répondre à ce sujet quand même", - "link_back": "Re : [%1](%2)", - "spam": "Spam", - "offensive": "Offensif", - "custom-flag-reason": "Entrez une raison pour laquelle vous signalez ce message" + "link_back": "Re : [%1](%2)" } \ No newline at end of file diff --git a/public/language/fr/user.json b/public/language/fr/user.json index 9b8dc1c50a..521789084c 100644 --- a/public/language/fr/user.json +++ b/public/language/fr/user.json @@ -33,6 +33,7 @@ "chat": "Discussion", "chat_with": "Continuer la discussion avec %1", "new_chat_with": "Commencer une nouvelle discussion avec %1", + "flag-profile": "Signaler le profil", "follow": "S'abonner", "unfollow": "Se désabonner", "more": "Plus", @@ -64,6 +65,8 @@ "remove_uploaded_picture": "Supprimer l'image envoyée", "upload_cover_picture": "Envoyer une image de couverture", "remove_cover_picture_confirm": "Êtes-vous sûr de vouloir supprimer l'image de couverture ?", + "crop_picture": "Découper l’image", + "upload_cropped_picture": "Découper et envoyer", "settings": "Paramètres", "show_email": "Afficher mon email", "show_fullname": "Afficher mon nom complet", diff --git a/public/language/gl/admin/advanced/errors.json b/public/language/gl/admin/advanced/errors.json index 963e68b116..546f0f1508 100644 --- a/public/language/gl/admin/advanced/errors.json +++ b/public/language/gl/admin/advanced/errors.json @@ -8,7 +8,7 @@ "clear-error-log": "Clear Error Log", "route": "Route", "count": "Count", - "no-routes-not-found": "Hooray! There are no routes that were not found.", + "no-routes-not-found": "Hooray! No 404 errors!", "clear404-confirm": "Are you sure you wish to clear the 404 error logs?", "clear404-success": "\"404 Not Found\" errors cleared" } \ No newline at end of file diff --git a/public/language/gl/admin/general/dashboard.json b/public/language/gl/admin/general/dashboard.json index b82802db1b..a70dda322e 100644 --- a/public/language/gl/admin/general/dashboard.json +++ b/public/language/gl/admin/general/dashboard.json @@ -2,6 +2,9 @@ "forum-traffic": "Forum Traffic", "page-views": "Page Views", "unique-visitors": "Unique Visitors", + "users": "Users", + "posts": "Posts", + "topics": "Topics", "page-views-last-month": "Page views Last Month", "page-views-this-month": "Page views This Month", "page-views-last-day": "Page views in last 24 hours", @@ -20,6 +23,11 @@ "prerelease-warning": "

This is a pre-release version of NodeBB. Unintended bugs may occur.

", "notices": "Notices", + "restart-not-required": "Restart not required", + "restart-required": "Restart required", + "search-plugin-installed": "Search Plugin installed", + "search-plugin-not-installed": "Search Plugin not installed", + "search-plugin-tooltip": "Install a search plugin from the plugin page in order to activate search functionality", "control-panel": "System Control", "reload": "Reload", @@ -52,4 +60,4 @@ "graphs.unique-visitors": "Unique Visitors", "graphs.registered-users": "Registered Users", "graphs.anonymous-users": "Anonymous Users" -} \ No newline at end of file +} diff --git a/public/language/gl/admin/menu.json b/public/language/gl/admin/menu.json index 6a4995ea6e..985c540e8a 100644 --- a/public/language/gl/admin/menu.json +++ b/public/language/gl/admin/menu.json @@ -13,7 +13,6 @@ "manage/users": "Users", "manage/registration": "Registration Queue", "manage/groups": "Groups", - "manage/flags": "Flags", "manage/ip-blacklist": "IP Blacklist", "section-settings": "Settings", diff --git a/public/language/gl/admin/settings/general.json b/public/language/gl/admin/settings/general.json index c26740ee4f..72ecfe641f 100644 --- a/public/language/gl/admin/settings/general.json +++ b/public/language/gl/admin/settings/general.json @@ -26,5 +26,6 @@ "touch-icon.upload": "Upload", "touch-icon.help": "Recommended size and format: 192x192, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.", "outgoing-links": "Outgoing Links", - "outgoing-links.warning-page": "Use Outgoing Links Warning Page" + "outgoing-links.warning-page": "Use Outgoing Links Warning Page", + "search-default-sort-by": "Search default sort by" } \ No newline at end of file diff --git a/public/language/gl/admin/settings/uploads.json b/public/language/gl/admin/settings/uploads.json index 8a56c85663..35eaa5a58f 100644 --- a/public/language/gl/admin/settings/uploads.json +++ b/public/language/gl/admin/settings/uploads.json @@ -9,7 +9,7 @@ "allow-topic-thumbnails": "Allow users to upload topic thumbnails", "topic-thumb-size": "Topic Thumb Size", "allowed-file-extensions": "Allowed File Extensions", - "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc).\n\t\t\t\t\tAn empty list means all extensions are allowed.", + "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc). An empty list means all extensions are allowed.", "profile-avatars": "Profile Avatars", "allow-profile-image-uploads": "Allow users to upload profile images", "convert-profile-image-png": "Convert profile image uploads to PNG", @@ -25,4 +25,4 @@ "profile-covers": "Profile Covers", "default-covers": "Default Cover Images", "default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image" -} \ No newline at end of file +} diff --git a/public/language/gl/notifications.json b/public/language/gl/notifications.json index 326680a2fd..251f80feea 100644 --- a/public/language/gl/notifications.json +++ b/public/language/gl/notifications.json @@ -19,6 +19,9 @@ "user_flagged_post_in": "%1 reportou unha mensaxe en %2", "user_flagged_post_in_dual": "%1 e %2 reportaron a túa mensaxe en %3", "user_flagged_post_in_multiple": "%1 e outras %2 persoas reportaron unha mensaxe en %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 publicou unha resposta en: %2", "user_posted_to_dual": "%1 e %2 responderon a %3", "user_posted_to_multiple": "%1 e outras %2 persoas responderon a: %3", diff --git a/public/language/gl/pages.json b/public/language/gl/pages.json index c0c26c54e4..ce26b384ea 100644 --- a/public/language/gl/pages.json +++ b/public/language/gl/pages.json @@ -6,7 +6,7 @@ "popular-month": "Temas populares do mes", "popular-alltime": "Temas populares de tódolos tempos", "recent": "Temas recentes", - "flagged-posts": "Publicacions Marcadas.", + "flagged-content": "Flagged Content", "ip-blacklist": "Lista negra de IPs", "users/online": "Usuarios conectados", "users/latest": "Últimos usuarios", @@ -27,6 +27,8 @@ "group": "%1 grupo", "chats": "Charlas", "chat": "Falando con %1", + "flags": "Flags", + "flag-details": "Flag %1 Details", "account/edit": "Editando \"%1\"", "account/edit/password": "Editando contrasinal \"%1\"", "account/edit/username": "Editando nome de usuario \"%1\"", diff --git a/public/language/gl/search.json b/public/language/gl/search.json index 1e408dfe96..211355725a 100644 --- a/public/language/gl/search.json +++ b/public/language/gl/search.json @@ -12,6 +12,7 @@ "reply-count": "Número de Respostas", "at-least": "Como mínimo", "at-most": "Como máximo", + "relevance": "Relevance", "post-time": "Data de publicación", "newer-than": "Máis recente que", "older-than": "Máis antigo que", diff --git a/public/language/gl/topic.json b/public/language/gl/topic.json index 9b29bb6b69..5c5e19ed43 100644 --- a/public/language/gl/topic.json +++ b/public/language/gl/topic.json @@ -13,7 +13,8 @@ "notify_me": "Serás notificado canto haxa novas respostas neste tema", "quote": "Citar", "reply": "Responder", - "replies_to_this_post": "Respostas: %1", + "replies_to_this_post": "%1 Replies", + "last_reply_time": "Last reply", "reply-as-topic": "Responder como tema", "guest-login-reply": "Identifícate para responder", "edit": "Editar", @@ -25,28 +26,11 @@ "link": "Ligazón", "share": "Compartir", "tools": "Ferramentas", - "flag": "Reportar", "locked": "Pechado", "pinned": "Fixo", "moved": "Movido", "bookmark_instructions": "Pica aquí para volver á última mensaxe lida neste tema ", "flag_title": "Reportar esta mensaxe", - "flag_success": "Esta mensaxe foi reportada para moderación.", - "flag_manage_title": "Mensaxe reportada en %1", - "flag_manage_history": "Historial de accións", - "flag_manage_no_history": "Sen histórico de eventos", - "flag_manage_assignee": "Encargado", - "flag_manage_state": "Estado", - "flag_manage_state_open": "Novo/Abrir", - "flag_manage_state_wip": "En revisión", - "flag_manage_state_resolved": "Solucionado", - "flag_manage_state_rejected": "Rexeitado", - "flag_manage_notes": "Notas compartidas", - "flag_manage_update": "Actualizar estado do reporte", - "flag_manage_history_assignee": "Asignado a %1", - "flag_manage_history_state": "Estado actualizado a %1", - "flag_manage_history_notes": "Actualizar notas do reporte", - "flag_manage_saved": "Detalles do reporte actualizados", "deleted_message": "Este tema foi borrado. Só os usuarios con privilexios administrativos poden velo.", "following_topic.message": "Agora recibirás notificacións cando alguén publique neste tema.", "not_following_topic.message": "Poderás ver este tema na lista de No Lidos, pero non recibirás notificacións cando alguén escriba nel.", @@ -131,8 +115,5 @@ "stale.warning": "O tema no que queres publicar é bastante vello. Queres crear un novo tema no seu lugar e incluir unha referencia a este na túa mensaxe?", "stale.create": "Crear un novo tema", "stale.reply_anyway": "Publicar neste tema de tódolos xeitos", - "link_back": "Re: [%1](%2)", - "spam": "Spam", - "offensive": "Ofensivo", - "custom-flag-reason": "Describe o motivo do reporte" + "link_back": "Re: [%1](%2)" } \ No newline at end of file diff --git a/public/language/gl/user.json b/public/language/gl/user.json index 6510e010b4..b40df23bca 100644 --- a/public/language/gl/user.json +++ b/public/language/gl/user.json @@ -33,6 +33,7 @@ "chat": "Chat", "chat_with": "Continuar a falar con %1", "new_chat_with": "Comezar a falar con %1", + "flag-profile": "Flag Profile", "follow": "Seguir", "unfollow": "Deixar de seguir", "more": "máis", @@ -64,6 +65,8 @@ "remove_uploaded_picture": "Borrar unha foto subida", "upload_cover_picture": "Subir imaxen de portada", "remove_cover_picture_confirm": "Are you sure you want to remove the cover picture?", + "crop_picture": "Crop picture", + "upload_cropped_picture": "Crop and upload", "settings": "Opcións", "show_email": "Amosa-lo meu Email", "show_fullname": "Amosa-lo meu Nome Completo", diff --git a/public/language/he/admin/advanced/errors.json b/public/language/he/admin/advanced/errors.json index 963e68b116..546f0f1508 100644 --- a/public/language/he/admin/advanced/errors.json +++ b/public/language/he/admin/advanced/errors.json @@ -8,7 +8,7 @@ "clear-error-log": "Clear Error Log", "route": "Route", "count": "Count", - "no-routes-not-found": "Hooray! There are no routes that were not found.", + "no-routes-not-found": "Hooray! No 404 errors!", "clear404-confirm": "Are you sure you wish to clear the 404 error logs?", "clear404-success": "\"404 Not Found\" errors cleared" } \ No newline at end of file diff --git a/public/language/he/admin/general/dashboard.json b/public/language/he/admin/general/dashboard.json index 5be33f9db1..74abb83ea1 100644 --- a/public/language/he/admin/general/dashboard.json +++ b/public/language/he/admin/general/dashboard.json @@ -2,6 +2,9 @@ "forum-traffic": "Forum Traffic", "page-views": "Page Views", "unique-visitors": "Unique Visitors", + "users": "Users", + "posts": "Posts", + "topics": "Topics", "page-views-last-month": "Page views Last Month", "page-views-this-month": "Page views This Month", "page-views-last-day": "Page views in last 24 hours", @@ -20,6 +23,11 @@ "prerelease-warning": "

This is a pre-release version of NodeBB. Unintended bugs may occur.

", "notices": "Notices", + "restart-not-required": "Restart not required", + "restart-required": "Restart required", + "search-plugin-installed": "Search Plugin installed", + "search-plugin-not-installed": "Search Plugin not installed", + "search-plugin-tooltip": "Install a search plugin from the plugin page in order to activate search functionality", "control-panel": "System Control", "reload": "רענן", @@ -52,4 +60,4 @@ "graphs.unique-visitors": "Unique Visitors", "graphs.registered-users": "Registered Users", "graphs.anonymous-users": "Anonymous Users" -} \ No newline at end of file +} diff --git a/public/language/he/admin/menu.json b/public/language/he/admin/menu.json index 6a4995ea6e..985c540e8a 100644 --- a/public/language/he/admin/menu.json +++ b/public/language/he/admin/menu.json @@ -13,7 +13,6 @@ "manage/users": "Users", "manage/registration": "Registration Queue", "manage/groups": "Groups", - "manage/flags": "Flags", "manage/ip-blacklist": "IP Blacklist", "section-settings": "Settings", diff --git a/public/language/he/admin/settings/general.json b/public/language/he/admin/settings/general.json index 45a496bd80..45c0494918 100644 --- a/public/language/he/admin/settings/general.json +++ b/public/language/he/admin/settings/general.json @@ -26,5 +26,6 @@ "touch-icon.upload": "Upload", "touch-icon.help": "Recommended size and format: 192x192, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.", "outgoing-links": "Outgoing Links", - "outgoing-links.warning-page": "Use Outgoing Links Warning Page" + "outgoing-links.warning-page": "Use Outgoing Links Warning Page", + "search-default-sort-by": "Search default sort by" } \ No newline at end of file diff --git a/public/language/he/admin/settings/uploads.json b/public/language/he/admin/settings/uploads.json index 8a56c85663..35eaa5a58f 100644 --- a/public/language/he/admin/settings/uploads.json +++ b/public/language/he/admin/settings/uploads.json @@ -9,7 +9,7 @@ "allow-topic-thumbnails": "Allow users to upload topic thumbnails", "topic-thumb-size": "Topic Thumb Size", "allowed-file-extensions": "Allowed File Extensions", - "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc).\n\t\t\t\t\tAn empty list means all extensions are allowed.", + "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc). An empty list means all extensions are allowed.", "profile-avatars": "Profile Avatars", "allow-profile-image-uploads": "Allow users to upload profile images", "convert-profile-image-png": "Convert profile image uploads to PNG", @@ -25,4 +25,4 @@ "profile-covers": "Profile Covers", "default-covers": "Default Cover Images", "default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image" -} \ No newline at end of file +} diff --git a/public/language/he/notifications.json b/public/language/he/notifications.json index 134b173de0..447280cfdc 100644 --- a/public/language/he/notifications.json +++ b/public/language/he/notifications.json @@ -19,6 +19,9 @@ "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 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 פרסם תגובה ל: %2", "user_posted_to_dual": "%1 ו%2 הגיבו ל: %3", "user_posted_to_multiple": "%1 ו%2 אחרים הגיבו ל: %3", diff --git a/public/language/he/pages.json b/public/language/he/pages.json index 2ae5abf720..8832d5915a 100644 --- a/public/language/he/pages.json +++ b/public/language/he/pages.json @@ -6,7 +6,7 @@ "popular-month": "נושאים חמים החודש", "popular-alltime": "הנושאים החמים בכל הזמנים", "recent": "נושאים אחרונים", - "flagged-posts": "פוסטים מסומנים", + "flagged-content": "Flagged Content", "ip-blacklist": "IP Blacklist", "users/online": "משתמשים מחוברים", "users/latest": "משתמשים אחרונים", @@ -27,6 +27,8 @@ "group": "קבוצת %1", "chats": "הודעות פרטיות", "chat": "שלחו הודעה פרטית ל%1", + "flags": "Flags", + "flag-details": "Flag %1 Details", "account/edit": "לערוך את \"%1\"", "account/edit/password": "עורך את הסיסמה של \"%1\"", "account/edit/username": "עורך את שם המשתמש של \"%1\"", diff --git a/public/language/he/search.json b/public/language/he/search.json index 1e1a408b86..cee9f0cc9a 100644 --- a/public/language/he/search.json +++ b/public/language/he/search.json @@ -12,6 +12,7 @@ "reply-count": "כמות תגובות", "at-least": "לפחות", "at-most": "לכל היותר", + "relevance": "Relevance", "post-time": "זמן הפוסט", "newer-than": "חדש מ", "older-than": "ישן מ", diff --git a/public/language/he/topic.json b/public/language/he/topic.json index 3e07544391..e54bb502e6 100644 --- a/public/language/he/topic.json +++ b/public/language/he/topic.json @@ -13,7 +13,8 @@ "notify_me": "קבל התראה כאשר יש תגובות חדשות בנושא זה", "quote": "ציטוט", "reply": "תגובה", - "replies_to_this_post": "Replies: %1", + "replies_to_this_post": "%1 Replies", + "last_reply_time": "Last reply", "reply-as-topic": "הגב כנושא", "guest-login-reply": "התחבר כדי לפרסם תגובה", "edit": "עריכה", @@ -25,28 +26,11 @@ "link": "לינק", "share": "שתף", "tools": "כלים", - "flag": "דווח", "locked": "נעול", "pinned": "Pinned", "moved": "Moved", "bookmark_instructions": "Click here to return to the last read post in this thread.", "flag_title": "דווח על פוסט זה למנהל", - "flag_success": "התקבל דיווח על פוסט זה.", - "flag_manage_title": "Flagged post in %1", - "flag_manage_history": "Action History", - "flag_manage_no_history": "No event history to report", - "flag_manage_assignee": "Assignee", - "flag_manage_state": "State", - "flag_manage_state_open": "New/Open", - "flag_manage_state_wip": "Work in Progress", - "flag_manage_state_resolved": "Resolved", - "flag_manage_state_rejected": "Rejected", - "flag_manage_notes": "Shared Notes", - "flag_manage_update": "Update Flag Status", - "flag_manage_history_assignee": "Assigned to %1", - "flag_manage_history_state": "Updated state to %1", - "flag_manage_history_notes": "Updated flag notes", - "flag_manage_saved": "Flag Details Updated", "deleted_message": "נושא זה נמחק. רק משתמשים עם ההרשאות המתאימות יכולים לצפות בו.", "following_topic.message": "מעתה, תקבל הודעות כאשר מישהו יעלה פוסט לנושא זה.", "not_following_topic.message": "You will see this topic in the unread topics list, but you will not receive notifications when somebody posts to this topic.", @@ -131,8 +115,5 @@ "stale.warning": "הנושא בו אתה מגיב הוא דיי ישן. האם ברצונך לפתוח נושא חדש, ולהזכיר את הנושא הזה בתגובתך?", "stale.create": "צור נושא חדש", "stale.reply_anyway": "הגב לנושא זה בכל מקרה", - "link_back": "תגובה: [%1](%2)", - "spam": "ספאם", - "offensive": "פוגעני", - "custom-flag-reason": "הכנס סיבה מסמנת" + "link_back": "תגובה: [%1](%2)" } \ No newline at end of file diff --git a/public/language/he/user.json b/public/language/he/user.json index 7528b0465f..9d6e5e8c55 100644 --- a/public/language/he/user.json +++ b/public/language/he/user.json @@ -33,6 +33,7 @@ "chat": "צ'אט", "chat_with": "Continue chat with %1", "new_chat_with": "Start new chat with %1", + "flag-profile": "Flag Profile", "follow": "עקוב", "unfollow": "הפסק לעקוב", "more": "עוד", @@ -64,6 +65,8 @@ "remove_uploaded_picture": "מחק את התמונה שהועלתה", "upload_cover_picture": "העלה תמונת נושא", "remove_cover_picture_confirm": "Are you sure you want to remove the cover picture?", + "crop_picture": "Crop picture", + "upload_cropped_picture": "Crop and upload", "settings": "הגדרות", "show_email": "פרסם את כתובת האימייל שלי", "show_fullname": "הצג את שמי המלא", diff --git a/public/language/hu/admin/advanced/errors.json b/public/language/hu/admin/advanced/errors.json index 963e68b116..546f0f1508 100644 --- a/public/language/hu/admin/advanced/errors.json +++ b/public/language/hu/admin/advanced/errors.json @@ -8,7 +8,7 @@ "clear-error-log": "Clear Error Log", "route": "Route", "count": "Count", - "no-routes-not-found": "Hooray! There are no routes that were not found.", + "no-routes-not-found": "Hooray! No 404 errors!", "clear404-confirm": "Are you sure you wish to clear the 404 error logs?", "clear404-success": "\"404 Not Found\" errors cleared" } \ No newline at end of file diff --git a/public/language/hu/admin/general/dashboard.json b/public/language/hu/admin/general/dashboard.json index b82802db1b..a70dda322e 100644 --- a/public/language/hu/admin/general/dashboard.json +++ b/public/language/hu/admin/general/dashboard.json @@ -2,6 +2,9 @@ "forum-traffic": "Forum Traffic", "page-views": "Page Views", "unique-visitors": "Unique Visitors", + "users": "Users", + "posts": "Posts", + "topics": "Topics", "page-views-last-month": "Page views Last Month", "page-views-this-month": "Page views This Month", "page-views-last-day": "Page views in last 24 hours", @@ -20,6 +23,11 @@ "prerelease-warning": "

This is a pre-release version of NodeBB. Unintended bugs may occur.

", "notices": "Notices", + "restart-not-required": "Restart not required", + "restart-required": "Restart required", + "search-plugin-installed": "Search Plugin installed", + "search-plugin-not-installed": "Search Plugin not installed", + "search-plugin-tooltip": "Install a search plugin from the plugin page in order to activate search functionality", "control-panel": "System Control", "reload": "Reload", @@ -52,4 +60,4 @@ "graphs.unique-visitors": "Unique Visitors", "graphs.registered-users": "Registered Users", "graphs.anonymous-users": "Anonymous Users" -} \ No newline at end of file +} diff --git a/public/language/hu/admin/menu.json b/public/language/hu/admin/menu.json index 6a4995ea6e..985c540e8a 100644 --- a/public/language/hu/admin/menu.json +++ b/public/language/hu/admin/menu.json @@ -13,7 +13,6 @@ "manage/users": "Users", "manage/registration": "Registration Queue", "manage/groups": "Groups", - "manage/flags": "Flags", "manage/ip-blacklist": "IP Blacklist", "section-settings": "Settings", diff --git a/public/language/hu/admin/settings/general.json b/public/language/hu/admin/settings/general.json index c26740ee4f..72ecfe641f 100644 --- a/public/language/hu/admin/settings/general.json +++ b/public/language/hu/admin/settings/general.json @@ -26,5 +26,6 @@ "touch-icon.upload": "Upload", "touch-icon.help": "Recommended size and format: 192x192, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.", "outgoing-links": "Outgoing Links", - "outgoing-links.warning-page": "Use Outgoing Links Warning Page" + "outgoing-links.warning-page": "Use Outgoing Links Warning Page", + "search-default-sort-by": "Search default sort by" } \ No newline at end of file diff --git a/public/language/hu/admin/settings/uploads.json b/public/language/hu/admin/settings/uploads.json index 8a56c85663..35eaa5a58f 100644 --- a/public/language/hu/admin/settings/uploads.json +++ b/public/language/hu/admin/settings/uploads.json @@ -9,7 +9,7 @@ "allow-topic-thumbnails": "Allow users to upload topic thumbnails", "topic-thumb-size": "Topic Thumb Size", "allowed-file-extensions": "Allowed File Extensions", - "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc).\n\t\t\t\t\tAn empty list means all extensions are allowed.", + "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc). An empty list means all extensions are allowed.", "profile-avatars": "Profile Avatars", "allow-profile-image-uploads": "Allow users to upload profile images", "convert-profile-image-png": "Convert profile image uploads to PNG", @@ -25,4 +25,4 @@ "profile-covers": "Profile Covers", "default-covers": "Default Cover Images", "default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image" -} \ No newline at end of file +} diff --git a/public/language/hu/notifications.json b/public/language/hu/notifications.json index 5694137dd4..defc23b945 100644 --- a/public/language/hu/notifications.json +++ b/public/language/hu/notifications.json @@ -19,6 +19,9 @@ "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", diff --git a/public/language/hu/pages.json b/public/language/hu/pages.json index 8a5faaf35d..e3c175a2b5 100644 --- a/public/language/hu/pages.json +++ b/public/language/hu/pages.json @@ -6,7 +6,7 @@ "popular-month": "Havi népszerű témakörök", "popular-alltime": "Mindenkori legnépszerűbb témakörök", "recent": "Legfrissebb témakörök", - "flagged-posts": "Megjelölt Üzenetek", + "flagged-content": "Flagged Content", "ip-blacklist": "IP Blacklist", "users/online": "Aktiv Felhasználok", "users/latest": "Latest Users", @@ -27,6 +27,8 @@ "group": "%1 csoport", "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\"", diff --git a/public/language/hu/search.json b/public/language/hu/search.json index d0f8e04e06..c5effb3f38 100644 --- a/public/language/hu/search.json +++ b/public/language/hu/search.json @@ -12,6 +12,7 @@ "reply-count": "Válaszok száma", "at-least": "Legalább", "at-most": "Legfeljebb", + "relevance": "Relevance", "post-time": "Hozzászólás ideje", "newer-than": "Newer than", "older-than": "Older than", diff --git a/public/language/hu/topic.json b/public/language/hu/topic.json index ce2aa8b817..1a67ce9b46 100644 --- a/public/language/hu/topic.json +++ b/public/language/hu/topic.json @@ -13,7 +13,8 @@ "notify_me": "Értesítést kérek az új hozzászólásokról ebben a topikban", "quote": "Idéz", "reply": "Válasz", - "replies_to_this_post": "Replies: %1", + "replies_to_this_post": "%1 Replies", + "last_reply_time": "Last reply", "reply-as-topic": "Reply as topic", "guest-login-reply": "Log in to reply", "edit": "Szerkeszt", @@ -25,28 +26,11 @@ "link": "Link", "share": "Megosztás", "tools": "Eszközök", - "flag": "Jelentés", "locked": "Locked", "pinned": "Pinned", "moved": "Moved", "bookmark_instructions": "Click here to return to the last read post in this thread.", "flag_title": "A hozzászólás jelentése a moderátoroknál", - "flag_success": "This post has been flagged for moderation.", - "flag_manage_title": "Flagged post in %1", - "flag_manage_history": "Action History", - "flag_manage_no_history": "No event history to report", - "flag_manage_assignee": "Assignee", - "flag_manage_state": "State", - "flag_manage_state_open": "New/Open", - "flag_manage_state_wip": "Work in Progress", - "flag_manage_state_resolved": "Resolved", - "flag_manage_state_rejected": "Rejected", - "flag_manage_notes": "Shared Notes", - "flag_manage_update": "Update Flag Status", - "flag_manage_history_assignee": "Assigned to %1", - "flag_manage_history_state": "Updated state to %1", - "flag_manage_history_notes": "Updated flag notes", - "flag_manage_saved": "Flag Details Updated", "deleted_message": "This topic has been deleted. Only users with topic management privileges can see it.", "following_topic.message": "You will now be receiving notifications when somebody posts to this topic.", "not_following_topic.message": "You will see this topic in the unread topics list, but you will not receive notifications when somebody posts to this topic.", @@ -131,8 +115,5 @@ "stale.warning": "The topic you are replying to is quite old. Would you like to create a new topic instead, and reference this one in your reply?", "stale.create": "Create a new topic", "stale.reply_anyway": "Reply to this topic anyway", - "link_back": "Re: [%1](%2)", - "spam": "Spam", - "offensive": "Offensive", - "custom-flag-reason": "Enter a flagging reason" + "link_back": "Re: [%1](%2)" } \ No newline at end of file diff --git a/public/language/hu/user.json b/public/language/hu/user.json index 808dbc70e1..d0e3db3a43 100644 --- a/public/language/hu/user.json +++ b/public/language/hu/user.json @@ -33,6 +33,7 @@ "chat": "Chat", "chat_with": "Chat folytatása %1 felhasználóval", "new_chat_with": "Új chat indítása %1 felhasználóval", + "flag-profile": "Flag Profile", "follow": "Követés", "unfollow": "Nem követem", "more": "Több", @@ -64,6 +65,8 @@ "remove_uploaded_picture": "Feltöltött kép eltávolítása", "upload_cover_picture": "Címlap kép feltöltése", "remove_cover_picture_confirm": "Are you sure you want to remove the cover picture?", + "crop_picture": "Crop picture", + "upload_cropped_picture": "Crop and upload", "settings": "Beállítások", "show_email": "E-mail címem mutatása", "show_fullname": "A teljes nevem mutatása", diff --git a/public/language/id/admin/advanced/errors.json b/public/language/id/admin/advanced/errors.json index 963e68b116..546f0f1508 100644 --- a/public/language/id/admin/advanced/errors.json +++ b/public/language/id/admin/advanced/errors.json @@ -8,7 +8,7 @@ "clear-error-log": "Clear Error Log", "route": "Route", "count": "Count", - "no-routes-not-found": "Hooray! There are no routes that were not found.", + "no-routes-not-found": "Hooray! No 404 errors!", "clear404-confirm": "Are you sure you wish to clear the 404 error logs?", "clear404-success": "\"404 Not Found\" errors cleared" } \ No newline at end of file diff --git a/public/language/id/admin/general/dashboard.json b/public/language/id/admin/general/dashboard.json index b82802db1b..a70dda322e 100644 --- a/public/language/id/admin/general/dashboard.json +++ b/public/language/id/admin/general/dashboard.json @@ -2,6 +2,9 @@ "forum-traffic": "Forum Traffic", "page-views": "Page Views", "unique-visitors": "Unique Visitors", + "users": "Users", + "posts": "Posts", + "topics": "Topics", "page-views-last-month": "Page views Last Month", "page-views-this-month": "Page views This Month", "page-views-last-day": "Page views in last 24 hours", @@ -20,6 +23,11 @@ "prerelease-warning": "

This is a pre-release version of NodeBB. Unintended bugs may occur.

", "notices": "Notices", + "restart-not-required": "Restart not required", + "restart-required": "Restart required", + "search-plugin-installed": "Search Plugin installed", + "search-plugin-not-installed": "Search Plugin not installed", + "search-plugin-tooltip": "Install a search plugin from the plugin page in order to activate search functionality", "control-panel": "System Control", "reload": "Reload", @@ -52,4 +60,4 @@ "graphs.unique-visitors": "Unique Visitors", "graphs.registered-users": "Registered Users", "graphs.anonymous-users": "Anonymous Users" -} \ No newline at end of file +} diff --git a/public/language/id/admin/menu.json b/public/language/id/admin/menu.json index 6a4995ea6e..985c540e8a 100644 --- a/public/language/id/admin/menu.json +++ b/public/language/id/admin/menu.json @@ -13,7 +13,6 @@ "manage/users": "Users", "manage/registration": "Registration Queue", "manage/groups": "Groups", - "manage/flags": "Flags", "manage/ip-blacklist": "IP Blacklist", "section-settings": "Settings", diff --git a/public/language/id/admin/settings/general.json b/public/language/id/admin/settings/general.json index c26740ee4f..72ecfe641f 100644 --- a/public/language/id/admin/settings/general.json +++ b/public/language/id/admin/settings/general.json @@ -26,5 +26,6 @@ "touch-icon.upload": "Upload", "touch-icon.help": "Recommended size and format: 192x192, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.", "outgoing-links": "Outgoing Links", - "outgoing-links.warning-page": "Use Outgoing Links Warning Page" + "outgoing-links.warning-page": "Use Outgoing Links Warning Page", + "search-default-sort-by": "Search default sort by" } \ No newline at end of file diff --git a/public/language/id/admin/settings/uploads.json b/public/language/id/admin/settings/uploads.json index 8a56c85663..35eaa5a58f 100644 --- a/public/language/id/admin/settings/uploads.json +++ b/public/language/id/admin/settings/uploads.json @@ -9,7 +9,7 @@ "allow-topic-thumbnails": "Allow users to upload topic thumbnails", "topic-thumb-size": "Topic Thumb Size", "allowed-file-extensions": "Allowed File Extensions", - "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc).\n\t\t\t\t\tAn empty list means all extensions are allowed.", + "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc). An empty list means all extensions are allowed.", "profile-avatars": "Profile Avatars", "allow-profile-image-uploads": "Allow users to upload profile images", "convert-profile-image-png": "Convert profile image uploads to PNG", @@ -25,4 +25,4 @@ "profile-covers": "Profile Covers", "default-covers": "Default Cover Images", "default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image" -} \ No newline at end of file +} diff --git a/public/language/id/notifications.json b/public/language/id/notifications.json index f0d1954715..d68159db2d 100644 --- a/public/language/id/notifications.json +++ b/public/language/id/notifications.json @@ -19,6 +19,9 @@ "user_flagged_post_in": "%1 menandai sebuah posting di %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 telah mengirim sebuah balasan kepada: %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", diff --git a/public/language/id/pages.json b/public/language/id/pages.json index b8aa021b71..e3b340e0de 100644 --- a/public/language/id/pages.json +++ b/public/language/id/pages.json @@ -6,7 +6,7 @@ "popular-month": "Popular topics this month", "popular-alltime": "All time popular topics", "recent": "Topik Terkini", - "flagged-posts": "Flagged Posts", + "flagged-content": "Flagged Content", "ip-blacklist": "IP Blacklist", "users/online": "Online Users", "users/latest": "Latest Users", @@ -27,6 +27,8 @@ "group": "%1 group", "chats": "Chats", "chat": "Chatting with %1", + "flags": "Flags", + "flag-details": "Flag %1 Details", "account/edit": "Editing \"%1\"", "account/edit/password": "Editing password of \"%1\"", "account/edit/username": "Editing username of \"%1\"", diff --git a/public/language/id/search.json b/public/language/id/search.json index fd06095e01..f24679fd8a 100644 --- a/public/language/id/search.json +++ b/public/language/id/search.json @@ -12,6 +12,7 @@ "reply-count": "Reply Count", "at-least": "At least", "at-most": "At most", + "relevance": "Relevance", "post-time": "Post time", "newer-than": "Newer than", "older-than": "Older than", diff --git a/public/language/id/topic.json b/public/language/id/topic.json index d12a3c81d5..abb48888eb 100644 --- a/public/language/id/topic.json +++ b/public/language/id/topic.json @@ -13,7 +13,8 @@ "notify_me": "Beritahukan balasan baru untuk topik ini", "quote": "Kutip", "reply": "Balas", - "replies_to_this_post": "Replies: %1", + "replies_to_this_post": "%1 Replies", + "last_reply_time": "Last reply", "reply-as-topic": "Reply as topic", "guest-login-reply": "Log in untuk membalas", "edit": "Ubah", @@ -25,28 +26,11 @@ "link": "Tautan", "share": "Bagikan", "tools": "Perangkat", - "flag": "Tandai", "locked": "Terkunci", "pinned": "Pinned", "moved": "Moved", "bookmark_instructions": "Click here to return to the last read post in this thread.", "flag_title": "Tandai posting ini untuk moderasi", - "flag_success": "Posting ini telah ditandai untuk moderasi", - "flag_manage_title": "Flagged post in %1", - "flag_manage_history": "Action History", - "flag_manage_no_history": "No event history to report", - "flag_manage_assignee": "Assignee", - "flag_manage_state": "State", - "flag_manage_state_open": "New/Open", - "flag_manage_state_wip": "Work in Progress", - "flag_manage_state_resolved": "Resolved", - "flag_manage_state_rejected": "Rejected", - "flag_manage_notes": "Shared Notes", - "flag_manage_update": "Update Flag Status", - "flag_manage_history_assignee": "Assigned to %1", - "flag_manage_history_state": "Updated state to %1", - "flag_manage_history_notes": "Updated flag notes", - "flag_manage_saved": "Flag Details Updated", "deleted_message": "Topik ini telah dihapus. Hanya pengguna dengan hak manajemen topik yang dapat melihatnya.", "following_topic.message": "Saat ini kamu akan menerima pemberitahuan saat seseorang membuat posting di dalam topik ini.", "not_following_topic.message": "You will see this topic in the unread topics list, but you will not receive notifications when somebody posts to this topic.", @@ -131,8 +115,5 @@ "stale.warning": "The topic you are replying to is quite old. Would you like to create a new topic instead, and reference this one in your reply?", "stale.create": "Create a new topic", "stale.reply_anyway": "Reply to this topic anyway", - "link_back": "Re: [%1](%2)", - "spam": "Spam", - "offensive": "Offensive", - "custom-flag-reason": "Enter a flagging reason" + "link_back": "Re: [%1](%2)" } \ No newline at end of file diff --git a/public/language/id/user.json b/public/language/id/user.json index 1334b53d8f..bc5bcfd0f8 100644 --- a/public/language/id/user.json +++ b/public/language/id/user.json @@ -33,6 +33,7 @@ "chat": "Percakapan", "chat_with": "Continue chat with %1", "new_chat_with": "Start new chat with %1", + "flag-profile": "Flag Profile", "follow": "Ikuti", "unfollow": "Tinggalkan", "more": "More", @@ -64,6 +65,8 @@ "remove_uploaded_picture": "Remove Uploaded Picture", "upload_cover_picture": "Upload cover picture", "remove_cover_picture_confirm": "Are you sure you want to remove the cover picture?", + "crop_picture": "Crop picture", + "upload_cropped_picture": "Crop and upload", "settings": "Pengaturan", "show_email": "Tampilkan Email Saya", "show_fullname": "Tampilkan Nama Lengkap Saya", diff --git a/public/language/it/admin/advanced/errors.json b/public/language/it/admin/advanced/errors.json index 963e68b116..546f0f1508 100644 --- a/public/language/it/admin/advanced/errors.json +++ b/public/language/it/admin/advanced/errors.json @@ -8,7 +8,7 @@ "clear-error-log": "Clear Error Log", "route": "Route", "count": "Count", - "no-routes-not-found": "Hooray! There are no routes that were not found.", + "no-routes-not-found": "Hooray! No 404 errors!", "clear404-confirm": "Are you sure you wish to clear the 404 error logs?", "clear404-success": "\"404 Not Found\" errors cleared" } \ No newline at end of file diff --git a/public/language/it/admin/general/dashboard.json b/public/language/it/admin/general/dashboard.json index b82802db1b..a70dda322e 100644 --- a/public/language/it/admin/general/dashboard.json +++ b/public/language/it/admin/general/dashboard.json @@ -2,6 +2,9 @@ "forum-traffic": "Forum Traffic", "page-views": "Page Views", "unique-visitors": "Unique Visitors", + "users": "Users", + "posts": "Posts", + "topics": "Topics", "page-views-last-month": "Page views Last Month", "page-views-this-month": "Page views This Month", "page-views-last-day": "Page views in last 24 hours", @@ -20,6 +23,11 @@ "prerelease-warning": "

This is a pre-release version of NodeBB. Unintended bugs may occur.

", "notices": "Notices", + "restart-not-required": "Restart not required", + "restart-required": "Restart required", + "search-plugin-installed": "Search Plugin installed", + "search-plugin-not-installed": "Search Plugin not installed", + "search-plugin-tooltip": "Install a search plugin from the plugin page in order to activate search functionality", "control-panel": "System Control", "reload": "Reload", @@ -52,4 +60,4 @@ "graphs.unique-visitors": "Unique Visitors", "graphs.registered-users": "Registered Users", "graphs.anonymous-users": "Anonymous Users" -} \ No newline at end of file +} diff --git a/public/language/it/admin/menu.json b/public/language/it/admin/menu.json index 6a4995ea6e..985c540e8a 100644 --- a/public/language/it/admin/menu.json +++ b/public/language/it/admin/menu.json @@ -13,7 +13,6 @@ "manage/users": "Users", "manage/registration": "Registration Queue", "manage/groups": "Groups", - "manage/flags": "Flags", "manage/ip-blacklist": "IP Blacklist", "section-settings": "Settings", diff --git a/public/language/it/admin/settings/general.json b/public/language/it/admin/settings/general.json index c26740ee4f..72ecfe641f 100644 --- a/public/language/it/admin/settings/general.json +++ b/public/language/it/admin/settings/general.json @@ -26,5 +26,6 @@ "touch-icon.upload": "Upload", "touch-icon.help": "Recommended size and format: 192x192, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.", "outgoing-links": "Outgoing Links", - "outgoing-links.warning-page": "Use Outgoing Links Warning Page" + "outgoing-links.warning-page": "Use Outgoing Links Warning Page", + "search-default-sort-by": "Search default sort by" } \ No newline at end of file diff --git a/public/language/it/admin/settings/uploads.json b/public/language/it/admin/settings/uploads.json index 8a56c85663..35eaa5a58f 100644 --- a/public/language/it/admin/settings/uploads.json +++ b/public/language/it/admin/settings/uploads.json @@ -9,7 +9,7 @@ "allow-topic-thumbnails": "Allow users to upload topic thumbnails", "topic-thumb-size": "Topic Thumb Size", "allowed-file-extensions": "Allowed File Extensions", - "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc).\n\t\t\t\t\tAn empty list means all extensions are allowed.", + "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc). An empty list means all extensions are allowed.", "profile-avatars": "Profile Avatars", "allow-profile-image-uploads": "Allow users to upload profile images", "convert-profile-image-png": "Convert profile image uploads to PNG", @@ -25,4 +25,4 @@ "profile-covers": "Profile Covers", "default-covers": "Default Cover Images", "default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image" -} \ No newline at end of file +} diff --git a/public/language/it/notifications.json b/public/language/it/notifications.json index 82fa25deec..a3f72fae22 100644 --- a/public/language/it/notifications.json +++ b/public/language/it/notifications.json @@ -19,6 +19,9 @@ "user_flagged_post_in": "%1 ha segnalato un post in %2", "user_flagged_post_in_dual": "%1 e %2 hanno segnalato un post in %3", "user_flagged_post_in_multiple": "%1 ed altri %2 hanno segnalato un 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 ha postato una risposta a: %2", "user_posted_to_dual": "%1 e %2 hanno postato una risposta su: %3", "user_posted_to_multiple": "%1 ed altri %2 hanno postato una risposta su: %3", diff --git a/public/language/it/pages.json b/public/language/it/pages.json index 465cdd5b05..818fca88e0 100644 --- a/public/language/it/pages.json +++ b/public/language/it/pages.json @@ -6,7 +6,7 @@ "popular-month": "Discussioni popolari questo mese", "popular-alltime": "Discussioni più popolari di sempre", "recent": "Discussioni Recenti", - "flagged-posts": "Post Segnalati", + "flagged-content": "Flagged Content", "ip-blacklist": "Lista nera degli IP", "users/online": "Utenti Online", "users/latest": "Ultimi Utenti", @@ -27,6 +27,8 @@ "group": "Gruppo %1", "chats": "Chat", "chat": "In chat con %1", + "flags": "Flags", + "flag-details": "Flag %1 Details", "account/edit": "Modificando \"%1\"", "account/edit/password": "Modificando la password di \"%1\"", "account/edit/username": "Modificando il nome utente di \"%1\"", diff --git a/public/language/it/search.json b/public/language/it/search.json index 622fc49699..980e2c28ba 100644 --- a/public/language/it/search.json +++ b/public/language/it/search.json @@ -12,6 +12,7 @@ "reply-count": "Numero Risposte", "at-least": "Almeno", "at-most": "Al massimo", + "relevance": "Relevance", "post-time": "Ora invio", "newer-than": "Più nuovi di", "older-than": "Più vecchi di", diff --git a/public/language/it/topic.json b/public/language/it/topic.json index a33a961a84..c7c5bfbaca 100644 --- a/public/language/it/topic.json +++ b/public/language/it/topic.json @@ -13,7 +13,8 @@ "notify_me": "Ricevi notifiche di nuove risposte in questa discussione", "quote": "Cita", "reply": "Rispondi", - "replies_to_this_post": "Risposte: %1", + "replies_to_this_post": "%1 Replies", + "last_reply_time": "Last reply", "reply-as-topic": "Topic risposta", "guest-login-reply": "Effettua il Log in per rispondere", "edit": "Modifica", @@ -25,28 +26,11 @@ "link": "Collegamento", "share": "Condividi", "tools": "Strumenti", - "flag": "Segnala", "locked": "Bloccato", "pinned": "Appeso", "moved": "Spostato", "bookmark_instructions": "Clicca qui per tornare all'ultimo post letto in questa discussione.", "flag_title": "Segnala questo post per la moderazione", - "flag_success": "Questo post è stato contrassegnato per la moderazione.", - "flag_manage_title": "Flagged post in %1", - "flag_manage_history": "Action History", - "flag_manage_no_history": "No event history to report", - "flag_manage_assignee": "Assignee", - "flag_manage_state": "State", - "flag_manage_state_open": "New/Open", - "flag_manage_state_wip": "Work in Progress", - "flag_manage_state_resolved": "Resolved", - "flag_manage_state_rejected": "Rejected", - "flag_manage_notes": "Shared Notes", - "flag_manage_update": "Update Flag Status", - "flag_manage_history_assignee": "Assigned to %1", - "flag_manage_history_state": "Updated state to %1", - "flag_manage_history_notes": "Updated flag notes", - "flag_manage_saved": "Flag Details Updated", "deleted_message": "Questa discussione è stata cancellata. Solo gli utenti con diritti di gestione possono vederla.", "following_topic.message": "Da ora riceverai notifiche quando qualcuno posterà in questa discussione.", "not_following_topic.message": "Vedrai questa discussione nella lista delle discussioni non lette, ma non riceverai notifiche quando qualcuno risponde a questa discussione.", @@ -131,8 +115,5 @@ "stale.warning": "Il topic al quale stai rispondendo è abbastanza vecchio. Vorresti piuttosto creare un nuovo topic in riferimento a questo nella tua risposta?", "stale.create": "Crea una nuova discussione", "stale.reply_anyway": "Rispondi comunque a questa discussione", - "link_back": "Re: [%1](%2)", - "spam": "Spam", - "offensive": "Offensivo", - "custom-flag-reason": "Inserisci il motivo per flaggare" + "link_back": "Re: [%1](%2)" } \ No newline at end of file diff --git a/public/language/it/user.json b/public/language/it/user.json index 10a35fa433..1ff23922ac 100644 --- a/public/language/it/user.json +++ b/public/language/it/user.json @@ -33,6 +33,7 @@ "chat": "Chat", "chat_with": "Continua la chat con %1", "new_chat_with": "Inizia una nuova chat con %1", + "flag-profile": "Flag Profile", "follow": "Segui", "unfollow": "Smetti di seguire", "more": "Altro", @@ -64,6 +65,8 @@ "remove_uploaded_picture": "Elimina foto caricata", "upload_cover_picture": "Carica immagine di copertina", "remove_cover_picture_confirm": "Sei sicuro di voler eliminare l'immagine di copertina?", + "crop_picture": "Crop picture", + "upload_cropped_picture": "Crop and upload", "settings": "Impostazioni", "show_email": "Mostra la mia Email", "show_fullname": "Mostra il mio nome completo", diff --git a/public/language/ja/admin/advanced/errors.json b/public/language/ja/admin/advanced/errors.json index 9e27641a9f..7ca0092ff5 100644 --- a/public/language/ja/admin/advanced/errors.json +++ b/public/language/ja/admin/advanced/errors.json @@ -8,7 +8,7 @@ "clear-error-log": "エラーログの消去", "route": "ルート", "count": "カウント", - "no-routes-not-found": "やりましたね!見つからなかったルートはありませんでした。", + "no-routes-not-found": "ストップ!No 404 エラーです!", "clear404-confirm": "本当に404エラーログを消去してもよろしいですか?", "clear404-success": "\"404 Not Found\"エラーは消去されました" } \ No newline at end of file diff --git a/public/language/ja/admin/extend/rewards.json b/public/language/ja/admin/extend/rewards.json index da6f388a12..3023baeba3 100644 --- a/public/language/ja/admin/extend/rewards.json +++ b/public/language/ja/admin/extend/rewards.json @@ -1,17 +1,17 @@ { "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", + "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!", - "alert.save-success": "Successfully saved rewards" + "alert.delete-success": "報酬を削除しました", + "alert.no-inputs-found": "違法報酬 - 入力が見つかりません!", + "alert.save-success": "報酬を保存しました" } \ No newline at end of file diff --git a/public/language/ja/admin/extend/widgets.json b/public/language/ja/admin/extend/widgets.json index 387dfca92f..26df43c011 100644 --- a/public/language/ja/admin/extend/widgets.json +++ b/public/language/ja/admin/extend/widgets.json @@ -1,19 +1,19 @@ { "available": "利用可能なウィジェット", - "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": "Available Containers", - "containers.explanation": "Drag and drop on top of any active widget", - "containers.none": "None", - "container.well": "Well", - "container.jumbotron": "Jumbotron", - "container.panel": "Panel", - "container.panel-header": "Panel Header", - "container.panel-body": "Panel Body", - "container.alert": "Alert", + "explanation": "ドロップダウンメニューからウィジェットを選択し、左のテンプレートのウィジェットエリアにドラッグ&ドロップします。", + "none-installed": "ウィジェットがありません!必須のウィジェットプラグインをプラグインのコントロールパネルで有効にしてください。", + "containers.available": "利用可能なコンテナ", + "containers.explanation": "アクティブなウィジェットの上にドラッグアンドドロップしてください", + "containers.none": "無い", + "container.well": "十分", + "container.jumbotron": "ジャンボトロン", + "container.panel": "パネル", + "container.panel-header": "パネルヘッダー", + "container.panel-body": "パネル本体", + "container.alert": "警告", - "alert.confirm-delete": "Are you sure you wish to delete this widget?", - "alert.updated": "Widgets Updated", - "alert.update-success": "Successfully updated widgets" + "alert.confirm-delete": "このウィジェットを削除してもよろしいですか?", + "alert.updated": "ウィジェットが更新されました。", + "alert.update-success": "ウィジェットを保存しました" } \ No newline at end of file diff --git a/public/language/ja/admin/general/dashboard.json b/public/language/ja/admin/general/dashboard.json index 6922b81259..f1980545b9 100644 --- a/public/language/ja/admin/general/dashboard.json +++ b/public/language/ja/admin/general/dashboard.json @@ -1,55 +1,63 @@ { "forum-traffic": "フォーラムのトラフィック", "page-views": "ページビュー", - "unique-visitors": "Unique Visitors", - "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", + "unique-visitors": "ユニークな訪問者", + "users": "ユーザー", + "posts": "投稿", + "topics": "スレッド", + "page-views-last-month": "先月のページビュー数", + "page-views-this-month": "今月のページビュー数", + "page-views-last-day": "過去24時間のページビュー", - "stats.day": "Day", - "stats.week": "Week", - "stats.month": "Month", - "stats.all": "All Time", + "stats.day": "日", + "stats.week": "週", + "stats.month": "月", + "stats.all": "全て", - "updates": "Updates", - "running-version": "You are running NodeBB v%1.", - "keep-updated": "Always make sure that your NodeBB is up to date for the latest security patches and bug fixes.", - "up-to-date": "

You are up-to-date

", - "upgrade-available": "

A new version (v%1) has been released. Consider upgrading your NodeBB.

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

This is an outdated pre-release version of NodeBB. A new version (v%1) has been released. Consider upgrading your NodeBB.

", - "prerelease-warning": "

This is a pre-release version of NodeBB. Unintended bugs may occur.

", + "updates": "更新", + "running-version": "NodeBB v %1 を実行しています。", + "keep-updated": "常に最新のセキュリティパッチとバグ修正のためにNodeBBが最新であることを確認してください。", + "up-to-date": "

あなたは最新の状態です。 ", + "upgrade-available": "

新しいバージョン (v%1) がリリースされました。NodeBBのアップグレードを検討してください。

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

これはNodeBBの旧リリースのバージョンです。新しいバージョン(v%1)がリリースされました。 NodeBBのアップグレードを検討してください。", + "prerelease-warning": "

これはNodeBBのプレリリース版です。意図しないバグが発生することがあります。

", - "notices": "Notices", + "notices": "通知", + "restart-not-required": "再起動は必要ありません", + "restart-required": "再起動が必要です", + "search-plugin-installed": "検索プラグインのインストール", + "search-plugin-not-installed": "検索プラグインがインストールされていません", + "search-plugin-tooltip": "検索機能を有効にするには、プラグインページから検索プラグインをインストールしてください", - "control-panel": "System Control", - "reload": "Reload", - "restart": "Restart", - "restart-warning": "Reloading or Restarting your NodeBB will drop all existing connections for a few seconds.", - "maintenance-mode": "Maintenance Mode", - "maintenance-mode-title": "Click here to set up maintenance mode for NodeBB", - "realtime-chart-updates": "Realtime Chart Updates", + "control-panel": "システムコントロール", + "reload": "再読み込み", + "restart": "再起動", + "restart-warning": "NodeBBを再読み込み、または再起動すると、数秒間既存の接続がすべて破棄されます。", + "maintenance-mode": "メンテナンスモード", + "maintenance-mode-title": "NodeBBのメンテナンスモードを設定するには、ここをクリックしてください", + "realtime-chart-updates": "リアルタイムチャートの更新", - "active-users": "Active Users", - "active-users.users": "Users", - "active-users.guests": "Guests", - "active-users.total": "Total", - "active-users.connections": "Connections", + "active-users": "アクティブユーザー", + "active-users.users": "ユーザー", + "active-users.guests": "ゲスト", + "active-users.total": "総合", + "active-users.connections": "接続", - "anonymous-registered-users": "Anonymous vs Registered Users", - "anonymous": "Anonymous", - "registered": "Registered", + "anonymous-registered-users": "匿名 vs 登録ユーザー", + "anonymous": "匿名", + "registered": "登録数", - "user-presence": "User Presence", - "on-categories": "On categories list", - "reading-posts": "Reading posts", - "browsing-topics": "Browsing topics", - "recent": "Recent", - "unread": "Unread", + "user-presence": "ユーザープレゼンス", + "on-categories": "カテゴリ一覧", + "reading-posts": "記事を読む", + "browsing-topics": "スレッドを閲覧", + "recent": "最近", + "unread": "未読", - "high-presence-topics": "High Presence Topics", + "high-presence-topics": "ハイプレゼンススレッド", - "graphs.page-views": "Page Views", - "graphs.unique-visitors": "Unique Visitors", - "graphs.registered-users": "Registered Users", - "graphs.anonymous-users": "Anonymous Users" -} \ No newline at end of file + "graphs.page-views": "ページビュー", + "graphs.unique-visitors": "ユニークな訪問者", + "graphs.registered-users": "登録したユーザー", + "graphs.anonymous-users": "匿名ユーザー" +} diff --git a/public/language/ja/admin/general/homepage.json b/public/language/ja/admin/general/homepage.json index 1f9a27aa8b..07ee7b3e7e 100644 --- a/public/language/ja/admin/general/homepage.json +++ b/public/language/ja/admin/general/homepage.json @@ -1,7 +1,7 @@ { "home-page": "ホームページ", - "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": "ユーザーがあなたのフォーラムのルートURLに移動するときに表示されるページを選択します。", + "home-page-route": "ホームページのルート", + "custom-route": "カスタムルート", + "allow-user-home-pages": "ユーザーホームページを有効にする" } \ No newline at end of file diff --git a/public/language/ja/admin/general/languages.json b/public/language/ja/admin/general/languages.json index 9a6a4cf7e8..1d17c27bee 100644 --- a/public/language/ja/admin/general/languages.json +++ b/public/language/ja/admin/general/languages.json @@ -1,5 +1,5 @@ { "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" + "description": "デフォルトの言語は、フォーラムにアクセスしているすべてのユーザーの言語表示を決定します。
個々のユーザーは、アカウント設定ページでデフォルトの言語を上書きできます。", + "default-language": "デフォルトの言語" } \ No newline at end of file diff --git a/public/language/ja/admin/general/navigation.json b/public/language/ja/admin/general/navigation.json index 102fd655c6..60aeb2a5c5 100644 --- a/public/language/ja/admin/general/navigation.json +++ b/public/language/ja/admin/general/navigation.json @@ -3,25 +3,25 @@ "change-icon": "変更", "route": "ルート:", "tooltip": "ツールチップ:", - "text": "Text:", - "text-class": "Text Class: optional", - "id": "ID: optional", + "text": "テキスト:", + "text-class": " テキストのClass:任意", + "id": "ID: 任意", - "properties": "Properties:", - "only-admins": "Only display to Admins", - "only-global-mods-and-admins": "Only display to Global Moderators and Admins", - "only-logged-in": "Only display to logged in users", - "open-new-window": "Open in a new window", + "properties": "プロパティ:", + "only-admins": "管理者にのみ表示する", + "only-global-mods-and-admins": "グローバルモデレーターおよび管理者のみに表示", + "only-logged-in": "ログインしたユーザーのみに表示", + "open-new-window": "新しいウィンドウで開く", - "installed-plugins-required": "Installed Plugins Required:", - "search-plugin": "Search plugin", + "installed-plugins-required": "インストール済みのプラグインが必要です:", + "search-plugin": "検索プラグイン", - "btn.delete": "Delete", - "btn.disable": "Disable", - "btn.enable": "Enable", + "btn.delete": "削除", + "btn.disable": "無効", + "btn.enable": "有効", - "available-menu-items": "Available Menu Items", - "custom-route": "Custom Route", - "core": "core", - "plugin": "plugin" + "available-menu-items": "利用可能なメニューアイテム", + "custom-route": "カスタムルート", + "core": "コア", + "plugin": "プラグイン" } \ No newline at end of file diff --git a/public/language/ja/admin/manage/categories.json b/public/language/ja/admin/manage/categories.json index eafd994f76..03a889ab0b 100644 --- a/public/language/ja/admin/manage/categories.json +++ b/public/language/ja/admin/manage/categories.json @@ -1,68 +1,68 @@ { - "settings": "カテゴリー設定", + "settings": "カテゴリ設定", "privileges": "特権", - "name": "カテゴリー名", - "description": "Category Description", - "bg-color": "Background Colour", - "text-color": "Text Colour", - "bg-image-size": "Background Image Size", - "custom-class": "Custom Class", - "num-recent-replies": "# of Recent Replies", - "ext-link": "External Link", - "upload-image": "Upload Image", - "delete-image": "Remove", - "category-image": "Category Image", - "parent-category": "Parent Category", - "optional-parent-category": "(Optional) Parent Category", - "parent-category-none": "(None)", - "copy-settings": "Copy Settings From", - "optional-clone-settings": "(Optional) Clone Settings From Category", - "purge": "Purge Category", + "name": "カテゴリ名", + "description": "カテゴリの説明", + "bg-color": "背景色", + "text-color": "テキストカラー", + "bg-image-size": "背景画像サイズ", + "custom-class": "カスタムClass", + "num-recent-replies": "# 最近の返信数", + "ext-link": "外部リンク", + "upload-image": "画像をアップロード", + "delete-image": "削除", + "category-image": "カテゴリ画像", + "parent-category": "親カテゴリ", + "optional-parent-category": "(任意)親カテゴリ", + "parent-category-none": "(無い)", + "copy-settings": "設定をコピー", + "optional-clone-settings": "カテゴリからのクローン設定(任意)", + "purge": "カテゴリを切り離す", - "enable": "Enable", - "disable": "Disable", - "edit": "Edit", + "enable": "有効", + "disable": "無効", + "edit": "編集", - "select-category": "Select Category", - "set-parent-category": "Set Parent Category", + "select-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.", - "privileges.warning": "Note: Privilege settings take effect immediately. It is not necessary to save the category after adjusting these settings.", - "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.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.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.", + "privileges.description": "このセクションでは、このカテゴリのアクセス制御権限を設定できます。権限は、ユーザー単位またはグループ単位で付与できます。新しいユーザーをこのテーブルに追加するには、以下のフォームで検索します。", + "privileges.warning": ":特権の設定はすぐに有効になります。これらの設定を調整した後は、カテゴリを保存する必要はありません。", + "privileges.section-viewing": "特権の表示", + "privileges.section-posting": "権限の譲渡", + "privileges.section-moderation": "モデレート特権", + "privileges.section-user": "ユーザー", + "privileges.search-user": "ユーザーを追加", + "privileges.no-users": "このカテゴリにはユーザー固有の権限はありません。", + "privileges.section-group": "グループ", + "privileges.group-private": "このグループはプライベートです", + "privileges.search-group": "グループを追加", + "privileges.copy-to-children": "子要素にコピーする", + "privileges.copy-from-category": "カテゴリからのコピー", + "privileges.inherit": "登録済ユーザーグループに特定の権限が与えられている場合、他のすべてのグループはたとえ明示的に定義/検査されていなくても暗黙の特権があります。すべてのユーザーは登録済ユーザーのユーザーグループの一部で、この暗黙の特権が表示されるため、追加グループの特権を明示的に付与する必要はありません。", - "analytics.back": "Back to Categories List", - "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", + "analytics.back": "カテゴリ一覧に戻る", + "analytics.title": "カテゴリ\"%1\"のアナリティクス", + "analytics.pageviews-hourly": "図 1 –このカテゴリの時間別ページビュー", + "analytics.pageviews-daily": "図2 &ndash;このカテゴリの日ごとのページビュー数", + "analytics.topics-daily": "図3 &ndash;このカテゴリで作成された日別のスレッド", + "analytics.posts-daily": "図4 &ndash;このカテゴリで作成された日ごとの投稿", - "alert.created": "Created", - "alert.create-success": "Category successfully created!", - "alert.none-active": "You have no active categories.", - "alert.create": "Create a Category", - "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!", - "alert.copy-success": "Settings Copied!", - "alert.set-parent-category": "Set Parent Category", - "alert.updated": "Updated Categories", - "alert.updated-success": "Category IDs %1 successfully updated.", - "alert.upload-image": "Upload category image", - "alert.find-user": "Find a User", - "alert.user-search": "Search for a user here...", - "alert.find-group": "Find a Group", - "alert.group-search": "Search for a group here..." + "alert.created": "作成されました", + "alert.create-success": "カテゴリが正常に作成されました!", + "alert.none-active": "アクティブなカテゴリがありません。", + "alert.create": "カテゴリを作成", + "alert.confirm-moderate": "このユーザーグループに管理権限を付与してもよろしいですか?このグループは一般公開されており、任意のユーザーが自由に参加できます。", + "alert.confirm-purge": "

本当にこのカテゴリ \"%1\"を切り離しますか?

警告!このカテゴリのすべてのスレッドと投稿が削除されます。

カテゴリをパージすると、すべてのスレッドと投稿が削除され、データベースからカテゴリが削除されます。一時的にカテゴリを削除する場合は、代わりにカテゴリを無効にすることをおすすめします。

", + "alert.purge-success": "カテゴリが切り離されました!", + "alert.copy-success": "設定をコピーしました。", + "alert.set-parent-category": "親カテゴリとして設定", + "alert.updated": "カテゴリが更新されました", + "alert.updated-success": "カテゴリID%1が正常に更新されました。", + "alert.upload-image": "カテゴリ画像をアップロード", + "alert.find-user": "ユーザーの検索", + "alert.user-search": "ここでユーザーを検索...", + "alert.find-group": "グループを探す", + "alert.group-search": "ここでグループを検索する..." } \ No newline at end of file diff --git a/public/language/ja/admin/manage/flags.json b/public/language/ja/admin/manage/flags.json index 00a12dc4b5..0b127a26ca 100644 --- a/public/language/ja/admin/manage/flags.json +++ b/public/language/ja/admin/manage/flags.json @@ -2,18 +2,18 @@ "daily": "日付フラッグ", "by-user": "ユーザーからのフラグ", "by-user-search": "フラグを付けたユーザーを検索", - "category": "Category", - "sort-by": "Sort By", - "sort-by.most-flags": "Most Flags", - "sort-by.most-recent": "Most Recent", - "search": "Search", - "dismiss-all": "Dismiss All", - "none-flagged": "No flagged posts!", - "posted-in": "Posted in %1", - "read-more": "Read More", - "flagged-x-times": "This post has been flagged %1 time(s):", - "dismiss": "Dismiss this Flag", - "delete-post": "Delete the Post", + "category": "カテゴリ", + "sort-by": "並び順", + "sort-by.most-flags": "最も多いフラグ", + "sort-by.most-recent": "最も新しい", + "search": "検索", + "dismiss-all": "すべてを却下する", + "none-flagged": "フラグの立った投稿はありません!", + "posted-in": "%1に投稿されました", + "read-more": "続きを読む", + "flagged-x-times": "この投稿には%1回のフラグが設定されています(s):", + "dismiss": "このフラグを却下する", + "delete-post": "投稿を削除", - "alerts.confirm-delete-post": "Do you really want to delete this post?" + "alerts.confirm-delete-post": "本当にこの投稿を削除しますか?" } \ No newline at end of file diff --git a/public/language/ja/admin/manage/groups.json b/public/language/ja/admin/manage/groups.json index 90954ffa67..56aaeaa1d4 100644 --- a/public/language/ja/admin/manage/groups.json +++ b/public/language/ja/admin/manage/groups.json @@ -3,32 +3,32 @@ "description": "グループの説明", "system": "システムグループ", "edit": "編集", - "search-placeholder": "Search", - "create": "Create Group", - "description-placeholder": "A short description about your group", - "create-button": "Create", + "search-placeholder": "検索", + "create": "グループを作成", + "description-placeholder": "あなたのグループについての簡単な説明", + "create-button": "作成", - "alerts.create-failure": "Uh-Oh

There was a problem creating your group. Please try again later!

", - "alerts.confirm-delete": "Are you sure you wish to delete this group?", + "alerts.create-failure": "おっと

グループを作成する際に問題が発生しました。後でもう一度お試しください!", + "alerts.confirm-delete": "このグループを削除してもよろしいですか?", - "edit.name": "Name", - "edit.description": "Description", - "edit.user-title": "Title of Members", - "edit.icon": "Group Icon", - "edit.label-color": "Group Label Color", - "edit.show-badge": "Show Badge", - "edit.private-details": "If enabled, joining of groups requires approval from a group owner.", - "edit.private-override": "Warning: Private groups is disabled at system level, which overrides this option.", - "edit.disable-requests": "Disable join requests", - "edit.hidden": "Hidden", - "edit.hidden-details": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually", - "edit.add-user": "Add User to Group", - "edit.add-user-search": "Search Users", - "edit.members": "Member List", - "control-panel": "Groups Control Panel", - "revert": "Revert", + "edit.name": "名前", + "edit.description": "説明", + "edit.user-title": "メンバーのタイトル", + "edit.icon": "グループアイコン", + "edit.label-color": "グループのラベル色", + "edit.show-badge": "バッジを表示", + "edit.private-details": "有効になっている場合、グループの参加にはグループオーナーの承認が必要です。", + "edit.private-override": "警告:プライベートグループはシステムレベルで無効になっており、このオプションは無効になります。", + "edit.disable-requests": "参加申請を無効にする", + "edit.hidden": "非表示", + "edit.hidden-details": "有効の場合、このグループはグループ一覧で発見することは出来ず、ユーザーが手動で招待する必要があります。", + "edit.add-user": "グループにユーザーを追加", + "edit.add-user-search": "ユーザー検索", + "edit.members": "メンバー一覧", + "control-panel": "グループのコントロールパネル", + "revert": "元に戻す", - "edit.no-users-found": "No Users Found", - "edit.confirm-remove-user": "Are you sure you want to remove this user?", - "edit.save-success": "Changes saved!" + "edit.no-users-found": "ユーザーが見つかりません", + "edit.confirm-remove-user": "このユーザーを削除してもよろしいですか?", + "edit.save-success": "設定を保存しました。" } \ No newline at end of file diff --git a/public/language/ja/admin/manage/ip-blacklist.json b/public/language/ja/admin/manage/ip-blacklist.json index 79470b4181..2068aaa7d0 100644 --- a/public/language/ja/admin/manage/ip-blacklist.json +++ b/public/language/ja/admin/manage/ip-blacklist.json @@ -1,15 +1,15 @@ { "lead": "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.", + "description": "場合によては、ユーザーアカウントを禁止せざるを得ないこともあります。フォーラムを保護するための最善の方法は、特定のIPまたはIPの範囲へのアクセスを制限することです。このような場合は、厄介なIPアドレスまたはCIDRブロック全体をこのブラックリストに追加することができ、新しいアカウントにログインしたり登録することができなくなります。", "active-rules": "アクティブルール", - "validate": "Validate Blacklist", - "apply": "Apply Blacklist", - "hints": "Syntax Hints", - "hint-1": "Define a single IP addresses per line. You can add IP blocks as long as they follow the CIDR format (e.g. 192.168.100.0/22).", - "hint-2": "You can add in comments by starting lines with the # symbol.", + "validate": "ブラックリストの検証", + "apply": "ブラックリスト", + "hints": "構文のヒント", + "hint-1": "1行に1つのIPアドレスを定義します。あなたはCIDR形式(例: 192.168.100.0/22 )に従っている限り、IPブロックを追加できます。", + "hint-2": "記号でコメントを追加することができます。", - "validate.x-valid": "%1 out of %2 rule(s) valid.", - "validate.x-invalid": "The following %1 rules are invalid:", + "validate.x-valid": "%2のルールのうち%1 のルール(s) が有効です。", + "validate.x-invalid": "次の%1 ルールは無効:", - "alerts.applied-success": "Blacklist Applied" + "alerts.applied-success": "ブラックリストに適用されました" } \ No newline at end of file diff --git a/public/language/ja/admin/manage/registration.json b/public/language/ja/admin/manage/registration.json index 2d005284c9..77f1fde08b 100644 --- a/public/language/ja/admin/manage/registration.json +++ b/public/language/ja/admin/manage/registration.json @@ -1,20 +1,20 @@ { "queue": "キュー", - "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\".", + "description": "登録キューにはユーザーが居ません。
この機能を有効にするには、設定 → ユーザー → ユーザー登録 → へ移動し、登録タイプ の項目を \"管理者承認\"にしてください。", "list.name": "名前", - "list.email": "Email", + "list.email": "メール", "list.ip": "IP", - "list.time": "Time", - "list.username-spam": "Frequency: %1 Appears: %2 Confidence: %3", - "list.email-spam": "Frequency: %1 Appears: %2", - "list.ip-spam": "Frequency: %1 Appears: %2", + "list.time": "時間", + "list.username-spam": "周波数:%1 出現: %2 信頼度: %3", + "list.email-spam": "周波数:%1 出現: %2", + "list.ip-spam": "周波数:%1 出現: %2", - "invitations": "Invitations", - "invitations.description": "Below is a complete list of invitations sent. Use ctrl-f to search through the list by email or username.

The username will be displayed to the right of the emails for users who have redeemed their invitations.", - "invitations.inviter-username": "Inviter Username", - "invitations.invitee-email": "Invitee Email", - "invitations.invitee-username": "Invitee Username (if registered)", + "invitations": "招待状", + "invitations.description": "以下は送信された招待状の完全なリストです。Ctrl-Fを使用して、電子メールまたはユーザー名でリストを検索します。

ユーザー名は、招待状を引き換えたユーザーのメールの右側に表示されます。", + "invitations.inviter-username": "招待者のユーザー名", + "invitations.invitee-email": "招待メール", + "invitations.invitee-username": "招待されたユーザー名(登録されている場合)", - "invitations.confirm-delete": "Are you sure you wish to delete this invitation?" + "invitations.confirm-delete": "この招待状を削除してもよろしいですか?" } \ No newline at end of file diff --git a/public/language/ja/admin/manage/tags.json b/public/language/ja/admin/manage/tags.json index 8d93f5ecd2..2639e71b65 100644 --- a/public/language/ja/admin/manage/tags.json +++ b/public/language/ja/admin/manage/tags.json @@ -2,17 +2,17 @@ "none": "あなたのフォーラムにはまだタグが付いていません。", "bg-color": "背景カラー", "text-color": "テキストカラー", - "create-modify": "Create & Modify Tags", - "description": "Select tags via clicking and/or dragging, use shift to select multiple.", - "create": "Create Tag", - "modify": "Modify Tags", - "delete": "Delete Selected Tags", - "search": "Search for tags...", - "settings": "Click here to visit the tag settings page.", - "name": "Tag Name", + "create-modify": "タグの作成と変更", + "description": "クリックまたは、クリックしながらドラッグでタグを選択し、Shiftキーを使用して複数のタグを選択します。", + "create": "タグを作成", + "modify": "タグを変更", + "delete": "指定されたタグを削除", + "search": "タグを検索します...", + "settings": "こちらをクリックしてタグ設定ページにアクセスしてください。", + "name": "タグ名", - "alerts.editing-multiple": "Editing multiple tags", - "alerts.editing-x": "Editing \"%1\" tag", - "alerts.confirm-delete": "Do you want to delete the selected tags?", - "alerts.update-success": "Tag Updated!" + "alerts.editing-multiple": "複数のタグを編集する", + "alerts.editing-x": "\"%1\"のタグを編集", + "alerts.confirm-delete": "選択したタグを削除しますか?", + "alerts.update-success": "タグが更新されました!" } \ No newline at end of file diff --git a/public/language/ja/admin/manage/users.json b/public/language/ja/admin/manage/users.json index 3571feeb5a..93474055c7 100644 --- a/public/language/ja/admin/manage/users.json +++ b/public/language/ja/admin/manage/users.json @@ -2,90 +2,90 @@ "users": "ユーザー", "edit": "編集", "make-admin": "管理者にする", - "remove-admin": "Remove Admin", - "validate-email": "Validate Email", - "send-validation-email": "Send Validation Email", - "password-reset-email": "Send Password Reset Email", - "ban": "Ban User(s)", - "temp-ban": "Ban User(s) Temporarily", - "unban": "Unban User(s)", - "reset-lockout": "Reset Lockout", - "reset-flags": "Reset Flags", - "delete": "Delete User(s)", - "purge": "Delete User(s) and Content", - "download-csv": "Download CSV", - "invite": "Invite", - "new": "New User", + "remove-admin": "管理者を削除", + "validate-email": "電子メールの", + "send-validation-email": "確認メールを送信", + "password-reset-email": "パスワードリセットメールを送信する", + "ban": "BANされたユーザー(s)", + "temp-ban": "一時的にユーザー(s)を禁止する", + "unban": "BANを解除されたユーザー(s)", + "reset-lockout": "ロックアウトのリセット", + "reset-flags": "最近のフラグ", + "delete": "ユーサー(s)を削除します", + "purge": "ユーザー(s)とコンテンツを削除する", + "download-csv": "CSVでダウンロード", + "invite": "招待", + "new": "新しいユーザー", - "pills.latest": "Latest Users", - "pills.unvalidated": "Not Validated", - "pills.no-posts": "No Posts", - "pills.top-posters": "Top Posters", - "pills.top-rep": "Most Reputation", - "pills.inactive": "Inactive", - "pills.flagged": "Most Flagged", - "pills.banned": "Banned", - "pills.search": "User Search", + "pills.latest": "新しいユーザー", + "pills.unvalidated": "検証されていない", + "pills.no-posts": "投稿がありません", + "pills.top-posters": "最も投稿したユーザー", + "pills.top-rep": "最も評価されたユーザー", + "pills.inactive": "非アクティブ", + "pills.flagged": "最もフラグが付けられたもの", + "pills.banned": "BANされた", + "pills.search": "ユーザーを検索", - "search.username": "By User Name", - "search.username-placeholder": "Enter a username to search", - "search.email": "By Email", - "search.email-placeholder": "Enter a email to search", - "search.ip": "By IP Address", - "search.ip-placeholder": "Enter an IP Address to search", - "search.not-found": "User not found!", + "search.username": "ユーザー名別", + "search.username-placeholder": "検索するユーザー名を入力してください", + "search.email": "Eメール別", + "search.email-placeholder": "検索するメールアドレスを入力してください", + "search.ip": "IP アドレス別", + "search.ip-placeholder": "検索するIPアドレスを入力してください", + "search.not-found": "ユーザーが見つかりません!", - "inactive.3-months": "3 months", - "inactive.6-months": "6 months", - "inactive.12-months": "12 months", + "inactive.3-months": "3ヶ月", + "inactive.6-months": "6ヶ月", + "inactive.12-months": "12ヶ月", - "users.uid": "uid", - "users.username": "username", - "users.email": "email", - "users.postcount": "postcount", - "users.reputation": "reputation", - "users.flags": "flags", - "users.joined": "joined", - "users.last-online": "last online", - "users.banned": "banned", + "users.uid": "ユーザーID", + "users.username": "ユーザー名", + "users.email": "メール", + "users.postcount": "投稿カウント", + "users.reputation": "評価", + "users.flags": "フラグ", + "users.joined": "参加", + "users.last-online": "最後オンライン", + "users.banned": "停止した", - "create.username": "User Name", - "create.email": "Email", - "create.email-placeholder": "Email of this user", - "create.password": "Password", - "create.password-confirm": "Confirm Password", + "create.username": "ユーザー名", + "create.email": "メール", + "create.email-placeholder": "このユーザーのメール", + "create.password": "パスワード", + "create.password-confirm": "パスワードを確認", - "temp-ban.length": "Ban Length", - "temp-ban.reason": "Reason (Optional)", - "temp-ban.hours": "Hours", - "temp-ban.days": "Days", - "temp-ban.explanation": "Enter the length of time for the ban. Note that a time of 0 will be a considered a permanent ban.", + "temp-ban.length": "BANの長さ", + "temp-ban.reason": "理由(任意)", + "temp-ban.hours": "時間", + "temp-ban.days": "日", + "temp-ban.explanation": "禁止期間の長さを入力します。0にすると永久に禁止と解釈されますのでご注意ください。", - "alerts.confirm-ban": "Do you really want to ban this user permanently?", - "alerts.confirm-ban-multi": "Do you really want to ban these users permanently?", - "alerts.ban-success": "User(s) banned!", - "alerts.button-ban-x": "Ban %1 user(s)", - "alerts.unban-success": "User(s) unbanned!", - "alerts.lockout-reset-success": "Lockout(s) reset!", - "alerts.flag-reset-success": "Flags(s) reset!", - "alerts.no-remove-yourself-admin": "You can't remove yourself as Administrator!", - "alerts.make-admin-success": "User(s) are now administrators.", - "alerts.confirm-remove-admin": "Do you really want to remove admins?", - "alerts.remove-admin-success": "User(s) are no longer administrators.", - "alerts.confirm-validate-email": "Do you want to validate email(s) of these user(s)?", - "alerts.validate-email-success": "Emails validated", - "alerts.password-reset-confirm": "Do you want to send password reset email(s) to these user(s)?", - "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": "User(s) Deleted!", - "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": "Create User", - "alerts.button-create": "Create", - "alerts.button-cancel": "Cancel", - "alerts.error-passwords-different": "Passwords must match!", - "alerts.error-x": "Error

%1

", - "alerts.create-success": "User created!", + "alerts.confirm-ban": "あなたは本当にこのユーザーを永久に禁止しますか?", + "alerts.confirm-ban-multi": "あなたは本当にこれらのユーザーを恒久的に禁止しますか?", + "alerts.ban-success": "ユーザー(s)は停止されました!", + "alerts.button-ban-x": "Banされた %1 ユーザー(s)", + "alerts.unban-success": "ユーザー(s)は禁止されています!", + "alerts.lockout-reset-success": "ロックアウト(s)がリセットされました!", + "alerts.flag-reset-success": "フラグ(s)をリセット!", + "alerts.no-remove-yourself-admin": "あなたは管理者なので自分自身を削除することはできません!", + "alerts.make-admin-success": "ユーザー(s)は、現在管理者です。", + "alerts.confirm-remove-admin": "本当に管理者を削除しますか?", + "alerts.remove-admin-success": "ユーザー(s)はもはや管理者ではありません。", + "alerts.confirm-validate-email": "これらのユーザー(s)の電子メール(s)を検証しますか?", + "alerts.validate-email-success": "電子メールが検証されました", + "alerts.password-reset-confirm": "これらのユーザー(s)にパスワードリセットのメール(s)を送信しますか?", + "alerts.confirm-delete": "警告!
本当にユーザー(s)を削除しますか?
この操作は元に戻すことはできません!ユーザーアカウントのみが削除され、投稿とスレッドは残ります。", + "alerts.delete-success": "ユーザー(s)は削除されました!", + "alerts.confirm-purge": "警告!
本当にユーザー(s)とそのコンテンツを削除しますか?
この操作は元に戻すことはできません。すべてのユーザーデータとコンテンツが消去されます。", + "alerts.create": "ユーザーを作成", + "alerts.button-create": "作成", + "alerts.button-cancel": "キャンセル", + "alerts.error-passwords-different": "パスワードが一致する必要があります!", + "alerts.error-x": "エラー

%1

", + "alerts.create-success": "ユーザーが作成されました!", - "alerts.prompt-email": "Email: ", - "alerts.email-sent-to": "An invitation email has been sent to %1", - "alerts.x-users-found": "%1 user(s) found! Search took %2 ms." + "alerts.prompt-email": "メール:", + "alerts.email-sent-to": "招待メールが%1に送られました。", + "alerts.x-users-found": "ユーザー(s)%1が見つかりました!検索には%2ミリ秒かかりました。" } \ No newline at end of file diff --git a/public/language/ja/admin/menu.json b/public/language/ja/admin/menu.json index 66b8eda80b..fab17aa4dd 100644 --- a/public/language/ja/admin/menu.json +++ b/public/language/ja/admin/menu.json @@ -3,73 +3,72 @@ "general/dashboard": "ダッシュボード", "general/homepage": "ホームページ", "general/navigation": "ナビゲーション", - "general/languages": "Languages", - "general/sounds": "Sounds", - "general/social": "Social", + "general/languages": "言語", + "general/sounds": "サウンド", + "general/social": "ソーシャル", - "section-manage": "Manage", - "manage/categories": "Categories", - "manage/tags": "Tags", - "manage/users": "Users", - "manage/registration": "Registration Queue", - "manage/groups": "Groups", - "manage/flags": "Flags", - "manage/ip-blacklist": "IP Blacklist", + "section-manage": "メッセージ", + "manage/categories": "カテゴリ", + "manage/tags": "タグ", + "manage/users": "ユーザー", + "manage/registration": "登録キュー", + "manage/groups": "グループ", + "manage/ip-blacklist": "IPブラックリスト", - "section-settings": "Settings", - "settings/general": "General", - "settings/reputation": "Reputation", - "settings/email": "Email", - "settings/user": "User", - "settings/group": "Group", - "settings/guest": "Guests", - "settings/uploads": "Uploads", - "settings/post": "Post", - "settings/chat": "Chat", - "settings/pagination": "Pagination", - "settings/tags": "Tags", - "settings/notifications": "Notifications", - "settings/cookies": "Cookies", - "settings/web-crawler": "Web Crawler", - "settings/sockets": "Sockets", - "settings/advanced": "Advanced", + "section-settings": "設定", + "settings/general": "一般", + "settings/reputation": "評価", + "settings/email": "メール", + "settings/user": "ユーザー", + "settings/group": "グループ", + "settings/guest": "ゲスト", + "settings/uploads": "アップロード", + "settings/post": "投稿", + "settings/chat": "チャット", + "settings/pagination": "ページ", + "settings/tags": "タグ", + "settings/notifications": "通知", + "settings/cookies": "クッキー", + "settings/web-crawler": "Webクローラー", + "settings/sockets": "接続数", + "settings/advanced": "高度", - "settings.page-title": "%1 Settings", + "settings.page-title": "%1の設定", - "section-appearance": "Appearance", - "appearance/themes": "Themes", - "appearance/skins": "Skins", - "appearance/customise": "Custom HTML & CSS", + "section-appearance": "外観", + "appearance/themes": "テーマ", + "appearance/skins": "スキン", + "appearance/customise": "カスタムHTML & CSS", - "section-extend": "Extend", - "extend/plugins": "Plugins", - "extend/widgets": "Widgets", - "extend/rewards": "Rewards", + "section-extend": "拡張", + "extend/plugins": "プラグイン", + "extend/widgets": "ウィジェット", + "extend/rewards": "報酬", - "section-social-auth": "Social Authentication", + "section-social-auth": "ソーシャル認証", - "section-plugins": "Plugins", - "extend/plugins.install": "Install Plugins", + "section-plugins": "プラグイン", + "extend/plugins.install": "プラグインをインストール", - "section-advanced": "Advanced", - "advanced/database": "Database", - "advanced/events": "Events", - "advanced/logs": "Logs", - "advanced/errors": "Errors", - "advanced/cache": "Cache", - "development/logger": "Logger", - "development/info": "Info", + "section-advanced": "高度", + "advanced/database": "データベース", + "advanced/events": "イベント", + "advanced/logs": "ログ", + "advanced/errors": "エラー", + "advanced/cache": "キャッシュ", + "development/logger": "ロガー", + "development/info": "情報", - "reload-forum": "Reload Forum", - "restart-forum": "Restart Forum", - "logout": "Log out", - "view-forum": "View Forum", + "reload-forum": "フォーラムを再読み込み", + "restart-forum": "フォーラムを再開", + "logout": "ログアウト", + "view-forum": "フォーラムを表示", - "search.placeholder": "Search...", - "search.no-results": "No results...", - "search.search-forum": "Search the forum for ", - "search.keep-typing": "Type more to see results...", - "search.start-typing": "Start typing to see results...", + "search.placeholder": "検索...", + "search.no-results": "結果がありません...", + "search.search-forum": "フォーラムでを検索", + "search.keep-typing": "結果を見るにはもっと入力してください...", + "search.start-typing": "結果を見るために入力を開始...", - "connection-lost": "Connection to %1 has been lost, attempting to reconnect..." + "connection-lost": "%1への接続が切れたので、再接続しています..." } \ No newline at end of file diff --git a/public/language/ja/admin/settings/advanced.json b/public/language/ja/admin/settings/advanced.json index da838146e6..f54cb6d4d7 100644 --- a/public/language/ja/admin/settings/advanced.json +++ b/public/language/ja/admin/settings/advanced.json @@ -1,19 +1,19 @@ { "maintenance-mode": "メンテナンスモード", - "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.help": "フォーラムがメンテナンスモードの場合、すべてのリクエストは静的な一時ページにリダイレクトされます。管理者はこのリダイレクトから免除され、通常のサイトにアクセスできます。", "maintenance-mode.message": "メンテナンスメッセージ", - "headers": "Headers", - "headers.allow-from": "Set ALLOW-FROM to Place NodeBB in an iFrame", - "headers.powered-by": "Customise the \"Powered By\" header sent by NodeBB", - "headers.acao": "Access-Control-Allow-Origin", - "headers.acao-help": "To deny access to all sites, leave empty or set to null", - "headers.acam": "Access-Control-Allow-Methods", - "headers.acah": "Access-Control-Allow-Headers", - "traffic-management": "Traffic Management", - "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", - "traffic.enable": "Enable Traffic Management", - "traffic.event-lag": "Event Loop Lag Threshold (in milliseconds)", - "traffic.event-lag-help": "Lowering this value decreases wait times for page loads, but will also show the \"excessive load\" message to more users. (Restart required)", - "traffic.lag-check-interval": "Check Interval (in milliseconds)", - "traffic.lag-check-interval-help": "Lowering this value causes NodeBB to become more sensitive to spikes in load, but may also cause the check to become too sensitive. (Restart required)" + "headers": "ヘッダー", + "headers.allow-from": "NodeBBをインラインフレーム内に配置するようALLOW-FROMを設定する", + "headers.powered-by": "NodeBBから送信された「Powered By」ヘッダーをカスタマイズする", + "headers.acao": "アクセス-制御-有効-原点", + "headers.acao-help": "すべてのサイトへのアクセスを拒否するには空のままにするか、nullに設定します", + "headers.acam": "アクセス-制御-有効-メソッド", + "headers.acah": "アクセス-制御-有効-ヘッダー", + "traffic-management": "トラフィック管理", + "traffic.help": "NodeBBは、トラフィックの多い状況で要求を自動的に拒否するモジュールを備えています。これらの設定はここで調整することができますが、はじめはデフォルト設定にしておくことをお勧めします。", + "traffic.enable": "トラフィック管理を有効にする", + "traffic.event-lag": "イベントループの場所のしきい値(ミリ秒単位)", + "traffic.event-lag-help": "この値を下げるとページの読み込み時間が短縮されますが、さらに多くのユーザーには「過剰な読み込み」メッセージが表示されます。(再起動が必要)", + "traffic.lag-check-interval": "チェック間隔(ミリ秒単位)", + "traffic.lag-check-interval-help": "この値を小さくすると、NodeBBは負荷のスパイクに対してより敏感になりますが、チェックが過敏になる可能性もあります。(再起動が必要)" } \ No newline at end of file diff --git a/public/language/ja/admin/settings/chat.json b/public/language/ja/admin/settings/chat.json index 549cbe8e76..543b924f02 100644 --- a/public/language/ja/admin/settings/chat.json +++ b/public/language/ja/admin/settings/chat.json @@ -2,8 +2,8 @@ "chat-settings": "チャット設定", "disable": "チャットは無効です", "disable-editing": "チャットメッセージの編集/削除を無効にする", - "disable-editing-help": "Administrators and global moderators are exempt from this restriction", - "max-length": "Maximum length of chat messages", - "max-room-size": "Maximum number of users in chat rooms", - "delay": "Time between chat messages in milliseconds" + "disable-editing-help": "管理者およびグローバルモデレーターはこの制限を免除されます", + "max-length": "チャットメッセージの最大の長さ", + "max-room-size": "チャットルームの最大ユーザー数", + "delay": "ミリ秒単位のチャットメッセージ間の時間" } \ No newline at end of file diff --git a/public/language/ja/admin/settings/cookies.json b/public/language/ja/admin/settings/cookies.json index 0ad7639cea..92aeb5b123 100644 --- a/public/language/ja/admin/settings/cookies.json +++ b/public/language/ja/admin/settings/cookies.json @@ -2,10 +2,10 @@ "eu-consent": "EU承諾", "consent.enabled": "有効", "consent.message": "通知メッセージ", - "consent.acceptance": "Acceptance message", - "consent.link-text": "Policy Link Text", - "consent.blank-localised-default": "Leave blank to use NodeBB localised defaults", - "settings": "Settings", - "cookie-domain": "Session cookie domain", - "blank-default": "Leave blank for default" + "consent.acceptance": "メッセージを受け取る", + "consent.link-text": "ポリシーリンクテキスト", + "consent.blank-localised-default": "空白のままにして、NodeBBのローカライズされたデフォルトを使用する", + "settings": "設定", + "cookie-domain": "セッションCookieドメイン", + "blank-default": "デフォルトの場合は空白のまま" } \ No newline at end of file diff --git a/public/language/ja/admin/settings/email.json b/public/language/ja/admin/settings/email.json index 9b84bcb6be..625f6ca4d6 100644 --- a/public/language/ja/admin/settings/email.json +++ b/public/language/ja/admin/settings/email.json @@ -1,25 +1,25 @@ { "email-settings": "Eメール設定", "address": "Eメールアドレス", - "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", - "from-help": "The from name to display in the email.", - "gmail-routing": "Gmail Routing", - "gmail-routing-help1": "There have been reports of Gmail Routing not working on accounts with heightened security. In those scenarios, you will have to configure your GMail account to allow less secure apps.", - "gmail-routing-help2": "For more information about this workaround, please consult this NodeMailer article on the issue. An alternative would be to utilise a third-party emailer plugin such as SendGrid, Mailgun, etc. Browse available plugins here.", - "gmail-transport": "Route emails through a Gmail/Google Apps account", - "gmail-transport.username": "Username", - "gmail-transport.username-help": "Enter the full email address here, especially if you are using a Google Apps managed domain.", - "gmail-transport.password": "Password", - "template": "Edit Email Template", - "template.select": "Select Email Template", - "template.revert": "Revert to Original", - "testing": "Email Testing", - "testing.select": "Select Email Template", - "testing.send": "Send Test Email", - "testing.send-help": "The test email will be sent to the currently logged in user's email address.", - "subscriptions": "Email Subscriptions", - "subscriptions.disable": "Disable subscriber notification emails", - "subscriptions.hour": "Digest Hour", - "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
The approximate server time is:
The next daily digest is scheduled to be sent " + "address-help": "次の電子メールアドレスは「送信者」と「返信先」の欄に受信者が表示する電子メールを指します。", + "from": "名前から", + "from-help": "メールからの名前が表示されます。", + "gmail-routing": "Gmailのルーティング", + "gmail-routing-help1": "Gmailルーティングがセキュリティが強化されたアカウントでは機能しないという報告がありました。この場合、安全性の低いアプリを許可するようにGmailアカウントを設定する必要があります。", + "gmail-routing-help2": "この回避策の関連情報を参照するには、問題に関するこのNodeMailerの記事を参照してください。 代わりに、SendGrid、Mailgunなどのサードパーティ製電子メールプラグインを利用する方法もあります。利用可能なプラグインを参照する。", + "gmail-transport": "Gmail / Google Appsアカウントを使用してメールをルーティングする", + "gmail-transport.username": "ユーザー名", + "gmail-transport.username-help": "特にGoogle Appsの管理ドメインを使用している場合は、ここに完全なメールアドレスを入力してください。", + "gmail-transport.password": "パスワード", + "template": "電子メールテンプレートの編集", + "template.select": "電子メールテンプレートを選択", + "template.revert": "オリジナルに戻す", + "testing": "Eメールテスト", + "testing.select": "電子メールテンプレートを選択", + "testing.send": "テスト電子メールを送信する", + "testing.send-help": "テスト電子メールは、現在ログインしているユーザーの電子メールアドレスに送信されます。", + "subscriptions": "メール購読", + "subscriptions.disable": "購読者の通知メールを無効にする", + "subscriptions.hour": "ダイジェストアワー", + "subscriptions.hour-help": "スケジュールされたメールのダイジェストを送信する時間を表す数字を入力してください(深夜は0、午後5:00は17)これはサーバー自体に基づく時間であり、システムの時計と正確に一致しない場合があります。
次の日のダイジェストは" } \ No newline at end of file diff --git a/public/language/ja/admin/settings/general.json b/public/language/ja/admin/settings/general.json index 89964ef42c..3579d42ba7 100644 --- a/public/language/ja/admin/settings/general.json +++ b/public/language/ja/admin/settings/general.json @@ -2,29 +2,30 @@ "site-settings": "サイト設定", "title": "サイトタイトル", "title.name": "あなたのコミュニティ名", - "title.show-in-header": "Show Site Title in Header", - "browser-title": "Browser Title", - "browser-title-help": "If no browser title is specified, the site title will be used", - "title-layout": "Title Layout", - "title-layout-help": "Define how the browser title will be structured ie. {pageTitle} | {browserTitle}", - "description.placeholder": "A short description about your community", - "description": "Site Description", - "keywords": "Site Keywords", - "keywords-placeholder": "Keywords describing your community, comma-separated", - "logo": "Site Logo", - "logo.image": "Image", - "logo.image-placeholder": "Path to a logo to display on forum header", - "logo.upload": "Upload", + "title.show-in-header": "ヘッダーにサイトタイトルを表示する", + "browser-title": "ブラウザ", + "browser-title-help": "ブラウザのタイトルが指定されていない場合、サイトのタイトルが使用されます。", + "title-layout": "タイトル配置", + "title-layout-help": "ブラウザのタイトルがどのように構成されるかを定義します。{pageTitle} | {browserTitle}", + "description.placeholder": "あなたのコミュニティについての簡単な説明", + "description": "サイトの説明", + "keywords": "サイトのキーワード", + "keywords-placeholder": "あなたのコミュニティを記述するキーワード、カンマ区切り", + "logo": "サイトロゴ", + "logo.image": "画像", + "logo.image-placeholder": "フォーラムのヘッダーに表示するロゴのパス", + "logo.upload": "アップロード", "logo.url": "URL", - "logo.url-placeholder": "The URL of the site logo", - "logo.url-help": "When the logo is clicked, send users to this address. If left blank, user will be sent to the forum index.", - "logo.alt-text": "Alt Text", - "log.alt-text-placeholder": "Alternative text for accessibility", - "favicon": "Favicon", - "favicon.upload": "Upload", - "touch-icon": "Homescreen/Touch Icon", - "touch-icon.upload": "Upload", - "touch-icon.help": "Recommended size and format: 192x192, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.", - "outgoing-links": "Outgoing Links", - "outgoing-links.warning-page": "Use Outgoing Links Warning Page" + "logo.url-placeholder": "サイトロゴのURL", + "logo.url-help": "ロゴをクリックすると、ユーザーをこのアドレスに送信します。空白のままにすると、ユーザーはフォーラムのインデックスに送信されます。", + "logo.alt-text": "全てのテキスト:", + "log.alt-text-placeholder": "アクセシビリティのための代替テキスト", + "favicon": "お気に入りアイコン", + "favicon.upload": "アップロード", + "touch-icon": "多い", + "touch-icon.upload": "アップロード", + "touch-icon.help": "推奨サイズとフォーマット:192x192、PNG形式のみ。タッチアイコンが指定されていない場合、NodeBBはファビコンを使用します。", + "outgoing-links": "外部サイトへのリンク", + "outgoing-links.warning-page": "送信リンクの警告ページを使用", + "search-default-sort-by": "デフォルトのソートを検索" } \ No newline at end of file diff --git a/public/language/ja/admin/settings/group.json b/public/language/ja/admin/settings/group.json index 59ee61df12..e25882871d 100644 --- a/public/language/ja/admin/settings/group.json +++ b/public/language/ja/admin/settings/group.json @@ -1,12 +1,12 @@ { "general": "一般", "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.", - "allow-creation": "Allow Group Creation", - "allow-creation-help": "If enabled, users can create groups (Default: disabled)", - "max-name-length": "Maximum Group Name Length", - "cover-image": "Group Cover Image", - "default-cover": "Default Cover Images", - "default-cover-help": "Add comma-separated default cover images for groups that don't have an uploaded cover image" + "private-groups.help": "有効の場合、グループへの参加はグループ管理人からの承認が必要です。(デフォルト: 有効)", + "private-groups.warning": "注意!このオプションが無効で、プライベートグループがある場合、自動的に公開されます。", + "allow-creation": "グループの作成を有効にする", + "allow-creation-help": "有効にすると、ユーザーはグループを作成できます(デフォルト:無効)", + "max-name-length": "グループ名の最大文字数", + "cover-image": "グループ表紙イメージ", + "default-cover": "デフォルトのカバー画像", + "default-cover-help": "Add comma-separated default cover images for groups that don't have an uploaded cover image\n日本語\nアップロードされたカバー画像を持たないグループで、カンマ区切りのデフォルト表紙画像を追加する。" } \ No newline at end of file diff --git a/public/language/ja/admin/settings/guest.json b/public/language/ja/admin/settings/guest.json index 30111e41d7..4e15d68ba5 100644 --- a/public/language/ja/admin/settings/guest.json +++ b/public/language/ja/admin/settings/guest.json @@ -1,8 +1,8 @@ { "handles": "ゲストハンドル", "handles.enabled": "ゲストハンドルを有効にする", - "handles.enabled-help": "This option exposes a new field that allows guests to pick a name to associate with each post they make. If disabled, they will simply be called \"Guest\"", - "privileges": "Guest Privileges", - "privileges.can-search": "Allow guests to search without logging in", - "privileges.can-search-users": "Allow guests to search users without logging in" + "handles.enabled-help": "このオプションでは新しい投稿が表示される時に、ゲストは自分が投稿する各投稿に関連付ける名前を選択できます。無効にすると、単に「ゲスト」と呼ばれます。", + "privileges": "ゲスト特典", + "privileges.can-search": "ゲストがログインせずに検索できるようにする", + "privileges.can-search-users": "ゲストがログインせずにユーザーを検索できるようにする" } \ No newline at end of file diff --git a/public/language/ja/admin/settings/notifications.json b/public/language/ja/admin/settings/notifications.json index 5948cb610d..bda17cd95b 100644 --- a/public/language/ja/admin/settings/notifications.json +++ b/public/language/ja/admin/settings/notifications.json @@ -1,5 +1,5 @@ { "notifications": "通知", "welcome-notification": "ウェルカム通知", - "welcome-notification-link": "Welcome Notification Link" + "welcome-notification-link": "ウェルカム通知のリンク" } \ No newline at end of file diff --git a/public/language/ja/admin/settings/pagination.json b/public/language/ja/admin/settings/pagination.json index c79dab5f14..8cafd8490d 100644 --- a/public/language/ja/admin/settings/pagination.json +++ b/public/language/ja/admin/settings/pagination.json @@ -1,9 +1,9 @@ { "pagination": "ページ設定", - "enable": "Paginate topics and posts instead of using infinite scroll.", - "topics": "トピックページ", - "posts-per-page": "Posts per Page", - "categories": "Category Pagination", - "topics-per-page": "Topics per Page", - "initial-num-load": "Initial Number of Topics to Load on Unread, Recent, and Popular" + "enable": "スクロールでのページ自動ロードはしない", + "topics": "スレッドページ", + "posts-per-page": "ページごとの投稿数", + "categories": "カテゴリページ", + "topics-per-page": "ページごとのスレッド数", + "initial-num-load": "未読、最近、および人気に読み込むスレッドの初期数" } \ No newline at end of file diff --git a/public/language/ja/admin/settings/post.json b/public/language/ja/admin/settings/post.json index f721bd7db6..b82142e0e2 100644 --- a/public/language/ja/admin/settings/post.json +++ b/public/language/ja/admin/settings/post.json @@ -1,44 +1,44 @@ { "sorting": "投稿の並び順", "sorting.post-default": "標準のポスト並び順", - "sorting.oldest-to-newest": "Oldest to Newest", - "sorting.newest-to-oldest": "Newest to Oldest", - "sorting.most-votes": "Most Votes", - "sorting.topic-default": "Default Topic Sorting", - "restrictions": "Posting Restrictions", - "restrictions.seconds-between": "Seconds between Posts", - "restrictions.seconds-between-new": "Seconds between Posts for New Users", - "restrictions.rep-threshold": "Reputation threshold before this restriction is lifted", - "restrictions.seconds-defore-new": "Seconds before new user can post", - "restrictions.seconds-edit-after": "Number of seconds users are allowed to edit posts after posting. (0 disabled)", - "restrictions.seconds-delete-after": "Number of seconds users are allowed to delete posts after posting. (0 disabled)", - "restrictions.replies-no-delete": "Number of replies after users are disallowed to delete their own topics. (0 disabled)", - "restrictions.min-title-length": "Minimum Title Length", - "restrictions.max-title-length": "Maximum Title Length", - "restrictions.min-post-length": "Minimum Post Length", - "restrictions.max-post-length": "Maximum Post Length", - "restrictions.days-until-stale": "Days until Topic is considered stale", - "restrictions.stale-help": "If a topic is considered \"stale\", then a warning will be shown to users who attempt to reply to that topic.", - "timestamp": "Timestamp", - "timestamp.cut-off": "Date cut-off (in days)", - "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": "Teaser Post", - "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": "First", - "unread": "Unread Settings", - "unread.cutoff": "Unread cutoff days", - "unread.min-track-last": "Minimum posts in topic before tracking last read", - "signature": "Signature Settings", - "signature.disable": "Disable signatures", - "signature.no-links": "Disable links in signatures", - "signature.no-images": "Disable images in signatures", - "signature.max-length": "Maximum Signature Length", - "composer": "Composer Settings", - "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": "Show \"Help\" tab", - "composer.enable-plugin-help": "Allow plugins to add content to the help tab", - "composer.custom-help": "Custom Help Text", - "ip-tracking": "IP Tracking", - "ip-tracking.each-post": "Track IP Address for each post" + "sorting.oldest-to-newest": "新しい順に", + "sorting.newest-to-oldest": "新しいものから古いものへ", + "sorting.most-votes": "最も多い評価", + "sorting.topic-default": "デフォルトのスレッドの並び順", + "restrictions": "転記の制限", + "restrictions.seconds-between": "投稿間の秒数", + "restrictions.seconds-between-new": "新規ユーザーの投稿間の秒数", + "restrictions.rep-threshold": "この制限が解除される前の評判しきい値", + "restrictions.seconds-defore-new": "新しいユーザーが投稿できるまでの秒数", + "restrictions.seconds-edit-after": "投稿後にユーザーが投稿を編集できる秒数。(0は無効)", + "restrictions.seconds-delete-after": "投稿後にユーザーが投稿を削除できる秒数。(0は無効)", + "restrictions.replies-no-delete": "ユーザーが自分のスレッドを削除できなくなった後の返信数(0は無効)", + "restrictions.min-title-length": "タイトルの最小文字数", + "restrictions.max-title-length": "タイトルの最大文字数", + "restrictions.min-post-length": "投稿の最小文字数", + "restrictions.max-post-length": "投稿の最大文字数", + "restrictions.days-until-stale": "スレッドが古くなるまでの日数", + "restrictions.stale-help": "スレッドが「古い」とみなされた場合、そのスレッドに返信しようとするユーザーに警告が表示されます。", + "timestamp": "タイムスタンプ", + "timestamp.cut-off": "日付のカットオフ(日数)", + "timestamp.cut-off-help": "日付&時間は相対的な方法で表示されます(例:「3時間前」/「5日前」)。そしてさまざまな地域にローカライズされています。\n\\t\\t\\t\\t\\t言語。特定のポイントの後、このテキストは、ローカライズされた日付自体を表示するように切り替えることができます。\n\\t\\t\\t\\t\\t(例:2016年11月5日15:30)
(デフォルト:30 、または1か月)。日付を常に表示するには0に設定し、常に相対時間を表示するには空白のままにします。", + "teaser": "ティーザーの投稿", + "teaser.last-post": "最後&ndash;返信がない場合は、元の投稿を含む最新の投稿を表示", + "teaser.last-reply": "最後&ndash;最新の返信を表示するか、返信がない場合は「返信なし」のプレースホルダを表示する", + "teaser.first": "最初", + "unread": "未読の設定", + "unread.cutoff": "未読のカットオフ日", + "unread.min-track-last": "最後に読み込みを行う前に追跡するスレッドの最小投稿数", + "signature": "署名の設定", + "signature.disable": "署名を無効にする", + "signature.no-links": "署名内のリンクを無効にする", + "signature.no-images": "署名内の画像を無効にする", + "signature.max-length": "署名の最大文字数", + "composer": "Composerの設定", + "composer-help": "次の設定は、投稿者の機能や外観を制御します。\n\\t\\t\\t\\tユーザーに新しいスレッドを作成したり、既存のトピックに返信したりできます。", + "composer.show-help": "「ヘルプ」タグを表示", + "composer.enable-plugin-help": "プラグインがヘルプタブにコンテンツを追加できるようにする", + "composer.custom-help": "カスタムヘルプテキスト", + "ip-tracking": "IPトラッキング", + "ip-tracking.each-post": "各投稿のトラックIPアドレス" } \ No newline at end of file diff --git a/public/language/ja/admin/settings/reputation.json b/public/language/ja/admin/settings/reputation.json index 15306ccec5..05a1059097 100644 --- a/public/language/ja/admin/settings/reputation.json +++ b/public/language/ja/admin/settings/reputation.json @@ -1,8 +1,8 @@ { "reputation": "評価の設定", - "disable": "Disable Reputation System", + "disable": "レピュテーションシステムを無効にする", "disable-down-voting": "低評価を無効にする", - "thresholds": "Activity Thresholds", - "min-rep-downvote": "Minimum reputation to downvote posts", - "min-rep-flag": "Minimum reputation to flag posts" + "thresholds": "アクティビティのしきい値", + "min-rep-downvote": "投稿をdownvoteするための最低評価", + "min-rep-flag": "フラグの投稿に低評価" } \ No newline at end of file diff --git a/public/language/ja/admin/settings/sockets.json b/public/language/ja/admin/settings/sockets.json index 9cca9ba25e..f2940ef4f2 100644 --- a/public/language/ja/admin/settings/sockets.json +++ b/public/language/ja/admin/settings/sockets.json @@ -1,6 +1,6 @@ { "reconnection": "再接続の設定", - "max-attempts": "Max Reconnection Attempts", - "default-placeholder": "Default: %1", - "delay": "Reconnection Delay" + "max-attempts": "最大再接続数の試行", + "default-placeholder": "デフォルト: %1", + "delay": "再接続遅延" } \ No newline at end of file diff --git a/public/language/ja/admin/settings/tags.json b/public/language/ja/admin/settings/tags.json index 534e0203ce..08c54008f7 100644 --- a/public/language/ja/admin/settings/tags.json +++ b/public/language/ja/admin/settings/tags.json @@ -1,12 +1,12 @@ { "tag": "タグ設定", - "min-per-topic": "トピックごとの最小タグ数", - "max-per-topic": "トピックごとの最大タグ数", - "min-length": "Minimum Tag Length", - "max-length": "Maximum Tag Length", - "goto-manage": "Click here to visit the tag management page.", - "privacy": "Privacy", - "list-private": "Make the tags list private", - "related-topics": "Related Topics", - "max-related-topics": "Maximum related topics to display (if supported by theme)" + "min-per-topic": "スレッドごとの最小タグ数", + "max-per-topic": "スレッドごとの最大タグ数", + "min-length": "タグの最小文字数", + "max-length": "タグの最大文字数", + "goto-manage": "タグ管理ページにアクセスするには、ここをクリックしてください。", + "privacy": "プライバシー", + "list-private": "タグリストを非公開にする", + "related-topics": "関連スレッド", + "max-related-topics": "表示する関連スレッドの最大数(テーマでサポートされている場合)" } \ No newline at end of file diff --git a/public/language/ja/admin/settings/uploads.json b/public/language/ja/admin/settings/uploads.json index 04245315a7..c352698762 100644 --- a/public/language/ja/admin/settings/uploads.json +++ b/public/language/ja/admin/settings/uploads.json @@ -1,28 +1,28 @@ { "posts": "投稿", - "allow-files": "Allow users to upload regular files", - "private": "Make uploaded files private", - "max-image-width": "Resize images down to specified width (in pixels)", - "max-image-width-help": "(in pixels, default: 760 pixels, set to 0 to disable)", - "max-file-size": "Maximum File Size (in KiB)", - "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-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc).\n\t\t\t\t\tAn empty list means all extensions are allowed.", - "profile-avatars": "Profile Avatars", - "allow-profile-image-uploads": "Allow users to upload profile images", - "convert-profile-image-png": "Convert profile image uploads to PNG", - "default-avatar": "Custom Default Avatar", - "upload": "Upload", - "profile-image-dimension": "Profile Image Dimension", - "profile-image-dimension-help": "(in pixels, default: 128 pixels)", - "max-profile-image-size": "Maximum Profile Image File Size", - "max-profile-image-size-help": "(in kilobytes, default: 256 KiB)", - "max-cover-image-size": "Maximum Cover Image File Size", - "max-cover-image-size-help": "(in kilobytes, default: 2,048 KiB)", - "keep-all-user-images": "Keep old versions of avatars and profile covers on the server", - "profile-covers": "Profile Covers", - "default-covers": "Default Cover Images", - "default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image" -} \ No newline at end of file + "allow-files": "ユーザーが通常のファイルをアップロードできるようにする。", + "private": "アップロードしたファイルを非公開にする", + "max-image-width": "画像を指定した幅(ピクセル単位)にリサイズ", + "max-image-width-help": "(ピクセル単位、デフォルト:760px、無効にするには0に設定)", + "max-file-size": "最大ファイルサイズ(KB)", + "max-file-size-help": "(キロバイト単位、デフォルト:2048 KB)", + "allow-topic-thumbnails": "ユーザーがスレッドのサムネイルをアップロードできるようにする", + "topic-thumb-size": "スレッドのサムネイルの大きさ", + "allowed-file-extensions": "ファイル拡張子が有効になりました。", + "allowed-file-extensions-help": "ここにファイル拡張子のカンマ区切りリストを入力します(例: pdf,xls,doc )。空のリストは、すべての拡張が許可されていることを意味します。", + "profile-avatars": "プロフィールの顔写真", + "allow-profile-image-uploads": "ユーザーがプロフィール画像をアップロードできるようにする。", + "convert-profile-image-png": "プロフィール画像のアップロードをPNGに変換する", + "default-avatar": "カスタムデフォルトアバター", + "upload": "アップロード", + "profile-image-dimension": "プロファイル画像の寸法", + "profile-image-dimension-help": "(ピクセルで、デフォルト:128px)", + "max-profile-image-size": "プロフィール画像の最大ファイルサイズ", + "max-profile-image-size-help": "(キロバイト単位、デフォルト:256KB)", + "max-cover-image-size": "カバー画像の最大サイズ", + "max-cover-image-size-help": "(キロバイト、デフォルト:2,048KB)", + "keep-all-user-images": "古いバージョンのアバターとプロファイルカバーをサーバーに保管", + "profile-covers": "プロフィールのカバー", + "default-covers": "デフォルトのカバー画像", + "default-covers-help": "アップロードされたカバー画像を持たないアカウントのカンマ区切りのデフォルト表紙画像を追加する" +} diff --git a/public/language/ja/admin/settings/user.json b/public/language/ja/admin/settings/user.json index 3e74b4711f..ee78fda0f4 100644 --- a/public/language/ja/admin/settings/user.json +++ b/public/language/ja/admin/settings/user.json @@ -2,58 +2,58 @@ "authentication": "認証", "allow-local-login": "ローカルログインを有効にする", "require-email-confirmation": "Eメールの確認が必要です", - "email-confirm-interval": "User may not resend a confirmation email until", - "email-confirm-email2": "minutes have elapsed", - "allow-login-with": "Allow login with", - "allow-login-with.username-email": "Username or Email", - "allow-login-with.username": "Username Only", - "allow-login-with.email": "Email Only", - "account-settings": "Account Settings", - "disable-username-changes": "Disable username changes", - "disable-email-changes": "Disable email changes", - "disable-password-changes": "Disable password changes", - "allow-account-deletion": "Allow account deletion", - "user-info-private": "Make user info private", - "themes": "Themes", - "disable-user-skins": "Prevent users from choosing a custom skin", - "account-protection": "Account Protection", - "login-attempts": "Login attempts per hour", - "login-attempts-help": "If login attempts to a user's account exceeds this threshold, that account will be locked for a pre-configured amount of time", - "lockout-duration": "Account Lockout Duration (minutes)", - "login-days": "Days to remember user login sessions", - "password-expiry-days": "Force password reset after a set number of days", - "registration": "User Registration", - "registration-type": "Registration Type", - "registration-type.normal": "Normal", - "registration-type.admin-approval": "Admin Approval", - "registration-type.admin-approval-ip": "Admin Approval for IPs", - "registration-type.invite-only": "Invite Only", - "registration-type.admin-invite-only": "Admin Invite Only", - "registration-type.disabled": "No registration", - "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": "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", - "max-about-me-length": "Maximum About Me Length", - "terms-of-use": "Forum Terms of Use (Leave blank to disable)", - "user-search": "User Search", - "user-search-results-per-page": "Number of results to display", - "default-user-settings": "Default User Settings", - "show-email": "Show email", - "show-fullname": "Show fullname", - "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", - "digest-freq": "Subscribe to Digest", - "digest-freq.off": "Off", - "digest-freq.daily": "Daily", - "digest-freq.weekly": "Weekly", - "digest-freq.monthly": "Monthly", - "email-chat-notifs": "Send an email if a new chat message arrives and I am not online", - "email-post-notif": "Send an email when replies are made to topics I am subscribed to", - "follow-created-topics": "Follow topics you create", - "follow-replied-topics": "Follow topics that you reply to" + "email-confirm-interval": "ユーザーが確認するまでEメールを再送信しない", + "email-confirm-email2": "分経過", + "allow-login-with": "ログインを許可", + "allow-login-with.username-email": "ユーザー名または電子メール", + "allow-login-with.username": "ユーザー名のみ", + "allow-login-with.email": "メールのみ", + "account-settings": "アカウント設定", + "disable-username-changes": "ユーザー名の変更を無効にする", + "disable-email-changes": "Eメールの変更を無効にする", + "disable-password-changes": "パスワードの変更を無効にする", + "allow-account-deletion": "アカウントが解除されました", + "user-info-private": "ユーザー情報を非公開にする", + "themes": "テーマ", + "disable-user-skins": "ユーザーがカスタムスキンを選択できないようにする", + "account-protection": "アカウント保護", + "login-attempts": "時間ごとのログイン試行", + "login-attempts-help": "ユーザのアカウントへのログイン試行数がこの値を超える場合、そのアカウントは予め設定された時間だけロックされます。", + "lockout-duration": "アカウントロックアウト期間(分)", + "login-days": "ユーザーのログインセッションを覚える日数", + "password-expiry-days": "指定した日数後にパスワードを強制的にリセットする", + "registration": "ユーザー登録", + "registration-type": "登録タイプ", + "registration-type.normal": "標準", + "registration-type.admin-approval": "管理者承認", + "registration-type.admin-approval-ip": "IPの管理者承認", + "registration-type.invite-only": "招待のみ", + "registration-type.admin-invite-only": "管理者招待のみ", + "registration-type.disabled": "登録なし", + "registration-type.help": "通常 - ユーザーは/登録ページから登録できます。
\n管理者承認 - ユーザー登録は、管理者向けの承認待ちキューに配置されます。
\nIPの管理者承認 - 新規ユーザーの場合は通常、アカウントが既に設定されているIPアドレスの管理者承認の場合。\n招待のみ - ユーザーはユーザーページから他のユーザーを招待できます。
\n管理者招待のみ - 管理者のみがユーザー管理者/管理者から他のユーザーを招待できます/ users ページ\n登録なし - ユーザー登録なし。
", + "registration.max-invites": "ユーザーごとの最大招待数", + "max-invites": "ユーザーごとの最大招待数", + "max-invites-help": "無制限の場合は0です。管理者は無限の招待を受ける
「招待のみ」にのみ適用されます", + "min-username-length": "ユーザー名の最小文字数", + "max-username-length": "ユーザー名の最大文字数", + "min-password-length": "パスワードの最小文字数", + "max-about-me-length": "概要の最大文字数", + "terms-of-use": "フォーラム利用規約(空白のままにしておくと無効になります)", + "user-search": "ユーザーを検索", + "user-search-results-per-page": "結果数を表示", + "default-user-settings": "デフォルトユーザー設定", + "show-email": "メールを表示", + "show-fullname": "フルネームで表示", + "restrict-chat": "フォローしたユーザーからのチャットメッセージだけを許可する", + "outgoing-new-tab": "外部リンクを新しいタブで開く", + "topic-search": "インースレッドの検索を有効にします", + "digest-freq": "お知らせを購読する", + "digest-freq.off": "オフ", + "digest-freq.daily": "デイリー", + "digest-freq.weekly": "ウィークリー", + "digest-freq.monthly": "マンスリー", + "email-chat-notifs": "オンラインではない時に新しいチャットメッセージを受信した場合、通知メールを送信する。", + "email-post-notif": "購読中のスレッドに返信があった場合、メールで通知する。", + "follow-created-topics": "投稿したスレッドをフォローします", + "follow-replied-topics": "返信したスレッドをフォローします" } \ No newline at end of file diff --git a/public/language/ja/admin/settings/web-crawler.json b/public/language/ja/admin/settings/web-crawler.json index 42217c42df..07f2dc0afb 100644 --- a/public/language/ja/admin/settings/web-crawler.json +++ b/public/language/ja/admin/settings/web-crawler.json @@ -1,10 +1,10 @@ { "crawlability-settings": "クロール性の設定", - "robots-txt": "Custom Robots.txt Leave blank for default", - "sitemap-feed-settings": "Sitemap & Feed Settings", - "disable-rss-feeds": "Disable RSS Feeds", - "disable-sitemap-xml": "Disable Sitemap.xml", - "sitemap-topics": "Number of Topics to display in the Sitemap", - "clear-sitemap-cache": "Clear Sitemap Cache", - "view-sitemap": "View Sitemap" + "robots-txt": "カスタムRobots.txtデフォルトの場合は空白のままにしてください", + "sitemap-feed-settings": "サイトマップとフィードの設定", + "disable-rss-feeds": "RSSフィードを無効にする", + "disable-sitemap-xml": "Sitemap.xmlを無効にする", + "sitemap-topics": "サイトマップに表示するスレッドの数", + "clear-sitemap-cache": "サイトマップのキャッシュをクリア", + "view-sitemap": "サイトマップを表示" } \ No newline at end of file diff --git a/public/language/ja/category.json b/public/language/ja/category.json index 832d90f6eb..78cf520d70 100644 --- a/public/language/ja/category.json +++ b/public/language/ja/category.json @@ -1,9 +1,9 @@ { - "category": "カテゴリー", - "subcategories": "サブカテゴリー", - "new_topic_button": "新規トピック", + "category": "カテゴリ", + "subcategories": "サブカテゴリ", + "new_topic_button": "新規スレッド", "guest-login-post": "投稿するにはログインしてください", - "no_topics": "まだトピックはありません
最初のトピックを書いてみませんか?", + "no_topics": "まだスレッドはありません
最初のスレッドを書いてみませんか?", "browsing": "閲覧中", "no_replies": "返事はまだありません", "no_new_posts": "新しい投稿はありません", @@ -12,8 +12,8 @@ "ignore": "無視する", "watching": "ウォッチ中", "ignoring": "無視しています", - "watching.description": "未読トピックを表示", - "ignoring.description": "未読トピックを表示しない", + "watching.description": "未読スレッドを表示", + "ignoring.description": "未読スレッドを表示しない", "watch.message": "あなたは現在、このカテゴリと全てのサブカテゴリで行われる更新をウォッチしています。", "ignore.message": "あなたは現在、このカテゴリと全てのサブカテゴリで行われる更新を無視しています。", "watched-categories": "ウォッチ中のカテゴリ" diff --git a/public/language/ja/email.json b/public/language/ja/email.json index d94f3b3f6d..461b393f30 100644 --- a/public/language/ja/email.json +++ b/public/language/ja/email.json @@ -17,10 +17,10 @@ "reset.notify.text1": "%1にてパスワードのリセットが行われたことをお知らせします。", "reset.notify.text2": "もしあなたがリセットを行っていない場合は、すぐに管理者に通報してください。", "digest.notifications": "%1さんからの未読通知があります:", - "digest.latest_topics": "%1からの新しいトピック", + "digest.latest_topics": "%1からの新しいスレッド", "digest.cta": "クリックで%1を見る", "digest.unsub.info": "このまとめはあなたの購読設定により送られました。", - "digest.no_topics": "%1にはアクティブなトピックがありません。", + "digest.no_topics": "%1にはアクティブなスレッドがありません。", "digest.day": "日", "digest.week": "週", "digest.month": "月", diff --git a/public/language/ja/error.json b/public/language/ja/error.json index 27511fe91c..d01ac87df2 100644 --- a/public/language/ja/error.json +++ b/public/language/ja/error.json @@ -4,7 +4,7 @@ "account-locked": "あなたのアカウントは一時的にロックされています", "search-requires-login": "検索するにはアカウントが必要です - ログインするかアカウントを作成してください。", "invalid-cid": "無効なカテゴリID", - "invalid-tid": "無効なトピックID", + "invalid-tid": "無効なスレッドID", "invalid-pid": "無効な投稿ID", "invalid-uid": "無効なユーザーID", "invalid-username": "無効なユーザー名", @@ -34,7 +34,7 @@ "blacklisted-ip": "申し訳ありませんがあなたのIPアドレスは当コミュニティで停止されています。もし誤ったエラーだと思われる場合は管理者にお問い合わせください。", "ban-expiry-missing": "この停止の終了日を入力してください。", "no-category": "カテゴリは存在しません", - "no-topic": "トピックは存在しません", + "no-topic": "スレッドは存在しません", "no-post": "投稿は存在しません", "no-group": "グループは存在しません", "no-user": "ユーザーは存在しません", @@ -56,19 +56,19 @@ "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 の応答待ちの場合、あなたのトピックは削除できません。", + "cant-delete-topic-has-reply": "応答待ちの場合、あなたのスレッドは削除できません。", + "cant-delete-topic-has-replies": "%1 の応答待ちの場合、あなたのスレッドは削除できません。", "content-too-short": "より長く投稿を書いて下さい。投稿にはせめて%1文字が必要です。", "content-too-long": "より短く投稿を書いて下さい。投稿が%1文字以上が許されません。", "title-too-short": "より長くタイトルを書いて下さい。タイトルはせめて%1文字が必要です。", "title-too-long": "より短くタイトルを書いて下さい。タイトルは%1文字以上が許されません。", - "category-not-selected": "カテゴリーが選択されていません。", + "category-not-selected": "カテゴリが選択されていません。", "too-many-posts": "あなたは%1秒間に一つの投稿しか許されます-少し待ってまた投稿してください", "too-many-posts-newbie": "あなたは%2評判を得ているまで、新しいユーザーとしては、一度だけごとに%1秒を投稿することができます - 再び投稿する前にお待ちください", "tag-too-short": "%1文字(s)以上でタグを入力してください。", "tag-too-long": "%1文字(s)以内でタグを入力してください。", - "not-enough-tags": "タグが足りません。トピックはせめて%1タグが必要です。", - "too-many-tags": "タグが多すぎます。トピックは%1のタグ以上が許されません。", + "not-enough-tags": "タグが足りません。スレッドはせめて%1のタグ(s)が必要です。", + "too-many-tags": "タグが多すぎます。スレッドは%1のタグ(s)以上が許されません。", "still-uploading": "アップロードが完成するまでお待ちください。", "file-too-big": "%1kBより大きいサイズファイルが許されません-より小さいファイルをアップして下さい。", "guest-upload-disabled": "ゲストさんからのアップを無効にしています", @@ -91,9 +91,9 @@ "group-already-requested": "あなたのメンバーシップの要求が既に提出されました", "post-already-deleted": "この投稿が既に削除されました", "post-already-restored": "この投稿が既に復元されました", - "topic-already-deleted": "このトピックが既に削除されました", - "topic-already-restored": "このトピックが既に復元されました", - "cant-purge-main-post": "あなたはこの主な投稿をパージできませんので、削除して下さい", + "topic-already-deleted": "このスレッドは既に削除されました", + "topic-already-restored": "このスレッドは既に復元されました", + "cant-purge-main-post": "メインの投稿を削除することはできません。代わりにスレッドを削除してください", "topic-thumbnails-are-disabled": "スレッドのサムネイルが無効された", "invalid-file": "無効なファイル", "uploads-are-disabled": "アップロードが無効された", diff --git a/public/language/ja/global.json b/public/language/ja/global.json index 88e115ff6c..548cc937d3 100644 --- a/public/language/ja/global.json +++ b/public/language/ja/global.json @@ -103,5 +103,5 @@ "cookies.message": "このWEBサイトは、心地良くご使用頂くためにクッキーを使用しています。", "cookies.accept": "了解!", "cookies.learn_more": "もっと詳しく", - "edited": "Edited" + "edited": "編集されました" } \ No newline at end of file diff --git a/public/language/ja/groups.json b/public/language/ja/groups.json index 3bdc18aa6c..8b60fbbd52 100644 --- a/public/language/ja/groups.json +++ b/public/language/ja/groups.json @@ -53,5 +53,5 @@ "upload-group-cover": "グループのカバーをアップロード", "bulk-invite-instructions": "ユーザー名をカンマ区切りして入力することで、このグループへ招待します。", "bulk-invite": "バルク招待", - "remove_group_cover_confirm": "Are you sure you want to remove the cover picture?" + "remove_group_cover_confirm": "カバー写真を削除してもよろしいですか?" } \ No newline at end of file diff --git a/public/language/ja/modules.json b/public/language/ja/modules.json index 7b12c5f498..938c217701 100644 --- a/public/language/ja/modules.json +++ b/public/language/ja/modules.json @@ -13,7 +13,7 @@ "chat.contacts": "お問い合わせ", "chat.message-history": "メッセージ履歴", "chat.pop-out": "チャットを別ウィンドウで表示する", - "chat.minimize": "Minimize", + "chat.minimize": "最小化", "chat.maximize": "最大化", "chat.seven_days": "7日間", "chat.thirty_days": "30日間", @@ -38,7 +38,7 @@ "composer.upload-picture": "画像をアップロード", "composer.upload-file": "ファイルをアップロード", "composer.zen_mode": "Zen モード", - "composer.select_category": "カテゴリーを選択", + "composer.select_category": "カテゴリを選択", "bootbox.ok": "OK", "bootbox.cancel": "キャンセル", "bootbox.confirm": "確認", diff --git a/public/language/ja/notifications.json b/public/language/ja/notifications.json index 34b16e4c88..3ac6f9d9b1 100644 --- a/public/language/ja/notifications.json +++ b/public/language/ja/notifications.json @@ -19,10 +19,13 @@ "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_posted_topic": "%1 が新しいスレッドを投稿しました。: %2", "user_started_following_you": "%1があなたをフォローしました。", "user_started_following_you_dual": "%1%2 があなたをフォローしました。", "user_started_following_you_multiple": "%1 と %2 または他のユーザーがあなたをフォローしました。", diff --git a/public/language/ja/pages.json b/public/language/ja/pages.json index 79ad63add2..e25dffa625 100644 --- a/public/language/ja/pages.json +++ b/public/language/ja/pages.json @@ -1,12 +1,12 @@ { "home": "ホーム", - "unread": "未読トピック", - "popular-day": "今日人気のトピック", - "popular-week": "今週人気のトピック", - "popular-month": "今月人気のトピック", - "popular-alltime": "人気のトピック", + "unread": "未読スレッド", + "popular-day": "本日人気のスレッド", + "popular-week": "今週人気のスレッド", + "popular-month": "今月人気のスレッド", + "popular-alltime": "人気のスレッド", "recent": "最新スレッド", - "flagged-posts": "投稿にフラグを立てました", + "flagged-content": "フラグ付きコンテンツ", "ip-blacklist": "IPブラックリスト", "users/online": "オンラインのユーザー", "users/latest": "最近のユーザー", @@ -17,7 +17,7 @@ "users/search": "ユーザーを検索", "notifications": "通知", "tags": "タグ", - "tag": "トピックは\"%1\"の下にタグ付けされました", + "tag": "スレッドは\"%1\"の下にタグ付けされました", "register": "アカウントを登録", "registration-complete": "登録完了", "login": "あなたのアカウントでログイン", @@ -27,6 +27,8 @@ "group": "%1 グループ", "chats": "チャット", "chat": "%1とチャットします", + "flags": "フラグ", + "flag-details": "フラグ%1の詳細", "account/edit": "編集中 \"%1\"", "account/edit/password": "\"%1\"のパスワードを編集中", "account/edit/username": "\"%1\"のユーザー名を編集中", @@ -39,7 +41,7 @@ "account/groups": "%1 グループ", "account/bookmarks": "%1のブックマークされた投稿", "account/settings": "ユーザー設定", - "account/watched": " %1がトピックを見ました。", + "account/watched": " %1がスレッドを見ました。", "account/upvoted": "%1が投稿を高評価しました", "account/downvoted": "%1が投稿を低評価しました", "account/best": "%1のベストな投稿", diff --git a/public/language/ja/recent.json b/public/language/ja/recent.json index d5fab488e6..57aed3f560 100644 --- a/public/language/ja/recent.json +++ b/public/language/ja/recent.json @@ -6,13 +6,13 @@ "year": "年", "alltime": "全て", "no_recent_topics": "最近のスレッドはありません。", - "no_popular_topics": "人気トピックはありません。", - "there-is-a-new-topic": "新しいトピックがあります。", - "there-is-a-new-topic-and-a-new-post": "新しいトピックと投稿があります。", - "there-is-a-new-topic-and-new-posts": "新しいトピックと%1件の投稿があります。", - "there-are-new-topics": "新しいトピックが%1個あります。", - "there-are-new-topics-and-a-new-post": "新しいトピックがと投稿が%1件あります。", - "there-are-new-topics-and-new-posts": "新しいトピックが%1件、新しい投稿が%2件あります。", + "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": "ここを押して、更新します。" diff --git a/public/language/ja/search.json b/public/language/ja/search.json index db33e034bb..cd72314897 100644 --- a/public/language/ja/search.json +++ b/public/language/ja/search.json @@ -8,10 +8,11 @@ "posted-by": "投稿者:", "in-categories": "カテゴリ", "search-child-categories": "チャイルドカテゴリを検索する", - "has-tags": "Has tags", + "has-tags": "タグあり", "reply-count": "返信数", "at-least": "最低", "at-most": "一番", + "relevance": "妥当性", "post-time": "投稿時間", "newer-than": "より新しい", "older-than": "より古い", @@ -25,10 +26,10 @@ "one-year": "1年", "sort-by": "並び替え", "last-reply-time": "最後の返信時間", - "topic-title": "トピック題名", + "topic-title": "スレッドのタイトル", "number-of-replies": "返信数", "number-of-views": "表示数", - "topic-start-date": "トピック開始日", + "topic-start-date": "スレッド開始日", "username": "ユーザー名", "category": "カテゴリ", "descending": "降順", diff --git a/public/language/ja/tags.json b/public/language/ja/tags.json index 3d0cb038b5..8c619745a3 100644 --- a/public/language/ja/tags.json +++ b/public/language/ja/tags.json @@ -1,5 +1,5 @@ { - "no_tag_topics": "このタグに関連するトピックはありません。", + "no_tag_topics": "このタグに関連するスレッドはありません。", "tags": "タグ", "enter_tags_here": "ここにタグを入力します。一つのタグが%1から%2までの文字にして下さい。", "enter_tags_here_short": "タグを入れます…", diff --git a/public/language/ja/topic.json b/public/language/ja/topic.json index 005910aaf0..0719e1d021 100644 --- a/public/language/ja/topic.json +++ b/public/language/ja/topic.json @@ -1,72 +1,56 @@ { - "topic": "トピック", - "topic_id": "トピックID", - "topic_id_placeholder": "トピックIDを入力してください", - "no_topics_found": "トピックが見つかりません!", + "topic": "スレッド", + "topic_id": "スレッドID", + "topic_id_placeholder": "スレッドIDを入力してください", + "no_topics_found": "スレッドが見つかりません!", "no_posts_found": "投稿はありません!", "post_is_deleted": "この投稿が削除されました!", - "topic_is_deleted": "このトピックは削除されました!", + "topic_is_deleted": "このスレッドは削除されました!", "profile": "プロフィール", "posted_by": "%1さんが投稿", "posted_by_guest": "ゲストさんが投稿", "chat": "チャット", - "notify_me": "このトピックに新しく投稿された時に通知する", + "notify_me": "このスレッドに新しく投稿された時に通知する", "quote": "引用", "reply": "返信", - "replies_to_this_post": "返信: %1件", - "reply-as-topic": "トピックとして返信する", + "replies_to_this_post": "%1 件の返信", + "last_reply_time": "最後の返信", + "reply-as-topic": "スレッドとして返信する", "guest-login-reply": "投稿するのにログインして下さい", "edit": "編集", "delete": "削除", - "purge": "粛清", + "purge": "切り離し", "restore": "リストア", "move": "移動", "fork": "フォーク", "link": "リンク", "share": "シェア", "tools": "ツール", - "flag": "フラグ", "locked": "ロック", "pinned": "ピンされた", "moved": "移動しました", "bookmark_instructions": "ここをクリックすると、このスレッドの最後に読んでいた投稿へ移動します。", "flag_title": "問題を報告する", - "flag_success": "この投稿をリポートしました。", - "flag_manage_title": "%1 の投稿にフラグをつけました", - "flag_manage_history": "活動履歴", - "flag_manage_no_history": "報告できるイベント履歴はありません", - "flag_manage_assignee": "譲受人", - "flag_manage_state": "状態", - "flag_manage_state_open": "新規/開く", - "flag_manage_state_wip": "進行中の作業", - "flag_manage_state_resolved": "解決済み", - "flag_manage_state_rejected": "拒否済", - "flag_manage_notes": "共有されたノート", - "flag_manage_update": "フラグの状態を更新", - "flag_manage_history_assignee": "%1が割り当てられました", - "flag_manage_history_state": "%1に更新された状態", - "flag_manage_history_notes": "フラグのメモが更新されました", - "flag_manage_saved": "フラグの詳細が更新されました", - "deleted_message": "このトピックが削除されました。トピック管理権を持っているユーザーにしか読めません。", + "deleted_message": "このスレッドが削除されました。スレッド管理権を持っているユーザーにしか読めません。", "following_topic.message": "このスレッドが更新された際に通知を受け取ります。", - "not_following_topic.message": "あなたはトピック一覧を未読にすると、このトピックを参照できます。ただし誰かがこのトピックに投稿したときは通知を受信できません。", - "ignoring_topic.message": "あなたは、これ以上この未読トピックを一覧に表示しておくことが出来なくなります。追跡するか、あなたの投稿が高評価を受けると通知されます。", + "not_following_topic.message": "あなたはスレッド一覧を未読にすると、このスレッドを参照できます。ただし誰かがこのスレッドに投稿したときは通知を受信できません。", + "ignoring_topic.message": "あなたは、これ以上この未読スレッドを一覧に表示しておくことが出来なくなります。追跡するか、あなたの投稿が高評価を受けると通知されます。", "login_to_subscribe": "このスレッドを購読するためにログインが必要です。", "markAsUnreadForAll.success": "すべてのスレッドを未読にしました。", "mark_unread": "未読としてマーク", - "mark_unread.success": "トピックは未読にマークされました。", - "watch": "ウオッチ", - "unwatch": "ウオッチ解除", + "mark_unread.success": "スレッドは未読にマークされました。", + "watch": "ウォッチ", + "unwatch": "ウォッチ解除", "watch.title": "新しい投稿の通知を受ける", - "unwatch.title": "このトピックの通知を停止します", + "unwatch.title": "このスレッドの通知を停止します", "share_this_post": "投稿を共有", "watching": "ウォッチ中", "not-watching": "ウォッチ中ではありません", "ignoring": "無視", - "watching.description": "新しい返信のお知らせです。
未読のトピックを表示", - "not-watching.description": "新しく返信通知を受け取らない。
カテゴリが無視されていない場合、未読のトピックを表示します。", - "ignoring.description": "新しく返信通知を受け取らない。
未読のトピックは表示されません。", - "thread_tools.title": "トピックのツール", + "watching.description": "新しい返信のお知らせです。
未読のスレッドを表示", + "not-watching.description": "新しく返信通知を受け取らない。
カテゴリが無視されていない場合、未読のスレッドを表示します。", + "ignoring.description": "新しく返信通知を受け取らない。
未読のスレッドは表示されません。", + "thread_tools.title": "スレッドツール", "thread_tools.markAsUnreadForAll": "すべて未読にマーク", "thread_tools.pin": "スレッドを最上部に固定", "thread_tools.unpin": "スレッドの固定を解除", @@ -79,13 +63,13 @@ "thread_tools.delete-posts": "投稿を削除します", "thread_tools.delete_confirm": "本当にこの投稿を削除しますか?", "thread_tools.restore": "スレッドをリストア", - "thread_tools.restore_confirm": "本当にこのトピックを戻しますか?", - "thread_tools.purge": "トピックを粛清します", - "thread_tools.purge_confirm": "本当にこのトピックを粛清しますか?", + "thread_tools.restore_confirm": "本当にこのスレッドを戻しますか?", + "thread_tools.purge": "スレッドを切り離します", + "thread_tools.purge_confirm": "本当にこのスレッドを切り離しますか?", "topic_move_success": "このスレッドを%1に移動しました。", "post_delete_confirm": "本当にこの投稿を削除しますか?", "post_restore_confirm": "本当にこの投稿を元に戻しますか?", - "post_purge_confirm": "本当にこの投稿を粛清しますか?", + "post_purge_confirm": "本当にこの投稿を切り離しますか?", "load_categories": "板をローディング中...", "disabled_categories_note": "使用不可の板はグレーに表示されます。", "confirm_move": "移動", @@ -95,7 +79,7 @@ "bookmarks.has_no_bookmarks": "まだ投稿をブックマークしていません。", "loading_more_posts": "もっと見る", "move_topic": "スレッドを移動", - "move_topics": "トピックを移動する", + "move_topics": "スレッドを移動する", "move_post": "投稿を移動", "post_moved": "投稿を移動しました!", "fork_topic": "スレッドをフォーク", @@ -103,9 +87,9 @@ "fork_topic_instruction": "フォークしたい投稿をクリックして", "fork_no_pids": "投稿が選択されていません!", "fork_pid_count": "%1 投稿(s)が選択されました", - "fork_success": "トピックをフォークするのに成功しました。ここを押して、このフォークしたトピックに行きます。", - "delete_posts_instruction": "削除または粛清するには、当てはまる投稿を押してください", - "composer.title_placeholder": "スレッドのタイトルを入力して...", + "fork_success": "スレッドをフォークするのに成功しました。ここを押して、このフォークしたスレッドに行きます。", + "delete_posts_instruction": "削除または切り離するには、当てはまる投稿を押してください", + "composer.title_placeholder": "スレッドのタイトルを入力...", "composer.handle_placeholder": "名前", "composer.discard": "破棄する", "composer.submit": "保存する", @@ -123,16 +107,13 @@ "more_guests": "ゲストさんが%1人", "users_and_others": "%1と他は%2", "sort_by": "並び替え", - "oldest_to_newest": "新しい順に", - "newest_to_oldest": "古い順に", - "most_votes": "最高評価", - "most_posts": "最高投稿", - "stale.title": "新しいトピックを作りますか?", - "stale.warning": "あなたが返信しようとしてるトピックが古いトピックです。新しいトピックを作って、そしてこのトピックが参考として入れた方を勧めます。そうしますか?", - "stale.create": "新しいトピックを作ります。", - "stale.reply_anyway": "とにかく、このトピックに返信します", - "link_back": "返信: [%1](%2)", - "spam": "スパム", - "offensive": "攻撃", - "custom-flag-reason": "フラグを入れた理由" + "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/ja/unread.json b/public/language/ja/unread.json index a49ff984b0..feaef7879f 100644 --- a/public/language/ja/unread.json +++ b/public/language/ja/unread.json @@ -1,13 +1,13 @@ { "title": "未読", - "no_unread_topics": "未読のトピックがあります。", + "no_unread_topics": "未読のスレッドはありません。", "load_more": "もっと見る", "mark_as_read": "既読にする", "selected": "選択済み", "all": "全て", "all_categories": "全てのカテゴリ", "topics_marked_as_read.success": "すべてのスレッドを既読にしました。", - "all-topics": "すべてのトピック", - "new-topics": "新しいトピック", - "watched-topics": "トピックをウォッチしました" + "all-topics": "すべてのスレッド", + "new-topics": "新しいスレッド", + "watched-topics": "スレッドをウォッチしました" } \ No newline at end of file diff --git a/public/language/ja/user.json b/public/language/ja/user.json index e29a50ee5f..dad3e17d58 100644 --- a/public/language/ja/user.json +++ b/public/language/ja/user.json @@ -33,6 +33,7 @@ "chat": "チャット", "chat_with": "%1とチャットを続ける", "new_chat_with": "%1とチャットを始める", + "flag-profile": "プロフィールを報告する", "follow": "フォロー", "unfollow": "フォロー解除", "more": "つづき", @@ -50,7 +51,7 @@ "change_password": "パスワードを変更", "change_password_error": "無効のパスワード!", "change_password_error_wrong_current": "現在のパスワードは正しくありません!", - "change_password_error_length": "パスワードは短い過ぎです!", + "change_password_error_length": "パスワードが短過ぎです!", "change_password_error_match": "パスワードは一致しません!", "change_password_error_privileges": "パスワードを更新する権限はありません。", "change_password_success": "パスワードを更新しました!", @@ -63,7 +64,9 @@ "upload_a_picture": "画像をアップロード", "remove_uploaded_picture": "アップした写真を取り消します", "upload_cover_picture": "カバー写真をアップロード", - "remove_cover_picture_confirm": "Are you sure you want to remove the cover picture?", + "remove_cover_picture_confirm": "カバー写真を削除してもよろしいですか?", + "crop_picture": "画像を切り抜く", + "upload_cropped_picture": "切り抜いてアップロード", "settings": "設定", "show_email": "メールアドレスを表示", "show_fullname": "フルネームで表示", @@ -75,19 +78,19 @@ "digest_weekly": "ウィークリー", "digest_monthly": "マンスリー", "send_chat_notifications": "オンラインではない時に新しいチャットメッセージを受信した場合、通知メールを送信する。", - "send_post_notifications": "購読中のトピックに返信があった場合、メールで通知する。", - "settings-require-reload": "変化がありましてブラウザを更新する必要があります。ここを押して、ページ更新します。", + "send_post_notifications": "購読中のスレッドに返信があった場合、メールで通知する。", + "settings-require-reload": "設定を変更するにはページを更新する必要があります。ここを押して、ページを更新します。", "has_no_follower": "フォロワーはまだいません :(", "follows_no_one": "フォロー中のユーザーはまだいません :(", "has_no_posts": "このユーザーはまだ一つも投稿していません", - "has_no_topics": "このユーザーはまだ一つもトピックを作っていません", - "has_no_watched_topics": "このユーザーはまだ一つもトピックをウオッチしていません", + "has_no_topics": "このユーザーはまだ一つもスレッドを作っていません", + "has_no_watched_topics": "このユーザーはまだ一つもスレッドをウォッチしていません", "has_no_upvoted_posts": "このユーザーはまだ一つも投稿に高評価を付けていません。", "has_no_downvoted_posts": "このユーザーはまだ一つも投稿に低評価を付けていません。", "has_no_voted_posts": "このユーザーは投稿を評価していません。", "email_hidden": "メールアドレスを非表示", "hidden": "非表示", - "paginate_description": "無限スクロールの代わりに、投稿やトピックをページ別で切り替える。", + "paginate_description": "無限スクロールの代わりに、投稿やスレッドをページ別で切り替える。", "topics_per_page": "ページごとのスレッド数", "posts_per_page": "ページごとの投稿数", "notification_sounds": "通知の時に音を鳴らします", @@ -98,13 +101,13 @@ "no-sound": "無音", "browsing": "ブラウジングの設定", "open_links_in_new_tab": "外部リンクを新しいタブで開く", - "enable_topic_searching": "インートピックの検索を有効にします", - "topic_search_help": "有効にしたら、インートピックの検索はブラウザの既定機能を無視して、スクリーンに示したよりトピック内からの全部を検索します", + "enable_topic_searching": "インースレッドの検索を有効にします", + "topic_search_help": "有効にしたら、インースレッドの検索はブラウザの既定機能を無視して、スクリーンに示したよりスレッド内からの全部を検索します", "delay_image_loading": "画像読み込みを遅延させる", - "image_load_delay_help": "有効の場合、トピック内の画像はスクロールされるまで読み込みません", + "image_load_delay_help": "有効の場合、スレッド内の画像はスクロールされるまで読み込みません", "scroll_to_my_post": "返信を投稿した後、新しい投稿を表示する", - "follow_topics_you_reply_to": "あなたが返信するトピックをウォッチ", - "follow_topics_you_create": "あなたが作成したトピックをウォッチする", + "follow_topics_you_reply_to": "あなたが返信したスレッドをウォッチする", + "follow_topics_you_create": "あなたが作成したスレッドをウォッチする", "grouptitle": "グループ題名", "no-group-title": "グループ名がありません", "select-skin": "スキンを選んで下さい", diff --git a/public/language/ja/users.json b/public/language/ja/users.json index 514a3f08dd..a79f15c4cc 100644 --- a/public/language/ja/users.json +++ b/public/language/ja/users.json @@ -12,9 +12,9 @@ "invite": "招待", "invitation-email-sent": "招待メールが%1に送られました。", "user_list": "ユーザー一覧", - "recent_topics": "最新トピック", - "popular_topics": "人気トピック", - "unread_topics": "未読トピック", + "recent_topics": "最新スレッド", + "popular_topics": "人気のスレッド", + "unread_topics": "未読スレッド", "categories": "カテゴリ", "tags": "タグ", "no-users-found": "ユーザーが見つかりません!" diff --git a/public/language/ko/admin/advanced/errors.json b/public/language/ko/admin/advanced/errors.json index 963e68b116..546f0f1508 100644 --- a/public/language/ko/admin/advanced/errors.json +++ b/public/language/ko/admin/advanced/errors.json @@ -8,7 +8,7 @@ "clear-error-log": "Clear Error Log", "route": "Route", "count": "Count", - "no-routes-not-found": "Hooray! There are no routes that were not found.", + "no-routes-not-found": "Hooray! No 404 errors!", "clear404-confirm": "Are you sure you wish to clear the 404 error logs?", "clear404-success": "\"404 Not Found\" errors cleared" } \ No newline at end of file diff --git a/public/language/ko/admin/general/dashboard.json b/public/language/ko/admin/general/dashboard.json index b82802db1b..a70dda322e 100644 --- a/public/language/ko/admin/general/dashboard.json +++ b/public/language/ko/admin/general/dashboard.json @@ -2,6 +2,9 @@ "forum-traffic": "Forum Traffic", "page-views": "Page Views", "unique-visitors": "Unique Visitors", + "users": "Users", + "posts": "Posts", + "topics": "Topics", "page-views-last-month": "Page views Last Month", "page-views-this-month": "Page views This Month", "page-views-last-day": "Page views in last 24 hours", @@ -20,6 +23,11 @@ "prerelease-warning": "

This is a pre-release version of NodeBB. Unintended bugs may occur.

", "notices": "Notices", + "restart-not-required": "Restart not required", + "restart-required": "Restart required", + "search-plugin-installed": "Search Plugin installed", + "search-plugin-not-installed": "Search Plugin not installed", + "search-plugin-tooltip": "Install a search plugin from the plugin page in order to activate search functionality", "control-panel": "System Control", "reload": "Reload", @@ -52,4 +60,4 @@ "graphs.unique-visitors": "Unique Visitors", "graphs.registered-users": "Registered Users", "graphs.anonymous-users": "Anonymous Users" -} \ No newline at end of file +} diff --git a/public/language/ko/admin/menu.json b/public/language/ko/admin/menu.json index 6a4995ea6e..985c540e8a 100644 --- a/public/language/ko/admin/menu.json +++ b/public/language/ko/admin/menu.json @@ -13,7 +13,6 @@ "manage/users": "Users", "manage/registration": "Registration Queue", "manage/groups": "Groups", - "manage/flags": "Flags", "manage/ip-blacklist": "IP Blacklist", "section-settings": "Settings", diff --git a/public/language/ko/admin/settings/general.json b/public/language/ko/admin/settings/general.json index c26740ee4f..72ecfe641f 100644 --- a/public/language/ko/admin/settings/general.json +++ b/public/language/ko/admin/settings/general.json @@ -26,5 +26,6 @@ "touch-icon.upload": "Upload", "touch-icon.help": "Recommended size and format: 192x192, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.", "outgoing-links": "Outgoing Links", - "outgoing-links.warning-page": "Use Outgoing Links Warning Page" + "outgoing-links.warning-page": "Use Outgoing Links Warning Page", + "search-default-sort-by": "Search default sort by" } \ No newline at end of file diff --git a/public/language/ko/admin/settings/uploads.json b/public/language/ko/admin/settings/uploads.json index 8a56c85663..35eaa5a58f 100644 --- a/public/language/ko/admin/settings/uploads.json +++ b/public/language/ko/admin/settings/uploads.json @@ -9,7 +9,7 @@ "allow-topic-thumbnails": "Allow users to upload topic thumbnails", "topic-thumb-size": "Topic Thumb Size", "allowed-file-extensions": "Allowed File Extensions", - "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc).\n\t\t\t\t\tAn empty list means all extensions are allowed.", + "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc). An empty list means all extensions are allowed.", "profile-avatars": "Profile Avatars", "allow-profile-image-uploads": "Allow users to upload profile images", "convert-profile-image-png": "Convert profile image uploads to PNG", @@ -25,4 +25,4 @@ "profile-covers": "Profile Covers", "default-covers": "Default Cover Images", "default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image" -} \ No newline at end of file +} diff --git a/public/language/ko/notifications.json b/public/language/ko/notifications.json index a6c9dd68e6..7086f01fa4 100644 --- a/public/language/ko/notifications.json +++ b/public/language/ko/notifications.json @@ -19,6 +19,9 @@ "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 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님이 %2에 답글을 작성했습니다.", "user_posted_to_dual": "%1 님과 %2 님이 %3 에 답글을 달았습니다.", "user_posted_to_multiple": "%1 님과 %2 명의 다른 유저들이 %3 에 답글을 달았습니다.", diff --git a/public/language/ko/pages.json b/public/language/ko/pages.json index 553595268e..2d258932ac 100644 --- a/public/language/ko/pages.json +++ b/public/language/ko/pages.json @@ -6,7 +6,7 @@ "popular-month": "인기있는 주제 (월간)", "popular-alltime": "인기있는 주제", "recent": "최근 주제", - "flagged-posts": "플래그된 게시물", + "flagged-content": "Flagged Content", "ip-blacklist": "IP Blacklist", "users/online": "온라인 사용자", "users/latest": "최근 사용자", @@ -27,6 +27,8 @@ "group": "%1 그룹", "chats": "대화", "chat": "%1 님과 대화", + "flags": "Flags", + "flag-details": "Flag %1 Details", "account/edit": "\"%1\" 편집", "account/edit/password": "\"%1\" 의 패스워드 변경", "account/edit/username": "\"%1\" 의 사용자명 변경", diff --git a/public/language/ko/search.json b/public/language/ko/search.json index 5f99163dc0..0dde0601e2 100644 --- a/public/language/ko/search.json +++ b/public/language/ko/search.json @@ -12,6 +12,7 @@ "reply-count": "답변 수", "at-least": "적어도", "at-most": "최대", + "relevance": "Relevance", "post-time": "작성시간", "newer-than": "이전", "older-than": "이후", diff --git a/public/language/ko/topic.json b/public/language/ko/topic.json index ab12f8bb11..4b6775f329 100644 --- a/public/language/ko/topic.json +++ b/public/language/ko/topic.json @@ -13,7 +13,8 @@ "notify_me": "이 주제의 새 답글 알리기", "quote": "인용", "reply": "답글", - "replies_to_this_post": "Replies: %1", + "replies_to_this_post": "%1 Replies", + "last_reply_time": "Last reply", "reply-as-topic": "주제로 답글", "guest-login-reply": "답변을 위해 로그인하기", "edit": "수정", @@ -25,28 +26,11 @@ "link": "링크", "share": "공유", "tools": "도구", - "flag": "신고", "locked": "잠김", "pinned": "Pinned", "moved": "Moved", "bookmark_instructions": "이 스레드에서 읽은 마지막 게시글로 이동하시려면 여기를 클릭하세요.", "flag_title": "이 게시물을 신고", - "flag_success": "이 게시물은 신고되었습니다.", - "flag_manage_title": "Flagged post in %1", - "flag_manage_history": "Action History", - "flag_manage_no_history": "No event history to report", - "flag_manage_assignee": "Assignee", - "flag_manage_state": "State", - "flag_manage_state_open": "New/Open", - "flag_manage_state_wip": "Work in Progress", - "flag_manage_state_resolved": "Resolved", - "flag_manage_state_rejected": "Rejected", - "flag_manage_notes": "Shared Notes", - "flag_manage_update": "Update Flag Status", - "flag_manage_history_assignee": "Assigned to %1", - "flag_manage_history_state": "Updated state to %1", - "flag_manage_history_notes": "Updated flag notes", - "flag_manage_saved": "Flag Details Updated", "deleted_message": "이 주제는 삭제되었습니다. 주제 관리 권한이 있는 사용자만 볼 수 있습니다.", "following_topic.message": "이제 이 주제에 새 답글이 달리면 알림을 받습니다.", "not_following_topic.message": "You will see this topic in the unread topics list, but you will not receive notifications when somebody posts to this topic.", @@ -131,8 +115,5 @@ "stale.warning": "현재 답글을 작성중인 주제가 꽤 오래되었습니다. 새로 주제를 생성하시고 이글을 인용하시겠습니까?", "stale.create": "새로운 주제를 작성", "stale.reply_anyway": "아무튼 이 주제에 답변해주세요.", - "link_back": "답글: [%1](%2)", - "spam": "스팸", - "offensive": "공격적인", - "custom-flag-reason": "신고 사유를 입력하세요." + "link_back": "답글: [%1](%2)" } \ No newline at end of file diff --git a/public/language/ko/user.json b/public/language/ko/user.json index 68bd356579..f33875aaaa 100644 --- a/public/language/ko/user.json +++ b/public/language/ko/user.json @@ -33,6 +33,7 @@ "chat": "채팅", "chat_with": "Continue chat with %1", "new_chat_with": "Start new chat with %1", + "flag-profile": "Flag Profile", "follow": "팔로우", "unfollow": "팔로우 취소", "more": "더 보기", @@ -64,6 +65,8 @@ "remove_uploaded_picture": "등록된 사진을 삭제", "upload_cover_picture": "커버 사진 업로드", "remove_cover_picture_confirm": "Are you sure you want to remove the cover picture?", + "crop_picture": "Crop picture", + "upload_cropped_picture": "Crop and upload", "settings": "설정", "show_email": "이메일 공개", "show_fullname": "실명 공개", diff --git a/public/language/lt/admin/advanced/errors.json b/public/language/lt/admin/advanced/errors.json index 963e68b116..546f0f1508 100644 --- a/public/language/lt/admin/advanced/errors.json +++ b/public/language/lt/admin/advanced/errors.json @@ -8,7 +8,7 @@ "clear-error-log": "Clear Error Log", "route": "Route", "count": "Count", - "no-routes-not-found": "Hooray! There are no routes that were not found.", + "no-routes-not-found": "Hooray! No 404 errors!", "clear404-confirm": "Are you sure you wish to clear the 404 error logs?", "clear404-success": "\"404 Not Found\" errors cleared" } \ No newline at end of file diff --git a/public/language/lt/admin/general/dashboard.json b/public/language/lt/admin/general/dashboard.json index b82802db1b..a70dda322e 100644 --- a/public/language/lt/admin/general/dashboard.json +++ b/public/language/lt/admin/general/dashboard.json @@ -2,6 +2,9 @@ "forum-traffic": "Forum Traffic", "page-views": "Page Views", "unique-visitors": "Unique Visitors", + "users": "Users", + "posts": "Posts", + "topics": "Topics", "page-views-last-month": "Page views Last Month", "page-views-this-month": "Page views This Month", "page-views-last-day": "Page views in last 24 hours", @@ -20,6 +23,11 @@ "prerelease-warning": "

This is a pre-release version of NodeBB. Unintended bugs may occur.

", "notices": "Notices", + "restart-not-required": "Restart not required", + "restart-required": "Restart required", + "search-plugin-installed": "Search Plugin installed", + "search-plugin-not-installed": "Search Plugin not installed", + "search-plugin-tooltip": "Install a search plugin from the plugin page in order to activate search functionality", "control-panel": "System Control", "reload": "Reload", @@ -52,4 +60,4 @@ "graphs.unique-visitors": "Unique Visitors", "graphs.registered-users": "Registered Users", "graphs.anonymous-users": "Anonymous Users" -} \ No newline at end of file +} diff --git a/public/language/lt/admin/menu.json b/public/language/lt/admin/menu.json index 6a4995ea6e..985c540e8a 100644 --- a/public/language/lt/admin/menu.json +++ b/public/language/lt/admin/menu.json @@ -13,7 +13,6 @@ "manage/users": "Users", "manage/registration": "Registration Queue", "manage/groups": "Groups", - "manage/flags": "Flags", "manage/ip-blacklist": "IP Blacklist", "section-settings": "Settings", diff --git a/public/language/lt/admin/settings/general.json b/public/language/lt/admin/settings/general.json index c26740ee4f..72ecfe641f 100644 --- a/public/language/lt/admin/settings/general.json +++ b/public/language/lt/admin/settings/general.json @@ -26,5 +26,6 @@ "touch-icon.upload": "Upload", "touch-icon.help": "Recommended size and format: 192x192, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.", "outgoing-links": "Outgoing Links", - "outgoing-links.warning-page": "Use Outgoing Links Warning Page" + "outgoing-links.warning-page": "Use Outgoing Links Warning Page", + "search-default-sort-by": "Search default sort by" } \ No newline at end of file diff --git a/public/language/lt/admin/settings/uploads.json b/public/language/lt/admin/settings/uploads.json index 8a56c85663..35eaa5a58f 100644 --- a/public/language/lt/admin/settings/uploads.json +++ b/public/language/lt/admin/settings/uploads.json @@ -9,7 +9,7 @@ "allow-topic-thumbnails": "Allow users to upload topic thumbnails", "topic-thumb-size": "Topic Thumb Size", "allowed-file-extensions": "Allowed File Extensions", - "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc).\n\t\t\t\t\tAn empty list means all extensions are allowed.", + "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc). An empty list means all extensions are allowed.", "profile-avatars": "Profile Avatars", "allow-profile-image-uploads": "Allow users to upload profile images", "convert-profile-image-png": "Convert profile image uploads to PNG", @@ -25,4 +25,4 @@ "profile-covers": "Profile Covers", "default-covers": "Default Cover Images", "default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image" -} \ No newline at end of file +} diff --git a/public/language/lt/notifications.json b/public/language/lt/notifications.json index 1e8f1b20bf..e67ffb0c19 100644 --- a/public/language/lt/notifications.json +++ b/public/language/lt/notifications.json @@ -19,6 +19,9 @@ "user_flagged_post_in": "%1pagrįso nuomone čia %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 parašė atsaką %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", diff --git a/public/language/lt/pages.json b/public/language/lt/pages.json index 26a2b0167a..62fe318c71 100644 --- a/public/language/lt/pages.json +++ b/public/language/lt/pages.json @@ -6,7 +6,7 @@ "popular-month": "Popular topics this month", "popular-alltime": "All time popular topics", "recent": "Paskutinės temos", - "flagged-posts": "Flagged Posts", + "flagged-content": "Flagged Content", "ip-blacklist": "IP Blacklist", "users/online": "Online Users", "users/latest": "Latest Users", @@ -27,6 +27,8 @@ "group": "%1 group", "chats": "Chats", "chat": "Chatting with %1", + "flags": "Flags", + "flag-details": "Flag %1 Details", "account/edit": "Editing \"%1\"", "account/edit/password": "Editing password of \"%1\"", "account/edit/username": "Editing username of \"%1\"", diff --git a/public/language/lt/search.json b/public/language/lt/search.json index 25a91a9923..a415b1e30b 100644 --- a/public/language/lt/search.json +++ b/public/language/lt/search.json @@ -12,6 +12,7 @@ "reply-count": "Atsakymų skaičiavimas", "at-least": "Mažiausiai", "at-most": "Daugiausia", + "relevance": "Relevance", "post-time": "Įrašo laikas", "newer-than": "Naujesni kaip", "older-than": "Senesni kaip", diff --git a/public/language/lt/topic.json b/public/language/lt/topic.json index 6cb1219347..c2e8c8bd56 100644 --- a/public/language/lt/topic.json +++ b/public/language/lt/topic.json @@ -13,7 +13,8 @@ "notify_me": "Gauti pranešimus apie naujus atsakymus šioje temoje", "quote": "Cituoti", "reply": "Atsakyti", - "replies_to_this_post": "Replies: %1", + "replies_to_this_post": "%1 Replies", + "last_reply_time": "Last reply", "reply-as-topic": "Reply as topic", "guest-login-reply": "Norėdami atsakyti, prisijunkite", "edit": "Redaguoti", @@ -25,28 +26,11 @@ "link": "Nuoroda", "share": "Dalintis", "tools": "Įrankiai", - "flag": "Pažymėti", "locked": "Užrakinta", "pinned": "Pinned", "moved": "Moved", "bookmark_instructions": "Click here to return to the last read post in this thread.", "flag_title": "Pažymėti ši pranešimą moderatoriams", - "flag_success": "Šis pranešimas buvo pažymėtas moderatorių patikrinimui.", - "flag_manage_title": "Flagged post in %1", - "flag_manage_history": "Action History", - "flag_manage_no_history": "No event history to report", - "flag_manage_assignee": "Assignee", - "flag_manage_state": "State", - "flag_manage_state_open": "New/Open", - "flag_manage_state_wip": "Work in Progress", - "flag_manage_state_resolved": "Resolved", - "flag_manage_state_rejected": "Rejected", - "flag_manage_notes": "Shared Notes", - "flag_manage_update": "Update Flag Status", - "flag_manage_history_assignee": "Assigned to %1", - "flag_manage_history_state": "Updated state to %1", - "flag_manage_history_notes": "Updated flag notes", - "flag_manage_saved": "Flag Details Updated", "deleted_message": "Ši tema buvo ištrinta. Tik Vartotojai su temos redagavimo privilegijomis gali matyti ja", "following_topic.message": "Dabar jūs gausite pranešimus kai kas nors atrašys šioje temoje.", "not_following_topic.message": "You will see this topic in the unread topics list, but you will not receive notifications when somebody posts to this topic.", @@ -131,8 +115,5 @@ "stale.warning": "The topic you are replying to is quite old. Would you like to create a new topic instead, and reference this one in your reply?", "stale.create": "Create a new topic", "stale.reply_anyway": "Reply to this topic anyway", - "link_back": "Re: [%1](%2)", - "spam": "Spam", - "offensive": "Offensive", - "custom-flag-reason": "Enter a flagging reason" + "link_back": "Re: [%1](%2)" } \ No newline at end of file diff --git a/public/language/lt/user.json b/public/language/lt/user.json index eebcf85b8f..2255264355 100644 --- a/public/language/lt/user.json +++ b/public/language/lt/user.json @@ -33,6 +33,7 @@ "chat": "Susirašinėti", "chat_with": "Continue chat with %1", "new_chat_with": "Start new chat with %1", + "flag-profile": "Flag Profile", "follow": "Sekti", "unfollow": "Nesekti", "more": "Daugiau", @@ -64,6 +65,8 @@ "remove_uploaded_picture": "Ištrinti paveikslėlį", "upload_cover_picture": "Įkelti viršelio nuotrauką", "remove_cover_picture_confirm": "Are you sure you want to remove the cover picture?", + "crop_picture": "Crop picture", + "upload_cropped_picture": "Crop and upload", "settings": "Nustatymai", "show_email": "Rodyti mano el. paštą viešai", "show_fullname": "Rodyti mano vardą ir pavardę", diff --git a/public/language/ms/admin/advanced/errors.json b/public/language/ms/admin/advanced/errors.json index 963e68b116..546f0f1508 100644 --- a/public/language/ms/admin/advanced/errors.json +++ b/public/language/ms/admin/advanced/errors.json @@ -8,7 +8,7 @@ "clear-error-log": "Clear Error Log", "route": "Route", "count": "Count", - "no-routes-not-found": "Hooray! There are no routes that were not found.", + "no-routes-not-found": "Hooray! No 404 errors!", "clear404-confirm": "Are you sure you wish to clear the 404 error logs?", "clear404-success": "\"404 Not Found\" errors cleared" } \ No newline at end of file diff --git a/public/language/ms/admin/general/dashboard.json b/public/language/ms/admin/general/dashboard.json index b82802db1b..a70dda322e 100644 --- a/public/language/ms/admin/general/dashboard.json +++ b/public/language/ms/admin/general/dashboard.json @@ -2,6 +2,9 @@ "forum-traffic": "Forum Traffic", "page-views": "Page Views", "unique-visitors": "Unique Visitors", + "users": "Users", + "posts": "Posts", + "topics": "Topics", "page-views-last-month": "Page views Last Month", "page-views-this-month": "Page views This Month", "page-views-last-day": "Page views in last 24 hours", @@ -20,6 +23,11 @@ "prerelease-warning": "

This is a pre-release version of NodeBB. Unintended bugs may occur.

", "notices": "Notices", + "restart-not-required": "Restart not required", + "restart-required": "Restart required", + "search-plugin-installed": "Search Plugin installed", + "search-plugin-not-installed": "Search Plugin not installed", + "search-plugin-tooltip": "Install a search plugin from the plugin page in order to activate search functionality", "control-panel": "System Control", "reload": "Reload", @@ -52,4 +60,4 @@ "graphs.unique-visitors": "Unique Visitors", "graphs.registered-users": "Registered Users", "graphs.anonymous-users": "Anonymous Users" -} \ No newline at end of file +} diff --git a/public/language/ms/admin/menu.json b/public/language/ms/admin/menu.json index 6a4995ea6e..985c540e8a 100644 --- a/public/language/ms/admin/menu.json +++ b/public/language/ms/admin/menu.json @@ -13,7 +13,6 @@ "manage/users": "Users", "manage/registration": "Registration Queue", "manage/groups": "Groups", - "manage/flags": "Flags", "manage/ip-blacklist": "IP Blacklist", "section-settings": "Settings", diff --git a/public/language/ms/admin/settings/general.json b/public/language/ms/admin/settings/general.json index c26740ee4f..72ecfe641f 100644 --- a/public/language/ms/admin/settings/general.json +++ b/public/language/ms/admin/settings/general.json @@ -26,5 +26,6 @@ "touch-icon.upload": "Upload", "touch-icon.help": "Recommended size and format: 192x192, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.", "outgoing-links": "Outgoing Links", - "outgoing-links.warning-page": "Use Outgoing Links Warning Page" + "outgoing-links.warning-page": "Use Outgoing Links Warning Page", + "search-default-sort-by": "Search default sort by" } \ No newline at end of file diff --git a/public/language/ms/admin/settings/uploads.json b/public/language/ms/admin/settings/uploads.json index 8a56c85663..35eaa5a58f 100644 --- a/public/language/ms/admin/settings/uploads.json +++ b/public/language/ms/admin/settings/uploads.json @@ -9,7 +9,7 @@ "allow-topic-thumbnails": "Allow users to upload topic thumbnails", "topic-thumb-size": "Topic Thumb Size", "allowed-file-extensions": "Allowed File Extensions", - "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc).\n\t\t\t\t\tAn empty list means all extensions are allowed.", + "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc). An empty list means all extensions are allowed.", "profile-avatars": "Profile Avatars", "allow-profile-image-uploads": "Allow users to upload profile images", "convert-profile-image-png": "Convert profile image uploads to PNG", @@ -25,4 +25,4 @@ "profile-covers": "Profile Covers", "default-covers": "Default Cover Images", "default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image" -} \ No newline at end of file +} diff --git a/public/language/ms/notifications.json b/public/language/ms/notifications.json index 722b7f3482..29243fda49 100644 --- a/public/language/ms/notifications.json +++ b/public/language/ms/notifications.json @@ -19,6 +19,9 @@ "user_flagged_post_in": "%1 menanda kiriman anda di %2", "user_flagged_post_in_dual": "%1 dan %2 telah menanda kiriman anda pada %3", "user_flagged_post_in_multiple": "%1 dan %2 lagi telah menanda kiriman anda pada %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 telah membalas kiriman kepada: %2", "user_posted_to_dual": "%1 dan %2 membalas kiriman : %3", "user_posted_to_multiple": "%1 dan %2 lagu membalas kiriman: %3", diff --git a/public/language/ms/pages.json b/public/language/ms/pages.json index d10ea46388..bfade44f86 100644 --- a/public/language/ms/pages.json +++ b/public/language/ms/pages.json @@ -6,7 +6,7 @@ "popular-month": "Topik Popular Bulan Ini", "popular-alltime": "Topik Popular Sepanjang Masa", "recent": "Topik Baru", - "flagged-posts": "Kiriman Dipalang", + "flagged-content": "Flagged Content", "ip-blacklist": "IP Blacklist", "users/online": "Pengguna Atas Talian", "users/latest": "Pengguna Terkini", @@ -27,6 +27,8 @@ "group": "%1 Kumpulan", "chats": "Borak", "chat": "Borak Dengan %1", + "flags": "Flags", + "flag-details": "Flag %1 Details", "account/edit": "Menyunting \"%1\"", "account/edit/password": "Mengemaskini kata laluan \"%1\"", "account/edit/username": "Mengemaskini nama pengguna \"%1\"", diff --git a/public/language/ms/search.json b/public/language/ms/search.json index 50c2f89614..a8124e414b 100644 --- a/public/language/ms/search.json +++ b/public/language/ms/search.json @@ -12,6 +12,7 @@ "reply-count": "Kira Balasan", "at-least": "Sekurang-kurangnya", "at-most": "Selebihnya", + "relevance": "Relevance", "post-time": "Masa kiriman", "newer-than": "Baru daripada", "older-than": "Lama daripada", diff --git a/public/language/ms/topic.json b/public/language/ms/topic.json index 2e932a66bd..c1aa71fee9 100644 --- a/public/language/ms/topic.json +++ b/public/language/ms/topic.json @@ -13,7 +13,8 @@ "notify_me": "Kekal dimaklumkan berkenaan respon dalam topik ini", "quote": "Petikan", "reply": "Balas", - "replies_to_this_post": "Replies: %1", + "replies_to_this_post": "%1 Replies", + "last_reply_time": "Last reply", "reply-as-topic": "Reply as topic", "guest-login-reply": "Log masuk untuk balas", "edit": "Sunting", @@ -25,28 +26,11 @@ "link": "Pautan", "share": "Kongsi", "tools": "Perkakas", - "flag": "Tanda", "locked": "Kunci", "pinned": "Pinned", "moved": "Moved", "bookmark_instructions": "Click here to return to the last read post in this thread.", "flag_title": "Tanda kiriman ini untuk diselia", - "flag_success": "Kiriman ini telah ditandakan untuk diselia", - "flag_manage_title": "Flagged post in %1", - "flag_manage_history": "Action History", - "flag_manage_no_history": "No event history to report", - "flag_manage_assignee": "Assignee", - "flag_manage_state": "State", - "flag_manage_state_open": "New/Open", - "flag_manage_state_wip": "Work in Progress", - "flag_manage_state_resolved": "Resolved", - "flag_manage_state_rejected": "Rejected", - "flag_manage_notes": "Shared Notes", - "flag_manage_update": "Update Flag Status", - "flag_manage_history_assignee": "Assigned to %1", - "flag_manage_history_state": "Updated state to %1", - "flag_manage_history_notes": "Updated flag notes", - "flag_manage_saved": "Flag Details Updated", "deleted_message": "Topik ini telah dipadam. Hanya pengguna dengan kuasa pengurusan boleh melihatnya.", "following_topic.message": "Anda akan menerima makluman apabila ada kiriman ke dalam topik ini", "not_following_topic.message": "You will see this topic in the unread topics list, but you will not receive notifications when somebody posts to this topic.", @@ -131,8 +115,5 @@ "stale.warning": "Topik yang anda nak balas agak lapuk. Adakah anda ingin buka topik baru dan rujukkan topik ini dalam balasan anda?", "stale.create": "Buka topik baru", "stale.reply_anyway": "Tetap balas topik ini", - "link_back": "Re: [%1](%2)", - "spam": "Spam", - "offensive": "Menyinggung", - "custom-flag-reason": "Nyatakan alasan anda" + "link_back": "Re: [%1](%2)" } \ No newline at end of file diff --git a/public/language/ms/user.json b/public/language/ms/user.json index be4f7de2b2..b6ebe15400 100644 --- a/public/language/ms/user.json +++ b/public/language/ms/user.json @@ -33,6 +33,7 @@ "chat": "Bersembang", "chat_with": "Continue chat with %1", "new_chat_with": "Start new chat with %1", + "flag-profile": "Flag Profile", "follow": "Ikuti", "unfollow": "Henti mengikuti", "more": "Lagi", @@ -64,6 +65,8 @@ "remove_uploaded_picture": "Buang Gambar Yang Dimuatnaik", "upload_cover_picture": "Upload cover picture", "remove_cover_picture_confirm": "Are you sure you want to remove the cover picture?", + "crop_picture": "Crop picture", + "upload_cropped_picture": "Crop and upload", "settings": "Tetapan", "show_email": "Tunjukkan emel saya", "show_fullname": "Tunjukkan Nama Penuh", diff --git a/public/language/nb/admin/admin.json b/public/language/nb/admin/admin.json index 9c01f56006..2b7692c47b 100644 --- a/public/language/nb/admin/admin.json +++ b/public/language/nb/admin/admin.json @@ -1,6 +1,6 @@ { - "alert.confirm-reload": "Are you sure you wish to reload NodeBB?", - "alert.confirm-restart": "Are you sure you wish to restart NodeBB?", + "alert.confirm-reload": "Er du sikker på at du ønsker å laste inn NoddeBB på nytt?", + "alert.confirm-restart": "Er du sikker på at du ønsker å restarte NoddeBB?", "acp-title": "%1 | NodeBB Admin Control Panel", "settings-header-contents": "Contents" diff --git a/public/language/nb/admin/advanced/errors.json b/public/language/nb/admin/advanced/errors.json index 963e68b116..546f0f1508 100644 --- a/public/language/nb/admin/advanced/errors.json +++ b/public/language/nb/admin/advanced/errors.json @@ -8,7 +8,7 @@ "clear-error-log": "Clear Error Log", "route": "Route", "count": "Count", - "no-routes-not-found": "Hooray! There are no routes that were not found.", + "no-routes-not-found": "Hooray! No 404 errors!", "clear404-confirm": "Are you sure you wish to clear the 404 error logs?", "clear404-success": "\"404 Not Found\" errors cleared" } \ No newline at end of file diff --git a/public/language/nb/admin/general/dashboard.json b/public/language/nb/admin/general/dashboard.json index b82802db1b..a70dda322e 100644 --- a/public/language/nb/admin/general/dashboard.json +++ b/public/language/nb/admin/general/dashboard.json @@ -2,6 +2,9 @@ "forum-traffic": "Forum Traffic", "page-views": "Page Views", "unique-visitors": "Unique Visitors", + "users": "Users", + "posts": "Posts", + "topics": "Topics", "page-views-last-month": "Page views Last Month", "page-views-this-month": "Page views This Month", "page-views-last-day": "Page views in last 24 hours", @@ -20,6 +23,11 @@ "prerelease-warning": "

This is a pre-release version of NodeBB. Unintended bugs may occur.

", "notices": "Notices", + "restart-not-required": "Restart not required", + "restart-required": "Restart required", + "search-plugin-installed": "Search Plugin installed", + "search-plugin-not-installed": "Search Plugin not installed", + "search-plugin-tooltip": "Install a search plugin from the plugin page in order to activate search functionality", "control-panel": "System Control", "reload": "Reload", @@ -52,4 +60,4 @@ "graphs.unique-visitors": "Unique Visitors", "graphs.registered-users": "Registered Users", "graphs.anonymous-users": "Anonymous Users" -} \ No newline at end of file +} diff --git a/public/language/nb/admin/menu.json b/public/language/nb/admin/menu.json index 6a4995ea6e..985c540e8a 100644 --- a/public/language/nb/admin/menu.json +++ b/public/language/nb/admin/menu.json @@ -13,7 +13,6 @@ "manage/users": "Users", "manage/registration": "Registration Queue", "manage/groups": "Groups", - "manage/flags": "Flags", "manage/ip-blacklist": "IP Blacklist", "section-settings": "Settings", diff --git a/public/language/nb/admin/settings/general.json b/public/language/nb/admin/settings/general.json index c26740ee4f..72ecfe641f 100644 --- a/public/language/nb/admin/settings/general.json +++ b/public/language/nb/admin/settings/general.json @@ -26,5 +26,6 @@ "touch-icon.upload": "Upload", "touch-icon.help": "Recommended size and format: 192x192, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.", "outgoing-links": "Outgoing Links", - "outgoing-links.warning-page": "Use Outgoing Links Warning Page" + "outgoing-links.warning-page": "Use Outgoing Links Warning Page", + "search-default-sort-by": "Search default sort by" } \ No newline at end of file diff --git a/public/language/nb/admin/settings/uploads.json b/public/language/nb/admin/settings/uploads.json index 8a56c85663..35eaa5a58f 100644 --- a/public/language/nb/admin/settings/uploads.json +++ b/public/language/nb/admin/settings/uploads.json @@ -9,7 +9,7 @@ "allow-topic-thumbnails": "Allow users to upload topic thumbnails", "topic-thumb-size": "Topic Thumb Size", "allowed-file-extensions": "Allowed File Extensions", - "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc).\n\t\t\t\t\tAn empty list means all extensions are allowed.", + "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc). An empty list means all extensions are allowed.", "profile-avatars": "Profile Avatars", "allow-profile-image-uploads": "Allow users to upload profile images", "convert-profile-image-png": "Convert profile image uploads to PNG", @@ -25,4 +25,4 @@ "profile-covers": "Profile Covers", "default-covers": "Default Cover Images", "default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image" -} \ No newline at end of file +} diff --git a/public/language/nb/notifications.json b/public/language/nb/notifications.json index f9580f623c..724940606b 100644 --- a/public/language/nb/notifications.json +++ b/public/language/nb/notifications.json @@ -19,6 +19,9 @@ "user_flagged_post_in": "%1 har flagget et innlegg i %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 har skrevet et svar til: %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", diff --git a/public/language/nb/pages.json b/public/language/nb/pages.json index c15ff8a9a3..39f5bd7800 100644 --- a/public/language/nb/pages.json +++ b/public/language/nb/pages.json @@ -6,7 +6,7 @@ "popular-month": "Populære emner denne måneden", "popular-alltime": "Mest populære emner for all tid", "recent": "Nylige emner", - "flagged-posts": "Flagged Posts", + "flagged-content": "Flagged Content", "ip-blacklist": "IP Blacklist", "users/online": "Påloggede Brukere", "users/latest": "Nyeste Brukere", @@ -27,6 +27,8 @@ "group": "%1 gruppe", "chats": "Samtaler", "chat": "Samtale med %1", + "flags": "Flags", + "flag-details": "Flag %1 Details", "account/edit": "Endrer \"%1\"", "account/edit/password": "Editing password of \"%1\"", "account/edit/username": "Editing username of \"%1\"", diff --git a/public/language/nb/search.json b/public/language/nb/search.json index c2998f7520..81bba3d430 100644 --- a/public/language/nb/search.json +++ b/public/language/nb/search.json @@ -8,10 +8,11 @@ "posted-by": "Skapt av", "in-categories": "I kategorier", "search-child-categories": "Søk underkategorier", - "has-tags": "Has tags", + "has-tags": "Har emneord", "reply-count": "Mengde svar", "at-least": "Minst", "at-most": "Maks", + "relevance": "Relevanse", "post-time": "Innlegg-tid", "newer-than": "Nyere enn", "older-than": "Eldre en", diff --git a/public/language/nb/topic.json b/public/language/nb/topic.json index 6ec1db0f41..3c6153e359 100644 --- a/public/language/nb/topic.json +++ b/public/language/nb/topic.json @@ -13,7 +13,8 @@ "notify_me": "Bli varslet om nye svar i dette emnet", "quote": "Siter", "reply": "Svar", - "replies_to_this_post": "Replies: %1", + "replies_to_this_post": "%1 Replies", + "last_reply_time": "Last reply", "reply-as-topic": "Reply as topic", "guest-login-reply": "Logg inn for å besvare", "edit": "Endre", @@ -25,28 +26,11 @@ "link": "Link", "share": "Del", "tools": "Verktøy", - "flag": "Rapporter", "locked": "Låst", "pinned": "Pinned", "moved": "Moved", "bookmark_instructions": "Click here to return to the last read post in this thread.", "flag_title": "Rapporter dette innlegget for granskning", - "flag_success": "Dette innlegget har blitt rapportert.", - "flag_manage_title": "Flagged post in %1", - "flag_manage_history": "Action History", - "flag_manage_no_history": "No event history to report", - "flag_manage_assignee": "Assignee", - "flag_manage_state": "State", - "flag_manage_state_open": "New/Open", - "flag_manage_state_wip": "Work in Progress", - "flag_manage_state_resolved": "Resolved", - "flag_manage_state_rejected": "Rejected", - "flag_manage_notes": "Shared Notes", - "flag_manage_update": "Update Flag Status", - "flag_manage_history_assignee": "Assigned to %1", - "flag_manage_history_state": "Updated state to %1", - "flag_manage_history_notes": "Updated flag notes", - "flag_manage_saved": "Flag Details Updated", "deleted_message": "Dette emnet har blitt slettet. Bare brukere med emnehåndterings-privilegier kan se den.", "following_topic.message": "Du vil nå motta varsler når noen skriver i denne tråden.", "not_following_topic.message": "You will see this topic in the unread topics list, but you will not receive notifications when somebody posts to this topic.", @@ -131,8 +115,5 @@ "stale.warning": "The topic you are replying to is quite old. Would you like to create a new topic instead, and reference this one in your reply?", "stale.create": "Create a new topic", "stale.reply_anyway": "Reply to this topic anyway", - "link_back": "Re: [%1](%2)", - "spam": "Spam", - "offensive": "Offensive", - "custom-flag-reason": "Enter a flagging reason" + "link_back": "Re: [%1](%2)" } \ No newline at end of file diff --git a/public/language/nb/user.json b/public/language/nb/user.json index 8f81e82466..0400d23623 100644 --- a/public/language/nb/user.json +++ b/public/language/nb/user.json @@ -33,6 +33,7 @@ "chat": "Chat", "chat_with": "Continue chat with %1", "new_chat_with": "Start new chat with %1", + "flag-profile": "Flag Profile", "follow": "Følg", "unfollow": "Avfølg", "more": "Mer", @@ -64,6 +65,8 @@ "remove_uploaded_picture": "Fjern Opplastet Bilde", "upload_cover_picture": "Upload cover picture", "remove_cover_picture_confirm": "Are you sure you want to remove the cover picture?", + "crop_picture": "Crop picture", + "upload_cropped_picture": "Crop and upload", "settings": "Innstillinger", "show_email": "Vis min e-post", "show_fullname": "Vis mitt fulle navn", diff --git a/public/language/nb/users.json b/public/language/nb/users.json index c491a4d7e2..04ea96aa68 100644 --- a/public/language/nb/users.json +++ b/public/language/nb/users.json @@ -4,7 +4,7 @@ "most_reputation": "Best rykte", "most_flags": "Most Flags", "search": "Søk", - "enter_username": "Skriv ett brukernavn for å søke", + "enter_username": "Skriv inn et brukernavn for å søke", "load_more": "Last flere", "users-found-search-took": "%1 bruker(e) funnet. Søket tok %2 sekunder.", "filter-by": "Filtrer etter", diff --git a/public/language/nl/admin/admin.json b/public/language/nl/admin/admin.json index 9c01f56006..7f6e9cebd7 100644 --- a/public/language/nl/admin/admin.json +++ b/public/language/nl/admin/admin.json @@ -1,7 +1,7 @@ { - "alert.confirm-reload": "Are you sure you wish to reload NodeBB?", - "alert.confirm-restart": "Are you sure you wish to restart NodeBB?", + "alert.confirm-reload": "Weet u zeker dat u NodeBB wilt herladen?", + "alert.confirm-restart": "Weet u zeker dat u NodeBB opnieuw wilt opstarten?", - "acp-title": "%1 | NodeBB Admin Control Panel", - "settings-header-contents": "Contents" + "acp-title": "%1 | NodeBB Administratiepaneel", + "settings-header-contents": "Inhoud" } \ No newline at end of file diff --git a/public/language/nl/admin/advanced/errors.json b/public/language/nl/admin/advanced/errors.json index 963e68b116..546f0f1508 100644 --- a/public/language/nl/admin/advanced/errors.json +++ b/public/language/nl/admin/advanced/errors.json @@ -8,7 +8,7 @@ "clear-error-log": "Clear Error Log", "route": "Route", "count": "Count", - "no-routes-not-found": "Hooray! There are no routes that were not found.", + "no-routes-not-found": "Hooray! No 404 errors!", "clear404-confirm": "Are you sure you wish to clear the 404 error logs?", "clear404-success": "\"404 Not Found\" errors cleared" } \ No newline at end of file diff --git a/public/language/nl/admin/general/dashboard.json b/public/language/nl/admin/general/dashboard.json index b82802db1b..a70dda322e 100644 --- a/public/language/nl/admin/general/dashboard.json +++ b/public/language/nl/admin/general/dashboard.json @@ -2,6 +2,9 @@ "forum-traffic": "Forum Traffic", "page-views": "Page Views", "unique-visitors": "Unique Visitors", + "users": "Users", + "posts": "Posts", + "topics": "Topics", "page-views-last-month": "Page views Last Month", "page-views-this-month": "Page views This Month", "page-views-last-day": "Page views in last 24 hours", @@ -20,6 +23,11 @@ "prerelease-warning": "

This is a pre-release version of NodeBB. Unintended bugs may occur.

", "notices": "Notices", + "restart-not-required": "Restart not required", + "restart-required": "Restart required", + "search-plugin-installed": "Search Plugin installed", + "search-plugin-not-installed": "Search Plugin not installed", + "search-plugin-tooltip": "Install a search plugin from the plugin page in order to activate search functionality", "control-panel": "System Control", "reload": "Reload", @@ -52,4 +60,4 @@ "graphs.unique-visitors": "Unique Visitors", "graphs.registered-users": "Registered Users", "graphs.anonymous-users": "Anonymous Users" -} \ No newline at end of file +} diff --git a/public/language/nl/admin/menu.json b/public/language/nl/admin/menu.json index 6a4995ea6e..985c540e8a 100644 --- a/public/language/nl/admin/menu.json +++ b/public/language/nl/admin/menu.json @@ -13,7 +13,6 @@ "manage/users": "Users", "manage/registration": "Registration Queue", "manage/groups": "Groups", - "manage/flags": "Flags", "manage/ip-blacklist": "IP Blacklist", "section-settings": "Settings", diff --git a/public/language/nl/admin/settings/general.json b/public/language/nl/admin/settings/general.json index c26740ee4f..72ecfe641f 100644 --- a/public/language/nl/admin/settings/general.json +++ b/public/language/nl/admin/settings/general.json @@ -26,5 +26,6 @@ "touch-icon.upload": "Upload", "touch-icon.help": "Recommended size and format: 192x192, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.", "outgoing-links": "Outgoing Links", - "outgoing-links.warning-page": "Use Outgoing Links Warning Page" + "outgoing-links.warning-page": "Use Outgoing Links Warning Page", + "search-default-sort-by": "Search default sort by" } \ No newline at end of file diff --git a/public/language/nl/admin/settings/uploads.json b/public/language/nl/admin/settings/uploads.json index 8a56c85663..35eaa5a58f 100644 --- a/public/language/nl/admin/settings/uploads.json +++ b/public/language/nl/admin/settings/uploads.json @@ -9,7 +9,7 @@ "allow-topic-thumbnails": "Allow users to upload topic thumbnails", "topic-thumb-size": "Topic Thumb Size", "allowed-file-extensions": "Allowed File Extensions", - "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc).\n\t\t\t\t\tAn empty list means all extensions are allowed.", + "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc). An empty list means all extensions are allowed.", "profile-avatars": "Profile Avatars", "allow-profile-image-uploads": "Allow users to upload profile images", "convert-profile-image-png": "Convert profile image uploads to PNG", @@ -25,4 +25,4 @@ "profile-covers": "Profile Covers", "default-covers": "Default Cover Images", "default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image" -} \ No newline at end of file +} diff --git a/public/language/nl/notifications.json b/public/language/nl/notifications.json index c1efb52f43..1cde811989 100644 --- a/public/language/nl/notifications.json +++ b/public/language/nl/notifications.json @@ -19,6 +19,9 @@ "user_flagged_post_in": "%1 rapporteerde een bericht in %2", "user_flagged_post_in_dual": "%1 en %2 rapporteerde een bericht in %3", "user_flagged_post_in_multiple": "%1 en %2 andere rapporteede een bericht 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 heeft een reactie geplaatst in %2", "user_posted_to_dual": "%1 en %2 hebben een reactie geplaatst in: %3", "user_posted_to_multiple": "%1 en %2 hebben een reactie geplaatst in: %3", diff --git a/public/language/nl/pages.json b/public/language/nl/pages.json index 700b5de892..816f62be22 100644 --- a/public/language/nl/pages.json +++ b/public/language/nl/pages.json @@ -6,7 +6,7 @@ "popular-month": "De populaire onderwerpen van deze maand", "popular-alltime": "De populaire onderwerpen", "recent": "Recente onderwerpen", - "flagged-posts": "Ongepaste berichten", + "flagged-content": "Flagged Content", "ip-blacklist": "IP zwarte lijst", "users/online": "Online Gebruikers", "users/latest": "Meest recente gebruikers", @@ -27,6 +27,8 @@ "group": "%1's groep", "chats": "Chats", "chat": "Chatten met %1", + "flags": "Flags", + "flag-details": "Flag %1 Details", "account/edit": "\"%1\" aanpassen", "account/edit/password": "Wachtwoord van \"%1\" aanpassen", "account/edit/username": "Gebruikersnaam van \"%1\" aanpassen", diff --git a/public/language/nl/search.json b/public/language/nl/search.json index c708ca4686..55a1964be5 100644 --- a/public/language/nl/search.json +++ b/public/language/nl/search.json @@ -8,10 +8,11 @@ "posted-by": "Geplaatst door", "in-categories": "In categorieën", "search-child-categories": "Doorzoek subcategorieën ", - "has-tags": "Has tags", + "has-tags": "Is getagged", "reply-count": "Aantal reacties", "at-least": "op zijn minst", "at-most": "op zijn meest", + "relevance": "Relevantie", "post-time": "Geplaatst op", "newer-than": "Nieuwer dan", "older-than": "Ouder dan", diff --git a/public/language/nl/topic.json b/public/language/nl/topic.json index 94a652d728..1e0be1b1c3 100644 --- a/public/language/nl/topic.json +++ b/public/language/nl/topic.json @@ -13,7 +13,8 @@ "notify_me": "Krijg een melding wanneer nieuwe reacties volgen", "quote": "Citeren", "reply": "Reageren", - "replies_to_this_post": "Reacties: %1 ", + "replies_to_this_post": "%1 Antwoorden", + "last_reply_time": "Laatste antwoord", "reply-as-topic": "Reageren als onderwerp", "guest-login-reply": "Aanmelden om te reageren", "edit": "Aanpassen", @@ -25,28 +26,11 @@ "link": "Link", "share": "Delen", "tools": "Extra", - "flag": "Markeren", "locked": "Gesloten", "pinned": "Pinned", "moved": "Verplaatst", "bookmark_instructions": "Klik hier om terug te keren naar de laatst gelezen post in deze thread.", "flag_title": "Bericht aan beheerders melden", - "flag_success": "Dit bericht is gerapporteerd aan de beheerder.", - "flag_manage_title": "Gemarkeerd bericht in %1", - "flag_manage_history": "Activiteiten geschiedenis", - "flag_manage_no_history": "Geen geschiedenis te tonen", - "flag_manage_assignee": "Toekenning", - "flag_manage_state": "Staat", - "flag_manage_state_open": "Nieuw/Open", - "flag_manage_state_wip": "Wordt aan gewerkt", - "flag_manage_state_resolved": "Opgelost", - "flag_manage_state_rejected": "Afgewezen", - "flag_manage_notes": "Gedeelde notities", - "flag_manage_update": "Markering updaten", - "flag_manage_history_assignee": "Toegewezen aan %1", - "flag_manage_history_state": "Update status naar 1%", - "flag_manage_history_notes": "Update gemarkeerde notities", - "flag_manage_saved": "Markeering details geupdatet", "deleted_message": "Dit onderwerp is verwijderd. Alleen gebruikers met beheerrechten op onderwerpniveau kunnen dit inzien.", "following_topic.message": "Vanaf nu worden meldingen ontvangen zodra iemand een reactie op dit onderwerp geeft.", "not_following_topic.message": "Dit onderwerp zal verschijnen in de lijst van ongelezen onderwerpen, maar er zullen geen meldingen ontvangen zodra iemand een reactie op dit onderwerp geeft.", @@ -131,8 +115,5 @@ "stale.warning": "Het onderwerp waar je op antwoord is vrij oud. Zou je graag een nieuw onderwerp maken met een referentie naar dit onderwerp in je antwoord?", "stale.create": "Maak een nieuw onderwerp", "stale.reply_anyway": "Reageer toch op dit onderwerp", - "link_back": "Re: [%1](%2)", - "spam": "Spam", - "offensive": "Aanstootgevend", - "custom-flag-reason": "Geef een reden voor de melding." + "link_back": "Re: [%1](%2)" } \ No newline at end of file diff --git a/public/language/nl/user.json b/public/language/nl/user.json index 22e0d6a947..6d897f89cd 100644 --- a/public/language/nl/user.json +++ b/public/language/nl/user.json @@ -33,6 +33,7 @@ "chat": "Chat", "chat_with": "Chat verder met %1", "new_chat_with": "Begin een chat met %1", + "flag-profile": "Profiel vlaggen", "follow": "Volgen", "unfollow": "Ontvolgen", "more": "Meer", @@ -63,7 +64,9 @@ "upload_a_picture": "Upload een afbeelding", "remove_uploaded_picture": "Verwijder gëuploade foto", "upload_cover_picture": "Upload je coverafbeelding", - "remove_cover_picture_confirm": "Are you sure you want to remove the cover picture?", + "remove_cover_picture_confirm": "Weet u zeker dat u de cover foto wilt verwijderen?", + "crop_picture": "Foto bijsnijden", + "upload_cropped_picture": "Bijsnijden en uploaden", "settings": "Instellingen", "show_email": "E-mailadres weergeven", "show_fullname": "Laat mijn volledige naam zien", diff --git a/public/language/pl/admin/advanced/errors.json b/public/language/pl/admin/advanced/errors.json index 9b168474d1..b8da01f337 100644 --- a/public/language/pl/admin/advanced/errors.json +++ b/public/language/pl/admin/advanced/errors.json @@ -1,14 +1,14 @@ { - "figure-x": "Figure %1", - "error-events-per-day": "%1 events per day", + "figure-x": "Błąd %1", + "error-events-per-day": "%1 wydarzeń dziennie", "error.404": "404 Nie znaleziono", "error.503": "503 Usługa niedostępna", "manage-error-log": "Zarządzaj dziennikiem błędów", "export-error-log": "Eksportuj dziennik błędów (CSV)", "clear-error-log": "Wyczyść dziennik błędów", - "route": "Route", - "count": "Count", - "no-routes-not-found": "Hooray! There are no routes that were not found.", + "route": "Scieżka", + "count": "Licznik", + "no-routes-not-found": "Hooray! No 404 errors!", "clear404-confirm": "Czy chcesz wyczyścić dziennik błędów 404?", "clear404-success": "Wyczyszczono błędy \"404 Nie znaleziono\"" } \ No newline at end of file diff --git a/public/language/pl/admin/advanced/logs.json b/public/language/pl/admin/advanced/logs.json index 0882641e77..13b4d79a61 100644 --- a/public/language/pl/admin/advanced/logs.json +++ b/public/language/pl/admin/advanced/logs.json @@ -2,6 +2,6 @@ "logs": "Logi", "control-panel": "Logi Panelu Kontroli", "reload": "Przeładuj logi", - "clear": "Clear Logs", - "clear-success": "Logs Cleared!" + "clear": "Wyczyść Logi", + "clear-success": "Logi Wyczyszczone!" } \ No newline at end of file diff --git a/public/language/pl/admin/appearance/themes.json b/public/language/pl/admin/appearance/themes.json index 85e4d62eba..eca6731adc 100644 --- a/public/language/pl/admin/appearance/themes.json +++ b/public/language/pl/admin/appearance/themes.json @@ -2,10 +2,10 @@ "checking-for-installed": "Sprawdzanie zainstalowanego stylu...", "homepage": "Strona główna", "select-theme": "Wybierz Styl", - "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": "Aktualny Styl", + "no-themes": "Brak zainstalowanych stylów", + "revert-confirm": "Czy na pewno chcesz przywrócić domyślny styl NodeBB?", + "theme-changed": "Styl Zmieniony", + "revert-success": "Pomyślnie przywrócono domyślny styl NodeBB.", + "restart-to-activate": "Proszę zrestartować NodeBB, aby styl poprawnie działał." } \ No newline at end of file diff --git a/public/language/pl/admin/extend/plugins.json b/public/language/pl/admin/extend/plugins.json index a5e2715f2a..6ac7776536 100644 --- a/public/language/pl/admin/extend/plugins.json +++ b/public/language/pl/admin/extend/plugins.json @@ -1,45 +1,45 @@ { "installed": "Zainstalowane", - "active": "Active", + "active": "Aktywne", "inactive": "Nieaktywny", - "out-of-date": "Out of Date", - "none-found": "No plugins found.", - "none-active": "No Active Plugins", - "find-plugins": "Find Plugins", + "out-of-date": "Nieaktualne", + "none-found": "Nie znaleziono pluginów", + "none-active": "Brak aktywnych pluginów", + "find-plugins": "Znajdź plugin", - "plugin-search": "Plugin Search", - "plugin-search-placeholder": "Search for plugin...", - "reorder-plugins": "Re-order Plugins", - "order-active": "Order Active Plugins", - "dev-interested": "Interested in writing plugins for NodeBB?", - "docs-info": "Full documentation regarding plugin authoring can be found in the NodeBB Docs Portal.", + "plugin-search": "Szukaj pluginów", + "plugin-search-placeholder": "Szukaj pluginów...", + "reorder-plugins": "Posortuj Pluginy", + "order-active": "Posortuj Aktywne Pluginy", + "dev-interested": "Zainteresowany pisanie pluginów do NodeBB??", + "docs-info": "Pełna dokumentacje dotycząca pisania pluginów znajduje się tutaj 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.themes": "Style", + "plugin-item.deactivate": "Dezaktywować", + "plugin-item.activate": "Aktywne", + "plugin-item.install": "Zainstaluj", + "plugin-item.uninstall": "Odinstaluj", + "plugin-item.settings": "Ustawienia", + "plugin-item.installed": "Zainstalowane", + "plugin-item.latest": "Ostatnie", + "plugin-item.upgrade": "Zaktualizuj", + "plugin-item.more-info": "Po więcej informacji:", + "plugin-item.unknown": "Nieznane", "plugin-item.unknown-explanation": "The state of this plugin could not be determined, possibly due to a misconfiguration error.", - "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": "Plugin Włączony", + "alert.disabled": "Plugin Wyłączony", + "alert.upgraded": "Plugin Zaktualizowany", + "alert.installed": "Plugin Zainstalowany", + "alert.uninstalled": "Plugin Odinstalowany", + "alert.activate-success": "Proszę zrestartować NodeBB, aby poprawnie działał plugin.", + "alert.deactivate-success": "Plugin pomyślnie dezaktywowany", + "alert.upgrade-success": "Proszę przeładować NodeBB, aby poprawnie działał plugin", + "alert.install-success": "Plugin pomyślnie zainstalowany, proszę aktywować go.", + "alert.uninstall-success": "Plugin został pomyślnie zdezaktywowany oraz odinstalowany.", "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/pl/admin/extend/rewards.json b/public/language/pl/admin/extend/rewards.json index 6eb12d1f33..d4bf572396 100644 --- a/public/language/pl/admin/extend/rewards.json +++ b/public/language/pl/admin/extend/rewards.json @@ -1,17 +1,17 @@ { "rewards": "Nagrody", - "condition-if-users": "If User's", + "condition-if-users": "Jeżeli Użytkownik", "condition-is": "Jest:", - "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", + "condition-then": "To:", + "max-claims": "Ile razy nagroda może zostać przyznana", + "zero-infinite": "Wpisz 0, aby nieskończona ilość razy", + "delete": "Usuń", + "enable": "Włącz", + "disable": "Wyłącz", + "control-panel": "Ustawienia Nagród", + "new-reward": "Nowa Nagroda", - "alert.delete-success": "Successfully deleted reward", - "alert.no-inputs-found": "Illegal reward - no inputs found!", - "alert.save-success": "Successfully saved rewards" + "alert.delete-success": "Pomyślnie usunięto nagrodę", + "alert.no-inputs-found": "Niepoprawnie dodana nagroda ", + "alert.save-success": "Pomyślnie zapisano nagrodę" } \ No newline at end of file diff --git a/public/language/pl/admin/extend/widgets.json b/public/language/pl/admin/extend/widgets.json index 45af5a35cc..379b1df398 100644 --- a/public/language/pl/admin/extend/widgets.json +++ b/public/language/pl/admin/extend/widgets.json @@ -4,7 +4,7 @@ "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", - "containers.none": "None", + "containers.none": "Żadna", "container.well": "Well", "container.jumbotron": "Jumbotron", "container.panel": "Panel", diff --git a/public/language/pl/admin/general/dashboard.json b/public/language/pl/admin/general/dashboard.json index 00dea84351..d20af29013 100644 --- a/public/language/pl/admin/general/dashboard.json +++ b/public/language/pl/admin/general/dashboard.json @@ -2,6 +2,9 @@ "forum-traffic": "Ruch na forum", "page-views": "Wyświetlenia strony", "unique-visitors": "Unikalni goście", + "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", @@ -20,6 +23,11 @@ "prerelease-warning": "

This is a pre-release version of NodeBB. Unintended bugs may occur.

", "notices": "Powiadomienia", + "restart-not-required": "Restart not required", + "restart-required": "Restart required", + "search-plugin-installed": "Search Plugin installed", + "search-plugin-not-installed": "Search Plugin not installed", + "search-plugin-tooltip": "Install a search plugin from the plugin page in order to activate search functionality", "control-panel": "Zarządzanie systemem", "reload": "Odśwież", @@ -52,4 +60,4 @@ "graphs.unique-visitors": "Unikalni Użytkownicy", "graphs.registered-users": "Zarejestrowani Użytkownicy", "graphs.anonymous-users": "Anonimowi Użytkownicy" -} \ No newline at end of file +} diff --git a/public/language/pl/admin/general/homepage.json b/public/language/pl/admin/general/homepage.json index 7afc8608b1..204f166db1 100644 --- a/public/language/pl/admin/general/homepage.json +++ b/public/language/pl/admin/general/homepage.json @@ -1,7 +1,7 @@ { "home-page": "Strona Główna", - "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": "Wybierz stronę główną dla Twojego forum.", + "home-page-route": "Strona Główna", + "custom-route": "Niestandardowy Adres", + "allow-user-home-pages": "Pozwól użytkownikom na zmienienie strony głownej" } \ No newline at end of file diff --git a/public/language/pl/admin/general/languages.json b/public/language/pl/admin/general/languages.json index f5f3c02873..d8779b4524 100644 --- a/public/language/pl/admin/general/languages.json +++ b/public/language/pl/admin/general/languages.json @@ -1,5 +1,5 @@ { "language-settings": "Ustawienia Językowe", - "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" + "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" } \ No newline at end of file diff --git a/public/language/pl/admin/general/navigation.json b/public/language/pl/admin/general/navigation.json index 622a4b8277..42302c6834 100644 --- a/public/language/pl/admin/general/navigation.json +++ b/public/language/pl/admin/general/navigation.json @@ -1,24 +1,24 @@ { "icon": "Ikona:", "change-icon": "zmień", - "route": "Route:", + "route": "Ścieżka:", "tooltip": "Tooltip:", - "text": "Text:", + "text": "Tekst:", "text-class": "Text Class: optional", "id": "ID: optional", "properties": "Properties:", - "only-admins": "Only display to Admins", - "only-global-mods-and-admins": "Only display to Global Moderators and Admins", - "only-logged-in": "Only display to logged in users", - "open-new-window": "Open in a new window", + "only-admins": "Pokaż tylko dla administracji", + "only-global-mods-and-admins": "Pokaż tylko dla globalnych moderatorów oraz administracji", + "only-logged-in": "Pokaż tylko dla zalogowanych użytkowników", + "open-new-window": "Otwórz w nowym oknie", "installed-plugins-required": "Installed Plugins Required:", "search-plugin": "Search plugin", - "btn.delete": "Delete", - "btn.disable": "Disable", - "btn.enable": "Enable", + "btn.delete": "Usunąć", + "btn.disable": "Wyłącz", + "btn.enable": "Włącz", "available-menu-items": "Available Menu Items", "custom-route": "Custom Route", diff --git a/public/language/pl/admin/general/social.json b/public/language/pl/admin/general/social.json index 23aedfcfaa..a3b9bd0377 100644 --- a/public/language/pl/admin/general/social.json +++ b/public/language/pl/admin/general/social.json @@ -1,5 +1,5 @@ { - "post-sharing": "Post Sharing", + "post-sharing": "Udostępnianie postów", "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/pl/admin/general/sounds.json b/public/language/pl/admin/general/sounds.json index f580b60beb..f979492b45 100644 --- a/public/language/pl/admin/general/sounds.json +++ b/public/language/pl/admin/general/sounds.json @@ -1,9 +1,9 @@ { "notifications": "Powiadomienia", - "chat-messages": "Chat Messages", - "play-sound": "Play", - "incoming-message": "Incoming Message", - "outgoing-message": "Outgoing Message", - "upload-new-sound": "Upload New Sound", - "saved": "Settings Saved" + "chat-messages": "Wiadomości Czatu", + "play-sound": "Otwórz", + "incoming-message": "Przychodzące Wiadomości", + "outgoing-message": "Wychodzące Wiadomości", + "upload-new-sound": "Prześlij Nowy Dźwięk", + "saved": "Ustawienia Zapisane" } \ No newline at end of file diff --git a/public/language/pl/admin/manage/categories.json b/public/language/pl/admin/manage/categories.json index bfa42918c6..4eb8a57259 100644 --- a/public/language/pl/admin/manage/categories.json +++ b/public/language/pl/admin/manage/categories.json @@ -1,68 +1,68 @@ { "settings": "Ustawienia kategorii", - "privileges": "Privileges", + "privileges": "Przywileje", "name": "Nazwa Kategorii", - "description": "Category Description", - "bg-color": "Background Colour", - "text-color": "Text Colour", - "bg-image-size": "Background Image Size", - "custom-class": "Custom Class", - "num-recent-replies": "# of Recent Replies", - "ext-link": "External Link", - "upload-image": "Upload Image", - "delete-image": "Remove", - "category-image": "Category Image", - "parent-category": "Parent Category", - "optional-parent-category": "(Optional) Parent Category", - "parent-category-none": "(None)", - "copy-settings": "Copy Settings From", - "optional-clone-settings": "(Optional) Clone Settings From Category", - "purge": "Purge Category", + "description": "Opis kategorii", + "bg-color": "Kolor tła", + "text-color": "Kolor tekstu", + "bg-image-size": "Wielkość obrazka tła", + "custom-class": "Niestandardowa klasa", + "num-recent-replies": "# z Ostatnich Odpowiedzi", + "ext-link": "Zewnętrzny Link", + "upload-image": "Prześlij Obrazek", + "delete-image": "Usunąć", + "category-image": "Obrazek Kategorii", + "parent-category": "Kategoria nadrzędna", + "optional-parent-category": "(Opcjonalne) Kategoria nadrzędna", + "parent-category-none": "(Żadna)", + "copy-settings": "Skopiować ustawienia z", + "optional-clone-settings": "(Opcjonalnie) Spoiowanie ustawień z kategorii", + "purge": "Usuń kategorie", - "enable": "Enable", - "disable": "Disable", - "edit": "Edit", + "enable": "Włączona", + "disable": "Wyłączona", + "edit": "Edytuj", - "select-category": "Select Category", - "set-parent-category": "Set Parent Category", + "select-category": "Wybierz Kategorie", + "set-parent-category": "Ustaw nadrzędną kategorie", - "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.", - "privileges.warning": "Note: Privilege settings take effect immediately. It is not necessary to save the category after adjusting these settings.", - "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.description": "Można skonfigurować uprawnienia kontroli dostępu do tej kategorii w tej sekcji. Uprawnienia mogą być przyznawane dla każdego użytkownika lub dla poszczególnych grup. Możesz dodać nowego użytkownika do tej tabeli, wyszukując je w poniższym formularzu.", + "privileges.warning": "Uwaga: Przywileje zapisują się natychmiastowo. Nie ma znaczenie czy klikniesz zapisz.", + "privileges.section-viewing": "Lista Przywilejów", + "privileges.section-posting": "Przywileje do pisania", + "privileges.section-moderation": "Przywileje do moderowania", + "privileges.section-user": "Użytkownik", + "privileges.search-user": "Dodaj użytkownika", "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.copy-to-children": "Copy to Children", - "privileges.copy-from-category": "Copy from Category", + "privileges.section-group": "Grupa", + "privileges.group-private": "Ta grupa jest prywatna", + "privileges.search-group": "Dodaj grupę", + "privileges.copy-to-children": "Skopiuj z podrzędnej", + "privileges.copy-from-category": "Skopiuj z kategorii", "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.title": "Analytics for \"%1\" category", + "analytics.back": "Wróć do listy kategorii", + "analytics.title": "Analityka dla \"%1\" kategorii", "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.create-success": "Category successfully created!", - "alert.none-active": "You have no active categories.", - "alert.create": "Create a Category", + "alert.created": "Stworzony", + "alert.create-success": "Kategoria pomyślnie dodana!", + "alert.none-active": "Nie masz aktywnych kategorii.", + "alert.create": "Stwórz kategorie", "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!", - "alert.copy-success": "Settings Copied!", - "alert.set-parent-category": "Set Parent Category", - "alert.updated": "Updated Categories", + "alert.purge-success": "Kategoria usunięta!", + "alert.copy-success": "Ustawienie skopiowane!", + "alert.set-parent-category": "Ustaw nadrzędną kategorie", + "alert.updated": "Zaktualizuj kategorie", "alert.updated-success": "ID kategorii %1 pomyślnie zaktualizowano.", - "alert.upload-image": "Upload category image", - "alert.find-user": "Find a User", - "alert.user-search": "Search for a user here...", - "alert.find-group": "Find a Group", - "alert.group-search": "Search for a group here..." + "alert.upload-image": "Prześlij obrazek kategorii", + "alert.find-user": "Znajdź użytkownika", + "alert.user-search": "Szukaj użytkownika tutaj...", + "alert.find-group": "Szukaj grupę", + "alert.group-search": "Szukaj grupę tutaj..." } \ No newline at end of file diff --git a/public/language/pl/admin/manage/groups.json b/public/language/pl/admin/manage/groups.json index fe091a8bad..3de74fad4a 100644 --- a/public/language/pl/admin/manage/groups.json +++ b/public/language/pl/admin/manage/groups.json @@ -1,34 +1,34 @@ { "name": "Nazwa Grupy", - "description": "Group Description", + "description": "Opis Grupy", "system": "System Grup", - "edit": "Edit", - "search-placeholder": "Search", - "create": "Create Group", - "description-placeholder": "A short description about your group", - "create-button": "Create", + "edit": "Edytuj", + "search-placeholder": "Szukaj", + "create": "Stwórz Grupę", + "description-placeholder": "Krótki opisz grupy", + "create-button": "Stwórz", - "alerts.create-failure": "Uh-Oh

There was a problem creating your group. Please try again later!

", - "alerts.confirm-delete": "Are you sure you wish to delete this group?", + "alerts.create-failure": "Uh-Oh

Wystąpił problem podczas tworzenia grupy. Spróbuj ponownie później

", + "alerts.confirm-delete": "Czy na pewno chcesz usunąć tę grupę?", - "edit.name": "Name", - "edit.description": "Description", - "edit.user-title": "Title of Members", - "edit.icon": "Group Icon", - "edit.label-color": "Group Label Color", - "edit.show-badge": "Show Badge", + "edit.name": "Nazwa", + "edit.description": "Opis", + "edit.user-title": "Tytuł Członków ", + "edit.icon": "Ikona Grupy", + "edit.label-color": "Kolor Etykiety Grupy", + "edit.show-badge": "Pokaż Etykietę", "edit.private-details": "If enabled, joining of groups requires approval from a group owner.", - "edit.private-override": "Warning: Private groups is disabled at system level, which overrides this option.", - "edit.disable-requests": "Disable join requests", - "edit.hidden": "Hidden", - "edit.hidden-details": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually", - "edit.add-user": "Add User to Group", - "edit.add-user-search": "Search Users", - "edit.members": "Member List", - "control-panel": "Groups Control Panel", - "revert": "Revert", + "edit.private-override": "Ostrzeżenie: Prywatne grupy są wyłączone w ustawieniach, co powoduje przesłonięcia opcji.", + "edit.disable-requests": "Wyłącz prośby o dołączenie", + "edit.hidden": "Ukryta", + "edit.hidden-details": "Jeśli opcja jest włączona, grupa ta nie będzie widoczna dla użytkowników.", + "edit.add-user": "Dodaj użytkownika do grupy", + "edit.add-user-search": "Szukaj Użytkownika", + "edit.members": "Lista Członków", + "control-panel": "Panel sterowania", + "revert": "Cofnij", - "edit.no-users-found": "No Users Found", - "edit.confirm-remove-user": "Are you sure you want to remove this user?", - "edit.save-success": "Changes saved!" + "edit.no-users-found": "Nie znaleziono użytkowników", + "edit.confirm-remove-user": "Jesteś pewny, że chcesz usunąć tego użytkownika?", + "edit.save-success": "Zmiany zapisane!" } \ No newline at end of file diff --git a/public/language/pl/admin/menu.json b/public/language/pl/admin/menu.json index 6a4995ea6e..6b86f47e50 100644 --- a/public/language/pl/admin/menu.json +++ b/public/language/pl/admin/menu.json @@ -1,75 +1,74 @@ { - "section-general": "General", - "general/dashboard": "Dashboard", - "general/homepage": "Home Page", - "general/navigation": "Navigation", - "general/languages": "Languages", - "general/sounds": "Sounds", + "section-general": "Ogólne", + "general/dashboard": "Główna", + "general/homepage": "Strona Startowa", + "general/navigation": "Nawigacja", + "general/languages": "Język", + "general/sounds": "Dźwięki", "general/social": "Social", - "section-manage": "Manage", - "manage/categories": "Categories", - "manage/tags": "Tags", - "manage/users": "Users", - "manage/registration": "Registration Queue", - "manage/groups": "Groups", - "manage/flags": "Flags", - "manage/ip-blacklist": "IP Blacklist", + "section-manage": "Zarządzanie", + "manage/categories": "Kategorie", + "manage/tags": "Tagi", + "manage/users": "Użytkownicy", + "manage/registration": "Kolejka Rejestracji", + "manage/groups": "Grupy", + "manage/ip-blacklist": "Czarna Lista IP", - "section-settings": "Settings", - "settings/general": "General", - "settings/reputation": "Reputation", + "section-settings": "Ustawienia", + "settings/general": "Ogólne", + "settings/reputation": "Reputacja", "settings/email": "Email", - "settings/user": "User", - "settings/group": "Group", - "settings/guest": "Guests", - "settings/uploads": "Uploads", - "settings/post": "Post", - "settings/chat": "Chat", - "settings/pagination": "Pagination", - "settings/tags": "Tags", - "settings/notifications": "Notifications", - "settings/cookies": "Cookies", + "settings/user": "Użytkownik", + "settings/group": "Grupa", + "settings/guest": "Gość", + "settings/uploads": "Przesłane", + "settings/post": "Posty", + "settings/chat": "Czat", + "settings/pagination": "Paginacja", + "settings/tags": "Tagi", + "settings/notifications": "Powiadomienia", + "settings/cookies": "Ciasteczka", "settings/web-crawler": "Web Crawler", "settings/sockets": "Sockets", - "settings/advanced": "Advanced", + "settings/advanced": "Zaawansowane", - "settings.page-title": "%1 Settings", + "settings.page-title": "%1 Ustawienia", - "section-appearance": "Appearance", - "appearance/themes": "Themes", - "appearance/skins": "Skins", - "appearance/customise": "Custom HTML & CSS", + "section-appearance": "Wygląd", + "appearance/themes": "Style", + "appearance/skins": "Skórki", + "appearance/customise": "Niestandardowy HTML & CSS", "section-extend": "Extend", - "extend/plugins": "Plugins", - "extend/widgets": "Widgets", - "extend/rewards": "Rewards", + "extend/plugins": "Pluginy", + "extend/widgets": "Widgety", + "extend/rewards": "Nagrody", - "section-social-auth": "Social Authentication", + "section-social-auth": "Alternatywne Logowanie", - "section-plugins": "Plugins", - "extend/plugins.install": "Install Plugins", + "section-plugins": "Pluginy", + "extend/plugins.install": "Zainstalowane Pluginy", - "section-advanced": "Advanced", - "advanced/database": "Database", - "advanced/events": "Events", - "advanced/logs": "Logs", - "advanced/errors": "Errors", - "advanced/cache": "Cache", + "section-advanced": "Zaawansowane", + "advanced/database": "Baza Danych", + "advanced/events": "Wydarzenia", + "advanced/logs": "Logi", + "advanced/errors": "Błędy", + "advanced/cache": "Pamięć", "development/logger": "Logger", - "development/info": "Info", + "development/info": "Informacja", - "reload-forum": "Reload Forum", - "restart-forum": "Restart Forum", - "logout": "Log out", - "view-forum": "View Forum", + "reload-forum": "Przeładuj Forum", + "restart-forum": "Restartuj Forum", + "logout": "Wyloguj się", + "view-forum": "Zobacz Forum", - "search.placeholder": "Search...", - "search.no-results": "No results...", - "search.search-forum": "Search the forum for ", - "search.keep-typing": "Type more to see results...", - "search.start-typing": "Start typing to see results...", + "search.placeholder": "Szukaj...", + "search.no-results": "Brak rezultatów...", + "search.search-forum": "Szukaj w forum ", + "search.keep-typing": "Wpisz więcej, aby zobaczyć wyniki ...", + "search.start-typing": "Zacznij pisać, aby zobaczyć wyniki ...", - "connection-lost": "Connection to %1 has been lost, attempting to reconnect..." + "connection-lost": "Połączenie z %1 zostało utracone, próba ponownego połączenia..." } \ No newline at end of file diff --git a/public/language/pl/admin/settings/advanced.json b/public/language/pl/admin/settings/advanced.json index 1afa2c69f0..d931155ad3 100644 --- a/public/language/pl/admin/settings/advanced.json +++ b/public/language/pl/admin/settings/advanced.json @@ -1,8 +1,8 @@ { "maintenance-mode": "Tryb Konserwacji", "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", + "maintenance-mode.message": "Wiadomość podczas konserwacji", + "headers": "Nagłówek", "headers.allow-from": "Set ALLOW-FROM to Place NodeBB in an iFrame", "headers.powered-by": "Customise the \"Powered By\" header sent by NodeBB", "headers.acao": "Access-Control-Allow-Origin", diff --git a/public/language/pl/admin/settings/general.json b/public/language/pl/admin/settings/general.json index 66e9370401..57aa4eb5bf 100644 --- a/public/language/pl/admin/settings/general.json +++ b/public/language/pl/admin/settings/general.json @@ -26,5 +26,6 @@ "touch-icon.upload": "Upload", "touch-icon.help": "Recommended size and format: 192x192, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.", "outgoing-links": "Outgoing Links", - "outgoing-links.warning-page": "Use Outgoing Links Warning Page" + "outgoing-links.warning-page": "Use Outgoing Links Warning Page", + "search-default-sort-by": "Search default sort by" } \ No newline at end of file diff --git a/public/language/pl/admin/settings/reputation.json b/public/language/pl/admin/settings/reputation.json index 00dca4d9d1..a2cf0c4eb6 100644 --- a/public/language/pl/admin/settings/reputation.json +++ b/public/language/pl/admin/settings/reputation.json @@ -1,7 +1,7 @@ { "reputation": "Ustawienia Reputacji", - "disable": "Disable Reputation System", - "disable-down-voting": "Disable Down Voting", + "disable": "Wyłącz System Reputacji", + "disable-down-voting": "Wyłącz System \"Głosów przeciw\"", "thresholds": "Activity Thresholds", "min-rep-downvote": "Minimum reputation to downvote posts", "min-rep-flag": "Minimum reputation to flag posts" diff --git a/public/language/pl/admin/settings/uploads.json b/public/language/pl/admin/settings/uploads.json index cf0414fdab..9a610fb576 100644 --- a/public/language/pl/admin/settings/uploads.json +++ b/public/language/pl/admin/settings/uploads.json @@ -9,7 +9,7 @@ "allow-topic-thumbnails": "Allow users to upload topic thumbnails", "topic-thumb-size": "Topic Thumb Size", "allowed-file-extensions": "Allowed File Extensions", - "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc).\n\t\t\t\t\tAn empty list means all extensions are allowed.", + "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc). An empty list means all extensions are allowed.", "profile-avatars": "Profile Avatars", "allow-profile-image-uploads": "Allow users to upload profile images", "convert-profile-image-png": "Convert profile image uploads to PNG", @@ -25,4 +25,4 @@ "profile-covers": "Profile Covers", "default-covers": "Default Cover Images", "default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image" -} \ 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 bdabb075e9..94df909293 100644 --- a/public/language/pl/admin/settings/user.json +++ b/public/language/pl/admin/settings/user.json @@ -1,38 +1,38 @@ { - "authentication": "Authentication", - "allow-local-login": "Allow local login", - "require-email-confirmation": "Require Email Confirmation", - "email-confirm-interval": "User may not resend a confirmation email until", - "email-confirm-email2": "minutes have elapsed", - "allow-login-with": "Allow login with", - "allow-login-with.username-email": "Username or Email", - "allow-login-with.username": "Username Only", - "allow-login-with.email": "Email Only", - "account-settings": "Account Settings", - "disable-username-changes": "Disable username changes", - "disable-email-changes": "Disable email changes", - "disable-password-changes": "Disable password changes", - "allow-account-deletion": "Allow account deletion", - "user-info-private": "Make user info private", - "themes": "Themes", - "disable-user-skins": "Prevent users from choosing a custom skin", - "account-protection": "Account Protection", - "login-attempts": "Login attempts per hour", + "authentication": "Autoryzacja", + "allow-local-login": "Pozwól na lokalne logowanie", + "require-email-confirmation": "Wymagaj Potwierdzenie Emailu", + "email-confirm-interval": "Użytkownik nie może ponownie wysłać email z potwierdzeniem, aż", + "email-confirm-email2": "minut upłynęło", + "allow-login-with": "Pozwól na logowanie przy użyciu", + "allow-login-with.username-email": "Nazwy użytkownika oraz Emailu", + "allow-login-with.username": "Tylko Nazwy Użytkownia", + "allow-login-with.email": "Tylko Emailu", + "account-settings": "Ustawienia Konta", + "disable-username-changes": "Wyłącz możliwość zmiany nazwy użytkownika", + "disable-email-changes": "Wyłącz możliwość zmiany emaila", + "disable-password-changes": "Wyłącz możliwość zmiany hasła", + "allow-account-deletion": "Pozwól na możliwość usunięcia konta", + "user-info-private": "Informację użytkownika są prywatne", + "themes": "Style", + "disable-user-skins": "Uniemożliwić użytkownikom wybranie niestandardowej skórę", + "account-protection": "Ochrona Konta", + "login-attempts": "Prób logowania na godzinę", "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)", - "login-days": "Days to remember user login sessions", - "password-expiry-days": "Force password reset after a set number of days", - "registration": "User Registration", - "registration-type": "Registration Type", - "registration-type.normal": "Normal", - "registration-type.admin-approval": "Admin Approval", - "registration-type.admin-approval-ip": "Admin Approval for IPs", - "registration-type.invite-only": "Invite Only", - "registration-type.admin-invite-only": "Admin Invite Only", - "registration-type.disabled": "No registration", + "lockout-duration": "Czas trwania blokady konta (minuty)", + "login-days": "Ilość dni zapamiętywania sesji logowania użytkownika", + "password-expiry-days": "Wymuś restotwanie hasła po określonej liczbie dni", + "registration": "Rejestracja Użytkownika", + "registration-type": "Typ Rejestracji", + "registration-type.normal": "Normalna", + "registration-type.admin-approval": "Zatwierdzania przez administratora", + "registration-type.admin-approval-ip": "Zatwierdzania przez administratora dla IP", + "registration-type.invite-only": "Zaproszenia", + "registration-type.admin-invite-only": "Zaproszenie przez administracje", + "registration-type.disabled": "Brak możliwości rejestracji", "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": "Maximum Invitations per User", - "max-invites": "Maximum Invitations per User", + "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\"", "min-username-length": "Minimum Username Length", "max-username-length": "Maximum Username Length", @@ -41,19 +41,19 @@ "terms-of-use": "Forum Terms of Use (Leave blank to disable)", "user-search": "User Search", "user-search-results-per-page": "Number of results to display", - "default-user-settings": "Default User Settings", - "show-email": "Show email", - "show-fullname": "Show fullname", + "default-user-settings": "Domyślne ustawienie użytkownia", + "show-email": "Pokaż email", + "show-fullname": "Pokaż imię", "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", "digest-freq": "Subscribe to Digest", "digest-freq.off": "Off", - "digest-freq.daily": "Daily", - "digest-freq.weekly": "Weekly", - "digest-freq.monthly": "Monthly", + "digest-freq.daily": "Dzienny ", + "digest-freq.weekly": "Tygodniowy", + "digest-freq.monthly": "Miesięczny", "email-chat-notifs": "Send an email if a new chat message arrives and I am not online", "email-post-notif": "Send an email when replies are made to topics I am subscribed to", - "follow-created-topics": "Follow topics you create", - "follow-replied-topics": "Follow topics that you reply to" + "follow-created-topics": "Śledź tematy, które stworzyłeś", + "follow-replied-topics": "Śledź tematy, w których się wypowiedziałeś " } \ No newline at end of file diff --git a/public/language/pl/notifications.json b/public/language/pl/notifications.json index e9a6ecaf7e..7f8abea58a 100644 --- a/public/language/pl/notifications.json +++ b/public/language/pl/notifications.json @@ -19,6 +19,9 @@ "user_flagged_post_in": "%1 oflagował Twój post w %2", "user_flagged_post_in_dual": "%1 oraz %2 oflagowali post w %3", "user_flagged_post_in_multiple": "%1 oraz %2 innych oflagowali post w %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 dodał odpowiedź do %2", "user_posted_to_dual": "%1 oraz %2 dodali odpowiedzi do %3", "user_posted_to_multiple": "%1 oraz %2 innych dodali odpowiedzi do %3", diff --git a/public/language/pl/pages.json b/public/language/pl/pages.json index dfd76118bf..4ba9517037 100644 --- a/public/language/pl/pages.json +++ b/public/language/pl/pages.json @@ -6,7 +6,7 @@ "popular-month": "Tematy popularne w tym miesiącu", "popular-alltime": "Wszystkie popularne tematy", "recent": "Ostatnie Tematy", - "flagged-posts": "Oflagowane posty", + "flagged-content": "Treść oflagowanego posta", "ip-blacklist": "Czarna lista adresów IP", "users/online": "Dostępni Użytkownicy", "users/latest": "Nowi Użytkownicy", @@ -27,6 +27,8 @@ "group": "Grupa %1", "chats": "Rozmowy", "chat": "Rozmowa z %1", + "flags": "Flagi", + "flag-details": "Flag %1 Szczegóły", "account/edit": "Edytowanie \"%1\"", "account/edit/password": "Edytowanie hasła \"%1\"", "account/edit/username": "Edytowanie nazwy \"%1\"", diff --git a/public/language/pl/search.json b/public/language/pl/search.json index 914e41eed0..5ae90bc96e 100644 --- a/public/language/pl/search.json +++ b/public/language/pl/search.json @@ -12,6 +12,7 @@ "reply-count": "Ilość odpowiedzi", "at-least": "Przynajmniej", "at-most": "Co najwyżej", + "relevance": "Relevance", "post-time": "Napisano", "newer-than": "Nowsze niż", "older-than": "Starsze niż", diff --git a/public/language/pl/topic.json b/public/language/pl/topic.json index e821a3f114..9a026a1c11 100644 --- a/public/language/pl/topic.json +++ b/public/language/pl/topic.json @@ -13,7 +13,8 @@ "notify_me": "Powiadamiaj mnie o nowych odpowiedziach w tym temacie", "quote": "Cytuj", "reply": "Odpowiedz", - "replies_to_this_post": "Odpowiedzi: %1", + "replies_to_this_post": "%1 Replies", + "last_reply_time": "Last reply", "reply-as-topic": "Odpowiedz na temat", "guest-login-reply": "Zaloguj się, aby odpowiedzieć.", "edit": "Edytuj", @@ -25,28 +26,11 @@ "link": "Link", "share": "Udostępnij", "tools": "Narzędzia", - "flag": "Zgłoś", "locked": "Zablokowany", "pinned": "Przypięte", "moved": "Przeniesione", "bookmark_instructions": "Kliknij tutaj, by powrócić do ostatniego przeczytanego postu w tym wątku.", "flag_title": "Zgłoś post do moderacji", - "flag_success": "Ten post został oznaczony do moderacji.", - "flag_manage_title": "Oflagowanych postów do %1", - "flag_manage_history": "Historia wykonanych akcji", - "flag_manage_no_history": "Brak historii eventów ", - "flag_manage_assignee": "Beneficjant", - "flag_manage_state": "Stan", - "flag_manage_state_open": "Nowy/Otwarty", - "flag_manage_state_wip": "W trakcie prac", - "flag_manage_state_resolved": "Zdecydowany", - "flag_manage_state_rejected": "Odrzucono", - "flag_manage_notes": "Udostępniono notki", - "flag_manage_update": "Zaktualizowano status oflagowanych postów", - "flag_manage_history_assignee": "Przypisane do %1", - "flag_manage_history_state": "Zaktualizowano stan do %1", - "flag_manage_history_notes": "Zaktualizowano notki oflagowanych postów", - "flag_manage_saved": "Zaktualizowano oflagowane posty", "deleted_message": "Ten temat został skasowany. Tylko użytkownicy z uprawnieniami do zarządzania mogą go zobaczyć.", "following_topic.message": "Będziesz od teraz otrzymywał powiadomienia, gdy ktoś odpowie w tym temacie.", "not_following_topic.message": "Zobaczysz ten temat na liście nieprzeczytanych, ale nie otrzymasz żadnego powiadomienia dotyczącego tego tematu.", @@ -131,8 +115,5 @@ "stale.warning": "Wątek, na który chcesz udzielić odpowiedzi, jest przestarzały. Czy nie chciałbyś utworzyć nowego tematu, zamiast udzielać się w tym?", "stale.create": "Stwórz nowy temat", "stale.reply_anyway": "Odpowiedź na ten temat mimo tego", - "link_back": "Re: [%1](%2)", - "spam": "Spam", - "offensive": "Obraźliwy", - "custom-flag-reason": "Wprowadź powód oznaczenia" + "link_back": "Re: [%1](%2)" } \ No newline at end of file diff --git a/public/language/pl/user.json b/public/language/pl/user.json index ffdaf8b073..c4ba5ed631 100644 --- a/public/language/pl/user.json +++ b/public/language/pl/user.json @@ -33,6 +33,7 @@ "chat": "Rozmawiaj", "chat_with": "Kontynuuj rozmowę z %1", "new_chat_with": "Rozpocznij rozmowę z %1", + "flag-profile": "Flag Profile", "follow": "Śledź", "unfollow": "Przestań śledzić", "more": "Więcej", @@ -64,6 +65,8 @@ "remove_uploaded_picture": "Usuń Przesłane Zdjęcie", "upload_cover_picture": "Prześlij zdjęcie tła", "remove_cover_picture_confirm": "Czy jesteś pewny, że chcesz usunąć zdjęcie okładki?", + "crop_picture": "Crop picture", + "upload_cropped_picture": "Crop and upload", "settings": "Ustawienia", "show_email": "Wyświetlaj mój adres e-mail", "show_fullname": "Wyświetlaj moją pełną nazwę", diff --git a/public/language/pt-BR/admin/advanced/errors.json b/public/language/pt-BR/admin/advanced/errors.json index 557a23cc95..67ac477f0a 100644 --- a/public/language/pt-BR/admin/advanced/errors.json +++ b/public/language/pt-BR/admin/advanced/errors.json @@ -8,7 +8,7 @@ "clear-error-log": "Limpar Log de Erros", "route": "Rota", "count": "Contagem", - "no-routes-not-found": "Eeeee! Não tem quaisquer rotas que não foram encontradas.", + "no-routes-not-found": "Hooray! No 404 errors!", "clear404-confirm": "Você tem certeza que deseja limpar todos os logs de erro 404?", "clear404-success": "Erros de \"404 Não Encontrada\" apagados" } \ No newline at end of file diff --git a/public/language/pt-BR/admin/general/dashboard.json b/public/language/pt-BR/admin/general/dashboard.json index 0642d2b51e..d818f5f754 100644 --- a/public/language/pt-BR/admin/general/dashboard.json +++ b/public/language/pt-BR/admin/general/dashboard.json @@ -2,6 +2,9 @@ "forum-traffic": "Tráfego do Forum", "page-views": "Visualizações de Página", "unique-visitors": "Visitantes Únicos", + "users": "Users", + "posts": "Posts", + "topics": "Topics", "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", @@ -20,6 +23,11 @@ "prerelease-warning": "

Esta é uma versão pre-release do NodeBB. Bugs inesperados podem ocorrer.

", "notices": "Avisos", + "restart-not-required": "Restart not required", + "restart-required": "Restart required", + "search-plugin-installed": "Search Plugin installed", + "search-plugin-not-installed": "Search Plugin not installed", + "search-plugin-tooltip": "Install a search plugin from the plugin page in order to activate search functionality", "control-panel": "Controle do Sistema", "reload": "Recarregar", @@ -52,4 +60,4 @@ "graphs.unique-visitors": "Visitantes Únicos", "graphs.registered-users": "Usuários Registrados", "graphs.anonymous-users": "Usuários Anônimos" -} \ No newline at end of file +} diff --git a/public/language/pt-BR/admin/menu.json b/public/language/pt-BR/admin/menu.json index 24891a317b..e47f627ac5 100644 --- a/public/language/pt-BR/admin/menu.json +++ b/public/language/pt-BR/admin/menu.json @@ -13,7 +13,6 @@ "manage/users": "Usuários", "manage/registration": "Fila de Registro", "manage/groups": "Grupos", - "manage/flags": "Sinalizações", "manage/ip-blacklist": "Lista Negra de IPs", "section-settings": "Configurações", diff --git a/public/language/pt-BR/admin/settings/general.json b/public/language/pt-BR/admin/settings/general.json index d4d36107c1..82ac4fb667 100644 --- a/public/language/pt-BR/admin/settings/general.json +++ b/public/language/pt-BR/admin/settings/general.json @@ -26,5 +26,6 @@ "touch-icon.upload": "Enviar", "touch-icon.help": "Tamanho e formato recomendados: 192x192, apenas formato PNG. Se nenhum ícone de touch screen for especificado, o NodeBB usará o seu favicon, ao invés dele.", "outgoing-links": "Links Externos", - "outgoing-links.warning-page": "Utilizar Página de Aviso de Links Externos" + "outgoing-links.warning-page": "Utilizar Página de Aviso de Links Externos", + "search-default-sort-by": "Search default sort by" } \ No newline at end of file diff --git a/public/language/pt-BR/admin/settings/uploads.json b/public/language/pt-BR/admin/settings/uploads.json index 26699bfe62..8016a20720 100644 --- a/public/language/pt-BR/admin/settings/uploads.json +++ b/public/language/pt-BR/admin/settings/uploads.json @@ -9,7 +9,7 @@ "allow-topic-thumbnails": "Permitir usuários de enviar miniaturas de tópico", "topic-thumb-size": "Tamanho da Miniatura de Tópico", "allowed-file-extensions": "Extensões de Arquivo Permitidas", - "allowed-file-extensions-help": "Digite aqui uma lista de extensões de arquivo separada por vírgulas (e.g. pdf,xls,doc).\n\\t\\t\\t\\t\\tUma lista vazia significa que todas as extensões são permitidas.", + "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": "Avatares de Perfil", "allow-profile-image-uploads": "Permitir usuários de enviar imagens de perfil", "convert-profile-image-png": "Converter imagens de perfil enviadas para PNG", @@ -25,4 +25,4 @@ "profile-covers": "Capas de Perfil", "default-covers": "Imagens de Capa Padrão", "default-covers-help": "Adicione uma lista separada por vírgulas de imagens de capa padrão para contas que não tenham enviado uma imagem de capa" -} \ No newline at end of file +} diff --git a/public/language/pt-BR/notifications.json b/public/language/pt-BR/notifications.json index 2ef1d95178..f189833c1d 100644 --- a/public/language/pt-BR/notifications.json +++ b/public/language/pt-BR/notifications.json @@ -19,6 +19,9 @@ "user_flagged_post_in": "%1 sinalizou um post em %2", "user_flagged_post_in_dual": "%1 e %2 sinalizaram um post em %3", "user_flagged_post_in_multiple": "%1 e %2 outros sinalizaram um post em %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 postou uma resposta para: %2", "user_posted_to_dual": "%1 e %2 postaram respostas para: %3", "user_posted_to_multiple": "%1 e %2 outros postaram respostas para: %3", diff --git a/public/language/pt-BR/pages.json b/public/language/pt-BR/pages.json index 1d8c4f87bb..7a27b39a3c 100644 --- a/public/language/pt-BR/pages.json +++ b/public/language/pt-BR/pages.json @@ -6,7 +6,7 @@ "popular-month": "Tópicos populares deste mês", "popular-alltime": "Tópicos populares de todos os tempos", "recent": "Tópicos Recentes", - "flagged-posts": "Posts Sinalizados", + "flagged-content": "Flagged Content", "ip-blacklist": "Lista negra de IPs", "users/online": "Usuários Online", "users/latest": "Últimos Usuários", @@ -27,6 +27,8 @@ "group": "%1 grupo", "chats": "Chats", "chat": "Conversando com %1", + "flags": "Flags", + "flag-details": "Flag %1 Details", "account/edit": "Editando \"%1\"", "account/edit/password": "Editando senha de \"%1\"", "account/edit/username": "Editando nome de usuário de \"%1\"", diff --git a/public/language/pt-BR/search.json b/public/language/pt-BR/search.json index ef5256426f..8cab1cc17d 100644 --- a/public/language/pt-BR/search.json +++ b/public/language/pt-BR/search.json @@ -12,6 +12,7 @@ "reply-count": "Contagem de Respostas", "at-least": "No mínimo", "at-most": "No máximo", + "relevance": "Relevance", "post-time": "Data da postagem", "newer-than": "Mais novo que", "older-than": "Mais antigo que", diff --git a/public/language/pt-BR/topic.json b/public/language/pt-BR/topic.json index 14fa9c7826..94c012b3e8 100644 --- a/public/language/pt-BR/topic.json +++ b/public/language/pt-BR/topic.json @@ -13,7 +13,8 @@ "notify_me": "Seja notificado de novas respostas nesse tópico", "quote": "Citar", "reply": "Responder", - "replies_to_this_post": "Respostas: %1", + "replies_to_this_post": "%1 Replies", + "last_reply_time": "Last reply", "reply-as-topic": "Responder como tópico", "guest-login-reply": "Entre para responder", "edit": "Editar", @@ -25,28 +26,11 @@ "link": "Link", "share": "Compartilhar", "tools": "Ferramentas", - "flag": "Sinalizar", "locked": "Trancado", "pinned": "Afixado", "moved": "Movido", "bookmark_instructions": "Clique aqui para retornar ao último post lido neste tópico.", "flag_title": "Sinalizar este post para moderação", - "flag_success": "Este post foi sinalizado para ser moderado.", - "flag_manage_title": "Post sinalizado em %1", - "flag_manage_history": "Histórico de Atividades", - "flag_manage_no_history": "Nenhum histórico de eventos para mostrar", - "flag_manage_assignee": "Procurador", - "flag_manage_state": "Situação", - "flag_manage_state_open": "Novo/Aberto", - "flag_manage_state_wip": "Trabalho em Andamento", - "flag_manage_state_resolved": "Resolvido", - "flag_manage_state_rejected": "Rejeitado", - "flag_manage_notes": "Notas Compartilhadas", - "flag_manage_update": "Atualizar Status da Sinalização", - "flag_manage_history_assignee": "Procuração concedida para %1", - "flag_manage_history_state": "Situação atualizada para %1", - "flag_manage_history_notes": "Notas de sinalização atualizadas", - "flag_manage_saved": "Detalhes da Sinalização Atualizados", "deleted_message": "Este tópico foi deletado. Apenas usuários com privilégios de moderação de tópico podem vê-lo.", "following_topic.message": "Agora você receberá notificações quando alguém responder este tópico.", "not_following_topic.message": "Você verá este tópico na lista de tópicos não-lidos, mas você não receberá notificações quendo alguém posta no tópico.", @@ -131,8 +115,5 @@ "stale.warning": "O tópico que você está respondendo é bem antigo. Você gostaria de criar um novo tópico ao invés disso, e referenciá-lo em sua resposta?", "stale.create": "Criar um novo tópico", "stale.reply_anyway": "Responder à este tópico assim mesmo", - "link_back": "Re: [%1](%2)", - "spam": "Spam", - "offensive": "Ofensivo", - "custom-flag-reason": "Informe um motivo para a sinalização" + "link_back": "Re: [%1](%2)" } \ No newline at end of file diff --git a/public/language/pt-BR/user.json b/public/language/pt-BR/user.json index 0df550d5c7..d3e5415207 100644 --- a/public/language/pt-BR/user.json +++ b/public/language/pt-BR/user.json @@ -33,6 +33,7 @@ "chat": "Chat", "chat_with": "Continuar a conversa com %1", "new_chat_with": "Iniciar uma nova conversa com %1", + "flag-profile": "Flag Profile", "follow": "Seguir", "unfollow": "Deixar de Seguir", "more": "Mais", @@ -64,6 +65,8 @@ "remove_uploaded_picture": "Remover Foto Enviada", "upload_cover_picture": "Fazer upload de imagem de capa ", "remove_cover_picture_confirm": "Tem certeza que deseja remover a imagem de capa?", + "crop_picture": "Crop picture", + "upload_cropped_picture": "Crop and upload", "settings": "Configurações", "show_email": "Mostrar Meu Email", "show_fullname": "Mostrar Meu Nome Completo", diff --git a/public/language/pt-PT/admin/advanced/errors.json b/public/language/pt-PT/admin/advanced/errors.json index 963e68b116..546f0f1508 100644 --- a/public/language/pt-PT/admin/advanced/errors.json +++ b/public/language/pt-PT/admin/advanced/errors.json @@ -8,7 +8,7 @@ "clear-error-log": "Clear Error Log", "route": "Route", "count": "Count", - "no-routes-not-found": "Hooray! There are no routes that were not found.", + "no-routes-not-found": "Hooray! No 404 errors!", "clear404-confirm": "Are you sure you wish to clear the 404 error logs?", "clear404-success": "\"404 Not Found\" errors cleared" } \ No newline at end of file diff --git a/public/language/pt-PT/admin/general/dashboard.json b/public/language/pt-PT/admin/general/dashboard.json index b82802db1b..a70dda322e 100644 --- a/public/language/pt-PT/admin/general/dashboard.json +++ b/public/language/pt-PT/admin/general/dashboard.json @@ -2,6 +2,9 @@ "forum-traffic": "Forum Traffic", "page-views": "Page Views", "unique-visitors": "Unique Visitors", + "users": "Users", + "posts": "Posts", + "topics": "Topics", "page-views-last-month": "Page views Last Month", "page-views-this-month": "Page views This Month", "page-views-last-day": "Page views in last 24 hours", @@ -20,6 +23,11 @@ "prerelease-warning": "

This is a pre-release version of NodeBB. Unintended bugs may occur.

", "notices": "Notices", + "restart-not-required": "Restart not required", + "restart-required": "Restart required", + "search-plugin-installed": "Search Plugin installed", + "search-plugin-not-installed": "Search Plugin not installed", + "search-plugin-tooltip": "Install a search plugin from the plugin page in order to activate search functionality", "control-panel": "System Control", "reload": "Reload", @@ -52,4 +60,4 @@ "graphs.unique-visitors": "Unique Visitors", "graphs.registered-users": "Registered Users", "graphs.anonymous-users": "Anonymous Users" -} \ No newline at end of file +} diff --git a/public/language/pt-PT/admin/menu.json b/public/language/pt-PT/admin/menu.json index 6a4995ea6e..985c540e8a 100644 --- a/public/language/pt-PT/admin/menu.json +++ b/public/language/pt-PT/admin/menu.json @@ -13,7 +13,6 @@ "manage/users": "Users", "manage/registration": "Registration Queue", "manage/groups": "Groups", - "manage/flags": "Flags", "manage/ip-blacklist": "IP Blacklist", "section-settings": "Settings", diff --git a/public/language/pt-PT/admin/settings/general.json b/public/language/pt-PT/admin/settings/general.json index c26740ee4f..72ecfe641f 100644 --- a/public/language/pt-PT/admin/settings/general.json +++ b/public/language/pt-PT/admin/settings/general.json @@ -26,5 +26,6 @@ "touch-icon.upload": "Upload", "touch-icon.help": "Recommended size and format: 192x192, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.", "outgoing-links": "Outgoing Links", - "outgoing-links.warning-page": "Use Outgoing Links Warning Page" + "outgoing-links.warning-page": "Use Outgoing Links Warning Page", + "search-default-sort-by": "Search default sort by" } \ No newline at end of file diff --git a/public/language/pt-PT/admin/settings/uploads.json b/public/language/pt-PT/admin/settings/uploads.json index 8a56c85663..35eaa5a58f 100644 --- a/public/language/pt-PT/admin/settings/uploads.json +++ b/public/language/pt-PT/admin/settings/uploads.json @@ -9,7 +9,7 @@ "allow-topic-thumbnails": "Allow users to upload topic thumbnails", "topic-thumb-size": "Topic Thumb Size", "allowed-file-extensions": "Allowed File Extensions", - "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc).\n\t\t\t\t\tAn empty list means all extensions are allowed.", + "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc). An empty list means all extensions are allowed.", "profile-avatars": "Profile Avatars", "allow-profile-image-uploads": "Allow users to upload profile images", "convert-profile-image-png": "Convert profile image uploads to PNG", @@ -25,4 +25,4 @@ "profile-covers": "Profile Covers", "default-covers": "Default Cover Images", "default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image" -} \ No newline at end of file +} diff --git a/public/language/pt-PT/notifications.json b/public/language/pt-PT/notifications.json index c9b9fdd32a..434094d108 100644 --- a/public/language/pt-PT/notifications.json +++ b/public/language/pt-PT/notifications.json @@ -19,6 +19,9 @@ "user_flagged_post_in": "%1 sinalizou uma publicação em %2", "user_flagged_post_in_dual": "%1 e %2 sinalizaram uma publicação em %3", "user_flagged_post_in_multiple": "%1 e %2 outros utilizadores sinalizaram uma publicação em %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 publicou uma resposta a: %2", "user_posted_to_dual": "%1 e %2 publicaram respostas a: %3", "user_posted_to_multiple": "%1 e %2 outros utilizadores publicaram respostas a: %3", diff --git a/public/language/pt-PT/pages.json b/public/language/pt-PT/pages.json index b0c9ea6b93..d22a86e4d1 100644 --- a/public/language/pt-PT/pages.json +++ b/public/language/pt-PT/pages.json @@ -6,7 +6,7 @@ "popular-month": "Tópicos populares este mês", "popular-alltime": "Tópicos populares desde sempre", "recent": "Tópicos recentes", - "flagged-posts": "Publicações sinalizadas", + "flagged-content": "Flagged Content", "ip-blacklist": "Lista negra de IPs", "users/online": "Utilizadores online", "users/latest": "Últimos utilizadores", @@ -27,6 +27,8 @@ "group": "%1 group", "chats": "Conversas", "chat": "Conversando com %1", + "flags": "Flags", + "flag-details": "Flag %1 Details", "account/edit": "Editando \"%1\"", "account/edit/password": "Editando palavra-passe de \"%1\"", "account/edit/username": "Editando o nome de utilizador de \"%1\"", diff --git a/public/language/pt-PT/search.json b/public/language/pt-PT/search.json index 912f071c53..710b060b6e 100644 --- a/public/language/pt-PT/search.json +++ b/public/language/pt-PT/search.json @@ -12,6 +12,7 @@ "reply-count": "Contagem de respostas", "at-least": "Pelo menos", "at-most": "No máximo", + "relevance": "Relevance", "post-time": "Hora da publicação", "newer-than": "Mais recente que", "older-than": "Mais antigo que", diff --git a/public/language/pt-PT/topic.json b/public/language/pt-PT/topic.json index e6e023174b..6622afb644 100644 --- a/public/language/pt-PT/topic.json +++ b/public/language/pt-PT/topic.json @@ -13,7 +13,8 @@ "notify_me": "Ser notificado de novas respostas neste tópico", "quote": "Citar", "reply": "Responder", - "replies_to_this_post": "Respostas: %1", + "replies_to_this_post": "%1 Replies", + "last_reply_time": "Last reply", "reply-as-topic": "Responder com um tópico", "guest-login-reply": "Faz login para responder", "edit": "Editar", @@ -25,28 +26,11 @@ "link": "Ligação", "share": "Partilhar", "tools": "Ferramentas", - "flag": "Sinalizar", "locked": "Bloqueado", "pinned": "Afixado", "moved": "Movido", "bookmark_instructions": "Carrega aqui para voltares à última publicação lide assunto.", "flag_title": "Sinaliza esta publicação para moderação", - "flag_success": "Esta publicação foi sinalizada para moderação.", - "flag_manage_title": "Publicação sinalizada em %1", - "flag_manage_history": "Histórico de ação", - "flag_manage_no_history": "Não existe histórico de eventos para reportar", - "flag_manage_assignee": "Assinante", - "flag_manage_state": "Estado", - "flag_manage_state_open": "Novo/Abrir", - "flag_manage_state_wip": "Trabalho em progresso", - "flag_manage_state_resolved": "Resolvido", - "flag_manage_state_rejected": "Rejeitado", - "flag_manage_notes": "Notas partilhadas", - "flag_manage_update": "Atualiza o estado da sinalização", - "flag_manage_history_assignee": "Designado para %1", - "flag_manage_history_state": "Estado atualizado para %1", - "flag_manage_history_notes": "Notas da sinalização atualizadas", - "flag_manage_saved": "Detalhes de sinalização atualizados", "deleted_message": "Este tópico foi eliminado. Somente utilizadores com privilégios de manutenção do tópico podem vê-lo.", "following_topic.message": "A partir de agora receberás uma notificação sempre que alguém publicar neste tópico.", "not_following_topic.message": "Verás este tópico na lista de tópicos por ler mas não irás receber notificações quando alguém publicar neste tópico.", @@ -131,8 +115,5 @@ "stale.warning": "O tópico ao qual estás a responder é bastante antigo. Gostarias antes de criar um novo tópico e referir este na tua resposta?", "stale.create": "Criar um novo tópico", "stale.reply_anyway": "Responder a este tópico à mesma", - "link_back": "Referindo: [%1](%2)", - "spam": "Spam", - "offensive": "Ofensivo", - "custom-flag-reason": "Introduzir uma razão para a sinalização" + "link_back": "Referindo: [%1](%2)" } \ No newline at end of file diff --git a/public/language/pt-PT/user.json b/public/language/pt-PT/user.json index acff84f2de..10d919de39 100644 --- a/public/language/pt-PT/user.json +++ b/public/language/pt-PT/user.json @@ -33,6 +33,7 @@ "chat": "Conversa", "chat_with": "Continuar a conversa com %1", "new_chat_with": "Começa nova conversa com %1", + "flag-profile": "Flag Profile", "follow": "Segue", "unfollow": "Deixar de seguir", "more": "Mais", @@ -64,6 +65,8 @@ "remove_uploaded_picture": "Remover imagem carregada", "upload_cover_picture": "Carregar fotografia de capa", "remove_cover_picture_confirm": "Are you sure you want to remove the cover picture?", + "crop_picture": "Crop picture", + "upload_cropped_picture": "Crop and upload", "settings": "Definições", "show_email": "Mostrar o meu e-mail", "show_fullname": "Mostrar o meu nome completo", diff --git a/public/language/ro/admin/advanced/errors.json b/public/language/ro/admin/advanced/errors.json index 963e68b116..546f0f1508 100644 --- a/public/language/ro/admin/advanced/errors.json +++ b/public/language/ro/admin/advanced/errors.json @@ -8,7 +8,7 @@ "clear-error-log": "Clear Error Log", "route": "Route", "count": "Count", - "no-routes-not-found": "Hooray! There are no routes that were not found.", + "no-routes-not-found": "Hooray! No 404 errors!", "clear404-confirm": "Are you sure you wish to clear the 404 error logs?", "clear404-success": "\"404 Not Found\" errors cleared" } \ No newline at end of file diff --git a/public/language/ro/admin/general/dashboard.json b/public/language/ro/admin/general/dashboard.json index b82802db1b..a70dda322e 100644 --- a/public/language/ro/admin/general/dashboard.json +++ b/public/language/ro/admin/general/dashboard.json @@ -2,6 +2,9 @@ "forum-traffic": "Forum Traffic", "page-views": "Page Views", "unique-visitors": "Unique Visitors", + "users": "Users", + "posts": "Posts", + "topics": "Topics", "page-views-last-month": "Page views Last Month", "page-views-this-month": "Page views This Month", "page-views-last-day": "Page views in last 24 hours", @@ -20,6 +23,11 @@ "prerelease-warning": "

This is a pre-release version of NodeBB. Unintended bugs may occur.

", "notices": "Notices", + "restart-not-required": "Restart not required", + "restart-required": "Restart required", + "search-plugin-installed": "Search Plugin installed", + "search-plugin-not-installed": "Search Plugin not installed", + "search-plugin-tooltip": "Install a search plugin from the plugin page in order to activate search functionality", "control-panel": "System Control", "reload": "Reload", @@ -52,4 +60,4 @@ "graphs.unique-visitors": "Unique Visitors", "graphs.registered-users": "Registered Users", "graphs.anonymous-users": "Anonymous Users" -} \ No newline at end of file +} diff --git a/public/language/ro/admin/menu.json b/public/language/ro/admin/menu.json index 6a4995ea6e..985c540e8a 100644 --- a/public/language/ro/admin/menu.json +++ b/public/language/ro/admin/menu.json @@ -13,7 +13,6 @@ "manage/users": "Users", "manage/registration": "Registration Queue", "manage/groups": "Groups", - "manage/flags": "Flags", "manage/ip-blacklist": "IP Blacklist", "section-settings": "Settings", diff --git a/public/language/ro/admin/settings/general.json b/public/language/ro/admin/settings/general.json index c26740ee4f..72ecfe641f 100644 --- a/public/language/ro/admin/settings/general.json +++ b/public/language/ro/admin/settings/general.json @@ -26,5 +26,6 @@ "touch-icon.upload": "Upload", "touch-icon.help": "Recommended size and format: 192x192, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.", "outgoing-links": "Outgoing Links", - "outgoing-links.warning-page": "Use Outgoing Links Warning Page" + "outgoing-links.warning-page": "Use Outgoing Links Warning Page", + "search-default-sort-by": "Search default sort by" } \ No newline at end of file diff --git a/public/language/ro/admin/settings/uploads.json b/public/language/ro/admin/settings/uploads.json index 8a56c85663..35eaa5a58f 100644 --- a/public/language/ro/admin/settings/uploads.json +++ b/public/language/ro/admin/settings/uploads.json @@ -9,7 +9,7 @@ "allow-topic-thumbnails": "Allow users to upload topic thumbnails", "topic-thumb-size": "Topic Thumb Size", "allowed-file-extensions": "Allowed File Extensions", - "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc).\n\t\t\t\t\tAn empty list means all extensions are allowed.", + "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc). An empty list means all extensions are allowed.", "profile-avatars": "Profile Avatars", "allow-profile-image-uploads": "Allow users to upload profile images", "convert-profile-image-png": "Convert profile image uploads to PNG", @@ -25,4 +25,4 @@ "profile-covers": "Profile Covers", "default-covers": "Default Cover Images", "default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image" -} \ No newline at end of file +} diff --git a/public/language/ro/notifications.json b/public/language/ro/notifications.json index ea8a0d2b06..341ac1f2d1 100644 --- a/public/language/ro/notifications.json +++ b/public/language/ro/notifications.json @@ -19,6 +19,9 @@ "user_flagged_post_in": "%1 a semnalizat un mesaj în %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 a postat un răspuns la: %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", diff --git a/public/language/ro/pages.json b/public/language/ro/pages.json index 36eafbd6ef..4816853bef 100644 --- a/public/language/ro/pages.json +++ b/public/language/ro/pages.json @@ -6,7 +6,7 @@ "popular-month": "Subiecte populare în luna asta", "popular-alltime": "All time popular topics", "recent": "Subiecte Noi", - "flagged-posts": "Flagged Posts", + "flagged-content": "Flagged Content", "ip-blacklist": "IP Blacklist", "users/online": "Utilizatori online", "users/latest": "Ultimii membrii", @@ -27,6 +27,8 @@ "group": "%1 group", "chats": "Chats", "chat": "Chatting with %1", + "flags": "Flags", + "flag-details": "Flag %1 Details", "account/edit": "Editing \"%1\"", "account/edit/password": "Editing password of \"%1\"", "account/edit/username": "Editing username of \"%1\"", diff --git a/public/language/ro/search.json b/public/language/ro/search.json index 3cc4c5b8f6..91a591e180 100644 --- a/public/language/ro/search.json +++ b/public/language/ro/search.json @@ -12,6 +12,7 @@ "reply-count": "Numărul de răspunsuri", "at-least": "Cel puţin", "at-most": "Cel mult", + "relevance": "Relevance", "post-time": "Ora mesajului", "newer-than": "Mai noi decât", "older-than": "Mai vechi decât", diff --git a/public/language/ro/topic.json b/public/language/ro/topic.json index fbeb287222..370981d72e 100644 --- a/public/language/ro/topic.json +++ b/public/language/ro/topic.json @@ -13,7 +13,8 @@ "notify_me": "Notică-mă de noi răspunsuri în acest subiect", "quote": "Citează", "reply": "Răspunde", - "replies_to_this_post": "Replies: %1", + "replies_to_this_post": "%1 Replies", + "last_reply_time": "Last reply", "reply-as-topic": "Răspunde ca subiect", "guest-login-reply": "Login pentru a răspunde", "edit": "Editează", @@ -25,28 +26,11 @@ "link": "Link", "share": "Distribuie", "tools": "Unelte", - "flag": "Semnalizează", "locked": "Închis", "pinned": "Pinned", "moved": "Moved", "bookmark_instructions": "Click here to return to the last read post in this thread.", "flag_title": "Semnalizează acest mesaj pentru moderare", - "flag_success": "Acest mesaj a fost semnalizat pentru moderare.", - "flag_manage_title": "Flagged post in %1", - "flag_manage_history": "Action History", - "flag_manage_no_history": "No event history to report", - "flag_manage_assignee": "Assignee", - "flag_manage_state": "State", - "flag_manage_state_open": "New/Open", - "flag_manage_state_wip": "Work in Progress", - "flag_manage_state_resolved": "Resolved", - "flag_manage_state_rejected": "Rejected", - "flag_manage_notes": "Shared Notes", - "flag_manage_update": "Update Flag Status", - "flag_manage_history_assignee": "Assigned to %1", - "flag_manage_history_state": "Updated state to %1", - "flag_manage_history_notes": "Updated flag notes", - "flag_manage_saved": "Flag Details Updated", "deleted_message": "Acest subiect a fost șters. Doar utilizatorii cu privilegii pentru moderarea subiectelor îl poate vedea.", "following_topic.message": "Vei primi notificări când cineva va posta un nou mesaj in acest subiect.", "not_following_topic.message": "You will see this topic in the unread topics list, but you will not receive notifications when somebody posts to this topic.", @@ -131,8 +115,5 @@ "stale.warning": "The topic you are replying to is quite old. Would you like to create a new topic instead, and reference this one in your reply?", "stale.create": "Create a new topic", "stale.reply_anyway": "Reply to this topic anyway", - "link_back": "Re: [%1](%2)", - "spam": "Spam", - "offensive": "Offensive", - "custom-flag-reason": "Enter a flagging reason" + "link_back": "Re: [%1](%2)" } \ No newline at end of file diff --git a/public/language/ro/user.json b/public/language/ro/user.json index 467d27a931..47ad0ca252 100644 --- a/public/language/ro/user.json +++ b/public/language/ro/user.json @@ -33,6 +33,7 @@ "chat": "Conversație", "chat_with": "Continue chat with %1", "new_chat_with": "Start new chat with %1", + "flag-profile": "Flag Profile", "follow": "Urmărește", "unfollow": "Oprește urmărirea", "more": "Mai multe", @@ -64,6 +65,8 @@ "remove_uploaded_picture": "Remove Uploaded Picture", "upload_cover_picture": "Upload cover picture", "remove_cover_picture_confirm": "Are you sure you want to remove the cover picture?", + "crop_picture": "Crop picture", + "upload_cropped_picture": "Crop and upload", "settings": "Setări", "show_email": "Arată adresa mea de email", "show_fullname": "Show My Full Name", diff --git a/public/language/ru/admin/advanced/cache.json b/public/language/ru/admin/advanced/cache.json index 208775f991..c0487f399b 100644 --- a/public/language/ru/admin/advanced/cache.json +++ b/public/language/ru/admin/advanced/cache.json @@ -1,11 +1,11 @@ { "post-cache": "Кэш записи", "posts-in-cache": "Записей в кэше", - "average-post-size": "Average Post Size", - "length-to-max": "Length / Max", + "average-post-size": "Средний размер записи", + "length-to-max": "Длина / Максимальная", "percent-full": "%1% Full", - "post-cache-size": "Post Cache Size", + "post-cache-size": "Размер записи в кэше", "items-in-cache": "Items in Cache", - "control-panel": "Control Panel", - "update-settings": "Update Cache Settings" + "control-panel": "Панель управления", + "update-settings": "Обновить настройки кэша" } \ No newline at end of file diff --git a/public/language/ru/admin/advanced/errors.json b/public/language/ru/admin/advanced/errors.json index 963e68b116..546f0f1508 100644 --- a/public/language/ru/admin/advanced/errors.json +++ b/public/language/ru/admin/advanced/errors.json @@ -8,7 +8,7 @@ "clear-error-log": "Clear Error Log", "route": "Route", "count": "Count", - "no-routes-not-found": "Hooray! There are no routes that were not found.", + "no-routes-not-found": "Hooray! No 404 errors!", "clear404-confirm": "Are you sure you wish to clear the 404 error logs?", "clear404-success": "\"404 Not Found\" errors cleared" } \ No newline at end of file diff --git a/public/language/ru/admin/general/dashboard.json b/public/language/ru/admin/general/dashboard.json index c5c6a3e2f3..ea879e2ff8 100644 --- a/public/language/ru/admin/general/dashboard.json +++ b/public/language/ru/admin/general/dashboard.json @@ -2,6 +2,9 @@ "forum-traffic": "Трафик ", "page-views": "Просмотров", "unique-visitors": "Посетителей", + "users": "Users", + "posts": "Posts", + "topics": "Topics", "page-views-last-month": "Просмотров за прошлый месяц", "page-views-this-month": "Просмотров за этот месяц", "page-views-last-day": "Просмотров за 24 часа", @@ -20,6 +23,11 @@ "prerelease-warning": "

This is a pre-release version of NodeBB. Unintended bugs may occur.

", "notices": "Уведомления", + "restart-not-required": "Restart not required", + "restart-required": "Restart required", + "search-plugin-installed": "Search Plugin installed", + "search-plugin-not-installed": "Search Plugin not installed", + "search-plugin-tooltip": "Install a search plugin from the plugin page in order to activate search functionality", "control-panel": "Управление", "reload": "Перезапустить", @@ -52,4 +60,4 @@ "graphs.unique-visitors": "Уникальных пользователей", "graphs.registered-users": "Зарегистрированных пользователей", "graphs.anonymous-users": "Анонимных пользователей" -} \ No newline at end of file +} diff --git a/public/language/ru/admin/menu.json b/public/language/ru/admin/menu.json index c465ecacce..07b7030f22 100644 --- a/public/language/ru/admin/menu.json +++ b/public/language/ru/admin/menu.json @@ -13,7 +13,6 @@ "manage/users": "Пользователи", "manage/registration": "Очередь на регистрацию", "manage/groups": "Группы", - "manage/flags": "Жалобы", "manage/ip-blacklist": "Блокировка IP", "section-settings": "Настройки", diff --git a/public/language/ru/admin/settings/general.json b/public/language/ru/admin/settings/general.json index c26740ee4f..72ecfe641f 100644 --- a/public/language/ru/admin/settings/general.json +++ b/public/language/ru/admin/settings/general.json @@ -26,5 +26,6 @@ "touch-icon.upload": "Upload", "touch-icon.help": "Recommended size and format: 192x192, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.", "outgoing-links": "Outgoing Links", - "outgoing-links.warning-page": "Use Outgoing Links Warning Page" + "outgoing-links.warning-page": "Use Outgoing Links Warning Page", + "search-default-sort-by": "Search default sort by" } \ No newline at end of file diff --git a/public/language/ru/admin/settings/uploads.json b/public/language/ru/admin/settings/uploads.json index 8a56c85663..35eaa5a58f 100644 --- a/public/language/ru/admin/settings/uploads.json +++ b/public/language/ru/admin/settings/uploads.json @@ -9,7 +9,7 @@ "allow-topic-thumbnails": "Allow users to upload topic thumbnails", "topic-thumb-size": "Topic Thumb Size", "allowed-file-extensions": "Allowed File Extensions", - "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc).\n\t\t\t\t\tAn empty list means all extensions are allowed.", + "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc). An empty list means all extensions are allowed.", "profile-avatars": "Profile Avatars", "allow-profile-image-uploads": "Allow users to upload profile images", "convert-profile-image-png": "Convert profile image uploads to PNG", @@ -25,4 +25,4 @@ "profile-covers": "Profile Covers", "default-covers": "Default Cover Images", "default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image" -} \ No newline at end of file +} diff --git a/public/language/ru/notifications.json b/public/language/ru/notifications.json index dc128d5acc..40727a85f3 100644 --- a/public/language/ru/notifications.json +++ b/public/language/ru/notifications.json @@ -19,6 +19,9 @@ "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 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 ответил на запись: %2", "user_posted_to_dual": "Участники %1 и %2 ответили на вашу запись: %3", "user_posted_to_multiple": "Участник %1 и %2 других ответили на вашу запись: %3", diff --git a/public/language/ru/pages.json b/public/language/ru/pages.json index ec4fccb5f1..86cfc9da3e 100644 --- a/public/language/ru/pages.json +++ b/public/language/ru/pages.json @@ -6,7 +6,7 @@ "popular-month": "Популярные темы этого месяца", "popular-alltime": "Популярные темы за всё время", "recent": "Последние темы", - "flagged-posts": "Отмеченные сообщения", + "flagged-content": "Flagged Content", "ip-blacklist": "Чёрный список IP", "users/online": "В сети", "users/latest": "Новые участники", @@ -27,6 +27,8 @@ "group": "Группа %1", "chats": "Чаты", "chat": "Чат с участником %1", + "flags": "Flags", + "flag-details": "Flag %1 Details", "account/edit": "Редактирование \"%1\"", "account/edit/password": "Сменить пароль \"%1\"", "account/edit/username": "Изменить имя пользователя \"%1\"", diff --git a/public/language/ru/search.json b/public/language/ru/search.json index 1264963c1a..dcc85a00ef 100644 --- a/public/language/ru/search.json +++ b/public/language/ru/search.json @@ -12,6 +12,7 @@ "reply-count": "Количество ответов", "at-least": "Минимум", "at-most": "Максимум", + "relevance": "Relevance", "post-time": "Время публикации", "newer-than": "Ранее чем", "older-than": "Позже чем", diff --git a/public/language/ru/topic.json b/public/language/ru/topic.json index fd6f1a146a..45e0d731a3 100644 --- a/public/language/ru/topic.json +++ b/public/language/ru/topic.json @@ -13,7 +13,8 @@ "notify_me": "Подписаться на новые ответы", "quote": "Цитировать", "reply": "Ответить", - "replies_to_this_post": "Ответов: %1", + "replies_to_this_post": "%1 Replies", + "last_reply_time": "Last reply", "reply-as-topic": "Ответить, создав новую тему", "guest-login-reply": "Необходимо авторизоваться на сайте, чтобы оставить сообщение. Пожалуйста, зарегистрируйтесь или войдите на сайт.", "edit": "Редактировать", @@ -25,28 +26,11 @@ "link": "Ссылка", "share": "Поделиться", "tools": "Настройки записи", - "flag": "Отметить", "locked": "Закрыт", "pinned": "Прикреплена", "moved": "Перемещена", "bookmark_instructions": "Нажмите здесь, чтобы вернуться к последнему прочитанному сообщению в этой теме.", "flag_title": "Отметить сообщение для модерирования", - "flag_success": "Это сообщение было помечено для модерации", - "flag_manage_title": "Отмеченные сообщения в %1", - "flag_manage_history": "История действий", - "flag_manage_no_history": "В отчёте нет событий", - "flag_manage_assignee": "Правоприемник", - "flag_manage_state": "Состояние", - "flag_manage_state_open": "Новое/Открытое", - "flag_manage_state_wip": "Рассматривается", - "flag_manage_state_resolved": "Подтверждено", - "flag_manage_state_rejected": "Отклонено", - "flag_manage_notes": "Коллективные заметки", - "flag_manage_update": "Обновить статус жалобы", - "flag_manage_history_assignee": "Назначено %1", - "flag_manage_history_state": "Статус обновлён на %1", - "flag_manage_history_notes": "Статус жалобы обновлен", - "flag_manage_saved": "Подробности жалобы обновлены", "deleted_message": "Эта тема была удалена. Только пользователи с правами управления темами могут ее видеть.", "following_topic.message": "Теперь вы будете получать уведомления при обновлении этой темы.", "not_following_topic.message": "Вы увидите эту тему в списке непрочитанных тем, но Вы не будете получать уведомления, когда кто-то напишет сообщение в эту тему.", @@ -131,8 +115,5 @@ "stale.warning": "Тема, в которую вы пишите, очень старая. Вы хотите создать новую тему?", "stale.create": "Создать новую тему", "stale.reply_anyway": "Всё равно ответить в этой теме", - "link_back": "Ответ: [%1](%2)", - "spam": "Спам", - "offensive": "Оскорбление", - "custom-flag-reason": "Введите другую причину" + "link_back": "Ответ: [%1](%2)" } \ No newline at end of file diff --git a/public/language/ru/user.json b/public/language/ru/user.json index a5906fc774..b04c04f9a4 100644 --- a/public/language/ru/user.json +++ b/public/language/ru/user.json @@ -33,6 +33,7 @@ "chat": "Чат", "chat_with": "Продолжить чат с %1", "new_chat_with": "Начать новый чат с %1", + "flag-profile": "Flag Profile", "follow": "Подписаться", "unfollow": "Отписаться", "more": "Больше", @@ -64,6 +65,8 @@ "remove_uploaded_picture": "Удалить фото", "upload_cover_picture": "Загрузить обложку профиля", "remove_cover_picture_confirm": "Вы уверены, что хотите удалить изображение обложки?", + "crop_picture": "Crop picture", + "upload_cropped_picture": "Crop and upload", "settings": "Настройки", "show_email": "Показывать мою элетронную почту", "show_fullname": "Показывать полное имя", diff --git a/public/language/rw/admin/advanced/errors.json b/public/language/rw/admin/advanced/errors.json index 963e68b116..546f0f1508 100644 --- a/public/language/rw/admin/advanced/errors.json +++ b/public/language/rw/admin/advanced/errors.json @@ -8,7 +8,7 @@ "clear-error-log": "Clear Error Log", "route": "Route", "count": "Count", - "no-routes-not-found": "Hooray! There are no routes that were not found.", + "no-routes-not-found": "Hooray! No 404 errors!", "clear404-confirm": "Are you sure you wish to clear the 404 error logs?", "clear404-success": "\"404 Not Found\" errors cleared" } \ No newline at end of file diff --git a/public/language/rw/admin/general/dashboard.json b/public/language/rw/admin/general/dashboard.json index b82802db1b..a70dda322e 100644 --- a/public/language/rw/admin/general/dashboard.json +++ b/public/language/rw/admin/general/dashboard.json @@ -2,6 +2,9 @@ "forum-traffic": "Forum Traffic", "page-views": "Page Views", "unique-visitors": "Unique Visitors", + "users": "Users", + "posts": "Posts", + "topics": "Topics", "page-views-last-month": "Page views Last Month", "page-views-this-month": "Page views This Month", "page-views-last-day": "Page views in last 24 hours", @@ -20,6 +23,11 @@ "prerelease-warning": "

This is a pre-release version of NodeBB. Unintended bugs may occur.

", "notices": "Notices", + "restart-not-required": "Restart not required", + "restart-required": "Restart required", + "search-plugin-installed": "Search Plugin installed", + "search-plugin-not-installed": "Search Plugin not installed", + "search-plugin-tooltip": "Install a search plugin from the plugin page in order to activate search functionality", "control-panel": "System Control", "reload": "Reload", @@ -52,4 +60,4 @@ "graphs.unique-visitors": "Unique Visitors", "graphs.registered-users": "Registered Users", "graphs.anonymous-users": "Anonymous Users" -} \ No newline at end of file +} diff --git a/public/language/rw/admin/menu.json b/public/language/rw/admin/menu.json index 6a4995ea6e..985c540e8a 100644 --- a/public/language/rw/admin/menu.json +++ b/public/language/rw/admin/menu.json @@ -13,7 +13,6 @@ "manage/users": "Users", "manage/registration": "Registration Queue", "manage/groups": "Groups", - "manage/flags": "Flags", "manage/ip-blacklist": "IP Blacklist", "section-settings": "Settings", diff --git a/public/language/rw/admin/settings/general.json b/public/language/rw/admin/settings/general.json index c26740ee4f..72ecfe641f 100644 --- a/public/language/rw/admin/settings/general.json +++ b/public/language/rw/admin/settings/general.json @@ -26,5 +26,6 @@ "touch-icon.upload": "Upload", "touch-icon.help": "Recommended size and format: 192x192, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.", "outgoing-links": "Outgoing Links", - "outgoing-links.warning-page": "Use Outgoing Links Warning Page" + "outgoing-links.warning-page": "Use Outgoing Links Warning Page", + "search-default-sort-by": "Search default sort by" } \ No newline at end of file diff --git a/public/language/rw/admin/settings/uploads.json b/public/language/rw/admin/settings/uploads.json index 8a56c85663..35eaa5a58f 100644 --- a/public/language/rw/admin/settings/uploads.json +++ b/public/language/rw/admin/settings/uploads.json @@ -9,7 +9,7 @@ "allow-topic-thumbnails": "Allow users to upload topic thumbnails", "topic-thumb-size": "Topic Thumb Size", "allowed-file-extensions": "Allowed File Extensions", - "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc).\n\t\t\t\t\tAn empty list means all extensions are allowed.", + "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc). An empty list means all extensions are allowed.", "profile-avatars": "Profile Avatars", "allow-profile-image-uploads": "Allow users to upload profile images", "convert-profile-image-png": "Convert profile image uploads to PNG", @@ -25,4 +25,4 @@ "profile-covers": "Profile Covers", "default-covers": "Default Cover Images", "default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image" -} \ No newline at end of file +} diff --git a/public/language/rw/notifications.json b/public/language/rw/notifications.json index 26e3343ad1..9bc91ae6e3 100644 --- a/public/language/rw/notifications.json +++ b/public/language/rw/notifications.json @@ -19,6 +19,9 @@ "user_flagged_post_in": "%1 yatambikanye ikintu muri %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 yanditse kuri: %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", diff --git a/public/language/rw/pages.json b/public/language/rw/pages.json index 1905438799..6b1fcdccca 100644 --- a/public/language/rw/pages.json +++ b/public/language/rw/pages.json @@ -6,7 +6,7 @@ "popular-month": "Ibiganiro bikunzwe uku kwezi", "popular-alltime": "Ibiganiro byakunzwe ibihe byose", "recent": "Ibiganiro Biheruka", - "flagged-posts": "Ibyatambikanywe", + "flagged-content": "Flagged Content", "ip-blacklist": "IP Blacklist", "users/online": "Abariho", "users/latest": "Abashya", @@ -27,6 +27,8 @@ "group": "Itsinda %1 ", "chats": "Mu Gikari", "chat": "Ukuganira na %1", + "flags": "Flags", + "flag-details": "Flag %1 Details", "account/edit": "Uguhindura \"%1\"", "account/edit/password": "Uguhindura ijambobanga rya \"%1\"", "account/edit/username": "Uguhindura izina rya \"%1\"", diff --git a/public/language/rw/search.json b/public/language/rw/search.json index 9fad703a37..bae0f8f6e7 100644 --- a/public/language/rw/search.json +++ b/public/language/rw/search.json @@ -12,6 +12,7 @@ "reply-count": "Umubare w'Ibisubizo", "at-least": "Ungana Nibura na", "at-most": "Utarengeje", + "relevance": "Relevance", "post-time": "Igihe Byashyiriweho", "newer-than": "Nyuma ya", "older-than": "Mbere ya", diff --git a/public/language/rw/topic.json b/public/language/rw/topic.json index fec915e355..b8d25791e2 100644 --- a/public/language/rw/topic.json +++ b/public/language/rw/topic.json @@ -13,7 +13,8 @@ "notify_me": "Uzajye umenyeshwa ibisubizo bishya kuri iki kiganiro", "quote": "Terura", "reply": "Subiza", - "replies_to_this_post": "Replies: %1", + "replies_to_this_post": "%1 Replies", + "last_reply_time": "Last reply", "reply-as-topic": "Bishyireho nk'ikiganiro", "guest-login-reply": "Injiramo maze usubize", "edit": "Hinduraho", @@ -25,28 +26,11 @@ "link": "Shyiraho Umurongo", "share": "Sangiza", "tools": "Ibikoresho", - "flag": "Tambikana", "locked": "Birafungiranye", "pinned": "Pinned", "moved": "Moved", "bookmark_instructions": "Click here to return to the last read post in this thread.", "flag_title": "Bimenyeshe ubuyobozi", - "flag_success": "Bimaze kumenyeshwa ubuyobozi ngo bikurikiranwe. ", - "flag_manage_title": "Flagged post in %1", - "flag_manage_history": "Action History", - "flag_manage_no_history": "No event history to report", - "flag_manage_assignee": "Assignee", - "flag_manage_state": "State", - "flag_manage_state_open": "New/Open", - "flag_manage_state_wip": "Work in Progress", - "flag_manage_state_resolved": "Resolved", - "flag_manage_state_rejected": "Rejected", - "flag_manage_notes": "Shared Notes", - "flag_manage_update": "Update Flag Status", - "flag_manage_history_assignee": "Assigned to %1", - "flag_manage_history_state": "Updated state to %1", - "flag_manage_history_notes": "Updated flag notes", - "flag_manage_saved": "Flag Details Updated", "deleted_message": "Iki kiganiro cyamaze gukurwaho. Abantu babifitiye uburenganzira ni bo bonyine bashobora kukibona. ", "following_topic.message": "Ntabwo uzongera kubimenyeshwa nihagira umuntu ugira icyo yandika kuri iki kiganiro. ", "not_following_topic.message": "You will see this topic in the unread topics list, but you will not receive notifications when somebody posts to this topic.", @@ -131,8 +115,5 @@ "stale.warning": "Ikiganiro ushaka kuvugaho cyarashaje. Wahitamo gutangiza ikiganiro gishya ariko wenda ukagaragaza kino mu gisubizo uza gushyiraho?", "stale.create": "Tangiza ikiganiro gishya", "stale.reply_anyway": "Vuga kuri iki kiganiro nubundi", - "link_back": "Igisubizo: [%1](%2)", - "spam": "Spam", - "offensive": "Ugukomeretsanya", - "custom-flag-reason": "Shyiramo impamvu yo gutambikana" + "link_back": "Igisubizo: [%1](%2)" } \ No newline at end of file diff --git a/public/language/rw/user.json b/public/language/rw/user.json index 868ab052c2..4c48fa09da 100644 --- a/public/language/rw/user.json +++ b/public/language/rw/user.json @@ -33,6 +33,7 @@ "chat": "Mu Gikari", "chat_with": "Continue chat with %1", "new_chat_with": "Start new chat with %1", + "flag-profile": "Flag Profile", "follow": "Kurikira", "unfollow": "Ntukurikire", "more": "Ibindi", @@ -64,6 +65,8 @@ "remove_uploaded_picture": "Kuraho Ifoto", "upload_cover_picture": "Pakira ifoto yo hejuru", "remove_cover_picture_confirm": "Are you sure you want to remove the cover picture?", + "crop_picture": "Crop picture", + "upload_cropped_picture": "Crop and upload", "settings": "Itunganya", "show_email": "Hagaragazwe Email Yanjye", "show_fullname": "Hagaragazwe Izina Ryuzuye Ryanjye", diff --git a/public/language/sc/admin/advanced/errors.json b/public/language/sc/admin/advanced/errors.json index 963e68b116..546f0f1508 100644 --- a/public/language/sc/admin/advanced/errors.json +++ b/public/language/sc/admin/advanced/errors.json @@ -8,7 +8,7 @@ "clear-error-log": "Clear Error Log", "route": "Route", "count": "Count", - "no-routes-not-found": "Hooray! There are no routes that were not found.", + "no-routes-not-found": "Hooray! No 404 errors!", "clear404-confirm": "Are you sure you wish to clear the 404 error logs?", "clear404-success": "\"404 Not Found\" errors cleared" } \ No newline at end of file diff --git a/public/language/sc/admin/general/dashboard.json b/public/language/sc/admin/general/dashboard.json index b82802db1b..a70dda322e 100644 --- a/public/language/sc/admin/general/dashboard.json +++ b/public/language/sc/admin/general/dashboard.json @@ -2,6 +2,9 @@ "forum-traffic": "Forum Traffic", "page-views": "Page Views", "unique-visitors": "Unique Visitors", + "users": "Users", + "posts": "Posts", + "topics": "Topics", "page-views-last-month": "Page views Last Month", "page-views-this-month": "Page views This Month", "page-views-last-day": "Page views in last 24 hours", @@ -20,6 +23,11 @@ "prerelease-warning": "

This is a pre-release version of NodeBB. Unintended bugs may occur.

", "notices": "Notices", + "restart-not-required": "Restart not required", + "restart-required": "Restart required", + "search-plugin-installed": "Search Plugin installed", + "search-plugin-not-installed": "Search Plugin not installed", + "search-plugin-tooltip": "Install a search plugin from the plugin page in order to activate search functionality", "control-panel": "System Control", "reload": "Reload", @@ -52,4 +60,4 @@ "graphs.unique-visitors": "Unique Visitors", "graphs.registered-users": "Registered Users", "graphs.anonymous-users": "Anonymous Users" -} \ No newline at end of file +} diff --git a/public/language/sc/admin/menu.json b/public/language/sc/admin/menu.json index 6a4995ea6e..985c540e8a 100644 --- a/public/language/sc/admin/menu.json +++ b/public/language/sc/admin/menu.json @@ -13,7 +13,6 @@ "manage/users": "Users", "manage/registration": "Registration Queue", "manage/groups": "Groups", - "manage/flags": "Flags", "manage/ip-blacklist": "IP Blacklist", "section-settings": "Settings", diff --git a/public/language/sc/admin/settings/general.json b/public/language/sc/admin/settings/general.json index c26740ee4f..72ecfe641f 100644 --- a/public/language/sc/admin/settings/general.json +++ b/public/language/sc/admin/settings/general.json @@ -26,5 +26,6 @@ "touch-icon.upload": "Upload", "touch-icon.help": "Recommended size and format: 192x192, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.", "outgoing-links": "Outgoing Links", - "outgoing-links.warning-page": "Use Outgoing Links Warning Page" + "outgoing-links.warning-page": "Use Outgoing Links Warning Page", + "search-default-sort-by": "Search default sort by" } \ No newline at end of file diff --git a/public/language/sc/admin/settings/uploads.json b/public/language/sc/admin/settings/uploads.json index 8a56c85663..35eaa5a58f 100644 --- a/public/language/sc/admin/settings/uploads.json +++ b/public/language/sc/admin/settings/uploads.json @@ -9,7 +9,7 @@ "allow-topic-thumbnails": "Allow users to upload topic thumbnails", "topic-thumb-size": "Topic Thumb Size", "allowed-file-extensions": "Allowed File Extensions", - "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc).\n\t\t\t\t\tAn empty list means all extensions are allowed.", + "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc). An empty list means all extensions are allowed.", "profile-avatars": "Profile Avatars", "allow-profile-image-uploads": "Allow users to upload profile images", "convert-profile-image-png": "Convert profile image uploads to PNG", @@ -25,4 +25,4 @@ "profile-covers": "Profile Covers", "default-covers": "Default Cover Images", "default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image" -} \ No newline at end of file +} diff --git a/public/language/sc/notifications.json b/public/language/sc/notifications.json index d92a4638cc..2629bb867b 100644 --- a/public/language/sc/notifications.json +++ b/public/language/sc/notifications.json @@ -19,6 +19,9 @@ "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", diff --git a/public/language/sc/pages.json b/public/language/sc/pages.json index 2602c1834f..25d7ccb5ce 100644 --- a/public/language/sc/pages.json +++ b/public/language/sc/pages.json @@ -6,7 +6,7 @@ "popular-month": "Popular topics this month", "popular-alltime": "All time popular topics", "recent": "Ùrtimas Arresonadas", - "flagged-posts": "Flagged Posts", + "flagged-content": "Flagged Content", "ip-blacklist": "IP Blacklist", "users/online": "Online Users", "users/latest": "Latest Users", @@ -27,6 +27,8 @@ "group": "%1 group", "chats": "Chats", "chat": "Chatting with %1", + "flags": "Flags", + "flag-details": "Flag %1 Details", "account/edit": "Editing \"%1\"", "account/edit/password": "Editing password of \"%1\"", "account/edit/username": "Editing username of \"%1\"", diff --git a/public/language/sc/search.json b/public/language/sc/search.json index 3ba6d73916..1f4d555f92 100644 --- a/public/language/sc/search.json +++ b/public/language/sc/search.json @@ -12,6 +12,7 @@ "reply-count": "Reply Count", "at-least": "At least", "at-most": "At most", + "relevance": "Relevance", "post-time": "Post time", "newer-than": "Newer than", "older-than": "Older than", diff --git a/public/language/sc/topic.json b/public/language/sc/topic.json index 07050c2c1c..9ce7552faa 100644 --- a/public/language/sc/topic.json +++ b/public/language/sc/topic.json @@ -13,7 +13,8 @@ "notify_me": "Imbia·mi notìficas pro is rispostas noas a custa arresonada", "quote": "Mèntova", "reply": "Risponde", - "replies_to_this_post": "Replies: %1", + "replies_to_this_post": "%1 Replies", + "last_reply_time": "Last reply", "reply-as-topic": "Reply as topic", "guest-login-reply": "Log in to reply", "edit": "Acontza", @@ -25,28 +26,11 @@ "link": "Acàpiu", "share": "Cumpartzi", "tools": "Ainas", - "flag": "Signala", "locked": "Locked", "pinned": "Pinned", "moved": "Moved", "bookmark_instructions": "Click here to return to the last read post in this thread.", "flag_title": "Signala custu arresonu pro sa moderatzione", - "flag_success": "This post has been flagged for moderation.", - "flag_manage_title": "Flagged post in %1", - "flag_manage_history": "Action History", - "flag_manage_no_history": "No event history to report", - "flag_manage_assignee": "Assignee", - "flag_manage_state": "State", - "flag_manage_state_open": "New/Open", - "flag_manage_state_wip": "Work in Progress", - "flag_manage_state_resolved": "Resolved", - "flag_manage_state_rejected": "Rejected", - "flag_manage_notes": "Shared Notes", - "flag_manage_update": "Update Flag Status", - "flag_manage_history_assignee": "Assigned to %1", - "flag_manage_history_state": "Updated state to %1", - "flag_manage_history_notes": "Updated flag notes", - "flag_manage_saved": "Flag Details Updated", "deleted_message": "This topic has been deleted. Only users with topic management privileges can see it.", "following_topic.message": "As a retzire notìficas si calincunu pùblica in custa arresonada.", "not_following_topic.message": "You will see this topic in the unread topics list, but you will not receive notifications when somebody posts to this topic.", @@ -131,8 +115,5 @@ "stale.warning": "The topic you are replying to is quite old. Would you like to create a new topic instead, and reference this one in your reply?", "stale.create": "Create a new topic", "stale.reply_anyway": "Reply to this topic anyway", - "link_back": "Re: [%1](%2)", - "spam": "Spam", - "offensive": "Offensive", - "custom-flag-reason": "Enter a flagging reason" + "link_back": "Re: [%1](%2)" } \ No newline at end of file diff --git a/public/language/sc/user.json b/public/language/sc/user.json index b30a2a031f..1a26d84fc2 100644 --- a/public/language/sc/user.json +++ b/public/language/sc/user.json @@ -33,6 +33,7 @@ "chat": "Tzarra", "chat_with": "Continue chat with %1", "new_chat_with": "Start new chat with %1", + "flag-profile": "Flag Profile", "follow": "Sighi", "unfollow": "Non sighes prus", "more": "More", @@ -64,6 +65,8 @@ "remove_uploaded_picture": "Remove Uploaded Picture", "upload_cover_picture": "Upload cover picture", "remove_cover_picture_confirm": "Are you sure you want to remove the cover picture?", + "crop_picture": "Crop picture", + "upload_cropped_picture": "Crop and upload", "settings": "Sèberos", "show_email": "Ammustra s'Email Mia", "show_fullname": "Show My Full Name", diff --git a/public/language/sk/admin/advanced/cache.json b/public/language/sk/admin/advanced/cache.json index e06dae19cb..2334b1f250 100644 --- a/public/language/sk/admin/advanced/cache.json +++ b/public/language/sk/admin/advanced/cache.json @@ -1,11 +1,11 @@ { - "post-cache": "Pamäť príspevku", - "posts-in-cache": "Príspevky v pamäti", + "post-cache": "Vyrovnávacia pamäť príspevku", + "posts-in-cache": "Príspevky vo vyrovnávacej pamäti", "average-post-size": "Priemerná veľkosť príspevku", "length-to-max": "Dĺžka / Maximum", "percent-full": "%1% plné", - "post-cache-size": "Veľkosť pamäti príspevku", - "items-in-cache": "Položky v pamäti", + "post-cache-size": "Veľkosť vyrovnávacej pamäti príspevku", + "items-in-cache": "Položky vo vyrovnávacej pamäti", "control-panel": "Ovládací panel", - "update-settings": "Aktualizovať nastavenia pamäti" + "update-settings": "Aktualizovať nastavenia vyrovnávacej pamäti" } \ No newline at end of file diff --git a/public/language/sk/admin/advanced/errors.json b/public/language/sk/admin/advanced/errors.json index b0cd9179da..02a4a0c461 100644 --- a/public/language/sk/admin/advanced/errors.json +++ b/public/language/sk/admin/advanced/errors.json @@ -1,14 +1,14 @@ { "figure-x": "Znázorniť %1", "error-events-per-day": "%1 events per day", - "error.404": "404 Not Found", - "error.503": "503 Service Unavailable", + "error.404": "404 Nenájdené", + "error.503": "503 Služba nie je k dispozícií", "manage-error-log": "Manage Error Log", "export-error-log": "Export Error Log (CSV)", "clear-error-log": "Clear Error Log", "route": "Route", "count": "Count", - "no-routes-not-found": "Hooray! There are no routes that were not found.", + "no-routes-not-found": "Hurá! Žiadne chyby 404!", "clear404-confirm": "Are you sure you wish to clear the 404 error logs?", - "clear404-success": "\"404 Not Found\" errors cleared" + "clear404-success": "Chybné hlásenia \"404 Nenájdené\" vyčistené" } \ No newline at end of file diff --git a/public/language/sk/admin/advanced/events.json b/public/language/sk/admin/advanced/events.json index cce4546e34..ef963e4ce2 100644 --- a/public/language/sk/admin/advanced/events.json +++ b/public/language/sk/admin/advanced/events.json @@ -1,6 +1,6 @@ { "events": "Udalosti", - "no-events": "There are no events", - "control-panel": "Events Control Panel", - "delete-events": "Delete Events" + "no-events": "Zatiaľ neexistujô žiadne udalosti", + "control-panel": "Ovládací panel udalostí", + "delete-events": "Odstrániť udalosť" } \ No newline at end of file diff --git a/public/language/sk/admin/advanced/logs.json b/public/language/sk/admin/advanced/logs.json index 0dd71a3f30..1c30f4dca7 100644 --- a/public/language/sk/admin/advanced/logs.json +++ b/public/language/sk/admin/advanced/logs.json @@ -1,7 +1,7 @@ { - "logs": "Protokoly", - "control-panel": "Logs Control Panel", - "reload": "Reload Logs", - "clear": "Clear Logs", - "clear-success": "Logs Cleared!" + "logs": "Záznamy", + "control-panel": "Ovládací panel záznamov", + "reload": "Znovu načítať záznamy", + "clear": "Vyčistiť záznamy", + "clear-success": "Záznamy vyčistené!" } \ No newline at end of file diff --git a/public/language/sk/admin/appearance/skins.json b/public/language/sk/admin/appearance/skins.json index 4db6fbdd8a..f7440bfa8e 100644 --- a/public/language/sk/admin/appearance/skins.json +++ b/public/language/sk/admin/appearance/skins.json @@ -1,9 +1,9 @@ { - "loading": "Loading Skins...", - "homepage": "Homepage", - "select-skin": "Select Skin", - "current-skin": "Current Skin", - "skin-updated": "Skin Updated", - "applied-success": "%1 skin was succesfully applied", - "revert-success": "Skin reverted to base colours" + "loading": "Načítať vzhľady...", + "homepage": "Domovska stránka", + "select-skin": "Vybrať vzhľad", + "current-skin": "Aktuálny vzhľad", + "skin-updated": "Vzhľad aktualizovaný", + "applied-success": "%1 vzhľad bol úspešne aplikovaný", + "revert-success": "Vzhľad bol obnovený do základných farieb" } \ No newline at end of file diff --git a/public/language/sk/admin/appearance/themes.json b/public/language/sk/admin/appearance/themes.json index 3148a01337..34dca8603e 100644 --- a/public/language/sk/admin/appearance/themes.json +++ b/public/language/sk/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": "Kontrola nainštalovaných motívov...", + "homepage": "Domovská stránka", + "select-theme": "Vybrať motív", + "current-theme": "Aktuálny motív", + "no-themes": "Žiadne nainštalované motívy neboli nájdené", + "revert-confirm": "Ste si istý, že chcete obnoviť predvolený NodeBB motív?", + "theme-changed": "Motív zmenený", + "revert-success": "Úspešne sa Vám podarilo obnoviť Váš NodeBB do predvoleného motívu.", + "restart-to-activate": "Prosím, reštartujte Váš NodeBB pre úplne aktivovanie tohto motívu." } \ No newline at end of file diff --git a/public/language/sk/admin/general/dashboard.json b/public/language/sk/admin/general/dashboard.json index b82802db1b..12a34ba046 100644 --- a/public/language/sk/admin/general/dashboard.json +++ b/public/language/sk/admin/general/dashboard.json @@ -1,17 +1,20 @@ { - "forum-traffic": "Forum Traffic", - "page-views": "Page Views", - "unique-visitors": "Unique Visitors", - "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", + "forum-traffic": "Prevádzka fóra", + "page-views": "Zobrazenia stránok", + "unique-visitors": "Unikátne návštevy", + "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", - "stats.day": "Day", - "stats.week": "Week", - "stats.month": "Month", - "stats.all": "All Time", + "stats.day": "Deň", + "stats.week": "Týždeň", + "stats.month": "Mesiac", + "stats.all": "Celé obdobie", - "updates": "Updates", + "updates": "Aktualizácie", "running-version": "You are running NodeBB v%1.", "keep-updated": "Always make sure that your NodeBB is up to date for the latest security patches and bug fixes.", "up-to-date": "

You are up-to-date

", @@ -19,37 +22,42 @@ "prerelease-upgrade-available": "

This is an outdated pre-release version of NodeBB. A new version (v%1) has been released. Consider upgrading your NodeBB.

", "prerelease-warning": "

This is a pre-release version of NodeBB. Unintended bugs may occur.

", - "notices": "Notices", + "notices": "Upozornenie", + "restart-not-required": "Reštart nie je potrebný", + "restart-required": "Reštart je potrebný", + "search-plugin-installed": "Vyhľadávací doplnok bol nainštalovaný", + "search-plugin-not-installed": "Vyhľadávací doplnok nebol nainštalovaný", + "search-plugin-tooltip": "Install a search plugin from the plugin page in order to activate search functionality", "control-panel": "System Control", - "reload": "Reload", - "restart": "Restart", + "reload": "Obnoviť", + "restart": "Reštartovať", "restart-warning": "Reloading or Restarting your NodeBB will drop all existing connections for a few seconds.", "maintenance-mode": "Maintenance Mode", "maintenance-mode-title": "Click here to set up maintenance mode for NodeBB", "realtime-chart-updates": "Realtime Chart Updates", - "active-users": "Active Users", - "active-users.users": "Users", - "active-users.guests": "Guests", - "active-users.total": "Total", - "active-users.connections": "Connections", + "active-users": "Aktívny užívatelia", + "active-users.users": "Užívatelia", + "active-users.guests": "Hostia", + "active-users.total": "Celkovo", + "active-users.connections": "Pripojení", - "anonymous-registered-users": "Anonymous vs Registered Users", - "anonymous": "Anonymous", - "registered": "Registered", + "anonymous-registered-users": "Neznámy vs Zaregistrovaný užívatelia", + "anonymous": "Neznámy", + "registered": "Zaregistrovaný", "user-presence": "User Presence", "on-categories": "On categories list", "reading-posts": "Reading posts", "browsing-topics": "Browsing topics", - "recent": "Recent", - "unread": "Unread", + "recent": "Nedávne", + "unread": "Neprečitané", "high-presence-topics": "High Presence Topics", - "graphs.page-views": "Page Views", - "graphs.unique-visitors": "Unique Visitors", - "graphs.registered-users": "Registered Users", - "graphs.anonymous-users": "Anonymous Users" -} \ No newline at end of file + "graphs.page-views": "Zobrazenia stránok", + "graphs.unique-visitors": "Unikátny navštevníci", + "graphs.registered-users": "Zarestrovaný užívatelia", + "graphs.anonymous-users": "Neznámy užívatelia" +} diff --git a/public/language/sk/admin/manage/tags.json b/public/language/sk/admin/manage/tags.json index db40e9f098..775a9aed63 100644 --- a/public/language/sk/admin/manage/tags.json +++ b/public/language/sk/admin/manage/tags.json @@ -6,7 +6,7 @@ "description": "Select tags via clicking and/or dragging, use shift to select multiple.", "create": "Create Tag", "modify": "Modify Tags", - "delete": "Delete Selected Tags", + "delete": "Odstrániť vybraté značky", "search": "Search for tags...", "settings": "Click here to visit the tag settings page.", "name": "Tag Name", diff --git a/public/language/sk/admin/menu.json b/public/language/sk/admin/menu.json index 35f5088443..0a1c30b63c 100644 --- a/public/language/sk/admin/menu.json +++ b/public/language/sk/admin/menu.json @@ -13,7 +13,6 @@ "manage/users": "Users", "manage/registration": "Registration Queue", "manage/groups": "Groups", - "manage/flags": "Flags", "manage/ip-blacklist": "IP Blacklist", "section-settings": "Settings", diff --git a/public/language/sk/admin/settings/general.json b/public/language/sk/admin/settings/general.json index c26740ee4f..72ecfe641f 100644 --- a/public/language/sk/admin/settings/general.json +++ b/public/language/sk/admin/settings/general.json @@ -26,5 +26,6 @@ "touch-icon.upload": "Upload", "touch-icon.help": "Recommended size and format: 192x192, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.", "outgoing-links": "Outgoing Links", - "outgoing-links.warning-page": "Use Outgoing Links Warning Page" + "outgoing-links.warning-page": "Use Outgoing Links Warning Page", + "search-default-sort-by": "Search default sort by" } \ No newline at end of file diff --git a/public/language/sk/admin/settings/uploads.json b/public/language/sk/admin/settings/uploads.json index 8a56c85663..35eaa5a58f 100644 --- a/public/language/sk/admin/settings/uploads.json +++ b/public/language/sk/admin/settings/uploads.json @@ -9,7 +9,7 @@ "allow-topic-thumbnails": "Allow users to upload topic thumbnails", "topic-thumb-size": "Topic Thumb Size", "allowed-file-extensions": "Allowed File Extensions", - "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc).\n\t\t\t\t\tAn empty list means all extensions are allowed.", + "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc). An empty list means all extensions are allowed.", "profile-avatars": "Profile Avatars", "allow-profile-image-uploads": "Allow users to upload profile images", "convert-profile-image-png": "Convert profile image uploads to PNG", @@ -25,4 +25,4 @@ "profile-covers": "Profile Covers", "default-covers": "Default Cover Images", "default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image" -} \ No newline at end of file +} diff --git a/public/language/sk/notifications.json b/public/language/sk/notifications.json index 0b5ad76572..01d1bcc90f 100644 --- a/public/language/sk/notifications.json +++ b/public/language/sk/notifications.json @@ -19,6 +19,9 @@ "user_flagged_post_in": "%1 pridal značku na príspevok %2", "user_flagged_post_in_dual": "%1 a %2 pridali značky na príspevok %3", "user_flagged_post_in_multiple": "%1 a %2 ďalší pridali značku na príspevok:%3", + "user_flagged_user": "%1 označil profil používateľa (%2)", + "user_flagged_user_dual": "%1 a %2 označil profil používateľa (%3)", + "user_flagged_user_multiple": "%1 a %2 ďalší označili profil používateľa (%3)", "user_posted_to": "%1 odpovedal: %2", "user_posted_to_dual": "%1 a %2 uverejnili odpoveď na:%3", "user_posted_to_multiple": "%1 a %2 ďalší uverejnili odpovede na:%3", diff --git a/public/language/sk/pages.json b/public/language/sk/pages.json index 095ee00be2..c022b4fab2 100644 --- a/public/language/sk/pages.json +++ b/public/language/sk/pages.json @@ -6,7 +6,7 @@ "popular-month": "Populárne témy za tento mesiac", "popular-alltime": "Populárne témy za celé obdobie", "recent": "Nedávne témy", - "flagged-posts": "Označené príspevky", + "flagged-content": "Označený obsah", "ip-blacklist": "IP Blacklist", "users/online": "Online užívatelia", "users/latest": "Najnovší užívatelia", @@ -27,6 +27,8 @@ "group": "%1 skupina", "chats": "Konverzácie", "chat": "Rozprávate sa s %1", + "flags": "Značky", + "flag-details": "Detaily značky %1", "account/edit": "Úprava \"%1\"", "account/edit/password": "Úprava hesla \"%1\"", "account/edit/username": "Úprava užívateľského mena \"%1\"", diff --git a/public/language/sk/search.json b/public/language/sk/search.json index 1142a435de..0592755c2f 100644 --- a/public/language/sk/search.json +++ b/public/language/sk/search.json @@ -12,6 +12,7 @@ "reply-count": "Počet odpovedí", "at-least": "Najmenej", "at-most": "Najviac", + "relevance": "Dôležitosti", "post-time": "Čas publikovania", "newer-than": "Novšie ako", "older-than": "Staršie ako", diff --git a/public/language/sk/topic.json b/public/language/sk/topic.json index 28cbb130c1..e10b2f7afa 100644 --- a/public/language/sk/topic.json +++ b/public/language/sk/topic.json @@ -13,7 +13,8 @@ "notify_me": "Byť informovaný o nových príspevkov v tejto téme", "quote": "Citovať", "reply": "Odpovedať", - "replies_to_this_post": "Odpovede: %1", + "replies_to_this_post": "%1 Odpovedí", + "last_reply_time": "Posledná odpoveď", "reply-as-topic": "Odpovedať ako téma", "guest-login-reply": "Pre odpoveď sa najprv prihláste", "edit": "Upraviť", @@ -25,28 +26,11 @@ "link": "Odkaz", "share": "Zdieľaj", "tools": "Nástroje", - "flag": "Označiť", "locked": "Uzamknuté", "pinned": "Pripnuté", "moved": "Presunuté", "bookmark_instructions": "Kliknite sem pre návrat k poslednému prečítanému príspevku vo vlákne.", "flag_title": "Označiť príspevok pre zmiernenie", - "flag_success": "Tento príspevok bol označený na zmiernenie.", - "flag_manage_title": "Označený príspevok v %1", - "flag_manage_history": "História činností", - "flag_manage_no_history": "Žiadne história udalosti k nahláseniu", - "flag_manage_assignee": "Nástupca", - "flag_manage_state": "Vyhlásiť", - "flag_manage_state_open": "Nový/Otvoriť", - "flag_manage_state_wip": "Prebiehajú práce", - "flag_manage_state_resolved": "Vyriešené", - "flag_manage_state_rejected": "Odmietnuté", - "flag_manage_notes": "Zdieľané poznámky", - "flag_manage_update": "Aktualizovať stav značky", - "flag_manage_history_assignee": "Priradené k %1", - "flag_manage_history_state": "Aktualizovaná stáť pre %1", - "flag_manage_history_notes": "Značka poznámok aktualizovaná", - "flag_manage_saved": "Podrobnosti značky aktualizované", "deleted_message": "Táto téma bola odstránená. Iba užívatelia s výsadami správcu ju môžu vidieť.", "following_topic.message": "Odteraz budete prijímať oznámenia, keď niekto prispeje do tejto témy.", "not_following_topic.message": "Uvidíte túto tému v zozname neprečítaných tém, ale nebudete dostávať oznámenia, keď niekto pridá príspevok do tejto témy.", @@ -131,8 +115,5 @@ "stale.warning": "Téma na ktorú odpovedáte je pomerne stará. Chceli by ste vytvoriť novú tému namiesto tejto, a odkazovať na ňu vo Vašej odpovedi?", "stale.create": "Vytvoriť novú tému", "stale.reply_anyway": "Napriek tomu odpovedať na túto tému", - "link_back": "Re: [%1](%2)", - "spam": "Nevyžiadaná pošta", - "offensive": "Hnutie", - "custom-flag-reason": "Zadajte dôvod pre označenie" + "link_back": "Re: [%1](%2)" } \ No newline at end of file diff --git a/public/language/sk/user.json b/public/language/sk/user.json index c54901b60a..893e4a2802 100644 --- a/public/language/sk/user.json +++ b/public/language/sk/user.json @@ -33,6 +33,7 @@ "chat": "Konverzácia", "chat_with": "Konverzácia s %1", "new_chat_with": "Začať novú konverzáciu s %1", + "flag-profile": "Označiť profil", "follow": "Nasledovať", "unfollow": "Prestať sledovať", "more": "Viac", @@ -64,6 +65,8 @@ "remove_uploaded_picture": "Vymazať nahraný obrázok", "upload_cover_picture": "Nahrať titulný obrázok", "remove_cover_picture_confirm": "Ste si naozaj istý, že chcete odstrániť titulný obrázok?", + "crop_picture": "Orezať obrázok", + "upload_cropped_picture": "Orezať a nahrať", "settings": "Nastavenia", "show_email": "Zobrazovať môj e-mail", "show_fullname": "Zobrazovať moje skutočné meno", diff --git a/public/language/sl/admin/advanced/errors.json b/public/language/sl/admin/advanced/errors.json index 963e68b116..546f0f1508 100644 --- a/public/language/sl/admin/advanced/errors.json +++ b/public/language/sl/admin/advanced/errors.json @@ -8,7 +8,7 @@ "clear-error-log": "Clear Error Log", "route": "Route", "count": "Count", - "no-routes-not-found": "Hooray! There are no routes that were not found.", + "no-routes-not-found": "Hooray! No 404 errors!", "clear404-confirm": "Are you sure you wish to clear the 404 error logs?", "clear404-success": "\"404 Not Found\" errors cleared" } \ No newline at end of file diff --git a/public/language/sl/admin/general/dashboard.json b/public/language/sl/admin/general/dashboard.json index b82802db1b..a70dda322e 100644 --- a/public/language/sl/admin/general/dashboard.json +++ b/public/language/sl/admin/general/dashboard.json @@ -2,6 +2,9 @@ "forum-traffic": "Forum Traffic", "page-views": "Page Views", "unique-visitors": "Unique Visitors", + "users": "Users", + "posts": "Posts", + "topics": "Topics", "page-views-last-month": "Page views Last Month", "page-views-this-month": "Page views This Month", "page-views-last-day": "Page views in last 24 hours", @@ -20,6 +23,11 @@ "prerelease-warning": "

This is a pre-release version of NodeBB. Unintended bugs may occur.

", "notices": "Notices", + "restart-not-required": "Restart not required", + "restart-required": "Restart required", + "search-plugin-installed": "Search Plugin installed", + "search-plugin-not-installed": "Search Plugin not installed", + "search-plugin-tooltip": "Install a search plugin from the plugin page in order to activate search functionality", "control-panel": "System Control", "reload": "Reload", @@ -52,4 +60,4 @@ "graphs.unique-visitors": "Unique Visitors", "graphs.registered-users": "Registered Users", "graphs.anonymous-users": "Anonymous Users" -} \ No newline at end of file +} diff --git a/public/language/sl/admin/menu.json b/public/language/sl/admin/menu.json index 6a4995ea6e..985c540e8a 100644 --- a/public/language/sl/admin/menu.json +++ b/public/language/sl/admin/menu.json @@ -13,7 +13,6 @@ "manage/users": "Users", "manage/registration": "Registration Queue", "manage/groups": "Groups", - "manage/flags": "Flags", "manage/ip-blacklist": "IP Blacklist", "section-settings": "Settings", diff --git a/public/language/sl/admin/settings/general.json b/public/language/sl/admin/settings/general.json index c26740ee4f..72ecfe641f 100644 --- a/public/language/sl/admin/settings/general.json +++ b/public/language/sl/admin/settings/general.json @@ -26,5 +26,6 @@ "touch-icon.upload": "Upload", "touch-icon.help": "Recommended size and format: 192x192, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.", "outgoing-links": "Outgoing Links", - "outgoing-links.warning-page": "Use Outgoing Links Warning Page" + "outgoing-links.warning-page": "Use Outgoing Links Warning Page", + "search-default-sort-by": "Search default sort by" } \ No newline at end of file diff --git a/public/language/sl/admin/settings/uploads.json b/public/language/sl/admin/settings/uploads.json index 8a56c85663..35eaa5a58f 100644 --- a/public/language/sl/admin/settings/uploads.json +++ b/public/language/sl/admin/settings/uploads.json @@ -9,7 +9,7 @@ "allow-topic-thumbnails": "Allow users to upload topic thumbnails", "topic-thumb-size": "Topic Thumb Size", "allowed-file-extensions": "Allowed File Extensions", - "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc).\n\t\t\t\t\tAn empty list means all extensions are allowed.", + "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc). An empty list means all extensions are allowed.", "profile-avatars": "Profile Avatars", "allow-profile-image-uploads": "Allow users to upload profile images", "convert-profile-image-png": "Convert profile image uploads to PNG", @@ -25,4 +25,4 @@ "profile-covers": "Profile Covers", "default-covers": "Default Cover Images", "default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image" -} \ No newline at end of file +} diff --git a/public/language/sl/notifications.json b/public/language/sl/notifications.json index 5986a2115a..cf3bc5601c 100644 --- a/public/language/sl/notifications.json +++ b/public/language/sl/notifications.json @@ -19,6 +19,9 @@ "user_flagged_post_in": "%1je označil/-a vašo objavo v %2.", "user_flagged_post_in_dual": "%1 in %2 sta označila/-a vašo objavo v %3.", "user_flagged_post_in_multiple": "%1 and %2 drugih je označilo vašo objavo v %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 je objavil/-a odgovor na: %2.", "user_posted_to_dual": "%1 in %2 sta objavila/-i odgovor na: %3.", "user_posted_to_multiple": "%1 in %2 drugih je objavilo odgovor na: %3.", diff --git a/public/language/sl/pages.json b/public/language/sl/pages.json index 9970c374cd..88cd0f8afc 100644 --- a/public/language/sl/pages.json +++ b/public/language/sl/pages.json @@ -6,7 +6,7 @@ "popular-month": "Priljubljene teme v tem mesecu", "popular-alltime": "Vse priljubljene teme", "recent": "Zadnje teme", - "flagged-posts": "Označene teme", + "flagged-content": "Flagged Content", "ip-blacklist": "IP Blacklist", "users/online": "Dosegljivi uporabniki", "users/latest": "Zadnji uporabniki", @@ -27,6 +27,8 @@ "group": "Skupina %1", "chats": "Klepeti", "chat": "Klepet z osebo %1", + "flags": "Flags", + "flag-details": "Flag %1 Details", "account/edit": "Urejanje \"%1\"", "account/edit/password": "Urejanje gesla za \"%1\"", "account/edit/username": "Urejanje uporabniškega imena za \"%1\"", diff --git a/public/language/sl/search.json b/public/language/sl/search.json index 8ad34d20d6..30c806eba6 100644 --- a/public/language/sl/search.json +++ b/public/language/sl/search.json @@ -12,6 +12,7 @@ "reply-count": "Število odgovorov", "at-least": "Vsaj", "at-most": "Največ", + "relevance": "Relevance", "post-time": "Čas objave", "newer-than": "Novejše kot", "older-than": "Starejše kot", diff --git a/public/language/sl/topic.json b/public/language/sl/topic.json index 2714c29b67..11fc2e87c6 100644 --- a/public/language/sl/topic.json +++ b/public/language/sl/topic.json @@ -13,7 +13,8 @@ "notify_me": "Bodi obveščen o novih odgovorih na to temo", "quote": "Citiraj", "reply": "Odgovori", - "replies_to_this_post": "Replies: %1", + "replies_to_this_post": "%1 Replies", + "last_reply_time": "Last reply", "reply-as-topic": "Odgovori s temo", "guest-login-reply": "Prijavi se za odgovor", "edit": "Uredi", @@ -25,28 +26,11 @@ "link": "Povezava", "share": "Deli", "tools": "Orodja", - "flag": "Označi", "locked": "Zaklenjeno", "pinned": "Pripeto", "moved": "Premaknjeno", "bookmark_instructions": "Klikni tukaj za vrnitev na zadnje prebrano objavo v tej niti", "flag_title": "Označi to objavo za vodenje", - "flag_success": "Ta objava je bila označena za vodenje.", - "flag_manage_title": "Flagged post in %1", - "flag_manage_history": "Action History", - "flag_manage_no_history": "No event history to report", - "flag_manage_assignee": "Assignee", - "flag_manage_state": "State", - "flag_manage_state_open": "New/Open", - "flag_manage_state_wip": "Work in Progress", - "flag_manage_state_resolved": "Resolved", - "flag_manage_state_rejected": "Rejected", - "flag_manage_notes": "Shared Notes", - "flag_manage_update": "Update Flag Status", - "flag_manage_history_assignee": "Assigned to %1", - "flag_manage_history_state": "Updated state to %1", - "flag_manage_history_notes": "Updated flag notes", - "flag_manage_saved": "Flag Details Updated", "deleted_message": "Ta tema je bila izbrisana. Le uporabniki s pravicami upravljanja tem jo lahko vidijo.", "following_topic.message": "Če nekdo objavi v to temo, boste od sedaj dobivali obvestila. ", "not_following_topic.message": "To temo boste videli v seznamu neprebranih tem. Ne boste pa dobili obvestila, če bo nekdo objavil v tej temi. ", @@ -131,8 +115,5 @@ "stale.warning": "Tema na katero odgovarjaš je precej stara. A ne bi raje ustvaril novo temo namesto te, z sklicem na to v tvojem odgovoru?", "stale.create": "Ustvari novo temo", "stale.reply_anyway": "Vseeno odgovori na to temo", - "link_back": "Odg: [%1](%2)", - "spam": "Neželeno", - "offensive": "Žaljivo", - "custom-flag-reason": "Vstavi vzrok označevanja" + "link_back": "Odg: [%1](%2)" } \ No newline at end of file diff --git a/public/language/sl/user.json b/public/language/sl/user.json index 5d6ae2a9d7..5905feb481 100644 --- a/public/language/sl/user.json +++ b/public/language/sl/user.json @@ -33,6 +33,7 @@ "chat": "Klepet", "chat_with": "Continue chat with %1", "new_chat_with": "Start new chat with %1", + "flag-profile": "Flag Profile", "follow": "Spremljaj", "unfollow": "Ne spremljaj", "more": "Več", @@ -64,6 +65,8 @@ "remove_uploaded_picture": "Odstrani preneseno sliko ", "upload_cover_picture": "Prenesi fotografijo naslovnice", "remove_cover_picture_confirm": "Are you sure you want to remove the cover picture?", + "crop_picture": "Crop picture", + "upload_cropped_picture": "Crop and upload", "settings": "Nastavitve", "show_email": "Pokaži moj e-poštni naslov.", "show_fullname": "Pokaži moj ime in priimek.", diff --git a/public/language/sr/admin/advanced/errors.json b/public/language/sr/admin/advanced/errors.json index 963e68b116..546f0f1508 100644 --- a/public/language/sr/admin/advanced/errors.json +++ b/public/language/sr/admin/advanced/errors.json @@ -8,7 +8,7 @@ "clear-error-log": "Clear Error Log", "route": "Route", "count": "Count", - "no-routes-not-found": "Hooray! There are no routes that were not found.", + "no-routes-not-found": "Hooray! No 404 errors!", "clear404-confirm": "Are you sure you wish to clear the 404 error logs?", "clear404-success": "\"404 Not Found\" errors cleared" } \ No newline at end of file diff --git a/public/language/sr/admin/general/dashboard.json b/public/language/sr/admin/general/dashboard.json index b82802db1b..a70dda322e 100644 --- a/public/language/sr/admin/general/dashboard.json +++ b/public/language/sr/admin/general/dashboard.json @@ -2,6 +2,9 @@ "forum-traffic": "Forum Traffic", "page-views": "Page Views", "unique-visitors": "Unique Visitors", + "users": "Users", + "posts": "Posts", + "topics": "Topics", "page-views-last-month": "Page views Last Month", "page-views-this-month": "Page views This Month", "page-views-last-day": "Page views in last 24 hours", @@ -20,6 +23,11 @@ "prerelease-warning": "

This is a pre-release version of NodeBB. Unintended bugs may occur.

", "notices": "Notices", + "restart-not-required": "Restart not required", + "restart-required": "Restart required", + "search-plugin-installed": "Search Plugin installed", + "search-plugin-not-installed": "Search Plugin not installed", + "search-plugin-tooltip": "Install a search plugin from the plugin page in order to activate search functionality", "control-panel": "System Control", "reload": "Reload", @@ -52,4 +60,4 @@ "graphs.unique-visitors": "Unique Visitors", "graphs.registered-users": "Registered Users", "graphs.anonymous-users": "Anonymous Users" -} \ No newline at end of file +} diff --git a/public/language/sr/admin/menu.json b/public/language/sr/admin/menu.json index 6a4995ea6e..985c540e8a 100644 --- a/public/language/sr/admin/menu.json +++ b/public/language/sr/admin/menu.json @@ -13,7 +13,6 @@ "manage/users": "Users", "manage/registration": "Registration Queue", "manage/groups": "Groups", - "manage/flags": "Flags", "manage/ip-blacklist": "IP Blacklist", "section-settings": "Settings", diff --git a/public/language/sr/admin/settings/general.json b/public/language/sr/admin/settings/general.json index c26740ee4f..72ecfe641f 100644 --- a/public/language/sr/admin/settings/general.json +++ b/public/language/sr/admin/settings/general.json @@ -26,5 +26,6 @@ "touch-icon.upload": "Upload", "touch-icon.help": "Recommended size and format: 192x192, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.", "outgoing-links": "Outgoing Links", - "outgoing-links.warning-page": "Use Outgoing Links Warning Page" + "outgoing-links.warning-page": "Use Outgoing Links Warning Page", + "search-default-sort-by": "Search default sort by" } \ No newline at end of file diff --git a/public/language/sr/admin/settings/uploads.json b/public/language/sr/admin/settings/uploads.json index 8a56c85663..35eaa5a58f 100644 --- a/public/language/sr/admin/settings/uploads.json +++ b/public/language/sr/admin/settings/uploads.json @@ -9,7 +9,7 @@ "allow-topic-thumbnails": "Allow users to upload topic thumbnails", "topic-thumb-size": "Topic Thumb Size", "allowed-file-extensions": "Allowed File Extensions", - "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc).\n\t\t\t\t\tAn empty list means all extensions are allowed.", + "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc). An empty list means all extensions are allowed.", "profile-avatars": "Profile Avatars", "allow-profile-image-uploads": "Allow users to upload profile images", "convert-profile-image-png": "Convert profile image uploads to PNG", @@ -25,4 +25,4 @@ "profile-covers": "Profile Covers", "default-covers": "Default Cover Images", "default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image" -} \ No newline at end of file +} diff --git a/public/language/sr/modules.json b/public/language/sr/modules.json index f348e7059b..2c4b9cb728 100644 --- a/public/language/sr/modules.json +++ b/public/language/sr/modules.json @@ -11,7 +11,7 @@ "chat.no-users-in-room": "Нема корисника у овој соби", "chat.recent-chats": "Недавна ћаскања", "chat.contacts": "Контакти", - "chat.message-history": "Историјат порука", + "chat.message-history": "Историја порука", "chat.pop-out": "Истакни ћаскање", "chat.minimize": "Умањи", "chat.maximize": "Увећај", diff --git a/public/language/sr/notifications.json b/public/language/sr/notifications.json index 3b41edb510..9af1e5a1ba 100644 --- a/public/language/sr/notifications.json +++ b/public/language/sr/notifications.json @@ -19,6 +19,9 @@ "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", diff --git a/public/language/sr/pages.json b/public/language/sr/pages.json index 24fafe64ba..198d7045ed 100644 --- a/public/language/sr/pages.json +++ b/public/language/sr/pages.json @@ -6,7 +6,7 @@ "popular-month": "Популарне теме овог месеца", "popular-alltime": "Популарне теме свих времена", "recent": "Недавне теме", - "flagged-posts": "Означене поруке", + "flagged-content": "Садржај означен заставицом", "ip-blacklist": "Црна листа IP адреса", "users/online": "Корисници на мрежи", "users/latest": "Најновији корисници", @@ -27,6 +27,8 @@ "group": "%1 група", "chats": "Ћаскања", "chat": "Ћаскање са %1", + "flags": "Заставице", + "flag-details": "Означи %1 детаље", "account/edit": "Уређивање \"%1\"", "account/edit/password": "Уређивање лозинке од \"%1\"", "account/edit/username": "Уређивање корисничког имена од \"%1\"", @@ -44,7 +46,7 @@ "account/downvoted": "Поруке које је негативно гласао %1", "account/best": "Најбоље поруке од %1", "confirm": "Е-пошта је потврђена.", - "maintenance.text": "%1 је тренутно у фази одржавања. Молимо, вратите се други пут.", + "maintenance.text": "%1 је тренутно у фази одржавања. Молимо, навратите касније.", "maintenance.messageIntro": "Додатно, администратор је оставио ову поруку:", - "throttled.text": "%1 је тренутно недоступан због прекомерног оптерећења. Молимо, вратите се други пут." + "throttled.text": "%1 је тренутно недоступан због прекомерног оптерећења. Молимо, навратите касније." } \ No newline at end of file diff --git a/public/language/sr/search.json b/public/language/sr/search.json index d6f6114310..ef24e92f17 100644 --- a/public/language/sr/search.json +++ b/public/language/sr/search.json @@ -12,6 +12,7 @@ "reply-count": "Број одговора", "at-least": "Најмање", "at-most": "Највише", + "relevance": "Важност", "post-time": "Време објаве", "newer-than": "Новије од", "older-than": "Старије од", diff --git a/public/language/sr/topic.json b/public/language/sr/topic.json index 20ac0c5243..3992fad51d 100644 --- a/public/language/sr/topic.json +++ b/public/language/sr/topic.json @@ -13,7 +13,8 @@ "notify_me": "Будите обавештени о новим порукама у овој теми", "quote": "Цитирај", "reply": "Одговори", - "replies_to_this_post": "Одговора: %1", + "replies_to_this_post": "%1 одговора", + "last_reply_time": "Последњи одговор", "reply-as-topic": "Постави одговор као тему", "guest-login-reply": "Пријавите се да бисте одговорили", "edit": "Уреди", @@ -25,28 +26,11 @@ "link": "Веза", "share": "Дели", "tools": "Алатке", - "flag": "Означи", "locked": "Закључано", "pinned": "Закачено", "moved": "Премештено", "bookmark_instructions": "Кликните овде за повратак на последњу прочитану поруку у овој теми.", "flag_title": "Означи ову поруку за модерацију", - "flag_success": "Ова порука је означена за модерацију.", - "flag_manage_title": "Означена порука у %1", - "flag_manage_history": "Историја радњи", - "flag_manage_no_history": "Нема историје догађаја за пријаву", - "flag_manage_assignee": "Заступник", - "flag_manage_state": "Стање", - "flag_manage_state_open": "Ново/Отвори", - "flag_manage_state_wip": "Посао у току", - "flag_manage_state_resolved": "Решено", - "flag_manage_state_rejected": "Одбијено", - "flag_manage_notes": "Дељене белешке", - "flag_manage_update": "Ажурирај статус ознаке", - "flag_manage_history_assignee": "Додељено %1", - "flag_manage_history_state": "Ажуриран статус %1", - "flag_manage_history_notes": "Белешке статуса су ажуриране", - "flag_manage_saved": "Детаљи статуса су ажурирани", "deleted_message": "Ова тема је избрисана. Само корисници са привилегијама управљања темама је могу видети.", "following_topic.message": "Од сада ће те примати обавештења када неко одговори у овој теми.", "not_following_topic.message": "Видећете ову тему у списку непрочитаних тема али нећете примати обавештења када неко одговори у њој.", @@ -131,8 +115,5 @@ "stale.warning": "Тема у којој желите да одговорите је сувише стара. Да ли желите да уместо тога креирате нову тему и упутите на ову у вашем одговору?", "stale.create": "Креирај нову тему", "stale.reply_anyway": "Одговори на ову тему у сваком случају", - "link_back": "Re: [%1](%2)", - "spam": "Непожељно", - "offensive": "Увредљиво", - "custom-flag-reason": "Унесите разлог означавања" + "link_back": "Re: [%1](%2)" } \ No newline at end of file diff --git a/public/language/sr/user.json b/public/language/sr/user.json index c25b641603..08c61c887c 100644 --- a/public/language/sr/user.json +++ b/public/language/sr/user.json @@ -33,6 +33,7 @@ "chat": "Ђаскање", "chat_with": "Настави ћаскање са %1", "new_chat_with": "Започни ново ћаскање са %1", + "flag-profile": "Означи профил", "follow": "Прати", "unfollow": "Не прати", "more": "Више", @@ -64,6 +65,8 @@ "remove_uploaded_picture": "Уклоните отпремљену слику", "upload_cover_picture": "Отпреми насловну слику", "remove_cover_picture_confirm": "Да ли сте сигурни да желите да уклоните насловну слику?", + "crop_picture": "Изрежи слику", + "upload_cropped_picture": "Изрежи и опреми", "settings": "Подешавања", "show_email": "Прикажи моју лозинку", "show_fullname": "Прикажи моје пуно име", diff --git a/public/language/sv/admin/advanced/errors.json b/public/language/sv/admin/advanced/errors.json index 963e68b116..546f0f1508 100644 --- a/public/language/sv/admin/advanced/errors.json +++ b/public/language/sv/admin/advanced/errors.json @@ -8,7 +8,7 @@ "clear-error-log": "Clear Error Log", "route": "Route", "count": "Count", - "no-routes-not-found": "Hooray! There are no routes that were not found.", + "no-routes-not-found": "Hooray! No 404 errors!", "clear404-confirm": "Are you sure you wish to clear the 404 error logs?", "clear404-success": "\"404 Not Found\" errors cleared" } \ No newline at end of file diff --git a/public/language/sv/admin/general/dashboard.json b/public/language/sv/admin/general/dashboard.json index b82802db1b..a70dda322e 100644 --- a/public/language/sv/admin/general/dashboard.json +++ b/public/language/sv/admin/general/dashboard.json @@ -2,6 +2,9 @@ "forum-traffic": "Forum Traffic", "page-views": "Page Views", "unique-visitors": "Unique Visitors", + "users": "Users", + "posts": "Posts", + "topics": "Topics", "page-views-last-month": "Page views Last Month", "page-views-this-month": "Page views This Month", "page-views-last-day": "Page views in last 24 hours", @@ -20,6 +23,11 @@ "prerelease-warning": "

This is a pre-release version of NodeBB. Unintended bugs may occur.

", "notices": "Notices", + "restart-not-required": "Restart not required", + "restart-required": "Restart required", + "search-plugin-installed": "Search Plugin installed", + "search-plugin-not-installed": "Search Plugin not installed", + "search-plugin-tooltip": "Install a search plugin from the plugin page in order to activate search functionality", "control-panel": "System Control", "reload": "Reload", @@ -52,4 +60,4 @@ "graphs.unique-visitors": "Unique Visitors", "graphs.registered-users": "Registered Users", "graphs.anonymous-users": "Anonymous Users" -} \ No newline at end of file +} diff --git a/public/language/sv/admin/menu.json b/public/language/sv/admin/menu.json index 6a4995ea6e..985c540e8a 100644 --- a/public/language/sv/admin/menu.json +++ b/public/language/sv/admin/menu.json @@ -13,7 +13,6 @@ "manage/users": "Users", "manage/registration": "Registration Queue", "manage/groups": "Groups", - "manage/flags": "Flags", "manage/ip-blacklist": "IP Blacklist", "section-settings": "Settings", diff --git a/public/language/sv/admin/settings/general.json b/public/language/sv/admin/settings/general.json index c26740ee4f..72ecfe641f 100644 --- a/public/language/sv/admin/settings/general.json +++ b/public/language/sv/admin/settings/general.json @@ -26,5 +26,6 @@ "touch-icon.upload": "Upload", "touch-icon.help": "Recommended size and format: 192x192, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.", "outgoing-links": "Outgoing Links", - "outgoing-links.warning-page": "Use Outgoing Links Warning Page" + "outgoing-links.warning-page": "Use Outgoing Links Warning Page", + "search-default-sort-by": "Search default sort by" } \ No newline at end of file diff --git a/public/language/sv/admin/settings/uploads.json b/public/language/sv/admin/settings/uploads.json index 8a56c85663..35eaa5a58f 100644 --- a/public/language/sv/admin/settings/uploads.json +++ b/public/language/sv/admin/settings/uploads.json @@ -9,7 +9,7 @@ "allow-topic-thumbnails": "Allow users to upload topic thumbnails", "topic-thumb-size": "Topic Thumb Size", "allowed-file-extensions": "Allowed File Extensions", - "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc).\n\t\t\t\t\tAn empty list means all extensions are allowed.", + "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc). An empty list means all extensions are allowed.", "profile-avatars": "Profile Avatars", "allow-profile-image-uploads": "Allow users to upload profile images", "convert-profile-image-png": "Convert profile image uploads to PNG", @@ -25,4 +25,4 @@ "profile-covers": "Profile Covers", "default-covers": "Default Cover Images", "default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image" -} \ No newline at end of file +} diff --git a/public/language/sv/notifications.json b/public/language/sv/notifications.json index 53f94b6b3a..5236999f3f 100644 --- a/public/language/sv/notifications.json +++ b/public/language/sv/notifications.json @@ -19,6 +19,9 @@ "user_flagged_post_in": "%1 flaggade ett inlägg i %2", "user_flagged_post_in_dual": "%1 och %2 rapporterade ett inlägg i %3", "user_flagged_post_in_multiple": "%1 och %2 andra rapporterade ett inlägg i %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 har skrivit ett svar på: %2", "user_posted_to_dual": "%1 och %2 har svarat på: %3", "user_posted_to_multiple": "%1 och %2 andra har svarat på: %3", diff --git a/public/language/sv/pages.json b/public/language/sv/pages.json index 61f6c23a62..cdc9019082 100644 --- a/public/language/sv/pages.json +++ b/public/language/sv/pages.json @@ -6,7 +6,7 @@ "popular-month": "Populära ämnen denna månad", "popular-alltime": "Populäraste ämnena genom tiderna", "recent": "Senaste ämnena", - "flagged-posts": "Flaggade inlägg", + "flagged-content": "Flagged Content", "ip-blacklist": "IP Svartlista", "users/online": "Användare online", "users/latest": "Senaste Användare", @@ -27,6 +27,8 @@ "group": "%1 grupp", "chats": "Chattar", "chat": "Chattar med %1", + "flags": "Flags", + "flag-details": "Flag %1 Details", "account/edit": "Redigerar \"%1\"", "account/edit/password": "Redigerar lösenord för \"%1\"", "account/edit/username": "Redigerar användarnamn för \"%1\"", diff --git a/public/language/sv/search.json b/public/language/sv/search.json index 7b2cb7db6a..e8f6df7141 100644 --- a/public/language/sv/search.json +++ b/public/language/sv/search.json @@ -12,6 +12,7 @@ "reply-count": "Svarsantal", "at-least": "Som minst", "at-most": "Som mest", + "relevance": "Relevance", "post-time": "Inläggstid", "newer-than": "Yngre än", "older-than": "Äldre än", diff --git a/public/language/sv/topic.json b/public/language/sv/topic.json index b1e56a95f9..45599c2186 100644 --- a/public/language/sv/topic.json +++ b/public/language/sv/topic.json @@ -13,7 +13,8 @@ "notify_me": "Få notiser om nya svar i detta ämne", "quote": "Citera", "reply": "Svara", - "replies_to_this_post": "Replies: %1", + "replies_to_this_post": "%1 Replies", + "last_reply_time": "Last reply", "reply-as-topic": "Svara som ämne", "guest-login-reply": "Logga in för att posta", "edit": "Ändra", @@ -25,28 +26,11 @@ "link": "Länk", "share": "Dela", "tools": "Verktyg", - "flag": "Rapportera", "locked": "Låst", "pinned": "Fäst", "moved": "Flyttad", "bookmark_instructions": "Klicka här för att återgå till senast lästa inlägg i detta ämne.", "flag_title": "Rapportera detta inlägg för granskning", - "flag_success": "Det här inlägget har flaggats för moderering.", - "flag_manage_title": "Inlägg flaggad i %1", - "flag_manage_history": "Händelse historia", - "flag_manage_no_history": "Inga händelser att rapportera", - "flag_manage_assignee": "Tilldelad", - "flag_manage_state": "Status", - "flag_manage_state_open": "Ny/Öppen", - "flag_manage_state_wip": "Pågående arbete", - "flag_manage_state_resolved": "Löst", - "flag_manage_state_rejected": "Avvisad", - "flag_manage_notes": "Delade anteckningar", - "flag_manage_update": "Uppdatera flag Status", - "flag_manage_history_assignee": "Tilldelad till %1", - "flag_manage_history_state": "Uppdaterade status till %1", - "flag_manage_history_notes": "Uppdaterade flag anteckningar", - "flag_manage_saved": "Flag detaljer uppdaterad", "deleted_message": "Det här ämnet har raderats. Endast användare med ämneshanterings-privilegier kan se det.", "following_topic.message": "Du kommer nu få notiser när någon gör inlägg i detta ämne.", "not_following_topic.message": "Du kommer att se det här ämnet i listan olästa ämnen, men du kommer inte att få meddelande när någon gör inlägg till detta ämne.", @@ -131,8 +115,5 @@ "stale.warning": "Ämnet du svarar på är ganska gammalt. Vill du skapa ett nytt ämne istället och inkludera en referens till det här ämnet i ditt inlägg?", "stale.create": "Skapa nytt ämne", "stale.reply_anyway": "Svara på ämnet ändå", - "link_back": "Re: [%1](%2)", - "spam": "Spam", - "offensive": "Kränkande", - "custom-flag-reason": "Ange skälet för rapporteringen" + "link_back": "Re: [%1](%2)" } \ No newline at end of file diff --git a/public/language/sv/user.json b/public/language/sv/user.json index 9f3f6c3342..7025caca67 100644 --- a/public/language/sv/user.json +++ b/public/language/sv/user.json @@ -33,6 +33,7 @@ "chat": "Chatta", "chat_with": "Continue chat with %1", "new_chat_with": "Start new chat with %1", + "flag-profile": "Flag Profile", "follow": "Följ", "unfollow": "Sluta följ", "more": "Mer", @@ -64,6 +65,8 @@ "remove_uploaded_picture": "Ta bort uppladdad bild", "upload_cover_picture": "Ladda upp omslagsbild", "remove_cover_picture_confirm": "Are you sure you want to remove the cover picture?", + "crop_picture": "Crop picture", + "upload_cropped_picture": "Crop and upload", "settings": "Inställningar", "show_email": "Visa min e-postadress", "show_fullname": "Visa fullständigt namn", diff --git a/public/language/th/admin/advanced/errors.json b/public/language/th/admin/advanced/errors.json index 963e68b116..546f0f1508 100644 --- a/public/language/th/admin/advanced/errors.json +++ b/public/language/th/admin/advanced/errors.json @@ -8,7 +8,7 @@ "clear-error-log": "Clear Error Log", "route": "Route", "count": "Count", - "no-routes-not-found": "Hooray! There are no routes that were not found.", + "no-routes-not-found": "Hooray! No 404 errors!", "clear404-confirm": "Are you sure you wish to clear the 404 error logs?", "clear404-success": "\"404 Not Found\" errors cleared" } \ No newline at end of file diff --git a/public/language/th/admin/general/dashboard.json b/public/language/th/admin/general/dashboard.json index b82802db1b..a70dda322e 100644 --- a/public/language/th/admin/general/dashboard.json +++ b/public/language/th/admin/general/dashboard.json @@ -2,6 +2,9 @@ "forum-traffic": "Forum Traffic", "page-views": "Page Views", "unique-visitors": "Unique Visitors", + "users": "Users", + "posts": "Posts", + "topics": "Topics", "page-views-last-month": "Page views Last Month", "page-views-this-month": "Page views This Month", "page-views-last-day": "Page views in last 24 hours", @@ -20,6 +23,11 @@ "prerelease-warning": "

This is a pre-release version of NodeBB. Unintended bugs may occur.

", "notices": "Notices", + "restart-not-required": "Restart not required", + "restart-required": "Restart required", + "search-plugin-installed": "Search Plugin installed", + "search-plugin-not-installed": "Search Plugin not installed", + "search-plugin-tooltip": "Install a search plugin from the plugin page in order to activate search functionality", "control-panel": "System Control", "reload": "Reload", @@ -52,4 +60,4 @@ "graphs.unique-visitors": "Unique Visitors", "graphs.registered-users": "Registered Users", "graphs.anonymous-users": "Anonymous Users" -} \ No newline at end of file +} diff --git a/public/language/th/admin/menu.json b/public/language/th/admin/menu.json index 6a4995ea6e..985c540e8a 100644 --- a/public/language/th/admin/menu.json +++ b/public/language/th/admin/menu.json @@ -13,7 +13,6 @@ "manage/users": "Users", "manage/registration": "Registration Queue", "manage/groups": "Groups", - "manage/flags": "Flags", "manage/ip-blacklist": "IP Blacklist", "section-settings": "Settings", diff --git a/public/language/th/admin/settings/general.json b/public/language/th/admin/settings/general.json index c26740ee4f..72ecfe641f 100644 --- a/public/language/th/admin/settings/general.json +++ b/public/language/th/admin/settings/general.json @@ -26,5 +26,6 @@ "touch-icon.upload": "Upload", "touch-icon.help": "Recommended size and format: 192x192, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.", "outgoing-links": "Outgoing Links", - "outgoing-links.warning-page": "Use Outgoing Links Warning Page" + "outgoing-links.warning-page": "Use Outgoing Links Warning Page", + "search-default-sort-by": "Search default sort by" } \ No newline at end of file diff --git a/public/language/th/admin/settings/uploads.json b/public/language/th/admin/settings/uploads.json index 8a56c85663..35eaa5a58f 100644 --- a/public/language/th/admin/settings/uploads.json +++ b/public/language/th/admin/settings/uploads.json @@ -9,7 +9,7 @@ "allow-topic-thumbnails": "Allow users to upload topic thumbnails", "topic-thumb-size": "Topic Thumb Size", "allowed-file-extensions": "Allowed File Extensions", - "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc).\n\t\t\t\t\tAn empty list means all extensions are allowed.", + "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc). An empty list means all extensions are allowed.", "profile-avatars": "Profile Avatars", "allow-profile-image-uploads": "Allow users to upload profile images", "convert-profile-image-png": "Convert profile image uploads to PNG", @@ -25,4 +25,4 @@ "profile-covers": "Profile Covers", "default-covers": "Default Cover Images", "default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image" -} \ No newline at end of file +} diff --git a/public/language/th/notifications.json b/public/language/th/notifications.json index 3d1e6d9866..f75223f772 100644 --- a/public/language/th/notifications.json +++ b/public/language/th/notifications.json @@ -19,6 +19,9 @@ "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", diff --git a/public/language/th/pages.json b/public/language/th/pages.json index e2d1215bcb..7a92d461eb 100644 --- a/public/language/th/pages.json +++ b/public/language/th/pages.json @@ -6,7 +6,7 @@ "popular-month": "Popular topics this month", "popular-alltime": "All time popular topics", "recent": "กระทู้ล่าสุด", - "flagged-posts": "Flagged Posts", + "flagged-content": "Flagged Content", "ip-blacklist": "IP Blacklist", "users/online": "Online Users", "users/latest": "Latest Users", @@ -27,6 +27,8 @@ "group": "%1 group", "chats": "Chats", "chat": "Chatting with %1", + "flags": "Flags", + "flag-details": "Flag %1 Details", "account/edit": "Editing \"%1\"", "account/edit/password": "Editing password of \"%1\"", "account/edit/username": "Editing username of \"%1\"", diff --git a/public/language/th/search.json b/public/language/th/search.json index e441bd0c84..4dafe32b18 100644 --- a/public/language/th/search.json +++ b/public/language/th/search.json @@ -12,6 +12,7 @@ "reply-count": "จำนวนข้อความตอบกลับ", "at-least": "อย่างน้อยที่สุด", "at-most": "อย่างมากที่สุด", + "relevance": "Relevance", "post-time": "Post time", "newer-than": "Newer than", "older-than": "Older than", diff --git a/public/language/th/topic.json b/public/language/th/topic.json index a1abfb9e2a..2cd850d1fb 100644 --- a/public/language/th/topic.json +++ b/public/language/th/topic.json @@ -13,7 +13,8 @@ "notify_me": "แจ้งเตือนเมื่อการตอบใหม่ในกระทู้นี้", "quote": "คำอ้างอิง", "reply": "ตอบ", - "replies_to_this_post": "Replies: %1", + "replies_to_this_post": "%1 Replies", + "last_reply_time": "Last reply", "reply-as-topic": "Reply as topic", "guest-login-reply": "เข้าสู่ระบบเพื่อตอบกลับ", "edit": "แก้ไข", @@ -25,28 +26,11 @@ "link": "ลิงค์", "share": "แชร์", "tools": "เครื่องมือ", - "flag": "ปักธง", "locked": "Locked", "pinned": "Pinned", "moved": "Moved", "bookmark_instructions": "Click here to return to the last read post in this thread.", "flag_title": "ปักธงโพสต์นี้เพื่อดำเนินการ", - "flag_success": "This post has been flagged for moderation.", - "flag_manage_title": "Flagged post in %1", - "flag_manage_history": "Action History", - "flag_manage_no_history": "No event history to report", - "flag_manage_assignee": "Assignee", - "flag_manage_state": "State", - "flag_manage_state_open": "New/Open", - "flag_manage_state_wip": "Work in Progress", - "flag_manage_state_resolved": "Resolved", - "flag_manage_state_rejected": "Rejected", - "flag_manage_notes": "Shared Notes", - "flag_manage_update": "Update Flag Status", - "flag_manage_history_assignee": "Assigned to %1", - "flag_manage_history_state": "Updated state to %1", - "flag_manage_history_notes": "Updated flag notes", - "flag_manage_saved": "Flag Details Updated", "deleted_message": "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.", @@ -131,8 +115,5 @@ "stale.warning": "The topic you are replying to is quite old. Would you like to create a new topic instead, and reference this one in your reply?", "stale.create": "Create a new topic", "stale.reply_anyway": "Reply to this topic anyway", - "link_back": "Re: [%1](%2)", - "spam": "Spam", - "offensive": "Offensive", - "custom-flag-reason": "Enter a flagging reason" + "link_back": "Re: [%1](%2)" } \ No newline at end of file diff --git a/public/language/th/user.json b/public/language/th/user.json index 968a909371..f42bf44168 100644 --- a/public/language/th/user.json +++ b/public/language/th/user.json @@ -33,6 +33,7 @@ "chat": "แชท", "chat_with": "Continue chat with %1", "new_chat_with": "Start new chat with %1", + "flag-profile": "Flag Profile", "follow": "ติดตาม", "unfollow": "เลิกติดตาม", "more": "More", @@ -64,6 +65,8 @@ "remove_uploaded_picture": "Remove Uploaded Picture", "upload_cover_picture": "Upload cover picture", "remove_cover_picture_confirm": "Are you sure you want to remove the cover picture?", + "crop_picture": "Crop picture", + "upload_cropped_picture": "Crop and upload", "settings": "ตั้งค่า", "show_email": "แสดงอีเมล์", "show_fullname": "แสดงชื่อจริง", diff --git a/public/language/tr/admin/advanced/errors.json b/public/language/tr/admin/advanced/errors.json index 001773a2cf..f7cbcf7873 100644 --- a/public/language/tr/admin/advanced/errors.json +++ b/public/language/tr/admin/advanced/errors.json @@ -8,7 +8,7 @@ "clear-error-log": "Hata Kayıtlarını Temizle", "route": "Route", "count": "Count", - "no-routes-not-found": "Hooray! There are no routes that were not found.", + "no-routes-not-found": "Hooray! No 404 errors!", "clear404-confirm": "Are you sure you wish to clear the 404 error logs?", "clear404-success": "\"404 Not Found\" errors cleared" } \ 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 faf0f66b15..83e506e854 100644 --- a/public/language/tr/admin/appearance/customise.json +++ b/public/language/tr/admin/appearance/customise.json @@ -1,9 +1,9 @@ { "custom-css": "Özel CSS", "custom-css.description": "Enter your own CSS declarations here, which will be applied after all other styles.", - "custom-css.enable": "Enable Custom CSS", + "custom-css.enable": "Özel CSS Aktif", - "custom-header": "Custom Header", + "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" } \ 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 3379d19afa..33e63acd78 100644 --- a/public/language/tr/admin/general/dashboard.json +++ b/public/language/tr/admin/general/dashboard.json @@ -1,55 +1,63 @@ { "forum-traffic": "Forum Trafiği", "page-views": "Sayfa Gösterimi", - "unique-visitors": "Unique Visitors", - "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", + "unique-visitors": "Tekil ziyaretçi", + "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", - "stats.day": "Day", + "stats.day": "Gün", "stats.week": "Hafta", - "stats.month": "Month", - "stats.all": "All Time", + "stats.month": "Ay", + "stats.all": "Tüm Zamanlar", - "updates": "Updates", - "running-version": "You are running NodeBB v%1.", - "keep-updated": "Always make sure that your NodeBB is up to date for the latest security patches and bug fixes.", + "updates": "Güncellemeler", + "running-version": "NodeBB v%1 çalışıyor.", + "keep-updated": "En son güvenlik değişiklikleri ve hata düzeltmeleri için NodeBB güncel olduğundan emin olun.", "up-to-date": "

You are up-to-date

", "upgrade-available": "

A new version (v%1) has been released. Consider upgrading your NodeBB.

", "prerelease-upgrade-available": "

This is an outdated pre-release version of NodeBB. A new version (v%1) has been released. Consider upgrading your NodeBB.

", "prerelease-warning": "

This is a pre-release version of NodeBB. Unintended bugs may occur.

", - "notices": "Notices", + "notices": "Bildirimler", + "restart-not-required": "Yeniden başlatma gerekmiyor", + "restart-required": "Yeniden başlatma gerekiyor", + "search-plugin-installed": "Arama Eklentisi yüklendi", + "search-plugin-not-installed": "Arama Eklentisi yüklenmedi", + "search-plugin-tooltip": "Install a search plugin from the plugin page in order to activate search functionality", - "control-panel": "System Control", - "reload": "Reload", - "restart": "Restart", + "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.", - "maintenance-mode": "Maintenance Mode", - "maintenance-mode-title": "Click here to set up maintenance mode for NodeBB", - "realtime-chart-updates": "Realtime Chart Updates", + "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", - "active-users": "Active Users", - "active-users.users": "Users", - "active-users.guests": "Guests", - "active-users.total": "Total", - "active-users.connections": "Connections", + "active-users": "Aktif Kullanıcılar", + "active-users.users": "Kullanıcılar", + "active-users.guests": "Ziyaretçiler", + "active-users.total": "Genel Toplam", + "active-users.connections": "Bağlantılar", - "anonymous-registered-users": "Anonymous vs Registered Users", - "anonymous": "Anonymous", - "registered": "Registered", + "anonymous-registered-users": "Anonim vs Kayıtlı Kullanıcılar", + "anonymous": "Anonim", + "registered": "Kayıtlı", - "user-presence": "User Presence", - "on-categories": "On categories list", - "reading-posts": "Reading posts", - "browsing-topics": "Browsing topics", - "recent": "Recent", - "unread": "Unread", + "user-presence": "Kullanıcı Durumları", + "on-categories": "Kategoriler listesinde", + "reading-posts": "Okunan İletiler", + "browsing-topics": "Gözden Geçirilen Başlıklar", + "recent": "Yeni", + "unread": "Okunmamış", "high-presence-topics": "High Presence Topics", - "graphs.page-views": "Page Views", - "graphs.unique-visitors": "Unique Visitors", - "graphs.registered-users": "Registered Users", - "graphs.anonymous-users": "Anonymous Users" -} \ No newline at end of file + "graphs.page-views": "Sayfa Gösterimi", + "graphs.unique-visitors": "Benzersiz Ziyaretçiler", + "graphs.registered-users": "Kayıtlı Kullanıcılar", + "graphs.anonymous-users": "Anonim Kullanıcılar" +} diff --git a/public/language/tr/admin/menu.json b/public/language/tr/admin/menu.json index d61ad44718..869d01e0d7 100644 --- a/public/language/tr/admin/menu.json +++ b/public/language/tr/admin/menu.json @@ -13,7 +13,6 @@ "manage/users": "Kullanıcılar", "manage/registration": "Registration Queue", "manage/groups": "Groups", - "manage/flags": "Flags", "manage/ip-blacklist": "IP Blacklist", "section-settings": "Settings", diff --git a/public/language/tr/admin/settings/general.json b/public/language/tr/admin/settings/general.json index fd20d55be7..2c3ef42d5c 100644 --- a/public/language/tr/admin/settings/general.json +++ b/public/language/tr/admin/settings/general.json @@ -3,28 +3,29 @@ "title": "Site Başlığı", "title.name": "Topluluk İsmi", "title.show-in-header": "Show Site Title in Header", - "browser-title": "Browser Title", + "browser-title": "Tarayıcı Başlığı", "browser-title-help": "If no browser title is specified, the site title will be used", "title-layout": "Title Layout", "title-layout-help": "Define how the browser title will be structured ie. {pageTitle} | {browserTitle}", "description.placeholder": "A short description about your community", "description": "Site Açıklaması", - "keywords": "Site Keywords", + "keywords": "Site Anahtar Kelimeler", "keywords-placeholder": "Keywords describing your community, comma-separated", "logo": "Site Logo", - "logo.image": "Image", + "logo.image": "Görsel", "logo.image-placeholder": "Path to a logo to display on forum header", "logo.upload": "Yükle", "logo.url": "URL", "logo.url-placeholder": "The URL of the site logo", "logo.url-help": "When the logo is clicked, send users to this address. If left blank, user will be sent to the forum index.", - "logo.alt-text": "Alt Text", + "logo.alt-text": "Alt Yazı", "log.alt-text-placeholder": "Alternative text for accessibility", "favicon": "Favicon", "favicon.upload": "Yükle", "touch-icon": "Homescreen/Touch Icon", "touch-icon.upload": "Yükle", "touch-icon.help": "Recommended size and format: 192x192, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.", - "outgoing-links": "Outgoing Links", - "outgoing-links.warning-page": "Use Outgoing Links Warning Page" + "outgoing-links": "Harici Bağlantılar", + "outgoing-links.warning-page": "Use Outgoing Links Warning Page", + "search-default-sort-by": "Aramada varsayılan sıralama" } \ 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 5385404ac6..4daa55400b 100644 --- a/public/language/tr/admin/settings/uploads.json +++ b/public/language/tr/admin/settings/uploads.json @@ -1,7 +1,7 @@ { "posts": "İletiler", "allow-files": "Allow users to upload regular files", - "private": "Make uploaded files private", + "private": "Yüklenen dosyaları gizli yap", "max-image-width": "Resize images down to specified width (in pixels)", "max-image-width-help": "(in pixels, default: 760 pixels, set to 0 to disable)", "max-file-size": "Maksimum Dosya Boyutu (KiB)", @@ -9,7 +9,7 @@ "allow-topic-thumbnails": "Allow users to upload topic thumbnails", "topic-thumb-size": "Topic Thumb Size", "allowed-file-extensions": "Allowed File Extensions", - "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc).\n\t\t\t\t\tAn empty list means all extensions are allowed.", + "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc). An empty list means all extensions are allowed.", "profile-avatars": "Profile Avatars", "allow-profile-image-uploads": "Allow users to upload profile images", "convert-profile-image-png": "Convert profile image uploads to PNG", @@ -19,10 +19,10 @@ "profile-image-dimension-help": "(in pixels, default: 128 pixels)", "max-profile-image-size": "Maximum Profile Image File Size", "max-profile-image-size-help": "(in kilobytes, default: 256 KiB)", - "max-cover-image-size": "Maximum Cover Image File Size", + "max-cover-image-size": "Maksimum Kapak Görseli Dosya Boyutu", "max-cover-image-size-help": "(in kilobytes, default: 2,048 KiB)", "keep-all-user-images": "Keep old versions of avatars and profile covers on the server", - "profile-covers": "Profile Covers", - "default-covers": "Default Cover Images", + "profile-covers": "Profil Kapakları", + "default-covers": "Varsayılan Kapak Görseli", "default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image" -} \ No newline at end of file +} diff --git a/public/language/tr/notifications.json b/public/language/tr/notifications.json index 5474cc8872..c402cddfc1 100644 --- a/public/language/tr/notifications.json +++ b/public/language/tr/notifications.json @@ -19,6 +19,9 @@ "user_flagged_post_in": "%1 bir iletiyi bayrakladı. %2", "user_flagged_post_in_dual": " %1 ve %2 %3 gönderini bayrakladı", "user_flagged_post_in_multiple": "%1 ve %2 kişi daha %3 gönderini bayrakladı", + "user_flagged_user": "%1 bayraklanan bir kullanıcı profili (%2)", + "user_flagged_user_dual": "%1 ve %2 bayraklanan kullanıcı profili (%3)", + "user_flagged_user_multiple": "%1 ve %2 diğer bayraklanan kullanıcı profili (%3)", "user_posted_to": "%1 %2 başlığına bir ileti gönderdi.", "user_posted_to_dual": "%1 ve %2 gönderine cevap verdi: %3", "user_posted_to_multiple": "%1 ve %2 kişi daha gönderine cevap verdi: %3", diff --git a/public/language/tr/pages.json b/public/language/tr/pages.json index 73900a5eb1..e29ac65fb9 100644 --- a/public/language/tr/pages.json +++ b/public/language/tr/pages.json @@ -6,7 +6,7 @@ "popular-month": "Bu ayki popüler başlıklar", "popular-alltime": "En popüler başlıklar", "recent": "Güncel Konular", - "flagged-posts": "Bayraklanmış İletiler", + "flagged-content": "Bayraklanan İçerik", "ip-blacklist": "IP Karaliste", "users/online": "Çevrimiçi Kullanıcılar", "users/latest": "En Yeni Kullanıcılar", @@ -27,6 +27,8 @@ "group": "%1 grubu", "chats": "Sohbetler", "chat": "%1 ile sohbet", + "flags": "Bayraklar", + "flag-details": "Bayrak %1 Detay", "account/edit": "\"%1\" düzenleniyor", "account/edit/password": "\"%1\" parolayı düzenliyor", "account/edit/username": "\"%1\" kullanıcı adını düzenliyor", diff --git a/public/language/tr/search.json b/public/language/tr/search.json index bf3e68caf7..cfbcc7db4b 100644 --- a/public/language/tr/search.json +++ b/public/language/tr/search.json @@ -8,10 +8,11 @@ "posted-by": "Gönderen", "in-categories": "Kategorilerde", "search-child-categories": "Alt kategorilerde arat", - "has-tags": "Has tags", + "has-tags": "Etiketler", "reply-count": "Cevap Sayısı", "at-least": "En az", "at-most": "En fazla", + "relevance": "İlgi", "post-time": "Yayınlama zamanı", "newer-than": "Daha yeni", "older-than": "Daha eski", diff --git a/public/language/tr/topic.json b/public/language/tr/topic.json index 0fc68c3382..ad57a76331 100644 --- a/public/language/tr/topic.json +++ b/public/language/tr/topic.json @@ -13,7 +13,8 @@ "notify_me": "Bu konudaki cevaplardan haberdar ol", "quote": "Alıntı", "reply": "Cevap", - "replies_to_this_post": "Yanıtlar: %1", + "replies_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", "edit": "Düzenle", @@ -25,28 +26,11 @@ "link": "Bağlantı", "share": "Paylaş", "tools": "Araçlar", - "flag": "Bayrak", "locked": "Kilitli", "pinned": "İğnelendi", "moved": "Taşındı", "bookmark_instructions": "Bu başlıkta en son kaldığın yere dönmek için tıklayın.", "flag_title": "Bu iletiyi moderatöre haber et", - "flag_success": "Bu ileti yöneticilere bildirildi.", - "flag_manage_title": "%1 ileti bayraklandı", - "flag_manage_history": "Hareket Tarihi", - "flag_manage_no_history": "Hiçbir olay geçmişi yok", - "flag_manage_assignee": "Vekil", - "flag_manage_state": "Bildir", - "flag_manage_state_open": "Yeni/Açık", - "flag_manage_state_wip": "Yapım Aşamasında", - "flag_manage_state_resolved": "Çözüldü", - "flag_manage_state_rejected": "Reddedildi", - "flag_manage_notes": "Paylaşılan Not", - "flag_manage_update": "Bayram Durumunu Güncelle", - "flag_manage_history_assignee": "%1 atandı", - "flag_manage_history_state": "%1 bildiri güncellendi", - "flag_manage_history_notes": "Bayrak notu güncellendi", - "flag_manage_saved": "Bayrak Detayları Güncellendi", "deleted_message": "Bu başlık silindi. Sadece başlık düzenleme yetkisi olan kullanıcılar görebilir.", "following_topic.message": "Artık bir kullanıcı bu başlığa ileti gönderdiğinde bildirim alacaksınız.", "not_following_topic.message": "Bu başlığı okunmamışlarda göreceksiniz ama biri bir şey yazdığında bildirim gelmeyecek.", @@ -131,8 +115,5 @@ "stale.warning": "Yanıtlamak istediğin konu oldukca eskidir. Bu konuya referans oluşturacak yeni bir konu oluşturmak ister misin?", "stale.create": "Yeni bir başlık yarat", "stale.reply_anyway": "Bu konuyu cevapla", - "link_back": "Re: [%1](%2)", - "spam": "Gereksiz", - "offensive": "Saldırgan", - "custom-flag-reason": "Şikayetinizin nedenini girin" + "link_back": "Re: [%1](%2)" } \ No newline at end of file diff --git a/public/language/tr/user.json b/public/language/tr/user.json index 2b808ba266..89d9d2b0cf 100644 --- a/public/language/tr/user.json +++ b/public/language/tr/user.json @@ -33,6 +33,7 @@ "chat": "Sohbet", "chat_with": "%1 ile sohbete devam et", "new_chat_with": "%1 ile yeni sohbete başla", + "flag-profile": "Bayrak Profili", "follow": "Takip Et", "unfollow": "Takip etme", "more": "Daha Fazla", @@ -64,6 +65,8 @@ "remove_uploaded_picture": "Yüklenmiş fotoğrafı kaldır", "upload_cover_picture": "Kapak fotoğrafı yükle", "remove_cover_picture_confirm": "Kapak görselini silmek istediğinden emin misin?", + "crop_picture": "Görsel Kırp", + "upload_cropped_picture": "Kırp ve yükle", "settings": "Ayarlar", "show_email": "E-postamı göster", "show_fullname": "Tam ismimi göster", diff --git a/public/language/uk/admin/admin.json b/public/language/uk/admin/admin.json new file mode 100644 index 0000000000..928d6b6c86 --- /dev/null +++ b/public/language/uk/admin/admin.json @@ -0,0 +1,7 @@ +{ + "alert.confirm-reload": "Ви впевнені, що бажаєте перевантажити NodeBB?", + "alert.confirm-restart": "Ви впевнені, що бажаєте перезавантажити NodeBB?", + + "acp-title": "%1 | Адмінська Панель Керування NodeBB", + "settings-header-contents": "Зміст" +} \ No newline at end of file diff --git a/public/language/uk/admin/advanced/cache.json b/public/language/uk/admin/advanced/cache.json new file mode 100644 index 0000000000..9d5aff3127 --- /dev/null +++ b/public/language/uk/admin/advanced/cache.json @@ -0,0 +1,11 @@ +{ + "post-cache": "Кеш постів", + "posts-in-cache": "Постів у кеші", + "average-post-size": "Середній розмір посту", + "length-to-max": "Довжина / Максимум", + "percent-full": "Заповнений на %1%", + "post-cache-size": "Розмір кешу постів", + "items-in-cache": "Елементів у кеші", + "control-panel": "Панель керування", + "update-settings": "Оновити налаштування кешу" +} \ No newline at end of file diff --git a/public/language/uk/admin/advanced/database.json b/public/language/uk/admin/advanced/database.json new file mode 100644 index 0000000000..b7ff1ae639 --- /dev/null +++ b/public/language/uk/admin/advanced/database.json @@ -0,0 +1,35 @@ +{ + "x-b": "%1 б", + "x-mb": "%1 мб", + "uptime-seconds": "Uptime в секундах", + "uptime-days": "Uptime в днях", + + "mongo": "Mongo", + "mongo.version": "Версія MongoDB", + "mongo.storage-engine": "Двигун сховища", + "mongo.collections": "Колекцій", + "mongo.objects": "Об'єктів", + "mongo.avg-object-size": "Середній розмір об'єкта", + "mongo.data-size": "Розмір даних", + "mongo.storage-size": "Розмір сховища", + "mongo.index-size": "Розмір індексу", + "mongo.file-size": "Розмір файлів", + "mongo.resident-memory": "Resident Memory", + "mongo.virtual-memory": "Virtual Memory", + "mongo.mapped-memory": "Mapped Memory", + "mongo.raw-info": "Сирі дані від MongoDB", + + "redis": "Redis", + "redis.version": "Версія Redis", + "redis.connected-clients": "Підключені клієнти", + "redis.connected-slaves": "Підключені слуги", + "redis.blocked-clients": "Заблоковані клієнти", + "redis.used-memory": "Використана пам'ять", + "redis.memory-frag-ratio": "Коефіцієнт фрагментації пам'яті", + "redis.total-connections-recieved": "Кількість отриманих підключень", + "redis.total-commands-processed": "Кілкість оброблених команд", + "redis.iops": "Кількість миттєвих операції в секунду", + "redis.keyspace-hits": "Попадання в ключах", + "redis.keyspace-misses": "Промахи в ключах", + "redis.raw-info": "Сирі дані від Redis" +} \ No newline at end of file diff --git a/public/language/uk/admin/advanced/errors.json b/public/language/uk/admin/advanced/errors.json new file mode 100644 index 0000000000..6d8a56ca30 --- /dev/null +++ b/public/language/uk/admin/advanced/errors.json @@ -0,0 +1,14 @@ +{ + "figure-x": "Рисунок %1", + "error-events-per-day": "%1 подій в день", + "error.404": "404 Not Found", + "error.503": "503 Service Unavailable", + "manage-error-log": "Керувати логом помилок", + "export-error-log": "Експортувати лог помилок (CSV)", + "clear-error-log": "Очистити лог помилок", + "route": "Шлях", + "count": "Кількість", + "no-routes-not-found": "Ура! Помилок 404 немає!", + "clear404-confirm": "Ви впевнені, що бажаєте очистити лог помилок 404?", + "clear404-success": "Помилки \"404 Not Found\" очищено" +} \ No newline at end of file diff --git a/public/language/uk/admin/advanced/events.json b/public/language/uk/admin/advanced/events.json new file mode 100644 index 0000000000..205b4736e1 --- /dev/null +++ b/public/language/uk/admin/advanced/events.json @@ -0,0 +1,6 @@ +{ + "events": "Події", + "no-events": "Подій немає", + "control-panel": "Панель керування подіями", + "delete-events": "Видалити події" +} \ No newline at end of file diff --git a/public/language/uk/admin/advanced/logs.json b/public/language/uk/admin/advanced/logs.json new file mode 100644 index 0000000000..b9ecc6916c --- /dev/null +++ b/public/language/uk/admin/advanced/logs.json @@ -0,0 +1,7 @@ +{ + "logs": "Логи", + "control-panel": "Панель керування логами", + "reload": "Перевантажити логи", + "clear": "Очистити логи", + "clear-success": "Логи очищено!" +} \ No newline at end of file diff --git a/public/language/uk/admin/appearance/customise.json b/public/language/uk/admin/appearance/customise.json new file mode 100644 index 0000000000..e14527f2b6 --- /dev/null +++ b/public/language/uk/admin/appearance/customise.json @@ -0,0 +1,9 @@ +{ + "custom-css": "Користувацькі CSS", + "custom-css.description": "Уведіть власні CSS правила, що будуть примінені після всіх інших стилів.", + "custom-css.enable": "Увімкнути користувацькі CSS", + + "custom-header": "Користувацький заголовок", + "custom-header.description": "Уведіть власний HTML (JavaScript, мета теги, тощо), що буде додано до секції <head> вашого форуму.", + "custom-header.enable": "Увімкнути користувацький заголовок" +} \ No newline at end of file diff --git a/public/language/uk/admin/appearance/skins.json b/public/language/uk/admin/appearance/skins.json new file mode 100644 index 0000000000..cc37055d8d --- /dev/null +++ b/public/language/uk/admin/appearance/skins.json @@ -0,0 +1,9 @@ +{ + "loading": "Завантаження стилів...", + "homepage": "Головна", + "select-skin": "Обрати стиль", + "current-skin": "Поточний стиль", + "skin-updated": "Стиль оновлено", + "applied-success": "Стиль %1 було успішно примінено", + "revert-success": "Стиль повернуто до базових кольорів" +} \ No newline at end of file diff --git a/public/language/uk/admin/appearance/themes.json b/public/language/uk/admin/appearance/themes.json new file mode 100644 index 0000000000..9d2dd953a9 --- /dev/null +++ b/public/language/uk/admin/appearance/themes.json @@ -0,0 +1,11 @@ +{ + "checking-for-installed": "Перевірка встановлених тем...", + "homepage": "Головна", + "select-theme": "Обрати тему", + "current-theme": "Поточна тема", + "no-themes": "Не знайдено вставлених тем", + "revert-confirm": "Ви впевнені, що бажаєте відновити тему NodeBB по замовчуванню?", + "theme-changed": "Тему змінено", + "revert-success": "Ви успішно повернули NodeBB до теми по замовчуванню.", + "restart-to-activate": "Будь ласка, перезавантажте NodeBB, щоб повністю активувати цю тему" +} \ No newline at end of file diff --git a/public/language/uk/admin/development/info.json b/public/language/uk/admin/development/info.json new file mode 100644 index 0000000000..e70699c869 --- /dev/null +++ b/public/language/uk/admin/development/info.json @@ -0,0 +1,16 @@ +{ + "you-are-on": "Інформація - Ви знаходитесь на %1:%2", + "host": "host", + "pid": "pid", + "nodejs": "nodejs", + "online": "online", + "git": "git", + "load": "load", + "uptime": "uptime", + + "registered": "Зареєстровано", + "sockets": "Сокети", + "guests": "Гостей", + + "info": "Інфо" +} \ No newline at end of file diff --git a/public/language/uk/admin/development/logger.json b/public/language/uk/admin/development/logger.json new file mode 100644 index 0000000000..b4887c2022 --- /dev/null +++ b/public/language/uk/admin/development/logger.json @@ -0,0 +1,12 @@ +{ + "logger-settings": "Налаштування логування", + "description": "Увімкнувши ці налаштування, ви будете отримувати логи в ваш термінал. Якщо ви вкажете шлях, логи натомість буде збережено в файл. HTTP логування корисно для сбору статистики про те хто, коли і до якого вмісту отримують доступ люди на вашому форумі. Додатково до логування HTTP запитів ми також можемо логувати події socket.io. Логування socket.io, в комбінації з redis-cli моніторингом може бути дуже зручним для вивчення внутрішньої роботи NodeBB.", + "explanation": "Просто поставте/зніміть прапорець, щоб вімкнути/вимкнути логування на льоту. Перезавантаження не потрібне. ", + "enable-http": "Увімкнути логування HTTP", + "enable-socket": "Увімкнути логування подій socket.io", + "file-path": "Шлях до лог файлу", + "file-path-placeholder": "/шлях/до/логу/file.log ::: залишити пустим для виводу в термінал", + + "control-panel": "Панель керування логуванням", + "update-settings": "Оновити налаштування логування" +} \ No newline at end of file diff --git a/public/language/uk/admin/extend/plugins.json b/public/language/uk/admin/extend/plugins.json new file mode 100644 index 0000000000..8efae9f8e1 --- /dev/null +++ b/public/language/uk/admin/extend/plugins.json @@ -0,0 +1,47 @@ +{ + "installed": "Встановлені", + "active": "Активні", + "inactive": "Неактивні", + "out-of-date": "Застарілі", + "none-found": "Плагінів не знайдено.", + "none-active": "Немає активних плагінів", + "find-plugins": "Знайти плагіни", + + "plugin-search": "Пошук плагінів", + "plugin-search-placeholder": "Шукати плагіни...", + "reorder-plugins": "Впорядкувати плагіни", + "order-active": "Впорядкувати активні плагіни", + "dev-interested": "Зацікавлені в написанні плагінів для NodeBB?", + "docs-info": "Повну документацію з розробки плагінів можна знайти на Порталі NodeBB.", + + "order.description": "Певні плагіни працють краще будучи ініціалізованими до/після інших плагінів.", + "order.explanation": "Плагіни вантажаться у заданому тут порядку, згори до низу", + + "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": "Плагін увімкнуто", + "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 не вдалося зв'язатися з менеджером пакетів, приступити до установки останньої версії?

Відповідь сервера (%1): %2
", + "alert.package-manager-unreachable": "

NodeBB не вдалося зв'язатися з менеджером пакетів, оновлення наразі не рекомендується.

", + "alert.incompatible": "

Ваша версія NodeBB (v%1) дозволяє оновлення цього плагіну лише до v%2. Будь ласка, оновіть NodeBB, щоб встановити новішу версію цього плагіну.

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

Інформацію про сумісність не знайдено

У цьому плагіні не вказано сумісну версію NodeBB. Коректна робота не гарантується.

Якщо NodeBB перестане коректно стартувати, виконайте:

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

Продовжити встановлення останньої версії цього плагіну?

" +} diff --git a/public/language/uk/admin/extend/rewards.json b/public/language/uk/admin/extend/rewards.json new file mode 100644 index 0000000000..a3ba8e3b5c --- /dev/null +++ b/public/language/uk/admin/extend/rewards.json @@ -0,0 +1,17 @@ +{ + "rewards": "Нагороди", + "condition-if-users": "Якщо у користувача", + "condition-is": "Є:", + "condition-then": "Тоді:", + "max-claims": "Скільки разів можна отримати цю нагороду", + "zero-infinite": "Уведіть 0 для нескінченності", + "delete": "Видалити", + "enable": "Увімкнути", + "disable": "Вимкнути", + "control-panel": "Керування нагородами", + "new-reward": "Нова нагорода", + + "alert.delete-success": "Нагороду успішно видалено", + "alert.no-inputs-found": "Невірна нагорода — поля пусті!", + "alert.save-success": "Нагороду успішно збережено" +} \ No newline at end of file diff --git a/public/language/uk/admin/extend/widgets.json b/public/language/uk/admin/extend/widgets.json new file mode 100644 index 0000000000..f22f8b9f17 --- /dev/null +++ b/public/language/uk/admin/extend/widgets.json @@ -0,0 +1,19 @@ +{ + "available": "Доступні віджети", + "explanation": "Оберіть віджет із випадаючого меню і перетягніть його в область зліва.", + "none-installed": "Віджетів не знайдено! Активуйте необхідний плагін віджетів в панелі керування плагінами.", + "containers.available": "Доступні контейнери", + "containers.explanation": "Перетягніть поверх будь-якого активного віджету", + "containers.none": "Ніякий", + "container.well": "Криниця", + "container.jumbotron": "Екран", + "container.panel": "Панель", + "container.panel-header": "Заголовок панелі", + "container.panel-body": "Тіло панелі", + "container.alert": "Тривога", + + "alert.confirm-delete": "Ви впевнені, що бажаєте видалити цей віджет?", + "alert.updated": "Віджети оновлено", + "alert.update-success": "Віджети успішно оновлено" + +} \ No newline at end of file diff --git a/public/language/uk/admin/general/dashboard.json b/public/language/uk/admin/general/dashboard.json new file mode 100644 index 0000000000..fa8b1498b0 --- /dev/null +++ b/public/language/uk/admin/general/dashboard.json @@ -0,0 +1,63 @@ +{ + "forum-traffic": "Трафік форуму", + "page-views": "Перегляди сторінок", + "unique-visitors": "Унікальні відвідувачі", + "users": "Користувачі", + "posts": "Пости", + "topics": "Теми", + "page-views-last-month": "Переглядів останнього місяця", + "page-views-this-month": "Переглядів цього місяця", + "page-views-last-day": "Переглядів за останні 24 години", + + "stats.day": "День", + "stats.week": "Тиждень", + "stats.month": "Місяць", + "stats.all": "Увесь час", + + "updates": "Оновлень", + "running-version": "У вас працює NodeBB v%1.", + "keep-updated": "Регулярно перевіряйте, що ваш NodeBB знаходиться в актуальному стані, щоб мати останні патчі та виправлення.", + "up-to-date": "

Ваша версія актуальна

", + "upgrade-available": "Була випущена нова версія (v%1). Подумайте про оновлення свого NodeBB.

", + "prerelease-upgrade-available": "У вас встановлено застарілу пре-релізну версію NodeBB. Була випущена нова версія (v%1). Подумайте про оновлення свого NodeBB.

", + "prerelease-warning": "

Це пре-релізна версія NodeBB. Можуть виникати неочікувані помилки.

", + + "notices": "Сповіщення", + "restart-not-required": "Перезавантаження не потрібне", + "restart-required": "Потрібне перезавантаження", + "search-plugin-installed": "Пошуковий плагін встановлено", + "search-plugin-not-installed": "Пошуковий плагін не встановлено", + "search-plugin-tooltip": "Встановіть пошуковий плагін зі сторінки плагінів, що активувати пошуковий функціонал", + + "control-panel": "Керування системою", + "reload": "Перевантажити", + "restart": "Перезавантажити", + "restart-warning": "Перевантажування або перезавантаження вашого NodeBB скине всі існуючі з`єднання на декілька секунд.", + "maintenance-mode": "Режим обслуговування", + "maintenance-mode-title": "Натисніть тут, щоб налаштувати режим обслуговування NodeBB", + "realtime-chart-updates": "Оновлення графіків в реальному часі", + + "active-users": "Активні користувачі", + "active-users.users": "Користувачі", + "active-users.guests": "Гості", + "active-users.total": "Разом", + "active-users.connections": "З'єднання", + + "anonymous-registered-users": "Аноніми проти Зареєстрованих", + "anonymous": "Аноніми", + "registered": "Зареєстровані", + + "user-presence": "Присутність користувача", + "on-categories": "На списку категорій", + "reading-posts": "Читають пости", + "browsing-topics": "Переглядають теми", + "recent": "Недавні", + "unread": "Непрочитані", + + "high-presence-topics": "Теми з високою присутністю", + + "graphs.page-views": "Перегляди сторінок", + "graphs.unique-visitors": "Унікальні відвідувачі", + "graphs.registered-users": "Зареєстровані користувачі", + "graphs.anonymous-users": "Анонімні користувачі" +} diff --git a/public/language/uk/admin/general/homepage.json b/public/language/uk/admin/general/homepage.json new file mode 100644 index 0000000000..da2cdffae7 --- /dev/null +++ b/public/language/uk/admin/general/homepage.json @@ -0,0 +1,7 @@ +{ + "home-page": "Головна сторінка", + "description": "Вкажіть яку сторінку показувати коли користувач переходить на корньовий URL форуму.", + "home-page-route": "Шлях головної сторінки", + "custom-route": "Користувацький шлях", + "allow-user-home-pages": "Дозволити користувачам власні сторінки" +} \ No newline at end of file diff --git a/public/language/uk/admin/general/languages.json b/public/language/uk/admin/general/languages.json new file mode 100644 index 0000000000..4db88abb21 --- /dev/null +++ b/public/language/uk/admin/general/languages.json @@ -0,0 +1,5 @@ +{ + "language-settings": "Налаштування мов", + "description": "Мова за замовчуванням задає мову для всіх користувачів, що відвідують форум.
Кожен користувач може перевизначити мову в своїх налаштуваннях акаунта.", + "default-language": "Мова за замовчуванням" +} \ No newline at end of file diff --git a/public/language/uk/admin/general/navigation.json b/public/language/uk/admin/general/navigation.json new file mode 100644 index 0000000000..1370621b63 --- /dev/null +++ b/public/language/uk/admin/general/navigation.json @@ -0,0 +1,27 @@ +{ + "icon": "Іконка:", + "change-icon": "змінити", + "route": "Шлях:", + "tooltip": "Підказка:", + "text": "Текст:", + "text-class": "Класс тексту: необов'язковий", + "id": "ID: необов'язковий", + + "properties": "Властивості:", + "only-admins": "Показувати лише Адмінам", + "only-global-mods-and-admins": "Показувати лише Модераторам та Адмінам", + "only-logged-in": "Показувати лише увійшовшим користувачам", + "open-new-window": "Відкривати у новому вікні", + + "installed-plugins-required": "Необхідні встановлені плагіни:", + "search-plugin": "Пошуковий плагін", + + "btn.delete": "Видалити", + "btn.disable": "Вимкнути", + "btn.enable": "Увімкнути", + + "available-menu-items": "Доступні пункти меню", + "custom-route": "Користувацький шлях", + "core": "ядро", + "plugin": "плагін" +} \ No newline at end of file diff --git a/public/language/uk/admin/general/social.json b/public/language/uk/admin/general/social.json new file mode 100644 index 0000000000..ce739d8b13 --- /dev/null +++ b/public/language/uk/admin/general/social.json @@ -0,0 +1,5 @@ +{ + "post-sharing": "Поширення постів", + "info-plugins-additional": "Плагіни можуть доповнювати набір доступних мереж для поширення постів", + "save-success": "Набір мереж для поширення постів успішно збережено!" +} \ No newline at end of file diff --git a/public/language/uk/admin/general/sounds.json b/public/language/uk/admin/general/sounds.json new file mode 100644 index 0000000000..17214deba0 --- /dev/null +++ b/public/language/uk/admin/general/sounds.json @@ -0,0 +1,9 @@ +{ + "notifications": "Сповіщення", + "chat-messages": "Повідомлення чату", + "play-sound": "Грати", + "incoming-message": "Вхідне повідомлення", + "outgoing-message": "Вихідне повідомлення", + "upload-new-sound": "Завантажити новий звук", + "saved": "Налаштування зберережні" +} \ No newline at end of file diff --git a/public/language/uk/admin/manage/categories.json b/public/language/uk/admin/manage/categories.json new file mode 100644 index 0000000000..d03162d48f --- /dev/null +++ b/public/language/uk/admin/manage/categories.json @@ -0,0 +1,68 @@ +{ + "settings": "Налаштування категорій", + "privileges": "Права", + + "name": "Назва категорії", + "description": "Опис категорії", + "bg-color": "Колір фону", + "text-color": "Колір тексту", + "bg-image-size": "Розмір фонового зображення", + "custom-class": "Користувацький клас", + "num-recent-replies": "Кількість свіжих відповідей", + "ext-link": "Зовнішнє посилання", + "upload-image": "Завантажити зображення", + "delete-image": "Видалити", + "category-image": "Зображення категорії", + "parent-category": "Батьківська категорія", + "optional-parent-category": "(Необов'язково) Батьківська категорія", + "parent-category-none": "(Жодна)", + "copy-settings": "Взяти налаштування з", + "optional-clone-settings": "(Необов'язково) Взяти налаштування з категорії", + "purge": "Видалити категорію", + + "enable": "Увімкнути", + "disable": "Вимкнути", + "edit": "Редагувати", + + "select-category": "Вибрати категорію", + "set-parent-category": "Встановити батьківську категорію", + + "privileges.description": "У цьому розділі ви можете налаштувати права доступу до категорії. Права можуть надаватися як користувачу так і групі. Ви можете додати користувача до таблиці використовуючи форму пошуку знизу.", + "privileges.warning": "Увага: Налаштування прав миттєво вступають у дію. Необов'язкового зберігати категорію після зміни цих налаштувань.", + "privileges.section-viewing": "Права перегляду", + "privileges.section-posting": "Права постингу", + "privileges.section-moderation": "Права модерації", + "privileges.section-user": "Користувач", + "privileges.search-user": "Додати користувача", + "privileges.no-users": "Для цієї категорії не задано особливих прав.", + "privileges.section-group": "Група", + "privileges.group-private": "Це приватна група", + "privileges.search-group": "Додати групу", + "privileges.copy-to-children": "Копіювати під-категоріям", + "privileges.copy-from-category": "Копіювати з категорії", + "privileges.inherit": "Надаючи права групі registered-users ви неявно надаєте ті ж самі права всім іншим групам, навіть якщо вони явно не відмічені. Це трапляється тому, що всі користувачі входять до групи registered-users.", + + "analytics.back": "Повернутися до списку категорій", + "analytics.title": "Аналітика по категорії \"%1\"", + "analytics.pageviews-hourly": "Рисунок 1 — Погодинна кількість переглядів категорії", + "analytics.pageviews-daily": "Рисунок 2 — Щоденна кількість переглядів категорії", + "analytics.topics-daily": "Рисунок 3 — Щоденна кількість створених тем у категорії", + "analytics.posts-daily": "Рисунок 4 — Щоденна кількість постів у категорії", + + "alert.created": "Створена", + "alert.create-success": "Категорія успішно створена!", + "alert.none-active": "У вас немає активних категорій.", + "alert.create": "Створити категорію", + "alert.confirm-moderate": "Ви точно бажаєте надати права модерування цій групі? Вона є відкритою і будь-хто зможе до неї приєднатися.", + "alert.confirm-purge": "

Ви впевнені, що бажаєте стерти категорію \"%1\"?

Увага! Всі теми та пости в цій категорії буде знищено!

Стирання категорії видалить всі теми та пости і видалить категорію з бази данних. Якщо ви хотіли тимчасово видалити категорію, вам, натомість, варто її просто \"вимкнути\".

", + "alert.purge-success": "Категорію стерто!", + "alert.copy-success": "Налаштування скопійовано!", + "alert.set-parent-category": "Встановити батьківську категорію", + "alert.updated": "Категорії оновлено", + "alert.updated-success": "ID категорій %1 успішно оновлено.", + "alert.upload-image": "Завантажити зображення категорії", + "alert.find-user": "Знайти користувача", + "alert.user-search": "Шукайте користувача тут...", + "alert.find-group": "Знайти групу", + "alert.group-search": "Шукайте групу тут..." +} \ No newline at end of file diff --git a/public/language/uk/admin/manage/flags.json b/public/language/uk/admin/manage/flags.json new file mode 100644 index 0000000000..df1fcb01cb --- /dev/null +++ b/public/language/uk/admin/manage/flags.json @@ -0,0 +1,19 @@ +{ + "daily": "Щоденні скарги", + "by-user": "Скарги за користувачем", + "by-user-search": "Пошук оскаржених постів за іменем користувача", + "category": "Категорія", + "sort-by": "Сортувати за", + "sort-by.most-flags": "Найбільше скарг", + "sort-by.most-recent": "Найсвіжіші", + "search": "Шукати", + "dismiss-all": "Відхилити всі", + "none-flagged": "Скарг немає!", + "posted-in": "Запощено в %1", + "read-more": "Читати далі", + "flagged-x-times": "Цей пост було оскаржено %1 раз(ів):", + "dismiss": "Відхилити цю скаргу", + "delete-post": "Видалити цей пост", + + "alerts.confirm-delete-post": "Ви точно бажаєте видалити цей пост?" +} \ No newline at end of file diff --git a/public/language/uk/admin/manage/groups.json b/public/language/uk/admin/manage/groups.json new file mode 100644 index 0000000000..8287ef6da8 --- /dev/null +++ b/public/language/uk/admin/manage/groups.json @@ -0,0 +1,34 @@ +{ + "name": "Назва групи", + "description": "Опис групи", + "system": "Системна група", + "edit": "Редагувати", + "search-placeholder": "Пошук", + "create": "Створити групу", + "description-placeholder": "Короткий опис вашої групи", + "create-button": "Створити", + + "alerts.create-failure": "Ой

Виникла проблема при створені вашої групи. Будь ласка, спробуйте пізніше!

", + "alerts.confirm-delete": "Ви впевнені, що бажаєте видалити цю групу?", + + "edit.name": "Назва", + "edit.description": "Опис", + "edit.user-title": "Назва учасників", + "edit.icon": "Іконка групи", + "edit.label-color": "Колір іконки групи", + "edit.show-badge": "Показувати бейдж", + "edit.private-details": "Якщо увімкнено, приєднання до групи вимагає підтвердження власника.", + "edit.private-override": "Увага: Приватні групи вимкнено на системному рівні, ця опція нічого не робить.", + "edit.disable-requests": "Вимкнути запити на приєднання", + "edit.hidden": "Прихована", + "edit.hidden-details": "Якщо увімкнено, групу не буде видно в загальному списку і запрошення користувачів потрібно буде здійснювати вручну", + "edit.add-user": "Додати користувача до групи", + "edit.add-user-search": "Пошук користувачів", + "edit.members": "Список учасників", + "control-panel": "Панель керування групами", + "revert": "Повернути", + + "edit.no-users-found": "Користувачів не знайдено", + "edit.confirm-remove-user": "Ви точно бажаєте видалити цього користувача?", + "edit.save-success": "Зміни збережено!" +} \ No newline at end of file diff --git a/public/language/uk/admin/manage/ip-blacklist.json b/public/language/uk/admin/manage/ip-blacklist.json new file mode 100644 index 0000000000..062a21b4dd --- /dev/null +++ b/public/language/uk/admin/manage/ip-blacklist.json @@ -0,0 +1,15 @@ +{ + "lead": "Налаштуйте чорний список IP адрес.", + "description": "Буває так, що бан користувача є недостатною мірою стримування. Іншим разом, заборона доступу до форуму для певної IP адреси або діапазону IP адрес є кращим засобом захисту форуму. У таких випадках ви можете додати проблемні адреси або цілі CIDR блоки до цього чорного списку і їм буде заборонено входити або реєструвати нові акаунти.", + "active-rules": "Активні правила", + "validate": "Перевірити чорний список", + "apply": "Примінити чорний список", + "hints": "Підказки по синтаксису", + "hint-1": "Вкажіть по одній IP адресі на кожен рядок. Ви можете додавати блоки IP адрес, якщо вони відповідні формату CIDR (наприклад, 192.168.100.0/22)", + "hint-2": "Ви можете додавати коментарі вказавши символ # на початку рядку.", + + "validate.x-valid": "%1 із %2 правил вірні.", + "validate.x-invalid": "Наступні %1 правил невірні:", + + "alerts.applied-success": "Чорний список примінено" +} \ No newline at end of file diff --git a/public/language/uk/admin/manage/registration.json b/public/language/uk/admin/manage/registration.json new file mode 100644 index 0000000000..4d0a80bb45 --- /dev/null +++ b/public/language/uk/admin/manage/registration.json @@ -0,0 +1,20 @@ +{ + "queue": "Черга", + "description": "В черзі на реєстрацію немає користувачів.
Щоб активувати цю функцію перейдіть до Налаштування → користувачів та реєстрації і встановіть Тип реєстрації на \"Підтвердження адміна\".", + + "list.name": "Ім'я", + "list.email": "Електронна пошта", + "list.ip": "IP-адреса", + "list.time": "Час", + "list.username-spam": "Частота: %1 Появи: %2 Впевненість: %3", + "list.email-spam": "Частота: %1 Появи: %2", + "list.ip-spam": "Частота: %1 Появи: %2", + + "invitations": "Запрошення", + "invitations.description": "Нижче наведено список надісланих запрошень. Використовуйте Ctrl+F щоб здійснити пошук за поштою чи іменем користувача.

Ім'я користувача буде показано справа від електронної пошти для тих користувачів, що використали свої запрошення.", + "invitations.inviter-username": "Ім'я запрошувача", + "invitations.invitee-email": "Електронна пошта запрошуваного", + "invitations.invitee-username": "Ім'я запрошуваного (якщо зареєстрований)", + + "invitations.confirm-delete": "Ви впевнені, що бажаєте видалити це запрошення?" +} \ No newline at end of file diff --git a/public/language/uk/admin/manage/tags.json b/public/language/uk/admin/manage/tags.json new file mode 100644 index 0000000000..6638741f36 --- /dev/null +++ b/public/language/uk/admin/manage/tags.json @@ -0,0 +1,18 @@ +{ + "none": "Жодна тема на вашому форумі ще не має тегів.", + "bg-color": "Колір фону", + "text-color": "Колір тексту", + "create-modify": "Створити та змінити теги", + "description": "Виберіть теги тиснучи або перетягуючи. Використовуйте Shift, щоб обрати декілька.", + "create": "Створити тег", + "modify": "Змінити тег", + "delete": "Видалити вибрані теги", + "search": "Пошук тегів...", + "settings": "Натисніть тут щоб перейти на сторінку налаштування тегів.", + "name": "Назва тегу", + + "alerts.editing-multiple": "Редагування декількох тегів", + "alerts.editing-x": "Редагування тегу \"%1\"", + "alerts.confirm-delete": "Бажаєте видалити декілька тегів?", + "alerts.update-success": "Тег оновлено!" +} \ No newline at end of file diff --git a/public/language/uk/admin/manage/users.json b/public/language/uk/admin/manage/users.json new file mode 100644 index 0000000000..9de068acca --- /dev/null +++ b/public/language/uk/admin/manage/users.json @@ -0,0 +1,91 @@ +{ + "users": "Користувачі", + "edit": "Редагувати", + "make-admin": "Створити адміна", + "remove-admin": "Видалити адміна", + "validate-email": "Підтвердити електронну адресу", + "send-validation-email": "Надіслати підтверджувального листа", + "password-reset-email": "Надіслати скидання паролю", + "ban": "Забанити", + "temp-ban": "Забанити тимчасово", + "unban": "Розбанити", + "reset-lockout": "Скинути блокування", + "reset-flags": "Скинути скарги", + "delete": "Видалити", + "purge": "Видалити разом зі змістом", + "download-csv": "Скачати CSV", + "invite": "Запросити", + "new": "Новий користувач", + + "pills.latest": "Останні користувачі", + "pills.unvalidated": "Не підтвердженні", + "pills.no-posts": "Без постів", + "pills.top-posters": "Кращі автори", + "pills.top-rep": "Найбільша репутація", + "pills.inactive": "Неактивні", + "pills.flagged": "Найбільш оскаржувані", + "pills.banned": "Забанені", + "pills.search": "Пошук користувачів", + + "search.username": "За іменем", + "search.username-placeholder": "Введіть ім'я для пошуку", + "search.email": "За поштою", + "search.email-placeholder": "Введіть пошту для пошуку", + "search.ip": "За IP адресою", + "search.ip-placeholder": "Введіть IP адресу для пошуку", + "search.not-found": "Користувача не знайдено!", + + "inactive.3-months": "3 місяці", + "inactive.6-months": "6 місяців", + "inactive.12-months": "12 місяців", + + "users.uid": "uid", + "users.username": "ім'я", + "users.email": "email", + "users.postcount": "постів", + "users.reputation": "репутація", + "users.flags": "скарги", + "users.joined": "приєднався", + "users.last-online": "востаннє в мережі", + "users.banned": "забанений", + + "create.username": "Ім'я користувача", + "create.email": "Електронна пошта", + "create.email-placeholder": "Електронна пошта користувача", + "create.password": "Пароль", + "create.password-confirm": "Пароль ще раз", + + "temp-ban.length": "Тривалість бану", + "temp-ban.reason": "Причина (необов'язково)", + "temp-ban.hours": "Години", + "temp-ban.days": "Дні", + "temp-ban.explanation": "Уведіть тривалість бану. 0 означатиме постійний бан.", + + "alerts.confirm-ban": "Ви впевнені, що бажаєте забанити цього користувача напостійно?", + "alerts.confirm-ban-multi": "Ви впевнені, що бажаєте забанити цих користувачів напостійно?", + "alerts.ban-success": "Користувачів забанено!", + "alerts.button-ban-x": "Забанити %1 користувачів", + "alerts.unban-success": "Користувачів забанено!", + "alerts.lockout-reset-success": "Блокування скинуто!", + "alerts.flag-reset-success": "Скарги скинуто!", + "alerts.no-remove-yourself-admin": "Ви не можете видалити себе як адміна!", + "alerts.make-admin-success": "Користувачі тепер адміністратори.", + "alerts.confirm-remove-admin": "Ви точно бажаєте видалити адмінів?", + "alerts.remove-admin-success": "Користувачі більше не адміністратори.", + "alerts.confirm-validate-email": "Ви точно бажаєте підтвердити електронні пошти цих користувачів?", + "alerts.validate-email-success": "Електронні пошти підтверджено", + "alerts.password-reset-confirm": "Ви точно бажаєте скинути паролі цим користувачам електронною поштою?", + "alerts.confirm-delete": "Увага!
Ви точно бажаєте видалити користувача(ів)?
Ця дія незворотня! Будуть видалені лише акаунти, пости та теми залишаться.", + "alerts.delete-success": "Користувачів видалено!", + "alerts.confirm-purge": "Увага!
Ви точно бажаєте видалити користувача(ів) на їх зміст?
Ця дія незворотня! Будуть видалені всі дані та зміст користувача!", + "alerts.create": "Створити користувача", + "alerts.button-create": "Створити", + "alerts.button-cancel": "Відмінити", + "alerts.error-passwords-different": "Паролі мають співпадати!", + "alerts.error-x": "Помилка

%1

", + "alerts.create-success": "Користувача створено!", + + "alerts.prompt-email": "Електронна пошта:", + "alerts.email-sent-to": "Запрошення надіслано за адресою %1", + "alerts.x-users-found": "%1 користувач(ів) знайдено! Пошук тривав %2 мс." +} \ No newline at end of file diff --git a/public/language/uk/admin/menu.json b/public/language/uk/admin/menu.json new file mode 100644 index 0000000000..ecfcd73b14 --- /dev/null +++ b/public/language/uk/admin/menu.json @@ -0,0 +1,74 @@ +{ + "section-general": "Загальні", + "general/dashboard": "Панель приладів", + "general/homepage": "Головна", + "general/navigation": "Навігація", + "general/languages": "Мови", + "general/sounds": "Звуки", + "general/social": "Соціальні", + + "section-manage": "Керування", + "manage/categories": "Категорії", + "manage/tags": "Теги", + "manage/users": "Користувачі", + "manage/registration": "Черга реєстрації", + "manage/groups": "Групи", + "manage/ip-blacklist": "Чорний список IP-адрес", + + "section-settings": "Налаштування", + "settings/general": "Загальні", + "settings/reputation": "Репутація", + "settings/email": "Електронна пошта", + "settings/user": "Користувач", + "settings/group": "Група", + "settings/guest": "Гості", + "settings/uploads": "Завантаження", + "settings/post": "Пост", + "settings/chat": "Чат", + "settings/pagination": "Пагінація", + "settings/tags": "Теги", + "settings/notifications": "Сповіщення", + "settings/cookies": "Куки", + "settings/web-crawler": "Роботи", + "settings/sockets": "Сокети", + "settings/advanced": "Розширені", + + "settings.page-title": "Налаштування %1", + + "section-appearance": "Зовнішній вигляд", + "appearance/themes": "Теми", + "appearance/skins": "Стилі", + "appearance/customise": "Користувацькі HTML та CSS", + + "section-extend": "Розширити", + "extend/plugins": "Плагіни", + "extend/widgets": "Віджети", + "extend/rewards": "Нагороди", + + "section-social-auth": "Авторизація соцмережами", + + "section-plugins": "Плагіни", + "extend/plugins.install": "Встановити плагіни", + + "section-advanced": "Розширені", + "advanced/database": "База даних", + "advanced/events": "Події", + "advanced/logs": "Логи", + "advanced/errors": "Помилки", + "advanced/cache": "Кеш", + "development/logger": "Логування", + "development/info": "Інформація", + + "reload-forum": "Перевантажити форум", + "restart-forum": "Перезавантажити форум", + "logout": "Вийти", + "view-forum": "Переглянути форум", + + "search.placeholder": "Пошук...", + "search.no-results": "Без результатів...", + "search.search-forum": "Шукати на форумі ", + "search.keep-typing": "Для результатів, надрукуйте ще...", + "search.start-typing": "Для результатів, почніть друкувати...", + + "connection-lost": "З'єднання з %1 було втрачено, намагаємось під'єднатись знов..." +} \ No newline at end of file diff --git a/public/language/uk/admin/settings/advanced.json b/public/language/uk/admin/settings/advanced.json new file mode 100644 index 0000000000..6f27dfebd2 --- /dev/null +++ b/public/language/uk/admin/settings/advanced.json @@ -0,0 +1,19 @@ +{ + "maintenance-mode": "Режим обслуговування", + "maintenance-mode.help": "Коли форум знаходиться в режимі обслуговування, всі запити перенаправляються на статичну сторінку. Адміністратори, в свою чергу, не перенаправляються і можуть відвідувати сайт у звичному режимі.", + "maintenance-mode.message": "Повідомлення обслуговування", + "headers": "Заголовки", + "headers.allow-from": "Задати ALLOW-FROM для розміщення NodeBB в iFrame", + "headers.powered-by": "Налаштувати заголовок \"Powered By\", котрий відправляє NodeBB", + "headers.acao": "Access-Control-Allow-Origin", + "headers.acao-help": "Щоб заборонити доступ для всіх сайтів, залиште пустим або вкажіть null", + "headers.acam": "Access-Control-Allow-Methods", + "headers.acah": "Access-Control-Allow-Headers", + "traffic-management": "Керування трафіком", + "traffic.help": "NodeBB має модуль автоматичного відхилення запитів у разі надмірного напливу користувачів. Ви можете налаштувати цей модуль тут, хоча типові налаштування є достатньо дієвими.", + "traffic.enable": "Увімкнути керування трафіком", + "traffic.event-lag": "Затримка циклу обробки дій (в мілісекундах)", + "traffic.event-lag-help": "Зменшення цього значення прискорює час завантаження сторінок, але в той же час більше користувачів будуть отримувати повідомлення про \"надмірне навантаження\". (Потребує перезавантаження)", + "traffic.lag-check-interval": "Інтервал перевірки (в мілісекундах)", + "traffic.lag-check-interval-help": "Зменшення цього значення робить NodeBB більш чутливим до піків навантаження, але може зробити перевірку занадто чутливою. (Потребує перезавантаження)" +} \ No newline at end of file diff --git a/public/language/uk/admin/settings/chat.json b/public/language/uk/admin/settings/chat.json new file mode 100644 index 0000000000..01bc8f124d --- /dev/null +++ b/public/language/uk/admin/settings/chat.json @@ -0,0 +1,9 @@ +{ + "chat-settings": "Налаштування чату", + "disable": "Вимкнути чат", + "disable-editing": "Вимкнути редагування/видалення повідомлень чату", + "disable-editing-help": "Адміністратори на модератори звільнені від цього обмеження", + "max-length": "Максимальна довжина повідомлення", + "max-room-size": "Максимальна кількість людей у кімнаті", + "delay": "Час між повідомленнями в мілісекундах" +} \ No newline at end of file diff --git a/public/language/uk/admin/settings/cookies.json b/public/language/uk/admin/settings/cookies.json new file mode 100644 index 0000000000..1205e38819 --- /dev/null +++ b/public/language/uk/admin/settings/cookies.json @@ -0,0 +1,11 @@ +{ + "eu-consent": "Згода ЄС", + "consent.enabled": "Увімкнено", + "consent.message": "Текст сповіщення", + "consent.acceptance": "Текст погодження", + "consent.link-text": "Текст посилання на політику", + "consent.blank-localised-default": "Залишити пустими, щоб використати стандартні локалізовані тексти NodeBB", + "settings": "Налаштування", + "cookie-domain": "Домен куки сесії", + "blank-default": "Залишити пустим для налаштувань за замовченням" +} \ No newline at end of file diff --git a/public/language/uk/admin/settings/email.json b/public/language/uk/admin/settings/email.json new file mode 100644 index 0000000000..4bf8f18180 --- /dev/null +++ b/public/language/uk/admin/settings/email.json @@ -0,0 +1,25 @@ +{ + "email-settings": "Налаштування електронної пошти", + "address": "Електронна пошта", + "address-help": "Отримувачі будуть бачити цю адресу в полях \"From\" та \"Reply To\".", + "from": "Ім'я відправника", + "from-help": "Ім'я відправника, що буде показано в електронних листах", + "gmail-routing": "Маршрутизація Gmail", + "gmail-routing-help1": "До нас надходили звіти про те, що маршрутизація Gmail не працює на аканутах з підвищеною безпекою. У таких випадках вам потрібно дозволити менш безпечні додатки у своєму Gmail акаунті.", + "gmail-routing-help2": "Щоб дізнатися більше про цей обхідний шлях, прочитайте цю статтю на NodeMailer. Альтернативою буде використання сторонніх плагінів для листування як то SendGrid, Mailgun, тощо. Переглянути наявні плагіни тут.", + "gmail-transport": "Маршрутизувати листи через акаунт Gmail або Google Apps", + "gmail-transport.username": "Ім'я користувача", + "gmail-transport.username-help": "Вкажіть тут повну електронну адресу, особливо якщо ви використовуєте керований домен Google Apps.", + "gmail-transport.password": "Пароль", + "template": "Редагувати шаблон листа", + "template.select": "Обрати шаблон листа", + "template.revert": "Повернути до оригіналу", + "testing": "Тестування листа", + "testing.select": "Оберіть шаблон листа", + "testing.send": "Надіслати тестового листа", + "testing.send-help": "Тестовий лист було направлено на адресу поточного користувача.", + "subscriptions": "Підписки", + "subscriptions.disable": "Вимкнути сповіщення підписників", + "subscriptions.hour": "Година дайджесту", + "subscriptions.hour-help": "Вкажіть, будь ласка, годину о котрій кожного дня буде надсилатися дайджест (наприклад 0 — це північ, а 17 — п'ята година вечора). Зверніть увагу, що година визначається згідно налаштувань сервера і може не співпадати з часом вашого комп'ютера.
Приблизний час сервера:
Наступний дайджест заплановано до відправки " +} \ No newline at end of file diff --git a/public/language/uk/admin/settings/general.json b/public/language/uk/admin/settings/general.json new file mode 100644 index 0000000000..72ff0d6fd9 --- /dev/null +++ b/public/language/uk/admin/settings/general.json @@ -0,0 +1,31 @@ +{ + "site-settings": "Налаштування сайту", + "title": "Назва сайту", + "title.name": "Назва вашої спільноти", + "title.show-in-header": "Показувати заголовок сайту в шапці", + "browser-title": "Заголовок браузера", + "browser-title-help": "Якщо не задано заголовок браузера, буде використано заголовок сайту", + "title-layout": "Структура заголовка", + "title-layout-help": "Визначте як заголовок браузера буде сформовано, наприклад {pageTitle} | {browserTitle}", + "description.placeholder": "Короткий опис вашої спільноти", + "description": "Опис сайту", + "keywords": "Ключові слова сайту", + "keywords-placeholder": "Ключові слова, що описують вашу спільноту, розділені комами", + "logo": "Логотип сайту", + "logo.image": "Зображення", + "logo.image-placeholder": "Шлях до логотипу для відображення в шапці форуму", + "logo.upload": "Завантажити", + "logo.url": "URL", + "logo.url-placeholder": "URL логотипу сайту", + "logo.url-help": "По кліку на логотип, направляти користувача за цією адресою. Якщо залишити пустим, користувач буде направлений в корінь сайту.", + "logo.alt-text": "Текст alt", + "log.alt-text-placeholder": "Альтернативний текст для доступності", + "favicon": "Фавіконка", + "favicon.upload": "Завантажити", + "touch-icon": "Сенсорна іконка", + "touch-icon.upload": "Завантажити", + "touch-icon.help": "Рекомендовані розмір та формат: 192x192, PNG. Якщо сенсорна іконка не задана, буде використано фавіконку NodeBB.", + "outgoing-links": "Зовнішні посилання", + "outgoing-links.warning-page": "Використовувати сторінку попередження про зовнішній перехід", + "search-default-sort-by": "Типовий порядок результатів пошуку" +} \ No newline at end of file diff --git a/public/language/uk/admin/settings/group.json b/public/language/uk/admin/settings/group.json new file mode 100644 index 0000000000..25aa9f7151 --- /dev/null +++ b/public/language/uk/admin/settings/group.json @@ -0,0 +1,12 @@ +{ + "general": "Загальні", + "private-groups": "Приватні групи", + "private-groups.help": "Якщо увімкнено, приєднання до групи вимагає підтвердження власника (По замовчуванню: увімкнено)", + "private-groups.warning": "Увага! Якщо ця опція вимикається і у вас є приватні групи, вони автоматично стають публічними.", + "allow-creation": "Дозволити створення груп", + "allow-creation-help": "Якщо увімкнено, користувачі можуть створювати групи (По замовчуванню: вимкнено)", + "max-name-length": "Максимальна довжина імені групи", + "cover-image": "Зображення обкладинки групи", + "default-cover": "Зображення обкладинки по замовчуванню", + "default-cover-help": "Вкажіть розділені комами зображення обкладинок, що будуть використовуватись по замовчуванню для груп, що не завантажили власних" +} \ No newline at end of file diff --git a/public/language/uk/admin/settings/guest.json b/public/language/uk/admin/settings/guest.json new file mode 100644 index 0000000000..4de7ce14dd --- /dev/null +++ b/public/language/uk/admin/settings/guest.json @@ -0,0 +1,8 @@ +{ + "handles": "Гостьові імена", + "handles.enabled": "Дозволити гостьові імена", + "handles.enabled-help": "Ця опція надає додаткове поле, що дозволяє гостям обрати собі ім'я для кожного посту. Якщо вимкнено, вони будуть просто зватися \"Гість\"", + "privileges": "Привілеї гостей", + "privileges.can-search": "Дозволити гостьовий пошук без входу", + "privileges.can-search-users": "Дозволити гостям пошук по користувачам без входу" +} \ No newline at end of file diff --git a/public/language/uk/admin/settings/notifications.json b/public/language/uk/admin/settings/notifications.json new file mode 100644 index 0000000000..68634d4721 --- /dev/null +++ b/public/language/uk/admin/settings/notifications.json @@ -0,0 +1,5 @@ +{ + "notifications": "Сповіщення", + "welcome-notification": "Сповіщення \"Ласкаво просимо\"", + "welcome-notification-link": "Посилання для сповіщення \"Ласкаво просимо\"" +} \ No newline at end of file diff --git a/public/language/uk/admin/settings/pagination.json b/public/language/uk/admin/settings/pagination.json new file mode 100644 index 0000000000..9efd986db3 --- /dev/null +++ b/public/language/uk/admin/settings/pagination.json @@ -0,0 +1,9 @@ +{ + "pagination": "Налаштування пагінації", + "enable": "Розбивати список тем та постів на сторінки замість нескінченної прокрутки", + "topics": "Пагінація тем", + "posts-per-page": "Постів на сторінку", + "categories": "Пагінація категорій", + "topics-per-page": "Тем на сторінку", + "initial-num-load": "Початкова кількість тем для завантаження в Непрочитаних, Недавніх та Популярних" +} \ No newline at end of file diff --git a/public/language/uk/admin/settings/post.json b/public/language/uk/admin/settings/post.json new file mode 100644 index 0000000000..77034cbf9c --- /dev/null +++ b/public/language/uk/admin/settings/post.json @@ -0,0 +1,44 @@ +{ + "sorting": "Сортування постів", + "sorting.post-default": "Типове сортування постів", + "sorting.oldest-to-newest": "Старі > Нові", + "sorting.newest-to-oldest": "Нові > Старі", + "sorting.most-votes": "Кількість голосів", + "sorting.topic-default": "Типове сортування тем", + "restrictions": "Обмеження постингу", + "restrictions.seconds-between": "Кількість секунд між постами", + "restrictions.seconds-between-new": "Кількість секунд між постами для нових користувачів", + "restrictions.rep-threshold": "Репутація, при якій зі обмеження буде знято", + "restrictions.seconds-defore-new": "Кількість секунд до першого посту для нового користувача", + "restrictions.seconds-edit-after": "Кількість секунд протягом яких користувач може редагувати пост після відправки. (0 — вимкнено)", + "restrictions.seconds-delete-after": "Кількість секунд протягом яких користувач може видалити пост після відправки. (0 — вимкнено)", + "restrictions.replies-no-delete": "Кількість відповідей після котрих користувач не зможе видалити власну тему. (0 — вимкнено)", + "restrictions.min-title-length": "Мінімальна довжина заголовку", + "restrictions.max-title-length": "Максимальна довжина заголовку", + "restrictions.min-post-length": "Мінімальна довжина посту", + "restrictions.max-post-length": "Максимальна довжина посту", + "restrictions.days-until-stale": "Кількість днів після яких тема буде вважатися застарілою", + "restrictions.stale-help": "Якщо тема є \"застарілою\", то для користувачів, що бажають відповісти на неї буде показано попередження.", + "timestamp": "Часова мітка", + "timestamp.cut-off": "Обрізка дат (в днях)", + "timestamp.cut-off-help": "Дата і час показуються відносно (тобто \"3 години тому\" / \"5 днів тому\"). Після певного періоду часу, цей текст може бути змінено на звичайну дати (тобто 5 Лис 2016 15:30).
(Типово: 30, або один місяць). Вкажіть 0, щоб завжди показувати дати або залиште пустим, щоб завжди показувати відносний час.", + "teaser": "Пост тизер", + "teaser.last-post": "Останній — показувати останній пост або перший, якщо немає відповідей", + "teaser.last-reply": "Останній — показувати останній пост або \"Немає відповідей\", якщо немає відповідей", + "teaser.first": "Перший", + "unread": "Налаштування непрочитаних", + "unread.cutoff": "За скільки днів показувати непрочитані", + "unread.min-track-last": "Мінімальна кількість постів у темі перш ніж відслідковувати останні прочитані", + "signature": "Налаштування підписів", + "signature.disable": "Вимкнути підписи", + "signature.no-links": "Вимкнути посилання в підписах", + "signature.no-images": "Вимкнути зображення в підписах", + "signature.max-length": "Максимальна довжина підпису", + "composer": "Налаштування редактора", + "composer-help": "Ці налаштування керують функціональністю та виглядом редактору постів для користувачів коли вони створюють нові теми або відповідають на існуючі.", + "composer.show-help": "Показувати вкладку \"Довідка\"", + "composer.enable-plugin-help": "Дозволити плагінам додавати зміст довідки", + "composer.custom-help": "Користувацький текст довідки", + "ip-tracking": "Відстеження IP", + "ip-tracking.each-post": "Відстежувати IP адреси для кожного посту" +} \ No newline at end of file diff --git a/public/language/uk/admin/settings/reputation.json b/public/language/uk/admin/settings/reputation.json new file mode 100644 index 0000000000..3feb96319e --- /dev/null +++ b/public/language/uk/admin/settings/reputation.json @@ -0,0 +1,8 @@ +{ + "reputation": "Налаштування репутації", + "disable": "Вимкнути систему репутації", + "disable-down-voting": "Вимкнути голосування проти", + "thresholds": "Допуски активності", + "min-rep-downvote": "Мінімальна репутація для голосування проти постів", + "min-rep-flag": "Мінімальна репутація для подання скарг на пости" +} \ No newline at end of file diff --git a/public/language/uk/admin/settings/sockets.json b/public/language/uk/admin/settings/sockets.json new file mode 100644 index 0000000000..8ff97b7761 --- /dev/null +++ b/public/language/uk/admin/settings/sockets.json @@ -0,0 +1,6 @@ +{ + "reconnection": "Налаштування перепідключення", + "max-attempts": "Максимальна кількість спроб перепідключення", + "default-placeholder": "По замовчуванню: %1", + "delay": "Затримка перепідключення" +} \ No newline at end of file diff --git a/public/language/uk/admin/settings/tags.json b/public/language/uk/admin/settings/tags.json new file mode 100644 index 0000000000..d1bdbbd82c --- /dev/null +++ b/public/language/uk/admin/settings/tags.json @@ -0,0 +1,12 @@ +{ + "tag": "Налаштування тегів", + "min-per-topic": "Мінімальна кількість тегів для теми", + "max-per-topic": "Максимальна кількість тегів для теми", + "min-length": "Мінімальна довжина тега", + "max-length": "Максимальна довжина тега", + "goto-manage": "Натисніть тут, щоб перейти на сторінку налаштування тегів.", + "privacy": "Приватність", + "list-private": "Зробити список тегів приватним", + "related-topics": "Пов'язані теми", + "max-related-topics": "Максимальна кількість пов'язаних тем до показу (якщо підтримується темою)" +} \ No newline at end of file diff --git a/public/language/uk/admin/settings/uploads.json b/public/language/uk/admin/settings/uploads.json new file mode 100644 index 0000000000..a9dfe9c1f6 --- /dev/null +++ b/public/language/uk/admin/settings/uploads.json @@ -0,0 +1,28 @@ +{ + "posts": "Пости", + "allow-files": "Дозволити користувачам завантажувати звичайні файли", + "private": "Зробити завантажувані файли приватними", + "max-image-width": "Змінювати розмір зображень до заданої ширини (в пікселях)", + "max-image-width-help": "(в пікселях, 760 — за замовчуванням, 0 — вимкнути)", + "max-file-size": "Максимальний розмір файлу (в КіБ)", + "max-file-size-help": "(в кілобайтах, 2048 — за замовчуванням)", + "allow-topic-thumbnails": "Дозволити користувачам завантажувати мініатюри тем", + "topic-thumb-size": "Розмір мініатюри теми", + "allowed-file-extensions": "Допустимі розширення файлів", + "allowed-file-extensions-help": "Вкажіть розширеня файлів розділені комою (наприклад, pdf,xls,doc). Пустий список дає дозвіл на будь-які розширення.", + "profile-avatars": "Аватарки профілів", + "allow-profile-image-uploads": "Дозволити користувачам завантажувати зображення профілю", + "convert-profile-image-png": "Конвертувати завантажувані зображення профілю в PNG", + "default-avatar": "Аватар за замовчуванням", + "upload": "Завантаження", + "profile-image-dimension": "Розміри зображення профілю", + "profile-image-dimension-help": "(в пікселях, 128 — за замовчуванням)", + "max-profile-image-size": "Максимальний розмір файлу зображення профілю", + "max-profile-image-size-help": "(в кілобайтах, 256 — за замовчуванням)", + "max-cover-image-size": "Максимальний розмір файлу зображення обкладинки", + "max-cover-image-size-help": "(в кілобайтах, 2048 — за замовчуванням)", + "keep-all-user-images": "Зберігати старі версію зображень аватарки та обкладинки на сервері", + "profile-covers": "Обкладинки профілю", + "default-covers": "Обкладинка за замовчуванням", + "default-covers-help": "Вкажіть розділені комами зображення обкладинок за замовчуванням для акаунтів, що не завантажували власних" +} diff --git a/public/language/uk/admin/settings/user.json b/public/language/uk/admin/settings/user.json new file mode 100644 index 0000000000..263df1745b --- /dev/null +++ b/public/language/uk/admin/settings/user.json @@ -0,0 +1,59 @@ +{ + "authentication": "Аутентифікація", + "allow-local-login": "Дозволити локальний вхід", + "require-email-confirmation": "Вимагати підтвердження електронної пошти", + "email-confirm-interval": "Користувач не може повторно надіслати підтвердження електронної пошти поки не мине", + "email-confirm-email2": "хвилин", + "allow-login-with": "Дозволити вхід використовуючи", + "allow-login-with.username-email": "Ім'я користувача або електронну пошту", + "allow-login-with.username": "Тільки ім'я користувача", + "allow-login-with.email": "Тільки електронну пошту", + "account-settings": "Налаштування акаунту", + "disable-username-changes": "Вимкнути зміну імені користувача", + "disable-email-changes": "Вимкнути зміну електронної пошти", + "disable-password-changes": "Вимкнути зміну пароля", + "allow-account-deletion": "Дозволити видалення акаунту", + "user-info-private": "Зробити інформацію користувачів приватною", + "themes": "Теми", + "disable-user-skins": "Заборонити користувачам обирати стиль сайту", + "account-protection": "Захист акаунту", + "login-attempts": "Кількість спроб входу за годину", + "login-attempts-help": "Якщо кількість спроб входу в акаунт користувача перевищить цей ліміт, акаунт буде заблоковано на задану кількість часу", + "lockout-duration": "Тривалість блокування акаунту (хвилин)", + "login-days": "Скільки днів пам'ятати сесію користувача", + "password-expiry-days": "Скидати пароль користувачам після заданої кількості днів", + "registration": "Реєстрація користувачів", + "registration-type": "Тип реєстрації", + "registration-type.normal": "Стандартна", + "registration-type.admin-approval": "Підтвердження адміна", + "registration-type.admin-approval-ip": "Підтвердження адміна для IP-адрес", + "registration-type.invite-only": "По запрошенню", + "registration-type.admin-invite-only": "По запрошенню адміна", + "registration-type.disabled": "Без реєстрації", + "registration-type.help": "Стандартна — користувачі можуть реєструватись на сторінці /register.
\nПідтвердження адміна — реєстрації користувачів потрапляють до адмінської черги на підтвердження.
\nПідтвердження адміна для IP-адрес — стандартна для нових користувачів і підтвердження адміністратора для IP-адрес для котрих уже створено акаунт.
\nПо запрошенню — користувачі можуть запрошувати інших зі сторінки users.
\nПо запрошенню адміна — лише адміністратори мошуть запрошувати інших зі сторінок users та admin/manage/users.
\nБез реєстрації — реєстрація вимкнена.
", + "registration.max-invites": "Кількість запрошень на користувача", + "max-invites": "Кількість запрошень на користувача", + "max-invites-help": "0 — без обмежень. Адміни отримуют необмежену кількість.
Працює лише з типом реєстрації \"По запрошенню\".", + "min-username-length": "Мінімальна довжина імені користувача", + "max-username-length": "Максимальна довжина імені користувача", + "min-password-length": "Мінімальна довжина пароля", + "max-about-me-length": "Максимальна довжина розділу \"Про мене\"", + "terms-of-use": "Умови користування форумом (Залиште пустим, щоб вимкнути)", + "user-search": "Пошук користувачів", + "user-search-results-per-page": "Кількість результатів до показу", + "default-user-settings": "Налаштування користувача за замовчуванням", + "show-email": "Показувати електронну пошту", + "show-fullname": "Показувати повне ім'я", + "restrict-chat": "Дозволяти чат повідомлення лише від користувачів за якими я стежу", + "outgoing-new-tab": "Відкривати зовнішні посилання у новій вкладці", + "topic-search": "Увімкнути пошук у темах", + "digest-freq": "Підписатися на дайджест", + "digest-freq.off": "Ніколи", + "digest-freq.daily": "Щоденно", + "digest-freq.weekly": "Щотижнево", + "digest-freq.monthly": "Щомісячно", + "email-chat-notifs": "Надсилати листа, коли я не в мережі, якщо приходить чат повідомлення", + "email-post-notif": "Надсилати листа, коли в темах на які я підписаний з'являються відповіді", + "follow-created-topics": "Стежити за темами які ви створюєте", + "follow-replied-topics": "Стежити за темами в котрих ви відповідаєте" +} \ No newline at end of file diff --git a/public/language/uk/admin/settings/web-crawler.json b/public/language/uk/admin/settings/web-crawler.json new file mode 100644 index 0000000000..f6f3a4b541 --- /dev/null +++ b/public/language/uk/admin/settings/web-crawler.json @@ -0,0 +1,10 @@ +{ + "crawlability-settings": "Налаштування можливості сканування", + "robots-txt": "Користувацький Robots.txt Залишити пустим для налаштувань за замовчуванням", + "sitemap-feed-settings": "Налаштування мапи сайту та стрічки оновлень", + "disable-rss-feeds": "Вимкнути RSS-стрічки", + "disable-sitemap-xml": "Вимкнути Sitemap.xml", + "sitemap-topics": "Кількість тем для показу в мапі сайту", + "clear-sitemap-cache": "Очистити кеш мапи сайту", + "view-sitemap": "Переглянути мапу сайту" +} \ No newline at end of file diff --git a/public/language/uk/category.json b/public/language/uk/category.json new file mode 100644 index 0000000000..bdd53de08b --- /dev/null +++ b/public/language/uk/category.json @@ -0,0 +1,20 @@ +{ + "category": "Категорія", + "subcategories": "Підкатегорія", + "new_topic_button": "Новий запис", + "guest-login-post": "Увійдіть, щоб постити", + "no_topics": " У цій категорії немає жодної теми.
Чому б вам не створити першу?", + "browsing": "переглядають", + "no_replies": "Немає відповідей", + "no_new_posts": "Немає нових постів.", + "share_this_category": "Поділитися цією категорією", + "watch": "Стежити", + "ignore": "Ігнорувати", + "watching": "Відстежується", + "ignoring": "Ігнорувати", + "watching.description": "Показати тему в непрочитаних", + "ignoring.description": "Не показувати тему в непрочитаних", + "watch.message": "Ви переглядаєте оновлення цієї категорії та підкатегорії", + "ignore.message": "Ви ігноруєте оновлення цієї категорії та її підкатегорій", + "watched-categories": "Переглянуті категорії" +} \ No newline at end of file diff --git a/public/language/uk/email.json b/public/language/uk/email.json new file mode 100644 index 0000000000..48574768db --- /dev/null +++ b/public/language/uk/email.json @@ -0,0 +1,36 @@ +{ + "password-reset-requested": "Отриман запит на відновлення паролю - %1!", + "welcome-to": "Ласкаво просимо до %1", + "invite": "Запрошення від %1", + "greeting_no_name": "Привіт", + "greeting_with_name": "Привіт %1", + "welcome.text1": "Дякуємо за реєстрацію з %1!", + "welcome.text2": "Щоб повністю активувати ваш аккаунт, нам потрібно верефікувати володіння е-мейлом, який ви вказали при реєстрації ", + "welcome.text3": "Адміністратор схвалив ваш запит на реєстрацію. Ви можете залогінитись, використовуючи свій пароль та назву аккаунту", + "welcome.cta": "Натисніть тут, щоб підтвердити вашу скриньку", + "invitation.text1": "%1 запросив вас приєднатися до %2", + "invitation.ctr": "Натисніть тут, щоб створити аккаунт", + "reset.text1": "Ми отримали запит на відновлення вашого паролю, можливо тому, что ви його забули. Якщо це не потрібно - проігноруйте цей лист", + "reset.text2": "Щоб продовжити відновлення паролю, будь ласка, перейдіть за посиланням", + "reset.cta": "Натисніть щоб скинути Ваш пароль", + "reset.notify.subject": "Пароль змінено", + "reset.notify.text1": "Ми повідомляємо вас, що на %1, ваш пароль було змінено", + "reset.notify.text2": "Якщо ви не авторизували це, повідомте негайно адміністратора", + "digest.notifications": "Ви маєте нове повідомлення від %1:", + "digest.latest_topics": "Останні теми від %1", + "digest.cta": "Натисніть, щоб відвідати %1", + "digest.unsub.info": "Цей дайджест був вислан вам, згідно ваших налаштувань підписки", + "digest.no_topics": "Не було активних тем, за останні %1", + "digest.day": "день", + "digest.week": "тиждень", + "digest.month": "місяць", + "digest.subject": "Дайджест для %1", + "notif.chat.subject": "Новє повідомлення чату було отриманно від %1", + "notif.chat.cta": "Натисніть тут, щоб продовжити розмову", + "notif.chat.unsub.info": "Це повідомлення чату було вислано вам, згідно ваших налаштувань підписки", + "notif.post.cta": "Натисніть тут, щоб повністю прочитати статтю", + "notif.post.unsub.info": "Це повідомлення пошти було вислано вам, згідно ваших налаштувань підписки", + "test.text1": "Це пробний лист, для верифікації адресату. Всі налаштування вірні для NodeBB.", + "unsub.cta": "Натисніть тут, щоб змінити ці налаштування", + "closing": "Дякуємо!" +} \ No newline at end of file diff --git a/public/language/uk/error.json b/public/language/uk/error.json new file mode 100644 index 0000000000..286eb36767 --- /dev/null +++ b/public/language/uk/error.json @@ -0,0 +1,131 @@ +{ + "invalid-data": "Невірні дані", + "not-logged-in": "Не схоже, що ви увійшли в систему.", + "account-locked": "Ваш акаунт тимчасово заблоковано", + "search-requires-login": "Для пошуку потрібен акаунт — будь ласка, увійдіть чи зареєструйтесь.", + "invalid-cid": "Невірний ID категорії", + "invalid-tid": "Невірний ID теми", + "invalid-pid": "Невірний ID поста", + "invalid-uid": "Невірний ID користувача", + "invalid-username": "Невірне ім'я користувача", + "invalid-email": "Невірна електронна адреса", + "invalid-title": "Невірний заголовок!", + "invalid-user-data": "Невірні користувацькі дані", + "invalid-password": "Невірний пароль", + "invalid-username-or-password": "Вкажіть, будь ласка, ім'я користувача та пароль", + "invalid-search-term": "Невірний пошуковий запит", + "csrf-invalid": "Нам не вдалося вас пустити, ймовірно, через прострочену сесію. Будь ласка, спробуйте ще раз", + "invalid-pagination-value": "Невірне значення сторінки, має бути щонайменше %1 та щонайбільше %2", + "username-taken": "Це ім'я зайняте", + "email-taken": "Ця електронна пошта зайнята", + "email-not-confirmed": "Ваша електронна пошта ще не підтверджена, натисніть тут, щоб це зробити.", + "email-not-confirmed-chat": "Ви не можете користуватися чатом поки ваша електронна пошта не буде підтверджена, натисніть тут, щоб це зробити.", + "email-not-confirmed-email-sent": "Ваша електронна пошта ще не підтверджена, перевірте свої вхідні повідомлення на наявність підтверджувального листа.", + "no-email-to-confirm": "Цей форум вимагає підтвердження електронної пошти, будь-ласка, натисніть тут, щоб його ввести.", + "email-confirm-failed": "Ми не можемо підтвердити вашу електронну пошту, будь ласка, спробуйте пізніше.", + "confirm-email-already-sent": "Підтвердження по електронній пошті вже було надіслано, зачекайте, будь ласка, %1 хвилин(и), щоб відправити ще одне. ", + "sendmail-not-found": "Виконуваний файл sendmail не знайдено, переконайтесь, будь ласка, що його встановлено та що він виконується власником процесу NodeBB.", + "username-too-short": "Ім'я користувача закоротке", + "username-too-long": "Ім'я користувача задовге", + "password-too-long": "Пароль задовгий", + "user-banned": "Користувача забанено", + "user-banned-reason": "Вибачте, але цей акаунт було забанено (Причина: %1)", + "user-too-new": "Вибачте, але вам необхідно зачекати %1 секунд(и), перед першим постом", + "blacklisted-ip": "Вибачте, але ваша IP-адреса була забанена в цій спільноті. Якщо ви гадаєте, що це сталось помилково, зв'яжіться з адміністратором.", + "ban-expiry-missing": "Вкажіть, будь ласка, кінцеву дату бану", + "no-category": "Категорія не існує", + "no-topic": "Тема не існує", + "no-post": "Посту не існує", + "no-group": "Група не існує", + "no-user": "Користувач не існує", + "no-teaser": "Тизер не існує", + "no-privileges": "У вас недостатньо повноважень для цієї дії. ", + "category-disabled": "Категорію відключено", + "topic-locked": "Тему заблоковано", + "post-edit-duration-expired": "Ви можете редагувати пости лиш на протязі %1 секунд(и) з часу відправки", + "post-edit-duration-expired-minutes": "Ви можете редагувати пости лиш на протязі %1 хвилин(и) з часу відправки", + "post-edit-duration-expired-minutes-seconds": "Ви можете редагувати пости лиш на протязі %1 хвилин(и) та %2 секунд(и) з часу відправки", + "post-edit-duration-expired-hours": "Ви можете редагувати пости лиш на протязі %1 годин(и) з часу відправки", + "post-edit-duration-expired-hours-minutes": "Ви можете редагувати пости лиш на протязі %1 годин(и) та %2 хвилин(и) з часу відправки", + "post-edit-duration-expired-days": "Ви можете редагувати пости лиш на протязі %1 дні з часу відправки", + "post-edit-duration-expired-days-hours": "Ви можете редагувати пости лиш на протязі %1 дні та %2 годин(и) з часу відправки", + "post-delete-duration-expired": "Ви можете видаляти пости лиш на протязі %1 секунд(и) з часу відправки", + "post-delete-duration-expired-minutes": "Ви можете видаляти пости лиш на протязі %1 хвилин(и) з часу відправки", + "post-delete-duration-expired-minutes-seconds": "Ви можете видаляти пости лиш на протязі %1 хвилин(и) та %2 секунд(и) з часу відправки", + "post-delete-duration-expired-hours": "Ви можете видаляти пости лиш на протязі %1 годин(и) з часу відправки", + "post-delete-duration-expired-hours-minutes": "Ви можете видаляти пости лиш на протязі %1 годин(и) та %2 хвилин(и) з часу відправки", + "post-delete-duration-expired-days": "Ви можете видаляти пости лиш на протязі %1 дні з часу відправки", + "post-delete-duration-expired-days-hours": "Ви можете видаляти пости лиш на протязі %1 дні та %2 годин(и) з часу відправки", + "cant-delete-topic-has-reply": "Ви не можете видалити тему з відповідями", + "cant-delete-topic-has-replies": "Ви не можете видалити тему з %1 відповідями", + "content-too-short": "Введіть, будь ласка, довший пост. Він має складати щонайменше %1 символ(ів).", + "content-too-long": "Введіть, будь ласка, коротший пост. Він має складати щонайбільше %1 символ(ів).", + "title-too-short": "Введіть, будь ласка, довший заголовок. Мінімальна довжина %1 символ(ів).", + "title-too-long": "Введіть, будь ласка, коротший заголовок. Максимальна довжина %1 символ(ів).", + "category-not-selected": "Категорію не вибрано.", + "too-many-posts": "Ви не можете постити частіше %1 секунд(и) — зачекайте, будь ласка, перед повторною спробою", + "too-many-posts-newbie": "Як новий користувач, ви не можете публікувати частіше %1 секунд(и) доки не заробите %2 репутації — зачекайте, будь ласка, перед повторною спробою", + "tag-too-short": "Введіть, будь ласка, довший тег. Мінімальна довжина тегу %1 символ(ів)", + "tag-too-long": "Введіть, будь ласка, коротший тег. Максимальна довжина тегу %1 символ(ів)", + "not-enough-tags": "Замало тегів. Тема повинна мати щонайменше %1 тег(и)", + "too-many-tags": "Забагато тегів. Тема не може мати більше %1 тег(и)", + "still-uploading": "Зачекайте, будь ласка, доки завантаження завершиться.", + "file-too-big": "Максимальний розмір файлу %1 кБ — завантажте менший файл, будь ласка.", + "guest-upload-disabled": "Гостьове завантаження вимкнено.", + "already-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": "Ця група потребує щонайменше одного власника", + "group-already-invited": "Користувача вже було запрошено", + "group-already-requested": "Ваша заявка на вступ вже подана", + "post-already-deleted": "Цей пост вже видалено", + "post-already-restored": "Цей пост вже відновлено", + "topic-already-deleted": "Ця тема вже була видалена", + "topic-already-restored": "Ця тема вже була відновлена", + "cant-purge-main-post": "Ви не можете видалити головний пост, натомість видаліть тему.", + "topic-thumbnails-are-disabled": "Мініатюри теми вимкнено.", + "invalid-file": "Невірний файл", + "uploads-are-disabled": "Завантаження вимкнено", + "signature-too-long": "Вибачте, але ваш підпис не може бути довшим за %1 символ(и).", + "about-me-too-long": "Вибачте, але \"Про мене\" не може бути довшим за %1 символ(и).", + "cant-chat-with-yourself": "Ви не можете писати самому собі!", + "chat-restricted": "Цей користувач обмежив повідомлення. Він має стежити за вами, перш ніж ви зможете спілкуватися з ним", + "chat-disabled": "Чат вимкнено", + "too-many-messages": "Ви надіслали забагато повідомлень, зачекайте трішки.", + "invalid-chat-message": "Невірне повідомлення чату", + "chat-message-too-long": "Повідомлення чату задовге", + "cant-edit-chat-message": "Ви не можете редагувати повідомлення", + "cant-remove-last-user": "Ви не можете видалити останнього користувача", + "cant-delete-chat-message": "Ви не можете видалити це повідомлення", + "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 виникла проблема при перевантаженні: \"%1\". NodeBB продовжить надавати існуючі клієнтські ресурси, проте радимо вам відмінити те, що було зроблено до перевантаження.", + "registration-error": "Помилка реєстрації", + "parse-error": "Щось пішло не так при розборі відповіді сервера", + "wrong-login-type-email": "Будь ласка, використайте вашу електронну пошту для входу", + "wrong-login-type-username": "Будь ласка, використайте ваше ім'я для входу", + "invite-maximum-met": "Ви запросили максимальну кілкість людей (%1 з %2).", + "no-session-found": "Жодної сесії не знайдено!", + "not-in-room": "Користувача немає в кімнаті", + "no-users-in-room": "Жодного користувача в кімнаті", + "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/uk/global.json b/public/language/uk/global.json new file mode 100644 index 0000000000..6fab3e2484 --- /dev/null +++ b/public/language/uk/global.json @@ -0,0 +1,107 @@ +{ + "home": "Додому", + "search": "Пошук", + "buttons.close": "Закрити", + "403.title": "Доступ заборонено", + "403.message": "Здається ви натрапили на сторінку до якої не маєте доступу.", + "403.login": "Можливо вам потрібно увійти?", + "404.title": "Не знайдено", + "404.message": "Здається ви натрапили на сторінку якої не існує. Поверніться на початкову сторінку.", + "500.title": "Внутрішня помилка.", + "500.message": "Ой! Здається щось пішло не так!", + "400.title": "Помилковий запит.", + "400.message": "Схоже, що посилання сформовано невірно, перевірте його і спробуйте ще раз. Інакше, поверніться на початкову сторінку.", + "register": "Реєстрація", + "login": "Логін", + "please_log_in": "Увійдіть, будь-ласка", + "logout": "Вийти", + "posting_restriction_info": "Наразі постити можуть лише зареєстровані користувачі, натисніть тут щоб увійти.", + "welcome_back": "З повернення", + "you_have_successfully_logged_in": "Ви успішно увійшли", + "save_changes": "Зберегти зміни", + "save": "Зберегти", + "close": "Закрити", + "pagination": "Розбиття на сторінки", + "pagination.out_of": "%1 із %2", + "pagination.enter_index": "Уведіть номер", + "header.admin": "Адмін", + "header.categories": "Категорії", + "header.recent": "Недавні", + "header.unread": "Непрочитані", + "header.tags": "Теги", + "header.popular": "Популярні", + "header.users": "Користувачі", + "header.groups": "Групи", + "header.chats": "Чати", + "header.notifications": "Сповіщення", + "header.search": "Пошук", + "header.profile": "Профіль", + "header.navigation": "Навігація", + "notifications.loading": "Завантаження сповіщень", + "chats.loading": "Завантаження чатів", + "motd.welcome": "Вітаємо у NodeBB, надсучасній платформі для обговорень.", + "previouspage": "Попередня сторінка", + "nextpage": "Наступна сторінка", + "alert.success": "Успіх", + "alert.error": "Помилка", + "alert.banned": "Забанений", + "alert.banned.message": "Вас щойно забанили і наразі ви будете розлогінені.", + "alert.unfollow": "Ви більше не стежите за %1!", + "alert.follow": "Ви тепер стежите за %1!", + "online": "Онлайн", + "users": "Користувачі", + "topics": "Теми", + "posts": "Пости", + "best": "Найкращі", + "upvoters": "За", + "upvoted": "За", + "downvoters": "Проти", + "downvoted": "Проти", + "views": "Перегляди", + "reputation": "Репутація", + "read_more": "читати далі", + "more": "Більше", + "posted_ago_by_guest": "запостив Гість %1", + "posted_ago_by": "запостив %2 %1", + "posted_ago": "запощено %1", + "posted_in": "запощено в %1", + "posted_in_by": "запостив %2 в %1 ", + "posted_in_ago": "запощено в %1 %2", + "posted_in_ago_by": "запостив %3 в %1 %2 ", + "user_posted_ago": "%1 запостив %2", + "guest_posted_ago": "Гість запостив %1", + "last_edited_by": "востаннє редагувалося %1", + "norecentposts": "Немає свіжих постів", + "norecenttopics": "Немає свіжих тем", + "recentposts": "Нещодавні пости", + "recentips": "Нещодавно увійшовші IP-адреси", + "moderator_tools": "Інструменти модератора", + "away": "Відсутній", + "dnd": "Не турбувати", + "invisible": "Невидимий", + "offline": "Не в мережі", + "email": "Email", + "language": "Мова", + "guest": "Гість", + "guests": "Гості", + "updated.title": "Форум оновлено", + "updated.message": "Форум було щойно оновлено до останньої версії. Клікніть тут, щоб оновити сторінку.", + "privacy": "Приватність", + "follow": "Стежити", + "unfollow": "Не стежити", + "delete_all": "Видалити все", + "map": "Мапа", + "sessions": "Сесії", + "ip_address": "IP Адреса", + "enter_page_number": "Уведіть номер сторінки", + "upload_file": "Завантажити файл", + "upload": "Завантажити", + "allowed-file-types": "Дозволені типи файлів %1", + "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/uk/groups.json b/public/language/uk/groups.json new file mode 100644 index 0000000000..e7f6b48aa5 --- /dev/null +++ b/public/language/uk/groups.json @@ -0,0 +1,57 @@ +{ + "groups": "Групи", + "view_group": "Переглянути групу", + "owner": "Власник групи", + "new_group": "Створити нову групу", + "no_groups_found": "Тут немає груп", + "pending.accept": "Прийняти", + "pending.reject": "Відхилити", + "pending.accept_all": "Прийняти всі", + "pending.reject_all": "Відхилити всі", + "pending.none": "На даний момент жоден учасник не чекає розгляду", + "invited.none": "На даний момент немає запрошених учасників", + "invited.uninvite": "Анулювати запрошення", + "invited.search": "Пошук користувача для запрошення у групу", + "invited.notification_title": "Вас запросили проєднатися до %1", + "request.notification_title": "Запит на членство у групі від %1", + "request.notification_text": "%1 було запрошено стати учасником групи %2", + "cover-save": "Зберегти", + "cover-saving": "Збереження", + "details.title": "Деталі групи", + "details.members": "Список учасників", + "details.pending": "Учасники, що очікують", + "details.invited": "Запрошені учасники", + "details.has_no_posts": "Учасники групи не написали жодного посту.", + "details.latest_posts": "Останні пости", + "details.private": "Приватна", + "details.disableJoinRequests": "Вимкнути запити на приєднання", + "details.grant": "Надати/забрати права адміністратора", + "details.kick": "Вигнати", + "details.owner_options": "Адміністрація групи", + "details.group_name": "Назва групи", + "details.member_count": "Кількість учасників", + "details.creation_date": "Дата створення", + "details.description": "Опис", + "details.badge_preview": "Попередній перегляд бейджа", + "details.change_icon": "Змінити іконку", + "details.change_colour": "Змінити колір", + "details.badge_text": "Текст бейджа", + "details.userTitleEnabled": "Показати бейдж", + "details.private_help": "Якщо увімкнено, приєднання до групи вимагає підтвердження власника.", + "details.hidden": "Прихована", + "details.hidden_help": "Якщо увімкнено, групу не буде видно в загальному списку і запрошення користувачів потрібно буде здійснювати вручну.", + "details.delete_group": "Видалити групу", + "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": "Уведіть список імен користувачів (розділених комами), котрих ви бажаєте запросити до групи", + "bulk-invite": "Масове запрошення", + "remove_group_cover_confirm": "Ви впевнені, що бажаєте видалити обкладинку?" +} \ No newline at end of file diff --git a/public/language/uk/language.json b/public/language/uk/language.json new file mode 100644 index 0000000000..5eda753089 --- /dev/null +++ b/public/language/uk/language.json @@ -0,0 +1,5 @@ +{ + "name": "Українська (Україна)", + "code": "uk", + "dir": "ltr" +} \ No newline at end of file diff --git a/public/language/uk/login.json b/public/language/uk/login.json new file mode 100644 index 0000000000..a1114c54c5 --- /dev/null +++ b/public/language/uk/login.json @@ -0,0 +1,12 @@ +{ + "username-email": "Ім'я / Пошта", + "username": "Ім'я користувача", + "email": "Пошта", + "remember_me": "Запам'ятати мене?", + "forgot_password": "Забули пароль?", + "alternative_logins": "Альтернативний вхід", + "failed_login_attempt": "Вхід невдався", + "login_successful": "Ви успішно зайшли!", + "dont_have_account": "Не маєте акаунту?", + "logged-out-due-to-inactivity": "Ви були розлогінені з Адмінської Панелі Керування через неактивність" +} \ No newline at end of file diff --git a/public/language/uk/modules.json b/public/language/uk/modules.json new file mode 100644 index 0000000000..f005377372 --- /dev/null +++ b/public/language/uk/modules.json @@ -0,0 +1,48 @@ +{ + "chat.chatting_with": "Чат з ", + "chat.placeholder": "Надрукуйте повідомлення і натисніть Enter для відправки", + "chat.send": "Надіслати", + "chat.no_active": "У вас немає активних чатів.", + "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": "Залишити розмову", + "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": "Додати користувачів до кімнати", + "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/uk/notifications.json b/public/language/uk/notifications.json new file mode 100644 index 0000000000..e716f9932d --- /dev/null +++ b/public/language/uk/notifications.json @@ -0,0 +1,38 @@ +{ + "title": "Сповіщення", + "no_notifs": "У вас немає нових сповіщень", + "see_all": "Переглянути всі сповіщення", + "mark_all_read": "Помітити всі сповіщення прочитаними", + "back_to_home": "Повернутись до %1", + "outgoing_link": "Зовнішнє посилання", + "outgoing_link_message": "Ви залишаєте %1", + "continue_to": "Перейти до %1", + "return_to": "Повернутись до %1", + "new_notification": "Нове сповіщення", + "you_have_unread_notifications": "У вас немає непрочитаних сповіщень", + "new_message_from": "Нове повідомлення від %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 запити на реєстрацію очікують розгляду.", + "email-confirmed": "Електронну пошту підтверджено", + "email-confirmed-message": "Дякуємо за підтвердження електронної пошти. Ваш акаунт тепер повністю активовано.", + "email-confirm-error-message": "При перевірці вашої електронної пошти сталася проблема. Можливо код був недійсним або простроченим.", + "email-confirm-sent": "Підтвердження по електронній пошті було надіслано." +} \ No newline at end of file diff --git a/public/language/uk/pages.json b/public/language/uk/pages.json new file mode 100644 index 0000000000..5d72bdc64c --- /dev/null +++ b/public/language/uk/pages.json @@ -0,0 +1,52 @@ +{ + "home": "Головна", + "unread": "Непрочитані теми", + "popular-day": "Популярні теми сьогодні", + "popular-week": "Популярні теми цього тижня", + "popular-month": "Популярні теми цього місяця", + "popular-alltime": "Популярні теми за весь час", + "recent": "Свіжі теми", + "flagged-content": "Оскаржений вміст", + "ip-blacklist": "Чорний список IP адрес", + "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 в даний час недоступний через надмірне навантаження. Завітайте, будь ласка, пізніше." +} \ No newline at end of file diff --git a/public/language/uk/recent.json b/public/language/uk/recent.json new file mode 100644 index 0000000000..95603beef3 --- /dev/null +++ b/public/language/uk/recent.json @@ -0,0 +1,19 @@ +{ + "title": "Свіжі", + "day": "День", + "week": "Тиждень", + "month": "Місяць", + "year": "Рік", + "alltime": "Весь час", + "no_recent_topics": "Немає свіжих тем.", + "no_popular_topics": "Немає популярних тем.", + "there-is-a-new-topic": "Є нова тема.", + "there-is-a-new-topic-and-a-new-post": "Є нова тема та нова публікація.", + "there-is-a-new-topic-and-new-posts": "Є нова тема та %1 нових публікацій.", + "there-are-new-topics": "Є %1 нових тем.", + "there-are-new-topics-and-a-new-post": "Є %1 нових тем на нова публікація.", + "there-are-new-topics-and-new-posts": "Є %1 нових тем та %2 нові публікації.", + "there-is-a-new-post": "Є нова публікація.", + "there-are-new-posts": "Є %1 нових публікацій.", + "click-here-to-reload": "Натисніть тут, щоб перевантажити." +} \ No newline at end of file diff --git a/public/language/uk/register.json b/public/language/uk/register.json new file mode 100644 index 0000000000..b4a84ff20f --- /dev/null +++ b/public/language/uk/register.json @@ -0,0 +1,23 @@ +{ + "register": "Реєстрація", + "cancel_registration": "Відмінити реєстрацію", + "help.email": "За замовчуванням, ваша email-адреса буде прихована від інших. ", + "help.username_restrictions": "Унікальне ім'я довжиною від %1 до %2 символів. Інші можуть вас згадувати за допомогою @ім'я.", + "help.minimum_password_length": "Довжина паролю має бути щонайменше %1 символів.", + "email_address": "Електронна адреса", + "email_address_placeholder": "Уведіть електронну адресу", + "username": "Ім'я користувача", + "username_placeholder": "Уведіть ім'я", + "password": "Пароль", + "password_placeholder": "Уведіть пароль", + "confirm_password": "Підтвердіть пароль", + "confirm_password_placeholder": "Підтвердження пароля", + "register_now_button": "Зареєструватися зараз", + "alternative_registration": "Альтернативна реєстрація", + "terms_of_use": "Умови користування", + "agree_to_terms_of_use": "Я погоджуюсь з Умовами користування", + "terms_of_use_error": "Ви маєте погодитись з Умовами користування", + "registration-added-to-queue": "Ваша реєстрація була додана в чергу затвердження. Ви отримаєте листа на електронну пошту, коли адміністратор її підтвердить.", + "interstitial.intro": "Нам потрібна додаткова інформація, перш ніж ми створимо ваш обліковий запис.", + "interstitial.errors-found": "Нам не вдалося вас зареєструвати:" +} \ No newline at end of file diff --git a/public/language/uk/reset_password.json b/public/language/uk/reset_password.json new file mode 100644 index 0000000000..f3bbe1b550 --- /dev/null +++ b/public/language/uk/reset_password.json @@ -0,0 +1,17 @@ +{ + "reset_password": "Скинути пароль", + "update_password": "Змінити пароль", + "password_changed.title": "Пароль змінено", + "password_changed.message": "

Пароль успішно скинуто, будь ласка, увійдіть знову.", + "wrong_reset_code.title": "Невірний код скидання", + "wrong_reset_code.message": "Отриманий код скидання невірний. Спробуйте, будь ласка, ще раз або запросіть новий код.", + "new_password": "Новий пароль", + "repeat_password": "Підтвердіть пароль", + "enter_email": "Будь ласка, введіть свою електронну пошту і ми надішлемо вам листа с інструкцією як скинути ваш обліковий запис.", + "enter_email_address": "Введіть електронну пошту", + "password_reset_sent": "Скидання паролю надіслано", + "invalid_email": "Невірна або неіснуюча електронна пошта!", + "password_too_short": "Уведений пароль закороткий, оберіть, будь ласка, інший.", + "passwords_do_not_match": "Паролі що ви ввели не співпадають.", + "password_expired": "Ваш пароль закінчився, будь ласка, виберіть новий пароль." +} \ No newline at end of file diff --git a/public/language/uk/search.json b/public/language/uk/search.json new file mode 100644 index 0000000000..7d7f6c65d5 --- /dev/null +++ b/public/language/uk/search.json @@ -0,0 +1,42 @@ +{ + "results_matching": "%1 збіг(ів) по запиту \"%2\" (%3 секунд)", + "no-matches": "Збіги не знайдено", + "advanced-search": "Розширений пошук", + "in": "В", + "titles": "Заголовки", + "titles-posts": "Заголовки та Пости", + "posted-by": "Запощено", + "in-categories": "В Категоріях", + "search-child-categories": "Шукати в дочірніх категоріях", + "has-tags": "Містить теги", + "reply-count": "Лічильник Відповідей", + "at-least": "Щонайменше", + "at-most": "Щонайбільше", + "relevance": "Релевантність", + "post-time": "Час посту", + "newer-than": "Новіші за", + "older-than": "Старіші за", + "any-date": "Будь-яка дата", + "yesterday": "Вчора", + "one-week": "Один тиждень", + "two-weeks": "Два тижні", + "one-month": "Один місяць", + "three-months": "Три місяці", + "six-months": "Шість місяців", + "one-year": "Один рік", + "sort-by": "Сортувати за", + "last-reply-time": "Час останньої відповіді", + "topic-title": "Заголовок теми", + "number-of-replies": "Кількість відповідей", + "number-of-views": "Кількість переглядів", + "topic-start-date": "Час початку теми", + "username": "Ім'я користувача", + "category": "Категорія", + "descending": "У порядку спадання", + "ascending": "У порядку зростання", + "save-preferences": "Зберегти налаштування", + "clear-preferences": "Очистити налаштування", + "search-preferences-saved": "Налаштування пошуку збережено", + "search-preferences-cleared": "Налаштування пошуку очищені", + "show-results-as": "Показати результати як" +} \ No newline at end of file diff --git a/public/language/uk/success.json b/public/language/uk/success.json new file mode 100644 index 0000000000..f250023ca4 --- /dev/null +++ b/public/language/uk/success.json @@ -0,0 +1,6 @@ +{ + "success": "Успіх", + "topic-post": "Публікацію успішно створено.", + "authentication-successful": "Аутентифікація успішна", + "settings-saved": "Налаштування збережені!" +} \ No newline at end of file diff --git a/public/language/uk/tags.json b/public/language/uk/tags.json new file mode 100644 index 0000000000..85041f32ff --- /dev/null +++ b/public/language/uk/tags.json @@ -0,0 +1,7 @@ +{ + "no_tag_topics": "Немає теми з цим тегом.", + "tags": "Теги", + "enter_tags_here": "Введіть тег сюди, між літерами %1 та %2 кожен", + "enter_tags_here_short": "Введіть тег", + "no_tags": "Ще немає тегів" +} \ No newline at end of file diff --git a/public/language/uk/topic.json b/public/language/uk/topic.json new file mode 100644 index 0000000000..111efb25d9 --- /dev/null +++ b/public/language/uk/topic.json @@ -0,0 +1,119 @@ +{ + "topic": "Тема", + "topic_id": "ID теми", + "topic_id_placeholder": "Уведіть ID теми", + "no_topics_found": "Тем не знайдено!", + "no_posts_found": "Постів не знайдено!", + "post_is_deleted": "Цей пост був видалений!", + "topic_is_deleted": "Ця тема була видалена!", + "profile": "Профіль", + "posted_by": "Запощено %1", + "posted_by_guest": "Запощено гостем", + "chat": "Чат", + "notify_me": "Отримувати сповіщення про нові відповіді в цій темі", + "quote": "Цитувати", + "reply": "Відповісти", + "replies_to_this_post": "%1 відповідей", + "last_reply_time": "Остання відповідь", + "reply-as-topic": "Відповісти темою", + "guest-login-reply": "Увійти для відповіді", + "edit": "Редагувати", + "delete": "Видалити", + "purge": "Стерти", + "restore": "Відновити", + "move": "Перемістити", + "fork": "Відгалужити", + "link": "Зв'язати", + "share": "Поширити", + "tools": "Інструменти", + "locked": "Заблокована", + "pinned": "Закріплена", + "moved": "Переміщена", + "bookmark_instructions": "Натисніть тут, щоб повернутися до останнього прочитаного посту у цій темі.", + "flag_title": "Поскаржитись цей пост модератору", + "deleted_message": "Цю тему було видалено. Лише користувачі з правом керування темами можуть її бачити.", + "following_topic.message": "Відтепер ви будете отримувати сповіщення коли хтось постить в цю тему.", + "not_following_topic.message": "Ви будете бачити цю тему в списку непрочитаних, але ви не будете отримувати сповіщень, коли хтось постить до неї.", + "ignoring_topic.message": "Ви більше не будете бачити цю тему в списку непрочитаних. Вас буде сповіщено коли хтось вас згадає або за ваш пост буде проголосовано.", + "login_to_subscribe": "Будь ласка, зареєструйтесь або увійдіть щоб підписатися на цю тему.", + "markAsUnreadForAll.success": "Тема відмічена для всіх як непрочитана.", + "mark_unread": "Помітити непрочитаною", + "mark_unread.success": "Тема помічена непрочитаною", + "watch": "Стежити", + "unwatch": "Не стежити", + "watch.title": "Отримуйте сповіщення про відповіді в цій темі", + "unwatch.title": "Перестати стежити за цією темою", + "share_this_post": "Поширити цей пост", + "watching": "Відстежується", + "not-watching": "Не відстежується", + "ignoring": "Ігнорується", + "watching.description": "Сповіщати мене про нові відповіді.
Показувати тему в непрочитаних.", + "not-watching.description": "Не сповіщати мене про нові відповіді.
Показувати тему в непрочитаних якщо категорія не ігнорується.", + "ignoring.description": "Не сповіщати мене про нові відповіді.
Не показувати тему в непрочитаних.", + "thread_tools.title": "Інструменти теми", + "thread_tools.markAsUnreadForAll": "Відмітити всі непрочитаними", + "thread_tools.pin": "Прикріпити тему", + "thread_tools.unpin": "Відкріпити тему", + "thread_tools.lock": "Заблокувати тему", + "thread_tools.unlock": "Розблокувати тему", + "thread_tools.move": "Перемістити тему", + "thread_tools.move_all": "Перемістити всі", + "thread_tools.fork": "Відгалужити тему", + "thread_tools.delete": "Видалити тему", + "thread_tools.delete-posts": "Видалити пости", + "thread_tools.delete_confirm": "Ви точно бажаєте видалити цю тему?", + "thread_tools.restore": "Відновити тему", + "thread_tools.restore_confirm": "Ви точно бажаєте відновити цю тему?", + "thread_tools.purge": "Стерти тему", + "thread_tools.purge_confirm": "Ви точно бажаєте стерти цю тему?", + "topic_move_success": "Тема була успішно переміщена до %1", + "post_delete_confirm": "Ви точно бажаєте видалити цей пост?", + "post_restore_confirm": "Ви точно бажаєте відновити цей пост?", + "post_purge_confirm": "Ви точно бажаєте стерти цей пост?", + "load_categories": "Завантаження категорій", + "disabled_categories_note": "Вимкнені категорії фарбуються в сірий", + "confirm_move": "Перемістити", + "confirm_fork": "Відгалужити", + "bookmark": "Закладка", + "bookmarks": "Закладки", + "bookmarks.has_no_bookmarks": "Ви ще не додали в закладки жодного поста.", + "loading_more_posts": "Завантажуємо більше постів", + "move_topic": "Перемістити тему", + "move_topics": "Перемістити теми", + "move_post": "Перемістити пост", + "post_moved": "Пост переміщено!", + "fork_topic": "Відгалужити тему", + "topic_will_be_moved_to": "Цю тему буде переміщено в категорію", + "fork_topic_instruction": "Тисніть пости які ви бажаєте відгалужити", + "fork_no_pids": "Не вибрано жодного поста!", + "fork_pid_count": "вибрано %1 пост(ів) ", + "fork_success": "Тему успішно відгалужено. Тисніть тут, щоб перейти до відгалуженої теми.", + "delete_posts_instruction": "Тисніть пости які ви бажаєте видалити/стерти", + "composer.title_placeholder": "Уведіть заголовок теми...", + "composer.handle_placeholder": "Ім'я", + "composer.discard": "Відмінити", + "composer.submit": "Надіслати", + "composer.replying_to": "Відповідь для %1", + "composer.new_topic": "Cтворити тему", + "composer.uploading": "завантаження...", + "composer.thumb_url_label": "Вставте URL мініатюри теми", + "composer.thumb_title": "Додати мініатюру цій темі", + "composer.thumb_url_placeholder": "http://example.com/thumb.png", + "composer.thumb_file_label": "Або завантажте файл", + "composer.thumb_remove": "Очистити поля", + "composer.drag_and_drop_images": "Перетягніть сюди зображення", + "more_users_and_guests": "ще %1 користувач(і) та %2 гостей", + "more_users": "ще %1 користувач(і)", + "more_guests": "ще %1 гостей", + "users_and_others": "%1 та %2 інших", + "sort_by": "Сортувати за", + "oldest_to_newest": "Старі > Нові", + "newest_to_oldest": "Нові > Старі", + "most_votes": "Кількість голосів", + "most_posts": "Кількість постів", + "stale.title": "Створити натомість нову тему?", + "stale.warning": "Тема на котру ви відповідаєте досить стара. Не бажаєте натомість створити новую тему і зіслатися на цю у вашій відповіді?", + "stale.create": "Так, створити нову тему", + "stale.reply_anyway": "Ні, відповісти все ж на існуючу", + "link_back": "Re: [%1](%2)" +} \ No newline at end of file diff --git a/public/language/uk/unread.json b/public/language/uk/unread.json new file mode 100644 index 0000000000..753fb83cca --- /dev/null +++ b/public/language/uk/unread.json @@ -0,0 +1,13 @@ +{ + "title": "Непрочитані", + "no_unread_topics": "Не залишилось непрочитаних тем.", + "load_more": "Завантажити більше", + "mark_as_read": "Помітити як прочитане", + "selected": "Вибрано", + "all": "Всі", + "all_categories": "Всі категорії", + "topics_marked_as_read.success": "Теми відмічені прочитаними!", + "all-topics": "Всі теми", + "new-topics": "Нові теми", + "watched-topics": "Переглянуті теми" +} \ No newline at end of file diff --git a/public/language/uk/uploads.json b/public/language/uk/uploads.json new file mode 100644 index 0000000000..9e5b5b75d5 --- /dev/null +++ b/public/language/uk/uploads.json @@ -0,0 +1,6 @@ +{ + "uploading-file": "Завантаження файлу...", + "select-file-to-upload": "Оберіть файл для завантаження!", + "upload-success": "Файл успішно завантажено!", + "maximum-file-size": "Максимально %1 кб" +} \ No newline at end of file diff --git a/public/language/uk/user.json b/public/language/uk/user.json new file mode 100644 index 0000000000..8b768580a7 --- /dev/null +++ b/public/language/uk/user.json @@ -0,0 +1,134 @@ +{ + "banned": "Заборонений", + "offline": "Не в мережі", + "username": "Ім'я користувача", + "joindate": "Дата вступу", + "postcount": "Кількість постів", + "email": "Електронна пошта", + "confirm_email": "Підтвердження пошти", + "account_info": "Акаунт", + "ban_account": "Заборонити акаунт", + "ban_account_confirm": "Ви точно хочете забанити цього користувача?", + "unban_account": "Розбанити акаунт", + "delete_account": "Видалити акаунт", + "delete_account_confirm": "Ви точно бажаєте видалити ваш акаунт?
Ця дія є незворотньою і ви не зможете відновити жодні з ваших даних.

Уведіть ваше ім'я користувача для підтвердження знищення цього акаунту.", + "delete_this_account_confirm": "Ви точно бажаєте видалити цей акаунт?
Ця дія є незворотньою і ви не зможете відновити жодні дані.

", + "account-deleted": "Акаунт видалено", + "fullname": "Повне ім'я", + "website": "Сайт", + "location": "Місце", + "age": "Вік", + "joined": "Приєднаний", + "lastonline": "Востаннє в мережі", + "profile": "Профіль", + "profile_views": "Переглядів профілю", + "reputation": "Репутація", + "bookmarks": "Закладки", + "watched": "Переглянуті", + "followers": "Відстежувачі", + "following": "Відстежувані", + "aboutme": "Про мене", + "signature": "Підпис", + "birthday": "День народження", + "chat": "Чат", + "chat_with": "Продовжити чат з %1", + "new_chat_with": "Почати новий чат з %1", + "flag-profile": "Поскаржитись на профіль", + "follow": "Стежити", + "unfollow": "Не стежити", + "more": "Більше", + "profile_update_success": "Профіль успішно оновлений!", + "change_picture": "Змінити зображення", + "change_username": "Змінити ім'я користувача", + "change_email": "Змінити електронну пошту", + "edit": "Редагувати", + "edit-profile": "Редагувати профіль", + "default_picture": "Стандартна іконка", + "uploaded_picture": "Завантажене зображення", + "upload_new_picture": "Завантажити нове зображення", + "upload_new_picture_from_url": "Завантажити нове зображення з URL", + "current_password": "Поточний пароль", + "change_password": "Змінити пароль", + "change_password_error": "Невірний пароль!", + "change_password_error_wrong_current": "Ваш поточний пароль не вірний!", + "change_password_error_length": "Пароль закороткий!", + "change_password_error_match": "Паролі мають співпадати!", + "change_password_error_privileges": "У вас немає прав змінювати цей пароль.", + "change_password_success": "Ваш пароль оновлено!", + "confirm_password": "Підтвердіть пароль", + "password": "Пароль", + "username_taken_workaround": "Ім'я користувача, що ви обрали, вже було зайняте, то ж ми його трішки змінили. Ви тепер відомі як %1", + "password_same_as_username": "Ваш пароль співпадає з іменем користувача. Оберіть інший пароль, будь ласка.", + "password_same_as_email": "Ваш пароль співпадає з електронною поштою. Оберіть інший пароль, будь ласка.", + "upload_picture": "Завантажити зображення", + "upload_a_picture": "Завантажити зображення", + "remove_uploaded_picture": "Видалити завантажене зображення", + "upload_cover_picture": "Завантажити обкладинку", + "remove_cover_picture_confirm": "Ви точно бажаєте видалити обкладинку?", + "crop_picture": "Обрізати зображення", + "upload_cropped_picture": "Обрізати та завантажити", + "settings": "Налаштування", + "show_email": "Показувати мою пошту", + "show_fullname": "Показувати повне ім'я", + "restrict_chats": "Дозволяти чат повідомлення лише від користувачів за якими я стежу", + "digest_label": "Підписатися на дайджест", + "digest_description": "Підписатися на оновлення цього форуму по електронній пошті (нові оповіщення та теми) згідно заданого розкладу", + "digest_off": "Ніколи", + "digest_daily": "Щоденно", + "digest_weekly": "Щотижнево", + "digest_monthly": "Щомісячно", + "send_chat_notifications": "Надсилати листа, коли я не в мережі, якщо приходить чат повідомлення", + "send_post_notifications": "Надсилати листа, коли в темах на які я підписаний з'являються відповіді", + "settings-require-reload": "Змінам певних налаштувань необхідне перевантаження. Натисніть тут, щоб перевантажити сторінку.", + "has_no_follower": "Цей користувач не має відстежувачів :(", + "follows_no_one": "Цей користувач нікого не відстежує :(", + "has_no_posts": "Цей користувач ще ніколи нічого не постив.", + "has_no_topics": "Цей користувач ще ніколи не створював нових тем.", + "has_no_watched_topics": "Цей користувач ще ніколи не переглядав жодної теми.", + "has_no_upvoted_posts": "Цей користувач ще не голосував за жоден з постів.", + "has_no_downvoted_posts": "Цей користувач ще не голосував проти жодного поста.", + "has_no_voted_posts": "У цього користувача немає постів за котрі хтось голосував", + "email_hidden": "Електронна адреса прихована", + "hidden": "прихований", + "paginate_description": "Розбивати список тем та постів на сторінки замість нескінченної прокрутки", + "topics_per_page": "Тем на сторінку", + "posts_per_page": "Постів на сторінку", + "notification_sounds": "Програвати звук, коли ви отримуєте сповіщення", + "notifications_and_sounds": "Сповіщення та звуки", + "incoming-message-sound": "Звук вхідного повідомлення", + "outgoing-message-sound": "Звук вихідного повідомлення", + "notification-sound": "Звук сповіщення", + "no-sound": "Без звуку", + "browsing": "Налаштування перегляду", + "open_links_in_new_tab": "Відкривати зовнішні посилання у новій вкладці", + "enable_topic_searching": "Увімкнути пошук у темах", + "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": "Сервіси єдиного входу", + "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": "Коментар модератора", + "info.moderation-note.success": "Коментар модератора збережено" +} \ No newline at end of file diff --git a/public/language/uk/users.json b/public/language/uk/users.json new file mode 100644 index 0000000000..59a6e66d0f --- /dev/null +++ b/public/language/uk/users.json @@ -0,0 +1,21 @@ +{ + "latest_users": "Останні користувачі", + "top_posters": "Кращі автори", + "most_reputation": "Найбільша репутація", + "most_flags": "Найбільше скарг", + "search": "Пошук", + "enter_username": "Уведіть ім'я користувача для пошуку", + "load_more": "Завантажити більше", + "users-found-search-took": "%1 користувач(ів) знайдено! Пошук тривав %2 секунди.", + "filter-by": "Фільтрувати за", + "online-only": "Лише в мережі", + "invite": "Запросити", + "invitation-email-sent": "Лист із запрошенням відправлено %1", + "user_list": "Список користувачів", + "recent_topics": "Нещодавні теми", + "popular_topics": "Популярні теми", + "unread_topics": "Непрочитані теми", + "categories": "Категорії", + "tags": "Теги", + "no-users-found": "Жодного користувача не знайдено!" +} \ No newline at end of file diff --git a/public/language/vi/admin/advanced/errors.json b/public/language/vi/admin/advanced/errors.json index 963e68b116..546f0f1508 100644 --- a/public/language/vi/admin/advanced/errors.json +++ b/public/language/vi/admin/advanced/errors.json @@ -8,7 +8,7 @@ "clear-error-log": "Clear Error Log", "route": "Route", "count": "Count", - "no-routes-not-found": "Hooray! There are no routes that were not found.", + "no-routes-not-found": "Hooray! No 404 errors!", "clear404-confirm": "Are you sure you wish to clear the 404 error logs?", "clear404-success": "\"404 Not Found\" errors cleared" } \ No newline at end of file diff --git a/public/language/vi/admin/general/dashboard.json b/public/language/vi/admin/general/dashboard.json index b82802db1b..a70dda322e 100644 --- a/public/language/vi/admin/general/dashboard.json +++ b/public/language/vi/admin/general/dashboard.json @@ -2,6 +2,9 @@ "forum-traffic": "Forum Traffic", "page-views": "Page Views", "unique-visitors": "Unique Visitors", + "users": "Users", + "posts": "Posts", + "topics": "Topics", "page-views-last-month": "Page views Last Month", "page-views-this-month": "Page views This Month", "page-views-last-day": "Page views in last 24 hours", @@ -20,6 +23,11 @@ "prerelease-warning": "

This is a pre-release version of NodeBB. Unintended bugs may occur.

", "notices": "Notices", + "restart-not-required": "Restart not required", + "restart-required": "Restart required", + "search-plugin-installed": "Search Plugin installed", + "search-plugin-not-installed": "Search Plugin not installed", + "search-plugin-tooltip": "Install a search plugin from the plugin page in order to activate search functionality", "control-panel": "System Control", "reload": "Reload", @@ -52,4 +60,4 @@ "graphs.unique-visitors": "Unique Visitors", "graphs.registered-users": "Registered Users", "graphs.anonymous-users": "Anonymous Users" -} \ No newline at end of file +} diff --git a/public/language/vi/admin/menu.json b/public/language/vi/admin/menu.json index 6a4995ea6e..985c540e8a 100644 --- a/public/language/vi/admin/menu.json +++ b/public/language/vi/admin/menu.json @@ -13,7 +13,6 @@ "manage/users": "Users", "manage/registration": "Registration Queue", "manage/groups": "Groups", - "manage/flags": "Flags", "manage/ip-blacklist": "IP Blacklist", "section-settings": "Settings", diff --git a/public/language/vi/admin/settings/general.json b/public/language/vi/admin/settings/general.json index c26740ee4f..72ecfe641f 100644 --- a/public/language/vi/admin/settings/general.json +++ b/public/language/vi/admin/settings/general.json @@ -26,5 +26,6 @@ "touch-icon.upload": "Upload", "touch-icon.help": "Recommended size and format: 192x192, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.", "outgoing-links": "Outgoing Links", - "outgoing-links.warning-page": "Use Outgoing Links Warning Page" + "outgoing-links.warning-page": "Use Outgoing Links Warning Page", + "search-default-sort-by": "Search default sort by" } \ No newline at end of file diff --git a/public/language/vi/admin/settings/uploads.json b/public/language/vi/admin/settings/uploads.json index 8a56c85663..35eaa5a58f 100644 --- a/public/language/vi/admin/settings/uploads.json +++ b/public/language/vi/admin/settings/uploads.json @@ -9,7 +9,7 @@ "allow-topic-thumbnails": "Allow users to upload topic thumbnails", "topic-thumb-size": "Topic Thumb Size", "allowed-file-extensions": "Allowed File Extensions", - "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc).\n\t\t\t\t\tAn empty list means all extensions are allowed.", + "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc). An empty list means all extensions are allowed.", "profile-avatars": "Profile Avatars", "allow-profile-image-uploads": "Allow users to upload profile images", "convert-profile-image-png": "Convert profile image uploads to PNG", @@ -25,4 +25,4 @@ "profile-covers": "Profile Covers", "default-covers": "Default Cover Images", "default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image" -} \ No newline at end of file +} diff --git a/public/language/vi/notifications.json b/public/language/vi/notifications.json index 8433a1353d..747e7562e8 100644 --- a/public/language/vi/notifications.json +++ b/public/language/vi/notifications.json @@ -19,6 +19,9 @@ "user_flagged_post_in": "%1 gắn cờ 1 bài trong %2", "user_flagged_post_in_dual": "%1%2 đã gắn cờ một bài viết trong %3", "user_flagged_post_in_multiple": "%1 và %2 người khác đã gắn cờ bài viết của bạn trong %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 đã trả lời %2", "user_posted_to_dual": "%1%2 đã trả lời: %3", "user_posted_to_multiple": "%1 và %2 người khác đã trả lời: %3", diff --git a/public/language/vi/pages.json b/public/language/vi/pages.json index 4ac7cf00a9..ba094bf22e 100644 --- a/public/language/vi/pages.json +++ b/public/language/vi/pages.json @@ -6,7 +6,7 @@ "popular-month": "Chủ đề nổi bật tháng này", "popular-alltime": "Chủ đề nổi bật mọi thời đại", "recent": "Chủ đề gần đây", - "flagged-posts": "Bài viết bị gắn cờ", + "flagged-content": "Flagged Content", "ip-blacklist": "IP Blacklist", "users/online": "Thành viên đang online", "users/latest": "Thành viên mới nhất", @@ -27,6 +27,8 @@ "group": "Nhóm %1", "chats": "Chat", "chat": "Chat với %1", + "flags": "Flags", + "flag-details": "Flag %1 Details", "account/edit": "Chỉnh sửa \"%1\"", "account/edit/password": "Chỉnh sửa mật khẩu của \"%1\"", "account/edit/username": "Chỉnh sửa tên đăng nhập của \"%1\"", diff --git a/public/language/vi/search.json b/public/language/vi/search.json index e5a9219965..7e4211c2c8 100644 --- a/public/language/vi/search.json +++ b/public/language/vi/search.json @@ -12,6 +12,7 @@ "reply-count": "Số lượt trả lời", "at-least": "Tối thiểu", "at-most": "Tối đa", + "relevance": "Relevance", "post-time": "Thời điểm đăng bài", "newer-than": "Mới hơn", "older-than": "Cũ hơn", diff --git a/public/language/vi/topic.json b/public/language/vi/topic.json index 6ef833d39e..aaa940bdc3 100644 --- a/public/language/vi/topic.json +++ b/public/language/vi/topic.json @@ -13,7 +13,8 @@ "notify_me": "Được thông báo khi có trả lời mới trong chủ đề này", "quote": "Trích dẫn", "reply": "Trả lời", - "replies_to_this_post": "%1 trả lời", + "replies_to_this_post": "%1 Replies", + "last_reply_time": "Last reply", "reply-as-topic": "Trả lời dưới dạng chủ đề", "guest-login-reply": "Hãy đăng nhập để trả lời", "edit": "Chỉnh sửa", @@ -25,28 +26,11 @@ "link": "Đường dẫn", "share": "Chia sẻ", "tools": "Công cụ", - "flag": "Gắn cờ", "locked": "Khóa", "pinned": "Đã ghim", "moved": "Chuyển đi", "bookmark_instructions": "Bấm vào đây để quay về đọc bài viết mới nhất trong chủ đề này.", "flag_title": "Flag bài viết này để chỉnh sửa", - "flag_success": "Chủ đề này đã được flag để chỉnh sửa", - "flag_manage_title": "Bài viết bị gắn cờ trong %1", - "flag_manage_history": "Lịch sử hoạt động", - "flag_manage_no_history": "Không có lịch sử sự kiện nào", - "flag_manage_assignee": "Người giao việc", - "flag_manage_state": "Trạng thái", - "flag_manage_state_open": "New/Open", - "flag_manage_state_wip": "Công việc đang thực thi", - "flag_manage_state_resolved": "Đã hoàn thành", - "flag_manage_state_rejected": "Đã từ chối", - "flag_manage_notes": "Những ghi chú được chia sẻ", - "flag_manage_update": "Cập nhật trạng thái gắn c", - "flag_manage_history_assignee": "Đã giao cho %1", - "flag_manage_history_state": "Cập nhật trạng thái thành %1", - "flag_manage_history_notes": "Đã cập nhật ghi chú gắn c", - "flag_manage_saved": "Đã cập nhật nội dung gắn c", "deleted_message": "Chủ đề này đã bị xóa. Chỉ ban quản trị mới xem được.", "following_topic.message": "Từ giờ bạn sẽ nhận được thông báo khi có ai đó gửi bài viết trong chủ đề này", "not_following_topic.message": "Bạn có thể xem chủ đề này trong danh sách chủ đề chưa xem, nhưng bạn sẽ không nhận thông báo khi có ai đó đăng bài viết trong chủ đề này", @@ -131,8 +115,5 @@ "stale.warning": "Chủ đề bạn đang trả lời đã khá cũ. Bạn có muốn tạo chủ đề mới, và liên kết với chủ đề hiện tại trong bài viết trả lời của bạn?", "stale.create": "Tạo chủ đề mới", "stale.reply_anyway": "Trả lời chủ đề này", - "link_back": "Re: [%1](%2)", - "spam": "Spam", - "offensive": "Phản cảm", - "custom-flag-reason": "Nhập lý do bị gắn cờ" + "link_back": "Re: [%1](%2)" } \ No newline at end of file diff --git a/public/language/vi/user.json b/public/language/vi/user.json index d46f4f139f..cfbf45eea9 100644 --- a/public/language/vi/user.json +++ b/public/language/vi/user.json @@ -33,6 +33,7 @@ "chat": "Chat", "chat_with": "Continue chat with %1", "new_chat_with": "Start new chat with %1", + "flag-profile": "Flag Profile", "follow": "Theo dõi", "unfollow": "Hủy theo dõi", "more": "Xem thêm", @@ -64,6 +65,8 @@ "remove_uploaded_picture": "Xoá ảnh đã tải lên", "upload_cover_picture": "Tải ảnh bìa lên", "remove_cover_picture_confirm": "Are you sure you want to remove the cover picture?", + "crop_picture": "Crop picture", + "upload_cropped_picture": "Crop and upload", "settings": "Thiết lập", "show_email": "Hiện Email của tôi", "show_fullname": "Hiện tên đầy đủ", diff --git a/public/language/zh-CN/admin/advanced/errors.json b/public/language/zh-CN/admin/advanced/errors.json index 974d57c36e..257f88661c 100644 --- a/public/language/zh-CN/admin/advanced/errors.json +++ b/public/language/zh-CN/admin/advanced/errors.json @@ -8,7 +8,7 @@ "clear-error-log": "清空错误日志", "route": "路由", "count": "计数", - "no-routes-not-found": "恭喜!未发现不存在的路由。", + "no-routes-not-found": "恭喜!没有404错误!", "clear404-confirm": "确认清除404错误日志?", "clear404-success": "“404 页面不存在” 错误已被清空" } \ No newline at end of file diff --git a/public/language/zh-CN/admin/general/dashboard.json b/public/language/zh-CN/admin/general/dashboard.json index dd4035371e..923a573b3f 100644 --- a/public/language/zh-CN/admin/general/dashboard.json +++ b/public/language/zh-CN/admin/general/dashboard.json @@ -2,6 +2,9 @@ "forum-traffic": "论坛流量", "page-views": "PV 数量", "unique-visitors": "单一访客", + "users": "用户", + "posts": "发帖", + "topics": "主题", "page-views-last-month": "上个月 PV 数量", "page-views-this-month": "本月 PV 数量", "page-views-last-day": "过去24小时 PV 数量", @@ -20,6 +23,11 @@ "prerelease-warning": "

正在使用测试版 NodeBB。可能会出现意外的 Bug。

", "notices": "提醒", + "restart-not-required": "不需要重启", + "restart-required": "需要重启", + "search-plugin-installed": "已安装搜索插件", + "search-plugin-not-installed": "未安装搜索插件", + "search-plugin-tooltip": "在插件页面安装搜索插件来激活搜索功能", "control-panel": "系统控制", "reload": "重载", @@ -52,4 +60,4 @@ "graphs.unique-visitors": "单一访客", "graphs.registered-users": "已注册用户", "graphs.anonymous-users": "匿名用户" -} \ No newline at end of file +} diff --git a/public/language/zh-CN/admin/manage/categories.json b/public/language/zh-CN/admin/manage/categories.json index 4da113a71c..a881fce346 100644 --- a/public/language/zh-CN/admin/manage/categories.json +++ b/public/language/zh-CN/admin/manage/categories.json @@ -7,7 +7,7 @@ "bg-color": "背景颜色", "text-color": "文字颜色", "bg-image-size": "背景图片大小", - "custom-class": "自定义分类", + "custom-class": "自定义 Class", "num-recent-replies": "最近回复数", "ext-link": "外部链接", "upload-image": "上传图片", @@ -16,7 +16,7 @@ "parent-category": "父板块", "optional-parent-category": "(可选)父板块", "parent-category-none": "(无)", - "copy-settings": "复制设置窗体", + "copy-settings": "复制设置", "optional-clone-settings": "(可选) 从板块复制设置", "purge": "删除板块", diff --git a/public/language/zh-CN/admin/menu.json b/public/language/zh-CN/admin/menu.json index 7e722dfaab..1a6771b20e 100644 --- a/public/language/zh-CN/admin/menu.json +++ b/public/language/zh-CN/admin/menu.json @@ -13,8 +13,7 @@ "manage/users": "用户", "manage/registration": "注册队列", "manage/groups": "用户组", - "manage/flags": "举报", - "manage/ip-blacklist": "IP黑名单", + "manage/ip-blacklist": "IP 黑名单", "section-settings": "设置", "settings/general": "通用", diff --git a/public/language/zh-CN/admin/settings/general.json b/public/language/zh-CN/admin/settings/general.json index 69c25c04bf..6addbf4f38 100644 --- a/public/language/zh-CN/admin/settings/general.json +++ b/public/language/zh-CN/admin/settings/general.json @@ -26,5 +26,6 @@ "touch-icon.upload": "上传", "touch-icon.help": "推荐的尺寸和格式:192x192,仅限PNG格式。 如果没有指定触摸图标,NodeBB将回退到使用站点图标。", "outgoing-links": "站外链接", - "outgoing-links.warning-page": "使用站外链接警告页" + "outgoing-links.warning-page": "使用站外链接警告页", + "search-default-sort-by": "默认搜索排序" } \ No newline at end of file diff --git a/public/language/zh-CN/admin/settings/post.json b/public/language/zh-CN/admin/settings/post.json index ecd208c477..a5869c1fc1 100644 --- a/public/language/zh-CN/admin/settings/post.json +++ b/public/language/zh-CN/admin/settings/post.json @@ -8,8 +8,8 @@ "restrictions": "发帖限制", "restrictions.seconds-between": "发帖间隔", "restrictions.seconds-between-new": "对于新用户的发帖间隔", - "restrictions.rep-threshold": "取消此限制之前的威望阈值", - "restrictions.seconds-defore-new": "在新用户可以发帖之前的间隔", + "restrictions.rep-threshold": "取消发帖限制所需的声望值", + "restrictions.seconds-defore-new": "见习时间", "restrictions.seconds-edit-after": "用户在发布后允许编辑帖子的秒数。 (0为禁用) ", "restrictions.seconds-delete-after": "允许在发布后删除帖子的秒数。 (0为禁用) ", "restrictions.replies-no-delete": "在用户被禁止删除自己的主题后的回复数。 (0为禁用) ", @@ -21,7 +21,7 @@ "restrictions.stale-help": "如果某个主题被视为“过时”,则会向尝试回复该主题的用户显示警告。", "timestamp": "时间戳", "timestamp.cut-off": "日期截止日期 (天) ", - "timestamp.cut-off-help": "日期&时间将以相对方式 (例如,“3小时前” / “5天前”) 显示,并且被本地化为各种各样的\n\\t\\t\\t\\t\\t语言。在某一点之后,可以切换该文本以显示本地化日期本身\n\\t\\t\\t\\t\\t (例如2016年11月5日15:30) 。
(默认值: 30 或一个月) 。 设置为0可始终显示日期,留空以始终显示相对时间。", + "timestamp.cut-off-help": "日期&时间将以相对方式 (例如,“3小时前” / “5天前”) 显示,并且会依照访客语言时区转换。在某一时刻之后,可以切换该文本以显示本地化日期本身 (例如2016年11月5日15:30) 。
(默认值: 30 或一个月) 。 设置为0可始终显示日期,留空以始终显示相对时间。", "teaser": "预览帖子", "teaser.last-post": "最后– 显示最新的帖子,包括原帖,如果没有回复", "teaser.last-reply": "最后– 显示最新回复,如果没有回复,则显示“无回复”占位符", diff --git a/public/language/zh-CN/admin/settings/uploads.json b/public/language/zh-CN/admin/settings/uploads.json index ca9f92012e..6c52e63b11 100644 --- a/public/language/zh-CN/admin/settings/uploads.json +++ b/public/language/zh-CN/admin/settings/uploads.json @@ -9,7 +9,7 @@ "allow-topic-thumbnails": "允许用户上传主题缩略图", "topic-thumb-size": "主题缩略图大小", "allowed-file-extensions": "允许的文件扩展名", - "allowed-file-extensions-help": "在这里输入以逗号分隔的文件扩展名(例如:pdf,xls,doc)。\n填写空意味着所有扩展名是允许的。", + "allowed-file-extensions-help": "在此处输入以逗号分隔的文件扩展名列表 (例如 pdf,xls,doc )。 为空则表示允许所有扩展名。", "profile-avatars": "个人头像", "allow-profile-image-uploads": "允许用户上传个人资料照片", "convert-profile-image-png": "转换个人资料图片为 PNG", @@ -25,4 +25,4 @@ "profile-covers": "资料封面", "default-covers": "默认封面图片", "default-covers-help": "为没有上传封面图片的帐户添加以逗号分隔的默认封面图片" -} \ No newline at end of file +} diff --git a/public/language/zh-CN/email.json b/public/language/zh-CN/email.json index 66650a0b02..823d26070f 100644 --- a/public/language/zh-CN/email.json +++ b/public/language/zh-CN/email.json @@ -5,7 +5,7 @@ "greeting_no_name": "您好", "greeting_with_name": "%1,您好", "welcome.text1": "感谢您注册 %1 帐户!", - "welcome.text2": "需要在校验您注册时填写的电子邮箱地址后,才能全面激活您的帐户。", + "welcome.text2": "我们需要在校验您注册时填写的电子邮箱地址后,才能激活您的帐户。", "welcome.text3": "管理员接受了您的注册请求,请用您的用户名和密码登陆。", "welcome.cta": "点击这里确认您的电子邮箱地址", "invitation.text1": "%1 邀请您加入%2", @@ -14,7 +14,7 @@ "reset.text2": "如需继续重置密码,请点击下面的链接:", "reset.cta": "点击这里重置您的密码", "reset.notify.subject": "更改密码成功", - "reset.notify.text1": "您在 %1 上的密码被成功修改。", + "reset.notify.text1": "您在 %1 上的密码已经成功修改。", "reset.notify.text2": "如果你没有授权此操作,请立即联系管理员。", "digest.notifications": "您有来自 %1 的未读通知:", "digest.latest_topics": "来自 %1 的最新主题", diff --git a/public/language/zh-CN/notifications.json b/public/language/zh-CN/notifications.json index 30dc07854d..39f6acb3a1 100644 --- a/public/language/zh-CN/notifications.json +++ b/public/language/zh-CN/notifications.json @@ -19,6 +19,9 @@ "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", diff --git a/public/language/zh-CN/pages.json b/public/language/zh-CN/pages.json index af1f0bedfa..533df5539c 100644 --- a/public/language/zh-CN/pages.json +++ b/public/language/zh-CN/pages.json @@ -6,12 +6,12 @@ "popular-month": "当月热门话题", "popular-alltime": "热门主题", "recent": "最新主题", - "flagged-posts": "已举报的帖子", + "flagged-content": "已举报的内容", "ip-blacklist": "IP 黑名单", "users/online": "在线会员", "users/latest": "最新会员", - "users/sort-posts": "最多发帖的会员", - "users/sort-reputation": "最多积分的会员", + "users/sort-posts": "发帖最多的会员", + "users/sort-reputation": "积分最多的会员", "users/banned": "被封禁的用户", "users/most-flags": "被举报次数最多的用户", "users/search": "会员搜索", @@ -27,6 +27,8 @@ "group": "%1 的用户组", "chats": "聊天", "chat": "与 %1 聊天", + "flags": "举报", + "flag-details": "举报 %1 详情", "account/edit": "正在编辑 \"%1\"", "account/edit/password": "正在编辑 \"%1\" 的密码", "account/edit/username": "正在编辑 \"%1\" 的用户名", diff --git a/public/language/zh-CN/search.json b/public/language/zh-CN/search.json index 691a528d7e..4633e600ed 100644 --- a/public/language/zh-CN/search.json +++ b/public/language/zh-CN/search.json @@ -12,6 +12,7 @@ "reply-count": "回复数", "at-least": "至少", "at-most": "至多", + "relevance": "关联", "post-time": "发帖时间", "newer-than": "晚于", "older-than": "早于", diff --git a/public/language/zh-CN/topic.json b/public/language/zh-CN/topic.json index ec9d3a7242..5491cffe0d 100644 --- a/public/language/zh-CN/topic.json +++ b/public/language/zh-CN/topic.json @@ -13,7 +13,8 @@ "notify_me": "此主题有新回复时通知我", "quote": "引用", "reply": "回复", - "replies_to_this_post": "回复: %1", + "replies_to_this_post": "回复 %1", + "last_reply_time": "最后回复", "reply-as-topic": "在新帖中回复", "guest-login-reply": "登录后回复", "edit": "编辑", @@ -25,28 +26,11 @@ "link": "链接", "share": "分享", "tools": "工具", - "flag": "举报", "locked": "已锁定", "pinned": "已固定", "moved": "已移动", "bookmark_instructions": "点击阅读本主题帖中的最新回复", "flag_title": "举报此帖", - "flag_success": "已举报此回帖。", - "flag_manage_title": "在 1% 中已举报的帖子", - "flag_manage_history": "操作历史", - "flag_manage_no_history": "没有事件历史可汇报", - "flag_manage_assignee": "代理人", - "flag_manage_state": "状态", - "flag_manage_state_open": "新建/打开", - "flag_manage_state_wip": "正在处理", - "flag_manage_state_resolved": "已解决", - "flag_manage_state_rejected": "已拒绝", - "flag_manage_notes": "共享的笔记", - "flag_manage_update": "更新标记状态", - "flag_manage_history_assignee": "已指派给 %1", - "flag_manage_history_state": "更新状态到 1%", - "flag_manage_history_notes": "更新标记笔记", - "flag_manage_saved": "举报详情已更新", "deleted_message": "此主题已被删除。只有拥有主题管理权限的用户可以查看。", "following_topic.message": "当有人回复此主题时,您会收到通知。", "not_following_topic.message": "您将在未读主题列表中看到这个主题,但您不会在帖子被回复时收到通知。", @@ -131,8 +115,5 @@ "stale.warning": "您回复的主题已经非常老了。开个新帖,然后在新帖中引用这个老帖的内容,可以吗?", "stale.create": "创建新主题", "stale.reply_anyway": "仍然回复此帖", - "link_back": "回复: [%1](%2)", - "spam": "垃圾帖", - "offensive": "人身攻击", - "custom-flag-reason": "输入举报原因" + "link_back": "回复: [%1](%2)" } \ No newline at end of file diff --git a/public/language/zh-CN/user.json b/public/language/zh-CN/user.json index ec8ce2a270..30a707014c 100644 --- a/public/language/zh-CN/user.json +++ b/public/language/zh-CN/user.json @@ -33,6 +33,7 @@ "chat": "聊天", "chat_with": "继续与 %1 聊天", "new_chat_with": "开始与 %1 的新会话", + "flag-profile": "举报资料", "follow": "关注", "unfollow": "取消关注", "more": "更多", @@ -64,6 +65,8 @@ "remove_uploaded_picture": "删除已上传的头像", "upload_cover_picture": "上传封面图片", "remove_cover_picture_confirm": "您确定要移除封面图片吗?", + "crop_picture": "剪裁图片", + "upload_cropped_picture": "剪裁并上传", "settings": "设置", "show_email": "显示我的电子邮箱", "show_fullname": "显示我的全名", diff --git a/public/language/zh-CN/users.json b/public/language/zh-CN/users.json index d6795469f2..23a86966db 100644 --- a/public/language/zh-CN/users.json +++ b/public/language/zh-CN/users.json @@ -2,7 +2,7 @@ "latest_users": "最新会员", "top_posters": "发帖排行", "most_reputation": "声望排行", - "most_flags": "最多举报", + "most_flags": "被举报次数最多", "search": "搜索", "enter_username": "输入用户名搜索", "load_more": "加载更多", diff --git a/public/language/zh-TW/admin/advanced/cache.json b/public/language/zh-TW/admin/advanced/cache.json index 5a954f1232..52db0c3668 100644 --- a/public/language/zh-TW/admin/advanced/cache.json +++ b/public/language/zh-TW/admin/advanced/cache.json @@ -1,11 +1,11 @@ { - "post-cache": "Post Cache", - "posts-in-cache": "Posts in Cache", - "average-post-size": "Average Post Size", - "length-to-max": "Length / Max", - "percent-full": "%1% Full", - "post-cache-size": "Post Cache Size", - "items-in-cache": "Items in Cache", - "control-panel": "Control Panel", - "update-settings": "Update Cache Settings" + "post-cache": "文章快取", + "posts-in-cache": "暫存中的文章", + "average-post-size": "平均文章大小", + "length-to-max": "長度 / 最大", + "percent-full": "%1% 已滿", + "post-cache-size": "文章快取大小", + "items-in-cache": "暫存中的項目", + "control-panel": "控制面板", + "update-settings": "更新快取設定" } \ No newline at end of file diff --git a/public/language/zh-TW/admin/advanced/database.json b/public/language/zh-TW/admin/advanced/database.json index f7db6220ee..860a040b3d 100644 --- a/public/language/zh-TW/admin/advanced/database.json +++ b/public/language/zh-TW/admin/advanced/database.json @@ -1,35 +1,35 @@ { "x-b": "%1 b", "x-mb": "%1 mb", - "uptime-seconds": "Uptime in Seconds", - "uptime-days": "Uptime in Days", + "uptime-seconds": "正常運作秒數", + "uptime-days": "正常運作天數", "mongo": "Mongo", - "mongo.version": "MongoDB Version", - "mongo.storage-engine": "Storage Engine", - "mongo.collections": "Collections", - "mongo.objects": "Objects", - "mongo.avg-object-size": "Avg. Object Size", - "mongo.data-size": "Data Size", - "mongo.storage-size": "Storage Size", - "mongo.index-size": "Index Size", - "mongo.file-size": "File Size", - "mongo.resident-memory": "Resident Memory", - "mongo.virtual-memory": "Virtual Memory", - "mongo.mapped-memory": "Mapped Memory", - "mongo.raw-info": "MongoDB Raw Info", + "mongo.version": "MongoDB 版本", + "mongo.storage-engine": "儲存引擎", + "mongo.collections": "收集", + "mongo.objects": "物件", + "mongo.avg-object-size": "平均物件大小", + "mongo.data-size": "資料大小", + "mongo.storage-size": "儲存大小", + "mongo.index-size": "索引大小", + "mongo.file-size": "檔案大小", + "mongo.resident-memory": "常駐記憶體", + "mongo.virtual-memory": "虛擬記憶體", + "mongo.mapped-memory": "映射記憶體", + "mongo.raw-info": "MongoDB 原始資訊", "redis": "Redis", - "redis.version": "Redis Version", - "redis.connected-clients": "Connected Clients", - "redis.connected-slaves": "Connected Slaves", - "redis.blocked-clients": "Blocked Clients", - "redis.used-memory": "Used Memory", - "redis.memory-frag-ratio": "Memory Fragmentation Ratio", - "redis.total-connections-recieved": "Total Connections Received", - "redis.total-commands-processed": "Total Commands Processed", - "redis.iops": "Instantaneous Ops. Per Second", - "redis.keyspace-hits": "Keyspace Hits", - "redis.keyspace-misses": "Keyspace Misses", - "redis.raw-info": "Redis Raw Info" + "redis.version": "Redis 版本", + "redis.connected-clients": "已連接的用戶端", + "redis.connected-slaves": "已連接的從屬端", + "redis.blocked-clients": "已阻擋的用戶端", + "redis.used-memory": "已使用的記憶體", + "redis.memory-frag-ratio": "記憶體碎片比例", + "redis.total-connections-recieved": "已接收的連線數量", + "redis.total-commands-processed": "已處裡的命令數量", + "redis.iops": "每秒操作數量", + "redis.keyspace-hits": "鍵空間命中次數", + "redis.keyspace-misses": "鍵空間未命中次數", + "redis.raw-info": "Redis 原始資料" } \ No newline at end of file diff --git a/public/language/zh-TW/admin/advanced/errors.json b/public/language/zh-TW/admin/advanced/errors.json index 963e68b116..a0fefb4190 100644 --- a/public/language/zh-TW/admin/advanced/errors.json +++ b/public/language/zh-TW/admin/advanced/errors.json @@ -1,14 +1,14 @@ { - "figure-x": "Figure %1", - "error-events-per-day": "%1 events per day", - "error.404": "404 Not Found", - "error.503": "503 Service Unavailable", - "manage-error-log": "Manage Error Log", - "export-error-log": "Export Error Log (CSV)", - "clear-error-log": "Clear Error Log", - "route": "Route", - "count": "Count", - "no-routes-not-found": "Hooray! There are no routes that were not found.", - "clear404-confirm": "Are you sure you wish to clear the 404 error logs?", - "clear404-success": "\"404 Not Found\" errors cleared" + "figure-x": "表 %1", + "error-events-per-day": "%1 事件/天", + "error.404": "404 伺服器無法回應", + "error.503": "503 伺服器忙碌中", + "manage-error-log": "管理錯誤日誌", + "export-error-log": "匯出錯誤日誌 (CSV)", + "clear-error-log": "清除錯誤日誌", + "route": "路由", + "count": "計數", + "no-routes-not-found": "Hooray! No 404 errors!", + "clear404-confirm": "您確定要清除404錯誤日誌嗎?", + "clear404-success": "\"404 Not Found\" 錯誤已清除" } \ No newline at end of file diff --git a/public/language/zh-TW/admin/general/dashboard.json b/public/language/zh-TW/admin/general/dashboard.json index b82802db1b..a70dda322e 100644 --- a/public/language/zh-TW/admin/general/dashboard.json +++ b/public/language/zh-TW/admin/general/dashboard.json @@ -2,6 +2,9 @@ "forum-traffic": "Forum Traffic", "page-views": "Page Views", "unique-visitors": "Unique Visitors", + "users": "Users", + "posts": "Posts", + "topics": "Topics", "page-views-last-month": "Page views Last Month", "page-views-this-month": "Page views This Month", "page-views-last-day": "Page views in last 24 hours", @@ -20,6 +23,11 @@ "prerelease-warning": "

This is a pre-release version of NodeBB. Unintended bugs may occur.

", "notices": "Notices", + "restart-not-required": "Restart not required", + "restart-required": "Restart required", + "search-plugin-installed": "Search Plugin installed", + "search-plugin-not-installed": "Search Plugin not installed", + "search-plugin-tooltip": "Install a search plugin from the plugin page in order to activate search functionality", "control-panel": "System Control", "reload": "Reload", @@ -52,4 +60,4 @@ "graphs.unique-visitors": "Unique Visitors", "graphs.registered-users": "Registered Users", "graphs.anonymous-users": "Anonymous Users" -} \ No newline at end of file +} diff --git a/public/language/zh-TW/admin/menu.json b/public/language/zh-TW/admin/menu.json index 6a4995ea6e..985c540e8a 100644 --- a/public/language/zh-TW/admin/menu.json +++ b/public/language/zh-TW/admin/menu.json @@ -13,7 +13,6 @@ "manage/users": "Users", "manage/registration": "Registration Queue", "manage/groups": "Groups", - "manage/flags": "Flags", "manage/ip-blacklist": "IP Blacklist", "section-settings": "Settings", diff --git a/public/language/zh-TW/admin/settings/general.json b/public/language/zh-TW/admin/settings/general.json index c26740ee4f..72ecfe641f 100644 --- a/public/language/zh-TW/admin/settings/general.json +++ b/public/language/zh-TW/admin/settings/general.json @@ -26,5 +26,6 @@ "touch-icon.upload": "Upload", "touch-icon.help": "Recommended size and format: 192x192, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.", "outgoing-links": "Outgoing Links", - "outgoing-links.warning-page": "Use Outgoing Links Warning Page" + "outgoing-links.warning-page": "Use Outgoing Links Warning Page", + "search-default-sort-by": "Search default sort by" } \ No newline at end of file diff --git a/public/language/zh-TW/admin/settings/group.json b/public/language/zh-TW/admin/settings/group.json index 1ae88c9cf5..acec8abd7c 100644 --- a/public/language/zh-TW/admin/settings/group.json +++ b/public/language/zh-TW/admin/settings/group.json @@ -1,12 +1,12 @@ { - "general": "General", - "private-groups": "Private Groups", - "private-groups.help": "If enabled, joining of groups requires the approval of the group owner (Default: enabled)", + "general": "一般", + "private-groups": "私人群組", + "private-groups.help": "如果開啟,加入群組需要經過群組擁有者批準 (預設: enabled)", "private-groups.warning": "Beware! If this option is disabled and you have private groups, they automatically become public.", - "allow-creation": "Allow Group Creation", - "allow-creation-help": "If enabled, users can create groups (Default: disabled)", - "max-name-length": "Maximum Group Name Length", - "cover-image": "Group Cover Image", - "default-cover": "Default Cover Images", + "allow-creation": "允許建立群組", + "allow-creation-help": "如果開啟,使用者可自行建立群組 (預設: disabled)", + "max-name-length": "群組最大名稱長度", + "cover-image": "群組封面圖像", + "default-cover": "預設封面圖像", "default-cover-help": "Add comma-separated default cover images for groups that don't have an uploaded cover image" } \ No newline at end of file diff --git a/public/language/zh-TW/admin/settings/notifications.json b/public/language/zh-TW/admin/settings/notifications.json index 4eff7f341a..6d4a1e4771 100644 --- a/public/language/zh-TW/admin/settings/notifications.json +++ b/public/language/zh-TW/admin/settings/notifications.json @@ -1,5 +1,5 @@ { - "notifications": "Notifications", - "welcome-notification": "Welcome Notification", - "welcome-notification-link": "Welcome Notification Link" + "notifications": "告示", + "welcome-notification": "歡迎告示", + "welcome-notification-link": "歡迎告示連結" } \ No newline at end of file diff --git a/public/language/zh-TW/admin/settings/sockets.json b/public/language/zh-TW/admin/settings/sockets.json index d04ee42fcf..37e7ce858f 100644 --- a/public/language/zh-TW/admin/settings/sockets.json +++ b/public/language/zh-TW/admin/settings/sockets.json @@ -1,6 +1,6 @@ { - "reconnection": "Reconnection Settings", - "max-attempts": "Max Reconnection Attempts", - "default-placeholder": "Default: %1", - "delay": "Reconnection Delay" + "reconnection": "重新連接設定", + "max-attempts": "最大重試次數", + "default-placeholder": "預設: %1", + "delay": "重新連接延遲時間" } \ No newline at end of file diff --git a/public/language/zh-TW/admin/settings/uploads.json b/public/language/zh-TW/admin/settings/uploads.json index 8a56c85663..35eaa5a58f 100644 --- a/public/language/zh-TW/admin/settings/uploads.json +++ b/public/language/zh-TW/admin/settings/uploads.json @@ -9,7 +9,7 @@ "allow-topic-thumbnails": "Allow users to upload topic thumbnails", "topic-thumb-size": "Topic Thumb Size", "allowed-file-extensions": "Allowed File Extensions", - "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc).\n\t\t\t\t\tAn empty list means all extensions are allowed.", + "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc). An empty list means all extensions are allowed.", "profile-avatars": "Profile Avatars", "allow-profile-image-uploads": "Allow users to upload profile images", "convert-profile-image-png": "Convert profile image uploads to PNG", @@ -25,4 +25,4 @@ "profile-covers": "Profile Covers", "default-covers": "Default Cover Images", "default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image" -} \ No newline at end of file +} diff --git a/public/language/zh-TW/notifications.json b/public/language/zh-TW/notifications.json index 6028595b2f..3e96be1089 100644 --- a/public/language/zh-TW/notifications.json +++ b/public/language/zh-TW/notifications.json @@ -19,6 +19,9 @@ "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 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 發布一個回覆給: %2", "user_posted_to_dual": "%1%2 已經張貼回覆到: %3", "user_posted_to_multiple": "%1 與 %2 其他人已經張貼回覆到: %3", diff --git a/public/language/zh-TW/pages.json b/public/language/zh-TW/pages.json index 0f3a3a5e1e..708850a33d 100644 --- a/public/language/zh-TW/pages.json +++ b/public/language/zh-TW/pages.json @@ -6,7 +6,7 @@ "popular-month": "本月受歡迎的主題", "popular-alltime": "所有時間受歡迎的主題", "recent": "近期的主題", - "flagged-posts": "標記的張貼", + "flagged-content": "Flagged Content", "ip-blacklist": "IP Blacklist", "users/online": "線上使用者", "users/latest": "最近使用者", @@ -27,6 +27,8 @@ "group": "%1 群組", "chats": "聊天", "chat": "與 %1 聊天", + "flags": "Flags", + "flag-details": "Flag %1 Details", "account/edit": "編輯 \"%1\"", "account/edit/password": "編輯 \"%1\" 的密碼", "account/edit/username": "編輯\"%1\"的帳號", diff --git a/public/language/zh-TW/search.json b/public/language/zh-TW/search.json index ea8bef2be4..81f5249d3b 100644 --- a/public/language/zh-TW/search.json +++ b/public/language/zh-TW/search.json @@ -12,6 +12,7 @@ "reply-count": "回覆數量", "at-least": "最少", "at-most": "最多", + "relevance": "Relevance", "post-time": "張貼時間", "newer-than": "較新", "older-than": "較舊", diff --git a/public/language/zh-TW/topic.json b/public/language/zh-TW/topic.json index a9b4eb1c28..292490d858 100644 --- a/public/language/zh-TW/topic.json +++ b/public/language/zh-TW/topic.json @@ -13,7 +13,8 @@ "notify_me": "該主題有新回覆時通知我", "quote": "引用", "reply": "回覆", - "replies_to_this_post": "Replies: %1", + "replies_to_this_post": "%1 Replies", + "last_reply_time": "Last reply", "reply-as-topic": "回復為另一個新主題", "guest-login-reply": "登入以回覆", "edit": "編輯", @@ -25,28 +26,11 @@ "link": "鏈接", "share": "分享", "tools": "工具", - "flag": "檢舉", "locked": "已鎖定", "pinned": "釘住", "moved": "移動", "bookmark_instructions": "點擊這裡返回到這個討論串的最後一篇張貼文", "flag_title": "檢舉這篇文章, 交給仲裁者來審閱.", - "flag_success": "這文章已經被檢舉要求仲裁.", - "flag_manage_title": "Flagged post in %1", - "flag_manage_history": "Action History", - "flag_manage_no_history": "No event history to report", - "flag_manage_assignee": "Assignee", - "flag_manage_state": "State", - "flag_manage_state_open": "New/Open", - "flag_manage_state_wip": "Work in Progress", - "flag_manage_state_resolved": "Resolved", - "flag_manage_state_rejected": "Rejected", - "flag_manage_notes": "Shared Notes", - "flag_manage_update": "Update Flag Status", - "flag_manage_history_assignee": "Assigned to %1", - "flag_manage_history_state": "Updated state to %1", - "flag_manage_history_notes": "Updated flag notes", - "flag_manage_saved": "Flag Details Updated", "deleted_message": "此主題已被刪除。只有具有主題管理權限的使用者才能看到它。", "following_topic.message": "有人貼文回覆主題時, 你將會收到新通知.", "not_following_topic.message": "你將會看到這個主題在未讀主題列表中出現,但你將不會在其他人張貼到這個主題時接收到通知。", @@ -131,8 +115,5 @@ "stale.warning": "你正回覆的主題是非常舊的一篇。你想要改為建立一個新主題,然後參考到這篇你回覆的?", "stale.create": "建立新主題", "stale.reply_anyway": "無論如何都回覆這個主題", - "link_back": "回覆: [%1](%2)", - "spam": "灌水", - "offensive": "攻擊", - "custom-flag-reason": "輸入標記的理由" + "link_back": "回覆: [%1](%2)" } \ No newline at end of file diff --git a/public/language/zh-TW/user.json b/public/language/zh-TW/user.json index a67efa65b6..631a63d81c 100644 --- a/public/language/zh-TW/user.json +++ b/public/language/zh-TW/user.json @@ -33,6 +33,7 @@ "chat": "聊天", "chat_with": "Continue chat with %1", "new_chat_with": "Start new chat with %1", + "flag-profile": "Flag Profile", "follow": "跟隨", "unfollow": "取消跟隨", "more": "更多", @@ -64,6 +65,8 @@ "remove_uploaded_picture": "移除上傳的圖片", "upload_cover_picture": "上傳封面圖片", "remove_cover_picture_confirm": "Are you sure you want to remove the cover picture?", + "crop_picture": "Crop picture", + "upload_cropped_picture": "Crop and upload", "settings": "設定", "show_email": "顯示我的電子郵件地址", "show_fullname": "顯示我的全名", diff --git a/public/less/admin/admin.less b/public/less/admin/admin.less index aa5efff256..23f3bead8c 100644 --- a/public/less/admin/admin.less +++ b/public/less/admin/admin.less @@ -146,7 +146,7 @@ body { color: @gray-dark; &:hover, &.selected { - background: black; + background: @brand-primary; color: white; } } diff --git a/public/less/admin/general/navigation.less b/public/less/admin/general/navigation.less index 3e10639b89..583ec382e1 100644 --- a/public/less/admin/general/navigation.less +++ b/public/less/admin/general/navigation.less @@ -1,10 +1,10 @@ #navigation { #active-navigation { - width: 100%; + float: none; min-height: 50px; border: 1px solid #eee; overflow: auto; - + .active { background-color: #eee; } diff --git a/public/less/admin/manage/groups.less b/public/less/admin/manage/groups.less index f0de916162..57057cc9ff 100644 --- a/public/less/admin/manage/groups.less +++ b/public/less/admin/manage/groups.less @@ -5,10 +5,25 @@ max-height: 500px; display: block; overflow-y: auto; - padding-bottom: 100px; .member-name { width: 100%; } } } -} \ No newline at end of file + + #group-icon { + cursor: pointer; + } +} + +.groups { + #group-search { + margin-bottom: 10px; + } + + .groups-list { + p { + margin: 0; + } + } +} diff --git a/public/less/admin/manage/tags.less b/public/less/admin/manage/tags.less index 34075816b1..fc4ea9f2e1 100644 --- a/public/less/admin/manage/tags.less +++ b/public/less/admin/manage/tags.less @@ -25,30 +25,7 @@ } } - .tag-item { - border: solid 1px @gray-light; - background-color: transparent; - color: @gray-light; - padding: .2em .6em .3em; - font-size: 75%; - font-weight: 700; - white-space: nowrap; - } - .tag-topic-count { - border: solid 1px lighten(@brand-primary, 20%); - background-color: lighten(@brand-primary, 20%); - padding: 6px; - font-size: 75%; - font-weight: 700; - white-space: nowrap; - border-left: none; - padding-right: 5px; - padding-left: 5px; - border-width: 1px 1px 2px medium; - - a { - color: #FFFFFF; - } + font-size: 14px; } } \ No newline at end of file diff --git a/public/less/admin/mobile.less b/public/less/admin/mobile.less index e0e8ddb1dc..c192351885 100644 --- a/public/less/admin/mobile.less +++ b/public/less/admin/mobile.less @@ -2,14 +2,19 @@ display: none; } -@media (max-width: 1200px) { - -} - @media (max-width: 991px) { body { height: 100%; } + + #panel { + background-color: inherit; + min-height: 100%; + } + + body, #panel, .slideout-menu { + -webkit-overflow-scrolling: touch; + } .header { height: 58px; diff --git a/public/less/generics.less b/public/less/generics.less index 8533dd33b9..5193627445 100644 --- a/public/less/generics.less +++ b/public/less/generics.less @@ -129,4 +129,14 @@ .admin .ban-modal .units { line-height: 1.846; -} \ No newline at end of file +} + +#crop-picture-modal { + #cropped-image { + max-width: 100%; + } + + .cropper-container.cropper-bg { + max-width: 100%; + } +} diff --git a/public/src/admin/admin.js b/public/src/admin/admin.js index 7a5a213195..c4d92d63bc 100644 --- a/public/src/admin/admin.js +++ b/public/src/admin/admin.js @@ -1,5 +1,5 @@ "use strict"; -/*global config, componentHandler, socket, app, bootbox, Slideout, NProgress*/ +/*global config, componentHandler, socket, app, bootbox, Slideout, NProgress, utils*/ (function () { var logoutTimer = 0; @@ -176,13 +176,19 @@ } function configureSlidemenu() { + var env = utils.findBootstrapEnvironment(); + var slideout = new Slideout({ 'panel': document.getElementById('panel'), 'menu': document.getElementById('menu'), 'padding': 256, 'tolerance': 70 }); - + + if (env === 'md' || env === 'lg') { + slideout.disableTouch(); + } + $('#mobile-menu').on('click', function () { slideout.toggle(); }); @@ -193,6 +199,20 @@ $(window).on('resize', function () { slideout.close(); + + env = utils.findBootstrapEnvironment(); + + if (env === 'md' || env === 'lg') { + slideout.disableTouch(); + $('#header').css({ + 'position': 'relative' + }); + } else { + slideout.enableTouch(); + $('#header').css({ + 'position': 'fixed' + }); + } }); function onOpeningMenu() { @@ -202,10 +222,8 @@ }); } - slideout.on('beforeopen', onOpeningMenu); slideout.on('open', onOpeningMenu); - slideout.on('translate', onOpeningMenu); - + slideout.on('close', function () { $('#header').css({ 'top': '0px', diff --git a/public/src/admin/general/sounds.js b/public/src/admin/general/sounds.js index 64926e60db..259b21f657 100644 --- a/public/src/admin/general/sounds.js +++ b/public/src/admin/general/sounds.js @@ -1,7 +1,7 @@ "use strict"; /* global app, define, socket */ -define('admin/general/sounds', ['sounds', 'settings'], function (Sounds, Settings) { +define('admin/general/sounds', ['sounds', 'settings', 'admin/settings'], function (Sounds, Settings, AdminSettings) { var SoundsAdmin = {}; SoundsAdmin.init = function () { @@ -9,8 +9,8 @@ define('admin/general/sounds', ['sounds', 'settings'], function (Sounds, Setting $('.sounds').find('button[data-action="play"]').on('click', function (e) { e.preventDefault(); - var fileName = $(this).parent().parent().find('select').val(); - Sounds.playFile(fileName); + var soundName = $(this).parent().parent().find('select').val(); + Sounds.playSound(soundName); }); // Load Form Values @@ -26,6 +26,8 @@ define('admin/general/sounds', ['sounds', 'settings'], function (Sounds, Setting app.alertSuccess('[[admin/general/sounds:saved]]'); }); }); + + AdminSettings.prepare(); }; return SoundsAdmin; diff --git a/public/src/admin/manage/group.js b/public/src/admin/manage/group.js index a64ca9dd63..05337f9f97 100644 --- a/public/src/admin/manage/group.js +++ b/public/src/admin/manage/group.js @@ -7,10 +7,10 @@ define('admin/manage/group', [ 'admin/modules/colorpicker', 'translator' ], function (memberList, iconSelect, colorpicker, translator) { - var Groups = {}; + var Groups = {}; Groups.init = function () { - var groupDetailsSearch = $('#group-details-search'), + var groupDetailsSearch = $('#group-details-search'), groupDetailsSearchResults = $('#group-details-search-results'), groupIcon = $('#group-icon'), changeGroupUserTitle = $('#change-group-user-title'), @@ -41,9 +41,12 @@ define('admin/manage/group', [ var searchText = groupDetailsSearch.val(), foundUser; - socket.emit('admin.user.search', {query: searchText}, function (err, results) { + socket.emit('admin.user.search', { + query: searchText + }, function (err, results) { if (!err && results && results.users.length > 0) { - var numResults = results.users.length, x; + var numResults = results.users.length, + x; if (numResults > 20) { numResults = 20; } @@ -53,7 +56,8 @@ define('admin/manage/group', [ for (x = 0; x < numResults; x++) { foundUser = $('
  • '); foundUser - .attr({title: results.users[x].username, + .attr({ + title: results.users[x].username, 'data-uid': results.users[x].uid, 'data-username': results.users[x].username, 'data-userslug': results.users[x].userslug, @@ -96,7 +100,12 @@ define('admin/manage/group', [ "icon:text": userLabel.attr('data-usericon-text') }; - templates.parse('partials/groups/memberlist', 'members', {group: {isOwner: ajaxify.data.group.isOwner, members: [member]}}, function (html) { + templates.parse('admin/partials/groups/memberlist', 'members', { + group: { + isOwner: ajaxify.data.group.isOwner, + members: [member] + } + }, function (html) { translator.translate(html, function (html) { $('[component="groups/members"] tbody').prepend(html); }); @@ -112,38 +121,38 @@ define('admin/manage/group', [ uid = userRow.attr('data-uid'), action = btnEl.attr('data-action'); - switch(action) { - case 'toggleOwnership': - socket.emit('groups.' + (isOwner ? 'rescind' : 'grant'), { - toUid: uid, + switch (action) { + case 'toggleOwnership': + socket.emit('groups.' + (isOwner ? 'rescind' : 'grant'), { + toUid: uid, + groupName: groupName + }, function (err) { + if (err) { + return app.alertError(err.message); + } + ownerFlagEl.toggleClass('invisible'); + }); + break; + + case 'kick': + bootbox.confirm('[[admin/manage/groups:edit.confirm-remove-user]]', function (confirm) { + if (!confirm) { + return; + } + socket.emit('admin.groups.leave', { + uid: uid, groupName: groupName }, function (err) { if (err) { return app.alertError(err.message); } - ownerFlagEl.toggleClass('invisible'); + userRow.slideUp().remove(); }); - break; - case 'kick': - bootbox.confirm('[[admin/manage/groups:edit.confirm-remove-user]]', function (confirm) { - if (!confirm) { - return; - } - socket.emit('admin.groups.leave', { - uid: uid, - groupName: groupName - }, function (err) { - if (err) { - return app.alertError(err.message); - } - userRow.slideUp().remove(); - }); - - }); - break; - default: - break; + }); + break; + default: + break; } }); @@ -155,7 +164,7 @@ define('admin/manage/group', [ groupLabelPreview.css('background-color', '#' + hex); }); - $('.save').on('click', function () { + $('#save').on('click', function () { socket.emit('admin.groups.update', { groupName: groupName, values: { diff --git a/public/src/admin/manage/ip-blacklist.js b/public/src/admin/manage/ip-blacklist.js index 2e9963b75f..321bc9fac1 100644 --- a/public/src/admin/manage/ip-blacklist.js +++ b/public/src/admin/manage/ip-blacklist.js @@ -20,7 +20,7 @@ define('admin/manage/ip-blacklist', ['translator'], function (translator) { app.alert({ type: 'success', alert_id: 'blacklist-saved', - title: '[[admin/manage/ip-blacklist:alerts.applied]]', + title: '[[admin/manage/ip-blacklist:alerts.applied-success]]', }); }); }); diff --git a/public/src/admin/manage/tags.js b/public/src/admin/manage/tags.js index 9984c8182d..9ead604c3f 100644 --- a/public/src/admin/manage/tags.js +++ b/public/src/admin/manage/tags.js @@ -6,7 +6,7 @@ define('admin/manage/tags', [ 'admin/modules/selectable', 'admin/modules/colorpicker' ], function (infinitescroll, selectable, colorpicker) { - var Tags = {}, + var Tags = {}, timeoutId = 0; Tags.init = function () { @@ -61,12 +61,16 @@ define('admin/manage/tags', [ } timeoutId = setTimeout(function () { - socket.emit('topics.searchAndLoadTags', {query: $('#tag-search').val()}, function (err, result) { + socket.emit('topics.searchAndLoadTags', { + query: $('#tag-search').val() + }, function (err, result) { if (err) { return app.alertError(err.message); } - app.parseAndTranslate('admin/manage/tags', 'tags', {tags: result.tags}, function (html) { + app.parseAndTranslate('admin/manage/tags', 'tags', { + tags: result.tags + }, function (html) { $('.tag-list').html(html); utils.makeNumbersHumanReadable(html.find('.human-readable-number')); timeoutId = 0; @@ -86,10 +90,10 @@ define('admin/manage/tags', [ } var firstTag = $(tagsToModify[0]), - title = tagsToModify.length > 1 ? '[[admin/manage/tags:alerts.editing-multiple]]' : '[[admin/manage/tags:alerts.editing-x, ' + firstTag.find('.tag-item').text() + ']]'; + title = tagsToModify.length > 1 ? '[[admin/manage/tags:alerts.editing-multiple]]' : '[[admin/manage/tags:alerts.editing-x, ' + firstTag.find('.tag-item').attr('data-tag') + ']]'; var modal = bootbox.dialog({ - title: title, + title: title, message: firstTag.find('.tag-modal').html(), buttons: { success: { @@ -133,7 +137,9 @@ define('admin/manage/tags', [ tagsToDelete.each(function (index, el) { tags.push($(el).attr('data-tag')); }); - socket.emit('admin.tags.deleteTags', {tags: tags}, function (err) { + socket.emit('admin.tags.deleteTags', { + tags: tags + }, function (err) { if (err) { return app.alertError(err.message); } @@ -155,8 +161,8 @@ define('admin/manage/tags', [ function save(tag) { var data = { tag: tag.attr('data-tag'), - bgColor : tag.find('[data-name="bgColor"]').val(), - color : tag.find('[data-name="color"]').val() + bgColor: tag.find('[data-name="bgColor"]').val(), + color: tag.find('[data-name="color"]').val() }; socket.emit('admin.tags.update', data, function (err) { @@ -169,4 +175,4 @@ define('admin/manage/tags', [ } return Tags; -}); \ No newline at end of file +}); diff --git a/public/src/ajaxify.js b/public/src/ajaxify.js index 02a3cddc1c..4e1a576035 100644 --- a/public/src/ajaxify.js +++ b/public/src/ajaxify.js @@ -249,48 +249,37 @@ $(document).ready(function () { $(window).trigger('action:script.load', data); // Require and parse modules - var outstanding = 0; - var onReady = function () { - if (outstanding) { - return setTimeout(onReady, 100); - } + var outstanding = data.scripts.length; - data.scripts = data.scripts.filter(Boolean); - data.scripts.forEach(function (functionRef) { - functionRef(); + data.scripts.map(function (script) { + if (typeof script === 'function') { + return function (next) { + script(); + next(); + }; + } + if (typeof script === 'string') { + return function (next) { + require([script], function (script) { + if (script && script.init) { + script.init(); + } + next(); + }, function () { + // ignore 404 error + next(); + }); + }; + } + return null; + }).filter(Boolean).forEach(function (fn) { + fn(function () { + outstanding -= 1; + if (outstanding === 0) { + callback(); + } }); - - callback(); - }; - - data.scripts.forEach(function (script, idx) { - switch (typeof script) { - case 'string': - ++outstanding; - (function (idx) { - require([script], function (script) { - if (script && script.init) { - data.scripts[idx] = script.init; - } else { - data.scripts[idx] = null; - } - --outstanding; - }); - }(idx)); - break; - - case 'function': - // No changes needed - break; - - default: - // Neither? No comprende - data.scripts[idx] = undefined; - break; - } }); - - onReady(); }; ajaxify.loadData = function (url, callback) { @@ -333,7 +322,7 @@ $(document).ready(function () { callback(templates.cache[template]); } else { $.ajax({ - url: RELATIVE_PATH + '/templates/' + template + '.tpl' + (config['cache-buster'] ? '?v=' + config['cache-buster'] : ''), + url: config.relative_path + '/assets/templates/' + template + '.tpl' + '?' + config['cache-buster'], type: 'GET', success: function (data) { callback(data.toString()); diff --git a/public/src/app.js b/public/src/app.js index fe12a7adfc..85bb5065aa 100644 --- a/public/src/app.js +++ b/public/src/app.js @@ -77,7 +77,6 @@ app.cacheBuster = null; require(['taskbar', 'helpers', 'forum/pagination'], function (taskbar, helpers, pagination) { taskbar.init(); - // templates.js helpers helpers.register(); pagination.init(); @@ -558,7 +557,7 @@ app.cacheBuster = null; var scriptEl = document.createElement('script'); scriptEl.type = 'text/javascript'; - scriptEl.src = config.relative_path + '/vendor/jquery/js/jquery-ui.js' + (app.cacheBuster ? '?v=' + app.cacheBuster : ''); + scriptEl.src = config.relative_path + '/assets/vendor/jquery/js/jquery-ui.js' + '?' + config['cache-buster']; scriptEl.onload = callback; document.head.appendChild(scriptEl); }; @@ -625,7 +624,7 @@ app.cacheBuster = null; app.loadProgressiveStylesheet = function () { var linkEl = document.createElement('link'); linkEl.rel = 'stylesheet'; - linkEl.href = config.relative_path + '/js-enabled.css'; + linkEl.href = config.relative_path + '/assets/js-enabled.css'; document.head.appendChild(linkEl); }; diff --git a/public/src/client/account/edit.js b/public/src/client/account/edit.js index 4dbf805285..86b9dcafe6 100644 --- a/public/src/client/account/edit.js +++ b/public/src/client/account/edit.js @@ -2,7 +2,7 @@ /* globals define, ajaxify, socket, app, config, templates, bootbox */ -define('forum/account/edit', ['forum/account/header', 'uploader', 'translator', 'components'], function (header, uploader, translator, components) { +define('forum/account/edit', ['forum/account/header', 'translator', 'components', 'pictureCropper'], function (header, translator, components, pictureCropper) { var AccountEdit = {}; AccountEdit.init = function () { @@ -73,7 +73,9 @@ define('forum/account/edit', ['forum/account/header', 'uploader', 'translator', function handleImageChange() { $('#changePictureBtn').on('click', function () { - socket.emit('user.getProfilePictures', {uid: ajaxify.data.uid}, function (err, pictures) { + socket.emit('user.getProfilePictures', { + uid: ajaxify.data.uid + }, function (err, pictures) { if (err) { return app.alertError(err.message); } @@ -214,15 +216,20 @@ define('forum/account/edit', ['forum/account/header', 'uploader', 'translator', modal.find('[data-action="upload"]').on('click', function () { modal.modal('hide'); - uploader.show({ - route: config.relative_path + '/api/user/' + ajaxify.data.userslug + '/uploadpicture', - params: {}, + pictureCropper.show({ + socketMethod: 'user.uploadCroppedPicture', + aspectRatio: 1 / 1, + paramName: 'uid', + 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' - }, function (imageUrlOnServer) { - onUploadComplete(imageUrlOnServer); + }, function (url) { + onUploadComplete(url); }); return false; @@ -240,14 +247,19 @@ define('forum/account/edit', ['forum/account/header', 'uploader', 'translator', if (!url) { return; } - socket.emit('user.uploadProfileImageFromUrl', {url: url, uid: ajaxify.data.theirid}, function (err, imageUrlOnServer) { - if (err) { - return app.alertError(err.message); - } - onUploadComplete(imageUrlOnServer); - uploadModal.modal('hide'); - }); + uploadModal.modal('hide'); + + pictureCropper.handleImageCrop({ + url: url, + socketMethod: 'user.uploadCroppedPicture', + aspectRatio: '1 / 1', + allowSkippingCrop: false, + restrictImageDimension: true, + imageDimension: ajaxify.data.profileImageDimension, + paramName: 'uid', + paramValue: ajaxify.data.theirid, + }, onUploadComplete); return false; }); @@ -258,7 +270,9 @@ define('forum/account/edit', ['forum/account/header', 'uploader', 'translator', }); modal.find('[data-action="remove-uploaded"]').on('click', function () { - socket.emit('user.removeUploadedPicture', {uid: ajaxify.data.theirid}, function (err) { + socket.emit('user.removeUploadedPicture', { + uid: ajaxify.data.theirid + }, function (err) { modal.modal('hide'); if (err) { return app.alertError(err.message); diff --git a/public/src/client/account/header.js b/public/src/client/account/header.js index e99b7ee0a8..63869af05b 100644 --- a/public/src/client/account/header.js +++ b/public/src/client/account/header.js @@ -3,10 +3,10 @@ define('forum/account/header', [ 'coverPhoto', - 'uploader', + 'pictureCropper', 'components', 'translator' -], function (coverPhoto, uploader, components, translator) { +], function (coverPhoto, pictureCropper, components, translator) { var AccountHeader = {}; var isAdminOrSelfOrGlobalMod; @@ -42,7 +42,9 @@ define('forum/account/header', [ }); components.get('account/new-chat').on('click', function () { - app.newChat(ajaxify.data.uid); + app.newChat(ajaxify.data.uid, function () { + components.get('account/chat').parent().removeClass('hidden'); + }); }); @@ -78,13 +80,17 @@ define('forum/account/header', [ }, callback); }, function () { - uploader.show({ + pictureCropper.show({ title: '[[user:upload_cover_picture]]', - route: config.relative_path + '/api/user/' + ajaxify.data.userslug + '/uploadcover', - params: {uid: ajaxify.data.uid }, + socketMethod: 'user.updateCover', + aspectRatio: NaN, + allowSkippingCrop: true, + restrictImageDimension: false, + paramName: 'uid', + paramValue: ajaxify.data.theirid, accept: '.png,.jpg,.bmp' }, function (imageUrlOnServer) { - components.get('account/cover').css('background-image', 'url(' + imageUrlOnServer + '?v=' + Date.now() + ')'); + components.get('account/cover').css('background-image', 'url(' + imageUrlOnServer + '?' + config['cache-buster'] + ')'); }); }, removeCover @@ -127,7 +133,11 @@ define('forum/account/header', [ }, {}); var until = parseInt(formData.length, 10) ? (Date.now() + formData.length * 1000 * 60 * 60 * (parseInt(formData.unit, 10) ? 24 : 1)) : 0; - socket.emit('user.banUsers', { uids: [ajaxify.data.theirid], until: until, reason: formData.reason || '' }, function (err) { + socket.emit('user.banUsers', { + uids: [ajaxify.data.theirid], + until: until, + reason: formData.reason || '' + }, function (err) { if (err) { return app.alertError(err.message); } @@ -173,7 +183,7 @@ define('forum/account/header', [ if (!confirm) { return; } - + socket.emit('user.removeCover', { uid: ajaxify.data.uid }, function (err) { diff --git a/public/src/client/account/settings.js b/public/src/client/account/settings.js index b2220d69a2..e04d5117ff 100644 --- a/public/src/client/account/settings.js +++ b/public/src/client/account/settings.js @@ -36,8 +36,8 @@ define('forum/account/settings', ['forum/account/header', 'components', 'sounds' $('.account').find('button[data-action="play"]').on('click', function (e) { e.preventDefault(); - var fileName = $(this).parent().parent().find('select').val(); - sounds.playFile(fileName); + var soundName = $(this).parent().parent().find('select').val(); + sounds.playSound(soundName); }); toggleCustomRoute(); @@ -89,7 +89,7 @@ define('forum/account/settings', ['forum/account/header', 'components', 'sounds' } } - sounds.reloadMapping(); + sounds.loadMap(); if (requireReload && parseInt(app.user.uid, 10) === parseInt(ajaxify.data.theirid, 10)) { app.alert({ diff --git a/public/src/client/category.js b/public/src/client/category.js index 24b0d274f6..d0af1d21b2 100644 --- a/public/src/client/category.js +++ b/public/src/client/category.js @@ -58,12 +58,25 @@ define('forum/category', [ }); }); + handleScrollToTopicIndex(); + handleIgnoreWatch(cid); $(window).trigger('action:topics.loaded', {topics: ajaxify.data.topics}); $(window).trigger('action:category.loaded', {cid: ajaxify.data.cid}); }; + function handleScrollToTopicIndex() { + var parts = window.location.pathname.split('/'); + var topicIndex = parts[parts.length - 1]; + if (topicIndex && utils.isNumber(topicIndex)) { + topicIndex = Math.max(0, parseInt(topicIndex, 10) - 1); + if (topicIndex && window.location.search.indexOf('page=') === -1) { + navigator.scrollToElement($('[component="category/topic"][data-index="' + topicIndex + '"]'), true, 0); + } + } + } + function handleIgnoreWatch(cid) { $('[component="category/watching"], [component="category/ignoring"]').on('click', function () { var $this = $(this); @@ -104,14 +117,10 @@ define('forum/category', [ }; $(window).on('action:ajaxify.contentLoaded', function (ev, data) { - if (ajaxify.data.template.category) { - var cid = ajaxify.data.cid; - if (!cid) { - return; - } + if (ajaxify.data.template.category && ajaxify.data.cid) { - var bookmarkIndex = localStorage.getItem('category:' + cid + ':bookmark'); - var clickedIndex = localStorage.getItem('category:' + cid + ':bookmark:clicked'); + var bookmarkIndex = localStorage.getItem('category:' + ajaxify.data.cid + ':bookmark'); + var clickedIndex = localStorage.getItem('category:' + ajaxify.data.cid + ':bookmark:clicked'); bookmarkIndex = Math.max(0, parseInt(bookmarkIndex, 10) || 0); clickedIndex = Math.max(0, parseInt(clickedIndex, 10) || 0); diff --git a/public/src/client/groups/details.js b/public/src/client/groups/details.js index 96610baf38..6d0559add3 100644 --- a/public/src/client/groups/details.js +++ b/public/src/client/groups/details.js @@ -6,10 +6,10 @@ define('forum/groups/details', [ 'iconSelect', 'components', 'coverPhoto', - 'uploader', + 'pictureCropper', 'translator', 'vendor/colorpicker/colorpicker' -], function (memberList, iconSelect, components, coverPhoto, uploader, translator) { +], function (memberList, iconSelect, components, coverPhoto, pictureCropper, translator) { var Details = {}; var groupName; @@ -31,10 +31,14 @@ define('forum/groups/details', [ }, callback); }, function () { - uploader.show({ + pictureCropper.show({ title: '[[groups:upload-group-cover]]', - route: config.relative_path + '/api/groups/uploadpicture', - params: {groupName: groupName} + socketMethod: 'groups.cover.update', + aspectRatio: NaN, + allowSkippingCrop: true, + restrictImageDimension: false, + paramName: 'groupName', + paramValue: groupName }, function (imageUrlOnServer) { components.get('groups/cover').css('background-image', 'url(' + imageUrlOnServer + ')'); }); @@ -57,62 +61,62 @@ define('forum/groups/details', [ uid = userRow.attr('data-uid'), action = btnEl.attr('data-action'); - switch(action) { - case 'toggleOwnership': - socket.emit('groups.' + (isOwner ? 'rescind' : 'grant'), { - toUid: uid, - groupName: groupName - }, function (err) { - if (!err) { - ownerFlagEl.toggleClass('invisible'); - } else { - app.alertError(err.message); - } - }); - break; + switch (action) { + case 'toggleOwnership': + socket.emit('groups.' + (isOwner ? 'rescind' : 'grant'), { + toUid: uid, + groupName: groupName + }, function (err) { + if (!err) { + ownerFlagEl.toggleClass('invisible'); + } else { + app.alertError(err.message); + } + }); + break; - case 'kick': - socket.emit('groups.kick', { - uid: uid, - groupName: groupName - }, function (err) { - if (!err) { - userRow.slideUp().remove(); - } else { - app.alertError(err.message); - } - }); - break; + case 'kick': + socket.emit('groups.kick', { + uid: uid, + groupName: groupName + }, function (err) { + if (!err) { + userRow.slideUp().remove(); + } else { + app.alertError(err.message); + } + }); + break; - case 'update': - Details.update(); - break; + case 'update': + Details.update(); + break; - case 'delete': - Details.deleteGroup(); - break; + case 'delete': + Details.deleteGroup(); + break; - case 'join': // intentional fall-throughs! - case 'leave': - case 'accept': - case 'reject': - case 'issueInvite': - case 'rescindInvite': - case 'acceptInvite': - case 'rejectInvite': - case 'acceptAll': - case 'rejectAll': - socket.emit('groups.' + action, { - toUid: uid, - groupName: groupName - }, function (err) { - if (!err) { - ajaxify.refresh(); - } else { - app.alertError(err.message); - } - }); - break; + case 'join': // intentional fall-throughs! + case 'leave': + case 'accept': + case 'reject': + case 'issueInvite': + case 'rescindInvite': + case 'acceptInvite': + case 'rejectInvite': + case 'acceptAll': + case 'rejectAll': + socket.emit('groups.' + action, { + toUid: uid, + groupName: groupName + }, function (err) { + if (!err) { + ajaxify.refresh(); + } else { + app.alertError(err.message); + } + }); + break; } }); }; @@ -271,7 +275,7 @@ define('forum/groups/details', [ if (!confirm) { return; } - + socket.emit('groups.cover.remove', { groupName: ajaxify.data.group.name }, function (err) { diff --git a/public/src/client/topic/postTools.js b/public/src/client/topic/postTools.js index e3b2e49c14..ccd72c640d 100644 --- a/public/src/client/topic/postTools.js +++ b/public/src/client/topic/postTools.js @@ -197,7 +197,7 @@ define('forum/topic/postTools', [ } function onReplyClicked(button, tid) { - var selectedText = getSelectedText(button); + var selectedNode = getSelectedNode(); showStaleWarning(function () { var username = getUserName(button); @@ -207,15 +207,15 @@ define('forum/topic/postTools', [ var toPid = button.is('[component="post/reply"]') ? getData(button, 'data-pid') : null; - if (selectedText) { + if (selectedNode.text && (!toPid || !selectedNode.pid || toPid === selectedNode.pid)) { + username = username || selectedNode.username; $(window).trigger('action:composer.addQuote', { tid: tid, - slug: ajaxify.data.slug, - index: getData(button, 'data-index'), pid: toPid, topicName: ajaxify.data.titleRaw, username: username, - text: selectedText + text: selectedNode.text, + selectedPid: selectedNode.pid }); } else { $(window).trigger('action:composer.post.new', { @@ -229,16 +229,14 @@ define('forum/topic/postTools', [ } function onQuoteClicked(button, tid) { - var selectedText = getSelectedText(button); + var selectedNode = getSelectedNode(); showStaleWarning(function () { function quote(text) { $(window).trigger('action:composer.addQuote', { tid: tid, - slug: ajaxify.data.slug, - index: getData(button, 'data-index'), - pid: pid, + pid: toPid, username: username, topicName: ajaxify.data.titleRaw, text: text @@ -246,12 +244,12 @@ define('forum/topic/postTools', [ } var username = getUserName(button); - var pid = getData(button, 'data-pid'); + var toPid = getData(button, 'data-pid'); - if (selectedText) { - return quote(selectedText); + if (selectedNode.text && toPid && toPid === selectedNode.pid) { + return quote(selectedNode.text); } - socket.emit('posts.getRawPost', pid, function (err, post) { + socket.emit('posts.getRawPost', toPid, function (err, post) { if (err) { return app.alertError(err.message); } @@ -261,12 +259,20 @@ define('forum/topic/postTools', [ }); } - function getSelectedText(button) { - var selectionText = ''; + function getSelectedNode() { + var selectedText = ''; + var selectedPid; + var username = ''; var selection = window.getSelection ? window.getSelection() : document.selection.createRange(); - var content = button.parents('[component="post"]').find('[component="post/content"]').get(0); + var postContents = $('[component="post"] [component="post/content"]'); + var content; + postContents.each(function (index, el) { + if (selection && selection.containsNode && el && selection.containsNode(el, true)) { + content = el; + } + }); - if (selection && selection.containsNode && content && selection.containsNode(content, true)) { + if (content) { var bounds = document.createRange(); bounds.selectNodeContents(content); var range = selection.getRangeAt(0).cloneRange(); @@ -277,10 +283,13 @@ define('forum/topic/postTools', [ range.setEnd(bounds.endContainer, bounds.endOffset); } bounds.detach(); - selectionText = range.toString(); + selectedText = range.toString(); + var postEl = $(content).parents('[component="post"]'); + selectedPid = postEl.attr('data-pid'); + username = getUserName($(content)); range.detach(); } - return selectionText; + return {text: selectedText, pid: selectedPid, username: username}; } function bookmarkPost(button, pid) { diff --git a/public/src/client/topic/posts.js b/public/src/client/topic/posts.js index e6ed0f6bd7..4103864c0b 100644 --- a/public/src/client/topic/posts.js +++ b/public/src/client/topic/posts.js @@ -99,6 +99,11 @@ define('forum/topic/posts', [ function onNewPostInfiniteScroll(data) { var direction = config.topicPostSort === 'oldest_to_newest' || config.topicPostSort === 'most_votes' ? 1 : -1; + var isPreviousPostAdded = $('[component="post"][data-index="' + (data.posts[0].index - 1) + '"]').length; + if (!isPreviousPostAdded && (!data.posts[0].selfPost || !ajaxify.data.scrollToMyPost)) { + return; + } + createNewPosts(data, components.get('post').not('[data-index=0]'), direction, function (html) { if (html) { html.addClass('new'); @@ -109,11 +114,7 @@ define('forum/topic/posts', [ } function scrollToPostIfSelf(post) { - if (!ajaxify.data.scrollToMyPost) { - return; - } - var isSelfPost = parseInt(post.uid, 10) === parseInt(app.user.uid, 10); - if (isSelfPost) { + if (post.selfPost && ajaxify.data.scrollToMyPost) { navigator.scrollBottom(post.index); } } diff --git a/public/src/modules/chat.js b/public/src/modules/chat.js index f231fd765d..e8a108c46f 100644 --- a/public/src/modules/chat.js +++ b/public/src/modules/chat.js @@ -67,7 +67,7 @@ define('chat', [ if (!isSelf && (!modal.is(':visible') || !app.isFocused)) { app.alternatingTitle('[[modules:chat.user_has_messaged_you, ' + username + ']]'); - sounds.play('chat-incoming'); + sounds.play('chat-incoming', 'chat.incoming:' + data.message.mid); taskbar.push('chat', modal.attr('UUID'), { title: username, @@ -89,7 +89,7 @@ define('chat', [ module.toggleNew(modal.attr('UUID'), !isSelf, true); if (!isSelf) { app.alternatingTitle('[[modules:chat.user_has_messaged_you, ' + username + ']]'); - sounds.play('chat-incoming'); + sounds.play('chat-incoming', 'chat.incoming:' + data.message.mid); } }); }); diff --git a/public/src/modules/helpers.js b/public/src/modules/helpers.js index 3035d29fc4..b1ac2e183e 100644 --- a/public/src/modules/helpers.js +++ b/public/src/modules/helpers.js @@ -7,7 +7,7 @@ exports = module.exports/* = SemVer*/; } - var helpers = {}; + var helpers = exports; helpers.displayMenuItem = function (data, index) { var item = data.navigation[index]; diff --git a/public/src/modules/navigator.js b/public/src/modules/navigator.js index c6ef158221..b281a46fff 100644 --- a/public/src/modules/navigator.js +++ b/public/src/modules/navigator.js @@ -238,14 +238,17 @@ define('navigator', ['forum/pagination', 'components'], function (pagination, co navigator.scrollToPostIndex = function (postIndex, highlight, duration) { var scrollTo = components.get('post', 'index', postIndex); - var postHeight = scrollTo.height(); - var viewportHeight = $(window).height(); - var navbarHeight = components.get('navbar').height(); + navigator.scrollToElement(scrollTo, highlight, duration); + }; + navigator.scrollToElement = function (scrollTo, highlight, duration) { if (!scrollTo.length) { navigator.scrollActive = false; return; } + var postHeight = scrollTo.height(); + var viewportHeight = $(window).height(); + var navbarHeight = components.get('navbar').height(); // Temporarily disable navigator update on scroll $(window).off('scroll', navigator.update); @@ -290,13 +293,8 @@ define('navigator', ['forum/pagination', 'components'], function (pagination, co } } - if (components.get('topic').length) { - animateScroll(); - } else { - navigator.scrollActive = false; - } + animateScroll(); }; - return navigator; }); diff --git a/public/src/modules/notifications.js b/public/src/modules/notifications.js index c668cbbfc7..f9972ca5a9 100644 --- a/public/src/modules/notifications.js +++ b/public/src/modules/notifications.js @@ -2,7 +2,7 @@ /* globals define, socket, app, ajaxify, templates, Tinycon*/ -define('notifications', ['sounds', 'translator', 'components'], function (sound, translator, components) { +define('notifications', ['sounds', 'translator', 'components'], function (sounds, translator, components) { var Notifications = {}; var unreadNotifs = {}; @@ -105,7 +105,7 @@ define('notifications', ['sounds', 'translator', 'components'], function (sound, }); if (!unreadNotifs[notifData.nid]) { - sound.play('notification'); + sounds.play('notification', notifData.nid); unreadNotifs[notifData.nid] = true; } }); diff --git a/public/src/modules/pictureCropper.js b/public/src/modules/pictureCropper.js new file mode 100644 index 0000000000..60dd073532 --- /dev/null +++ b/public/src/modules/pictureCropper.js @@ -0,0 +1,178 @@ +'use strict'; + +/* globals define, socket, app, templates */ + +define('pictureCropper', ['translator', 'cropper'], function (translator, cropper) { + var module = {}; + + module.show = function (data, callback) { + var fileSize = data.hasOwnProperty('fileSize') && data.fileSize !== undefined ? parseInt(data.fileSize, 10) : false; + parseModal({ + showHelp: data.hasOwnProperty('showHelp') && data.showHelp !== undefined ? data.showHelp : true, + fileSize: fileSize, + title: data.title || '[[global:upload_file]]', + description: data.description || '', + button: data.button || '[[global:upload]]', + accept: data.accept ? data.accept.replace(/,/g, ', ') : '' + }, function (uploadModal) { + uploadModal = $(uploadModal); + + uploadModal.modal('show'); + uploadModal.on('hidden.bs.modal', function () { + uploadModal.remove(); + }); + + uploadModal.find('#fileUploadSubmitBtn').on('click', function () { + $(this).addClass('disabled'); + data.uploadModal = uploadModal; + onSubmit(data, callback); + return false; + }); + }); + }; + + module.handleImageCrop = function (data, callback) { + $('#crop-picture-modal').remove(); + templates.parse('modals/crop_picture', { + url: data.url + }, function (cropperHtml) { + translator.translate(cropperHtml, function (translated) { + var cropperModal = $(translated); + cropperModal.modal('show'); + + var img = document.getElementById('cropped-image'); + var cropperTool = new cropper.default(img, { + aspectRatio: data.aspectRatio, + viewMode: 1, + cropmove: function () { + if (data.restrictImageDimension) { + if (cropperTool.cropBoxData.width > data.imageDimension) { + cropperTool.setCropBoxData({ + width: data.imageDimension + }); + } + if (cropperTool.cropBoxData.height > data.imageDimension) { + cropperTool.setCropBoxData({ + height: data.imageDimension + }); + } + } + }, + ready: function () { + if (data.restrictImageDimension) { + var origDimension = (img.width < img.height) ? img.width : img.height; + var dimension = (origDimension > data.imageDimension) ? data.imageDimension : origDimension; + cropperTool.setCropBoxData({ + width: dimension, + height: dimension + }); + } + + cropperModal.find('.rotate').on('click', function () { + var degrees = this.getAttribute("data-degrees"); + cropperTool.rotate(degrees); + }); + + cropperModal.find('.flip').on('click', function () { + var option = this.getAttribute("data-option"); + var method = this.getAttribute("data-method"); + method === 'scaleX' ? cropperTool.scaleX(option) : cropperTool.scaleY(option); + this.setAttribute("data-option", option * -1); + }); + + cropperModal.find('.reset').on('click', function () { + cropperTool.reset(); + }); + + cropperModal.find('.crop-btn').on('click', function () { + $(this).addClass('disabled'); + var imageData = data.imageType ? cropperTool.getCroppedCanvas().toDataURL(data.imageType) : cropperTool.getCroppedCanvas().toDataURL(); + + cropperModal.find('#upload-progress-bar').css('width', '100%'); + cropperModal.find('#upload-progress-box').show().removeClass('hide'); + + var socketData = {}; + socketData[data.paramName] = data.paramValue; + socketData['imageData'] = imageData; + + socket.emit(data.socketMethod, socketData, function (err, imageData) { + if (err) { + cropperModal.find('#upload-progress-box').hide(); + cropperModal.find('.upload-btn').removeClass('disabled'); + cropperModal.find('.crop-btn').removeClass('disabled'); + return app.alertError(err.message); + } + + callback(imageData.url); + cropperModal.modal('hide'); + }); + }); + + cropperModal.find('.upload-btn').on('click', function () { + $(this).addClass('disabled'); + cropperTool.destroy(); + + cropperTool = new cropper.default(img, { + viewMode: 1, + autoCropArea: 1, + ready: function () { + cropperModal.find('.crop-btn').trigger('click'); + } + }); + }); + } + }); + }); + }); + }; + + function onSubmit(data, callback) { + function showAlert(type, message) { + module.hideAlerts(data.uploadModal); + if (type === 'error') { + data.uploadModal.find('#fileUploadSubmitBtn').removeClass('disabled'); + } + data.uploadModal.find('#alert-' + type).translateText(message).removeClass('hide'); + } + + var fileInput = data.uploadModal.find('#fileInput'); + if (!fileInput.val()) { + return showAlert('error', '[[uploads:select-file-to-upload]]'); + } + + var file = fileInput[0].files[0]; + var reader = new FileReader(); + var imageUrl; + var imageType = file.type; + + reader.addEventListener("load", function () { + imageUrl = reader.result; + + data.uploadModal.modal('hide'); + + module.handleImageCrop({ + url: imageUrl, + imageType: imageType, + socketMethod: data.socketMethod, + aspectRatio: data.aspectRatio, + allowSkippingCrop: data.allowSkippingCrop, + restrictImageDimension: data.restrictImageDimension, + imageDimension: data.imageDimension, + paramName: data.paramName, + paramValue: data.paramValue + }, callback); + }, false); + + if (file) { + reader.readAsDataURL(file); + } + } + + function parseModal(tplVals, callback) { + templates.parse('partials/modals/upload_file_modal', tplVals, function (html) { + translator.translate(html, callback); + }); + } + + return module; +}); diff --git a/public/src/modules/sounds.js b/public/src/modules/sounds.js index a31bbe507a..26d64079ca 100644 --- a/public/src/modules/sounds.js +++ b/public/src/modules/sounds.js @@ -1,90 +1,94 @@ "use strict"; /* global app, define, socket, config */ -define('sounds', ['buzz'], function (buzz) { +define('sounds', function () { var Sounds = {}; - var loadedSounds = {}; - var eventSoundMapping; - var files; + var fileMap; + var soundMap; + var cache = {}; - socket.on('event:sounds.reloadMapping', function () { - Sounds.reloadMapping(); - }); - - Sounds.reloadMapping = function () { - socket.emit('modules.sounds.getMapping', function (err, mapping) { + Sounds.loadMap = function loadMap(callback) { + socket.emit('modules.sounds.getUserSoundMap', function (err, map) { if (err) { return app.alertError(err.message); } - eventSoundMapping = mapping; + soundMap = map; + if (callback) { + callback(); + } }); }; function loadData(callback) { - socket.emit('modules.sounds.getData', function (err, data) { - if (err) { - return app.alertError('[sounds] Could not load sound mapping!'); - } - eventSoundMapping = data.mapping; - files = data.files; - callback(); - }); - } - - function isSoundLoaded(fileName) { - return loadedSounds[fileName]; - } - - function loadFile(fileName, callback) { - function createSound() { - if (files && files[fileName]) { - loadedSounds[fileName] = new buzz.sound(files[fileName]); - } - callback(); - } - - if (isSoundLoaded(fileName)) { - return callback(); - } - - if (!files || !files[fileName]) { - return loadData(createSound); - } - createSound(); - } - - Sounds.play = function (name) { - function play() { - Sounds.playFile(eventSoundMapping[name]); - } - - if (!eventSoundMapping) { - return loadData(play); - } - - play(); - }; - - Sounds.playFile = function (fileName) { - if (!fileName) { - return; - } - - function play() { - if (loadedSounds[fileName]) { - loadedSounds[fileName].play(); - } else { - app.alertError('[sounds] Not found: ' + fileName); + var outstanding = 2; + function after() { + outstanding -= 1; + if (outstanding === 0 && callback) { + callback(); } } - - if (isSoundLoaded(fileName)) { - play(); + if (fileMap) { + outstanding -= 1; } else { - loadFile(fileName, play); + $.getJSON(config.relative_path + '/assets/sounds/fileMap.json', function (map) { + fileMap = map; + after(); + }); } + + Sounds.loadMap(after); + } + + Sounds.playSound = function playSound(soundName) { + if (!soundMap || !fileMap) { + return loadData(after); + } + + function after() { + if (!fileMap[soundName]) { + return; + } + var audio = cache[soundName] = cache[soundName] || new Audio(config.relative_path + '/assets/sounds/' + fileMap[soundName]); + audio.pause(); + audio.currentTime = 0; + audio.play(); + } + + after(); }; + Sounds.play = function play(type, id) { + function after() { + if (!soundMap[type]) { + return; + } + + if (id) { + var item = 'sounds.handled:' + id; + if (sessionStorage.getItem(item)) { + return; + } + sessionStorage.setItem(item, true); + + setTimeout(function () { + sessionStorage.removeItem(item); + }, 5000); + } + + Sounds.playSound(soundMap[type]); + } + + if (!soundMap || !fileMap) { + return loadData(after); + } + + after(); + }; + + socket.on('event:sounds.reloadMapping', function () { + Sounds.loadMap(); + }); + return Sounds; }); diff --git a/public/src/modules/translator.js b/public/src/modules/translator.js index 215f8c88df..aa719ff1a2 100644 --- a/public/src/modules/translator.js +++ b/public/src/modules/translator.js @@ -515,12 +515,12 @@ break; } - jQuery.getScript(config.relative_path + '/vendor/jquery/timeago/locales/jquery.timeago.' + languageCode + '.js').done(function () { + jQuery.getScript(config.relative_path + '/assets/vendor/jquery/timeago/locales/jquery.timeago.' + languageCode + '.js').done(function () { jQuery('.timeago').timeago(); adaptor.timeagoShort = assign({}, jQuery.timeago.settings.strings); // Retrieve the shorthand timeago values as well - jQuery.getScript(config.relative_path + '/vendor/jquery/timeago/locales/jquery.timeago.' + languageCode + '-short.js').done(function () { + jQuery.getScript(config.relative_path + '/assets/vendor/jquery/timeago/locales/jquery.timeago.' + languageCode + '-short.js').done(function () { // Switch back to long-form adaptor.toggleTimeagoShorthand(); }); diff --git a/public/src/modules/uploader.js b/public/src/modules/uploader.js index 106b82d67d..0e2a7e7ec8 100644 --- a/public/src/modules/uploader.js +++ b/public/src/modules/uploader.js @@ -128,4 +128,4 @@ define('uploader', ['translator'], function (translator) { } return module; -}); +}); \ No newline at end of file diff --git a/public/src/require-config.js b/public/src/require-config.js index 8618685052..0e021f6be0 100644 --- a/public/src/require-config.js +++ b/public/src/require-config.js @@ -1,5 +1,5 @@ require.config({ - baseUrl: config.relative_path + "/src/modules", + baseUrl: config.relative_path + '/assets/src/modules', waitSeconds: 7, urlArgs: config['cache-buster'], paths: { diff --git a/public/src/widgets.js b/public/src/widgets.js index 46023fad15..377ccb2c53 100644 --- a/public/src/widgets.js +++ b/public/src/widgets.js @@ -29,7 +29,7 @@ } }); - $.get(config.relative_path + '/api/widgets/render' + (config['cache-buster'] ? '?v=' + config['cache-buster'] : ''), { + $.get(config.relative_path + '/api/widgets/render' + '?' + config['cache-buster'], { locations: widgetLocations, template: template + '.tpl', url: url, diff --git a/public/vendor/mdl/mdl.css b/public/vendor/mdl/material.css similarity index 78% rename from public/vendor/mdl/mdl.css rename to public/vendor/mdl/material.css index c037532647..74b6b7b71f 100644 --- a/public/vendor/mdl/mdl.css +++ b/public/vendor/mdl/material.css @@ -1,6 +1,6 @@ /** * material-design-lite - Material Design Components in CSS, JS and HTML - * @version v1.0.3 + * @version v1.3.0 * @license Apache-2.0 * @copyright 2015 Google, Inc. * @link https://github.com/google/material-design-lite @@ -62,6 +62,15 @@ * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -113,6 +122,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -161,7 +171,10 @@ /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ /** * Copyright 2015 Google Inc. All Rights Reserved. * @@ -180,6 +193,7 @@ /* Typography */ /* Shadows */ /* Animations */ +/* Dialog */ /** * Copyright 2015 Google Inc. All Rights Reserved. * @@ -250,6 +264,15 @@ * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -301,6 +324,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -349,7 +373,10 @@ /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ /* * What follows is the result of much research on cross-browser styling. * Credit left inline and big thanks to Nicolas Gallagher, Jonathan Neal, @@ -496,6 +523,12 @@ textarea { These examples override the primary ('mobile first') styles. Modify as content requires. ========================================================================== */ +@media only screen and (min-width: 35em) { + /* Style adjustments for viewports that meet the condition */ } + +@media print, (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 1.25dppx), (min-resolution: 120dpi) { + /* Style adjustments for high resolution devices */ } + /* ========================================================================== Print styles. Inlined to avoid the additional HTTP request: @@ -505,13 +538,11 @@ textarea { *, *:before, *:after, - *:first-letter, - *:first-line { + *:first-letter { background: transparent !important; color: #000 !important; /* Black prints faster: http://www.sanbeiji.com/archives/953 */ - box-shadow: none !important; - text-shadow: none !important; } + box-shadow: none !important; } a, a:visited { text-decoration: underline; } @@ -660,6 +691,15 @@ main { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -711,6 +751,7 @@ main { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -759,7 +800,10 @@ main { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ /** * Copyright 2015 Google Inc. All Rights Reserved. * @@ -778,6 +822,7 @@ main { /* Typography */ /* Shadows */ /* Animations */ +/* Dialog */ /*html, body { font-family: "Helvetica", "Arial", sans-serif; font-size: 14px; @@ -1160,6 +1205,21 @@ ul, ol { .mdl-typography--font-black { font-weight: 900 !important; } +.material-icons { + font-family: 'Material Icons'; + font-weight: normal; + font-style: normal; + font-size: 24px; + line-height: 1; + letter-spacing: normal; + text-transform: none; + display: inline-block; + word-wrap: normal; + -moz-font-feature-settings: 'liga'; + font-feature-settings: 'liga'; + -webkit-font-feature-settings: 'liga'; + -webkit-font-smoothing: antialiased; } + /** * Copyright 2015 Google Inc. All Rights Reserved. * @@ -1215,6 +1275,15 @@ ul, ol { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -1266,6 +1335,7 @@ ul, ol { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -1314,7 +1384,10 @@ ul, ol { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ .mdl-color-text--red { color: rgb(244,67,54) !important; } @@ -3050,6 +3123,15 @@ ul, ol { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -3101,6 +3183,7 @@ ul, ol { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -3149,7 +3232,10 @@ ul, ol { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ .mdl-ripple { background: rgb(0,0,0); border-radius: 50%; @@ -3160,13 +3246,13 @@ ul, ol { position: absolute; top: 0; -webkit-transform: translate(-50%, -50%); - -ms-transform: translate(-50%, -50%); transform: translate(-50%, -50%); width: 50px; overflow: hidden; } .mdl-ripple.is-animating { - -webkit-transition: -webkit-transform 0.3s cubic-bezier(0, 0, 0.2, 1), width 0.3s cubic-bezier(0, 0, 0.2, 1), height 0.3s cubic-bezier(0, 0, 0.2, 1), opacity 0.6s cubic-bezier(0, 0, 0.2, 1); - transition: transform 0.3s cubic-bezier(0, 0, 0.2, 1), width 0.3s cubic-bezier(0, 0, 0.2, 1), height 0.3s cubic-bezier(0, 0, 0.2, 1), opacity 0.6s cubic-bezier(0, 0, 0.2, 1); } + transition: width 0.3s cubic-bezier(0, 0, 0.2, 1), height 0.3s cubic-bezier(0, 0, 0.2, 1), opacity 0.6s cubic-bezier(0, 0, 0.2, 1), -webkit-transform 0.3s cubic-bezier(0, 0, 0.2, 1); + transition: transform 0.3s cubic-bezier(0, 0, 0.2, 1), width 0.3s cubic-bezier(0, 0, 0.2, 1), height 0.3s cubic-bezier(0, 0, 0.2, 1), opacity 0.6s cubic-bezier(0, 0, 0.2, 1); + transition: transform 0.3s cubic-bezier(0, 0, 0.2, 1), width 0.3s cubic-bezier(0, 0, 0.2, 1), height 0.3s cubic-bezier(0, 0, 0.2, 1), opacity 0.6s cubic-bezier(0, 0, 0.2, 1), -webkit-transform 0.3s cubic-bezier(0, 0, 0.2, 1); } .mdl-ripple.is-visible { opacity: 0.3; } @@ -3225,6 +3311,15 @@ ul, ol { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -3276,6 +3371,7 @@ ul, ol { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -3324,22 +3420,21 @@ ul, ol { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ .mdl-animation--default { - -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); } + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); } .mdl-animation--fast-out-slow-in { - -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); } + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); } .mdl-animation--linear-out-slow-in { - -webkit-transition-timing-function: cubic-bezier(0, 0, 0.2, 1); - transition-timing-function: cubic-bezier(0, 0, 0.2, 1); } + transition-timing-function: cubic-bezier(0, 0, 0.2, 1); } .mdl-animation--fast-out-linear-in { - -webkit-transition-timing-function: cubic-bezier(0.4, 0, 1, 1); - transition-timing-function: cubic-bezier(0.4, 0, 1, 1); } + transition-timing-function: cubic-bezier(0.4, 0, 1, 1); } /** * Copyright 2015 Google Inc. All Rights Reserved. @@ -3396,6 +3491,15 @@ ul, ol { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -3447,6 +3551,7 @@ ul, ol { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -3495,7 +3600,10 @@ ul, ol { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ .mdl-badge { position: relative; white-space: nowrap; @@ -3504,26 +3612,21 @@ ul, ol { margin-right: auto; } .mdl-badge[data-badge]:after { content: attr(data-badge); - display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; -webkit-flex-direction: row; -ms-flex-direction: row; flex-direction: row; -webkit-flex-wrap: wrap; -ms-flex-wrap: wrap; flex-wrap: wrap; - -webkit-box-pack: center; -webkit-justify-content: center; -ms-flex-pack: center; justify-content: center; -webkit-align-content: center; -ms-flex-line-pack: center; align-content: center; - -webkit-box-align: center; -webkit-align-items: center; -ms-flex-align: center; align-items: center; @@ -3545,6 +3648,10 @@ ul, ol { color: rgb(255,64,129); background: rgba(255,255,255,0.2); box-shadow: 0 0 1px gray; } + .mdl-badge.mdl-badge--overlap { + margin-right: 10px; } + .mdl-badge.mdl-badge--overlap:after { + right: -10px; } /** * Copyright 2015 Google Inc. All Rights Reserved. @@ -3601,6 +3708,15 @@ ul, ol { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -3652,6 +3768,7 @@ ul, ol { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -3700,7 +3817,10 @@ ul, ol { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ /** * Copyright 2015 Google Inc. All Rights Reserved. * @@ -3719,6 +3839,7 @@ ul, ol { /* Typography */ /* Shadows */ /* Animations */ +/* Dialog */ .mdl-button { background: transparent; border: none; @@ -3726,8 +3847,9 @@ ul, ol { color: rgb(0,0,0); position: relative; height: 36px; + margin: 0; min-width: 64px; - padding: 0 8px; + padding: 0 16px; display: inline-block; font-family: "Roboto", "Helvetica", "Arial", sans-serif; font-size: 14px; @@ -3736,9 +3858,8 @@ ul, ol { line-height: 1; letter-spacing: 0; overflow: hidden; - will-change: box-shadow, transform; - -webkit-transition: box-shadow 0.2s cubic-bezier(0.4, 0, 1, 1), background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1), color 0.2s cubic-bezier(0.4, 0, 0.2, 1); - transition: box-shadow 0.2s cubic-bezier(0.4, 0, 1, 1), background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1), color 0.2s cubic-bezier(0.4, 0, 0.2, 1); + will-change: box-shadow; + transition: box-shadow 0.2s cubic-bezier(0.4, 0, 1, 1), background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1), color 0.2s cubic-bezier(0.4, 0, 0.2, 1); outline: none; cursor: pointer; text-decoration: none; @@ -3800,7 +3921,6 @@ input.mdl-button[type="submit"] { top: 50%; left: 50%; -webkit-transform: translate(-12px, -12px); - -ms-transform: translate(-12px, -12px); transform: translate(-12px, -12px); line-height: 24px; width: 24px; } @@ -3846,7 +3966,6 @@ input.mdl-button[type="submit"] { top: 50%; left: 50%; -webkit-transform: translate(-12px, -12px); - -ms-transform: translate(-12px, -12px); transform: translate(-12px, -12px); line-height: 24px; width: 24px; } @@ -3890,26 +4009,21 @@ input.mdl-button[type="submit"] { color: rgb(255,255,255); background-color: rgb(255,64,129); } -.mdl-button[disabled][disabled], -.mdl-button.mdl-button--disabled.mdl-button--disabled { +.mdl-button[disabled][disabled], .mdl-button.mdl-button--disabled.mdl-button--disabled { color: rgba(0,0,0, 0.26); - cursor: auto; + cursor: default; background-color: transparent; } -.mdl-button--fab[disabled][disabled], -.mdl-button--fab.mdl-button--disabled.mdl-button--disabled { +.mdl-button--fab[disabled][disabled], .mdl-button--fab.mdl-button--disabled.mdl-button--disabled { + background-color: rgba(0,0,0, 0.12); + color: rgba(0,0,0, 0.26); } + +.mdl-button--raised[disabled][disabled], .mdl-button--raised.mdl-button--disabled.mdl-button--disabled { background-color: rgba(0,0,0, 0.12); color: rgba(0,0,0, 0.26); - box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12); } + box-shadow: none; } -.mdl-button--raised[disabled][disabled], -.mdl-button--raised.mdl-button--disabled.mdl-button--disabled { - background-color: rgba(0,0,0, 0.12); - color: rgba(0,0,0, 0.26); - box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12); } - -.mdl-button--colored[disabled][disabled], -.mdl-button--colored.mdl-button--disabled.mdl-button--disabled { +.mdl-button--colored[disabled][disabled], .mdl-button--colored.mdl-button--disabled.mdl-button--disabled { color: rgba(0,0,0, 0.26); } .mdl-button .material-icons { @@ -3970,6 +4084,15 @@ input.mdl-button[type="submit"] { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -4021,6 +4144,7 @@ input.mdl-button[type="submit"] { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -4069,14 +4193,14 @@ input.mdl-button[type="submit"] { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ .mdl-card { - display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; -webkit-flex-direction: column; -ms-flex-direction: column; flex-direction: column; @@ -4101,17 +4225,14 @@ input.mdl-button[type="submit"] { box-sizing: border-box; } .mdl-card__title { - -webkit-box-align: center; -webkit-align-items: center; -ms-flex-align: center; align-items: center; color: rgb(0,0,0); display: block; - display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; - -webkit-box-pack: stretch; -webkit-justify-content: stretch; -ms-flex-pack: stretch; justify-content: stretch; @@ -4120,7 +4241,6 @@ input.mdl-button[type="submit"] { -webkit-perspective-origin: 165px 56px; perspective-origin: 165px 56px; -webkit-transform-origin: 165px 56px; - -ms-transform-origin: 165px 56px; transform-origin: 165px 56px; box-sizing: border-box; } .mdl-card__title.mdl-card--border { @@ -4132,7 +4252,6 @@ input.mdl-button[type="submit"] { align-self: flex-end; color: inherit; display: block; - display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; @@ -4141,22 +4260,23 @@ input.mdl-button[type="submit"] { line-height: normal; overflow: hidden; -webkit-transform-origin: 149px 48px; - -ms-transform-origin: 149px 48px; transform-origin: 149px 48px; margin: 0; } .mdl-card__subtitle-text { font-size: 14px; - color: grey; + color: rgba(0,0,0, 0.54); margin: 0; } .mdl-card__supporting-text { color: rgba(0,0,0, 0.54); - font-size: 13px; + font-size: 1rem; line-height: 18px; overflow: hidden; padding: 16px 16px; width: 90%; } + .mdl-card__supporting-text.mdl-card--border { + border-bottom: 1px solid rgba(0, 0, 0, 0.1); } .mdl-card__actions { font-size: 16px; @@ -4169,7 +4289,6 @@ input.mdl-button[type="submit"] { border-top: 1px solid rgba(0, 0, 0, 0.1); } .mdl-card--expand { - -webkit-box-flex: 1; -webkit-flex-grow: 1; -ms-flex-positive: 1; flex-grow: 1; } @@ -4234,6 +4353,15 @@ input.mdl-button[type="submit"] { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -4285,6 +4413,7 @@ input.mdl-button[type="submit"] { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -4333,7 +4462,10 @@ input.mdl-button[type="submit"] { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ /** * Copyright 2015 Google Inc. All Rights Reserved. * @@ -4352,6 +4484,7 @@ input.mdl-button[type="submit"] { /* Typography */ /* Shadows */ /* Animations */ +/* Dialog */ .mdl-checkbox { position: relative; z-index: 1; @@ -4396,6 +4529,7 @@ input.mdl-button[type="submit"] { z-index: 2; } .mdl-checkbox.is-checked .mdl-checkbox__box-outline { border: 2px solid rgb(63,81,181); } + fieldset[disabled] .mdl-checkbox .mdl-checkbox__box-outline, .mdl-checkbox.is-disabled .mdl-checkbox__box-outline { border: 2px solid rgba(0,0,0, 0.26); cursor: auto; } @@ -4426,14 +4560,12 @@ input.mdl-button[type="submit"] { -webkit-mask: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMSAxIgogICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pbiBtZWV0Ij4KICA8ZGVmcz4KICAgIDxjbGlwUGF0aCBpZD0iY2xpcCI+CiAgICAgIDxwYXRoCiAgICAgICAgIGQ9Ik0gMCwwIDAsMSAxLDEgMSwwIDAsMCB6IE0gMC44NTM0Mzc1LDAuMTY3MTg3NSAwLjk1OTY4NzUsMC4yNzMxMjUgMC40MjkzNzUsMC44MDM0Mzc1IDAuMzIzMTI1LDAuOTA5Njg3NSAwLjIxNzE4NzUsMC44MDM0Mzc1IDAuMDQwMzEyNSwwLjYyNjg3NSAwLjE0NjU2MjUsMC41MjA2MjUgMC4zMjMxMjUsMC42OTc1IDAuODUzNDM3NSwwLjE2NzE4NzUgeiIKICAgICAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgIDwvY2xpcFBhdGg+CiAgICA8bWFzayBpZD0ibWFzayIgbWFza1VuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgbWFza0NvbnRlbnRVbml0cz0ib2JqZWN0Qm91bmRpbmdCb3giPgogICAgICA8cGF0aAogICAgICAgICBkPSJNIDAsMCAwLDEgMSwxIDEsMCAwLDAgeiBNIDAuODUzNDM3NSwwLjE2NzE4NzUgMC45NTk2ODc1LDAuMjczMTI1IDAuNDI5Mzc1LDAuODAzNDM3NSAwLjMyMzEyNSwwLjkwOTY4NzUgMC4yMTcxODc1LDAuODAzNDM3NSAwLjA0MDMxMjUsMC42MjY4NzUgMC4xNDY1NjI1LDAuNTIwNjI1IDAuMzIzMTI1LDAuNjk3NSAwLjg1MzQzNzUsMC4xNjcxODc1IHoiCiAgICAgICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+CiAgICA8L21hc2s+CiAgPC9kZWZzPgogIDxyZWN0CiAgICAgd2lkdGg9IjEiCiAgICAgaGVpZ2h0PSIxIgogICAgIHg9IjAiCiAgICAgeT0iMCIKICAgICBjbGlwLXBhdGg9InVybCgjY2xpcCkiCiAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KPC9zdmc+Cg=="); mask: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMSAxIgogICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pbiBtZWV0Ij4KICA8ZGVmcz4KICAgIDxjbGlwUGF0aCBpZD0iY2xpcCI+CiAgICAgIDxwYXRoCiAgICAgICAgIGQ9Ik0gMCwwIDAsMSAxLDEgMSwwIDAsMCB6IE0gMC44NTM0Mzc1LDAuMTY3MTg3NSAwLjk1OTY4NzUsMC4yNzMxMjUgMC40MjkzNzUsMC44MDM0Mzc1IDAuMzIzMTI1LDAuOTA5Njg3NSAwLjIxNzE4NzUsMC44MDM0Mzc1IDAuMDQwMzEyNSwwLjYyNjg3NSAwLjE0NjU2MjUsMC41MjA2MjUgMC4zMjMxMjUsMC42OTc1IDAuODUzNDM3NSwwLjE2NzE4NzUgeiIKICAgICAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgIDwvY2xpcFBhdGg+CiAgICA8bWFzayBpZD0ibWFzayIgbWFza1VuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgbWFza0NvbnRlbnRVbml0cz0ib2JqZWN0Qm91bmRpbmdCb3giPgogICAgICA8cGF0aAogICAgICAgICBkPSJNIDAsMCAwLDEgMSwxIDEsMCAwLDAgeiBNIDAuODUzNDM3NSwwLjE2NzE4NzUgMC45NTk2ODc1LDAuMjczMTI1IDAuNDI5Mzc1LDAuODAzNDM3NSAwLjMyMzEyNSwwLjkwOTY4NzUgMC4yMTcxODc1LDAuODAzNDM3NSAwLjA0MDMxMjUsMC42MjY4NzUgMC4xNDY1NjI1LDAuNTIwNjI1IDAuMzIzMTI1LDAuNjk3NSAwLjg1MzQzNzUsMC4xNjcxODc1IHoiCiAgICAgICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+CiAgICA8L21hc2s+CiAgPC9kZWZzPgogIDxyZWN0CiAgICAgd2lkdGg9IjEiCiAgICAgaGVpZ2h0PSIxIgogICAgIHg9IjAiCiAgICAgeT0iMCIKICAgICBjbGlwLXBhdGg9InVybCgjY2xpcCkiCiAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KPC9zdmc+Cg=="); background: transparent; - -webkit-transition-duration: 0.28s; - transition-duration: 0.28s; - -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - -webkit-transition-property: background; - transition-property: background; } + transition-duration: 0.28s; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-property: background; } .mdl-checkbox.is-checked .mdl-checkbox__tick-outline { background: rgb(63,81,181) url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMSAxIgogICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pbiBtZWV0Ij4KICA8cGF0aAogICAgIGQ9Ik0gMC4wNDAzODA1OSwwLjYyNjc3NjcgMC4xNDY0NDY2MSwwLjUyMDcxMDY4IDAuNDI5Mjg5MzIsMC44MDM1NTMzOSAwLjMyMzIyMzMsMC45MDk2MTk0MSB6IE0gMC4yMTcxNTcyOSwwLjgwMzU1MzM5IDAuODUzNTUzMzksMC4xNjcxNTcyOSAwLjk1OTYxOTQxLDAuMjczMjIzMyAwLjMyMzIyMzMsMC45MDk2MTk0MSB6IgogICAgIGlkPSJyZWN0Mzc4MCIKICAgICBzdHlsZT0iZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgo8L3N2Zz4K"); } + fieldset[disabled] .mdl-checkbox.is-checked .mdl-checkbox__tick-outline, .mdl-checkbox.is-checked.is-disabled .mdl-checkbox__tick-outline { background: rgba(0,0,0, 0.26) url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMSAxIgogICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pbiBtZWV0Ij4KICA8cGF0aAogICAgIGQ9Ik0gMC4wNDAzODA1OSwwLjYyNjc3NjcgMC4xNDY0NDY2MSwwLjUyMDcxMDY4IDAuNDI5Mjg5MzIsMC44MDM1NTMzOSAwLjMyMzIyMzMsMC45MDk2MTk0MSB6IE0gMC4yMTcxNTcyOSwwLjgwMzU1MzM5IDAuODUzNTUzMzksMC4xNjcxNTcyOSAwLjk1OTYxOTQxLDAuMjczMjIzMyAwLjMyMzIyMzMsMC45MDk2MTk0MSB6IgogICAgIGlkPSJyZWN0Mzc4MCIKICAgICBzdHlsZT0iZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgo8L3N2Zz4K"); } @@ -4443,6 +4575,7 @@ input.mdl-button[type="submit"] { font-size: 16px; line-height: 24px; margin: 0; } + fieldset[disabled] .mdl-checkbox .mdl-checkbox__label, .mdl-checkbox.is-disabled .mdl-checkbox__label { color: rgba(0,0,0, 0.26); cursor: auto; } @@ -4461,8 +4594,10 @@ input.mdl-button[type="submit"] { -webkit-mask-image: -webkit-radial-gradient(circle, white, black); } .mdl-checkbox__ripple-container .mdl-ripple { background: rgb(63,81,181); } + fieldset[disabled] .mdl-checkbox .mdl-checkbox__ripple-container, .mdl-checkbox.is-disabled .mdl-checkbox__ripple-container { cursor: auto; } + fieldset[disabled] .mdl-checkbox .mdl-checkbox__ripple-container .mdl-ripple, .mdl-checkbox.is-disabled .mdl-checkbox__ripple-container .mdl-ripple { background: transparent; } @@ -4521,6 +4656,15 @@ input.mdl-button[type="submit"] { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -4572,6 +4716,7 @@ input.mdl-button[type="submit"] { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -4620,7 +4765,10 @@ input.mdl-button[type="submit"] { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ /** * Copyright 2015 Google Inc. All Rights Reserved. * @@ -4639,6 +4787,249 @@ input.mdl-button[type="submit"] { /* Typography */ /* Shadows */ /* Animations */ +/* Dialog */ +.mdl-chip { + height: 32px; + font-family: "Roboto", "Helvetica", "Arial", sans-serif; + line-height: 32px; + padding: 0 12px; + border: 0; + border-radius: 16px; + background-color: #dedede; + display: inline-block; + color: rgba(0,0,0, 0.87); + margin: 2px 0; + font-size: 0; + white-space: nowrap; } + .mdl-chip__text { + font-size: 13px; + vertical-align: middle; + display: inline-block; } + .mdl-chip__action { + height: 24px; + width: 24px; + background: transparent; + opacity: 0.54; + display: inline-block; + cursor: pointer; + text-align: center; + vertical-align: middle; + padding: 0; + margin: 0 0 0 4px; + font-size: 13px; + text-decoration: none; + color: rgba(0,0,0, 0.87); + border: none; + outline: none; + overflow: hidden; } + .mdl-chip__contact { + height: 32px; + width: 32px; + border-radius: 16px; + display: inline-block; + vertical-align: middle; + margin-right: 8px; + overflow: hidden; + text-align: center; + font-size: 18px; + line-height: 32px; } + .mdl-chip:focus { + outline: 0; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12); } + .mdl-chip:active { + background-color: #d6d6d6; } + .mdl-chip--deletable { + padding-right: 4px; } + .mdl-chip--contact { + padding-left: 0; } + +/** + * Copyright 2015 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Copyright 2015 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/*------------------------------------* $CONTENTS +\*------------------------------------*/ +/** + * STYLE GUIDE VARIABLES------------------Declarations of Sass variables + * -----Typography + * -----Colors + * -----Textfield + * -----Switch + * -----Spinner + * -----Radio + * -----Menu + * -----List + * -----Layout + * -----Icon toggles + * -----Footer + * -----Column + * -----Checkbox + * -----Card + * -----Button + * -----Animation + * -----Progress + * -----Badge + * -----Shadows + * -----Grid + * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. + */ +/* ========== TYPOGRAPHY ========== */ +/* We're splitting fonts into "preferred" and "performance" in order to optimize + page loading. For important text, such as the body, we want it to load + immediately and not wait for the web font load, whereas for other sections, + such as headers and titles, we're OK with things taking a bit longer to load. + We do have some optional classes and parameters in the mixins, in case you + definitely want to make sure you're using the preferred font and don't mind + the performance hit. + We should be able to improve on this once CSS Font Loading L3 becomes more + widely available. +*/ +/* ========== COLORS ========== */ +/** +* +* Material design color palettes. +* @see http://www.google.com/design/spec/style/color.html +* +**/ +/** + * Copyright 2015 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* ========== Color Palettes ========== */ +/* colors.scss */ +/** + * Copyright 2015 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* ========== IMAGES ========== */ +/* ========== Color & Themes ========== */ +/* ========== Typography ========== */ +/* ========== Components ========== */ +/* ========== Standard Buttons ========== */ +/* ========== Icon Toggles ========== */ +/* ========== Radio Buttons ========== */ +/* ========== Ripple effect ========== */ +/* ========== Layout ========== */ +/* ========== Content Tabs ========== */ +/* ========== Checkboxes ========== */ +/* ========== Switches ========== */ +/* ========== Spinner ========== */ +/* ========== Text fields ========== */ +/* ========== Card ========== */ +/* ========== Sliders ========== */ +/* ========== Progress ========== */ +/* ========== List ========== */ +/* ========== Item ========== */ +/* ========== Dropdown menu ========== */ +/* ========== Tooltips ========== */ +/* ========== Footer ========== */ +/* TEXTFIELD */ +/* SWITCH */ +/* SPINNER */ +/* RADIO */ +/* MENU */ +/* LIST */ +/* LAYOUT */ +/* ICON TOGGLE */ +/* FOOTER */ +/*mega-footer*/ +/*mini-footer*/ +/* CHECKBOX */ +/* CARD */ +/* Card dimensions */ +/* Cover image */ +/* BUTTON */ +/** + * + * Dimensions + * + */ +/* ANIMATION */ +/* PROGRESS */ +/* BADGE */ +/* SHADOWS */ +/* GRID */ +/* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ +/* TOOLTIP */ +/* CHIP */ +/** + * Copyright 2015 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* Typography */ +/* Shadows */ +/* Animations */ +/* Dialog */ .mdl-data-table { position: relative; border: 1px solid rgba(0, 0, 0, 0.12); @@ -4653,18 +5044,15 @@ input.mdl-button[type="submit"] { .mdl-data-table tbody tr { position: relative; height: 48px; - -webkit-transition-duration: 0.28s; - transition-duration: 0.28s; - -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - -webkit-transition-property: background-color; - transition-property: background-color; } + transition-duration: 0.28s; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-property: background-color; } .mdl-data-table tbody tr.is-selected { background-color: #e0e0e0; } .mdl-data-table tbody tr:hover { background-color: #eeeeee; } .mdl-data-table td, .mdl-data-table th { - padding: 0 18px 0 18px; + padding: 0 18px 12px 18px; text-align: right; } .mdl-data-table td:first-of-type, .mdl-data-table th:first-of-type { padding-left: 24px; } @@ -4672,16 +5060,14 @@ input.mdl-button[type="submit"] { padding-right: 24px; } .mdl-data-table td { position: relative; - vertical-align: top; + vertical-align: middle; height: 48px; border-top: 1px solid rgba(0, 0, 0, 0.12); border-bottom: 1px solid rgba(0, 0, 0, 0.12); padding-top: 12px; box-sizing: border-box; } .mdl-data-table td .mdl-data-table__select { - vertical-align: top; - position: absolute; - left: 24px; } + vertical-align: middle; } .mdl-data-table th { position: relative; vertical-align: bottom; @@ -4695,10 +5081,32 @@ input.mdl-button[type="submit"] { color: rgba(0, 0, 0, 0.54); padding-bottom: 8px; box-sizing: border-box; } - .mdl-data-table th .mdl-data-table__select { - position: absolute; - bottom: 8px; - left: 24px; } + .mdl-data-table th.mdl-data-table__header--sorted-ascending, .mdl-data-table th.mdl-data-table__header--sorted-descending { + color: rgba(0, 0, 0, 0.87); } + .mdl-data-table th.mdl-data-table__header--sorted-ascending:before, .mdl-data-table th.mdl-data-table__header--sorted-descending:before { + font-family: 'Material Icons'; + font-weight: normal; + font-style: normal; + font-size: 24px; + line-height: 1; + letter-spacing: normal; + text-transform: none; + display: inline-block; + word-wrap: normal; + -moz-font-feature-settings: 'liga'; + font-feature-settings: 'liga'; + -webkit-font-feature-settings: 'liga'; + -webkit-font-smoothing: antialiased; + font-size: 16px; + content: "\e5d8"; + margin-right: 5px; + vertical-align: sub; } + .mdl-data-table th.mdl-data-table__header--sorted-ascending:hover, .mdl-data-table th.mdl-data-table__header--sorted-descending:hover { + cursor: pointer; } + .mdl-data-table th.mdl-data-table__header--sorted-ascending:hover:before, .mdl-data-table th.mdl-data-table__header--sorted-descending:hover:before { + color: rgba(0, 0, 0, 0.26); } + .mdl-data-table th.mdl-data-table__header--sorted-descending:before { + content: "\e5db"; } .mdl-data-table__select { width: 16px; } @@ -4761,6 +5169,15 @@ input.mdl-button[type="submit"] { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -4812,6 +5229,7 @@ input.mdl-button[type="submit"] { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -4860,7 +5278,10 @@ input.mdl-button[type="submit"] { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ /** * Copyright 2015 Google Inc. All Rights Reserved. * @@ -4879,6 +5300,232 @@ input.mdl-button[type="submit"] { /* Typography */ /* Shadows */ /* Animations */ +/* Dialog */ +.mdl-dialog { + border: none; + box-shadow: 0 9px 46px 8px rgba(0, 0, 0, 0.14), 0 11px 15px -7px rgba(0, 0, 0, 0.12), 0 24px 38px 3px rgba(0, 0, 0, 0.2); + width: 280px; } + .mdl-dialog__title { + padding: 24px 24px 0; + margin: 0; + font-size: 2.5rem; } + .mdl-dialog__actions { + padding: 8px 8px 8px 24px; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-direction: row-reverse; + -ms-flex-direction: row-reverse; + flex-direction: row-reverse; + -webkit-flex-wrap: wrap; + -ms-flex-wrap: wrap; + flex-wrap: wrap; } + .mdl-dialog__actions > * { + margin-right: 8px; + height: 36px; } + .mdl-dialog__actions > *:first-child { + margin-right: 0; } + .mdl-dialog__actions--full-width { + padding: 0 0 8px 0; } + .mdl-dialog__actions--full-width > * { + height: 48px; + -webkit-flex: 0 0 100%; + -ms-flex: 0 0 100%; + flex: 0 0 100%; + padding-right: 16px; + margin-right: 0; + text-align: right; } + .mdl-dialog__content { + padding: 20px 24px 24px 24px; + color: rgba(0,0,0, 0.54); } + +/** + * Copyright 2015 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Copyright 2015 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/*------------------------------------* $CONTENTS +\*------------------------------------*/ +/** + * STYLE GUIDE VARIABLES------------------Declarations of Sass variables + * -----Typography + * -----Colors + * -----Textfield + * -----Switch + * -----Spinner + * -----Radio + * -----Menu + * -----List + * -----Layout + * -----Icon toggles + * -----Footer + * -----Column + * -----Checkbox + * -----Card + * -----Button + * -----Animation + * -----Progress + * -----Badge + * -----Shadows + * -----Grid + * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. + */ +/* ========== TYPOGRAPHY ========== */ +/* We're splitting fonts into "preferred" and "performance" in order to optimize + page loading. For important text, such as the body, we want it to load + immediately and not wait for the web font load, whereas for other sections, + such as headers and titles, we're OK with things taking a bit longer to load. + We do have some optional classes and parameters in the mixins, in case you + definitely want to make sure you're using the preferred font and don't mind + the performance hit. + We should be able to improve on this once CSS Font Loading L3 becomes more + widely available. +*/ +/* ========== COLORS ========== */ +/** +* +* Material design color palettes. +* @see http://www.google.com/design/spec/style/color.html +* +**/ +/** + * Copyright 2015 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* ========== Color Palettes ========== */ +/* colors.scss */ +/** + * Copyright 2015 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* ========== IMAGES ========== */ +/* ========== Color & Themes ========== */ +/* ========== Typography ========== */ +/* ========== Components ========== */ +/* ========== Standard Buttons ========== */ +/* ========== Icon Toggles ========== */ +/* ========== Radio Buttons ========== */ +/* ========== Ripple effect ========== */ +/* ========== Layout ========== */ +/* ========== Content Tabs ========== */ +/* ========== Checkboxes ========== */ +/* ========== Switches ========== */ +/* ========== Spinner ========== */ +/* ========== Text fields ========== */ +/* ========== Card ========== */ +/* ========== Sliders ========== */ +/* ========== Progress ========== */ +/* ========== List ========== */ +/* ========== Item ========== */ +/* ========== Dropdown menu ========== */ +/* ========== Tooltips ========== */ +/* ========== Footer ========== */ +/* TEXTFIELD */ +/* SWITCH */ +/* SPINNER */ +/* RADIO */ +/* MENU */ +/* LIST */ +/* LAYOUT */ +/* ICON TOGGLE */ +/* FOOTER */ +/*mega-footer*/ +/*mini-footer*/ +/* CHECKBOX */ +/* CARD */ +/* Card dimensions */ +/* Cover image */ +/* BUTTON */ +/** + * + * Dimensions + * + */ +/* ANIMATION */ +/* PROGRESS */ +/* BADGE */ +/* SHADOWS */ +/* GRID */ +/* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ +/* TOOLTIP */ +/* CHIP */ +/** + * Copyright 2015 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* Typography */ +/* Shadows */ +/* Animations */ +/* Dialog */ .mdl-mega-footer { padding: 16px 40px; color: rgb(158,158,158); @@ -4986,21 +5633,27 @@ input.mdl-button[type="submit"] { cursor: pointer; z-index: 1; opacity: 0; } - .mdl-mega-footer--heading-checkbox ~ .mdl-mega-footer--heading:after, - .mdl-mega-footer--heading-checkbox ~ .mdl-mega-footer__heading:after, - .mdl-mega-footer__heading-checkbox ~ .mdl-mega-footer--heading:after, - .mdl-mega-footer__heading-checkbox ~ .mdl-mega-footer__heading:after { + .mdl-mega-footer--heading-checkbox + .mdl-mega-footer--heading:after, + .mdl-mega-footer--heading-checkbox + .mdl-mega-footer__heading:after, + .mdl-mega-footer__heading-checkbox + .mdl-mega-footer--heading:after, + .mdl-mega-footer__heading-checkbox + .mdl-mega-footer__heading:after { font-family: 'Material Icons'; content: '\E5CE'; } -.mdl-mega-footer--heading-checkbox:checked ~ ul, -.mdl-mega-footer__heading-checkbox:checked ~ ul { +.mdl-mega-footer--heading-checkbox:checked ~ .mdl-mega-footer--link-list, +.mdl-mega-footer--heading-checkbox:checked ~ .mdl-mega-footer__link-list, +.mdl-mega-footer--heading-checkbox:checked + .mdl-mega-footer--heading + .mdl-mega-footer--link-list, +.mdl-mega-footer--heading-checkbox:checked + .mdl-mega-footer__heading + .mdl-mega-footer__link-list, +.mdl-mega-footer__heading-checkbox:checked ~ .mdl-mega-footer--link-list, +.mdl-mega-footer__heading-checkbox:checked ~ .mdl-mega-footer__link-list, +.mdl-mega-footer__heading-checkbox:checked + .mdl-mega-footer--heading + .mdl-mega-footer--link-list, +.mdl-mega-footer__heading-checkbox:checked + .mdl-mega-footer__heading + .mdl-mega-footer__link-list { display: none; } -.mdl-mega-footer--heading-checkbox:checked ~ .mdl-mega-footer--heading:after, -.mdl-mega-footer--heading-checkbox:checked ~ .mdl-mega-footer__heading:after, -.mdl-mega-footer__heading-checkbox:checked ~ .mdl-mega-footer--heading:after, -.mdl-mega-footer__heading-checkbox:checked ~ .mdl-mega-footer__heading:after { +.mdl-mega-footer--heading-checkbox:checked + .mdl-mega-footer--heading:after, +.mdl-mega-footer--heading-checkbox:checked + .mdl-mega-footer__heading:after, +.mdl-mega-footer__heading-checkbox:checked + .mdl-mega-footer--heading:after, +.mdl-mega-footer__heading-checkbox:checked + .mdl-mega-footer__heading:after { font-family: 'Material Icons'; content: '\E5CF'; } @@ -5060,18 +5713,24 @@ input.mdl-button[type="submit"] { .mdl-mega-footer--heading-checkbox, .mdl-mega-footer__heading-checkbox { display: none; } - .mdl-mega-footer--heading-checkbox ~ .mdl-mega-footer--heading:after, - .mdl-mega-footer--heading-checkbox ~ .mdl-mega-footer__heading:after, - .mdl-mega-footer__heading-checkbox ~ .mdl-mega-footer--heading:after, - .mdl-mega-footer__heading-checkbox ~ .mdl-mega-footer__heading:after { - background-image: none; } - .mdl-mega-footer--heading-checkbox:checked ~ ul, - .mdl-mega-footer__heading-checkbox:checked ~ ul { + .mdl-mega-footer--heading-checkbox + .mdl-mega-footer--heading:after, + .mdl-mega-footer--heading-checkbox + .mdl-mega-footer__heading:after, + .mdl-mega-footer__heading-checkbox + .mdl-mega-footer--heading:after, + .mdl-mega-footer__heading-checkbox + .mdl-mega-footer__heading:after { + content: ''; } + .mdl-mega-footer--heading-checkbox:checked ~ .mdl-mega-footer--link-list, + .mdl-mega-footer--heading-checkbox:checked ~ .mdl-mega-footer__link-list, + .mdl-mega-footer--heading-checkbox:checked + .mdl-mega-footer__heading + .mdl-mega-footer__link-list, + .mdl-mega-footer--heading-checkbox:checked + .mdl-mega-footer--heading + .mdl-mega-footer--link-list, + .mdl-mega-footer__heading-checkbox:checked ~ .mdl-mega-footer--link-list, + .mdl-mega-footer__heading-checkbox:checked ~ .mdl-mega-footer__link-list, + .mdl-mega-footer__heading-checkbox:checked + .mdl-mega-footer__heading + .mdl-mega-footer__link-list, + .mdl-mega-footer__heading-checkbox:checked + .mdl-mega-footer--heading + .mdl-mega-footer--link-list { display: block; } - .mdl-mega-footer--heading-checkbox:checked ~ .mdl-mega-footer--heading:after, - .mdl-mega-footer--heading-checkbox:checked ~ .mdl-mega-footer__heading:after, - .mdl-mega-footer__heading-checkbox:checked ~ .mdl-mega-footer--heading:after, - .mdl-mega-footer__heading-checkbox:checked ~ .mdl-mega-footer__heading:after { + .mdl-mega-footer--heading-checkbox:checked + .mdl-mega-footer--heading:after, + .mdl-mega-footer--heading-checkbox:checked + .mdl-mega-footer__heading:after, + .mdl-mega-footer__heading-checkbox:checked + .mdl-mega-footer--heading:after, + .mdl-mega-footer__heading-checkbox:checked + .mdl-mega-footer__heading:after { content: ''; } } .mdl-mega-footer--bottom-section, @@ -5150,6 +5809,15 @@ input.mdl-button[type="submit"] { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -5201,6 +5869,7 @@ input.mdl-button[type="submit"] { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -5249,16 +5918,17 @@ input.mdl-button[type="submit"] { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ .mdl-mini-footer { - display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; -webkit-flex-flow: row wrap; -ms-flex-flow: row wrap; flex-flow: row wrap; - -webkit-box-pack: justify; -webkit-justify-content: space-between; -ms-flex-pack: justify; justify-content: space-between; @@ -5273,7 +5943,6 @@ input.mdl-button[type="submit"] { .mdl-mini-footer--link-list, .mdl-mini-footer__link-list { - display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; @@ -5300,7 +5969,6 @@ input.mdl-button[type="submit"] { .mdl-mini-footer--left-section, .mdl-mini-footer__left-section { display: inline-block; - -webkit-box-ordinal-group: 1; -webkit-order: 0; -ms-flex-order: 0; order: 0; } @@ -5308,7 +5976,6 @@ input.mdl-button[type="submit"] { .mdl-mini-footer--right-section, .mdl-mini-footer__right-section { display: inline-block; - -webkit-box-ordinal-group: 2; -webkit-order: 1; -ms-flex-order: 1; order: 1; } @@ -5377,6 +6044,15 @@ input.mdl-button[type="submit"] { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -5428,6 +6104,7 @@ input.mdl-button[type="submit"] { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -5476,7 +6153,10 @@ input.mdl-button[type="submit"] { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ .mdl-icon-toggle { position: relative; z-index: 1; @@ -5516,8 +6196,7 @@ input.mdl-button[type="submit"] { text-align: center; background-color: transparent; will-change: background-color; - -webkit-transition: background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1), color 0.2s cubic-bezier(0.4, 0, 0.2, 1); - transition: background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1), color 0.2s cubic-bezier(0.4, 0, 0.2, 1); } + transition: background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1), color 0.2s cubic-bezier(0.4, 0, 0.2, 1); } .mdl-icon-toggle__label.material-icons { line-height: 32px; font-size: 24px; } @@ -5526,8 +6205,7 @@ input.mdl-button[type="submit"] { .mdl-icon-toggle.is-disabled .mdl-icon-toggle__label { color: rgba(0,0,0, 0.26); cursor: auto; - -webkit-transition: none; - transition: none; } + transition: none; } .mdl-icon-toggle.is-focused .mdl-icon-toggle__label { background-color: rgba(0,0,0, 0.12); } .mdl-icon-toggle.is-focused.is-checked .mdl-icon-toggle__label { @@ -5607,6 +6285,15 @@ input.mdl-button[type="submit"] { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -5658,6 +6345,7 @@ input.mdl-button[type="submit"] { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -5706,7 +6394,10 @@ input.mdl-button[type="submit"] { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ /** * Copyright 2015 Google Inc. All Rights Reserved. * @@ -5725,6 +6416,328 @@ input.mdl-button[type="submit"] { /* Typography */ /* Shadows */ /* Animations */ +/* Dialog */ +.mdl-list { + display: block; + padding: 8px 0; + list-style: none; } + +.mdl-list__item { + font-family: "Roboto", "Helvetica", "Arial", sans-serif; + font-size: 16px; + font-weight: 400; + line-height: 24px; + letter-spacing: 0.04em; + line-height: 1; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + min-height: 48px; + box-sizing: border-box; + -webkit-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row; + -webkit-flex-wrap: nowrap; + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + padding: 16px; + cursor: default; + color: rgba(0,0,0, 0.87); + overflow: hidden; } + .mdl-list__item .mdl-list__item-primary-content { + -webkit-order: 0; + -ms-flex-order: 0; + order: 0; + -webkit-flex-grow: 2; + -ms-flex-positive: 2; + flex-grow: 2; + text-decoration: none; + box-sizing: border-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; } + .mdl-list__item .mdl-list__item-primary-content .mdl-list__item-icon { + margin-right: 32px; } + .mdl-list__item .mdl-list__item-primary-content .mdl-list__item-avatar { + margin-right: 16px; } + .mdl-list__item .mdl-list__item-secondary-content { + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-flow: column; + -ms-flex-flow: column; + flex-flow: column; + -webkit-align-items: flex-end; + -ms-flex-align: end; + align-items: flex-end; + margin-left: 16px; } + .mdl-list__item .mdl-list__item-secondary-content .mdl-list__item-secondary-action label { + display: inline; } + .mdl-list__item .mdl-list__item-secondary-content .mdl-list__item-secondary-info { + font-size: 12px; + font-weight: 400; + line-height: 1; + letter-spacing: 0; + color: rgba(0,0,0, 0.54); } + .mdl-list__item .mdl-list__item-secondary-content .mdl-list__item-sub-header { + padding: 0 0 0 16px; } + +.mdl-list__item-icon, +.mdl-list__item-icon.material-icons { + height: 24px; + width: 24px; + font-size: 24px; + box-sizing: border-box; + color: rgb(117,117,117); } + +.mdl-list__item-avatar, +.mdl-list__item-avatar.material-icons { + height: 40px; + width: 40px; + box-sizing: border-box; + border-radius: 50%; + background-color: rgb(117,117,117); + font-size: 40px; + color: white; } + +.mdl-list__item--two-line { + height: 72px; } + .mdl-list__item--two-line .mdl-list__item-primary-content { + height: 36px; + line-height: 20px; + display: block; } + .mdl-list__item--two-line .mdl-list__item-primary-content .mdl-list__item-avatar { + float: left; } + .mdl-list__item--two-line .mdl-list__item-primary-content .mdl-list__item-icon { + float: left; + margin-top: 6px; } + .mdl-list__item--two-line .mdl-list__item-primary-content .mdl-list__item-secondary-content { + height: 36px; } + .mdl-list__item--two-line .mdl-list__item-primary-content .mdl-list__item-sub-title { + font-size: 14px; + font-weight: 400; + line-height: 24px; + letter-spacing: 0; + line-height: 18px; + color: rgba(0,0,0, 0.54); + display: block; + padding: 0; } + +.mdl-list__item--three-line { + height: 88px; } + .mdl-list__item--three-line .mdl-list__item-primary-content { + height: 52px; + line-height: 20px; + display: block; } + .mdl-list__item--three-line .mdl-list__item-primary-content .mdl-list__item-avatar, + .mdl-list__item--three-line .mdl-list__item-primary-content .mdl-list__item-icon { + float: left; } + .mdl-list__item--three-line .mdl-list__item-secondary-content { + height: 52px; } + .mdl-list__item--three-line .mdl-list__item-text-body { + font-size: 14px; + font-weight: 400; + line-height: 24px; + letter-spacing: 0; + line-height: 18px; + height: 52px; + color: rgba(0,0,0, 0.54); + display: block; + padding: 0; } + +/** + * Copyright 2015 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Copyright 2015 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/*------------------------------------* $CONTENTS +\*------------------------------------*/ +/** + * STYLE GUIDE VARIABLES------------------Declarations of Sass variables + * -----Typography + * -----Colors + * -----Textfield + * -----Switch + * -----Spinner + * -----Radio + * -----Menu + * -----List + * -----Layout + * -----Icon toggles + * -----Footer + * -----Column + * -----Checkbox + * -----Card + * -----Button + * -----Animation + * -----Progress + * -----Badge + * -----Shadows + * -----Grid + * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. + */ +/* ========== TYPOGRAPHY ========== */ +/* We're splitting fonts into "preferred" and "performance" in order to optimize + page loading. For important text, such as the body, we want it to load + immediately and not wait for the web font load, whereas for other sections, + such as headers and titles, we're OK with things taking a bit longer to load. + We do have some optional classes and parameters in the mixins, in case you + definitely want to make sure you're using the preferred font and don't mind + the performance hit. + We should be able to improve on this once CSS Font Loading L3 becomes more + widely available. +*/ +/* ========== COLORS ========== */ +/** +* +* Material design color palettes. +* @see http://www.google.com/design/spec/style/color.html +* +**/ +/** + * Copyright 2015 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* ========== Color Palettes ========== */ +/* colors.scss */ +/** + * Copyright 2015 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* ========== IMAGES ========== */ +/* ========== Color & Themes ========== */ +/* ========== Typography ========== */ +/* ========== Components ========== */ +/* ========== Standard Buttons ========== */ +/* ========== Icon Toggles ========== */ +/* ========== Radio Buttons ========== */ +/* ========== Ripple effect ========== */ +/* ========== Layout ========== */ +/* ========== Content Tabs ========== */ +/* ========== Checkboxes ========== */ +/* ========== Switches ========== */ +/* ========== Spinner ========== */ +/* ========== Text fields ========== */ +/* ========== Card ========== */ +/* ========== Sliders ========== */ +/* ========== Progress ========== */ +/* ========== List ========== */ +/* ========== Item ========== */ +/* ========== Dropdown menu ========== */ +/* ========== Tooltips ========== */ +/* ========== Footer ========== */ +/* TEXTFIELD */ +/* SWITCH */ +/* SPINNER */ +/* RADIO */ +/* MENU */ +/* LIST */ +/* LAYOUT */ +/* ICON TOGGLE */ +/* FOOTER */ +/*mega-footer*/ +/*mini-footer*/ +/* CHECKBOX */ +/* CARD */ +/* Card dimensions */ +/* Cover image */ +/* BUTTON */ +/** + * + * Dimensions + * + */ +/* ANIMATION */ +/* PROGRESS */ +/* BADGE */ +/* SHADOWS */ +/* GRID */ +/* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ +/* TOOLTIP */ +/* CHIP */ +/** + * Copyright 2015 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* Typography */ +/* Shadows */ +/* Animations */ +/* Dialog */ .mdl-menu__container { display: block; margin: 0; @@ -5736,8 +6749,7 @@ input.mdl-button[type="submit"] { width: 0; visibility: hidden; z-index: -1; } - .mdl-menu__container.is-visible, - .mdl-menu__container.is-animating { + .mdl-menu__container.is-visible, .mdl-menu__container.is-animating { z-index: 999; visibility: visible; } @@ -5754,33 +6766,28 @@ input.mdl-button[type="submit"] { overflow: hidden; opacity: 0; -webkit-transform: scale(0); - -ms-transform: scale(0); transform: scale(0); -webkit-transform-origin: 0 0; - -ms-transform-origin: 0 0; transform-origin: 0 0; box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12); will-change: transform; - -webkit-transition: -webkit-transform 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1); - transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1); + transition: opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 0.3s cubic-bezier(0.4, 0, 0.2, 1); + transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1); + transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 0.3s cubic-bezier(0.4, 0, 0.2, 1); z-index: -1; } .mdl-menu__container.is-visible .mdl-menu__outline { opacity: 1; -webkit-transform: scale(1); - -ms-transform: scale(1); transform: scale(1); z-index: 999; } .mdl-menu__outline.mdl-menu--bottom-right { -webkit-transform-origin: 100% 0; - -ms-transform-origin: 100% 0; transform-origin: 100% 0; } .mdl-menu__outline.mdl-menu--top-left { -webkit-transform-origin: 0 100%; - -ms-transform-origin: 0 100%; transform-origin: 0 100%; } .mdl-menu__outline.mdl-menu--top-right { -webkit-transform-origin: 100% 100%; - -ms-transform-origin: 100% 100%; transform-origin: 100% 100%; } .mdl-menu { @@ -5800,8 +6807,7 @@ input.mdl-button[type="submit"] { opacity: 1; z-index: 999; } .mdl-menu.is-animating { - -webkit-transition: opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1), clip 0.3s cubic-bezier(0.4, 0, 0.2, 1); - transition: opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1), clip 0.3s cubic-bezier(0.4, 0, 0.2, 1); } + transition: opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1), clip 0.3s cubic-bezier(0.4, 0, 0.2, 1); } .mdl-menu.mdl-menu--bottom-right { left: auto; right: 0; } @@ -5838,8 +6844,7 @@ input.mdl-button[type="submit"] { line-height: 48px; white-space: nowrap; opacity: 0; - -webkit-transition: opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1); - transition: opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1); + transition: opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1); -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; @@ -5848,15 +6853,17 @@ input.mdl-button[type="submit"] { opacity: 1; } .mdl-menu__item::-moz-focus-inner { border: 0; } - .mdl-menu__item[disabled] { + .mdl-menu__item--full-bleed-divider { + border-bottom: 1px solid rgba(0,0,0, 0.12); } + .mdl-menu__item[disabled], .mdl-menu__item[data-mdl-disabled] { color: rgb(189,189,189); background-color: transparent; cursor: auto; } - .mdl-menu__item[disabled]:hover { + .mdl-menu__item[disabled]:hover, .mdl-menu__item[data-mdl-disabled]:hover { background-color: transparent; } - .mdl-menu__item[disabled]:focus { + .mdl-menu__item[disabled]:focus, .mdl-menu__item[data-mdl-disabled]:focus { background-color: transparent; } - .mdl-menu__item[disabled] .mdl-ripple { + .mdl-menu__item[disabled] .mdl-ripple, .mdl-menu__item[data-mdl-disabled] .mdl-ripple { background: transparent; } .mdl-menu__item:hover { background-color: rgb(238,238,238); } @@ -5931,6 +6938,15 @@ input.mdl-button[type="submit"] { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -5982,6 +6998,7 @@ input.mdl-button[type="submit"] { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -6030,12 +7047,16 @@ input.mdl-button[type="submit"] { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ .mdl-progress { display: block; position: relative; height: 4px; - width: 500px; } + width: 500px; + max-width: 100%; } .mdl-progress > .bar { display: block; @@ -6043,8 +7064,7 @@ input.mdl-button[type="submit"] { top: 0; bottom: 0; width: 0%; - -webkit-transition: width 0.2s cubic-bezier(0.4, 0, 0.2, 1); - transition: width 0.2s cubic-bezier(0.4, 0, 0.2, 1); } + transition: width 0.2s cubic-bezier(0.4, 0, 0.2, 1); } .mdl-progress > .progressbar { background-color: rgb(63,81,181); @@ -6052,7 +7072,6 @@ input.mdl-button[type="submit"] { left: 0; } .mdl-progress > .bufferbar { - background-image: -webkit-linear-gradient(left, rgba(255,255,255, 0.7), rgba(255,255,255, 0.7)), -webkit-linear-gradient(left, rgb(63,81,181), rgb(63,81,181)); background-image: linear-gradient(to right, rgba(255,255,255, 0.7), rgba(255,255,255, 0.7)), linear-gradient(to right, rgb(63,81,181), rgb(63,81,181)); z-index: 0; left: 0; } @@ -6061,16 +7080,17 @@ input.mdl-button[type="submit"] { right: 0; } @supports (-webkit-appearance: none) { + .mdl-progress:not(.mdl-progress--indeterminate):not(.mdl-progress--indeterminate) > .auxbar, .mdl-progress:not(.mdl-progress__indeterminate):not(.mdl-progress__indeterminate) > .auxbar { - background-image: -webkit-linear-gradient(left, rgba(255,255,255, 0.7), rgba(255,255,255, 0.7)), -webkit-linear-gradient(left, rgb(63,81,181), rgb(63,81,181)); background-image: linear-gradient(to right, rgba(255,255,255, 0.7), rgba(255,255,255, 0.7)), linear-gradient(to right, rgb(63,81,181), rgb(63,81,181)); -webkit-mask: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIj8+Cjxzdmcgd2lkdGg9IjEyIiBoZWlnaHQ9IjQiIHZpZXdQb3J0PSIwIDAgMTIgNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxlbGxpcHNlIGN4PSIyIiBjeT0iMiIgcng9IjIiIHJ5PSIyIj4KICAgIDxhbmltYXRlIGF0dHJpYnV0ZU5hbWU9ImN4IiBmcm9tPSIyIiB0bz0iLTEwIiBkdXI9IjAuNnMiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiAvPgogIDwvZWxsaXBzZT4KICA8ZWxsaXBzZSBjeD0iMTQiIGN5PSIyIiByeD0iMiIgcnk9IjIiIGNsYXNzPSJsb2FkZXIiPgogICAgPGFuaW1hdGUgYXR0cmlidXRlTmFtZT0iY3giIGZyb209IjE0IiB0bz0iMiIgZHVyPSIwLjZzIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSIgLz4KICA8L2VsbGlwc2U+Cjwvc3ZnPgo="); mask: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIj8+Cjxzdmcgd2lkdGg9IjEyIiBoZWlnaHQ9IjQiIHZpZXdQb3J0PSIwIDAgMTIgNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxlbGxpcHNlIGN4PSIyIiBjeT0iMiIgcng9IjIiIHJ5PSIyIj4KICAgIDxhbmltYXRlIGF0dHJpYnV0ZU5hbWU9ImN4IiBmcm9tPSIyIiB0bz0iLTEwIiBkdXI9IjAuNnMiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiAvPgogIDwvZWxsaXBzZT4KICA8ZWxsaXBzZSBjeD0iMTQiIGN5PSIyIiByeD0iMiIgcnk9IjIiIGNsYXNzPSJsb2FkZXIiPgogICAgPGFuaW1hdGUgYXR0cmlidXRlTmFtZT0iY3giIGZyb209IjE0IiB0bz0iMiIgZHVyPSIwLjZzIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSIgLz4KICA8L2VsbGlwc2U+Cjwvc3ZnPgo="); } } +.mdl-progress:not(.mdl-progress--indeterminate) > .auxbar, .mdl-progress:not(.mdl-progress__indeterminate) > .auxbar { - background-image: -webkit-linear-gradient(left, rgba(255,255,255, 0.9), rgba(255,255,255, 0.9)), -webkit-linear-gradient(left, rgb(63,81,181), rgb(63,81,181)); background-image: linear-gradient(to right, rgba(255,255,255, 0.9), rgba(255,255,255, 0.9)), linear-gradient(to right, rgb(63,81,181), rgb(63,81,181)); } +.mdl-progress.mdl-progress--indeterminate > .bar1, .mdl-progress.mdl-progress__indeterminate > .bar1 { background-color: rgb(63,81,181); -webkit-animation-name: indeterminate1; @@ -6082,6 +7102,7 @@ input.mdl-button[type="submit"] { -webkit-animation-timing-function: linear; animation-timing-function: linear; } +.mdl-progress.mdl-progress--indeterminate > .bar3, .mdl-progress.mdl-progress__indeterminate > .bar3 { background-image: none; background-color: rgb(63,81,181); @@ -6199,6 +7220,15 @@ input.mdl-button[type="submit"] { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -6250,6 +7280,7 @@ input.mdl-button[type="submit"] { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -6298,7 +7329,10 @@ input.mdl-button[type="submit"] { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ /** * Copyright 2015 Google Inc. All Rights Reserved. * @@ -6317,8 +7351,8 @@ input.mdl-button[type="submit"] { /* Typography */ /* Shadows */ /* Animations */ +/* Dialog */ .mdl-navigation { - display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; @@ -6330,19 +7364,21 @@ input.mdl-button[type="submit"] { .mdl-navigation__link { color: rgb(66,66,66); text-decoration: none; - font-weight: 500; - font-size: 13px; - margin: 0; } + margin: 0; + font-size: 14px; + font-weight: 400; + line-height: 24px; + letter-spacing: 0; + opacity: 0.87; } + .mdl-navigation__link .material-icons { + vertical-align: middle; } .mdl-layout { width: 100%; height: 100%; - display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; -webkit-flex-direction: column; -ms-flex-direction: column; flex-direction: column; @@ -6362,6 +7398,7 @@ input.mdl-button[type="submit"] { width: 100%; height: 100%; } +.mdl-layout__title, .mdl-layout-title { display: block; position: relative; @@ -6374,18 +7411,14 @@ input.mdl-button[type="submit"] { box-sizing: border-box; } .mdl-layout-spacer { - -webkit-box-flex: 1; -webkit-flex-grow: 1; -ms-flex-positive: 1; flex-grow: 1; } .mdl-layout__drawer { - display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; -webkit-flex-direction: column; -ms-flex-direction: column; flex-direction: column; @@ -6403,43 +7436,41 @@ input.mdl-button[type="submit"] { border-right: 1px solid rgb(224,224,224); background: rgb(250,250,250); -webkit-transform: translateX(-250px); - -ms-transform: translateX(-250px); transform: translateX(-250px); -webkit-transform-style: preserve-3d; transform-style: preserve-3d; will-change: transform; - -webkit-transition-duration: 0.2s; - transition-duration: 0.2s; - -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - -webkit-transition-property: -webkit-transform; - transition-property: transform; + transition-duration: 0.2s; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-property: -webkit-transform; + transition-property: transform; + transition-property: transform, -webkit-transform; color: rgb(66,66,66); overflow: visible; overflow-y: auto; z-index: 5; } .mdl-layout__drawer.is-visible { -webkit-transform: translateX(0); - -ms-transform: translateX(0); transform: translateX(0); } + .mdl-layout__drawer.is-visible ~ .mdl-layout__content.mdl-layout__content { + overflow: hidden; } .mdl-layout__drawer > * { -webkit-flex-shrink: 0; -ms-flex-negative: 0; flex-shrink: 0; } + .mdl-layout__drawer > .mdl-layout__title, .mdl-layout__drawer > .mdl-layout-title { line-height: 64px; padding-left: 40px; } @media screen and (max-width: 1024px) { + .mdl-layout__drawer > .mdl-layout__title, .mdl-layout__drawer > .mdl-layout-title { line-height: 56px; padding-left: 16px; } } .mdl-layout__drawer .mdl-navigation { - -webkit-box-orient: vertical; - -webkit-box-direction: normal; -webkit-flex-direction: column; -ms-flex-direction: column; flex-direction: column; - -webkit-box-align: stretch; -webkit-align-items: stretch; -ms-flex-align: stretch; align-items: stretch; @@ -6458,12 +7489,11 @@ input.mdl-button[type="submit"] { .mdl-layout__drawer .mdl-navigation .mdl-navigation__link:hover { background-color: rgb(224,224,224); } .mdl-layout__drawer .mdl-navigation .mdl-navigation__link--current { - background-color: rgb(0,0,0); - color: rgb(63,81,181); } + background-color: rgb(224,224,224); + color: rgb(0,0,0); } @media screen and (min-width: 1025px) { .mdl-layout--fixed-drawer > .mdl-layout__drawer { -webkit-transform: translateX(0); - -ms-transform: translateX(0); transform: translateX(0); } } .mdl-layout__drawer-button { @@ -6479,9 +7509,9 @@ input.mdl-button[type="submit"] { text-align: center; cursor: pointer; font-size: 26px; - line-height: 50px; + line-height: 56px; font-family: Helvetica, Arial, sans-serif; - margin: 10px 12px; + margin: 8px 12px; top: 0; left: 0; color: rgb(255,255,255); @@ -6498,23 +7528,23 @@ input.mdl-button[type="submit"] { margin: 4px; color: rgba(0, 0, 0, 0.5); } } @media screen and (min-width: 1025px) { - .mdl-layout--fixed-drawer > .mdl-layout__drawer-button { - display: none; } } + .mdl-layout__drawer-button { + line-height: 54px; } + .mdl-layout--no-desktop-drawer-button .mdl-layout__drawer-button, + .mdl-layout--fixed-drawer > .mdl-layout__drawer-button, + .mdl-layout--no-drawer-button .mdl-layout__drawer-button { + display: none; } } .mdl-layout__header { - display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; -webkit-flex-direction: column; -ms-flex-direction: column; flex-direction: column; -webkit-flex-wrap: nowrap; -ms-flex-wrap: nowrap; flex-wrap: nowrap; - -webkit-box-pack: start; -webkit-justify-content: flex-start; -ms-flex-pack: start; justify-content: flex-start; @@ -6532,19 +7562,16 @@ input.mdl-button[type="submit"] { background-color: rgb(63,81,181); color: rgb(255,255,255); box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12); - -webkit-transition-duration: 0.2s; - transition-duration: 0.2s; - -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - -webkit-transition-property: max-height, box-shadow; - transition-property: max-height, box-shadow; } + transition-duration: 0.2s; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-property: max-height, box-shadow; } @media screen and (max-width: 1024px) { .mdl-layout__header { min-height: 56px; } } - .mdl-layout--fixed-drawer:not(.is-small-screen) > .mdl-layout__header { + .mdl-layout--fixed-drawer.is-upgraded:not(.is-small-screen) > .mdl-layout__header { margin-left: 240px; width: calc(100% - 240px); } - @media screen and (min-width: 1024px) { + @media screen and (min-width: 1025px) { .mdl-layout--fixed-drawer > .mdl-layout__header .mdl-layout__header-row { padding-left: 40px; } } .mdl-layout__header > .mdl-layout-icon { @@ -6576,7 +7603,6 @@ input.mdl-button[type="submit"] { .mdl-layout__header { display: none; } .mdl-layout--fixed-header > .mdl-layout__header { - display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; } } @@ -6596,14 +7622,15 @@ input.mdl-button[type="submit"] { overflow: hidden; } .mdl-layout__header--waterfall.is-casting-shadow { box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12); } + .mdl-layout__header--waterfall.mdl-layout__header--waterfall-hide-top { + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; } .mdl-layout__header-row { - display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; -webkit-flex-direction: row; -ms-flex-direction: row; flex-direction: row; @@ -6617,17 +7644,23 @@ input.mdl-button[type="submit"] { -webkit-align-self: stretch; -ms-flex-item-align: stretch; align-self: stretch; - -webkit-box-align: center; -webkit-align-items: center; -ms-flex-align: center; align-items: center; height: 64px; margin: 0; padding: 0 40px 0 80px; } + .mdl-layout--no-drawer-button .mdl-layout__header-row { + padding-left: 40px; } + @media screen and (min-width: 1025px) { + .mdl-layout--no-desktop-drawer-button .mdl-layout__header-row { + padding-left: 40px; } } @media screen and (max-width: 1024px) { .mdl-layout__header-row { height: 56px; - padding: 0 16px 0 72px; } } + padding: 0 16px 0 72px; } + .mdl-layout--no-drawer-button .mdl-layout__header-row { + padding-left: 16px; } } .mdl-layout__header-row > * { -webkit-flex-shrink: 0; -ms-flex-negative: 0; @@ -6638,12 +7671,9 @@ input.mdl-button[type="submit"] { margin: 0; padding: 0; height: 64px; - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; -webkit-flex-direction: row; -ms-flex-direction: row; flex-direction: row; - -webkit-box-align: center; -webkit-align-items: center; -ms-flex-align: center; align-items: center; } @@ -6669,22 +7699,29 @@ input.mdl-button[type="submit"] { width: 100%; z-index: 4; visibility: hidden; - -webkit-transition-property: background-color; - transition-property: background-color; - -webkit-transition-duration: 0.2s; - transition-duration: 0.2s; - -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); } - .mdl-layout__drawer.is-visible ~ .mdl-layout__obfuscator { + transition-property: background-color; + transition-duration: 0.2s; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); } + .mdl-layout__obfuscator.is-visible { background-color: rgba(0, 0, 0, 0.5); visibility: visible; } + @supports (pointer-events: auto) { + .mdl-layout__obfuscator { + background-color: rgba(0, 0, 0, 0.5); + opacity: 0; + transition-property: opacity; + visibility: visible; + pointer-events: none; } + .mdl-layout__obfuscator.is-visible { + pointer-events: auto; + opacity: 1; } } .mdl-layout__content { -ms-flex: 0 1 auto; + position: relative; display: inline-block; overflow-y: auto; overflow-x: hidden; - -webkit-box-flex: 1; -webkit-flex-grow: 1; -ms-flex-positive: 1; flex-grow: 1; @@ -6704,9 +7741,8 @@ input.mdl-button[type="submit"] { .mdl-layout__tab-bar { height: 96px; margin: 0; - width: calc(100% - 112px); + width: calc(100% - 112px); padding: 0 0 0 56px; - display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; @@ -6715,10 +7751,20 @@ input.mdl-button[type="submit"] { overflow-x: scroll; } .mdl-layout__tab-bar::-webkit-scrollbar { display: none; } + .mdl-layout--no-drawer-button .mdl-layout__tab-bar { + padding-left: 16px; + width: calc(100% - 32px); } + @media screen and (min-width: 1025px) { + .mdl-layout--no-desktop-drawer-button .mdl-layout__tab-bar { + padding-left: 16px; + width: calc(100% - 32px); } } @media screen and (max-width: 1024px) { .mdl-layout__tab-bar { - width: calc(100% - 60px); - padding: 0 0 0 60px; } } + width: calc(100% - 60px); + padding: 0 0 0 60px; } + .mdl-layout--no-drawer-button .mdl-layout__tab-bar { + width: calc(100% - 8px); + padding-left: 4px; } } .mdl-layout--fixed-tabs .mdl-layout__tab-bar { padding: 0; overflow: hidden; @@ -6731,7 +7777,6 @@ input.mdl-button[type="submit"] { border: none; margin: 0; z-index: 2; - -webkit-box-flex: 0; -webkit-flex-grow: 0; -ms-flex-positive: 0; flex-grow: 0; @@ -6759,9 +7804,15 @@ input.mdl-button[type="submit"] { -moz-user-select: none; -ms-user-select: none; user-select: none; } + .mdl-layout--no-desktop-drawer-button .mdl-layout__tab-bar-button, + .mdl-layout--no-drawer-button .mdl-layout__tab-bar-button { + width: 16px; } + .mdl-layout--no-desktop-drawer-button .mdl-layout__tab-bar-button .material-icons, + .mdl-layout--no-drawer-button .mdl-layout__tab-bar-button .material-icons { + position: relative; + left: -4px; } @media screen and (max-width: 1024px) { .mdl-layout__tab-bar-button { - display: none; width: 60px; } } .mdl-layout--fixed-tabs .mdl-layout__tab-bar-button { display: none; } @@ -6783,7 +7834,6 @@ input.mdl-button[type="submit"] { float: left; position: relative; display: block; - -webkit-box-flex: 0; -webkit-flex-grow: 0; -ms-flex-positive: 0; flex-grow: 0; @@ -6804,7 +7854,6 @@ input.mdl-button[type="submit"] { padding: 0 12px 0 12px; } } .mdl-layout--fixed-tabs .mdl-layout__tab { float: none; - -webkit-box-flex: 1; -webkit-flex-grow: 1; -ms-flex-positive: 1; flex-grow: 1; @@ -6822,8 +7871,7 @@ input.mdl-button[type="submit"] { background: rgb(255,64,129); -webkit-animation: border-expand 0.2s cubic-bezier(0.4, 0, 0.4, 1) 0.01s alternate forwards; animation: border-expand 0.2s cubic-bezier(0.4, 0, 0.4, 1) 0.01s alternate forwards; - -webkit-transition: all 1s cubic-bezier(0.4, 0, 1, 1); - transition: all 1s cubic-bezier(0.4, 0, 1, 1); } + transition: all 1s cubic-bezier(0.4, 0, 1, 1); } .mdl-layout__tab .mdl-layout__tab-ripple-container { display: block; position: absolute; @@ -6898,6 +7946,15 @@ input.mdl-button[type="submit"] { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -6949,6 +8006,7 @@ input.mdl-button[type="submit"] { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -6997,7 +8055,10 @@ input.mdl-button[type="submit"] { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ /** * Copyright 2015 Google Inc. All Rights Reserved. * @@ -7016,12 +8077,15 @@ input.mdl-button[type="submit"] { /* Typography */ /* Shadows */ /* Animations */ +/* Dialog */ .mdl-radio { position: relative; font-size: 16px; line-height: 24px; display: inline-block; + vertical-align: middle; box-sizing: border-box; + height: 24px; margin: 0; padding-left: 0; } .mdl-radio.is-upgraded { @@ -7057,6 +8121,7 @@ input.mdl-button[type="submit"] { z-index: 2; } .mdl-radio.is-checked .mdl-radio__outer-circle { border: 2px solid rgb(63,81,181); } + .mdl-radio__outer-circle fieldset[disabled] .mdl-radio, .mdl-radio.is-disabled .mdl-radio__outer-circle { border: 2px solid rgba(0,0,0, 0.26); cursor: auto; } @@ -7071,19 +8136,19 @@ input.mdl-button[type="submit"] { width: 8px; height: 8px; cursor: pointer; - -webkit-transition-duration: 0.28s; - transition-duration: 0.28s; - -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - -webkit-transition-property: -webkit-transform; - transition-property: transform; - -webkit-transform: scale3d(0, 0, 0); - transform: scale3d(0, 0, 0); + transition-duration: 0.28s; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-property: -webkit-transform; + transition-property: transform; + transition-property: transform, -webkit-transform; + -webkit-transform: scale(0, 0); + transform: scale(0, 0); border-radius: 50%; background: rgb(63,81,181); } .mdl-radio.is-checked .mdl-radio__inner-circle { - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); } + -webkit-transform: scale(1, 1); + transform: scale(1, 1); } + fieldset[disabled] .mdl-radio .mdl-radio__inner-circle, .mdl-radio.is-disabled .mdl-radio__inner-circle { background: rgba(0,0,0, 0.26); cursor: auto; } @@ -7092,6 +8157,7 @@ input.mdl-button[type="submit"] { .mdl-radio__label { cursor: pointer; } + fieldset[disabled] .mdl-radio .mdl-radio__label, .mdl-radio.is-disabled .mdl-radio__label { color: rgba(0,0,0, 0.26); cursor: auto; } @@ -7110,8 +8176,10 @@ input.mdl-button[type="submit"] { -webkit-mask-image: -webkit-radial-gradient(circle, white, black); } .mdl-radio__ripple-container .mdl-ripple { background: rgb(63,81,181); } + fieldset[disabled] .mdl-radio .mdl-radio__ripple-container, .mdl-radio.is-disabled .mdl-radio__ripple-container { cursor: auto; } + fieldset[disabled] .mdl-radio .mdl-radio__ripple-container .mdl-ripple, .mdl-radio.is-disabled .mdl-radio__ripple-container .mdl-ripple { background: transparent; } @@ -7170,6 +8238,15 @@ input.mdl-button[type="submit"] { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -7221,6 +8298,7 @@ input.mdl-button[type="submit"] { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -7269,7 +8347,10 @@ input.mdl-button[type="submit"] { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { -ms-appearance: none; height: 32px; @@ -7293,6 +8374,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { color: rgb(63,81,181); -webkit-align-self: center; -ms-flex-item-align: center; + -ms-grid-row-align: center; align-self: center; z-index: 1; cursor: pointer; @@ -7329,8 +8411,9 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { border-radius: 50%; background: rgb(63,81,181); border: none; - -webkit-transition: -webkit-transform 0.18s cubic-bezier(0.4, 0, 0.2, 1), border 0.18s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.18s cubic-bezier(0.4, 0, 0.2, 1), background 0.28s cubic-bezier(0.4, 0, 0.2, 1); - transition: transform 0.18s cubic-bezier(0.4, 0, 0.2, 1), border 0.18s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.18s cubic-bezier(0.4, 0, 0.2, 1), background 0.28s cubic-bezier(0.4, 0, 0.2, 1); } + transition: border 0.18s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.18s cubic-bezier(0.4, 0, 0.2, 1), background 0.28s cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 0.18s cubic-bezier(0.4, 0, 0.2, 1); + transition: transform 0.18s cubic-bezier(0.4, 0, 0.2, 1), border 0.18s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.18s cubic-bezier(0.4, 0, 0.2, 1), background 0.28s cubic-bezier(0.4, 0, 0.2, 1); + transition: transform 0.18s cubic-bezier(0.4, 0, 0.2, 1), border 0.18s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.18s cubic-bezier(0.4, 0, 0.2, 1), background 0.28s cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 0.18s cubic-bezier(0.4, 0, 0.2, 1); } .mdl-slider.is-upgraded::-moz-range-thumb { -moz-appearance: none; width: 12px; @@ -7359,24 +8442,23 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { border: none; border-radius: 50%; background: rgb(63,81,181); - -ms-transform: scale(0.375); - transform: scale(0.375); - transition: transform 0.18s cubic-bezier(0.4, 0, 0.2, 1), background 0.28s cubic-bezier(0.4, 0, 0.2, 1); } + transform: scale(0.375); + transition: background 0.28s cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 0.18s cubic-bezier(0.4, 0, 0.2, 1); + transition: transform 0.18s cubic-bezier(0.4, 0, 0.2, 1), background 0.28s cubic-bezier(0.4, 0, 0.2, 1); + transition: transform 0.18s cubic-bezier(0.4, 0, 0.2, 1), background 0.28s cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 0.18s cubic-bezier(0.4, 0, 0.2, 1); } .mdl-slider.is-upgraded:focus:not(:active)::-ms-thumb { background: radial-gradient(circle closest-side, rgb(63,81,181) 0%, rgb(63,81,181) 37.5%, rgba(63,81,181, 0.26) 37.5%, rgba(63,81,181, 0.26) 100%); - -ms-transform: scale(1); - transform: scale(1); } + transform: scale(1); } .mdl-slider.is-upgraded:active::-ms-thumb { background: rgb(63,81,181); - -ms-transform: scale(0.5625); - transform: scale(0.5625); } + transform: scale(0.5625); } .mdl-slider.is-upgraded.is-lowest-value::-webkit-slider-thumb { border: 2px solid rgba(0,0,0, 0.26); background: transparent; } .mdl-slider.is-upgraded.is-lowest-value::-moz-range-thumb { border: 2px solid rgba(0,0,0, 0.26); background: transparent; } - .mdl-slider.is-upgraded.is-lowest-value ~ + .mdl-slider.is-upgraded.is-lowest-value + .mdl-slider__background-flex > .mdl-slider__background-upper { left: 6px; } .mdl-slider.is-upgraded.is-lowest-value:focus:not(:active)::-webkit-slider-thumb { @@ -7389,7 +8471,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { border: 1.6px solid rgba(0,0,0, 0.26); -webkit-transform: scale(1.5); transform: scale(1.5); } - .mdl-slider.is-upgraded.is-lowest-value:active ~ + .mdl-slider.is-upgraded.is-lowest-value:active + .mdl-slider__background-flex > .mdl-slider__background-upper { left: 9px; } .mdl-slider.is-upgraded.is-lowest-value:active::-moz-range-thumb { @@ -7399,11 +8481,9 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { background: radial-gradient(circle closest-side, transparent 0%, transparent 66.67%, rgba(0,0,0, 0.26) 66.67%, rgba(0,0,0, 0.26) 100%); } .mdl-slider.is-upgraded.is-lowest-value:focus:not(:active)::-ms-thumb { background: radial-gradient(circle closest-side, rgba(0,0,0, 0.12) 0%, rgba(0,0,0, 0.12) 25%, rgba(0,0,0, 0.26) 25%, rgba(0,0,0, 0.26) 37.5%, rgba(0,0,0, 0.12) 37.5%, rgba(0,0,0, 0.12) 100%); - -ms-transform: scale(1); - transform: scale(1); } + transform: scale(1); } .mdl-slider.is-upgraded.is-lowest-value:active::-ms-thumb { - -ms-transform: scale(0.5625); - transform: scale(0.5625); + transform: scale(0.5625); background: radial-gradient(circle closest-side, transparent 0%, transparent 77.78%, rgba(0,0,0, 0.26) 77.78%, rgba(0,0,0, 0.26) 100%); } .mdl-slider.is-upgraded.is-lowest-value::-ms-fill-lower { background: transparent; } @@ -7411,51 +8491,37 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { margin-left: 6px; } .mdl-slider.is-upgraded.is-lowest-value:active::-ms-fill-upper { margin-left: 9px; } - .mdl-slider.is-upgraded:disabled:focus::-webkit-slider-thumb, - .mdl-slider.is-upgraded:disabled:active::-webkit-slider-thumb, - .mdl-slider.is-upgraded:disabled::-webkit-slider-thumb { + .mdl-slider.is-upgraded:disabled:focus::-webkit-slider-thumb, .mdl-slider.is-upgraded:disabled:active::-webkit-slider-thumb, .mdl-slider.is-upgraded:disabled::-webkit-slider-thumb { -webkit-transform: scale(0.667); transform: scale(0.667); background: rgba(0,0,0, 0.26); } - .mdl-slider.is-upgraded:disabled:focus::-moz-range-thumb, - .mdl-slider.is-upgraded:disabled:active::-moz-range-thumb, - .mdl-slider.is-upgraded:disabled::-moz-range-thumb { + .mdl-slider.is-upgraded:disabled:focus::-moz-range-thumb, .mdl-slider.is-upgraded:disabled:active::-moz-range-thumb, .mdl-slider.is-upgraded:disabled::-moz-range-thumb { transform: scale(0.667); background: rgba(0,0,0, 0.26); } - .mdl-slider.is-upgraded:disabled ~ + .mdl-slider.is-upgraded:disabled + .mdl-slider__background-flex > .mdl-slider__background-lower { background-color: rgba(0,0,0, 0.26); left: -6px; } - .mdl-slider.is-upgraded:disabled ~ + .mdl-slider.is-upgraded:disabled + .mdl-slider__background-flex > .mdl-slider__background-upper { left: 6px; } - .mdl-slider.is-upgraded.is-lowest-value:disabled:focus::-webkit-slider-thumb, - .mdl-slider.is-upgraded.is-lowest-value:disabled:active::-webkit-slider-thumb, - .mdl-slider.is-upgraded.is-lowest-value:disabled::-webkit-slider-thumb { + .mdl-slider.is-upgraded.is-lowest-value:disabled:focus::-webkit-slider-thumb, .mdl-slider.is-upgraded.is-lowest-value:disabled:active::-webkit-slider-thumb, .mdl-slider.is-upgraded.is-lowest-value:disabled::-webkit-slider-thumb { border: 3px solid rgba(0,0,0, 0.26); background: transparent; -webkit-transform: scale(0.667); transform: scale(0.667); } - .mdl-slider.is-upgraded.is-lowest-value:disabled:focus::-moz-range-thumb, - .mdl-slider.is-upgraded.is-lowest-value:disabled:active::-moz-range-thumb, - .mdl-slider.is-upgraded.is-lowest-value:disabled::-moz-range-thumb { + .mdl-slider.is-upgraded.is-lowest-value:disabled:focus::-moz-range-thumb, .mdl-slider.is-upgraded.is-lowest-value:disabled:active::-moz-range-thumb, .mdl-slider.is-upgraded.is-lowest-value:disabled::-moz-range-thumb { border: 3px solid rgba(0,0,0, 0.26); background: transparent; transform: scale(0.667); } - .mdl-slider.is-upgraded.is-lowest-value:disabled:active ~ + .mdl-slider.is-upgraded.is-lowest-value:disabled:active + .mdl-slider__background-flex > .mdl-slider__background-upper { left: 6px; } - .mdl-slider.is-upgraded:disabled:focus::-ms-thumb, - .mdl-slider.is-upgraded:disabled:active::-ms-thumb, - .mdl-slider.is-upgraded:disabled::-ms-thumb { - -ms-transform: scale(0.25); - transform: scale(0.25); + .mdl-slider.is-upgraded:disabled:focus::-ms-thumb, .mdl-slider.is-upgraded:disabled:active::-ms-thumb, .mdl-slider.is-upgraded:disabled::-ms-thumb { + transform: scale(0.25); background: rgba(0,0,0, 0.26); } - .mdl-slider.is-upgraded.is-lowest-value:disabled:focus::-ms-thumb, - .mdl-slider.is-upgraded.is-lowest-value:disabled:active::-ms-thumb, - .mdl-slider.is-upgraded.is-lowest-value:disabled::-ms-thumb { - -ms-transform: scale(0.25); - transform: scale(0.25); + .mdl-slider.is-upgraded.is-lowest-value:disabled:focus::-ms-thumb, .mdl-slider.is-upgraded.is-lowest-value:disabled:active::-ms-thumb, .mdl-slider.is-upgraded.is-lowest-value:disabled::-ms-thumb { + transform: scale(0.25); background: radial-gradient(circle closest-side, transparent 0%, transparent 50%, rgba(0,0,0, 0.26) 50%, rgba(0,0,0, 0.26) 100%); } .mdl-slider.is-upgraded:disabled::-ms-fill-lower { margin-right: 6px; @@ -7476,12 +8542,9 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { height: 18px; position: relative; background: none; - display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; -webkit-flex-direction: row; -ms-flex-direction: row; flex-direction: row; } @@ -7494,7 +8557,6 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { top: 50%; left: 0; margin: 0 26px; - display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; @@ -7502,12 +8564,10 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { border: 0; padding: 0; -webkit-transform: translate(0, -1px); - -ms-transform: translate(0, -1px); transform: translate(0, -1px); } .mdl-slider__background-lower { background: rgb(63,81,181); - -webkit-box-flex: 0; -webkit-flex: 0; -ms-flex: 0; flex: 0; @@ -7517,15 +8577,13 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { .mdl-slider__background-upper { background: rgba(0,0,0, 0.26); - -webkit-box-flex: 0; -webkit-flex: 0; -ms-flex: 0; flex: 0; position: relative; border: 0; padding: 0; - -webkit-transition: left 0.18s cubic-bezier(0.4, 0, 0.2, 1); - transition: left 0.18s cubic-bezier(0.4, 0, 0.2, 1); } + transition: left 0.18s cubic-bezier(0.4, 0, 0.2, 1); } /** * Copyright 2015 Google Inc. All Rights Reserved. @@ -7582,6 +8640,15 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -7633,6 +8700,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -7681,7 +8749,278 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ +/** + * Copyright 2015 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* Typography */ +/* Shadows */ +/* Animations */ +/* Dialog */ +.mdl-snackbar { + position: fixed; + bottom: 0; + left: 50%; + cursor: default; + background-color: #323232; + z-index: 3; + display: block; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-justify-content: space-between; + -ms-flex-pack: justify; + justify-content: space-between; + font-family: "Roboto", "Helvetica", "Arial", sans-serif; + will-change: transform; + -webkit-transform: translate(0, 80px); + transform: translate(0, 80px); + transition: -webkit-transform 0.25s cubic-bezier(0.4, 0, 1, 1); + transition: transform 0.25s cubic-bezier(0.4, 0, 1, 1); + transition: transform 0.25s cubic-bezier(0.4, 0, 1, 1), -webkit-transform 0.25s cubic-bezier(0.4, 0, 1, 1); + pointer-events: none; } + @media (max-width: 479px) { + .mdl-snackbar { + width: 100%; + left: 0; + min-height: 48px; + max-height: 80px; } } + @media (min-width: 480px) { + .mdl-snackbar { + min-width: 288px; + max-width: 568px; + border-radius: 2px; + -webkit-transform: translate(-50%, 80px); + transform: translate(-50%, 80px); } } + .mdl-snackbar--active { + -webkit-transform: translate(0, 0); + transform: translate(0, 0); + pointer-events: auto; + transition: -webkit-transform 0.25s cubic-bezier(0, 0, 0.2, 1); + transition: transform 0.25s cubic-bezier(0, 0, 0.2, 1); + transition: transform 0.25s cubic-bezier(0, 0, 0.2, 1), -webkit-transform 0.25s cubic-bezier(0, 0, 0.2, 1); } + @media (min-width: 480px) { + .mdl-snackbar--active { + -webkit-transform: translate(-50%, 0); + transform: translate(-50%, 0); } } + .mdl-snackbar__text { + padding: 14px 12px 14px 24px; + vertical-align: middle; + color: white; + float: left; } + .mdl-snackbar__action { + background: transparent; + border: none; + color: rgb(255,64,129); + float: right; + text-transform: uppercase; + padding: 14px 24px 14px 12px; + font-family: "Roboto", "Helvetica", "Arial", sans-serif; + font-size: 14px; + font-weight: 500; + text-transform: uppercase; + line-height: 1; + letter-spacing: 0; + overflow: hidden; + outline: none; + opacity: 0; + pointer-events: none; + cursor: pointer; + text-decoration: none; + text-align: center; + -webkit-align-self: center; + -ms-flex-item-align: center; + -ms-grid-row-align: center; + align-self: center; } + .mdl-snackbar__action::-moz-focus-inner { + border: 0; } + .mdl-snackbar__action:not([aria-hidden]) { + opacity: 1; + pointer-events: auto; } + +/** + * Copyright 2015 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Copyright 2015 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/*------------------------------------* $CONTENTS +\*------------------------------------*/ +/** + * STYLE GUIDE VARIABLES------------------Declarations of Sass variables + * -----Typography + * -----Colors + * -----Textfield + * -----Switch + * -----Spinner + * -----Radio + * -----Menu + * -----List + * -----Layout + * -----Icon toggles + * -----Footer + * -----Column + * -----Checkbox + * -----Card + * -----Button + * -----Animation + * -----Progress + * -----Badge + * -----Shadows + * -----Grid + * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. + */ +/* ========== TYPOGRAPHY ========== */ +/* We're splitting fonts into "preferred" and "performance" in order to optimize + page loading. For important text, such as the body, we want it to load + immediately and not wait for the web font load, whereas for other sections, + such as headers and titles, we're OK with things taking a bit longer to load. + We do have some optional classes and parameters in the mixins, in case you + definitely want to make sure you're using the preferred font and don't mind + the performance hit. + We should be able to improve on this once CSS Font Loading L3 becomes more + widely available. +*/ +/* ========== COLORS ========== */ +/** +* +* Material design color palettes. +* @see http://www.google.com/design/spec/style/color.html +* +**/ +/** + * Copyright 2015 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* ========== Color Palettes ========== */ +/* colors.scss */ +/** + * Copyright 2015 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* ========== IMAGES ========== */ +/* ========== Color & Themes ========== */ +/* ========== Typography ========== */ +/* ========== Components ========== */ +/* ========== Standard Buttons ========== */ +/* ========== Icon Toggles ========== */ +/* ========== Radio Buttons ========== */ +/* ========== Ripple effect ========== */ +/* ========== Layout ========== */ +/* ========== Content Tabs ========== */ +/* ========== Checkboxes ========== */ +/* ========== Switches ========== */ +/* ========== Spinner ========== */ +/* ========== Text fields ========== */ +/* ========== Card ========== */ +/* ========== Sliders ========== */ +/* ========== Progress ========== */ +/* ========== List ========== */ +/* ========== Item ========== */ +/* ========== Dropdown menu ========== */ +/* ========== Tooltips ========== */ +/* ========== Footer ========== */ +/* TEXTFIELD */ +/* SWITCH */ +/* SPINNER */ +/* RADIO */ +/* MENU */ +/* LIST */ +/* LAYOUT */ +/* ICON TOGGLE */ +/* FOOTER */ +/*mega-footer*/ +/*mini-footer*/ +/* CHECKBOX */ +/* CARD */ +/* Card dimensions */ +/* Cover image */ +/* BUTTON */ +/** + * + * Dimensions + * + */ +/* ANIMATION */ +/* PROGRESS */ +/* BADGE */ +/* SHADOWS */ +/* GRID */ +/* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ +/* TOOLTIP */ +/* CHIP */ .mdl-spinner { display: inline-block; position: relative; @@ -7929,6 +9268,10 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { height: 100%; overflow: hidden; border-color: inherit; } + .mdl-spinner__circle-clipper.mdl-spinner__left { + float: left; } + .mdl-spinner__circle-clipper.mdl-spinner__right { + float: right; } .mdl-spinner__circle-clipper .mdl-spinner__circle { width: 200%; } @@ -7950,7 +9293,6 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { .mdl-spinner__left .mdl-spinner__circle { border-right-color: transparent !important; -webkit-transform: rotate(129deg); - -ms-transform: rotate(129deg); transform: rotate(129deg); } .mdl-spinner.is-active .mdl-spinner__left .mdl-spinner__circle { -webkit-animation: mdl-spinner__left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; @@ -7959,7 +9301,6 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { left: -100%; border-left-color: transparent !important; -webkit-transform: rotate(-129deg); - -ms-transform: rotate(-129deg); transform: rotate(-129deg); } .mdl-spinner.is-active .mdl-spinner__right .mdl-spinner__circle { -webkit-animation: mdl-spinner__right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; @@ -8064,6 +9405,15 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -8115,6 +9465,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -8163,7 +9514,10 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ /** * Copyright 2015 Google Inc. All Rights Reserved. * @@ -8182,6 +9536,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { /* Typography */ /* Shadows */ /* Animations */ +/* Dialog */ .mdl-switch { position: relative; z-index: 1; @@ -8227,6 +9582,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { cursor: pointer; } .mdl-switch.is-checked .mdl-switch__track { background: rgba(63,81,181, 0.5); } + .mdl-switch__track fieldset[disabled] .mdl-switch, .mdl-switch.is-disabled .mdl-switch__track { background: rgba(0,0,0, 0.12); cursor: auto; } @@ -8241,16 +9597,14 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { border-radius: 50%; cursor: pointer; box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12); - -webkit-transition-duration: 0.28s; - transition-duration: 0.28s; - -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - -webkit-transition-property: left; - transition-property: left; } + transition-duration: 0.28s; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-property: left; } .mdl-switch.is-checked .mdl-switch__thumb { background: rgb(63,81,181); left: 16px; box-shadow: 0 3px 4px 0 rgba(0, 0, 0, 0.14), 0 3px 3px -2px rgba(0, 0, 0, 0.2), 0 1px 8px 0 rgba(0, 0, 0, 0.12); } + .mdl-switch__thumb fieldset[disabled] .mdl-switch, .mdl-switch.is-disabled .mdl-switch__thumb { background: rgb(189,189,189); cursor: auto; } @@ -8260,7 +9614,6 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { top: 50%; left: 50%; -webkit-transform: translate(-4px, -4px); - -ms-transform: translate(-4px, -4px); transform: translate(-4px, -4px); display: inline-block; box-sizing: border-box; @@ -8282,6 +9635,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { line-height: 24px; margin: 0; left: 24px; } + .mdl-switch__label fieldset[disabled] .mdl-switch, .mdl-switch.is-disabled .mdl-switch__label { color: rgb(189,189,189); cursor: auto; } @@ -8298,20 +9652,18 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { cursor: pointer; overflow: hidden; -webkit-mask-image: -webkit-radial-gradient(circle, white, black); - -webkit-transition-duration: 0.40s; - transition-duration: 0.40s; - -webkit-transition-timing-function: step-end; - transition-timing-function: step-end; - -webkit-transition-property: left; - transition-property: left; } + transition-duration: 0.40s; + transition-timing-function: step-end; + transition-property: left; } .mdl-switch__ripple-container .mdl-ripple { background: rgb(63,81,181); } + .mdl-switch__ripple-container fieldset[disabled] .mdl-switch, .mdl-switch.is-disabled .mdl-switch__ripple-container { cursor: auto; } + fieldset[disabled] .mdl-switch .mdl-switch__ripple-container .mdl-ripple, .mdl-switch.is-disabled .mdl-switch__ripple-container .mdl-ripple { background: transparent; } .mdl-switch.is-checked .mdl-switch__ripple-container { - cursor: auto; left: 2px; } /** @@ -8369,6 +9721,15 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -8420,6 +9781,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -8468,29 +9830,27 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ .mdl-tabs { display: block; width: 100%; } .mdl-tabs__tab-bar { - display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; -webkit-flex-direction: row; -ms-flex-direction: row; flex-direction: row; - -webkit-box-pack: center; -webkit-justify-content: center; -ms-flex-pack: center; justify-content: center; -webkit-align-content: space-between; -ms-flex-line-pack: justify; align-content: space-between; - -webkit-box-align: start; -webkit-align-items: flex-start; -ms-flex-align: start; align-items: flex-start; @@ -8506,7 +9866,6 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { float: left; position: relative; display: block; - color: red; text-decoration: none; height: 48px; line-height: 48px; @@ -8529,8 +9888,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { background: rgb(63,81,181); -webkit-animation: border-expand 0.2s cubic-bezier(0.4, 0, 0.4, 1) 0.01s alternate forwards; animation: border-expand 0.2s cubic-bezier(0.4, 0, 0.4, 1) 0.01s alternate forwards; - -webkit-transition: all 1s cubic-bezier(0.4, 0, 1, 1); - transition: all 1s cubic-bezier(0.4, 0, 1, 1); } + transition: all 1s cubic-bezier(0.4, 0, 1, 1); } .mdl-tabs__tab .mdl-tabs__ripple-container { display: block; position: absolute; @@ -8621,6 +9979,15 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -8672,6 +10039,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -8720,7 +10088,10 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ /** * Copyright 2015 Google Inc. All Rights Reserved. * @@ -8739,6 +10110,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { /* Typography */ /* Shadows */ /* Animations */ +/* Dialog */ .mdl-textfield { position: relative; font-size: 16px; @@ -8762,22 +10134,32 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { min-width: 32px; width: auto; min-height: 32px; } + .mdl-textfield--expandable .mdl-button--icon { + top: 16px; } .mdl-textfield__input { border: none; border-bottom: 1px solid rgba(0,0,0, 0.12); display: block; font-size: 16px; + font-family: "Helvetica", "Arial", sans-serif; margin: 0; padding: 4px 0; width: 100%; + background: none; text-align: left; color: inherit; } + .mdl-textfield__input[type="number"] { + -moz-appearance: textfield; } + .mdl-textfield__input[type="number"]::-webkit-inner-spin-button, .mdl-textfield__input[type="number"]::-webkit-outer-spin-button { + -webkit-appearance: none; + margin: 0; } .mdl-textfield.is-focused .mdl-textfield__input { outline: none; } .mdl-textfield.is-invalid .mdl-textfield__input { - border-color: rgb(222, 50, 38); + border-color: rgb(213,0,0); box-shadow: none; } + fieldset[disabled] .mdl-textfield .mdl-textfield__input, .mdl-textfield.is-disabled .mdl-textfield__input { background-color: transparent; border-bottom: 1px dotted rgba(0,0,0, 0.12); @@ -8800,26 +10182,30 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { overflow: hidden; white-space: nowrap; text-align: left; } - .mdl-textfield.is-dirty .mdl-textfield__label { + .mdl-textfield.is-dirty .mdl-textfield__label, + .mdl-textfield.has-placeholder .mdl-textfield__label { visibility: hidden; } .mdl-textfield--floating-label .mdl-textfield__label { - -webkit-transition-duration: 0.2s; - transition-duration: 0.2s; - -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); } + transition-duration: 0.2s; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); } + .mdl-textfield--floating-label.has-placeholder .mdl-textfield__label { + transition: none; } + fieldset[disabled] .mdl-textfield .mdl-textfield__label, .mdl-textfield.is-disabled.is-disabled .mdl-textfield__label { color: rgba(0,0,0, 0.26); } .mdl-textfield--floating-label.is-focused .mdl-textfield__label, - .mdl-textfield--floating-label.is-dirty .mdl-textfield__label { + .mdl-textfield--floating-label.is-dirty .mdl-textfield__label, + .mdl-textfield--floating-label.has-placeholder .mdl-textfield__label { color: rgb(63,81,181); font-size: 12px; top: 4px; visibility: visible; } .mdl-textfield--floating-label.is-focused .mdl-textfield__expandable-holder .mdl-textfield__label, - .mdl-textfield--floating-label.is-dirty .mdl-textfield__expandable-holder .mdl-textfield__label { + .mdl-textfield--floating-label.is-dirty .mdl-textfield__expandable-holder .mdl-textfield__label, + .mdl-textfield--floating-label.has-placeholder .mdl-textfield__expandable-holder .mdl-textfield__label { top: -16px; } .mdl-textfield--floating-label.is-invalid .mdl-textfield__label { - color: rgb(222, 50, 38); + color: rgb(213,0,0); font-size: 12px; } .mdl-textfield__label:after { background-color: rgb(63,81,181); @@ -8828,10 +10214,8 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { height: 2px; left: 45%; position: absolute; - -webkit-transition-duration: 0.2s; - transition-duration: 0.2s; - -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 0.2s; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); visibility: hidden; width: 10px; } .mdl-textfield.is-focused .mdl-textfield__label:after { @@ -8839,10 +10223,10 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { visibility: visible; width: 100%; } .mdl-textfield.is-invalid .mdl-textfield__label:after { - background-color: rgb(222, 50, 38); } + background-color: rgb(213,0,0); } .mdl-textfield__error { - color: rgb(222, 50, 38); + color: rgb(213,0,0); position: absolute; font-size: 12px; margin-top: 3px; @@ -8855,10 +10239,8 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { display: inline-block; position: relative; margin-left: 32px; - -webkit-transition-duration: 0.2s; - transition-duration: 0.2s; - -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 0.2s; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); display: inline-block; max-width: 0.1px; } .mdl-textfield.is-focused .mdl-textfield__expandable-holder, .mdl-textfield.is-dirty .mdl-textfield__expandable-holder { @@ -8921,6 +10303,15 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -8972,6 +10363,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -9020,15 +10412,15 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ .mdl-tooltip { -webkit-transform: scale(0); - -ms-transform: scale(0); transform: scale(0); -webkit-transform-origin: top center; - -ms-transform-origin: top center; transform-origin: top center; - will-change: transform; z-index: 999; background: rgba(97,97,97, 0.9); border-radius: 2px; @@ -9136,6 +10528,15 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -9187,6 +10588,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -9235,7 +10637,10 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ /** * Copyright 2015 Google Inc. All Rights Reserved. * @@ -9254,6 +10659,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { /* Typography */ /* Shadows */ /* Animations */ +/* Dialog */ .mdl-shadow--2dp { box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12); } @@ -9272,6 +10678,9 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { .mdl-shadow--16dp { box-shadow: 0 16px 24px 2px rgba(0, 0, 0, 0.14), 0 6px 30px 5px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 0, 0, 0.2); } +.mdl-shadow--24dp { + box-shadow: 0 9px 46px 8px rgba(0, 0, 0, 0.14), 0 11px 15px -7px rgba(0, 0, 0, 0.12), 0 24px 38px 3px rgba(0, 0, 0, 0.2); } + /** * Copyright 2015 Google Inc. All Rights Reserved. * @@ -9332,6 +10741,15 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -9383,6 +10801,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -9431,9 +10850,11 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ .mdl-grid { - display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; @@ -9441,7 +10862,6 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { -ms-flex-flow: row wrap; flex-flow: row wrap; margin: 0 auto 0 auto; - -webkit-box-align: stretch; -webkit-align-items: stretch; -ms-flex-align: stretch; align-items: stretch; } @@ -9459,6 +10879,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { .mdl-cell--middle { -webkit-align-self: center; -ms-flex-item-align: center; + -ms-grid-row-align: center; align-self: center; } .mdl-cell--bottom { @@ -9469,11 +10890,72 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { .mdl-cell--stretch { -webkit-align-self: stretch; -ms-flex-item-align: stretch; + -ms-grid-row-align: stretch; align-self: stretch; } .mdl-grid.mdl-grid--no-spacing > .mdl-cell { margin: 0; } +.mdl-cell--order-1 { + -webkit-order: 1; + -ms-flex-order: 1; + order: 1; } + +.mdl-cell--order-2 { + -webkit-order: 2; + -ms-flex-order: 2; + order: 2; } + +.mdl-cell--order-3 { + -webkit-order: 3; + -ms-flex-order: 3; + order: 3; } + +.mdl-cell--order-4 { + -webkit-order: 4; + -ms-flex-order: 4; + order: 4; } + +.mdl-cell--order-5 { + -webkit-order: 5; + -ms-flex-order: 5; + order: 5; } + +.mdl-cell--order-6 { + -webkit-order: 6; + -ms-flex-order: 6; + order: 6; } + +.mdl-cell--order-7 { + -webkit-order: 7; + -ms-flex-order: 7; + order: 7; } + +.mdl-cell--order-8 { + -webkit-order: 8; + -ms-flex-order: 8; + order: 8; } + +.mdl-cell--order-9 { + -webkit-order: 9; + -ms-flex-order: 9; + order: 9; } + +.mdl-cell--order-10 { + -webkit-order: 10; + -ms-flex-order: 10; + order: 10; } + +.mdl-cell--order-11 { + -webkit-order: 11; + -ms-flex-order: 11; + order: 11; } + +.mdl-cell--order-12 { + -webkit-order: 12; + -ms-flex-order: 12; + order: 12; } + @media (max-width: 479px) { .mdl-grid { padding: 8px; } @@ -9484,78 +10966,144 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { width: 100%; } .mdl-cell--hide-phone { display: none !important; } + .mdl-cell--order-1-phone.mdl-cell--order-1-phone { + -webkit-order: 1; + -ms-flex-order: 1; + order: 1; } + .mdl-cell--order-2-phone.mdl-cell--order-2-phone { + -webkit-order: 2; + -ms-flex-order: 2; + order: 2; } + .mdl-cell--order-3-phone.mdl-cell--order-3-phone { + -webkit-order: 3; + -ms-flex-order: 3; + order: 3; } + .mdl-cell--order-4-phone.mdl-cell--order-4-phone { + -webkit-order: 4; + -ms-flex-order: 4; + order: 4; } + .mdl-cell--order-5-phone.mdl-cell--order-5-phone { + -webkit-order: 5; + -ms-flex-order: 5; + order: 5; } + .mdl-cell--order-6-phone.mdl-cell--order-6-phone { + -webkit-order: 6; + -ms-flex-order: 6; + order: 6; } + .mdl-cell--order-7-phone.mdl-cell--order-7-phone { + -webkit-order: 7; + -ms-flex-order: 7; + order: 7; } + .mdl-cell--order-8-phone.mdl-cell--order-8-phone { + -webkit-order: 8; + -ms-flex-order: 8; + order: 8; } + .mdl-cell--order-9-phone.mdl-cell--order-9-phone { + -webkit-order: 9; + -ms-flex-order: 9; + order: 9; } + .mdl-cell--order-10-phone.mdl-cell--order-10-phone { + -webkit-order: 10; + -ms-flex-order: 10; + order: 10; } + .mdl-cell--order-11-phone.mdl-cell--order-11-phone { + -webkit-order: 11; + -ms-flex-order: 11; + order: 11; } + .mdl-cell--order-12-phone.mdl-cell--order-12-phone { + -webkit-order: 12; + -ms-flex-order: 12; + order: 12; } .mdl-cell--1-col, .mdl-cell--1-col-phone.mdl-cell--1-col-phone { width: calc(25% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--1-col, - .mdl-grid--no-spacing > .mdl-cell--1-col-phone.mdl-cell--1-col-phone { + .mdl-grid--no-spacing > .mdl-cell--1-col, .mdl-grid--no-spacing > + .mdl-cell--1-col-phone.mdl-cell--1-col-phone { width: 25%; } .mdl-cell--2-col, .mdl-cell--2-col-phone.mdl-cell--2-col-phone { width: calc(50% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--2-col, - .mdl-grid--no-spacing > .mdl-cell--2-col-phone.mdl-cell--2-col-phone { + .mdl-grid--no-spacing > .mdl-cell--2-col, .mdl-grid--no-spacing > + .mdl-cell--2-col-phone.mdl-cell--2-col-phone { width: 50%; } .mdl-cell--3-col, .mdl-cell--3-col-phone.mdl-cell--3-col-phone { width: calc(75% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--3-col, - .mdl-grid--no-spacing > .mdl-cell--3-col-phone.mdl-cell--3-col-phone { + .mdl-grid--no-spacing > .mdl-cell--3-col, .mdl-grid--no-spacing > + .mdl-cell--3-col-phone.mdl-cell--3-col-phone { width: 75%; } .mdl-cell--4-col, .mdl-cell--4-col-phone.mdl-cell--4-col-phone { width: calc(100% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--4-col, - .mdl-grid--no-spacing > .mdl-cell--4-col-phone.mdl-cell--4-col-phone { + .mdl-grid--no-spacing > .mdl-cell--4-col, .mdl-grid--no-spacing > + .mdl-cell--4-col-phone.mdl-cell--4-col-phone { width: 100%; } .mdl-cell--5-col, .mdl-cell--5-col-phone.mdl-cell--5-col-phone { width: calc(100% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--5-col, - .mdl-grid--no-spacing > .mdl-cell--5-col-phone.mdl-cell--5-col-phone { + .mdl-grid--no-spacing > .mdl-cell--5-col, .mdl-grid--no-spacing > + .mdl-cell--5-col-phone.mdl-cell--5-col-phone { width: 100%; } .mdl-cell--6-col, .mdl-cell--6-col-phone.mdl-cell--6-col-phone { width: calc(100% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--6-col, - .mdl-grid--no-spacing > .mdl-cell--6-col-phone.mdl-cell--6-col-phone { + .mdl-grid--no-spacing > .mdl-cell--6-col, .mdl-grid--no-spacing > + .mdl-cell--6-col-phone.mdl-cell--6-col-phone { width: 100%; } .mdl-cell--7-col, .mdl-cell--7-col-phone.mdl-cell--7-col-phone { width: calc(100% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--7-col, - .mdl-grid--no-spacing > .mdl-cell--7-col-phone.mdl-cell--7-col-phone { + .mdl-grid--no-spacing > .mdl-cell--7-col, .mdl-grid--no-spacing > + .mdl-cell--7-col-phone.mdl-cell--7-col-phone { width: 100%; } .mdl-cell--8-col, .mdl-cell--8-col-phone.mdl-cell--8-col-phone { width: calc(100% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--8-col, - .mdl-grid--no-spacing > .mdl-cell--8-col-phone.mdl-cell--8-col-phone { + .mdl-grid--no-spacing > .mdl-cell--8-col, .mdl-grid--no-spacing > + .mdl-cell--8-col-phone.mdl-cell--8-col-phone { width: 100%; } .mdl-cell--9-col, .mdl-cell--9-col-phone.mdl-cell--9-col-phone { width: calc(100% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--9-col, - .mdl-grid--no-spacing > .mdl-cell--9-col-phone.mdl-cell--9-col-phone { + .mdl-grid--no-spacing > .mdl-cell--9-col, .mdl-grid--no-spacing > + .mdl-cell--9-col-phone.mdl-cell--9-col-phone { width: 100%; } .mdl-cell--10-col, .mdl-cell--10-col-phone.mdl-cell--10-col-phone { width: calc(100% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--10-col, - .mdl-grid--no-spacing > .mdl-cell--10-col-phone.mdl-cell--10-col-phone { + .mdl-grid--no-spacing > .mdl-cell--10-col, .mdl-grid--no-spacing > + .mdl-cell--10-col-phone.mdl-cell--10-col-phone { width: 100%; } .mdl-cell--11-col, .mdl-cell--11-col-phone.mdl-cell--11-col-phone { width: calc(100% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--11-col, - .mdl-grid--no-spacing > .mdl-cell--11-col-phone.mdl-cell--11-col-phone { + .mdl-grid--no-spacing > .mdl-cell--11-col, .mdl-grid--no-spacing > + .mdl-cell--11-col-phone.mdl-cell--11-col-phone { width: 100%; } .mdl-cell--12-col, .mdl-cell--12-col-phone.mdl-cell--12-col-phone { width: calc(100% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--12-col, - .mdl-grid--no-spacing > .mdl-cell--12-col-phone.mdl-cell--12-col-phone { - width: 100%; } } + .mdl-grid--no-spacing > .mdl-cell--12-col, .mdl-grid--no-spacing > + .mdl-cell--12-col-phone.mdl-cell--12-col-phone { + width: 100%; } + .mdl-cell--1-offset, + .mdl-cell--1-offset-phone.mdl-cell--1-offset-phone { + margin-left: calc(25% + 8px); } + .mdl-grid.mdl-grid--no-spacing > .mdl-cell--1-offset, .mdl-grid.mdl-grid--no-spacing > + .mdl-cell--1-offset-phone.mdl-cell--1-offset-phone { + margin-left: 25%; } + .mdl-cell--2-offset, + .mdl-cell--2-offset-phone.mdl-cell--2-offset-phone { + margin-left: calc(50% + 8px); } + .mdl-grid.mdl-grid--no-spacing > .mdl-cell--2-offset, .mdl-grid.mdl-grid--no-spacing > + .mdl-cell--2-offset-phone.mdl-cell--2-offset-phone { + margin-left: 50%; } + .mdl-cell--3-offset, + .mdl-cell--3-offset-phone.mdl-cell--3-offset-phone { + margin-left: calc(75% + 8px); } + .mdl-grid.mdl-grid--no-spacing > .mdl-cell--3-offset, .mdl-grid.mdl-grid--no-spacing > + .mdl-cell--3-offset-phone.mdl-cell--3-offset-phone { + margin-left: 75%; } } @media (min-width: 480px) and (max-width: 839px) { .mdl-grid { @@ -9567,78 +11115,168 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { width: 50%; } .mdl-cell--hide-tablet { display: none !important; } + .mdl-cell--order-1-tablet.mdl-cell--order-1-tablet { + -webkit-order: 1; + -ms-flex-order: 1; + order: 1; } + .mdl-cell--order-2-tablet.mdl-cell--order-2-tablet { + -webkit-order: 2; + -ms-flex-order: 2; + order: 2; } + .mdl-cell--order-3-tablet.mdl-cell--order-3-tablet { + -webkit-order: 3; + -ms-flex-order: 3; + order: 3; } + .mdl-cell--order-4-tablet.mdl-cell--order-4-tablet { + -webkit-order: 4; + -ms-flex-order: 4; + order: 4; } + .mdl-cell--order-5-tablet.mdl-cell--order-5-tablet { + -webkit-order: 5; + -ms-flex-order: 5; + order: 5; } + .mdl-cell--order-6-tablet.mdl-cell--order-6-tablet { + -webkit-order: 6; + -ms-flex-order: 6; + order: 6; } + .mdl-cell--order-7-tablet.mdl-cell--order-7-tablet { + -webkit-order: 7; + -ms-flex-order: 7; + order: 7; } + .mdl-cell--order-8-tablet.mdl-cell--order-8-tablet { + -webkit-order: 8; + -ms-flex-order: 8; + order: 8; } + .mdl-cell--order-9-tablet.mdl-cell--order-9-tablet { + -webkit-order: 9; + -ms-flex-order: 9; + order: 9; } + .mdl-cell--order-10-tablet.mdl-cell--order-10-tablet { + -webkit-order: 10; + -ms-flex-order: 10; + order: 10; } + .mdl-cell--order-11-tablet.mdl-cell--order-11-tablet { + -webkit-order: 11; + -ms-flex-order: 11; + order: 11; } + .mdl-cell--order-12-tablet.mdl-cell--order-12-tablet { + -webkit-order: 12; + -ms-flex-order: 12; + order: 12; } .mdl-cell--1-col, .mdl-cell--1-col-tablet.mdl-cell--1-col-tablet { width: calc(12.5% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--1-col, - .mdl-grid--no-spacing > .mdl-cell--1-col-tablet.mdl-cell--1-col-tablet { + .mdl-grid--no-spacing > .mdl-cell--1-col, .mdl-grid--no-spacing > + .mdl-cell--1-col-tablet.mdl-cell--1-col-tablet { width: 12.5%; } .mdl-cell--2-col, .mdl-cell--2-col-tablet.mdl-cell--2-col-tablet { width: calc(25% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--2-col, - .mdl-grid--no-spacing > .mdl-cell--2-col-tablet.mdl-cell--2-col-tablet { + .mdl-grid--no-spacing > .mdl-cell--2-col, .mdl-grid--no-spacing > + .mdl-cell--2-col-tablet.mdl-cell--2-col-tablet { width: 25%; } .mdl-cell--3-col, .mdl-cell--3-col-tablet.mdl-cell--3-col-tablet { width: calc(37.5% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--3-col, - .mdl-grid--no-spacing > .mdl-cell--3-col-tablet.mdl-cell--3-col-tablet { + .mdl-grid--no-spacing > .mdl-cell--3-col, .mdl-grid--no-spacing > + .mdl-cell--3-col-tablet.mdl-cell--3-col-tablet { width: 37.5%; } .mdl-cell--4-col, .mdl-cell--4-col-tablet.mdl-cell--4-col-tablet { width: calc(50% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--4-col, - .mdl-grid--no-spacing > .mdl-cell--4-col-tablet.mdl-cell--4-col-tablet { + .mdl-grid--no-spacing > .mdl-cell--4-col, .mdl-grid--no-spacing > + .mdl-cell--4-col-tablet.mdl-cell--4-col-tablet { width: 50%; } .mdl-cell--5-col, .mdl-cell--5-col-tablet.mdl-cell--5-col-tablet { width: calc(62.5% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--5-col, - .mdl-grid--no-spacing > .mdl-cell--5-col-tablet.mdl-cell--5-col-tablet { + .mdl-grid--no-spacing > .mdl-cell--5-col, .mdl-grid--no-spacing > + .mdl-cell--5-col-tablet.mdl-cell--5-col-tablet { width: 62.5%; } .mdl-cell--6-col, .mdl-cell--6-col-tablet.mdl-cell--6-col-tablet { width: calc(75% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--6-col, - .mdl-grid--no-spacing > .mdl-cell--6-col-tablet.mdl-cell--6-col-tablet { + .mdl-grid--no-spacing > .mdl-cell--6-col, .mdl-grid--no-spacing > + .mdl-cell--6-col-tablet.mdl-cell--6-col-tablet { width: 75%; } .mdl-cell--7-col, .mdl-cell--7-col-tablet.mdl-cell--7-col-tablet { width: calc(87.5% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--7-col, - .mdl-grid--no-spacing > .mdl-cell--7-col-tablet.mdl-cell--7-col-tablet { + .mdl-grid--no-spacing > .mdl-cell--7-col, .mdl-grid--no-spacing > + .mdl-cell--7-col-tablet.mdl-cell--7-col-tablet { width: 87.5%; } .mdl-cell--8-col, .mdl-cell--8-col-tablet.mdl-cell--8-col-tablet { width: calc(100% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--8-col, - .mdl-grid--no-spacing > .mdl-cell--8-col-tablet.mdl-cell--8-col-tablet { + .mdl-grid--no-spacing > .mdl-cell--8-col, .mdl-grid--no-spacing > + .mdl-cell--8-col-tablet.mdl-cell--8-col-tablet { width: 100%; } .mdl-cell--9-col, .mdl-cell--9-col-tablet.mdl-cell--9-col-tablet { width: calc(100% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--9-col, - .mdl-grid--no-spacing > .mdl-cell--9-col-tablet.mdl-cell--9-col-tablet { + .mdl-grid--no-spacing > .mdl-cell--9-col, .mdl-grid--no-spacing > + .mdl-cell--9-col-tablet.mdl-cell--9-col-tablet { width: 100%; } .mdl-cell--10-col, .mdl-cell--10-col-tablet.mdl-cell--10-col-tablet { width: calc(100% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--10-col, - .mdl-grid--no-spacing > .mdl-cell--10-col-tablet.mdl-cell--10-col-tablet { + .mdl-grid--no-spacing > .mdl-cell--10-col, .mdl-grid--no-spacing > + .mdl-cell--10-col-tablet.mdl-cell--10-col-tablet { width: 100%; } .mdl-cell--11-col, .mdl-cell--11-col-tablet.mdl-cell--11-col-tablet { width: calc(100% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--11-col, - .mdl-grid--no-spacing > .mdl-cell--11-col-tablet.mdl-cell--11-col-tablet { + .mdl-grid--no-spacing > .mdl-cell--11-col, .mdl-grid--no-spacing > + .mdl-cell--11-col-tablet.mdl-cell--11-col-tablet { width: 100%; } .mdl-cell--12-col, .mdl-cell--12-col-tablet.mdl-cell--12-col-tablet { width: calc(100% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--12-col, - .mdl-grid--no-spacing > .mdl-cell--12-col-tablet.mdl-cell--12-col-tablet { - width: 100%; } } + .mdl-grid--no-spacing > .mdl-cell--12-col, .mdl-grid--no-spacing > + .mdl-cell--12-col-tablet.mdl-cell--12-col-tablet { + width: 100%; } + .mdl-cell--1-offset, + .mdl-cell--1-offset-tablet.mdl-cell--1-offset-tablet { + margin-left: calc(12.5% + 8px); } + .mdl-grid.mdl-grid--no-spacing > .mdl-cell--1-offset, .mdl-grid.mdl-grid--no-spacing > + .mdl-cell--1-offset-tablet.mdl-cell--1-offset-tablet { + margin-left: 12.5%; } + .mdl-cell--2-offset, + .mdl-cell--2-offset-tablet.mdl-cell--2-offset-tablet { + margin-left: calc(25% + 8px); } + .mdl-grid.mdl-grid--no-spacing > .mdl-cell--2-offset, .mdl-grid.mdl-grid--no-spacing > + .mdl-cell--2-offset-tablet.mdl-cell--2-offset-tablet { + margin-left: 25%; } + .mdl-cell--3-offset, + .mdl-cell--3-offset-tablet.mdl-cell--3-offset-tablet { + margin-left: calc(37.5% + 8px); } + .mdl-grid.mdl-grid--no-spacing > .mdl-cell--3-offset, .mdl-grid.mdl-grid--no-spacing > + .mdl-cell--3-offset-tablet.mdl-cell--3-offset-tablet { + margin-left: 37.5%; } + .mdl-cell--4-offset, + .mdl-cell--4-offset-tablet.mdl-cell--4-offset-tablet { + margin-left: calc(50% + 8px); } + .mdl-grid.mdl-grid--no-spacing > .mdl-cell--4-offset, .mdl-grid.mdl-grid--no-spacing > + .mdl-cell--4-offset-tablet.mdl-cell--4-offset-tablet { + margin-left: 50%; } + .mdl-cell--5-offset, + .mdl-cell--5-offset-tablet.mdl-cell--5-offset-tablet { + margin-left: calc(62.5% + 8px); } + .mdl-grid.mdl-grid--no-spacing > .mdl-cell--5-offset, .mdl-grid.mdl-grid--no-spacing > + .mdl-cell--5-offset-tablet.mdl-cell--5-offset-tablet { + margin-left: 62.5%; } + .mdl-cell--6-offset, + .mdl-cell--6-offset-tablet.mdl-cell--6-offset-tablet { + margin-left: calc(75% + 8px); } + .mdl-grid.mdl-grid--no-spacing > .mdl-cell--6-offset, .mdl-grid.mdl-grid--no-spacing > + .mdl-cell--6-offset-tablet.mdl-cell--6-offset-tablet { + margin-left: 75%; } + .mdl-cell--7-offset, + .mdl-cell--7-offset-tablet.mdl-cell--7-offset-tablet { + margin-left: calc(87.5% + 8px); } + .mdl-grid.mdl-grid--no-spacing > .mdl-cell--7-offset, .mdl-grid.mdl-grid--no-spacing > + .mdl-cell--7-offset-tablet.mdl-cell--7-offset-tablet { + margin-left: 87.5%; } } @media (min-width: 840px) { .mdl-grid { @@ -9650,75 +11288,189 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { width: 33.3333333333%; } .mdl-cell--hide-desktop { display: none !important; } + .mdl-cell--order-1-desktop.mdl-cell--order-1-desktop { + -webkit-order: 1; + -ms-flex-order: 1; + order: 1; } + .mdl-cell--order-2-desktop.mdl-cell--order-2-desktop { + -webkit-order: 2; + -ms-flex-order: 2; + order: 2; } + .mdl-cell--order-3-desktop.mdl-cell--order-3-desktop { + -webkit-order: 3; + -ms-flex-order: 3; + order: 3; } + .mdl-cell--order-4-desktop.mdl-cell--order-4-desktop { + -webkit-order: 4; + -ms-flex-order: 4; + order: 4; } + .mdl-cell--order-5-desktop.mdl-cell--order-5-desktop { + -webkit-order: 5; + -ms-flex-order: 5; + order: 5; } + .mdl-cell--order-6-desktop.mdl-cell--order-6-desktop { + -webkit-order: 6; + -ms-flex-order: 6; + order: 6; } + .mdl-cell--order-7-desktop.mdl-cell--order-7-desktop { + -webkit-order: 7; + -ms-flex-order: 7; + order: 7; } + .mdl-cell--order-8-desktop.mdl-cell--order-8-desktop { + -webkit-order: 8; + -ms-flex-order: 8; + order: 8; } + .mdl-cell--order-9-desktop.mdl-cell--order-9-desktop { + -webkit-order: 9; + -ms-flex-order: 9; + order: 9; } + .mdl-cell--order-10-desktop.mdl-cell--order-10-desktop { + -webkit-order: 10; + -ms-flex-order: 10; + order: 10; } + .mdl-cell--order-11-desktop.mdl-cell--order-11-desktop { + -webkit-order: 11; + -ms-flex-order: 11; + order: 11; } + .mdl-cell--order-12-desktop.mdl-cell--order-12-desktop { + -webkit-order: 12; + -ms-flex-order: 12; + order: 12; } .mdl-cell--1-col, .mdl-cell--1-col-desktop.mdl-cell--1-col-desktop { width: calc(8.3333333333% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--1-col, - .mdl-grid--no-spacing > .mdl-cell--1-col-desktop.mdl-cell--1-col-desktop { + .mdl-grid--no-spacing > .mdl-cell--1-col, .mdl-grid--no-spacing > + .mdl-cell--1-col-desktop.mdl-cell--1-col-desktop { width: 8.3333333333%; } .mdl-cell--2-col, .mdl-cell--2-col-desktop.mdl-cell--2-col-desktop { width: calc(16.6666666667% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--2-col, - .mdl-grid--no-spacing > .mdl-cell--2-col-desktop.mdl-cell--2-col-desktop { + .mdl-grid--no-spacing > .mdl-cell--2-col, .mdl-grid--no-spacing > + .mdl-cell--2-col-desktop.mdl-cell--2-col-desktop { width: 16.6666666667%; } .mdl-cell--3-col, .mdl-cell--3-col-desktop.mdl-cell--3-col-desktop { width: calc(25% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--3-col, - .mdl-grid--no-spacing > .mdl-cell--3-col-desktop.mdl-cell--3-col-desktop { + .mdl-grid--no-spacing > .mdl-cell--3-col, .mdl-grid--no-spacing > + .mdl-cell--3-col-desktop.mdl-cell--3-col-desktop { width: 25%; } .mdl-cell--4-col, .mdl-cell--4-col-desktop.mdl-cell--4-col-desktop { width: calc(33.3333333333% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--4-col, - .mdl-grid--no-spacing > .mdl-cell--4-col-desktop.mdl-cell--4-col-desktop { + .mdl-grid--no-spacing > .mdl-cell--4-col, .mdl-grid--no-spacing > + .mdl-cell--4-col-desktop.mdl-cell--4-col-desktop { width: 33.3333333333%; } .mdl-cell--5-col, .mdl-cell--5-col-desktop.mdl-cell--5-col-desktop { width: calc(41.6666666667% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--5-col, - .mdl-grid--no-spacing > .mdl-cell--5-col-desktop.mdl-cell--5-col-desktop { + .mdl-grid--no-spacing > .mdl-cell--5-col, .mdl-grid--no-spacing > + .mdl-cell--5-col-desktop.mdl-cell--5-col-desktop { width: 41.6666666667%; } .mdl-cell--6-col, .mdl-cell--6-col-desktop.mdl-cell--6-col-desktop { width: calc(50% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--6-col, - .mdl-grid--no-spacing > .mdl-cell--6-col-desktop.mdl-cell--6-col-desktop { + .mdl-grid--no-spacing > .mdl-cell--6-col, .mdl-grid--no-spacing > + .mdl-cell--6-col-desktop.mdl-cell--6-col-desktop { width: 50%; } .mdl-cell--7-col, .mdl-cell--7-col-desktop.mdl-cell--7-col-desktop { width: calc(58.3333333333% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--7-col, - .mdl-grid--no-spacing > .mdl-cell--7-col-desktop.mdl-cell--7-col-desktop { + .mdl-grid--no-spacing > .mdl-cell--7-col, .mdl-grid--no-spacing > + .mdl-cell--7-col-desktop.mdl-cell--7-col-desktop { width: 58.3333333333%; } .mdl-cell--8-col, .mdl-cell--8-col-desktop.mdl-cell--8-col-desktop { width: calc(66.6666666667% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--8-col, - .mdl-grid--no-spacing > .mdl-cell--8-col-desktop.mdl-cell--8-col-desktop { + .mdl-grid--no-spacing > .mdl-cell--8-col, .mdl-grid--no-spacing > + .mdl-cell--8-col-desktop.mdl-cell--8-col-desktop { width: 66.6666666667%; } .mdl-cell--9-col, .mdl-cell--9-col-desktop.mdl-cell--9-col-desktop { width: calc(75% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--9-col, - .mdl-grid--no-spacing > .mdl-cell--9-col-desktop.mdl-cell--9-col-desktop { + .mdl-grid--no-spacing > .mdl-cell--9-col, .mdl-grid--no-spacing > + .mdl-cell--9-col-desktop.mdl-cell--9-col-desktop { width: 75%; } .mdl-cell--10-col, .mdl-cell--10-col-desktop.mdl-cell--10-col-desktop { width: calc(83.3333333333% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--10-col, - .mdl-grid--no-spacing > .mdl-cell--10-col-desktop.mdl-cell--10-col-desktop { + .mdl-grid--no-spacing > .mdl-cell--10-col, .mdl-grid--no-spacing > + .mdl-cell--10-col-desktop.mdl-cell--10-col-desktop { width: 83.3333333333%; } .mdl-cell--11-col, .mdl-cell--11-col-desktop.mdl-cell--11-col-desktop { width: calc(91.6666666667% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--11-col, - .mdl-grid--no-spacing > .mdl-cell--11-col-desktop.mdl-cell--11-col-desktop { + .mdl-grid--no-spacing > .mdl-cell--11-col, .mdl-grid--no-spacing > + .mdl-cell--11-col-desktop.mdl-cell--11-col-desktop { width: 91.6666666667%; } .mdl-cell--12-col, .mdl-cell--12-col-desktop.mdl-cell--12-col-desktop { width: calc(100% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--12-col, - .mdl-grid--no-spacing > .mdl-cell--12-col-desktop.mdl-cell--12-col-desktop { - width: 100%; } } + .mdl-grid--no-spacing > .mdl-cell--12-col, .mdl-grid--no-spacing > + .mdl-cell--12-col-desktop.mdl-cell--12-col-desktop { + width: 100%; } + .mdl-cell--1-offset, + .mdl-cell--1-offset-desktop.mdl-cell--1-offset-desktop { + margin-left: calc(8.3333333333% + 8px); } + .mdl-grid.mdl-grid--no-spacing > .mdl-cell--1-offset, .mdl-grid.mdl-grid--no-spacing > + .mdl-cell--1-offset-desktop.mdl-cell--1-offset-desktop { + margin-left: 8.3333333333%; } + .mdl-cell--2-offset, + .mdl-cell--2-offset-desktop.mdl-cell--2-offset-desktop { + margin-left: calc(16.6666666667% + 8px); } + .mdl-grid.mdl-grid--no-spacing > .mdl-cell--2-offset, .mdl-grid.mdl-grid--no-spacing > + .mdl-cell--2-offset-desktop.mdl-cell--2-offset-desktop { + margin-left: 16.6666666667%; } + .mdl-cell--3-offset, + .mdl-cell--3-offset-desktop.mdl-cell--3-offset-desktop { + margin-left: calc(25% + 8px); } + .mdl-grid.mdl-grid--no-spacing > .mdl-cell--3-offset, .mdl-grid.mdl-grid--no-spacing > + .mdl-cell--3-offset-desktop.mdl-cell--3-offset-desktop { + margin-left: 25%; } + .mdl-cell--4-offset, + .mdl-cell--4-offset-desktop.mdl-cell--4-offset-desktop { + margin-left: calc(33.3333333333% + 8px); } + .mdl-grid.mdl-grid--no-spacing > .mdl-cell--4-offset, .mdl-grid.mdl-grid--no-spacing > + .mdl-cell--4-offset-desktop.mdl-cell--4-offset-desktop { + margin-left: 33.3333333333%; } + .mdl-cell--5-offset, + .mdl-cell--5-offset-desktop.mdl-cell--5-offset-desktop { + margin-left: calc(41.6666666667% + 8px); } + .mdl-grid.mdl-grid--no-spacing > .mdl-cell--5-offset, .mdl-grid.mdl-grid--no-spacing > + .mdl-cell--5-offset-desktop.mdl-cell--5-offset-desktop { + margin-left: 41.6666666667%; } + .mdl-cell--6-offset, + .mdl-cell--6-offset-desktop.mdl-cell--6-offset-desktop { + margin-left: calc(50% + 8px); } + .mdl-grid.mdl-grid--no-spacing > .mdl-cell--6-offset, .mdl-grid.mdl-grid--no-spacing > + .mdl-cell--6-offset-desktop.mdl-cell--6-offset-desktop { + margin-left: 50%; } + .mdl-cell--7-offset, + .mdl-cell--7-offset-desktop.mdl-cell--7-offset-desktop { + margin-left: calc(58.3333333333% + 8px); } + .mdl-grid.mdl-grid--no-spacing > .mdl-cell--7-offset, .mdl-grid.mdl-grid--no-spacing > + .mdl-cell--7-offset-desktop.mdl-cell--7-offset-desktop { + margin-left: 58.3333333333%; } + .mdl-cell--8-offset, + .mdl-cell--8-offset-desktop.mdl-cell--8-offset-desktop { + margin-left: calc(66.6666666667% + 8px); } + .mdl-grid.mdl-grid--no-spacing > .mdl-cell--8-offset, .mdl-grid.mdl-grid--no-spacing > + .mdl-cell--8-offset-desktop.mdl-cell--8-offset-desktop { + margin-left: 66.6666666667%; } + .mdl-cell--9-offset, + .mdl-cell--9-offset-desktop.mdl-cell--9-offset-desktop { + margin-left: calc(75% + 8px); } + .mdl-grid.mdl-grid--no-spacing > .mdl-cell--9-offset, .mdl-grid.mdl-grid--no-spacing > + .mdl-cell--9-offset-desktop.mdl-cell--9-offset-desktop { + margin-left: 75%; } + .mdl-cell--10-offset, + .mdl-cell--10-offset-desktop.mdl-cell--10-offset-desktop { + margin-left: calc(83.3333333333% + 8px); } + .mdl-grid.mdl-grid--no-spacing > .mdl-cell--10-offset, .mdl-grid.mdl-grid--no-spacing > + .mdl-cell--10-offset-desktop.mdl-cell--10-offset-desktop { + margin-left: 83.3333333333%; } + .mdl-cell--11-offset, + .mdl-cell--11-offset-desktop.mdl-cell--11-offset-desktop { + margin-left: calc(91.6666666667% + 8px); } + .mdl-grid.mdl-grid--no-spacing > .mdl-cell--11-offset, .mdl-grid.mdl-grid--no-spacing > + .mdl-cell--11-offset-desktop.mdl-cell--11-offset-desktop { + margin-left: 91.6666666667%; } } diff --git a/public/vendor/mdl/mdl.min.css b/public/vendor/mdl/mdl.min.css deleted file mode 100644 index 3815742333..0000000000 --- a/public/vendor/mdl/mdl.min.css +++ /dev/null @@ -1 +0,0 @@ -@charset "UTF-8";.mdl-button,.mdl-button .material-icons,.mdl-checkbox,audio,canvas,iframe,img,svg,video{vertical-align:middle}.visuallyhidden,hr{border:0;height:1px}.mdl-typography--display-4,.mdl-typography--display-4-color-contrast{font-family:Roboto,Helvetica,Arial,sans-serif;font-size:112px;font-weight:300;line-height:1;letter-spacing:-.04em}.mdl-typography--display-3,.mdl-typography--display-4,.mdl-typography--display-4-color-contrast{font-family:Roboto,Helvetica,Arial,sans-serif}.mdl-card,.mdl-card__media,.mdl-card__title{box-sizing:border-box}.mdl-badge[data-badge]:after,.mdl-card,.mdl-layout,.mdl-layout__drawer,.mdl-layout__header{-webkit-box-direction:normal}::-moz-selection{background:#b3d4fc;text-shadow:none}::selection{background:#b3d4fc;text-shadow:none}hr{display:block;border-top:1px solid #ccc;margin:1em 0;padding:0}fieldset{border:0;margin:0;padding:0}textarea{resize:vertical}.browserupgrade{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.hidden{display:none!important}.visuallyhidden{clip:rect(0 0 0 0);margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}body,html{width:100%}.invisible{visibility:hidden}.clearfix:after,.clearfix:before{content:" ";display:table}.clearfix:after{clear:both}@media print{blockquote,img,pre,tr{page-break-inside:avoid}*,:after,:before,:first-letter,:first-line{background:0 0!important;color:#000!important;box-shadow:none!important;text-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{border:1px solid #999}thead{display:table-header-group}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}}.mdl-accordion,.mdl-button,.mdl-card,.mdl-checkbox,.mdl-dropdown-menu,.mdl-icon-toggle,.mdl-item,.mdl-radio,.mdl-slider,.mdl-switch,.mdl-tabs__tab,a{-webkit-tap-highlight-color:transparent;-webkit-tap-highlight-color:rgba(255,255,255,0)}html{height:100%;-ms-touch-action:manipulation;touch-action:manipulation}body{min-height:100%;margin:0}main{display:block}[hidden]{display:none!important}.mdl-typography--display-4-color-contrast{opacity:.54}.mdl-typography--display-3,.mdl-typography--display-3-color-contrast{font-size:56px;font-weight:400;line-height:1.35;letter-spacing:-.02em}.mdl-typography--display-3-color-contrast{font-family:Roboto,Helvetica,Arial,sans-serif;opacity:.54}.mdl-typography--display-2,.mdl-typography--display-2-color-contrast{font-weight:400;font-family:Roboto,Helvetica,Arial,sans-serif;font-size:45px;line-height:48px}.mdl-typography--display-2-color-contrast{opacity:.54}.mdl-typography--display-1{font-family:Roboto,Helvetica,Arial,sans-serif;font-size:34px;font-weight:400;line-height:40px}.mdl-typography--display-1-color-contrast{font-family:Roboto,Helvetica,Arial,sans-serif;font-size:34px;font-weight:400;line-height:40px;opacity:.54}.mdl-typography--headline,.mdl-typography--headline-color-contrast{font-family:Roboto,Helvetica,Arial,sans-serif;font-size:24px;font-weight:400;line-height:32px;-moz-osx-font-smoothing:grayscale}.mdl-typography--headline-color-contrast{opacity:.87}.mdl-typography--title,.mdl-typography--title-color-contrast{font-size:20px;font-weight:500;line-height:1;letter-spacing:.02em}.mdl-typography--title{font-family:Roboto,Helvetica,Arial,sans-serif}.mdl-typography--title-color-contrast{font-family:Roboto,Helvetica,Arial,sans-serif;opacity:.87}.mdl-typography--subhead,.mdl-typography--subhead-color-contrast{font-family:Roboto,Helvetica,Arial,sans-serif;line-height:24px;font-size:16px;font-weight:400;letter-spacing:.04em}.mdl-typography--subhead-color-contrast{opacity:.87}.mdl-typography--body-2{font-size:14px;font-weight:700;line-height:24px;letter-spacing:0}.mdl-typography--body-2-color-contrast{font-size:14px;font-weight:700;line-height:24px;letter-spacing:0;opacity:.87}.mdl-typography--body-1,.mdl-typography--body-1-color-contrast{line-height:24px;letter-spacing:0;font-size:14px;font-weight:400}.mdl-typography--body-1-color-contrast{opacity:.87}.mdl-typography--body-2-force-preferred-font{font-family:Roboto,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;line-height:24px;letter-spacing:0}.mdl-typography--body-2-force-preferred-font-color-contrast{font-family:Roboto,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;line-height:24px;letter-spacing:0;opacity:.87}.mdl-typography--body-1-force-preferred-font,.mdl-typography--body-1-force-preferred-font-color-contrast{font-family:Roboto,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;line-height:24px;letter-spacing:0}.mdl-typography--body-1-force-preferred-font-color-contrast{opacity:.87}.mdl-typography--caption,.mdl-typography--caption-color-contrast,.mdl-typography--caption-force-preferred-font,.mdl-typography--caption-force-preferred-font-color-contrast{font-size:12px;font-weight:400;line-height:1;letter-spacing:0}.mdl-typography--caption-force-preferred-font{font-family:Roboto,Helvetica,Arial,sans-serif}.mdl-typography--caption-color-contrast{opacity:.54}.mdl-typography--caption-force-preferred-font-color-contrast{font-family:Roboto,Helvetica,Arial,sans-serif;opacity:.54}.mdl-typography--button,.mdl-typography--button-color-contrast,.mdl-typography--menu,.mdl-typography--menu-color-contrast{font-family:Roboto,Helvetica,Arial,sans-serif;letter-spacing:0;font-weight:500;font-size:14px;line-height:1}.mdl-typography--menu-color-contrast{opacity:.87}.mdl-typography--button{text-transform:uppercase}.mdl-typography--button-color-contrast{text-transform:uppercase;opacity:.87}.mdl-typography--text-left{text-align:left}.mdl-typography--text-right{text-align:right}.mdl-typography--text-center{text-align:center}.mdl-typography--text-justify{text-align:justify}.mdl-typography--text-nowrap{white-space:nowrap}.mdl-typography--text-lowercase{text-transform:lowercase}.mdl-typography--text-uppercase{text-transform:uppercase}.mdl-typography--text-capitalize{text-transform:capitalize}.mdl-button,.mdl-layout__tab,.mdl-tabs__tab{text-decoration:none;text-transform:uppercase}.mdl-typography--font-thin{font-weight:200!important}.mdl-typography--font-light{font-weight:300!important}.mdl-typography--font-regular{font-weight:400!important}.mdl-typography--font-medium{font-weight:500!important}.mdl-typography--font-bold{font-weight:700!important}.mdl-typography--font-black{font-weight:900!important}.mdl-color-text--red{color:#f44336!important}.mdl-color--red{background-color:#f44336!important}.mdl-color-text--red-50{color:#ffebee!important}.mdl-color--red-50{background-color:#ffebee!important}.mdl-color-text--red-100{color:#ffcdd2!important}.mdl-color--red-100{background-color:#ffcdd2!important}.mdl-color-text--red-200{color:#ef9a9a!important}.mdl-color--red-200{background-color:#ef9a9a!important}.mdl-color-text--red-300{color:#e57373!important}.mdl-color--red-300{background-color:#e57373!important}.mdl-color-text--red-400{color:#ef5350!important}.mdl-color--red-400{background-color:#ef5350!important}.mdl-color-text--red-500{color:#f44336!important}.mdl-color--red-500{background-color:#f44336!important}.mdl-color-text--red-600{color:#e53935!important}.mdl-color--red-600{background-color:#e53935!important}.mdl-color-text--red-700{color:#d32f2f!important}.mdl-color--red-700{background-color:#d32f2f!important}.mdl-color-text--red-800{color:#c62828!important}.mdl-color--red-800{background-color:#c62828!important}.mdl-color-text--red-900{color:#b71c1c!important}.mdl-color--red-900{background-color:#b71c1c!important}.mdl-color-text--red-A100{color:#ff8a80!important}.mdl-color--red-A100{background-color:#ff8a80!important}.mdl-color-text--red-A200{color:#ff5252!important}.mdl-color--red-A200{background-color:#ff5252!important}.mdl-color-text--red-A400{color:#ff1744!important}.mdl-color--red-A400{background-color:#ff1744!important}.mdl-color-text--red-A700{color:#d50000!important}.mdl-color--red-A700{background-color:#d50000!important}.mdl-color-text--pink{color:#e91e63!important}.mdl-color--pink{background-color:#e91e63!important}.mdl-color-text--pink-50{color:#fce4ec!important}.mdl-color--pink-50{background-color:#fce4ec!important}.mdl-color-text--pink-100{color:#f8bbd0!important}.mdl-color--pink-100{background-color:#f8bbd0!important}.mdl-color-text--pink-200{color:#f48fb1!important}.mdl-color--pink-200{background-color:#f48fb1!important}.mdl-color-text--pink-300{color:#f06292!important}.mdl-color--pink-300{background-color:#f06292!important}.mdl-color-text--pink-400{color:#ec407a!important}.mdl-color--pink-400{background-color:#ec407a!important}.mdl-color-text--pink-500{color:#e91e63!important}.mdl-color--pink-500{background-color:#e91e63!important}.mdl-color-text--pink-600{color:#d81b60!important}.mdl-color--pink-600{background-color:#d81b60!important}.mdl-color-text--pink-700{color:#c2185b!important}.mdl-color--pink-700{background-color:#c2185b!important}.mdl-color-text--pink-800{color:#ad1457!important}.mdl-color--pink-800{background-color:#ad1457!important}.mdl-color-text--pink-900{color:#880e4f!important}.mdl-color--pink-900{background-color:#880e4f!important}.mdl-color-text--pink-A100{color:#ff80ab!important}.mdl-color--pink-A100{background-color:#ff80ab!important}.mdl-color-text--pink-A200{color:#ff4081!important}.mdl-color--pink-A200{background-color:#ff4081!important}.mdl-color-text--pink-A400{color:#f50057!important}.mdl-color--pink-A400{background-color:#f50057!important}.mdl-color-text--pink-A700{color:#c51162!important}.mdl-color--pink-A700{background-color:#c51162!important}.mdl-color-text--purple{color:#9c27b0!important}.mdl-color--purple{background-color:#9c27b0!important}.mdl-color-text--purple-50{color:#f3e5f5!important}.mdl-color--purple-50{background-color:#f3e5f5!important}.mdl-color-text--purple-100{color:#e1bee7!important}.mdl-color--purple-100{background-color:#e1bee7!important}.mdl-color-text--purple-200{color:#ce93d8!important}.mdl-color--purple-200{background-color:#ce93d8!important}.mdl-color-text--purple-300{color:#ba68c8!important}.mdl-color--purple-300{background-color:#ba68c8!important}.mdl-color-text--purple-400{color:#ab47bc!important}.mdl-color--purple-400{background-color:#ab47bc!important}.mdl-color-text--purple-500{color:#9c27b0!important}.mdl-color--purple-500{background-color:#9c27b0!important}.mdl-color-text--purple-600{color:#8e24aa!important}.mdl-color--purple-600{background-color:#8e24aa!important}.mdl-color-text--purple-700{color:#7b1fa2!important}.mdl-color--purple-700{background-color:#7b1fa2!important}.mdl-color-text--purple-800{color:#6a1b9a!important}.mdl-color--purple-800{background-color:#6a1b9a!important}.mdl-color-text--purple-900{color:#4a148c!important}.mdl-color--purple-900{background-color:#4a148c!important}.mdl-color-text--purple-A100{color:#ea80fc!important}.mdl-color--purple-A100{background-color:#ea80fc!important}.mdl-color-text--purple-A200{color:#e040fb!important}.mdl-color--purple-A200{background-color:#e040fb!important}.mdl-color-text--purple-A400{color:#d500f9!important}.mdl-color--purple-A400{background-color:#d500f9!important}.mdl-color-text--purple-A700{color:#a0f!important}.mdl-color--purple-A700{background-color:#a0f!important}.mdl-color-text--deep-purple{color:#673ab7!important}.mdl-color--deep-purple{background-color:#673ab7!important}.mdl-color-text--deep-purple-50{color:#ede7f6!important}.mdl-color--deep-purple-50{background-color:#ede7f6!important}.mdl-color-text--deep-purple-100{color:#d1c4e9!important}.mdl-color--deep-purple-100{background-color:#d1c4e9!important}.mdl-color-text--deep-purple-200{color:#b39ddb!important}.mdl-color--deep-purple-200{background-color:#b39ddb!important}.mdl-color-text--deep-purple-300{color:#9575cd!important}.mdl-color--deep-purple-300{background-color:#9575cd!important}.mdl-color-text--deep-purple-400{color:#7e57c2!important}.mdl-color--deep-purple-400{background-color:#7e57c2!important}.mdl-color-text--deep-purple-500{color:#673ab7!important}.mdl-color--deep-purple-500{background-color:#673ab7!important}.mdl-color-text--deep-purple-600{color:#5e35b1!important}.mdl-color--deep-purple-600{background-color:#5e35b1!important}.mdl-color-text--deep-purple-700{color:#512da8!important}.mdl-color--deep-purple-700{background-color:#512da8!important}.mdl-color-text--deep-purple-800{color:#4527a0!important}.mdl-color--deep-purple-800{background-color:#4527a0!important}.mdl-color-text--deep-purple-900{color:#311b92!important}.mdl-color--deep-purple-900{background-color:#311b92!important}.mdl-color-text--deep-purple-A100{color:#b388ff!important}.mdl-color--deep-purple-A100{background-color:#b388ff!important}.mdl-color-text--deep-purple-A200{color:#7c4dff!important}.mdl-color--deep-purple-A200{background-color:#7c4dff!important}.mdl-color-text--deep-purple-A400{color:#651fff!important}.mdl-color--deep-purple-A400{background-color:#651fff!important}.mdl-color-text--deep-purple-A700{color:#6200ea!important}.mdl-color--deep-purple-A700{background-color:#6200ea!important}.mdl-color-text--indigo{color:#3f51b5!important}.mdl-color--indigo{background-color:#3f51b5!important}.mdl-color-text--indigo-50{color:#e8eaf6!important}.mdl-color--indigo-50{background-color:#e8eaf6!important}.mdl-color-text--indigo-100{color:#c5cae9!important}.mdl-color--indigo-100{background-color:#c5cae9!important}.mdl-color-text--indigo-200{color:#9fa8da!important}.mdl-color--indigo-200{background-color:#9fa8da!important}.mdl-color-text--indigo-300{color:#7986cb!important}.mdl-color--indigo-300{background-color:#7986cb!important}.mdl-color-text--indigo-400{color:#5c6bc0!important}.mdl-color--indigo-400{background-color:#5c6bc0!important}.mdl-color-text--indigo-500{color:#3f51b5!important}.mdl-color--indigo-500{background-color:#3f51b5!important}.mdl-color-text--indigo-600{color:#3949ab!important}.mdl-color--indigo-600{background-color:#3949ab!important}.mdl-color-text--indigo-700{color:#303f9f!important}.mdl-color--indigo-700{background-color:#303f9f!important}.mdl-color-text--indigo-800{color:#283593!important}.mdl-color--indigo-800{background-color:#283593!important}.mdl-color-text--indigo-900{color:#1a237e!important}.mdl-color--indigo-900{background-color:#1a237e!important}.mdl-color-text--indigo-A100{color:#8c9eff!important}.mdl-color--indigo-A100{background-color:#8c9eff!important}.mdl-color-text--indigo-A200{color:#536dfe!important}.mdl-color--indigo-A200{background-color:#536dfe!important}.mdl-color-text--indigo-A400{color:#3d5afe!important}.mdl-color--indigo-A400{background-color:#3d5afe!important}.mdl-color-text--indigo-A700{color:#304ffe!important}.mdl-color--indigo-A700{background-color:#304ffe!important}.mdl-color-text--blue{color:#2196f3!important}.mdl-color--blue{background-color:#2196f3!important}.mdl-color-text--blue-50{color:#e3f2fd!important}.mdl-color--blue-50{background-color:#e3f2fd!important}.mdl-color-text--blue-100{color:#bbdefb!important}.mdl-color--blue-100{background-color:#bbdefb!important}.mdl-color-text--blue-200{color:#90caf9!important}.mdl-color--blue-200{background-color:#90caf9!important}.mdl-color-text--blue-300{color:#64b5f6!important}.mdl-color--blue-300{background-color:#64b5f6!important}.mdl-color-text--blue-400{color:#42a5f5!important}.mdl-color--blue-400{background-color:#42a5f5!important}.mdl-color-text--blue-500{color:#2196f3!important}.mdl-color--blue-500{background-color:#2196f3!important}.mdl-color-text--blue-600{color:#1e88e5!important}.mdl-color--blue-600{background-color:#1e88e5!important}.mdl-color-text--blue-700{color:#1976d2!important}.mdl-color--blue-700{background-color:#1976d2!important}.mdl-color-text--blue-800{color:#1565c0!important}.mdl-color--blue-800{background-color:#1565c0!important}.mdl-color-text--blue-900{color:#0d47a1!important}.mdl-color--blue-900{background-color:#0d47a1!important}.mdl-color-text--blue-A100{color:#82b1ff!important}.mdl-color--blue-A100{background-color:#82b1ff!important}.mdl-color-text--blue-A200{color:#448aff!important}.mdl-color--blue-A200{background-color:#448aff!important}.mdl-color-text--blue-A400{color:#2979ff!important}.mdl-color--blue-A400{background-color:#2979ff!important}.mdl-color-text--blue-A700{color:#2962ff!important}.mdl-color--blue-A700{background-color:#2962ff!important}.mdl-color-text--light-blue{color:#03a9f4!important}.mdl-color--light-blue{background-color:#03a9f4!important}.mdl-color-text--light-blue-50{color:#e1f5fe!important}.mdl-color--light-blue-50{background-color:#e1f5fe!important}.mdl-color-text--light-blue-100{color:#b3e5fc!important}.mdl-color--light-blue-100{background-color:#b3e5fc!important}.mdl-color-text--light-blue-200{color:#81d4fa!important}.mdl-color--light-blue-200{background-color:#81d4fa!important}.mdl-color-text--light-blue-300{color:#4fc3f7!important}.mdl-color--light-blue-300{background-color:#4fc3f7!important}.mdl-color-text--light-blue-400{color:#29b6f6!important}.mdl-color--light-blue-400{background-color:#29b6f6!important}.mdl-color-text--light-blue-500{color:#03a9f4!important}.mdl-color--light-blue-500{background-color:#03a9f4!important}.mdl-color-text--light-blue-600{color:#039be5!important}.mdl-color--light-blue-600{background-color:#039be5!important}.mdl-color-text--light-blue-700{color:#0288d1!important}.mdl-color--light-blue-700{background-color:#0288d1!important}.mdl-color-text--light-blue-800{color:#0277bd!important}.mdl-color--light-blue-800{background-color:#0277bd!important}.mdl-color-text--light-blue-900{color:#01579b!important}.mdl-color--light-blue-900{background-color:#01579b!important}.mdl-color-text--light-blue-A100{color:#80d8ff!important}.mdl-color--light-blue-A100{background-color:#80d8ff!important}.mdl-color-text--light-blue-A200{color:#40c4ff!important}.mdl-color--light-blue-A200{background-color:#40c4ff!important}.mdl-color-text--light-blue-A400{color:#00b0ff!important}.mdl-color--light-blue-A400{background-color:#00b0ff!important}.mdl-color-text--light-blue-A700{color:#0091ea!important}.mdl-color--light-blue-A700{background-color:#0091ea!important}.mdl-color-text--cyan{color:#00bcd4!important}.mdl-color--cyan{background-color:#00bcd4!important}.mdl-color-text--cyan-50{color:#e0f7fa!important}.mdl-color--cyan-50{background-color:#e0f7fa!important}.mdl-color-text--cyan-100{color:#b2ebf2!important}.mdl-color--cyan-100{background-color:#b2ebf2!important}.mdl-color-text--cyan-200{color:#80deea!important}.mdl-color--cyan-200{background-color:#80deea!important}.mdl-color-text--cyan-300{color:#4dd0e1!important}.mdl-color--cyan-300{background-color:#4dd0e1!important}.mdl-color-text--cyan-400{color:#26c6da!important}.mdl-color--cyan-400{background-color:#26c6da!important}.mdl-color-text--cyan-500{color:#00bcd4!important}.mdl-color--cyan-500{background-color:#00bcd4!important}.mdl-color-text--cyan-600{color:#00acc1!important}.mdl-color--cyan-600{background-color:#00acc1!important}.mdl-color-text--cyan-700{color:#0097a7!important}.mdl-color--cyan-700{background-color:#0097a7!important}.mdl-color-text--cyan-800{color:#00838f!important}.mdl-color--cyan-800{background-color:#00838f!important}.mdl-color-text--cyan-900{color:#006064!important}.mdl-color--cyan-900{background-color:#006064!important}.mdl-color-text--cyan-A100{color:#84ffff!important}.mdl-color--cyan-A100{background-color:#84ffff!important}.mdl-color-text--cyan-A200{color:#18ffff!important}.mdl-color--cyan-A200{background-color:#18ffff!important}.mdl-color-text--cyan-A400{color:#00e5ff!important}.mdl-color--cyan-A400{background-color:#00e5ff!important}.mdl-color-text--cyan-A700{color:#00b8d4!important}.mdl-color--cyan-A700{background-color:#00b8d4!important}.mdl-color-text--teal{color:#009688!important}.mdl-color--teal{background-color:#009688!important}.mdl-color-text--teal-50{color:#e0f2f1!important}.mdl-color--teal-50{background-color:#e0f2f1!important}.mdl-color-text--teal-100{color:#b2dfdb!important}.mdl-color--teal-100{background-color:#b2dfdb!important}.mdl-color-text--teal-200{color:#80cbc4!important}.mdl-color--teal-200{background-color:#80cbc4!important}.mdl-color-text--teal-300{color:#4db6ac!important}.mdl-color--teal-300{background-color:#4db6ac!important}.mdl-color-text--teal-400{color:#26a69a!important}.mdl-color--teal-400{background-color:#26a69a!important}.mdl-color-text--teal-500{color:#009688!important}.mdl-color--teal-500{background-color:#009688!important}.mdl-color-text--teal-600{color:#00897b!important}.mdl-color--teal-600{background-color:#00897b!important}.mdl-color-text--teal-700{color:#00796b!important}.mdl-color--teal-700{background-color:#00796b!important}.mdl-color-text--teal-800{color:#00695c!important}.mdl-color--teal-800{background-color:#00695c!important}.mdl-color-text--teal-900{color:#004d40!important}.mdl-color--teal-900{background-color:#004d40!important}.mdl-color-text--teal-A100{color:#a7ffeb!important}.mdl-color--teal-A100{background-color:#a7ffeb!important}.mdl-color-text--teal-A200{color:#64ffda!important}.mdl-color--teal-A200{background-color:#64ffda!important}.mdl-color-text--teal-A400{color:#1de9b6!important}.mdl-color--teal-A400{background-color:#1de9b6!important}.mdl-color-text--teal-A700{color:#00bfa5!important}.mdl-color--teal-A700{background-color:#00bfa5!important}.mdl-color-text--green{color:#4caf50!important}.mdl-color--green{background-color:#4caf50!important}.mdl-color-text--green-50{color:#e8f5e9!important}.mdl-color--green-50{background-color:#e8f5e9!important}.mdl-color-text--green-100{color:#c8e6c9!important}.mdl-color--green-100{background-color:#c8e6c9!important}.mdl-color-text--green-200{color:#a5d6a7!important}.mdl-color--green-200{background-color:#a5d6a7!important}.mdl-color-text--green-300{color:#81c784!important}.mdl-color--green-300{background-color:#81c784!important}.mdl-color-text--green-400{color:#66bb6a!important}.mdl-color--green-400{background-color:#66bb6a!important}.mdl-color-text--green-500{color:#4caf50!important}.mdl-color--green-500{background-color:#4caf50!important}.mdl-color-text--green-600{color:#43a047!important}.mdl-color--green-600{background-color:#43a047!important}.mdl-color-text--green-700{color:#388e3c!important}.mdl-color--green-700{background-color:#388e3c!important}.mdl-color-text--green-800{color:#2e7d32!important}.mdl-color--green-800{background-color:#2e7d32!important}.mdl-color-text--green-900{color:#1b5e20!important}.mdl-color--green-900{background-color:#1b5e20!important}.mdl-color-text--green-A100{color:#b9f6ca!important}.mdl-color--green-A100{background-color:#b9f6ca!important}.mdl-color-text--green-A200{color:#69f0ae!important}.mdl-color--green-A200{background-color:#69f0ae!important}.mdl-color-text--green-A400{color:#00e676!important}.mdl-color--green-A400{background-color:#00e676!important}.mdl-color-text--green-A700{color:#00c853!important}.mdl-color--green-A700{background-color:#00c853!important}.mdl-color-text--light-green{color:#8bc34a!important}.mdl-color--light-green{background-color:#8bc34a!important}.mdl-color-text--light-green-50{color:#f1f8e9!important}.mdl-color--light-green-50{background-color:#f1f8e9!important}.mdl-color-text--light-green-100{color:#dcedc8!important}.mdl-color--light-green-100{background-color:#dcedc8!important}.mdl-color-text--light-green-200{color:#c5e1a5!important}.mdl-color--light-green-200{background-color:#c5e1a5!important}.mdl-color-text--light-green-300{color:#aed581!important}.mdl-color--light-green-300{background-color:#aed581!important}.mdl-color-text--light-green-400{color:#9ccc65!important}.mdl-color--light-green-400{background-color:#9ccc65!important}.mdl-color-text--light-green-500{color:#8bc34a!important}.mdl-color--light-green-500{background-color:#8bc34a!important}.mdl-color-text--light-green-600{color:#7cb342!important}.mdl-color--light-green-600{background-color:#7cb342!important}.mdl-color-text--light-green-700{color:#689f38!important}.mdl-color--light-green-700{background-color:#689f38!important}.mdl-color-text--light-green-800{color:#558b2f!important}.mdl-color--light-green-800{background-color:#558b2f!important}.mdl-color-text--light-green-900{color:#33691e!important}.mdl-color--light-green-900{background-color:#33691e!important}.mdl-color-text--light-green-A100{color:#ccff90!important}.mdl-color--light-green-A100{background-color:#ccff90!important}.mdl-color-text--light-green-A200{color:#b2ff59!important}.mdl-color--light-green-A200{background-color:#b2ff59!important}.mdl-color-text--light-green-A400{color:#76ff03!important}.mdl-color--light-green-A400{background-color:#76ff03!important}.mdl-color-text--light-green-A700{color:#64dd17!important}.mdl-color--light-green-A700{background-color:#64dd17!important}.mdl-color-text--lime{color:#cddc39!important}.mdl-color--lime{background-color:#cddc39!important}.mdl-color-text--lime-50{color:#f9fbe7!important}.mdl-color--lime-50{background-color:#f9fbe7!important}.mdl-color-text--lime-100{color:#f0f4c3!important}.mdl-color--lime-100{background-color:#f0f4c3!important}.mdl-color-text--lime-200{color:#e6ee9c!important}.mdl-color--lime-200{background-color:#e6ee9c!important}.mdl-color-text--lime-300{color:#dce775!important}.mdl-color--lime-300{background-color:#dce775!important}.mdl-color-text--lime-400{color:#d4e157!important}.mdl-color--lime-400{background-color:#d4e157!important}.mdl-color-text--lime-500{color:#cddc39!important}.mdl-color--lime-500{background-color:#cddc39!important}.mdl-color-text--lime-600{color:#c0ca33!important}.mdl-color--lime-600{background-color:#c0ca33!important}.mdl-color-text--lime-700{color:#afb42b!important}.mdl-color--lime-700{background-color:#afb42b!important}.mdl-color-text--lime-800{color:#9e9d24!important}.mdl-color--lime-800{background-color:#9e9d24!important}.mdl-color-text--lime-900{color:#827717!important}.mdl-color--lime-900{background-color:#827717!important}.mdl-color-text--lime-A100{color:#f4ff81!important}.mdl-color--lime-A100{background-color:#f4ff81!important}.mdl-color-text--lime-A200{color:#eeff41!important}.mdl-color--lime-A200{background-color:#eeff41!important}.mdl-color-text--lime-A400{color:#c6ff00!important}.mdl-color--lime-A400{background-color:#c6ff00!important}.mdl-color-text--lime-A700{color:#aeea00!important}.mdl-color--lime-A700{background-color:#aeea00!important}.mdl-color-text--yellow{color:#ffeb3b!important}.mdl-color--yellow{background-color:#ffeb3b!important}.mdl-color-text--yellow-50{color:#fffde7!important}.mdl-color--yellow-50{background-color:#fffde7!important}.mdl-color-text--yellow-100{color:#fff9c4!important}.mdl-color--yellow-100{background-color:#fff9c4!important}.mdl-color-text--yellow-200{color:#fff59d!important}.mdl-color--yellow-200{background-color:#fff59d!important}.mdl-color-text--yellow-300{color:#fff176!important}.mdl-color--yellow-300{background-color:#fff176!important}.mdl-color-text--yellow-400{color:#ffee58!important}.mdl-color--yellow-400{background-color:#ffee58!important}.mdl-color-text--yellow-500{color:#ffeb3b!important}.mdl-color--yellow-500{background-color:#ffeb3b!important}.mdl-color-text--yellow-600{color:#fdd835!important}.mdl-color--yellow-600{background-color:#fdd835!important}.mdl-color-text--yellow-700{color:#fbc02d!important}.mdl-color--yellow-700{background-color:#fbc02d!important}.mdl-color-text--yellow-800{color:#f9a825!important}.mdl-color--yellow-800{background-color:#f9a825!important}.mdl-color-text--yellow-900{color:#f57f17!important}.mdl-color--yellow-900{background-color:#f57f17!important}.mdl-color-text--yellow-A100{color:#ffff8d!important}.mdl-color--yellow-A100{background-color:#ffff8d!important}.mdl-color-text--yellow-A200{color:#ff0!important}.mdl-color--yellow-A200{background-color:#ff0!important}.mdl-color-text--yellow-A400{color:#ffea00!important}.mdl-color--yellow-A400{background-color:#ffea00!important}.mdl-color-text--yellow-A700{color:#ffd600!important}.mdl-color--yellow-A700{background-color:#ffd600!important}.mdl-color-text--amber{color:#ffc107!important}.mdl-color--amber{background-color:#ffc107!important}.mdl-color-text--amber-50{color:#fff8e1!important}.mdl-color--amber-50{background-color:#fff8e1!important}.mdl-color-text--amber-100{color:#ffecb3!important}.mdl-color--amber-100{background-color:#ffecb3!important}.mdl-color-text--amber-200{color:#ffe082!important}.mdl-color--amber-200{background-color:#ffe082!important}.mdl-color-text--amber-300{color:#ffd54f!important}.mdl-color--amber-300{background-color:#ffd54f!important}.mdl-color-text--amber-400{color:#ffca28!important}.mdl-color--amber-400{background-color:#ffca28!important}.mdl-color-text--amber-500{color:#ffc107!important}.mdl-color--amber-500{background-color:#ffc107!important}.mdl-color-text--amber-600{color:#ffb300!important}.mdl-color--amber-600{background-color:#ffb300!important}.mdl-color-text--amber-700{color:#ffa000!important}.mdl-color--amber-700{background-color:#ffa000!important}.mdl-color-text--amber-800{color:#ff8f00!important}.mdl-color--amber-800{background-color:#ff8f00!important}.mdl-color-text--amber-900{color:#ff6f00!important}.mdl-color--amber-900{background-color:#ff6f00!important}.mdl-color-text--amber-A100{color:#ffe57f!important}.mdl-color--amber-A100{background-color:#ffe57f!important}.mdl-color-text--amber-A200{color:#ffd740!important}.mdl-color--amber-A200{background-color:#ffd740!important}.mdl-color-text--amber-A400{color:#ffc400!important}.mdl-color--amber-A400{background-color:#ffc400!important}.mdl-color-text--amber-A700{color:#ffab00!important}.mdl-color--amber-A700{background-color:#ffab00!important}.mdl-color-text--orange{color:#ff9800!important}.mdl-color--orange{background-color:#ff9800!important}.mdl-color-text--orange-50{color:#fff3e0!important}.mdl-color--orange-50{background-color:#fff3e0!important}.mdl-color-text--orange-100{color:#ffe0b2!important}.mdl-color--orange-100{background-color:#ffe0b2!important}.mdl-color-text--orange-200{color:#ffcc80!important}.mdl-color--orange-200{background-color:#ffcc80!important}.mdl-color-text--orange-300{color:#ffb74d!important}.mdl-color--orange-300{background-color:#ffb74d!important}.mdl-color-text--orange-400{color:#ffa726!important}.mdl-color--orange-400{background-color:#ffa726!important}.mdl-color-text--orange-500{color:#ff9800!important}.mdl-color--orange-500{background-color:#ff9800!important}.mdl-color-text--orange-600{color:#fb8c00!important}.mdl-color--orange-600{background-color:#fb8c00!important}.mdl-color-text--orange-700{color:#f57c00!important}.mdl-color--orange-700{background-color:#f57c00!important}.mdl-color-text--orange-800{color:#ef6c00!important}.mdl-color--orange-800{background-color:#ef6c00!important}.mdl-color-text--orange-900{color:#e65100!important}.mdl-color--orange-900{background-color:#e65100!important}.mdl-color-text--orange-A100{color:#ffd180!important}.mdl-color--orange-A100{background-color:#ffd180!important}.mdl-color-text--orange-A200{color:#ffab40!important}.mdl-color--orange-A200{background-color:#ffab40!important}.mdl-color-text--orange-A400{color:#ff9100!important}.mdl-color--orange-A400{background-color:#ff9100!important}.mdl-color-text--orange-A700{color:#ff6d00!important}.mdl-color--orange-A700{background-color:#ff6d00!important}.mdl-color-text--deep-orange{color:#ff5722!important}.mdl-color--deep-orange{background-color:#ff5722!important}.mdl-color-text--deep-orange-50{color:#fbe9e7!important}.mdl-color--deep-orange-50{background-color:#fbe9e7!important}.mdl-color-text--deep-orange-100{color:#ffccbc!important}.mdl-color--deep-orange-100{background-color:#ffccbc!important}.mdl-color-text--deep-orange-200{color:#ffab91!important}.mdl-color--deep-orange-200{background-color:#ffab91!important}.mdl-color-text--deep-orange-300{color:#ff8a65!important}.mdl-color--deep-orange-300{background-color:#ff8a65!important}.mdl-color-text--deep-orange-400{color:#ff7043!important}.mdl-color--deep-orange-400{background-color:#ff7043!important}.mdl-color-text--deep-orange-500{color:#ff5722!important}.mdl-color--deep-orange-500{background-color:#ff5722!important}.mdl-color-text--deep-orange-600{color:#f4511e!important}.mdl-color--deep-orange-600{background-color:#f4511e!important}.mdl-color-text--deep-orange-700{color:#e64a19!important}.mdl-color--deep-orange-700{background-color:#e64a19!important}.mdl-color-text--deep-orange-800{color:#d84315!important}.mdl-color--deep-orange-800{background-color:#d84315!important}.mdl-color-text--deep-orange-900{color:#bf360c!important}.mdl-color--deep-orange-900{background-color:#bf360c!important}.mdl-color-text--deep-orange-A100{color:#ff9e80!important}.mdl-color--deep-orange-A100{background-color:#ff9e80!important}.mdl-color-text--deep-orange-A200{color:#ff6e40!important}.mdl-color--deep-orange-A200{background-color:#ff6e40!important}.mdl-color-text--deep-orange-A400{color:#ff3d00!important}.mdl-color--deep-orange-A400{background-color:#ff3d00!important}.mdl-color-text--deep-orange-A700{color:#dd2c00!important}.mdl-color--deep-orange-A700{background-color:#dd2c00!important}.mdl-color-text--brown{color:#795548!important}.mdl-color--brown{background-color:#795548!important}.mdl-color-text--brown-50{color:#efebe9!important}.mdl-color--brown-50{background-color:#efebe9!important}.mdl-color-text--brown-100{color:#d7ccc8!important}.mdl-color--brown-100{background-color:#d7ccc8!important}.mdl-color-text--brown-200{color:#bcaaa4!important}.mdl-color--brown-200{background-color:#bcaaa4!important}.mdl-color-text--brown-300{color:#a1887f!important}.mdl-color--brown-300{background-color:#a1887f!important}.mdl-color-text--brown-400{color:#8d6e63!important}.mdl-color--brown-400{background-color:#8d6e63!important}.mdl-color-text--brown-500{color:#795548!important}.mdl-color--brown-500{background-color:#795548!important}.mdl-color-text--brown-600{color:#6d4c41!important}.mdl-color--brown-600{background-color:#6d4c41!important}.mdl-color-text--brown-700{color:#5d4037!important}.mdl-color--brown-700{background-color:#5d4037!important}.mdl-color-text--brown-800{color:#4e342e!important}.mdl-color--brown-800{background-color:#4e342e!important}.mdl-color-text--brown-900{color:#3e2723!important}.mdl-color--brown-900{background-color:#3e2723!important}.mdl-color-text--grey{color:#9e9e9e!important}.mdl-color--grey{background-color:#9e9e9e!important}.mdl-color-text--grey-50{color:#fafafa!important}.mdl-color--grey-50{background-color:#fafafa!important}.mdl-color-text--grey-100{color:#f5f5f5!important}.mdl-color--grey-100{background-color:#f5f5f5!important}.mdl-color-text--grey-200{color:#eee!important}.mdl-color--grey-200{background-color:#eee!important}.mdl-color-text--grey-300{color:#e0e0e0!important}.mdl-color--grey-300{background-color:#e0e0e0!important}.mdl-color-text--grey-400{color:#bdbdbd!important}.mdl-color--grey-400{background-color:#bdbdbd!important}.mdl-color-text--grey-500{color:#9e9e9e!important}.mdl-color--grey-500{background-color:#9e9e9e!important}.mdl-color-text--grey-600{color:#757575!important}.mdl-color--grey-600{background-color:#757575!important}.mdl-color-text--grey-700{color:#616161!important}.mdl-color--grey-700{background-color:#616161!important}.mdl-color-text--grey-800{color:#424242!important}.mdl-color--grey-800{background-color:#424242!important}.mdl-color-text--grey-900{color:#212121!important}.mdl-color--grey-900{background-color:#212121!important}.mdl-color-text--blue-grey{color:#607d8b!important}.mdl-color--blue-grey{background-color:#607d8b!important}.mdl-color-text--blue-grey-50{color:#eceff1!important}.mdl-color--blue-grey-50{background-color:#eceff1!important}.mdl-color-text--blue-grey-100{color:#cfd8dc!important}.mdl-color--blue-grey-100{background-color:#cfd8dc!important}.mdl-color-text--blue-grey-200{color:#b0bec5!important}.mdl-color--blue-grey-200{background-color:#b0bec5!important}.mdl-color-text--blue-grey-300{color:#90a4ae!important}.mdl-color--blue-grey-300{background-color:#90a4ae!important}.mdl-color-text--blue-grey-400{color:#78909c!important}.mdl-color--blue-grey-400{background-color:#78909c!important}.mdl-color-text--blue-grey-500{color:#607d8b!important}.mdl-color--blue-grey-500{background-color:#607d8b!important}.mdl-color-text--blue-grey-600{color:#546e7a!important}.mdl-color--blue-grey-600{background-color:#546e7a!important}.mdl-color-text--blue-grey-700{color:#455a64!important}.mdl-color--blue-grey-700{background-color:#455a64!important}.mdl-color-text--blue-grey-800{color:#37474f!important}.mdl-color--blue-grey-800{background-color:#37474f!important}.mdl-color-text--blue-grey-900{color:#263238!important}.mdl-color--blue-grey-900{background-color:#263238!important}.mdl-color--black{background-color:#000!important}.mdl-color-text--black{color:#000!important}.mdl-color--white{background-color:#fff!important}.mdl-color-text--white{color:#fff!important}.mdl-color--primary{background-color:#3f51b5!important}.mdl-color--primary-contrast{background-color:#fff!important}.mdl-color--primary-dark{background-color:#303f9f!important}.mdl-color--accent{background-color:#ff4081!important}.mdl-color--accent-contrast{background-color:#fff!important}.mdl-color-text--primary{color:#3f51b5!important}.mdl-color-text--primary-contrast{color:#fff!important}.mdl-color-text--primary-dark{color:#303f9f!important}.mdl-color-text--accent{color:#ff4081!important}.mdl-color-text--accent-contrast{color:#fff!important}.mdl-ripple{background:#000;border-radius:50%;height:50px;left:0;opacity:0;pointer-events:none;position:absolute;top:0;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);width:50px;overflow:hidden}.mdl-ripple.is-animating{-webkit-transition:-webkit-transform .3s cubic-bezier(0,0,.2,1),width .3s cubic-bezier(0,0,.2,1),height .3s cubic-bezier(0,0,.2,1),opacity .6s cubic-bezier(0,0,.2,1);transition:transform .3s cubic-bezier(0,0,.2,1),width .3s cubic-bezier(0,0,.2,1),height .3s cubic-bezier(0,0,.2,1),opacity .6s cubic-bezier(0,0,.2,1)}.mdl-ripple.is-visible{opacity:.3}.mdl-animation--default,.mdl-animation--fast-out-slow-in{-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1)}.mdl-animation--linear-out-slow-in{-webkit-transition-timing-function:cubic-bezier(0,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1)}.mdl-animation--fast-out-linear-in{-webkit-transition-timing-function:cubic-bezier(.4,0,1,1);transition-timing-function:cubic-bezier(.4,0,1,1)}.mdl-badge{position:relative;white-space:nowrap;margin-right:24px}.mdl-badge:not([data-badge]){margin-right:auto}.mdl-badge[data-badge]:after{content:attr(data-badge);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;position:absolute;top:-11px;right:-24px;font-family:Roboto,Helvetica,Arial,sans-serif;font-weight:600;font-size:12px;width:22px;height:22px;border-radius:50%;background:#ff4081;color:#fff}.mdl-button .mdl-badge[data-badge]:after{top:-10px;right:-5px}.mdl-badge.mdl-badge--no-background[data-badge]:after{color:#ff4081;background:rgba(255,255,255,.2);box-shadow:0 0 1px gray}.mdl-button{background:0 0;border:none;border-radius:2px;color:#000;position:relative;height:36px;min-width:64px;padding:0 8px;display:inline-block;font-family:Roboto,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;letter-spacing:0;overflow:hidden;will-change:box-shadow,transform;-webkit-transition:box-shadow .2s cubic-bezier(.4,0,1,1),background-color .2s cubic-bezier(.4,0,.2,1),color .2s cubic-bezier(.4,0,.2,1);transition:box-shadow .2s cubic-bezier(.4,0,1,1),background-color .2s cubic-bezier(.4,0,.2,1),color .2s cubic-bezier(.4,0,.2,1);outline:0;cursor:pointer;text-align:center;line-height:36px}.mdl-button--fab,.mdl-button--icon{overflow:hidden;font-size:24px;padding:0}.mdl-button::-moz-focus-inner{border:0}.mdl-button:hover{background-color:rgba(158,158,158,.2)}.mdl-button:focus:not(:active){background-color:rgba(0,0,0,.12)}.mdl-button:active{background-color:rgba(158,158,158,.4)}.mdl-button.mdl-button--colored{color:#3f51b5}.mdl-button.mdl-button--colored:focus:not(:active){background-color:rgba(0,0,0,.12)}input.mdl-button[type=submit]{-webkit-appearance:none}.mdl-button--raised{background:rgba(158,158,158,.2);box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12)}.mdl-button--raised:active{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.2);background-color:rgba(158,158,158,.4)}.mdl-button--raised:focus:not(:active){box-shadow:0 0 8px rgba(0,0,0,.18),0 8px 16px rgba(0,0,0,.36);background-color:rgba(158,158,158,.4)}.mdl-button--raised.mdl-button--colored{background:#3f51b5;color:#fff}.mdl-button--raised.mdl-button--colored:active,.mdl-button--raised.mdl-button--colored:focus:not(:active),.mdl-button--raised.mdl-button--colored:hover{background-color:#3f51b5}.mdl-button--raised.mdl-button--colored .mdl-ripple{background:#fff}.mdl-button--fab{border-radius:50%;height:56px;margin:auto;min-width:56px;width:56px;background:rgba(158,158,158,.2);box-shadow:0 1px 1.5px 0 rgba(0,0,0,.12),0 1px 1px 0 rgba(0,0,0,.24);position:relative;line-height:normal}.mdl-button--fab .material-icons{transform:translate(-12px,-12px);line-height:24px;width:24px}.mdl-button--fab .material-icons,.mdl-button--icon .material-icons{position:absolute;top:50%;left:50%;-webkit-transform:translate(-12px,-12px);-ms-transform:translate(-12px,-12px)}.mdl-button--fab.mdl-button--mini-fab{height:40px;min-width:40px;width:40px}.mdl-button--fab .mdl-button__ripple-container{border-radius:50%;-webkit-mask-image:-webkit-radial-gradient(circle,#fff,#000)}.mdl-button--fab:active{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.2);background-color:rgba(158,158,158,.4)}.mdl-button--fab:focus:not(:active){box-shadow:0 0 8px rgba(0,0,0,.18),0 8px 16px rgba(0,0,0,.36);background-color:rgba(158,158,158,.4)}.mdl-button--fab.mdl-button--colored{background:#ff4081;color:#fff}.mdl-button--fab.mdl-button--colored:active,.mdl-button--fab.mdl-button--colored:focus:not(:active),.mdl-button--fab.mdl-button--colored:hover{background-color:#ff4081}.mdl-button--fab.mdl-button--colored .mdl-ripple{background:#fff}.mdl-button--icon{border-radius:50%;height:32px;margin-left:0;margin-right:0;min-width:32px;width:32px;color:inherit;line-height:normal}.mdl-button--icon .material-icons{transform:translate(-12px,-12px);line-height:24px;width:24px}.mdl-button--icon.mdl-button--mini-icon{height:24px;min-width:24px;width:24px}.mdl-button--icon.mdl-button--mini-icon .material-icons{top:0;left:0}.mdl-button--icon .mdl-button__ripple-container{border-radius:50%;-webkit-mask-image:-webkit-radial-gradient(circle,#fff,#000)}.mdl-button__ripple-container{display:block;height:100%;left:0;position:absolute;top:0;width:100%;z-index:0;overflow:hidden}.mdl-button.mdl-button--disabled .mdl-button__ripple-container .mdl-ripple,.mdl-button[disabled] .mdl-button__ripple-container .mdl-ripple{background-color:transparent}.mdl-button--primary.mdl-button--primary{color:#3f51b5}.mdl-button--primary.mdl-button--primary .mdl-ripple{background:#fff}.mdl-button--primary.mdl-button--primary.mdl-button--fab,.mdl-button--primary.mdl-button--primary.mdl-button--raised{color:#fff;background-color:#3f51b5}.mdl-button--accent.mdl-button--accent{color:#ff4081}.mdl-button--accent.mdl-button--accent .mdl-ripple{background:#fff}.mdl-button--accent.mdl-button--accent.mdl-button--fab,.mdl-button--accent.mdl-button--accent.mdl-button--raised{color:#fff;background-color:#ff4081}.mdl-button.mdl-button--disabled.mdl-button--disabled,.mdl-button[disabled][disabled]{color:rgba(0,0,0,.26);cursor:auto;background-color:transparent}.mdl-button--fab.mdl-button--disabled.mdl-button--disabled,.mdl-button--fab[disabled][disabled],.mdl-button--raised.mdl-button--disabled.mdl-button--disabled,.mdl-button--raised[disabled][disabled]{background-color:rgba(0,0,0,.12);color:rgba(0,0,0,.26);box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12)}.mdl-button--colored.mdl-button--disabled.mdl-button--disabled,.mdl-button--colored[disabled][disabled]{color:rgba(0,0,0,.26)}.mdl-card{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;font-size:16px;font-weight:400;min-height:200px;overflow:hidden;width:330px;z-index:1;position:relative;background:#fff;border-radius:2px}.mdl-card__media{background-color:#ff4081;background-repeat:repeat;background-position:50% 50%;background-size:cover;background-origin:padding-box;background-attachment:scroll}.mdl-card__title{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;color:#000;display:block;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:stretch;-webkit-justify-content:stretch;-ms-flex-pack:stretch;justify-content:stretch;line-height:normal;padding:16px;-webkit-perspective-origin:165px 56px;perspective-origin:165px 56px;-webkit-transform-origin:165px 56px;-ms-transform-origin:165px 56px;transform-origin:165px 56px}.mdl-card__title.mdl-card--border{border-bottom:1px solid rgba(0,0,0,.1)}.mdl-card__title-text{-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end;color:inherit;display:block;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;font-size:24px;font-weight:300;line-height:normal;overflow:hidden;-webkit-transform-origin:149px 48px;-ms-transform-origin:149px 48px;transform-origin:149px 48px;margin:0}.mdl-card__subtitle-text{font-size:14px;color:grey;margin:0}.mdl-card__supporting-text{color:rgba(0,0,0,.54);font-size:13px;line-height:18px;overflow:hidden;padding:16px;width:90%}.mdl-card__actions,.mdl-checkbox{box-sizing:border-box;width:100%}.mdl-card__actions{font-size:16px;line-height:normal;background-color:transparent;padding:8px}.mdl-card__actions.mdl-card--border{border-top:1px solid rgba(0,0,0,.1)}.mdl-card--expand{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.mdl-card__menu{position:absolute;right:16px;top:16px}.mdl-checkbox{position:relative;z-index:1;display:inline-block;height:24px;margin:0;padding:0}.mdl-checkbox.is-upgraded{padding-left:24px}.mdl-checkbox__input{line-height:24px}.mdl-checkbox.is-upgraded .mdl-checkbox__input{position:absolute;width:0;height:0;margin:0;padding:0;opacity:0;-ms-appearance:none;-moz-appearance:none;-webkit-appearance:none;appearance:none;border:none}.mdl-checkbox__box-outline,.mdl-checkbox__focus-helper{position:absolute;left:0;top:3px;display:inline-block;box-sizing:border-box;width:16px;height:16px}.mdl-checkbox__box-outline{margin:0;cursor:pointer;overflow:hidden;border:2px solid rgba(0,0,0,.54);border-radius:2px;z-index:2}.mdl-checkbox.is-checked .mdl-checkbox__box-outline{border:2px solid #3f51b5}.mdl-checkbox.is-disabled .mdl-checkbox__box-outline{border:2px solid rgba(0,0,0,.26);cursor:auto}.mdl-checkbox__focus-helper{border-radius:50%;background-color:transparent}.mdl-checkbox.is-focused .mdl-checkbox__focus-helper{box-shadow:0 0 0 8px rgba(0,0,0,.1);background-color:rgba(0,0,0,.1)}.mdl-checkbox.is-focused.is-checked .mdl-checkbox__focus-helper{box-shadow:0 0 0 8px rgba(63,81,181,.26);background-color:rgba(63,81,181,.26)}.mdl-layout__drawer,.mdl-layout__header,.mdl-menu__outline{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12)}.mdl-checkbox__tick-outline{position:absolute;top:0;left:0;height:100%;width:100%;-webkit-mask:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMSAxIgogICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pbiBtZWV0Ij4KICA8ZGVmcz4KICAgIDxjbGlwUGF0aCBpZD0iY2xpcCI+CiAgICAgIDxwYXRoCiAgICAgICAgIGQ9Ik0gMCwwIDAsMSAxLDEgMSwwIDAsMCB6IE0gMC44NTM0Mzc1LDAuMTY3MTg3NSAwLjk1OTY4NzUsMC4yNzMxMjUgMC40MjkzNzUsMC44MDM0Mzc1IDAuMzIzMTI1LDAuOTA5Njg3NSAwLjIxNzE4NzUsMC44MDM0Mzc1IDAuMDQwMzEyNSwwLjYyNjg3NSAwLjE0NjU2MjUsMC41MjA2MjUgMC4zMjMxMjUsMC42OTc1IDAuODUzNDM3NSwwLjE2NzE4NzUgeiIKICAgICAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgIDwvY2xpcFBhdGg+CiAgICA8bWFzayBpZD0ibWFzayIgbWFza1VuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgbWFza0NvbnRlbnRVbml0cz0ib2JqZWN0Qm91bmRpbmdCb3giPgogICAgICA8cGF0aAogICAgICAgICBkPSJNIDAsMCAwLDEgMSwxIDEsMCAwLDAgeiBNIDAuODUzNDM3NSwwLjE2NzE4NzUgMC45NTk2ODc1LDAuMjczMTI1IDAuNDI5Mzc1LDAuODAzNDM3NSAwLjMyMzEyNSwwLjkwOTY4NzUgMC4yMTcxODc1LDAuODAzNDM3NSAwLjA0MDMxMjUsMC42MjY4NzUgMC4xNDY1NjI1LDAuNTIwNjI1IDAuMzIzMTI1LDAuNjk3NSAwLjg1MzQzNzUsMC4xNjcxODc1IHoiCiAgICAgICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+CiAgICA8L21hc2s+CiAgPC9kZWZzPgogIDxyZWN0CiAgICAgd2lkdGg9IjEiCiAgICAgaGVpZ2h0PSIxIgogICAgIHg9IjAiCiAgICAgeT0iMCIKICAgICBjbGlwLXBhdGg9InVybCgjY2xpcCkiCiAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KPC9zdmc+Cg==);mask:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMSAxIgogICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pbiBtZWV0Ij4KICA8ZGVmcz4KICAgIDxjbGlwUGF0aCBpZD0iY2xpcCI+CiAgICAgIDxwYXRoCiAgICAgICAgIGQ9Ik0gMCwwIDAsMSAxLDEgMSwwIDAsMCB6IE0gMC44NTM0Mzc1LDAuMTY3MTg3NSAwLjk1OTY4NzUsMC4yNzMxMjUgMC40MjkzNzUsMC44MDM0Mzc1IDAuMzIzMTI1LDAuOTA5Njg3NSAwLjIxNzE4NzUsMC44MDM0Mzc1IDAuMDQwMzEyNSwwLjYyNjg3NSAwLjE0NjU2MjUsMC41MjA2MjUgMC4zMjMxMjUsMC42OTc1IDAuODUzNDM3NSwwLjE2NzE4NzUgeiIKICAgICAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgIDwvY2xpcFBhdGg+CiAgICA8bWFzayBpZD0ibWFzayIgbWFza1VuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgbWFza0NvbnRlbnRVbml0cz0ib2JqZWN0Qm91bmRpbmdCb3giPgogICAgICA8cGF0aAogICAgICAgICBkPSJNIDAsMCAwLDEgMSwxIDEsMCAwLDAgeiBNIDAuODUzNDM3NSwwLjE2NzE4NzUgMC45NTk2ODc1LDAuMjczMTI1IDAuNDI5Mzc1LDAuODAzNDM3NSAwLjMyMzEyNSwwLjkwOTY4NzUgMC4yMTcxODc1LDAuODAzNDM3NSAwLjA0MDMxMjUsMC42MjY4NzUgMC4xNDY1NjI1LDAuNTIwNjI1IDAuMzIzMTI1LDAuNjk3NSAwLjg1MzQzNzUsMC4xNjcxODc1IHoiCiAgICAgICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+CiAgICA8L21hc2s+CiAgPC9kZWZzPgogIDxyZWN0CiAgICAgd2lkdGg9IjEiCiAgICAgaGVpZ2h0PSIxIgogICAgIHg9IjAiCiAgICAgeT0iMCIKICAgICBjbGlwLXBhdGg9InVybCgjY2xpcCkiCiAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KPC9zdmc+Cg==);background:0 0;-webkit-transition-duration:.28s;transition-duration:.28s;transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-property:background;transition-property:background}.mdl-checkbox__tick-outline,.mdl-data-table tbody tr{-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1)}.mdl-checkbox__ripple-container,.mdl-icon-toggle__ripple-container{box-sizing:border-box;overflow:hidden;-webkit-mask-image:-webkit-radial-gradient(circle,#fff,#000)}.mdl-checkbox.is-checked .mdl-checkbox__tick-outline{background:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMSAxIgogICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pbiBtZWV0Ij4KICA8cGF0aAogICAgIGQ9Ik0gMC4wNDAzODA1OSwwLjYyNjc3NjcgMC4xNDY0NDY2MSwwLjUyMDcxMDY4IDAuNDI5Mjg5MzIsMC44MDM1NTMzOSAwLjMyMzIyMzMsMC45MDk2MTk0MSB6IE0gMC4yMTcxNTcyOSwwLjgwMzU1MzM5IDAuODUzNTUzMzksMC4xNjcxNTcyOSAwLjk1OTYxOTQxLDAuMjczMjIzMyAwLjMyMzIyMzMsMC45MDk2MTk0MSB6IgogICAgIGlkPSJyZWN0Mzc4MCIKICAgICBzdHlsZT0iZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgo8L3N2Zz4K) #3f51b5}.mdl-checkbox.is-checked.is-disabled .mdl-checkbox__tick-outline{background:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMSAxIgogICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pbiBtZWV0Ij4KICA8cGF0aAogICAgIGQ9Ik0gMC4wNDAzODA1OSwwLjYyNjc3NjcgMC4xNDY0NDY2MSwwLjUyMDcxMDY4IDAuNDI5Mjg5MzIsMC44MDM1NTMzOSAwLjMyMzIyMzMsMC45MDk2MTk0MSB6IE0gMC4yMTcxNTcyOSwwLjgwMzU1MzM5IDAuODUzNTUzMzksMC4xNjcxNTcyOSAwLjk1OTYxOTQxLDAuMjczMjIzMyAwLjMyMzIyMzMsMC45MDk2MTk0MSB6IgogICAgIGlkPSJyZWN0Mzc4MCIKICAgICBzdHlsZT0iZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgo8L3N2Zz4K) rgba(0,0,0,.26)}.mdl-checkbox__label{position:relative;cursor:pointer;font-size:16px;line-height:24px;margin:0}.mdl-checkbox.is-disabled .mdl-checkbox__label{color:rgba(0,0,0,.26);cursor:auto}.mdl-checkbox__ripple-container{position:absolute;z-index:2;top:-6px;left:-10px;width:36px;height:36px;border-radius:50%;cursor:pointer}.mdl-checkbox__ripple-container .mdl-ripple{background:#3f51b5}.mdl-checkbox.is-disabled .mdl-checkbox__ripple-container{cursor:auto}.mdl-checkbox.is-disabled .mdl-checkbox__ripple-container .mdl-ripple{background:0 0}.mdl-data-table{position:relative;border:1px solid rgba(0,0,0,.12);border-collapse:collapse;white-space:nowrap;font-size:13px;background-color:#fff}.mdl-data-table thead{padding-bottom:3px}.mdl-data-table thead .mdl-data-table__select{margin-top:0}.mdl-data-table tbody tr{position:relative;height:48px;-webkit-transition-duration:.28s;transition-duration:.28s;transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-property:background-color;transition-property:background-color}.mdl-data-table tbody tr.is-selected{background-color:#e0e0e0}.mdl-data-table tbody tr:hover{background-color:#eee}.mdl-data-table td,.mdl-data-table th{padding:0 18px;text-align:right}.mdl-data-table td:first-of-type,.mdl-data-table th:first-of-type{padding-left:24px}.mdl-data-table td:last-of-type,.mdl-data-table th:last-of-type{padding-right:24px}.mdl-data-table td{position:relative;vertical-align:top;height:48px;border-top:1px solid rgba(0,0,0,.12);border-bottom:1px solid rgba(0,0,0,.12);padding-top:12px;box-sizing:border-box}.mdl-data-table td .mdl-data-table__select{vertical-align:top;position:absolute;left:24px}.mdl-data-table th{position:relative;vertical-align:bottom;text-overflow:ellipsis;font-weight:700;line-height:24px;letter-spacing:0;height:48px;font-size:12px;color:rgba(0,0,0,.54);padding-bottom:8px;box-sizing:border-box}.mdl-data-table th .mdl-data-table__select{position:absolute;bottom:8px;left:24px}.mdl-data-table__select{width:16px}.mdl-data-table__cell--non-numeric.mdl-data-table__cell--non-numeric{text-align:left}.mdl-mega-footer{padding:16px 40px;color:#9e9e9e;background-color:#424242}.mdl-mega-footer--bottom-section:after,.mdl-mega-footer--middle-section:after,.mdl-mega-footer--top-section:after,.mdl-mega-footer__bottom-section:after,.mdl-mega-footer__middle-section:after,.mdl-mega-footer__top-section:after{content:'';display:block;clear:both}.mdl-mega-footer--left-section,.mdl-mega-footer--right-section,.mdl-mega-footer__left-section,.mdl-mega-footer__right-section{margin-bottom:16px}.mdl-mega-footer--right-section a,.mdl-mega-footer__right-section a{display:block;margin-bottom:16px;color:inherit;text-decoration:none}@media screen and (min-width:760px){.mdl-mega-footer--left-section,.mdl-mega-footer__left-section{float:left}.mdl-mega-footer--right-section,.mdl-mega-footer__right-section{float:right}.mdl-mega-footer--right-section a,.mdl-mega-footer__right-section a{display:inline-block;margin-left:16px;line-height:36px;vertical-align:middle}}.mdl-mega-footer--social-btn,.mdl-mega-footer__social-btn{width:36px;height:36px;padding:0;margin:0;background-color:#9e9e9e;border:none}.mdl-mega-footer--drop-down-section,.mdl-mega-footer__drop-down-section{display:block;position:relative}@media screen and (min-width:760px){.mdl-mega-footer--drop-down-section,.mdl-mega-footer__drop-down-section{width:33%}.mdl-mega-footer--drop-down-section:nth-child(1),.mdl-mega-footer--drop-down-section:nth-child(2),.mdl-mega-footer__drop-down-section:nth-child(1),.mdl-mega-footer__drop-down-section:nth-child(2){float:left}.mdl-mega-footer--drop-down-section:nth-child(3),.mdl-mega-footer__drop-down-section:nth-child(3){float:right}.mdl-mega-footer--drop-down-section:nth-child(3):after,.mdl-mega-footer__drop-down-section:nth-child(3):after{clear:right}.mdl-mega-footer--drop-down-section:nth-child(4),.mdl-mega-footer__drop-down-section:nth-child(4){clear:right;float:right}.mdl-mega-footer--middle-section:after,.mdl-mega-footer__middle-section:after{content:'';display:block;clear:both}.mdl-mega-footer--bottom-section,.mdl-mega-footer__bottom-section{padding-top:0}}@media screen and (min-width:1024px){.mdl-mega-footer--drop-down-section,.mdl-mega-footer--drop-down-section:nth-child(3),.mdl-mega-footer--drop-down-section:nth-child(4),.mdl-mega-footer__drop-down-section,.mdl-mega-footer__drop-down-section:nth-child(3),.mdl-mega-footer__drop-down-section:nth-child(4){width:24%;float:left}}.mdl-mega-footer--heading-checkbox,.mdl-mega-footer__heading-checkbox{position:absolute;width:100%;height:55.8px;padding:32px;margin:-16px 0 0;cursor:pointer;z-index:1;opacity:0}.mdl-mega-footer--heading-checkbox~.mdl-mega-footer--heading:after,.mdl-mega-footer--heading-checkbox~.mdl-mega-footer__heading:after,.mdl-mega-footer__heading-checkbox~.mdl-mega-footer--heading:after,.mdl-mega-footer__heading-checkbox~.mdl-mega-footer__heading:after{font-family:'Material Icons';content:'\E5CE'}.mdl-mega-footer--heading-checkbox:checked~ul,.mdl-mega-footer__heading-checkbox:checked~ul{display:none}.mdl-mega-footer--heading-checkbox:checked~.mdl-mega-footer--heading:after,.mdl-mega-footer--heading-checkbox:checked~.mdl-mega-footer__heading:after,.mdl-mega-footer__heading-checkbox:checked~.mdl-mega-footer--heading:after,.mdl-mega-footer__heading-checkbox:checked~.mdl-mega-footer__heading:after{font-family:'Material Icons';content:'\E5CF'}.mdl-mega-footer--heading,.mdl-mega-footer__heading{position:relative;width:100%;padding-right:39.8px;margin-bottom:16px;box-sizing:border-box;font-size:14px;line-height:23.8px;font-weight:500;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;color:#e0e0e0}.mdl-mega-footer--heading:after,.mdl-mega-footer__heading:after{content:'';position:absolute;top:0;right:0;display:block;width:23.8px;height:23.8px;background-size:cover}.mdl-mega-footer--link-list,.mdl-mega-footer__link-list{list-style:none;margin:0 0 32px;padding:0}.mdl-mega-footer--link-list:after,.mdl-mega-footer__link-list:after{clear:both;display:block;content:''}.mdl-mega-footer--link-list li,.mdl-mega-footer__link-list li{font-size:14px;font-weight:400;letter-spacing:0;line-height:20px}.mdl-mega-footer--link-list a,.mdl-mega-footer__link-list a{color:inherit;text-decoration:none;white-space:nowrap}.mdl-mega-footer--bottom-section,.mdl-mega-footer__bottom-section{padding-top:16px;margin-bottom:16px}.mdl-logo{margin-bottom:16px;color:#fff}.mdl-mega-footer--bottom-section .mdl-mega-footer--link-list li,.mdl-mega-footer__bottom-section .mdl-mega-footer__link-list li{float:left;margin-bottom:0;margin-right:16px}@media screen and (min-width:760px){.mdl-mega-footer--heading-checkbox,.mdl-mega-footer__heading-checkbox{display:none}.mdl-mega-footer--heading-checkbox~.mdl-mega-footer--heading:after,.mdl-mega-footer--heading-checkbox~.mdl-mega-footer__heading:after,.mdl-mega-footer__heading-checkbox~.mdl-mega-footer--heading:after,.mdl-mega-footer__heading-checkbox~.mdl-mega-footer__heading:after{background-image:none}.mdl-mega-footer--heading-checkbox:checked~ul,.mdl-mega-footer__heading-checkbox:checked~ul{display:block}.mdl-mega-footer--heading-checkbox:checked~.mdl-mega-footer--heading:after,.mdl-mega-footer--heading-checkbox:checked~.mdl-mega-footer__heading:after,.mdl-mega-footer__heading-checkbox:checked~.mdl-mega-footer--heading:after,.mdl-mega-footer__heading-checkbox:checked~.mdl-mega-footer__heading:after{content:''}.mdl-logo{float:left;margin-bottom:0;margin-right:16px}}.mdl-mini-footer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:32px 16px;color:#9e9e9e;background-color:#424242}.mdl-mini-footer:after{content:'';display:block}.mdl-mini-footer .mdl-logo{line-height:36px}.mdl-mini-footer--link-list,.mdl-mini-footer__link-list{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap;list-style:none;margin:0;padding:0}.mdl-mini-footer--link-list li,.mdl-mini-footer__link-list li{margin-bottom:0;margin-right:16px}@media screen and (min-width:760px){.mdl-mini-footer--link-list li,.mdl-mini-footer__link-list li{line-height:36px}}.mdl-mini-footer--link-list a,.mdl-mini-footer__link-list a{color:inherit;text-decoration:none;white-space:nowrap}.mdl-mini-footer--left-section,.mdl-mini-footer__left-section{display:inline-block;-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.mdl-mini-footer--right-section,.mdl-mini-footer__right-section{display:inline-block;-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.mdl-mini-footer--social-btn,.mdl-mini-footer__social-btn{width:36px;height:36px;padding:0;margin:0;background-color:#9e9e9e;border:none}.mdl-icon-toggle{position:relative;z-index:1;vertical-align:middle;display:inline-block;height:32px;margin:0;padding:0}.mdl-icon-toggle__input{line-height:32px}.mdl-icon-toggle.is-upgraded .mdl-icon-toggle__input{position:absolute;width:0;height:0;margin:0;padding:0;opacity:0;-ms-appearance:none;-moz-appearance:none;-webkit-appearance:none;appearance:none;border:none}.mdl-icon-toggle__label{display:inline-block;position:relative;cursor:pointer;height:32px;width:32px;min-width:32px;color:#616161;border-radius:50%;padding:0;margin-left:0;margin-right:0;text-align:center;background-color:transparent;will-change:background-color;-webkit-transition:background-color .2s cubic-bezier(.4,0,.2,1),color .2s cubic-bezier(.4,0,.2,1);transition:background-color .2s cubic-bezier(.4,0,.2,1),color .2s cubic-bezier(.4,0,.2,1)}.mdl-icon-toggle__label.material-icons{line-height:32px;font-size:24px}.mdl-icon-toggle.is-checked .mdl-icon-toggle__label{color:#3f51b5}.mdl-icon-toggle.is-disabled .mdl-icon-toggle__label{color:rgba(0,0,0,.26);cursor:auto;-webkit-transition:none;transition:none}.mdl-icon-toggle.is-focused .mdl-icon-toggle__label{background-color:rgba(0,0,0,.12)}.mdl-icon-toggle.is-focused.is-checked .mdl-icon-toggle__label{background-color:rgba(63,81,181,.26)}.mdl-icon-toggle__ripple-container{position:absolute;z-index:2;top:-2px;left:-2px;width:36px;height:36px;border-radius:50%;cursor:pointer}.mdl-menu,.mdl-menu__outline{position:absolute;top:0;left:0}.mdl-icon-toggle__ripple-container .mdl-ripple{background:#616161}.mdl-icon-toggle.is-disabled .mdl-icon-toggle__ripple-container{cursor:auto}.mdl-icon-toggle.is-disabled .mdl-icon-toggle__ripple-container .mdl-ripple{background:0 0}.mdl-menu__container{display:block;margin:0;padding:0;border:none;position:absolute;overflow:visible;height:0;width:0;visibility:hidden;z-index:-1}.mdl-menu__container.is-animating,.mdl-menu__container.is-visible{z-index:999;visibility:visible}.mdl-menu__outline{background:#fff;padding:0;border-radius:2px;overflow:hidden;opacity:0;-webkit-transform:scale(0);-ms-transform:scale(0);transform:scale(0);-webkit-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;will-change:transform;-webkit-transition:-webkit-transform .3s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1);transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1);z-index:-1}.mdl-menu__item,.mdl-menu__outline{margin:0;display:block;border:none}.mdl-menu__item,.mdl-menu__item[disabled],.mdl-menu__item[disabled]:focus,.mdl-menu__item[disabled]:hover{background-color:transparent}.mdl-menu__container.is-visible .mdl-menu__outline{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);z-index:999}.mdl-menu__outline.mdl-menu--bottom-right{-webkit-transform-origin:100% 0;-ms-transform-origin:100% 0;transform-origin:100% 0}.mdl-menu__outline.mdl-menu--top-left{-webkit-transform-origin:0 100%;-ms-transform-origin:0 100%;transform-origin:0 100%}.mdl-menu__outline.mdl-menu--top-right{-webkit-transform-origin:100% 100%;-ms-transform-origin:100% 100%;transform-origin:100% 100%}.mdl-menu{list-style:none;height:auto;width:auto;min-width:124px;padding:8px 0;margin:0;opacity:0;clip:rect(0 0 0 0);z-index:-1}.mdl-menu__container.is-visible .mdl-menu{opacity:1;z-index:999}.mdl-menu.is-animating{-webkit-transition:opacity .2s cubic-bezier(.4,0,.2,1),clip .3s cubic-bezier(.4,0,.2,1);transition:opacity .2s cubic-bezier(.4,0,.2,1),clip .3s cubic-bezier(.4,0,.2,1)}.mdl-menu.mdl-menu--bottom-right{left:auto;right:0}.mdl-menu.mdl-menu--top-left{top:auto;bottom:0}.mdl-menu.mdl-menu--top-right{top:auto;left:auto;bottom:0;right:0}.mdl-menu.mdl-menu--unaligned{top:auto;left:auto}.mdl-menu__item{color:rgba(0,0,0,.87);text-align:left;padding:0 16px;outline-color:#bdbdbd;position:relative;overflow:hidden;font-size:14px;font-weight:400;letter-spacing:0;text-decoration:none;cursor:pointer;height:48px;line-height:48px;white-space:nowrap;opacity:0;-webkit-transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity .2s cubic-bezier(.4,0,.2,1);user-select:none}.mdl-layout__tab-bar-button,.mdl-menu__item{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.mdl-menu__item:focus,.mdl-textfield.is-focused .mdl-textfield__input{outline:0}.mdl-menu__container.is-visible .mdl-menu__item{opacity:1}.mdl-menu__item::-moz-focus-inner{border:0}.mdl-menu__item[disabled]{color:#bdbdbd;cursor:auto}.mdl-menu__item[disabled] .mdl-ripple{background:0 0}.mdl-menu__item:focus,.mdl-menu__item:hover{background-color:#eee}.mdl-menu__item:active{background-color:#e0e0e0}.mdl-menu__item--ripple-container{display:block;height:100%;left:0;position:absolute;top:0;width:100%;z-index:0;overflow:hidden}.mdl-progress{display:block;position:relative;height:4px;width:500px}.mdl-progress>.bar{display:block;position:absolute;top:0;bottom:0;width:0;-webkit-transition:width .2s cubic-bezier(.4,0,.2,1);transition:width .2s cubic-bezier(.4,0,.2,1)}.mdl-layout,.mdl-navigation{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.mdl-progress>.progressbar{background-color:#3f51b5;z-index:1;left:0}.mdl-progress>.bufferbar{background-image:-webkit-linear-gradient(left,rgba(255,255,255,.7),rgba(255,255,255,.7)),-webkit-linear-gradient(left,#3f51b5,#3f51b5);background-image:linear-gradient(to right,rgba(255,255,255,.7),rgba(255,255,255,.7)),linear-gradient(to right,#3f51b5,#3f51b5);z-index:0;left:0}.mdl-progress>.auxbar{right:0}@supports (-webkit-appearance:none){.mdl-progress:not(.mdl-progress__indeterminate):not(.mdl-progress__indeterminate)>.auxbar{background-image:-webkit-linear-gradient(left,rgba(255,255,255,.7),rgba(255,255,255,.7)),-webkit-linear-gradient(left,#3f51b5,#3f51b5);background-image:linear-gradient(to right,rgba(255,255,255,.7),rgba(255,255,255,.7)),linear-gradient(to right,#3f51b5,#3f51b5);-webkit-mask:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIj8+Cjxzdmcgd2lkdGg9IjEyIiBoZWlnaHQ9IjQiIHZpZXdQb3J0PSIwIDAgMTIgNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxlbGxpcHNlIGN4PSIyIiBjeT0iMiIgcng9IjIiIHJ5PSIyIj4KICAgIDxhbmltYXRlIGF0dHJpYnV0ZU5hbWU9ImN4IiBmcm9tPSIyIiB0bz0iLTEwIiBkdXI9IjAuNnMiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiAvPgogIDwvZWxsaXBzZT4KICA8ZWxsaXBzZSBjeD0iMTQiIGN5PSIyIiByeD0iMiIgcnk9IjIiIGNsYXNzPSJsb2FkZXIiPgogICAgPGFuaW1hdGUgYXR0cmlidXRlTmFtZT0iY3giIGZyb209IjE0IiB0bz0iMiIgZHVyPSIwLjZzIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSIgLz4KICA8L2VsbGlwc2U+Cjwvc3ZnPgo=);mask:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIj8+Cjxzdmcgd2lkdGg9IjEyIiBoZWlnaHQ9IjQiIHZpZXdQb3J0PSIwIDAgMTIgNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxlbGxpcHNlIGN4PSIyIiBjeT0iMiIgcng9IjIiIHJ5PSIyIj4KICAgIDxhbmltYXRlIGF0dHJpYnV0ZU5hbWU9ImN4IiBmcm9tPSIyIiB0bz0iLTEwIiBkdXI9IjAuNnMiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiAvPgogIDwvZWxsaXBzZT4KICA8ZWxsaXBzZSBjeD0iMTQiIGN5PSIyIiByeD0iMiIgcnk9IjIiIGNsYXNzPSJsb2FkZXIiPgogICAgPGFuaW1hdGUgYXR0cmlidXRlTmFtZT0iY3giIGZyb209IjE0IiB0bz0iMiIgZHVyPSIwLjZzIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSIgLz4KICA8L2VsbGlwc2U+Cjwvc3ZnPgo=)}}.mdl-progress:not(.mdl-progress__indeterminate)>.auxbar{background-image:-webkit-linear-gradient(left,rgba(255,255,255,.9),rgba(255,255,255,.9)),-webkit-linear-gradient(left,#3f51b5,#3f51b5);background-image:linear-gradient(to right,rgba(255,255,255,.9),rgba(255,255,255,.9)),linear-gradient(to right,#3f51b5,#3f51b5)}.mdl-progress.mdl-progress__indeterminate>.bar1{background-color:#3f51b5;-webkit-animation-name:indeterminate1;animation-name:indeterminate1;animation-duration:2s;animation-iteration-count:infinite;animation-timing-function:linear}.mdl-progress.mdl-progress__indeterminate>.bar1,.mdl-progress.mdl-progress__indeterminate>.bar3{-webkit-animation-duration:2s;-webkit-animation-iteration-count:infinite;-webkit-animation-timing-function:linear}.mdl-progress.mdl-progress__indeterminate>.bar3{background-image:none;background-color:#3f51b5;-webkit-animation-name:indeterminate2;animation-name:indeterminate2;animation-duration:2s;animation-iteration-count:infinite;animation-timing-function:linear}@-webkit-keyframes indeterminate1{0%{left:0;width:0}50%{left:25%;width:75%}75%{left:100%;width:0}}@keyframes indeterminate1{0%{left:0;width:0}50%{left:25%;width:75%}75%{left:100%;width:0}}@-webkit-keyframes indeterminate2{0%,50%{left:0;width:0}75%{left:0;width:25%}100%{left:100%;width:0}}@keyframes indeterminate2{0%,50%{left:0;width:0}75%{left:0;width:25%}100%{left:100%;width:0}}.mdl-navigation{display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;box-sizing:border-box}.mdl-navigation__link{color:#424242;text-decoration:none;font-weight:500;font-size:13px;margin:0}.mdl-layout{width:100%;height:100%;display:flex;-webkit-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;overflow-y:auto;overflow-x:hidden;position:relative;-webkit-overflow-scrolling:touch}.mdl-layout.is-small-screen .mdl-layout--large-screen-only,.mdl-layout:not(.is-small-screen) .mdl-layout--small-screen-only{display:none}.mdl-layout__container{position:absolute;width:100%;height:100%}.mdl-layout-title{display:block;position:relative;font-family:Roboto,Helvetica,Arial,sans-serif;font-size:20px;line-height:1;letter-spacing:.02em;font-weight:400;box-sizing:border-box}.mdl-layout-spacer{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.mdl-layout__drawer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;width:240px;height:100%;max-height:100%;position:absolute;top:0;left:0;box-sizing:border-box;border-right:1px solid #e0e0e0;background:#fafafa;-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px);-webkit-transform-style:preserve-3d;transform-style:preserve-3d;will-change:transform;-webkit-transition-duration:.2s;transition-duration:.2s;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-property:-webkit-transform;transition-property:transform;color:#424242;overflow:visible;overflow-y:auto;z-index:5}.mdl-layout__drawer.is-visible{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}.mdl-layout__drawer>*{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.mdl-layout__drawer>.mdl-layout-title{line-height:64px;padding-left:40px}@media screen and (max-width:1024px){.mdl-layout__drawer>.mdl-layout-title{line-height:56px;padding-left:16px}}.mdl-layout__drawer .mdl-navigation{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;padding-top:16px}.mdl-layout__drawer .mdl-navigation .mdl-navigation__link{display:block;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;padding:16px 40px;margin:0;color:#757575}.mdl-layout__drawer .mdl-navigation .mdl-navigation__link:hover{background-color:#e0e0e0}.mdl-layout__drawer .mdl-navigation .mdl-navigation__link--current{background-color:#000;color:#3f51b5}.mdl-layout__drawer-button{display:block;position:absolute;height:48px;width:48px;border:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;overflow:hidden;text-align:center;cursor:pointer;font-size:26px;line-height:50px;font-family:Helvetica,Arial,sans-serif;margin:10px 12px;top:0;left:0;color:#fff;z-index:4}.mdl-layout__header .mdl-layout__drawer-button{position:absolute;color:#fff;background-color:inherit}@media screen and (max-width:1024px){.mdl-layout__drawer .mdl-navigation .mdl-navigation__link{padding:16px}.mdl-layout__header .mdl-layout__drawer-button{margin:4px}.mdl-layout__drawer-button{margin:4px;color:rgba(0,0,0,.5)}}@media screen and (min-width:1025px){.mdl-layout--fixed-drawer>.mdl-layout__drawer{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}.mdl-layout--fixed-drawer>.mdl-layout__drawer-button{display:none}}.mdl-layout__header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;box-sizing:border-box;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:100%;margin:0;padding:0;border:none;min-height:64px;max-height:1000px;z-index:3;background-color:#3f51b5;color:#fff;-webkit-transition-duration:.2s;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-property:max-height,box-shadow;transition-property:max-height,box-shadow}.mdl-layout__header,.mdl-layout__obfuscator{-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1)}.mdl-layout--fixed-drawer:not(.is-small-screen)>.mdl-layout__header{margin-left:240px;width:calc(100% - 240px)}.mdl-layout__header-row,.mdl-layout__header-row .mdl-navigation{-webkit-box-orient:horizontal;-webkit-box-direction:normal;margin:0}@media screen and (min-width:1024px){.mdl-layout--fixed-drawer>.mdl-layout__header .mdl-layout__header-row{padding-left:40px}}.mdl-layout__header>.mdl-layout-icon{position:absolute;left:40px;top:16px;height:32px;width:32px;overflow:hidden;z-index:3;display:block}.mdl-layout.has-drawer .mdl-layout__header>.mdl-layout-icon{display:none}.mdl-layout__header.is-compact{max-height:64px}.mdl-layout__header.is-compact.has-tabs{height:112px}@media screen and (max-width:1024px){.mdl-layout__header{min-height:56px;display:none}.mdl-layout__header>.mdl-layout-icon{left:16px;top:12px}.mdl-layout__header.is-compact{max-height:56px}.mdl-layout__header.is-compact.has-tabs{min-height:104px}.mdl-layout--fixed-header>.mdl-layout__header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}}.mdl-layout__header--transparent.mdl-layout__header--transparent{background-color:transparent;box-shadow:none}.mdl-layout__header--scroll,.mdl-layout__header--seamed{box-shadow:none}.mdl-layout__header--waterfall{box-shadow:none;overflow:hidden}.mdl-layout__header--waterfall.is-casting-shadow,.mdl-switch__thumb{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12)}.mdl-layout__header-row{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;box-sizing:border-box;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;height:64px;padding:0 40px 0 80px}@media screen and (max-width:1024px){.mdl-layout__header-row{height:56px;padding:0 16px 0 72px}}.mdl-layout__header-row>*{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.mdl-layout__header--scroll .mdl-layout__header-row{width:100%}.mdl-layout__header-row .mdl-navigation{padding:0;height:64px;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.mdl-layout__header-row .mdl-navigation__link{display:block;color:#fff;line-height:64px;padding:0 24px}@media screen and (max-width:1024px){.mdl-layout__header-row .mdl-navigation{height:56px}.mdl-layout__header-row .mdl-navigation__link{line-height:56px;padding:0 16px}}.mdl-layout__tab,.mdl-layout__tab-bar-button .material-icons{line-height:48px}.mdl-layout__obfuscator{background-color:transparent;position:absolute;top:0;left:0;height:100%;width:100%;z-index:4;visibility:hidden;-webkit-transition-property:background-color;transition-property:background-color;-webkit-transition-duration:.2s;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.mdl-layout__drawer.is-visible~.mdl-layout__obfuscator{background-color:rgba(0,0,0,.5);visibility:visible}.mdl-layout__content{-ms-flex:0 1 auto;display:inline-block;overflow-y:auto;overflow-x:hidden;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;z-index:1;-webkit-overflow-scrolling:touch}.mdl-layout--fixed-drawer>.mdl-layout__content{margin-left:240px}.mdl-layout__container.has-scrolling-header .mdl-layout__content{overflow:visible}@media screen and (max-width:1024px){.mdl-layout--fixed-drawer>.mdl-layout__content{margin-left:0}.mdl-layout__container.has-scrolling-header .mdl-layout__content{overflow-y:auto;overflow-x:hidden}}.mdl-layout__tab-bar{height:96px;margin:0;width:calc(100% - 112px);padding:0 0 0 56px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;background-color:#3f51b5;overflow-y:hidden;overflow-x:scroll}.mdl-layout__tab-bar::-webkit-scrollbar{display:none}@media screen and (max-width:1024px){.mdl-layout__tab-bar{width:calc(100% - 60px);padding:0 0 0 60px}}.mdl-layout--fixed-tabs .mdl-layout__tab-bar{padding:0;overflow:hidden;width:100%}.mdl-layout__tab-bar-container{position:relative;height:48px;width:100%;border:none;margin:0;z-index:2;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;overflow:hidden}.mdl-layout__container>.mdl-layout__tab-bar-container{position:absolute;top:0;left:0}.mdl-layout__tab-bar-button{display:inline-block;position:absolute;top:0;height:48px;width:56px;z-index:4;text-align:center;background-color:#3f51b5;color:transparent;cursor:pointer;user-select:none}@media screen and (max-width:1024px){.mdl-layout__tab-bar-button{display:none;width:60px}}.mdl-layout--fixed-tabs .mdl-layout__tab-bar-button{display:none}.mdl-layout__tab-bar-button.is-active{color:#fff}.mdl-layout__tab-bar-left-button{left:0}.mdl-layout__tab-bar-right-button{right:0}.mdl-layout__tab{margin:0;border:none;padding:0 24px;float:left;position:relative;display:block;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;height:48px;text-align:center;font-weight:500;font-size:14px;color:rgba(255,255,255,.6);overflow:hidden}.mdl-radio,.mdl-radio__button,.mdl-switch__input{line-height:24px}@media screen and (max-width:1024px){.mdl-layout__tab{padding:0 12px}}.mdl-layout--fixed-tabs .mdl-layout__tab{float:none;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:0}.mdl-layout.is-upgraded .mdl-layout__tab.is-active{color:#fff}.mdl-layout.is-upgraded .mdl-layout__tab.is-active::after{height:2px;width:100%;display:block;content:" ";bottom:0;left:0;position:absolute;background:#ff4081;-webkit-animation:border-expand .2s cubic-bezier(.4,0,.4,1) .01s alternate forwards;animation:border-expand .2s cubic-bezier(.4,0,.4,1) .01s alternate forwards;-webkit-transition:all 1s cubic-bezier(.4,0,1,1);transition:all 1s cubic-bezier(.4,0,1,1)}.mdl-layout__tab .mdl-layout__tab-ripple-container{display:block;position:absolute;height:100%;width:100%;left:0;top:0;z-index:1;overflow:hidden}.mdl-layout__tab .mdl-layout__tab-ripple-container .mdl-ripple{background-color:#fff}.mdl-layout__tab-panel{display:block}.mdl-layout.is-upgraded .mdl-layout__tab-panel{display:none}.mdl-layout.is-upgraded .mdl-layout__tab-panel.is-active{display:block}.mdl-radio,.mdl-radio__outer-circle{margin:0;box-sizing:border-box;display:inline-block}.mdl-radio{position:relative;font-size:16px;padding-left:0}.mdl-radio.is-upgraded{padding-left:24px}.mdl-radio.is-upgraded .mdl-radio__button{position:absolute;width:0;height:0;margin:0;padding:0;opacity:0;-ms-appearance:none;-moz-appearance:none;-webkit-appearance:none;appearance:none;border:none}.mdl-radio__outer-circle{position:absolute;top:4px;left:0;width:16px;height:16px;cursor:pointer;border:2px solid rgba(0,0,0,.54);border-radius:50%;z-index:2}.mdl-radio.is-checked .mdl-radio__outer-circle{border:2px solid #3f51b5}.mdl-radio.is-disabled .mdl-radio__outer-circle{border:2px solid rgba(0,0,0,.26);cursor:auto}.mdl-radio__inner-circle{position:absolute;z-index:1;margin:0;top:8px;left:4px;box-sizing:border-box;width:8px;height:8px;cursor:pointer;-webkit-transition-duration:.28s;transition-duration:.28s;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-property:-webkit-transform;transition-property:transform;-webkit-transform:scale3d(0,0,0);transform:scale3d(0,0,0);border-radius:50%;background:#3f51b5}.mdl-radio__ripple-container,.mdl-switch__ripple-container{box-sizing:border-box;z-index:2;-webkit-mask-image:-webkit-radial-gradient(circle,#fff,#000)}.mdl-radio.is-checked .mdl-radio__inner-circle{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}.mdl-radio.is-disabled .mdl-radio__inner-circle{background:rgba(0,0,0,.26);cursor:auto}.mdl-radio.is-focused .mdl-radio__inner-circle{box-shadow:0 0 0 10px rgba(0,0,0,.1)}.mdl-radio__label{cursor:pointer}.mdl-radio.is-disabled .mdl-radio__label{color:rgba(0,0,0,.26);cursor:auto}.mdl-radio__ripple-container{position:absolute;top:-9px;left:-13px;width:42px;height:42px;border-radius:50%;cursor:pointer;overflow:hidden}.mdl-radio__ripple-container .mdl-ripple{background:#3f51b5}.mdl-radio.is-disabled .mdl-radio__ripple-container{cursor:auto}.mdl-radio.is-disabled .mdl-radio__ripple-container .mdl-ripple{background:0 0}:root .mdl-slider.mdl-slider.is-upgraded,_:-ms-input-placeholder{-ms-appearance:none;height:32px;margin:0}.mdl-slider{width:calc(100% - 40px);margin:0 20px}.mdl-slider.is-upgraded{-webkit-appearance:none;-moz-appearance:none;appearance:none;height:2px;background:0 0;user-select:none;outline:0;padding:0;color:#3f51b5;-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;z-index:1;cursor:pointer}.mdl-slider.is-upgraded,.mdl-switch{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.mdl-slider.is-upgraded::-moz-focus-outer{border:0}.mdl-slider.is-upgraded::-ms-tooltip{display:none}.mdl-slider.is-upgraded::-webkit-slider-runnable-track{background:0 0}.mdl-slider.is-upgraded::-moz-range-track{background:0 0;border:none}.mdl-slider.is-upgraded::-ms-track{background:0 0;color:transparent;height:2px;width:100%;border:none}.mdl-slider.is-upgraded::-ms-fill-lower{padding:0;background:linear-gradient(to right,transparent,transparent 16px,#3f51b5 16px,#3f51b5 0)}.mdl-slider.is-upgraded::-ms-fill-upper{padding:0;background:linear-gradient(to left,transparent,transparent 16px,rgba(0,0,0,.26) 16px,rgba(0,0,0,.26) 0)}.mdl-slider.is-upgraded::-webkit-slider-thumb{-webkit-appearance:none;width:12px;height:12px;box-sizing:border-box;border-radius:50%;background:#3f51b5;border:none;-webkit-transition:-webkit-transform .18s cubic-bezier(.4,0,.2,1),border .18s cubic-bezier(.4,0,.2,1),box-shadow .18s cubic-bezier(.4,0,.2,1),background .28s cubic-bezier(.4,0,.2,1);transition:transform .18s cubic-bezier(.4,0,.2,1),border .18s cubic-bezier(.4,0,.2,1),box-shadow .18s cubic-bezier(.4,0,.2,1),background .28s cubic-bezier(.4,0,.2,1)}.mdl-slider.is-upgraded::-moz-range-thumb{-moz-appearance:none;width:12px;height:12px;box-sizing:border-box;border-radius:50%;background:#3f51b5;border:none}.mdl-slider.is-upgraded:focus:not(:active)::-webkit-slider-thumb{box-shadow:0 0 0 10px rgba(63,81,181,.26)}.mdl-slider.is-upgraded:focus:not(:active)::-moz-range-thumb{box-shadow:0 0 0 10px rgba(63,81,181,.26)}.mdl-slider.is-upgraded:active::-webkit-slider-thumb{background:#3f51b5;-webkit-transform:scale(1.5);transform:scale(1.5)}.mdl-slider.is-upgraded:active::-moz-range-thumb{background:#3f51b5;transform:scale(1.5)}.mdl-slider.is-upgraded::-ms-thumb{width:32px;height:32px;border:none;border-radius:50%;background:#3f51b5;-ms-transform:scale(.375);transform:scale(.375);transition:transform .18s cubic-bezier(.4,0,.2,1),background .28s cubic-bezier(.4,0,.2,1)}.mdl-slider.is-upgraded:focus:not(:active)::-ms-thumb{background:radial-gradient(circle closest-side,#3f51b5 0,#3f51b5 37.5%,rgba(63,81,181,.26) 37.5%,rgba(63,81,181,.26) 100%);-ms-transform:scale(1);transform:scale(1)}.mdl-slider.is-upgraded:active::-ms-thumb{background:#3f51b5;-ms-transform:scale(.5625);transform:scale(.5625)}.mdl-slider.is-upgraded.is-lowest-value::-webkit-slider-thumb{border:2px solid rgba(0,0,0,.26);background:0 0}.mdl-slider.is-upgraded.is-lowest-value::-moz-range-thumb{border:2px solid rgba(0,0,0,.26);background:0 0}.mdl-slider.is-upgraded.is-lowest-value~.mdl-slider__background-flex>.mdl-slider__background-upper{left:6px}.mdl-slider.is-upgraded.is-lowest-value:focus:not(:active)::-webkit-slider-thumb{box-shadow:0 0 0 10px rgba(0,0,0,.12);background:rgba(0,0,0,.12)}.mdl-slider.is-upgraded.is-lowest-value:focus:not(:active)::-moz-range-thumb{box-shadow:0 0 0 10px rgba(0,0,0,.12);background:rgba(0,0,0,.12)}.mdl-slider.is-upgraded.is-lowest-value:active::-webkit-slider-thumb{border:1.6px solid rgba(0,0,0,.26);-webkit-transform:scale(1.5);transform:scale(1.5)}.mdl-slider.is-upgraded.is-lowest-value:active~.mdl-slider__background-flex>.mdl-slider__background-upper{left:9px}.mdl-slider.is-upgraded.is-lowest-value:active::-moz-range-thumb{border:1.5px solid rgba(0,0,0,.26);transform:scale(1.5)}.mdl-slider.is-upgraded.is-lowest-value::-ms-thumb{background:radial-gradient(circle closest-side,transparent 0,transparent 66.67%,rgba(0,0,0,.26) 66.67%,rgba(0,0,0,.26) 100%)}.mdl-slider.is-upgraded.is-lowest-value:focus:not(:active)::-ms-thumb{background:radial-gradient(circle closest-side,rgba(0,0,0,.12) 0,rgba(0,0,0,.12) 25%,rgba(0,0,0,.26) 25%,rgba(0,0,0,.26) 37.5%,rgba(0,0,0,.12) 37.5%,rgba(0,0,0,.12) 100%);-ms-transform:scale(1);transform:scale(1)}.mdl-slider.is-upgraded.is-lowest-value:active::-ms-thumb{-ms-transform:scale(.5625);transform:scale(.5625);background:radial-gradient(circle closest-side,transparent 0,transparent 77.78%,rgba(0,0,0,.26) 77.78%,rgba(0,0,0,.26) 100%)}.mdl-slider.is-upgraded.is-lowest-value::-ms-fill-lower{background:0 0}.mdl-slider.is-upgraded.is-lowest-value::-ms-fill-upper{margin-left:6px}.mdl-slider.is-upgraded.is-lowest-value:active::-ms-fill-upper{margin-left:9px}.mdl-slider.is-upgraded:disabled::-webkit-slider-thumb,.mdl-slider.is-upgraded:disabled:active::-webkit-slider-thumb,.mdl-slider.is-upgraded:disabled:focus::-webkit-slider-thumb{-webkit-transform:scale(.667);transform:scale(.667);background:rgba(0,0,0,.26)}.mdl-slider.is-upgraded:disabled::-moz-range-thumb,.mdl-slider.is-upgraded:disabled:active::-moz-range-thumb,.mdl-slider.is-upgraded:disabled:focus::-moz-range-thumb{transform:scale(.667);background:rgba(0,0,0,.26)}.mdl-slider.is-upgraded:disabled~.mdl-slider__background-flex>.mdl-slider__background-lower{background-color:rgba(0,0,0,.26);left:-6px}.mdl-slider.is-upgraded.is-lowest-value:disabled:active~.mdl-slider__background-flex>.mdl-slider__background-upper,.mdl-slider.is-upgraded:disabled~.mdl-slider__background-flex>.mdl-slider__background-upper{left:6px}.mdl-slider.is-upgraded.is-lowest-value:disabled::-webkit-slider-thumb,.mdl-slider.is-upgraded.is-lowest-value:disabled:active::-webkit-slider-thumb,.mdl-slider.is-upgraded.is-lowest-value:disabled:focus::-webkit-slider-thumb{border:3px solid rgba(0,0,0,.26);background:0 0;-webkit-transform:scale(.667);transform:scale(.667)}.mdl-slider.is-upgraded.is-lowest-value:disabled::-moz-range-thumb,.mdl-slider.is-upgraded.is-lowest-value:disabled:active::-moz-range-thumb,.mdl-slider.is-upgraded.is-lowest-value:disabled:focus::-moz-range-thumb{border:3px solid rgba(0,0,0,.26);background:0 0;transform:scale(.667)}.mdl-slider.is-upgraded:disabled::-ms-thumb,.mdl-slider.is-upgraded:disabled:active::-ms-thumb,.mdl-slider.is-upgraded:disabled:focus::-ms-thumb{-ms-transform:scale(.25);transform:scale(.25);background:rgba(0,0,0,.26)}.mdl-slider.is-upgraded.is-lowest-value:disabled::-ms-thumb,.mdl-slider.is-upgraded.is-lowest-value:disabled:active::-ms-thumb,.mdl-slider.is-upgraded.is-lowest-value:disabled:focus::-ms-thumb{-ms-transform:scale(.25);transform:scale(.25);background:radial-gradient(circle closest-side,transparent 0,transparent 50%,rgba(0,0,0,.26) 50%,rgba(0,0,0,.26) 100%)}.mdl-slider.is-upgraded:disabled::-ms-fill-lower{margin-right:6px;background:linear-gradient(to right,transparent,transparent 25px,rgba(0,0,0,.26) 25px,rgba(0,0,0,.26) 0)}.mdl-slider__background-flex,.mdl-slider__container{background:0 0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.mdl-slider.is-upgraded:disabled::-ms-fill-upper{margin-left:6px}.mdl-slider.is-upgraded.is-lowest-value:disabled:active::-ms-fill-upper{margin-left:6px}.mdl-slider__ie-container{height:18px;overflow:visible;border:none;margin:none;padding:none}.mdl-slider__container{height:18px;position:relative;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.mdl-slider__background-flex{position:absolute;height:2px;width:calc(100% - 52px);top:50%;left:0;margin:0 26px;display:flex;overflow:hidden;border:0;padding:0;-webkit-transform:translate(0,-1px);-ms-transform:translate(0,-1px);transform:translate(0,-1px)}.mdl-slider__background-lower{background:#3f51b5;-webkit-box-flex:0;-webkit-flex:0;-ms-flex:0;flex:0;position:relative;border:0;padding:0}.mdl-slider__background-upper{background:rgba(0,0,0,.26);-webkit-box-flex:0;-webkit-flex:0;-ms-flex:0;flex:0;position:relative;border:0;padding:0;-webkit-transition:left .18s cubic-bezier(.4,0,.2,1);transition:left .18s cubic-bezier(.4,0,.2,1)}.mdl-spinner{display:inline-block;position:relative;width:28px;height:28px}.mdl-spinner:not(.is-upgraded).is-active:after{content:"Loading..."}.mdl-spinner.is-upgraded.is-active{-webkit-animation:mdl-spinner__container-rotate 1568.23529412ms linear infinite;animation:mdl-spinner__container-rotate 1568.23529412ms linear infinite}@-webkit-keyframes mdl-spinner__container-rotate{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes mdl-spinner__container-rotate{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.mdl-spinner__layer{position:absolute;width:100%;height:100%;opacity:0}.mdl-spinner__layer-1{border-color:#42a5f5}.mdl-spinner--single-color .mdl-spinner__layer-1{border-color:#3f51b5}.mdl-spinner.is-active .mdl-spinner__layer-1{-webkit-animation:mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,mdl-spinner__layer-1-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both;animation:mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,mdl-spinner__layer-1-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both}.mdl-spinner__layer-2{border-color:#f44336}.mdl-spinner--single-color .mdl-spinner__layer-2{border-color:#3f51b5}.mdl-spinner.is-active .mdl-spinner__layer-2{-webkit-animation:mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,mdl-spinner__layer-2-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both;animation:mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,mdl-spinner__layer-2-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both}.mdl-spinner__layer-3{border-color:#fdd835}.mdl-spinner--single-color .mdl-spinner__layer-3{border-color:#3f51b5}.mdl-spinner.is-active .mdl-spinner__layer-3{-webkit-animation:mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,mdl-spinner__layer-3-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both;animation:mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,mdl-spinner__layer-3-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both}.mdl-spinner__layer-4{border-color:#4caf50}.mdl-spinner--single-color .mdl-spinner__layer-4{border-color:#3f51b5}.mdl-spinner.is-active .mdl-spinner__layer-4{-webkit-animation:mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,mdl-spinner__layer-4-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both;animation:mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,mdl-spinner__layer-4-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both}@-webkit-keyframes mdl-spinner__fill-unfill-rotate{12.5%{-webkit-transform:rotate(135deg);transform:rotate(135deg)}25%{-webkit-transform:rotate(270deg);transform:rotate(270deg)}37.5%{-webkit-transform:rotate(405deg);transform:rotate(405deg)}50%{-webkit-transform:rotate(540deg);transform:rotate(540deg)}62.5%{-webkit-transform:rotate(675deg);transform:rotate(675deg)}75%{-webkit-transform:rotate(810deg);transform:rotate(810deg)}87.5%{-webkit-transform:rotate(945deg);transform:rotate(945deg)}to{-webkit-transform:rotate(1080deg);transform:rotate(1080deg)}}@keyframes mdl-spinner__fill-unfill-rotate{12.5%{-webkit-transform:rotate(135deg);transform:rotate(135deg)}25%{-webkit-transform:rotate(270deg);transform:rotate(270deg)}37.5%{-webkit-transform:rotate(405deg);transform:rotate(405deg)}50%{-webkit-transform:rotate(540deg);transform:rotate(540deg)}62.5%{-webkit-transform:rotate(675deg);transform:rotate(675deg)}75%{-webkit-transform:rotate(810deg);transform:rotate(810deg)}87.5%{-webkit-transform:rotate(945deg);transform:rotate(945deg)}to{-webkit-transform:rotate(1080deg);transform:rotate(1080deg)}}@-webkit-keyframes mdl-spinner__layer-1-fade-in-out{100%,25%,90%,from{opacity:.99}26%,89%{opacity:0}}@keyframes mdl-spinner__layer-1-fade-in-out{100%,25%,90%,from{opacity:.99}26%,89%{opacity:0}}@-webkit-keyframes mdl-spinner__layer-2-fade-in-out{15%,51%,from{opacity:0}25%,50%{opacity:.99}}@keyframes mdl-spinner__layer-2-fade-in-out{15%,51%,from{opacity:0}25%,50%{opacity:.99}}@-webkit-keyframes mdl-spinner__layer-3-fade-in-out{40%,76%,from{opacity:0}50%,75%{opacity:.99}}@keyframes mdl-spinner__layer-3-fade-in-out{40%,76%,from{opacity:0}50%,75%{opacity:.99}}@-webkit-keyframes mdl-spinner__layer-4-fade-in-out{100%,65%,from{opacity:0}75%,90%{opacity:.99}}@keyframes mdl-spinner__layer-4-fade-in-out{100%,65%,from{opacity:0}75%,90%{opacity:.99}}.mdl-spinner__gap-patch{position:absolute;box-sizing:border-box;top:0;left:45%;width:10%;height:100%;overflow:hidden;border-color:inherit}.mdl-spinner__gap-patch .mdl-spinner__circle{width:1000%;left:-450%}.mdl-spinner__circle-clipper{display:inline-block;position:relative;width:50%;height:100%;overflow:hidden;border-color:inherit}.mdl-spinner__circle-clipper .mdl-spinner__circle{width:200%}.mdl-spinner__circle{box-sizing:border-box;height:100%;border-width:3px;border-style:solid;border-color:inherit;border-bottom-color:transparent!important;border-radius:50%;-webkit-animation:none;animation:none;position:absolute;top:0;right:0;bottom:0;left:0}.mdl-spinner__left .mdl-spinner__circle{border-right-color:transparent!important;-webkit-transform:rotate(129deg);-ms-transform:rotate(129deg);transform:rotate(129deg)}.mdl-spinner.is-active .mdl-spinner__left .mdl-spinner__circle{-webkit-animation:mdl-spinner__left-spin 1333ms cubic-bezier(.4,0,.2,1) infinite both;animation:mdl-spinner__left-spin 1333ms cubic-bezier(.4,0,.2,1) infinite both}.mdl-spinner__right .mdl-spinner__circle{left:-100%;border-left-color:transparent!important;-webkit-transform:rotate(-129deg);-ms-transform:rotate(-129deg);transform:rotate(-129deg)}.mdl-spinner.is-active .mdl-spinner__right .mdl-spinner__circle{-webkit-animation:mdl-spinner__right-spin 1333ms cubic-bezier(.4,0,.2,1) infinite both;animation:mdl-spinner__right-spin 1333ms cubic-bezier(.4,0,.2,1) infinite both}@-webkit-keyframes mdl-spinner__left-spin{from,to{-webkit-transform:rotate(130deg);transform:rotate(130deg)}50%{-webkit-transform:rotate(-5deg);transform:rotate(-5deg)}}@keyframes mdl-spinner__left-spin{from,to{-webkit-transform:rotate(130deg);transform:rotate(130deg)}50%{-webkit-transform:rotate(-5deg);transform:rotate(-5deg)}}@-webkit-keyframes mdl-spinner__right-spin{from,to{-webkit-transform:rotate(-130deg);transform:rotate(-130deg)}50%{-webkit-transform:rotate(5deg);transform:rotate(5deg)}}@keyframes mdl-spinner__right-spin{from,to{-webkit-transform:rotate(-130deg);transform:rotate(-130deg)}50%{-webkit-transform:rotate(5deg);transform:rotate(5deg)}}.mdl-switch{position:relative;z-index:1;vertical-align:middle;display:inline-block;box-sizing:border-box;width:100%;height:24px;margin:0;padding:0;overflow:visible;-webkit-touch-callout:none;user-select:none}.mdl-switch.is-upgraded{padding-left:28px}.mdl-switch.is-upgraded .mdl-switch__input{position:absolute;width:0;height:0;margin:0;padding:0;opacity:0;-ms-appearance:none;-moz-appearance:none;-webkit-appearance:none;appearance:none;border:none}.mdl-switch__track{background:rgba(0,0,0,.26);position:absolute;left:0;top:5px;height:14px;width:36px;border-radius:14px;cursor:pointer}.mdl-switch.is-checked .mdl-switch__track{background:rgba(63,81,181,.5)}.mdl-switch.is-disabled .mdl-switch__track{background:rgba(0,0,0,.12);cursor:auto}.mdl-switch__thumb{background:#fafafa;position:absolute;left:0;top:2px;height:20px;width:20px;cursor:pointer;-webkit-transition-duration:.28s;transition-duration:.28s;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);transition-property:left}.mdl-switch__ripple-container,.mdl-switch__thumb{border-radius:50%;-webkit-transition-property:left}.mdl-switch.is-checked .mdl-switch__thumb{background:#3f51b5;left:16px;box-shadow:0 3px 4px 0 rgba(0,0,0,.14),0 3px 3px -2px rgba(0,0,0,.2),0 1px 8px 0 rgba(0,0,0,.12)}.mdl-switch.is-disabled .mdl-switch__thumb{background:#bdbdbd;cursor:auto}.mdl-switch__focus-helper{position:absolute;top:50%;left:50%;-webkit-transform:translate(-4px,-4px);-ms-transform:translate(-4px,-4px);transform:translate(-4px,-4px);display:inline-block;box-sizing:border-box;width:8px;height:8px;border-radius:50%;background-color:transparent}.mdl-switch.is-focused .mdl-switch__focus-helper{box-shadow:0 0 0 20px rgba(0,0,0,.1);background-color:rgba(0,0,0,.1)}.mdl-switch.is-focused.is-checked .mdl-switch__focus-helper{box-shadow:0 0 0 20px rgba(63,81,181,.26);background-color:rgba(63,81,181,.26)}.mdl-switch__label{position:relative;cursor:pointer;font-size:16px;line-height:24px;margin:0;left:24px}.mdl-switch.is-disabled .mdl-switch__label{color:#bdbdbd;cursor:auto}.mdl-switch__ripple-container{position:absolute;top:-12px;left:-14px;width:48px;height:48px;cursor:pointer;overflow:hidden;-webkit-transition-duration:.4s;transition-duration:.4s;-webkit-transition-timing-function:step-end;transition-timing-function:step-end;transition-property:left}.mdl-switch__ripple-container .mdl-ripple{background:#3f51b5}.mdl-switch.is-disabled .mdl-switch__ripple-container{cursor:auto}.mdl-switch.is-disabled .mdl-switch__ripple-container .mdl-ripple{background:0 0}.mdl-switch.is-checked .mdl-switch__ripple-container{cursor:auto;left:2px}.mdl-tabs{display:block;width:100%}.mdl-tabs__tab-bar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-content:space-between;-ms-flex-line-pack:justify;align-content:space-between;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;height:48px;padding:0;margin:0;border-bottom:1px solid #e0e0e0}.mdl-tabs__tab{margin:0;border:none;padding:0 24px;float:left;position:relative;display:block;color:red;height:48px;line-height:48px;text-align:center;font-weight:500;font-size:14px;color:rgba(0,0,0,.54);overflow:hidden}.mdl-tabs.is-upgraded .mdl-tabs__tab.is-active{color:rgba(0,0,0,.87)}.mdl-tabs.is-upgraded .mdl-tabs__tab.is-active:after{height:2px;width:100%;display:block;content:" ";bottom:0;left:0;position:absolute;background:#3f51b5;-webkit-animation:border-expand .2s cubic-bezier(.4,0,.4,1) .01s alternate forwards;animation:border-expand .2s cubic-bezier(.4,0,.4,1) .01s alternate forwards;-webkit-transition:all 1s cubic-bezier(.4,0,1,1);transition:all 1s cubic-bezier(.4,0,1,1)}.mdl-tabs__tab .mdl-tabs__ripple-container{display:block;position:absolute;height:100%;width:100%;left:0;top:0;z-index:1;overflow:hidden}.mdl-tabs__tab .mdl-tabs__ripple-container .mdl-ripple{background:#3f51b5}.mdl-tabs__panel{display:block}.mdl-tabs.is-upgraded .mdl-tabs__panel{display:none}.mdl-tabs.is-upgraded .mdl-tabs__panel.is-active{display:block}@-webkit-keyframes border-expand{0%{opacity:0;width:0}100%{opacity:1;width:100%}}@keyframes border-expand{0%{opacity:0;width:0}100%{opacity:1;width:100%}}.mdl-textfield{position:relative;font-size:16px;display:inline-block;box-sizing:border-box;width:300px;max-width:100%;margin:0;padding:20px 0}.mdl-textfield .mdl-button{position:absolute;bottom:20px}.mdl-textfield--align-right{text-align:right}.mdl-textfield--full-width{width:100%}.mdl-textfield--expandable{min-width:32px;width:auto;min-height:32px}.mdl-textfield__input,.mdl-textfield__label{display:block;font-size:16px;width:100%;text-align:left}.mdl-textfield__input{border:none;border-bottom:1px solid rgba(0,0,0,.12);margin:0;padding:4px 0;color:inherit}.mdl-textfield.is-disabled.is-disabled .mdl-textfield__label,.mdl-textfield__label{color:rgba(0,0,0,.26)}.mdl-textfield.is-invalid .mdl-textfield__input{border-color:#de3226;box-shadow:none}.mdl-textfield.is-disabled .mdl-textfield__input{background-color:transparent;border-bottom:1px dotted rgba(0,0,0,.12);color:rgba(0,0,0,.26)}.mdl-textfield textarea.mdl-textfield__input{display:block}.mdl-textfield__label{bottom:0;left:0;right:0;pointer-events:none;position:absolute;top:24px;overflow:hidden;white-space:nowrap}.mdl-textfield.is-dirty .mdl-textfield__label{visibility:hidden}.mdl-textfield--floating-label .mdl-textfield__label{-webkit-transition-duration:.2s;transition-duration:.2s;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1)}.mdl-textfield--floating-label.is-dirty .mdl-textfield__label,.mdl-textfield--floating-label.is-focused .mdl-textfield__label{color:#3f51b5;font-size:12px;top:4px;visibility:visible}.mdl-textfield--floating-label.is-invalid .mdl-textfield__label,.mdl-textfield__error{color:#de3226;font-size:12px}.mdl-textfield--floating-label.is-dirty .mdl-textfield__expandable-holder .mdl-textfield__label,.mdl-textfield--floating-label.is-focused .mdl-textfield__expandable-holder .mdl-textfield__label{top:-16px}.mdl-textfield__label:after{background-color:#3f51b5;bottom:20px;content:'';height:2px;left:45%;position:absolute;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1);visibility:hidden;width:10px}.mdl-textfield__expandable-holder,.mdl-textfield__label:after{-webkit-transition-duration:.2s;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1)}.mdl-textfield.is-focused .mdl-textfield__label:after{left:0;visibility:visible;width:100%}.mdl-textfield.is-invalid .mdl-textfield__label:after{background-color:#de3226}.mdl-textfield__error{position:absolute;margin-top:3px;visibility:hidden;display:block}.mdl-textfield.is-invalid .mdl-textfield__error{visibility:visible}.mdl-textfield__expandable-holder{position:relative;margin-left:32px;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1);display:inline-block;max-width:.1px}.mdl-textfield.is-dirty .mdl-textfield__expandable-holder,.mdl-textfield.is-focused .mdl-textfield__expandable-holder{max-width:600px}.mdl-textfield__expandable-holder .mdl-textfield__label:after{bottom:0}.mdl-tooltip{-webkit-transform:scale(0);-ms-transform:scale(0);transform:scale(0);-webkit-transform-origin:top center;-ms-transform-origin:top center;transform-origin:top center;will-change:transform;z-index:999;background:rgba(97,97,97,.9);border-radius:2px;color:#fff;display:inline-block;font-size:10px;font-weight:500;line-height:14px;max-width:170px;position:fixed;top:-500px;left:-500px;padding:8px;text-align:center}.mdl-tooltip.is-active{-webkit-animation:pulse 200ms cubic-bezier(0,0,.2,1) forwards;animation:pulse 200ms cubic-bezier(0,0,.2,1) forwards}.mdl-tooltip--large{line-height:14px;font-size:14px;padding:16px}@-webkit-keyframes pulse{0%{-webkit-transform:scale(0);transform:scale(0);opacity:0}50%{-webkit-transform:scale(.99);transform:scale(.99)}100%{-webkit-transform:scale(1);transform:scale(1);opacity:1;visibility:visible}}@keyframes pulse{0%{-webkit-transform:scale(0);transform:scale(0);opacity:0}50%{-webkit-transform:scale(.99);transform:scale(.99)}100%{-webkit-transform:scale(1);transform:scale(1);opacity:1;visibility:visible}}.mdl-shadow--2dp{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12)}.mdl-shadow--3dp{box-shadow:0 3px 4px 0 rgba(0,0,0,.14),0 3px 3px -2px rgba(0,0,0,.2),0 1px 8px 0 rgba(0,0,0,.12)}.mdl-shadow--4dp{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.2)}.mdl-shadow--6dp{box-shadow:0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12),0 3px 5px -1px rgba(0,0,0,.2)}.mdl-shadow--8dp{box-shadow:0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.2)}.mdl-shadow--16dp{box-shadow:0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12),0 8px 10px -5px rgba(0,0,0,.2)}.mdl-grid{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap;margin:0 auto;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch}.mdl-grid.mdl-grid--no-spacing{padding:0}.mdl-cell{box-sizing:border-box}.mdl-cell--top{-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start}.mdl-cell--middle{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center}.mdl-cell--bottom{-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end}.mdl-cell--stretch{-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch}.mdl-grid.mdl-grid--no-spacing>.mdl-cell{margin:0}@media (max-width:479px){.mdl-grid{padding:8px}.mdl-cell{margin:8px;width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell{width:100%}.mdl-cell--hide-phone{display:none!important}.mdl-cell--1-col,.mdl-cell--1-col-phone.mdl-cell--1-col-phone{width:calc(25% - 16px)}.mdl-grid--no-spacing>.mdl-cell--1-col,.mdl-grid--no-spacing>.mdl-cell--1-col-phone.mdl-cell--1-col-phone{width:25%}.mdl-cell--2-col,.mdl-cell--2-col-phone.mdl-cell--2-col-phone{width:calc(50% - 16px)}.mdl-grid--no-spacing>.mdl-cell--2-col,.mdl-grid--no-spacing>.mdl-cell--2-col-phone.mdl-cell--2-col-phone{width:50%}.mdl-cell--3-col,.mdl-cell--3-col-phone.mdl-cell--3-col-phone{width:calc(75% - 16px)}.mdl-grid--no-spacing>.mdl-cell--3-col,.mdl-grid--no-spacing>.mdl-cell--3-col-phone.mdl-cell--3-col-phone{width:75%}.mdl-cell--4-col,.mdl-cell--4-col-phone.mdl-cell--4-col-phone{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--4-col,.mdl-grid--no-spacing>.mdl-cell--4-col-phone.mdl-cell--4-col-phone{width:100%}.mdl-cell--5-col,.mdl-cell--5-col-phone.mdl-cell--5-col-phone{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--5-col,.mdl-grid--no-spacing>.mdl-cell--5-col-phone.mdl-cell--5-col-phone{width:100%}.mdl-cell--6-col,.mdl-cell--6-col-phone.mdl-cell--6-col-phone{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--6-col,.mdl-grid--no-spacing>.mdl-cell--6-col-phone.mdl-cell--6-col-phone{width:100%}.mdl-cell--7-col,.mdl-cell--7-col-phone.mdl-cell--7-col-phone{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--7-col,.mdl-grid--no-spacing>.mdl-cell--7-col-phone.mdl-cell--7-col-phone{width:100%}.mdl-cell--8-col,.mdl-cell--8-col-phone.mdl-cell--8-col-phone{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--8-col,.mdl-grid--no-spacing>.mdl-cell--8-col-phone.mdl-cell--8-col-phone{width:100%}.mdl-cell--9-col,.mdl-cell--9-col-phone.mdl-cell--9-col-phone{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--9-col,.mdl-grid--no-spacing>.mdl-cell--9-col-phone.mdl-cell--9-col-phone{width:100%}.mdl-cell--10-col,.mdl-cell--10-col-phone.mdl-cell--10-col-phone{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--10-col,.mdl-grid--no-spacing>.mdl-cell--10-col-phone.mdl-cell--10-col-phone{width:100%}.mdl-cell--11-col,.mdl-cell--11-col-phone.mdl-cell--11-col-phone{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--11-col,.mdl-grid--no-spacing>.mdl-cell--11-col-phone.mdl-cell--11-col-phone{width:100%}.mdl-cell--12-col,.mdl-cell--12-col-phone.mdl-cell--12-col-phone{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--12-col,.mdl-grid--no-spacing>.mdl-cell--12-col-phone.mdl-cell--12-col-phone{width:100%}}@media (min-width:480px) and (max-width:839px){.mdl-grid{padding:8px}.mdl-cell{margin:8px;width:calc(50% - 16px)}.mdl-grid--no-spacing>.mdl-cell{width:50%}.mdl-cell--hide-tablet{display:none!important}.mdl-cell--1-col,.mdl-cell--1-col-tablet.mdl-cell--1-col-tablet{width:calc(12.5% - 16px)}.mdl-grid--no-spacing>.mdl-cell--1-col,.mdl-grid--no-spacing>.mdl-cell--1-col-tablet.mdl-cell--1-col-tablet{width:12.5%}.mdl-cell--2-col,.mdl-cell--2-col-tablet.mdl-cell--2-col-tablet{width:calc(25% - 16px)}.mdl-grid--no-spacing>.mdl-cell--2-col,.mdl-grid--no-spacing>.mdl-cell--2-col-tablet.mdl-cell--2-col-tablet{width:25%}.mdl-cell--3-col,.mdl-cell--3-col-tablet.mdl-cell--3-col-tablet{width:calc(37.5% - 16px)}.mdl-grid--no-spacing>.mdl-cell--3-col,.mdl-grid--no-spacing>.mdl-cell--3-col-tablet.mdl-cell--3-col-tablet{width:37.5%}.mdl-cell--4-col,.mdl-cell--4-col-tablet.mdl-cell--4-col-tablet{width:calc(50% - 16px)}.mdl-grid--no-spacing>.mdl-cell--4-col,.mdl-grid--no-spacing>.mdl-cell--4-col-tablet.mdl-cell--4-col-tablet{width:50%}.mdl-cell--5-col,.mdl-cell--5-col-tablet.mdl-cell--5-col-tablet{width:calc(62.5% - 16px)}.mdl-grid--no-spacing>.mdl-cell--5-col,.mdl-grid--no-spacing>.mdl-cell--5-col-tablet.mdl-cell--5-col-tablet{width:62.5%}.mdl-cell--6-col,.mdl-cell--6-col-tablet.mdl-cell--6-col-tablet{width:calc(75% - 16px)}.mdl-grid--no-spacing>.mdl-cell--6-col,.mdl-grid--no-spacing>.mdl-cell--6-col-tablet.mdl-cell--6-col-tablet{width:75%}.mdl-cell--7-col,.mdl-cell--7-col-tablet.mdl-cell--7-col-tablet{width:calc(87.5% - 16px)}.mdl-grid--no-spacing>.mdl-cell--7-col,.mdl-grid--no-spacing>.mdl-cell--7-col-tablet.mdl-cell--7-col-tablet{width:87.5%}.mdl-cell--8-col,.mdl-cell--8-col-tablet.mdl-cell--8-col-tablet{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--8-col,.mdl-grid--no-spacing>.mdl-cell--8-col-tablet.mdl-cell--8-col-tablet{width:100%}.mdl-cell--9-col,.mdl-cell--9-col-tablet.mdl-cell--9-col-tablet{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--9-col,.mdl-grid--no-spacing>.mdl-cell--9-col-tablet.mdl-cell--9-col-tablet{width:100%}.mdl-cell--10-col,.mdl-cell--10-col-tablet.mdl-cell--10-col-tablet{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--10-col,.mdl-grid--no-spacing>.mdl-cell--10-col-tablet.mdl-cell--10-col-tablet{width:100%}.mdl-cell--11-col,.mdl-cell--11-col-tablet.mdl-cell--11-col-tablet{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--11-col,.mdl-grid--no-spacing>.mdl-cell--11-col-tablet.mdl-cell--11-col-tablet{width:100%}.mdl-cell--12-col,.mdl-cell--12-col-tablet.mdl-cell--12-col-tablet{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--12-col,.mdl-grid--no-spacing>.mdl-cell--12-col-tablet.mdl-cell--12-col-tablet{width:100%}}@media (min-width:840px){.mdl-grid{padding:8px}.mdl-cell{margin:8px;width:calc(33.3333333333% - 16px)}.mdl-grid--no-spacing>.mdl-cell{width:33.3333333333%}.mdl-cell--hide-desktop{display:none!important}.mdl-cell--1-col,.mdl-cell--1-col-desktop.mdl-cell--1-col-desktop{width:calc(8.3333333333% - 16px)}.mdl-grid--no-spacing>.mdl-cell--1-col,.mdl-grid--no-spacing>.mdl-cell--1-col-desktop.mdl-cell--1-col-desktop{width:8.3333333333%}.mdl-cell--2-col,.mdl-cell--2-col-desktop.mdl-cell--2-col-desktop{width:calc(16.6666666667% - 16px)}.mdl-grid--no-spacing>.mdl-cell--2-col,.mdl-grid--no-spacing>.mdl-cell--2-col-desktop.mdl-cell--2-col-desktop{width:16.6666666667%}.mdl-cell--3-col,.mdl-cell--3-col-desktop.mdl-cell--3-col-desktop{width:calc(25% - 16px)}.mdl-grid--no-spacing>.mdl-cell--3-col,.mdl-grid--no-spacing>.mdl-cell--3-col-desktop.mdl-cell--3-col-desktop{width:25%}.mdl-cell--4-col,.mdl-cell--4-col-desktop.mdl-cell--4-col-desktop{width:calc(33.3333333333% - 16px)}.mdl-grid--no-spacing>.mdl-cell--4-col,.mdl-grid--no-spacing>.mdl-cell--4-col-desktop.mdl-cell--4-col-desktop{width:33.3333333333%}.mdl-cell--5-col,.mdl-cell--5-col-desktop.mdl-cell--5-col-desktop{width:calc(41.6666666667% - 16px)}.mdl-grid--no-spacing>.mdl-cell--5-col,.mdl-grid--no-spacing>.mdl-cell--5-col-desktop.mdl-cell--5-col-desktop{width:41.6666666667%}.mdl-cell--6-col,.mdl-cell--6-col-desktop.mdl-cell--6-col-desktop{width:calc(50% - 16px)}.mdl-grid--no-spacing>.mdl-cell--6-col,.mdl-grid--no-spacing>.mdl-cell--6-col-desktop.mdl-cell--6-col-desktop{width:50%}.mdl-cell--7-col,.mdl-cell--7-col-desktop.mdl-cell--7-col-desktop{width:calc(58.3333333333% - 16px)}.mdl-grid--no-spacing>.mdl-cell--7-col,.mdl-grid--no-spacing>.mdl-cell--7-col-desktop.mdl-cell--7-col-desktop{width:58.3333333333%}.mdl-cell--8-col,.mdl-cell--8-col-desktop.mdl-cell--8-col-desktop{width:calc(66.6666666667% - 16px)}.mdl-grid--no-spacing>.mdl-cell--8-col,.mdl-grid--no-spacing>.mdl-cell--8-col-desktop.mdl-cell--8-col-desktop{width:66.6666666667%}.mdl-cell--9-col,.mdl-cell--9-col-desktop.mdl-cell--9-col-desktop{width:calc(75% - 16px)}.mdl-grid--no-spacing>.mdl-cell--9-col,.mdl-grid--no-spacing>.mdl-cell--9-col-desktop.mdl-cell--9-col-desktop{width:75%}.mdl-cell--10-col,.mdl-cell--10-col-desktop.mdl-cell--10-col-desktop{width:calc(83.3333333333% - 16px)}.mdl-grid--no-spacing>.mdl-cell--10-col,.mdl-grid--no-spacing>.mdl-cell--10-col-desktop.mdl-cell--10-col-desktop{width:83.3333333333%}.mdl-cell--11-col,.mdl-cell--11-col-desktop.mdl-cell--11-col-desktop{width:calc(91.6666666667% - 16px)}.mdl-grid--no-spacing>.mdl-cell--11-col,.mdl-grid--no-spacing>.mdl-cell--11-col-desktop.mdl-cell--11-col-desktop{width:91.6666666667%}.mdl-cell--12-col,.mdl-cell--12-col-desktop.mdl-cell--12-col-desktop{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--12-col,.mdl-grid--no-spacing>.mdl-cell--12-col-desktop.mdl-cell--12-col-desktop{width:100%}} \ No newline at end of file diff --git a/public/vendor/slideout/slideout.min.js b/public/vendor/slideout/slideout.min.js index e381bf02ff..8827fb5a48 100644 --- a/public/vendor/slideout/slideout.min.js +++ b/public/vendor/slideout/slideout.min.js @@ -1 +1 @@ -!function(t){var e;"undefined"!=typeof window?e=window:"undefined"!=typeof global?e=global:"undefined"!=typeof self&&(e=self),e.Slideout=t()}(function(){var t,e,n;return function i(t,e,n){function o(s,a){if(!e[s]){if(!t[s]){var u=typeof require=="function"&&require;if(!a&&u)return u(s,!0);if(r)return r(s,!0);var f=new Error("Cannot find module '"+s+"'");throw f.code="MODULE_NOT_FOUND",f}var l=e[s]={exports:{}};t[s][0].call(l.exports,function(e){var n=t[s][1][e];return o(n?n:e)},l,l.exports,i,t,e,n)}return e[s].exports}var r=typeof require=="function"&&require;for(var s=0;st._tolerance?t.open():t.close()}t._moved=false});this.panel.addEventListener(l.move,function(e){if(s||t._preventOpen||typeof e.touches==="undefined"){return}var n=e.touches[0].clientX-t._startOffsetX;var i=t._currentOffsetX=n;if(Math.abs(i)>t._padding){return}if(Math.abs(n)>20){t._opening=true;var o=n*t._orientation;if(t._opened&&o>0||!t._opened&&o<0){return}if(o<=0){i=n+t._padding*t._orientation;t._opening=false}if(!t._moved&&u.className.search("slideout-open")===-1){u.className+=" slideout-open"}t.panel.style[p+"transform"]=t.panel.style.transform="translate3d("+i+"px, 0, 0)";t.emit("translate",i);t._moved=true}})};e.exports=d},{decouple:2,emitter:3}],2:[function(t,e,n){"use strict";var i=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}();function o(t,e,n){var o,r=false;function s(t){o=t;a()}function a(){if(!r){i(u);r=true}}function u(){n.call(t,o);r=false}t.addEventListener(e,s,false)}e.exports=o},{}],3:[function(t,e,n){"use strict";var i=function(t,e){if(!(t instanceof e)){throw new TypeError("Cannot call a class as a function")}};n.__esModule=true;var o=function(){function t(){i(this,t)}t.prototype.on=function e(t,n){this._eventCollection=this._eventCollection||{};this._eventCollection[t]=this._eventCollection[t]||[];this._eventCollection[t].push(n);return this};t.prototype.once=function n(t,e){var n=this;function i(){n.off(t,i);e.apply(this,arguments)}i.listener=e;this.on(t,i);return this};t.prototype.off=function o(t,e){var n=undefined;if(!this._eventCollection||!(n=this._eventCollection[t])){return this}n.forEach(function(t,i){if(t===e||t.listener===e){n.splice(i,1)}});if(n.length===0){delete this._eventCollection[t]}return this};t.prototype.emit=function r(t){var e=this;for(var n=arguments.length,i=Array(n>1?n-1:0),o=1;ot._tolerance?t.open():t.close()}t._moved=false};this.panel.addEventListener(f.end,this._onTouchEndFn);this._onTouchMoveFn=function(e){if(r||t._preventOpen||typeof e.touches==="undefined"||d(e.target)){return}var n=e.touches[0].clientX-t._startOffsetX;var i=t._currentOffsetX=n;if(Math.abs(i)>t._padding){return}if(Math.abs(n)>20){t._opening=true;var o=n*t._orientation;if(t._opened&&o>0||!t._opened&&o<0){return}if(!t._moved){t.emit("translatestart")}if(o<=0){i=n+t._padding*t._orientation;t._opening=false}if(!(t._moved&&u.classList.contains("slideout-open"))){u.classList.add("slideout-open")}t.panel.style[h+"transform"]=t.panel.style.transform="translateX("+i+"px)";t.emit("translate",i);t._moved=true}};this.panel.addEventListener(f.move,this._onTouchMoveFn);return this};_.prototype.enableTouch=function(){this._touch=true;return this};_.prototype.disableTouch=function(){this._touch=false;return this};_.prototype.destroy=function(){this.close();a.removeEventListener(f.move,this._preventMove);this.panel.removeEventListener(f.start,this._resetTouchFn);this.panel.removeEventListener("touchcancel",this._onTouchCancelFn);this.panel.removeEventListener(f.end,this._onTouchEndFn);this.panel.removeEventListener(f.move,this._onTouchMoveFn);a.removeEventListener("scroll",this._onScrollFn);this.open=this.close=function(){};return this};e.exports=_},{decouple:2,emitter:3}],2:[function(t,e,n){"use strict";var i=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}();function o(t,e,n){var o,s=false;function r(t){o=t;a()}function a(){if(!s){i(u);s=true}}function u(){n.call(t,o);s=false}t.addEventListener(e,r,false);return r}e.exports=o},{}],3:[function(t,e,n){"use strict";var i=function(t,e){if(!(t instanceof e)){throw new TypeError("Cannot call a class as a function")}};n.__esModule=true;var o=function(){function t(){i(this,t)}t.prototype.on=function e(t,n){this._eventCollection=this._eventCollection||{};this._eventCollection[t]=this._eventCollection[t]||[];this._eventCollection[t].push(n);return this};t.prototype.once=function n(t,e){var n=this;function i(){n.off(t,i);e.apply(this,arguments)}i.listener=e;this.on(t,i);return this};t.prototype.off=function o(t,e){var n=undefined;if(!this._eventCollection||!(n=this._eventCollection[t])){return this}n.forEach(function(t,i){if(t===e||t.listener===e){n.splice(i,1)}});if(n.length===0){delete this._eventCollection[t]}return this};t.prototype.emit=function s(t){var e=this;for(var n=arguments.length,i=Array(n>1?n-1:0),o=1;o 0 && allowed.indexOf(extension) === -1)) { return callback(new Error('[[error:invalid-file-type, ' + allowed.join(', ') + ']]')); } @@ -207,7 +221,7 @@ function uploadFile(uid, uploadedFile, callback) { } function saveFileToLocal(uploadedFile, callback) { - var extension = typeToExtension(uploadedFile.type); + var extension = file.typeToExtension(uploadedFile.type); if (!extension) { return callback(new Error('[[error:invalid-extension]]')); } @@ -215,25 +229,18 @@ function saveFileToLocal(uploadedFile, callback) { filename = Date.now() + '-' + validator.escape(filename.replace(path.extname(uploadedFile.name) || '', '')).substr(0, 255) + extension; - file.saveFileToLocal(filename, 'files', uploadedFile.path, function (err, upload) { - if (err) { - return callback(err); + async.waterfall([ + function (next) { + file.saveFileToLocal(filename, 'files', uploadedFile.path, next); + }, + function (upload, next) { + next(null, { + url: nconf.get('relative_path') + upload.url, + path: upload.path, + name: uploadedFile.name + }); } - - callback(null, { - url: nconf.get('relative_path') + upload.url, - path: upload.path, - name: uploadedFile.name - }); - }); -} - -function typeToExtension(type) { - var extension; - if (type) { - extension = '.' + mime.extension(type); - } - return extension; + ], callback); } function deleteTempFiles(files) { @@ -247,6 +254,4 @@ function deleteTempFiles(files) { }); } - - module.exports = uploadsController; diff --git a/src/coverPhoto.js b/src/coverPhoto.js index 7965f310ea..6307110253 100644 --- a/src/coverPhoto.js +++ b/src/coverPhoto.js @@ -26,7 +26,7 @@ function getCover(type, id) { return covers[id]; } - return nconf.get('relative_path') + '/images/cover-default.png'; + return nconf.get('relative_path') + '/assets/images/cover-default.png'; } module.exports = coverPhoto; diff --git a/src/file.js b/src/file.js index df820cc47f..afdcef82bf 100644 --- a/src/file.js +++ b/src/file.js @@ -5,6 +5,8 @@ var nconf = require('nconf'); var path = require('path'); var winston = require('winston'); var jimp = require('jimp'); +var mkdirp = require('mkdirp'); +var mime = require('mime'); var utils = require('../public/src/utils'); @@ -12,35 +14,39 @@ var file = {}; file.saveFileToLocal = function (filename, folder, tempPath, callback) { /* - * remarkable doesn't allow spaces in hyperlinks, once that's fixed, remove this. - */ + * remarkable doesn't allow spaces in hyperlinks, once that's fixed, remove this. + */ filename = filename.split('.'); filename.forEach(function (name, idx) { filename[idx] = utils.slugify(name); }); filename = filename.join('.'); - var uploadPath = path.join(nconf.get('base_dir'), nconf.get('upload_path'), folder, filename); + var uploadPath = path.join(nconf.get('upload_path'), folder, filename); winston.verbose('Saving file ' + filename + ' to : ' + uploadPath); + mkdirp(path.dirname(uploadPath), function (err) { + if (err) { + callback(err); + } - var is = fs.createReadStream(tempPath); - var os = fs.createWriteStream(uploadPath); - is.on('end', function () { - callback(null, { - url: nconf.get('upload_url') + '/' + folder + '/' + filename, - path: uploadPath + var is = fs.createReadStream(tempPath); + var os = fs.createWriteStream(uploadPath); + is.on('end', function () { + callback(null, { + url: '/assets/uploads/' + folder + '/' + filename, + path: uploadPath + }); }); + + os.on('error', callback); + is.pipe(os); }); - - os.on('error', callback); - - is.pipe(os); }; file.base64ToLocal = function (imageData, uploadPath, callback) { var buffer = new Buffer(imageData.slice(imageData.indexOf('base64') + 7), 'base64'); - uploadPath = path.join(nconf.get('base_dir'), nconf.get('upload_path'), uploadPath); + uploadPath = path.join(nconf.get('upload_path'), uploadPath); fs.writeFile(uploadPath, buffer, { encoding: 'base64' @@ -95,11 +101,34 @@ file.existsSync = function (path) { var exists = false; try { exists = fs.statSync(path); - } catch(err) { + } + catch (err) { exists = false; } return !!exists; }; +file.link = function link(filePath, destPath, cb) { + if (process.platform === 'win32') { + fs.link(filePath, destPath, cb); + } + else { + fs.symlink(filePath, destPath, 'file', cb); + } +}; + +file.linkDirs = function linkDirs(sourceDir, destDir, callback) { + var type = (process.platform === 'win32') ? 'junction' : 'dir'; + fs.symlink(sourceDir, destDir, type, callback); +}; + +file.typeToExtension = function (type) { + var extension; + if (type) { + extension = '.' + mime.extension(type); + } + return extension; +}; + module.exports = file; diff --git a/src/groups/cover.js b/src/groups/cover.js index 65ff0368cb..8f18c60ad7 100644 --- a/src/groups/cover.js +++ b/src/groups/cover.js @@ -10,6 +10,7 @@ var mime = require('mime'); var winston = require('winston'); var db = require('../database'); +var image = require('../image'); var uploadsController = require('../controllers/uploads'); module.exports = function (Groups) { @@ -37,7 +38,7 @@ module.exports = function (Groups) { if (tempPath) { return next(null, tempPath); } - writeImageDataToFile(data.imageData, next); + image.writeImageDataToTempFile(data.imageData, next); }, function (_tempPath, next) { tempPath = _tempPath; @@ -97,24 +98,6 @@ module.exports = function (Groups) { }); } - function writeImageDataToFile(imageData, callback) { - // Calculate md5sum of image - // This is required because user data can be private - var md5sum = crypto.createHash('md5'); - md5sum.update(imageData); - md5sum = md5sum.digest('hex'); - - // Save image - var tempPath = path.join(nconf.get('base_dir'), nconf.get('upload_path'), md5sum) + '.png'; - var buffer = new Buffer(imageData.slice(imageData.indexOf('base64') + 7), 'base64'); - - fs.writeFile(tempPath, buffer, { - encoding: 'base64' - }, function (err) { - callback(err, tempPath); - }); - } - Groups.removeCover = function (data, callback) { db.deleteObjectFields('group:' + data.groupName, ['cover:url', 'cover:thumb:url', 'cover:position'], callback); }; diff --git a/src/groups/membership.js b/src/groups/membership.js index e57847a61c..68a9724c9c 100644 --- a/src/groups/membership.js +++ b/src/groups/membership.js @@ -1,6 +1,6 @@ 'use strict'; -var async = require('async'); +var async = require('async'); var winston = require('winston'); var _ = require('underscore'); @@ -138,7 +138,6 @@ module.exports = function (Groups) { }; Groups.acceptMembership = function (groupName, uid, callback) { - // Note: For simplicity, this method intentially doesn't check the caller uid for ownership! async.waterfall([ async.apply(db.setRemove, 'group:' + groupName + ':pending', uid), async.apply(db.setRemove, 'group:' + groupName + ':invited', uid), @@ -147,7 +146,6 @@ module.exports = function (Groups) { }; Groups.rejectMembership = function (groupName, uid, callback) { - // Note: For simplicity, this method intentially doesn't check the caller uid for ownership! async.parallel([ async.apply(db.setRemove, 'group:' + groupName + ':pending', uid), async.apply(db.setRemove, 'group:' + groupName + ':invited', uid) diff --git a/src/image.js b/src/image.js index 1cfbdccbe3..7b428f2331 100644 --- a/src/image.js +++ b/src/image.js @@ -1,8 +1,13 @@ 'use strict'; +var os = require('os'); var fs = require('fs'); +var path = require('path'); var Jimp = require('jimp'); var async = require('async'); +var crypto = require('crypto'); + +var file = require('./file'); var plugins = require('./plugins'); var image = module.exports; @@ -80,7 +85,7 @@ image.normalise = function (path, extension, callback) { path: path, extension: extension }, function (err) { - callback(err); + callback(err, path + '.png'); }); } else { new Jimp(path, function (err, image) { @@ -88,7 +93,7 @@ image.normalise = function (path, extension, callback) { return callback(err); } image.write(path + '.png', function (err) { - callback(err); + callback(err, path + '.png'); }); }); } @@ -113,3 +118,28 @@ image.convertImageToBase64 = function (path, callback) { callback(err, data ? data.toString('base64') : null); }); }; + +image.mimeFromBase64 = function (imageData) { + return imageData.slice(5, imageData.indexOf('base64') - 1); +}; + +image.extensionFromBase64 = function (imageData) { + return file.typeToExtension(image.mimeFromBase64(imageData)); +}; + +image.writeImageDataToTempFile = function (imageData, callback) { + var filename = crypto.createHash('md5').update(imageData).digest('hex'); + + var type = image.mimeFromBase64(imageData); + var extension = file.typeToExtension(type); + + var filepath = path.join(os.tmpdir(), filename + extension); + + var buffer = new Buffer(imageData.slice(imageData.indexOf('base64') + 7), 'base64'); + + fs.writeFile(filepath, buffer, { + encoding: 'base64' + }, function (err) { + callback(err, filepath); + }); +}; \ No newline at end of file diff --git a/src/install.js b/src/install.js index 8c14302d80..c5ae1e214b 100644 --- a/src/install.js +++ b/src/install.js @@ -389,8 +389,8 @@ function createMenuItems(next) { if (err || exists) { return next(err); } - var navigation = require('./navigation/admin'), - data = require('../install/data/navigation.json'); + var navigation = require('./navigation/admin'); + var data = require('../install/data/navigation.json'); navigation.save(data, next); }); diff --git a/src/messaging/notifications.js b/src/messaging/notifications.js index 6d9500c4ba..2eeb562b5c 100644 --- a/src/messaging/notifications.js +++ b/src/messaging/notifications.js @@ -14,71 +14,75 @@ module.exports = function (Messaging) { Messaging.notifyQueue = {}; // Only used to notify a user of a new chat message, see Messaging.notifyUser + Messaging.notificationSendDelay = 1000 * 60; + Messaging.notifyUsersInRoom = function (fromUid, roomId, messageObj) { - Messaging.getUidsInRoom(roomId, 0, -1, function (err, uids) { - if (err) { - return; - } - - var data = { - roomId: roomId, - fromUid: fromUid, - message: messageObj - }; - uids.forEach(function (uid) { - data.self = parseInt(uid, 10) === parseInt(fromUid) ? 1 : 0; - Messaging.pushUnreadCount(uid); - sockets.in('uid_' + uid).emit('event:chats.receive', data); - }); - - // Delayed notifications - var queueObj = Messaging.notifyQueue[fromUid + ':' + roomId]; - if (queueObj) { - queueObj.message.content += '\n' + messageObj.content; - clearTimeout(queueObj.timeout); - } else { - queueObj = Messaging.notifyQueue[fromUid + ':' + roomId] = { + async.waterfall([ + function (next) { + Messaging.getUidsInRoom(roomId, 0, -1, next); + }, + function (uids, next) { + var data = { + roomId: roomId, + fromUid: fromUid, message: messageObj }; - } - queueObj.timeout = setTimeout(function () { - sendNotifications(fromUid, uids, roomId, queueObj.message, function (err) { - if (!err) { - delete Messaging.notifyQueue[fromUid + ':' + roomId]; - } + uids.forEach(function (uid) { + data.self = parseInt(uid, 10) === parseInt(fromUid) ? 1 : 0; + Messaging.pushUnreadCount(uid); + sockets.in('uid_' + uid).emit('event:chats.receive', data); }); - }, 1000 * 60); // wait 60s before sending - }); + + // Delayed notifications + var queueObj = Messaging.notifyQueue[fromUid + ':' + roomId]; + if (queueObj) { + queueObj.message.content += '\n' + messageObj.content; + clearTimeout(queueObj.timeout); + } else { + queueObj = Messaging.notifyQueue[fromUid + ':' + roomId] = { + message: messageObj + }; + } + + queueObj.timeout = setTimeout(function () { + sendNotifications(fromUid, uids, roomId, queueObj.message); + }, Messaging.notificationSendDelay); + next(); + } + ]); }; - function sendNotifications(fromuid, uids, roomId, messageObj, callback) { - user.isOnline(uids, function (err, isOnline) { - if (err) { - return callback(err); - } + function sendNotifications(fromuid, uids, roomId, messageObj) { + async.waterfall([ + function (next) { + user.isOnline(uids, next); + }, + function (isOnline, next) { + uids = uids.filter(function (uid, index) { + return !isOnline[index] && parseInt(fromuid, 10) !== parseInt(uid, 10); + }); - uids = uids.filter(function (uid, index) { - return !isOnline[index] && parseInt(fromuid, 10) !== parseInt(uid, 10); - }); - - if (!uids.length) { - return callback(); - } - - notifications.create({ - bodyShort: '[[notifications:new_message_from, ' + messageObj.fromUser.username + ']]', - bodyLong: messageObj.content, - nid: 'chat_' + fromuid + '_' + roomId, - from: fromuid, - path: '/chats/' + messageObj.roomId - }, function (err, notification) { - if (!err && notification) { - notifications.push(notification, uids, callback); + if (!uids.length) { + return; } - }); - sendNotificationEmails(uids, messageObj); + notifications.create({ + bodyShort: '[[notifications:new_message_from, ' + messageObj.fromUser.username + ']]', + bodyLong: messageObj.content, + nid: 'chat_' + fromuid + '_' + roomId, + from: fromuid, + path: '/chats/' + messageObj.roomId + }, next); + } + ], function (err, notification) { + if (!err) { + delete Messaging.notifyQueue[fromuid + ':' + roomId]; + if (notification) { + notifications.push(notification, uids); + } + sendNotificationEmails(uids, messageObj); + } }); } @@ -87,38 +91,38 @@ module.exports = function (Messaging) { return; } - async.parallel({ - userData: function (next) { - user.getUsersFields(uids, ['uid', 'username', 'userslug'], next); + async.waterfall([ + function (next) { + async.parallel({ + userData: function (next) { + user.getUsersFields(uids, ['uid', 'username', 'userslug'], next); + }, + userSettings: function (next) { + user.getMultipleUserSettings(uids, next); + } + }, next); }, - userSettings: function (next) { - user.getMultipleUserSettings(uids, next); + function (results, next) { + results.userData = results.userData.filter(function (userData, index) { + return userData && results.userSettings[index] && results.userSettings[index].sendChatNotifications; + }); + async.each(results.userData, function (userData, next) { + emailer.send('notif_chat', userData.uid, { + subject: '[[email:notif.chat.subject, ' + messageObj.fromUser.username + ']]', + summary: '[[notifications:new_message_from, ' + messageObj.fromUser.username + ']]', + message: messageObj, + site_title: meta.config.title || 'NodeBB', + url: nconf.get('url'), + roomId: messageObj.roomId, + username: userData.username, + userslug: userData.userslug + }, next); + }, next); } - }, function (err, results) { + ], function (err) { if (err) { return winston.error(err); } - - results.userData = results.userData.filter(function (userData, index) { - return userData && results.userSettings[index] && results.userSettings[index].sendChatNotifications; - }); - - async.each(results.userData, function (userData, next) { - emailer.send('notif_chat', userData.uid, { - subject: '[[email:notif.chat.subject, ' + messageObj.fromUser.username + ']]', - summary: '[[notifications:new_message_from, ' + messageObj.fromUser.username + ']]', - message: messageObj, - site_title: meta.config.title || 'NodeBB', - url: nconf.get('url'), - roomId: messageObj.roomId, - username: userData.username, - userslug: userData.userslug - }, next); - }, function (err) { - if (err) { - winston.error(err); - } - }); }); } }; \ No newline at end of file diff --git a/src/meta/blacklist.js b/src/meta/blacklist.js index 679dc3cec9..a078b89815 100644 --- a/src/meta/blacklist.js +++ b/src/meta/blacklist.js @@ -3,15 +3,18 @@ var ip = require('ip'); var winston = require('winston'); var async = require('async'); + var db = require('../database'); +var pubsub = require('../pubsub'); var Blacklist = { - _rules: [] - }; + _rules: [] +}; Blacklist.load = function (callback) { + callback = callback || function () {}; async.waterfall([ - async.apply(db.get, 'ip-blacklist-rules'), + async.apply(Blacklist.get), async.apply(Blacklist.validate) ], function (err, rules) { if (err) { @@ -33,13 +36,18 @@ Blacklist.load = function (callback) { }); }; +pubsub.on('blacklist:reload', Blacklist.load); + Blacklist.save = function (rules, callback) { - db.set('ip-blacklist-rules', rules, function (err) { - if (err) { - return callback(err); + async.waterfall([ + function (next) { + db.set('ip-blacklist-rules', rules, next); + }, + function (next) { + Blacklist.load(next); + pubsub.publish('blacklist:reload'); } - Blacklist.load(callback); - }); + ], callback); }; Blacklist.get = function (callback) { @@ -48,14 +56,14 @@ Blacklist.get = function (callback) { Blacklist.test = function (clientIp, callback) { if ( - Blacklist._rules.ipv4.indexOf(clientIp) === -1 // not explicitly specified in ipv4 list - && Blacklist._rules.ipv6.indexOf(clientIp) === -1 // not explicitly specified in ipv6 list - && !Blacklist._rules.cidr.some(function (subnet) { + Blacklist._rules.ipv4.indexOf(clientIp) === -1 &&// not explicitly specified in ipv4 list + Blacklist._rules.ipv6.indexOf(clientIp) === -1 &&// not explicitly specified in ipv6 list + !Blacklist._rules.cidr.some(function (subnet) { return ip.cidrSubnet(subnet).contains(clientIp); }) // not in a blacklisted cidr range ) { if (typeof callback === 'function') { - callback(); + setImmediate(callback); } else { return false; } @@ -64,7 +72,7 @@ Blacklist.test = function (clientIp, callback) { err.code = 'blacklisted-ip'; if (typeof callback === 'function') { - callback(err); + setImmediate(callback, err); } else { return true; } @@ -78,9 +86,9 @@ Blacklist.validate = function (rules, callback) { var cidr = []; var invalid = []; - var isCidrSubnet = /^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/([0-9]|[1-2][0-9]|3[0-2]))$/, - inlineCommentMatch = /#.*$/, - whitelist = ['127.0.0.1', '::1', '::ffff:0:127.0.0.1']; + var isCidrSubnet = /^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/([0-9]|[1-2][0-9]|3[0-2]))$/; + var inlineCommentMatch = /#.*$/; + var whitelist = ['127.0.0.1', '::1', '::ffff:0:127.0.0.1']; // Filter out blank lines and lines starting with the hash character (comments) // Also trim inputs and remove inline comments diff --git a/build.js b/src/meta/build.js similarity index 63% rename from build.js rename to src/meta/build.js index a0250dfb37..29cfbc45be 100644 --- a/build.js +++ b/src/meta/build.js @@ -5,7 +5,7 @@ var winston = require('winston'); var buildStart; -var valid = ['js', 'clientCSS', 'acpCSS', 'tpl', 'lang']; +var valid = ['js', 'clientCSS', 'acpCSS', 'tpl', 'lang', 'sound']; exports.buildAll = function (callback) { exports.build(valid.join(','), callback); @@ -14,9 +14,9 @@ exports.buildAll = function (callback) { exports.build = function build(targets, callback) { buildStart = Date.now(); - var db = require('./src/database'); - var meta = require('./src/meta'); - var plugins = require('./src/plugins'); + var db = require('../database'); + var meta = require('../meta'); + var plugins = require('../plugins'); targets = (targets === true ? valid : targets.split(',').filter(function (target) { @@ -43,20 +43,36 @@ exports.build = function build(targets, callback) { }; exports.buildTargets = function (targets, callback) { - var meta = require('./src/meta'); + var cacheBuster = require('./cacheBuster'); + var meta = require('../meta'); + var numCpus = require('os').cpus().length; + var parallel = targets.length > 1 && numCpus > 1; + buildStart = buildStart || Date.now(); - var step = function (startTime, target, next) { + var step = function (startTime, target, next, err) { + if (err) { + winston.error('Build failed: ' + err.message); + process.exit(1); + } winston.info('[build] ' + target + ' => Completed in ' + ((Date.now() - startTime) / 1000) + 's'); next(); }; - async.parallel([ + if (parallel) { + winston.verbose('[build] Utilising multiple cores/processes'); + } else { + winston.verbose('[build] Utilising single-core'); + } + + async[parallel ? 'parallel' : 'series']([ function (next) { if (targets.indexOf('js') !== -1) { winston.info('[build] Building javascript'); var startTime = Date.now(); async.series([ + meta.js.buildModules, + meta.js.linkStatics, async.apply(meta.js.minify, 'nodebb.min.js'), async.apply(meta.js.minify, 'acp.min.js') ], step.bind(this, startTime, 'js', next)); @@ -74,13 +90,13 @@ exports.buildTargets = function (targets, callback) { case 'clientCSS': winston.info('[build] Building client-side CSS'); startTime = Date.now(); - meta.css.minify('stylesheet.css', step.bind(this, startTime, target, next)); + meta.css.minify('client', step.bind(this, startTime, target, next)); break; case 'acpCSS': winston.info('[build] Building admin control panel CSS'); startTime = Date.now(); - meta.css.minify('admin.css', step.bind(this, startTime, target, next)); + meta.css.minify('admin', step.bind(this, startTime, target, next)); break; case 'tpl': @@ -88,13 +104,19 @@ exports.buildTargets = function (targets, callback) { startTime = Date.now(); meta.templates.compile(step.bind(this, startTime, target, next)); break; - + case 'lang': winston.info('[build] Building language files'); startTime = Date.now(); meta.languages.build(step.bind(this, startTime, target, next)); break; + case 'sound': + winston.info('[build] Linking sound files'); + startTime = Date.now(); + meta.sounds.build(step.bind(this, startTime, target, next)); + break; + default: winston.warn('[build] Unknown build target: \'' + target + '\''); setImmediate(next); @@ -108,14 +130,21 @@ exports.buildTargets = function (targets, callback) { return process.exit(1); } - var time = (Date.now() - buildStart) / 1000; + cacheBuster.write(function (err) { + if (err) { + winston.error('[build] Failed to write `cache-buster.conf`: ' + err.message); + return process.exit(1); + } - winston.info('[build] Asset compilation successful. Completed in ' + time + 's.'); + var time = (Date.now() - buildStart) / 1000; - if (typeof callback === 'function') { - callback(); - } else { - process.exit(0); - } + winston.info('[build] Asset compilation successful. Completed in ' + time + 's.'); + + if (typeof callback === 'function') { + callback(); + } else { + process.exit(0); + } + }); }); }; \ No newline at end of file diff --git a/src/meta/cacheBuster.js b/src/meta/cacheBuster.js new file mode 100644 index 0000000000..461bcaf801 --- /dev/null +++ b/src/meta/cacheBuster.js @@ -0,0 +1,46 @@ +'use strict'; + +var fs = require('fs'); +var path = require('path'); +var mkdirp = require('mkdirp'); +var winston = require('winston'); + +var filePath = path.join(__dirname, '../../build/cache-buster'); + +var cached; + +// cache buster is an 11-character, lowercase, alphanumeric string +function generate() { + return (Math.random() * 1e18).toString(32).slice(0, 11); +} + +exports.write = function write(callback) { + mkdirp(path.dirname(filePath), function (err) { + if (err) { + return callback(err); + } + + fs.writeFile(filePath, generate(), callback); + }); +}; + +exports.read = function read(callback) { + if (cached) { + return callback(null, cached); + } + + fs.readFile(filePath, function (err, buffer) { + if (err) { + winston.warn('[cache-buster] could not read cache buster: ' + err.message); + return callback(null, generate()); + } + + if (!buffer || buffer.toString().length !== 11) { + winston.warn('[cache-buster] cache buster string invalid: expected /[a-z0-9]{11}/, got `' + buffer + '`'); + return callback(null, generate()); + } + + cached = buffer.toString(); + callback(null, cached); + }); +}; diff --git a/src/meta/configs.js b/src/meta/configs.js index 75da0595d2..907e0ef477 100644 --- a/src/meta/configs.js +++ b/src/meta/configs.js @@ -6,7 +6,7 @@ var nconf = require('nconf'); var db = require('../database'); var pubsub = require('../pubsub'); -var utils = require('../../public/src/utils'); +var cacheBuster = require('./cacheBuster'); module.exports = function (Meta) { @@ -21,10 +21,16 @@ module.exports = function (Meta) { Meta.configs.list(next); }, function (config, next) { - config['cache-buster'] = 'v=' + utils.generateUUID(); + cacheBuster.read(function (err, buster) { + if (err) { + return next(err); + } + + config['cache-buster'] = 'v=' + (buster || Date.now()); - Meta.config = config; - setImmediate(next); + Meta.config = config; + next(); + }); } ], callback); }; diff --git a/src/meta/css.js b/src/meta/css.js index 0d63e09d6d..df613ee39f 100644 --- a/src/meta/css.js +++ b/src/meta/css.js @@ -18,8 +18,38 @@ var utils = require('../../public/src/utils'); module.exports = function (Meta) { Meta.css = {}; - Meta.css.cache = undefined; - Meta.css.acpCache = undefined; + + var buildImports = { + client: function (source) { + return '@import "./theme";\n' + source + '\n' + [ + '@import "font-awesome";', + '@import (inline) "../public/vendor/jquery/css/smoothness/jquery-ui.css";', + '@import (inline) "../public/vendor/jquery/bootstrap-tagsinput/bootstrap-tagsinput.css";', + '@import (inline) "../public/vendor/colorpicker/colorpicker.css";', + '@import (inline) "../node_modules/cropperjs/dist/cropper.css";', + '@import "../../public/less/flags.less";', + '@import "../../public/less/blacklist.less";', + '@import "../../public/less/generics.less";', + '@import "../../public/less/mixins.less";', + '@import "../../public/less/global.less";', + ].map(function (str) { + return str.replace(/\//g, path.sep); + }).join('\n'); + }, + admin: function (source) { + return source + '\n' + [ + '@import "font-awesome";', + '@import "../public/less/admin/admin";', + '@import "../public/less/generics.less";', + '@import (inline) "../public/vendor/colorpicker/colorpicker.css";', + '@import (inline) "../public/vendor/jquery/css/smoothness/jquery-ui.css";', + '@import (inline) "../public/vendor/jquery/bootstrap-tagsinput/bootstrap-tagsinput.css";', + '@import (inline) "../public/vendor/mdl/material.css";', + ].map(function (str) { + return str.replace(/\//g, path.sep); + }).join('\n'); + }, + }; Meta.css.minify = function (target, callback) { callback = callback || function () {}; @@ -30,25 +60,25 @@ module.exports = function (Meta) { return callback(err); } - var themeId = (themeData['theme:id'] || 'nodebb-theme-persona'), - baseThemePath = path.join(nconf.get('themes_path'), (themeData['theme:type'] && themeData['theme:type'] === 'local' ? themeId : 'nodebb-theme-vanilla')), - paths = [ - baseThemePath, - path.join(__dirname, '../../node_modules'), - path.join(__dirname, '../../public/vendor/fontawesome/less') - ], - source = '@import "font-awesome";'; + var themeId = (themeData['theme:id'] || 'nodebb-theme-persona'); + var baseThemePath = path.join(nconf.get('themes_path'), (themeData['theme:type'] && themeData['theme:type'] === 'local' ? themeId : 'nodebb-theme-vanilla')); + var paths = [ + baseThemePath, + path.join(__dirname, '../../node_modules'), + path.join(__dirname, '../../public/vendor/fontawesome/less') + ]; + var source = ''; - plugins.lessFiles = filterMissingFiles(plugins.lessFiles); - plugins.cssFiles = filterMissingFiles(plugins.cssFiles); + var lessFiles = filterMissingFiles(plugins.lessFiles); + var cssFiles = filterMissingFiles(plugins.cssFiles); async.waterfall([ function (next) { - getStyleSource(plugins.cssFiles, '\n@import (inline) ".', '.css', next); + getStyleSource(cssFiles, '\n@import (inline) ".', '.css', next); }, function (src, next) { source += src; - getStyleSource(plugins.lessFiles, '\n@import ".', '.less', next); + getStyleSource(lessFiles, '\n@import ".', '.less', next); }, function (src, next) { source += src; @@ -59,44 +89,13 @@ module.exports = function (Meta) { return callback(err); } - var acpSource = source; - - if (target !== 'admin.css') { - source += '\n@import (inline) "..' + path.sep + '..' + path.sep + 'public/vendor/jquery/css/smoothness/jquery-ui.css";'; - source += '\n@import (inline) "..' + path.sep + '..' + path.sep + 'public/vendor/jquery/bootstrap-tagsinput/bootstrap-tagsinput.css";'; - source += '\n@import (inline) "..' + path.sep + 'public/vendor/colorpicker/colorpicker.css";'; - source += '\n@import "..' + path.sep + '..' + path.sep + 'public/less/flags.less";'; - source += '\n@import "..' + path.sep + '..' + path.sep + 'public/less/blacklist.less";'; - source += '\n@import "..' + path.sep + '..' + path.sep + 'public/less/generics.less";'; - source += '\n@import "..' + path.sep + '..' + path.sep + 'public/less/mixins.less";'; - source += '\n@import "..' + path.sep + '..' + path.sep + 'public/less/global.less";'; - source = '@import "./theme";\n' + source; - - minify(source, paths, 'cache', callback); - } else { - acpSource += '\n@import "..' + path.sep + 'public/less/admin/admin";\n'; - acpSource += '\n@import "..' + path.sep + 'public/less/generics.less";\n'; - acpSource += '\n@import (inline) "..' + path.sep + 'public/vendor/colorpicker/colorpicker.css";\n'; - acpSource += '\n@import (inline) "..' + path.sep + 'public/vendor/jquery/css/smoothness/jquery-ui.css";'; - acpSource += '\n@import (inline) "..' + path.sep + 'public/vendor/jquery/bootstrap-tagsinput/bootstrap-tagsinput.css";'; - - minify(acpSource, paths, 'acpCache', callback); - } + minify(buildImports[target](source), paths, target, callback); }); }); }; - Meta.css.getFromFile = function (callback) { - async.series([ - async.apply(Meta.css.loadFile, path.join(__dirname, '../../public/stylesheet.css'), 'cache'), - async.apply(Meta.css.loadFile, path.join(__dirname, '../../public/admin.css'), 'acpCache') - ], function (err) { - callback(err); - }); - }; - function getStyleSource(files, prefix, extension, callback) { - var pluginDirectories = [], + var pluginDirectories = [], source = ''; files.forEach(function (styleFile) { @@ -124,35 +123,22 @@ module.exports = function (Meta) { }); } - Meta.css.commitToFile = function (filename, callback) { - var file = (filename === 'acpCache' ? 'admin' : 'stylesheet') + '.css'; + Meta.css.commitToFile = function (target, source, callback) { + var filename = (target === 'client' ? 'stylesheet' : 'admin') + '.css'; - fs.writeFile(path.join(__dirname, '../../public/' + file), Meta.css[filename], function (err) { + fs.writeFile(path.join(__dirname, '../../build/public/' + filename), source, function (err) { if (!err) { - winston.verbose('[meta/css] ' + file + ' committed to disk.'); + winston.verbose('[meta/css] ' + target + ' CSS committed to disk.'); } else { winston.error('[meta/css] ' + err.message); - process.exit(0); + process.exit(1); } callback(); }); }; - Meta.css.loadFile = function (filePath, filename, callback) { - winston.verbose('[meta/css] Reading stylesheet ' + filePath.split('/').pop() + ' from file'); - - fs.readFile(filePath, function (err, file) { - if (err) { - return callback(err); - } - - Meta.css[filename] = file; - callback(); - }); - }; - - function minify(source, paths, destination, callback) { + function minify(source, paths, target, callback) { callback = callback || function () {}; less.render(source, { paths: paths @@ -162,20 +148,19 @@ module.exports = function (Meta) { return callback(err); } - postcss([ autoprefixer, clean() ]).process(lessOutput.css).then(function (result) { + postcss(global.env === 'development' ? [autoprefixer] : [ + autoprefixer, + clean({ + processImportFrom: ['local'] + }), + ]).process(lessOutput.css).then(function (result) { result.warnings().forEach(function (warn) { winston.verbose(warn.toString()); }); - Meta.css[destination] = result.css; - // Save the compiled CSS in public/ so things like nginx can serve it - if (nconf.get('local-assets') === undefined || nconf.get('local-assets') !== false) { - return Meta.css.commitToFile(destination, function () { - callback(null, result.css); - }); - } - - callback(null, result.css); + return Meta.css.commitToFile(target, result.css, function () { + callback(null, result.css); + }); }); }); } diff --git a/src/meta/js.js b/src/meta/js.js index 7f39235993..90f757361a 100644 --- a/src/meta/js.js +++ b/src/meta/js.js @@ -4,11 +4,17 @@ var winston = require('winston'); var fork = require('child_process').fork; var path = require('path'); var async = require('async'); -var nconf = require('nconf'); var fs = require('fs'); +var mkdirp = require('mkdirp'); +var rimraf = require('rimraf'); +var uglifyjs = require('uglify-js'); + +var file = require('../file'); var plugins = require('../plugins'); var utils = require('../../public/src/utils'); +var minifierPath = path.join(__dirname, 'minifier.js'); + module.exports = function (Meta) { Meta.js = { @@ -76,46 +82,157 @@ module.exports = function (Meta) { 'public/src/modules/string.js' ], - // modules listed below are routed through express (/src/modules) so they can be defined anonymously + // modules listed below are built (/src/modules) so they can be defined anonymously modules: { "Chart.js": './node_modules/chart.js/dist/Chart.min.js', "mousetrap.js": './node_modules/mousetrap/mousetrap.min.js', "jqueryui.js": 'public/vendor/jquery/js/jquery-ui.js', - "buzz.js": 'public/vendor/buzz/buzz.js' + "buzz.js": 'public/vendor/buzz/buzz.js', + "cropper.js": './node_modules/cropperjs/dist/cropper.min.js' } } }; - Meta.js.bridgeModules = function (app, callback) { - // Add routes for AMD-type modules to serve those files - function addRoute(relPath) { - var relativePath = nconf.get('relative_path'); + function minifyModules(modules, callback) { + async.eachLimit(modules, 500, function (mod, next) { + var filePath = mod.filePath; + var destPath = mod.destPath; + var minified; - app.get(relativePath + '/src/modules/' + relPath, function (req, res) { - return res.sendFile(path.join(__dirname, '../../', Meta.js.scripts.modules[relPath]), { - maxAge: app.enabled('cache') ? 5184000000 : 0 - }); + async.parallel([ + function (cb) { + mkdirp(path.dirname(destPath), cb); + }, + function (cb) { + fs.readFile(filePath, function (err, buffer) { + if (err) { + return cb(err); + } + try { + minified = uglifyjs.minify(buffer.toString(), { + fromString: true, + compress: false, + }); + } catch (e) { + return cb(e); + } + + cb(); + }); + } + ], function (err) { + if (err) { + return next(err); + } + + fs.writeFile(destPath, minified.code, next); }); - } + }, callback); + }; - var numBridged = 0; + function linkModules(callback) { + var modules = Meta.js.scripts.modules; - for(var relPath in Meta.js.scripts.modules) { - if (Meta.js.scripts.modules.hasOwnProperty(relPath)) { - addRoute(relPath); - ++numBridged; + async.eachLimit(Object.keys(modules), 1000, function (relPath, next) { + var filePath = path.join(__dirname, '../../', modules[relPath]); + var destPath = path.join(__dirname, '../../build/public/src/modules', relPath); + + mkdirp(path.dirname(destPath), function (err) { + if (err) { + return next(err); + } + + file.link(filePath, destPath, next); + }); + }, callback); + }; + + var moduleDirs = ['modules', 'admin', 'client']; + + function getModuleList(callback) { + var modules = Object.keys(Meta.js.scripts.modules).map(function (relPath) { + return { + filePath: path.join(__dirname, '../../', Meta.js.scripts.modules[relPath]), + destPath: path.join(__dirname, '../../build/public/src/modules', relPath), + }; + }); + + var dirs = moduleDirs.map(function (dir) { + return path.join(__dirname, '../../public/src', dir); + }); + + async.each(dirs, function (dir, next) { + utils.walk(dir, function (err, files) { + if (err) { + return next(err); + } + + modules = modules.concat(files.map(function (filePath) { + return { + filePath: filePath, + destPath: path.join(__dirname, '../../build/public/src', path.relative(path.dirname(dir), filePath)), + }; + })); + + next(); + }); + }, function (err) { + callback(err, modules); + }); + } + + function clearModules(callback) { + var builtPaths = moduleDirs.map(function (p) { + return '../../build/public/src/' + p; + }); + async.each(builtPaths, function (builtPath, next) { + rimraf(path.join(__dirname, builtPath), next); + }, function (err) { + callback(err); + }); + } + + Meta.js.buildModules = function (callback) { + async.waterfall([ + clearModules, + function (next) { + if (global.env === 'development') { + return linkModules(callback); + } + + getModuleList(next); + }, + function (modules, next) { + minifyModules(modules, next); } - } + ], callback); + }; - winston.verbose('[meta/js] ' + numBridged + ' of ' + Object.keys(Meta.js.scripts.modules).length + ' modules bridged'); - callback(); + Meta.js.linkStatics = function (callback) { + rimraf(path.join(__dirname, '../../build/public/plugins'), function (err) { + if (err) { + return callback(err); + } + async.eachLimit(Object.keys(plugins.staticDirs), 1000, function (mappedPath, next) { + var sourceDir = plugins.staticDirs[mappedPath]; + var destDir = path.join(__dirname, '../../build/public/plugins', mappedPath); + + mkdirp(path.dirname(destDir), function (err) { + if (err) { + return next(err); + } + + file.linkDirs(sourceDir, destDir, next); + }); + }, callback); + }); }; Meta.js.minify = function (target, callback) { winston.verbose('[meta/js] Minifying ' + target); var forkProcessParams = setupDebugging(); - var minifier = Meta.js.minifierProc = fork('minifier.js', [], forkProcessParams); + var minifier = Meta.js.minifierProc = fork(minifierPath, [], forkProcessParams); Meta.js.target[target] = {}; @@ -138,12 +255,7 @@ module.exports = function (Meta) { winston.verbose('[meta/js] ' + target + ' minification complete'); minifier.kill(); - if (nconf.get('local-assets') === undefined || nconf.get('local-assets') !== false) { - return Meta.js.commitToFile(target, callback); - } else { - return callback(); - } - + Meta.js.commitToFile(target, callback); break; case 'error': winston.error('[meta/js] Could not compile ' + target + ': ' + message.message); @@ -202,48 +314,11 @@ module.exports = function (Meta) { }; Meta.js.commitToFile = function (target, callback) { - fs.writeFile(path.join(__dirname, '../../public/' + target), Meta.js.target[target].cache, function (err) { + fs.writeFile(path.join(__dirname, '../../build/public/' + target), Meta.js.target[target].cache, function (err) { callback(err); }); }; - Meta.js.getFromFile = function (target, callback) { - function readFile(filePath, next) { - fs.readFile(filePath, function (err, contents) { - if (err) { - if (err.code === 'ENOENT') { - if (!filePath.endsWith('.map')) { - winston.warn('[meta/js] ' + filePath + ' not found on disk, did you run ./nodebb build?'); - } - return next(null, ''); - } - } - next(err, contents); - }); - } - - var scriptPath = path.join(nconf.get('base_dir'), 'public/' + target); - var mapPath = path.join(nconf.get('base_dir'), 'public/' + target + '.map'); - - async.parallel({ - script: function (next) { - readFile(scriptPath, next); - }, - map: function (next) { - readFile(mapPath, next); - } - }, function (err, results) { - if (err) { - return callback(err); - } - Meta.js.target[target] = { - cache: results.script, - map: results.map - }; - callback(); - }); - }; - function setupDebugging() { /** * Check if the parent process is running with the debug option --debug (or --debug-brk) diff --git a/minifier.js b/src/meta/minifier.js similarity index 98% rename from minifier.js rename to src/meta/minifier.js index 25c0177175..5c47bc3e4e 100644 --- a/minifier.js +++ b/src/meta/minifier.js @@ -3,7 +3,7 @@ var uglifyjs = require('uglify-js'); var async = require('async'); var fs = require('fs'); -var file = require('./src/file'); +var file = require('../file'); var Minifier = { js: {} diff --git a/src/meta/sounds.js b/src/meta/sounds.js index 6068f16f5f..00bcbc2410 100644 --- a/src/meta/sounds.js +++ b/src/meta/sounds.js @@ -2,64 +2,101 @@ var path = require('path'); var fs = require('fs'); -var nconf = require('nconf'); -var winston = require('winston'); var rimraf = require('rimraf'); var mkdirp = require('mkdirp'); var async = require('async'); +var file = require('../file'); var plugins = require('../plugins'); +var user = require('../user'); var db = require('../database'); -module.exports = function (Meta) { +var soundsPath = path.join(__dirname, '../../build/public/sounds'); +var uploadsPath = path.join(__dirname, '../../public/uploads/sounds'); +module.exports = function (Meta) { Meta.sounds = {}; - Meta.sounds.init = function (callback) { - if (nconf.get('isPrimary') === 'true') { - setupSounds(callback); - } else { - if (typeof callback === 'function') { - callback(); - } - } - }; + Meta.sounds.addUploads = function addUploads(callback) { + fs.readdir(uploadsPath, function (err, files) { + if (err) { + if (err.code !== 'ENOENT') { + return callback(err); + } - Meta.sounds.getFiles = function (callback) { - async.waterfall([ - function (next) { - fs.readdir(path.join(__dirname, '../../public/sounds'), next); - }, - function (sounds, next) { - fs.readdir(path.join(__dirname, '../../public/uploads/sounds'), function (err, uploaded) { - next(err, sounds.concat(uploaded)); + files = []; + } + + var uploadSounds = files.reduce(function (prev, fileName) { + var name = fileName.split('.'); + if (!name.length || !name[0].length) { + return prev; + } + name = name[0]; + name = name[0].toUpperCase() + name.slice(1); + + prev[name] = fileName; + return prev; + }, {}); + + plugins.soundpacks = plugins.soundpacks.filter(function (pack) { + return pack.name !== 'Uploads'; + }); + if (Object.keys(uploadSounds).length) { + plugins.soundpacks.push({ + name: 'Uploads', + id: 'uploads', + dir: uploadsPath, + sounds: uploadSounds, }); } - ], function (err, files) { - var localList = {}; - // Filter out hidden files - files = files.filter(function (filename) { - return !filename.startsWith('.'); - }); - - if (err) { - winston.error('Could not get local sound files:' + err.message); - console.log(err.stack); - return callback(null, []); - } - - // Return proper paths - files.forEach(function (filename) { - localList[filename] = nconf.get('relative_path') + '/sounds/' + filename; - }); - - callback(null, localList); + callback(); }); }; - Meta.sounds.getMapping = function (uid, callback) { - var user = require('../user'); + Meta.sounds.build = function build(callback) { + Meta.sounds.addUploads(function (err) { + if (err) { + return callback(err); + } + + var map = plugins.soundpacks.map(function (pack) { + return Object.keys(pack.sounds).reduce(function (prev, soundName) { + var soundPath = pack.sounds[soundName]; + prev[pack.name + ' | ' + soundName] = pack.id + '/' + soundPath; + return prev; + }, {}); + }); + map.unshift({}); + map = Object.assign.apply(null, map); + + async.series([ + function (next) { + rimraf(soundsPath, next); + }, + function (next) { + mkdirp(soundsPath, next); + }, + function (cb) { + async.parallel([ + function (next) { + fs.writeFile(path.join(soundsPath, 'fileMap.json'), JSON.stringify(map), next); + }, + function (next) { + async.each(plugins.soundpacks, function (pack, next) { + file.linkDirs(pack.dir, path.join(soundsPath, pack.id), next); + }, next); + }, + ], cb); + }, + ], callback); + }); + }; + + var keys = ['chat-incoming', 'chat-outgoing', 'notification']; + + Meta.sounds.getUserSoundMap = function getUserSoundMap(uid, callback) { async.parallel({ defaultMapping: function (next) { db.getObject('settings:sounds', next); @@ -71,92 +108,25 @@ module.exports = function (Meta) { if (err) { return callback(err); } + var userSettings = results.userSettings; + userSettings = { + notification: userSettings.notificationSound, + 'chat-incoming': userSettings.incomingChatSound, + 'chat-outgoing': userSettings.outgoingChatSound, + }; var defaultMapping = results.defaultMapping || {}; var soundMapping = {}; - soundMapping.notification = (userSettings.notificationSound || userSettings.notificationSound === '') ? - userSettings.notificationSound : defaultMapping.notification || ''; - soundMapping['chat-incoming'] = (userSettings.incomingChatSound || userSettings.incomingChatSound === '') ? - userSettings.incomingChatSound : defaultMapping['chat-incoming'] || ''; - - soundMapping['chat-outgoing'] = (userSettings.outgoingChatSound || userSettings.outgoingChatSound === '') ? - userSettings.outgoingChatSound : defaultMapping['chat-outgoing'] || ''; + keys.forEach(function (key) { + if (userSettings[key] || userSettings[key] === '') { + soundMapping[key] = userSettings[key] || null; + } else { + soundMapping[key] = defaultMapping[key] || null; + } + }); callback(null, soundMapping); }); }; - - function setupSounds(callback) { - var soundsPath = path.join(__dirname, '../../public/sounds'); - - async.waterfall([ - function (next) { - fs.readdir(path.join(__dirname, '../../public/uploads/sounds'), next); - }, - function (uploaded, next) { - uploaded = uploaded.filter(function (filename) { - return !filename.startsWith('.'); - }).map(function (filename) { - return path.join(__dirname, '../../public/uploads/sounds', filename); - }); - - plugins.fireHook('filter:sounds.get', uploaded, function (err, filePaths) { - if (err) { - winston.error('Could not initialise sound files:' + err.message); - return; - } - - if (nconf.get('local-assets') === false) { - // Don't regenerate the public/sounds/ directory. Instead, create a mapping for the router to use - Meta.sounds._filePathHash = filePaths.reduce(function (hash, filePath) { - hash[path.basename(filePath)] = filePath; - return hash; - }, {}); - - winston.verbose('[sounds] Sounds OK'); - if (typeof next === 'function') { - return next(); - } else { - return; - } - } - - // Clear the sounds directory - async.series([ - function (next) { - rimraf(soundsPath, next); - }, - function (next) { - mkdirp(soundsPath, next); - } - ], function (err) { - if (err) { - winston.error('Could not initialise sound files:' + err.message); - return; - } - - // Link paths - async.each(filePaths, function (filePath, next) { - if (process.platform === 'win32') { - fs.link(filePath, path.join(soundsPath, path.basename(filePath)), next); - } else { - fs.symlink(filePath, path.join(soundsPath, path.basename(filePath)), 'file', next); - } - }, function (err) { - if (!err) { - winston.verbose('[sounds] Sounds OK'); - } else { - winston.error('[sounds] Could not initialise sounds: ' + err.message); - } - - if (typeof next === 'function') { - next(); - } - }); - }); - }); - } - ], callback); - } -}; \ No newline at end of file +}; diff --git a/src/meta/tags.js b/src/meta/tags.js index 1d64a7f93d..0cd680a70a 100644 --- a/src/meta/tags.js +++ b/src/meta/tags.js @@ -28,18 +28,27 @@ module.exports = function (Meta) { }, { property: 'og:site_name', content: Meta.config.title || 'NodeBB' - }, { - name: 'keywords', - content: Meta.config.keywords || '' }, { name: 'msapplication-badge', content: 'frequency=30; polling-uri=' + nconf.get('url') + '/sitemap.xml', noEscape: true - }, { - name: 'msapplication-square150x150logo', - content: Meta.config['brand:logo'] || '', - noEscape: true }]; + + if (Meta.config.keywords) { + defaultTags.push({ + name: 'keywords', + content: Meta.config.keywords + }); + } + + if (Meta.config['brand:logo']) { + defaultTags.push({ + name: 'msapplication-square150x150logo', + content: Meta.config['brand:logo'], + noEscape: true + }); + } + plugins.fireHook('filter:meta.getMetaTags', defaultTags, next); }, links: function (next) { @@ -60,27 +69,27 @@ module.exports = function (Meta) { }, { rel: 'icon', sizes: '36x36', - href: nconf.get('relative_path') + '/uploads/system/touchicon-36.png' + href: nconf.get('relative_path') + '/assets/uploads/system/touchicon-36.png' }, { rel: 'icon', sizes: '48x48', - href: nconf.get('relative_path') + '/uploads/system/touchicon-48.png' + href: nconf.get('relative_path') + '/assets/uploads/system/touchicon-48.png' }, { rel: 'icon', sizes: '72x72', - href: nconf.get('relative_path') + '/uploads/system/touchicon-72.png' + href: nconf.get('relative_path') + '/assets/uploads/system/touchicon-72.png' }, { rel: 'icon', sizes: '96x96', - href: nconf.get('relative_path') + '/uploads/system/touchicon-96.png' + href: nconf.get('relative_path') + '/assets/uploads/system/touchicon-96.png' }, { rel: 'icon', sizes: '144x144', - href: nconf.get('relative_path') + '/uploads/system/touchicon-144.png' + href: nconf.get('relative_path') + '/assets/uploads/system/touchicon-144.png' }, { rel: 'icon', sizes: '192x192', - href: nconf.get('relative_path') + '/uploads/system/touchicon-192.png' + href: nconf.get('relative_path') + '/assets/uploads/system/touchicon-192.png' }); } plugins.fireHook('filter:meta.getLinkTags', defaultLinks, next); diff --git a/src/meta/themes.js b/src/meta/themes.js index be48d1e70d..e19dcdbf4c 100644 --- a/src/meta/themes.js +++ b/src/meta/themes.js @@ -48,7 +48,7 @@ module.exports = function (Meta) { if (configObj.screenshot) { configObj.screenshot_url = nconf.get('relative_path') + '/css/previews/' + configObj.id; } else { - configObj.screenshot_url = nconf.get('relative_path') + '/images/themes/default.png'; + configObj.screenshot_url = nconf.get('relative_path') + '/assets/images/themes/default.png'; } next(null, configObj); } catch (err) { diff --git a/src/middleware/admin.js b/src/middleware/admin.js index 3240eaf0af..9d4b43bf25 100644 --- a/src/middleware/admin.js +++ b/src/middleware/admin.js @@ -101,7 +101,7 @@ module.exports = function (middleware) { plugins: results.custom_header.plugins, authentication: results.custom_header.authentication, scripts: results.scripts, - 'cache-buster': meta.config['cache-buster'] ? 'v=' + meta.config['cache-buster'] : '', + 'cache-buster': meta.config['cache-buster'] || '', env: process.env.NODE_ENV ? true : false, title: (acpPath || 'Dashboard') + ' | NodeBB Admin Control Panel', bodyClass: data.bodyClass diff --git a/src/middleware/header.js b/src/middleware/header.js index c1b4175b5b..0c33e621e5 100644 --- a/src/middleware/header.js +++ b/src/middleware/header.js @@ -46,7 +46,7 @@ module.exports = function (middleware) { bootswatchCSS: meta.config['theme:src'], title: meta.config.title || '', description: meta.config.description || '', - 'cache-buster': meta.config['cache-buster'] ? 'v=' + meta.config['cache-buster'] : '', + 'cache-buster': meta.config['cache-buster'] || '', 'brand:logo': meta.config['brand:logo'] || '', 'brand:logo:url': meta.config['brand:logo:url'] || '', 'brand:logo:alt': meta.config['brand:logo:alt'] || '', @@ -59,115 +59,122 @@ module.exports = function (middleware) { }; templateValues.configJSON = JSON.stringify(res.locals.config); - - async.parallel({ - scripts: function (next) { - plugins.fireHook('filter:scripts.get', [], next); + async.waterfall([ + function (next) { + async.parallel({ + scripts: function (next) { + plugins.fireHook('filter:scripts.get', [], next); + }, + isAdmin: function (next) { + user.isAdministrator(req.uid, next); + }, + isGlobalMod: function (next) { + user.isGlobalModerator(req.uid, next); + }, + isModerator: function (next) { + user.isModeratorOfAnyCategory(req.uid, next); + }, + user: function (next) { + var userData = { + uid: 0, + username: '[[global:guest]]', + userslug: '', + email: '', + picture: meta.config.defaultAvatar, + status: 'offline', + reputation: 0, + 'email:confirmed': false + }; + if (req.uid) { + user.getUserFields(req.uid, Object.keys(userData), next); + } else { + next(null, userData); + } + }, + isEmailConfirmSent: function (next) { + if (!meta.config.requireEmailConfirmation || !req.uid) { + return next(null, false); + } + db.get('uid:' + req.uid + ':confirm:email:sent', next); + }, + navigation: async.apply(navigation.get), + tags: async.apply(meta.tags.parse, res.locals.metaTags, res.locals.linkTags), + banned: async.apply(user.isBanned, req.uid), + banReason: async.apply(user.getBannedReason, req.uid) + }, next); }, - isAdmin: function (next) { - user.isAdministrator(req.uid, next); - }, - isGlobalMod: function (next) { - user.isGlobalModerator(req.uid, next); - }, - isModerator: function (next) { - user.isModeratorOfAnyCategory(req.uid, next); - }, - user: function (next) { - var userData = { - uid: 0, - username: '[[global:guest]]', - userslug: '', - email: '', - picture: meta.config.defaultAvatar, - status: 'offline', - reputation: 0, - 'email:confirmed': false - }; - if (req.uid) { - user.getUserFields(req.uid, Object.keys(userData), next); - } else { - next(null, userData); - } - }, - isEmailConfirmSent: function (next) { - if (!meta.config.requireEmailConfirmation || !req.uid) { - return next(null, false); - } - db.get('uid:' + req.uid + ':confirm:email:sent', next); - }, - navigation: async.apply(navigation.get), - tags: async.apply(meta.tags.parse, res.locals.metaTags, res.locals.linkTags), - banned: async.apply(user.isBanned, req.uid), - banReason: async.apply(user.getBannedReason, req.uid) - }, function (err, results) { - if (err) { - return callback(err); - } - - if (results.banned) { - req.logout(); - return res.redirect('/?banned=' + (results.banReason || 'no-reason')); - } - - results.user.isAdmin = results.isAdmin; - results.user.isGlobalMod = results.isGlobalMod; - results.user.isMod = !!results.isModerator; - results.user.uid = parseInt(results.user.uid, 10); - results.user.email = String(results.user.email).replace(/\\/g, '\\\\').replace(/"/g, '\\"'); - results.user['email:confirmed'] = parseInt(results.user['email:confirmed'], 10) === 1; - results.user.isEmailConfirmSent = !!results.isEmailConfirmSent; - - if (res.locals.config && parseInt(meta.config.disableCustomUserSkins, 10) !== 1 && res.locals.config.bootswatchSkin !== 'default') { - templateValues.bootswatchCSS = '//maxcdn.bootstrapcdn.com/bootswatch/latest/' + res.locals.config.bootswatchSkin + '/bootstrap.min.css'; - } - - templateValues.browserTitle = controllers.helpers.buildTitle(data.title); - templateValues.navigation = results.navigation; - templateValues.metaTags = results.tags.meta; - templateValues.linkTags = results.tags.link; - templateValues.isAdmin = results.user.isAdmin; - templateValues.isGlobalMod = results.user.isGlobalMod; - templateValues.showModMenu = results.user.isAdmin || results.user.isGlobalMod || results.user.isMod; - templateValues.user = results.user; - templateValues.userJSON = JSON.stringify(results.user); - templateValues.useCustomCSS = parseInt(meta.config.useCustomCSS, 10) === 1 && meta.config.customCSS; - templateValues.customCSS = templateValues.useCustomCSS ? (meta.config.renderedCustomCSS || '') : ''; - templateValues.useCustomJS = parseInt(meta.config.useCustomJS, 10) === 1; - templateValues.customJS = templateValues.useCustomJS ? meta.config.customJS : ''; - templateValues.maintenanceHeader = parseInt(meta.config.maintenanceMode, 10) === 1 && !results.isAdmin; - templateValues.defaultLang = meta.config.defaultLang || 'en-GB'; - templateValues.privateUserInfo = parseInt(meta.config.privateUserInfo, 10) === 1; - templateValues.privateTagListing = parseInt(meta.config.privateTagListing, 10) === 1; - - templateValues.template = {name: res.locals.template}; - templateValues.template[res.locals.template] = true; - - templateValues.scripts = results.scripts.map(function (script) { - return {src: script}; - }); - - if (req.route && req.route.path === '/') { - modifyTitle(templateValues); - } - - plugins.fireHook('filter:middleware.renderHeader', {templateValues: templateValues, req: req, res: res}, function (err, data) { - if (err) { - return callback(err); + function (results, next) { + if (results.banned) { + req.logout(); + return res.redirect('/?banned=' + (results.banReason || 'no-reason')); } - req.app.render('header', data.templateValues, callback); - }); - }); + results.user.isAdmin = results.isAdmin; + results.user.isGlobalMod = results.isGlobalMod; + results.user.isMod = !!results.isModerator; + results.user.uid = parseInt(results.user.uid, 10); + results.user.email = String(results.user.email).replace(/\\/g, '\\\\').replace(/"/g, '\\"'); + results.user['email:confirmed'] = parseInt(results.user['email:confirmed'], 10) === 1; + results.user.isEmailConfirmSent = !!results.isEmailConfirmSent; + + if (res.locals.config && parseInt(meta.config.disableCustomUserSkins, 10) !== 1 && res.locals.config.bootswatchSkin !== 'default') { + templateValues.bootswatchCSS = '//maxcdn.bootstrapcdn.com/bootswatch/latest/' + res.locals.config.bootswatchSkin + '/bootstrap.min.css'; + } + + templateValues.browserTitle = controllers.helpers.buildTitle(data.title); + templateValues.navigation = results.navigation; + templateValues.metaTags = results.tags.meta; + templateValues.linkTags = results.tags.link; + templateValues.isAdmin = results.user.isAdmin; + templateValues.isGlobalMod = results.user.isGlobalMod; + templateValues.showModMenu = results.user.isAdmin || results.user.isGlobalMod || results.user.isMod; + templateValues.user = results.user; + templateValues.userJSON = JSON.stringify(results.user); + templateValues.useCustomCSS = parseInt(meta.config.useCustomCSS, 10) === 1 && meta.config.customCSS; + templateValues.customCSS = templateValues.useCustomCSS ? (meta.config.renderedCustomCSS || '') : ''; + templateValues.useCustomJS = parseInt(meta.config.useCustomJS, 10) === 1; + templateValues.customJS = templateValues.useCustomJS ? meta.config.customJS : ''; + templateValues.maintenanceHeader = parseInt(meta.config.maintenanceMode, 10) === 1 && !results.isAdmin; + templateValues.defaultLang = meta.config.defaultLang || 'en-GB'; + templateValues.privateUserInfo = parseInt(meta.config.privateUserInfo, 10) === 1; + templateValues.privateTagListing = parseInt(meta.config.privateTagListing, 10) === 1; + + templateValues.template = {name: res.locals.template}; + templateValues.template[res.locals.template] = true; + + templateValues.scripts = results.scripts.map(function (script) { + return {src: script}; + }); + + if (req.route && req.route.path === '/') { + modifyTitle(templateValues); + } + + plugins.fireHook('filter:middleware.renderHeader', { + req: req, + res: res, + templateValues: templateValues + }, next); + }, + function (data, next) { + req.app.render('header', data.templateValues, next); + } + ], callback); }; middleware.renderFooter = function (req, res, data, callback) { - plugins.fireHook('filter:middleware.renderFooter', {templateValues: data, req: req, res: res}, function (err, data) { - if (err) { - return callback(err); + async.waterfall([ + function (next) { + plugins.fireHook('filter:middleware.renderFooter', { + req: req, + res: res, + templateValues: data, + }, next); + }, + function (data, next) { + req.app.render('footer', data.templateValues, next); } - req.app.render('footer', data.templateValues, callback); - }); + ], callback); }; function modifyTitle(obj) { diff --git a/src/middleware/index.js b/src/middleware/index.js index c36f5767ed..105142d15e 100644 --- a/src/middleware/index.js +++ b/src/middleware/index.js @@ -162,7 +162,7 @@ middleware.privateUploads = function (req, res, next) { if (req.user || parseInt(meta.config.privateUploads, 10) !== 1) { return next(); } - if (req.path.startsWith('/uploads/files')) { + if (req.path.startsWith('/assets/uploads/files')) { return res.status(403).json('not-allowed'); } next(); diff --git a/src/middleware/maintenance.js b/src/middleware/maintenance.js index 31ba25e250..3193e820fa 100644 --- a/src/middleware/maintenance.js +++ b/src/middleware/maintenance.js @@ -12,33 +12,7 @@ module.exports = function (middleware) { } var url = req.url.replace(nconf.get('relative_path'), ''); - var allowedRoutes = [ - '^/ping', - '^/sping', - '^/login', - '^/stylesheet.css', - '^/favicon', - '^/nodebb.min.js', - '^/vendor/fontawesome/fonts/fontawesome-webfont.woff', - '^/src/(modules|client)/[\\w/]+.js', - '^/templates/[\\w/]+.tpl', - '^/api/login', - '^/api/widgets/render', - '^/public/language', - '^/uploads/system/site-logo.png' - ]; - - var isAllowed = function (url) { - for(var x = 0,numAllowed = allowedRoutes.length,route; x < numAllowed; x++) { - route = new RegExp(allowedRoutes[x]); - if (route.test(url)) { - return true; - } - } - return false; - }; - - if (isAllowed(url)) { + if (url.startsWith('/login') || url.startsWith('/api/login')) { return next(); } diff --git a/src/middleware/ratelimit.js b/src/middleware/ratelimit.js index 818fe99c12..f02bf74c3e 100644 --- a/src/middleware/ratelimit.js +++ b/src/middleware/ratelimit.js @@ -3,7 +3,7 @@ 'use strict'; var winston = require('winston'); -var ratelimit = {}; +var ratelimit = module.exports; var allowedCalls = 100; var timeframe = 10000; @@ -31,5 +31,3 @@ ratelimit.isFlooding = function (socket) { socket.lastCallTime = now; return false; }; - -module.exports = ratelimit; diff --git a/src/middleware/render.js b/src/middleware/render.js index 688b32c66f..ecd0ce8a5d 100644 --- a/src/middleware/render.js +++ b/src/middleware/render.js @@ -78,14 +78,17 @@ module.exports = function (middleware) { function (results, next) { var str = results.header + (res.locals.postHeader || '') + - results.content + + results.content + '' + (res.locals.preFooter || '') + results.footer; translate(str, req, res, next); }, function (translated, next) { - next(null, translated + ''); + translated = translated.replace('', function () { + return ''; + }); + next(null, translated); } ], fn); }; diff --git a/src/navigation/admin.js b/src/navigation/admin.js index 39258e6702..ab1c5aff42 100644 --- a/src/navigation/admin.js +++ b/src/navigation/admin.js @@ -1,14 +1,12 @@ "use strict"; - - var async = require('async'); var plugins = require('../plugins'); var db = require('../database'); var translator = require('../../public/src/modules/translator'); var pubsub = require('../pubsub'); -var admin = {}; +var admin = module.exports; admin.cache = null; pubsub.on('admin:navigation:save', function () { @@ -71,5 +69,3 @@ function getAvailable(callback) { plugins.fireHook('filter:navigation.available', core, callback); } - -module.exports = admin; \ No newline at end of file diff --git a/src/plugins.js b/src/plugins.js index 789c92b72c..15f4b91650 100644 --- a/src/plugins.js +++ b/src/plugins.js @@ -32,6 +32,7 @@ var middleware; Plugins.libraryPaths = []; Plugins.versionWarning = []; Plugins.languageCodes = []; + Plugins.soundpacks = []; Plugins.initialized = false; diff --git a/src/plugins/install.js b/src/plugins/install.js index a914a09ca6..840d46008a 100644 --- a/src/plugins/install.js +++ b/src/plugins/install.js @@ -102,7 +102,7 @@ module.exports = function (Plugins) { } function runNpmCommand(command, pkgName, version, callback) { - require('child_process').execFile('npm', [command, pkgName + (command === 'install' ? '@' + version : '')], function (err, stdout) { + require('child_process').execFile((process.platform === 'win32') ? 'npm.cmd' : 'npm', [command, pkgName + (command === 'install' ? '@' + version : '')], function (err, stdout) { if (err) { return callback(err); } diff --git a/src/plugins/load.js b/src/plugins/load.js index 3121f8457e..c6a9429667 100644 --- a/src/plugins/load.js +++ b/src/plugins/load.js @@ -41,6 +41,7 @@ module.exports = function (Plugins) { Plugins.lessFiles.length = 0; Plugins.clientScripts.length = 0; Plugins.acpScripts.length = 0; + Plugins.soundpacks.length = 0; async.waterfall([ async.apply(Plugins.getPluginPaths), @@ -54,7 +55,10 @@ module.exports = function (Plugins) { async.parallel([ async.apply(mapFiles, pluginData, 'css', 'cssFiles'), async.apply(mapFiles, pluginData, 'less', 'lessFiles'), - async.apply(mapClientSideScripts, pluginData) + async.apply(mapClientSideScripts, pluginData), + async.apply(mapClientModules, pluginData), + async.apply(mapStaticDirectories, pluginData, pluginData.path), + async.apply(mapSoundpack, pluginData), ], next); }, next); } @@ -91,6 +95,9 @@ module.exports = function (Plugins) { function (next) { mapClientModules(pluginData, next); }, + function (next) { + mapSoundpack(pluginData, next); + }, ], function (err) { if (err) { winston.verbose('[plugins] Could not load plugin : ' + pluginData.id); @@ -249,6 +256,35 @@ module.exports = function (Plugins) { callback(); } + function mapSoundpack(pluginData, callback) { + var soundpack = pluginData.soundpack; + if (!soundpack || !soundpack.dir || !soundpack.sounds) { + return callback(); + } + soundpack.name = soundpack.name || pluginData.name; + soundpack.id = pluginData.id; + soundpack.dir = path.join(pluginData.path, soundpack.dir); + async.each(Object.keys(soundpack.sounds), function (key, next) { + file.exists(path.join(soundpack.dir, soundpack.sounds[key]), function (exists) { + if (!exists) { + delete soundpack.sounds[key]; + } + + next(); + }); + }, function (err) { + if (err) { + return callback(err); + } + + if (Object.keys(soundpack.sounds).length) { + Plugins.soundpacks.push(soundpack); + } + + callback(); + }); + } + function resolveModulePath(fullPath, relPath) { /** * With npm@3, dependencies can become flattened, and appear at the root level. @@ -298,6 +334,7 @@ module.exports = function (Plugins) { pluginData.version = packageData.version; pluginData.repository = packageData.repository; pluginData.nbbpm = packageData.nbbpm; + pluginData.path = pluginPath; } catch(err) { var pluginDir = pluginPath.split(path.sep); pluginDir = pluginDir[pluginDir.length - 1]; diff --git a/src/posts/recent.js b/src/posts/recent.js index aec0ea4637..5cc5cd1fae 100644 --- a/src/posts/recent.js +++ b/src/posts/recent.js @@ -1,8 +1,8 @@ 'use strict'; -var async = require('async'), - db = require('../database'), - privileges = require('../privileges'); +var async = require('async'); +var db = require('../database'); +var privileges = require('../privileges'); module.exports = function (Posts) { @@ -42,12 +42,12 @@ module.exports = function (Posts) { Posts.getPostsFields(pids, ['uid'], next); }, function (postData, next) { - postData = postData.map(function (post) { + var uids = postData.map(function (post) { return post && post.uid; - }).filter(function (value, index, array) { - return value && array.indexOf(value) === index; + }).filter(function (uid, index, array) { + return uid && array.indexOf(uid) === index; }); - next(null, postData); + next(null, uids); } ], callback); }; diff --git a/src/privileges/topics.js b/src/privileges/topics.js index 39ad054462..2350299e72 100644 --- a/src/privileges/topics.js +++ b/src/privileges/topics.js @@ -63,13 +63,14 @@ module.exports = function (privileges) { }; privileges.topics.can = function (privilege, tid, uid, callback) { - topics.getTopicField(tid, 'cid', function (err, cid) { - if (err) { - return callback(err); + async.waterfall([ + function (next) { + topics.getTopicField(tid, 'cid', next); + }, + function (cid, next) { + privileges.categories.can(privilege, cid, uid, next); } - - privileges.categories.can(privilege, cid, uid, callback); - }); + ], callback); }; privileges.topics.filterTids = function (privilege, tids, uid, callback) { diff --git a/src/pubsub.js b/src/pubsub.js index a2e11746e1..f5c6c2f0ed 100644 --- a/src/pubsub.js +++ b/src/pubsub.js @@ -1,10 +1,10 @@ 'use strict'; -var nconf = require('nconf'), - util = require('util'), - winston = require('winston'), - EventEmitter = require('events').EventEmitter; +var nconf = require('nconf'); +var util = require('util'); +var winston = require('winston'); +var EventEmitter = require('events').EventEmitter; var channelName; diff --git a/src/reset.js b/src/reset.js index 3baf145edf..d237059f8e 100644 --- a/src/reset.js +++ b/src/reset.js @@ -12,20 +12,32 @@ Reset.reset = function (callback) { db.init(function (err) { if (err) { winston.error(err.message); - process.exit(); + process.exit(1); } if (nconf.get('t')) { - if(nconf.get('t') === true) { + var themeId = nconf.get('t'); + if (themeId === true) { resetThemes(callback); } else { - resetTheme(nconf.get('t'), callback); + if (themeId.indexOf('nodebb-') !== 0) { + // Allow omission of `nodebb-theme-` + themeId = 'nodebb-theme-' + themeId; + } + + resetTheme(themeId, callback); } } else if (nconf.get('p')) { - if (nconf.get('p') === true) { + var pluginId = nconf.get('p'); + if (pluginId === true) { resetPlugins(callback); } else { - resetPlugin(nconf.get('p'), callback); + if (pluginId.indexOf('nodebb-') !== 0) { + // Allow omission of `nodebb-plugin-` + pluginId = 'nodebb-plugin-' + pluginId; + } + + resetPlugin(pluginId, callback); } } else if (nconf.get('w')) { resetWidgets(callback); @@ -39,11 +51,7 @@ Reset.reset = function (callback) { winston.error('[reset] Errors were encountered while resetting your forum settings: %s', err.message); } - if (typeof callback === 'function') { - callback(); - } else { - process.exit(0); - } + callback(); }); } else { process.stdout.write('\nNodeBB Reset\n'.bold); @@ -58,7 +66,7 @@ Reset.reset = function (callback) { process.stdout.write('\nPlugin and theme reset flags (-p & -t) can take a single argument\n'); process.stdout.write(' e.g. ./nodebb reset -p nodebb-plugin-mentions, ./nodebb reset -t nodebb-theme-persona\n'); - process.exit(); + process.exit(0); } }); }; @@ -67,11 +75,7 @@ function resetSettings(callback) { var meta = require('./meta'); meta.configs.set('allowLocalLogin', 1, function (err) { winston.info('[reset] Settings reset to default'); - if (typeof callback === 'function') { - callback(err); - } else { - process.exit(); - } + callback(err); }); } @@ -82,7 +86,7 @@ function resetTheme(themeId, callback) { fs.access('node_modules/' + themeId + '/package.json', function (err, fd) { if (err) { winston.warn('[reset] Theme `%s` is not installed on this forum', themeId); - process.exit(); + callback(new Error('theme-not-found')); } else { meta.themes.set({ type: 'local', @@ -94,11 +98,7 @@ function resetTheme(themeId, callback) { winston.info('[reset] Theme reset to ' + themeId); } - if (typeof callback === 'function') { - callback(); - } else { - process.exit(0); - } + callback(); }); } }); @@ -112,11 +112,7 @@ function resetThemes(callback) { id: 'nodebb-theme-persona' }, function (err) { winston.info('[reset] Theme reset to Persona'); - if (typeof callback === 'function') { - callback(err); - } else { - process.exit(0); - } + callback(err); }); } @@ -143,36 +139,25 @@ function resetPlugin(pluginId, callback) { } else { winston.warn('[reset] Plugin `%s` was not active on this forum', pluginId); winston.info('[reset] No action taken.'); + err = new Error('plugin-not-active'); } } - if (typeof callback === 'function') { - callback(); - } else { - process.exit(0); - } + callback(err); }); } function resetPlugins(callback) { db.delete('plugins:active', function (err) { winston.info('[reset] All Plugins De-activated'); - if (typeof callback === 'function') { - callback(err); - } else { - process.exit(0); - } + callback(err); }); } function resetWidgets(callback) { require('./widgets').reset(function (err) { winston.info('[reset] All Widgets moved to Draft Zone'); - if (typeof callback === 'function') { - callback(err); - } else { - process.exit(); - } + callback(err); }); } diff --git a/src/rewards/admin.js b/src/rewards/admin.js index fcfacf5877..ec5a26d5aa 100644 --- a/src/rewards/admin.js +++ b/src/rewards/admin.js @@ -1,35 +1,14 @@ "use strict"; -var rewards = {}, - async = require('async'), - plugins = require('../plugins'), - db = require('../database'); +var async = require('async'); +var plugins = require('../plugins'); +var db = require('../database'); +var rewards = module.exports; rewards.save = function (data, callback) { - function save(data, next) { - function commit(err, id) { - if (err) { - return callback(err); - } - data.id = id; - - async.series([ - function (next) { - rewards.delete(data, next); - }, - function (next) { - db.setAdd('rewards:list', data.id, next); - }, - function (next) { - db.setObject('rewards:id:' + data.id, data, next); - }, - function (next) { - db.setObject('rewards:id:' + data.id + ':rewards', rewardsData, next); - } - ], next); - } + async.each(data, function save(data, next) { if (!Object.keys(data.rewards).length) { return next(); @@ -38,14 +17,36 @@ rewards.save = function (data, callback) { var rewardsData = data.rewards; delete data.rewards; - if (!parseInt(data.id, 10)) { - db.incrObjectField('global', 'rewards:id', commit); - } else { - commit(false, data.id); - } - } + async.waterfall([ + function (next) { + if (!parseInt(data.id, 10)) { + db.incrObjectField('global', 'rewards:id', next); + } else { + next(null, data.id); + } + }, + function (rid, next) { - async.each(data, save, function (err) { + data.id = rid; + + async.series([ + function (next) { + rewards.delete(data, next); + }, + function (next) { + db.setAdd('rewards:list', data.id, next); + }, + function (next) { + db.setObject('rewards:id:' + data.id, data, next); + }, + function (next) { + db.setObject('rewards:id:' + data.id + ':rewards', rewardsData, next); + } + ], next); + } + ], next); + + }, function (err) { if (err) { return callback(err); } @@ -84,25 +85,29 @@ rewards.get = function (callback) { }; function saveConditions(data, callback) { - db.delete('conditions:active', function (err) { - if (err) { - return callback(err); + var rewardsPerCondition = {}; + async.waterfall([ + function (next) { + db.delete('conditions:active', next); + }, + function (next) { + var conditions = []; + + data.forEach(function (reward) { + conditions.push(reward.condition); + rewardsPerCondition[reward.condition] = rewardsPerCondition[reward.condition] || []; + rewardsPerCondition[reward.condition].push(reward.id); + }); + + db.setAdd('conditions:active', conditions, next); + }, + function (next) { + async.each(Object.keys(rewardsPerCondition), function (condition, next) { + db.setAdd('condition:' + condition + ':rewards', rewardsPerCondition[condition], next); + }, next); } - - var conditions = [], - rewardsPerCondition = {}; - - data.forEach(function (reward) { - conditions.push(reward.condition); - rewardsPerCondition[reward.condition] = rewardsPerCondition[reward.condition] || []; - rewardsPerCondition[reward.condition].push(reward.id); - }); - - db.setAdd('conditions:active', conditions, callback); - - async.each(Object.keys(rewardsPerCondition), function (condition, next) { - db.setAdd('condition:' + condition + ':rewards', rewardsPerCondition[condition], next); - }, callback); + ], function (err) { + callback(err); }); } @@ -138,5 +143,3 @@ function getActiveRewards(callback) { }); }); } - -module.exports = rewards; diff --git a/src/rewards/index.js b/src/rewards/index.js index 4ba403fce8..e2bc024f13 100644 --- a/src/rewards/index.js +++ b/src/rewards/index.js @@ -1,40 +1,36 @@ "use strict"; -var rewards = {}, - db = require('../database'), - plugins = require('../plugins'), - async = require('async'); +var db = require('../database'); +var plugins = require('../plugins'); +var async = require('async'); + +var rewards = module.exports; rewards.checkConditionAndRewardUser = function (uid, condition, method, callback) { + callback = callback || function () {}; + async.waterfall([ function (next) { - isConditionActive(condition, function (err, isActive) { - if (!isActive) { - return back(err); - } - - next(err); - }); + isConditionActive(condition, next); }, - function (next) { - getIDsByCondition(condition, function (err, ids) { - next(err, ids); - }); + function (isActive, next) { + if (!isActive) { + return callback(); + } + getIDsByCondition(condition, next); }, function (ids, next) { getRewardDataByIDs(ids, next); }, function (rewards, next) { - filterCompletedRewards(uid, rewards, function (err, filtered) { - if (!filtered || !filtered.length) { - return back(err); - } - - next(err, filtered); - }); + filterCompletedRewards(uid, rewards, next); }, function (rewards, next) { + if (!rewards || !rewards.length) { + return callback(); + } + async.filter(rewards, function (reward, next) { if (!reward) { return next(false); @@ -49,14 +45,7 @@ rewards.checkConditionAndRewardUser = function (uid, condition, method, callback giveRewards(uid, eligible, next); }); } - ], back); - - - function back(err) { - if (typeof callback === 'function') { - callback(err); - } - } + ], callback); }; function isConditionActive(condition, callback) { @@ -86,14 +75,10 @@ function filterCompletedRewards(uid, rewards, callback) { var claimable = parseInt(reward.claimable, 10); - if (claimable === 0) { - return true; - } - - return (userRewards[reward.id] >= reward.claimable) ? false : true; + return claimable === 0 || (userRewards[reward.id] < reward.claimable); }); - callback(false, rewards); + callback(null, rewards); }); } @@ -133,6 +118,3 @@ function giveRewards(uid, rewards, callback) { }, callback); }); } - - -module.exports = rewards; \ No newline at end of file diff --git a/src/routes/api.js b/src/routes/api.js index be76336c77..98c884c237 100644 --- a/src/routes/api.js +++ b/src/routes/api.js @@ -29,12 +29,13 @@ module.exports = function (app, middleware, controllers) { var multipart = require('connect-multiparty'); var multipartMiddleware = multipart(); - var middlewares = [multipartMiddleware, middleware.validateFiles, middleware.applyCSRF]; + var middlewares = [middleware.maintenanceMode, multipartMiddleware, middleware.validateFiles, middleware.applyCSRF]; router.post('/post/upload', middlewares, uploadsController.uploadPost); router.post('/topic/thumb/upload', middlewares, uploadsController.uploadThumb); router.post('/user/:userslug/uploadpicture', middlewares.concat([middleware.authenticate, middleware.checkGlobalPrivacySettings, middleware.checkAccountPermissions]), controllers.accounts.edit.uploadPicture); router.post('/user/:userslug/uploadcover', middlewares.concat([middleware.authenticate, middleware.checkGlobalPrivacySettings, middleware.checkAccountPermissions]), controllers.accounts.edit.uploadCoverPicture); router.post('/groups/uploadpicture', middlewares.concat([middleware.authenticate]), controllers.groups.uploadCover); + }; diff --git a/src/routes/feeds.js b/src/routes/feeds.js index 50ebbc9342..9521e65ce8 100644 --- a/src/routes/feeds.js +++ b/src/routes/feeds.js @@ -3,6 +3,7 @@ var async = require('async'); var rss = require('rss'); var nconf = require('nconf'); +var validator = require('validator'); var posts = require('../posts'); var topics = require('../topics'); @@ -12,6 +13,18 @@ var meta = require('../meta'); var helpers = require('../controllers/helpers'); var privileges = require('../privileges'); +module.exports = function (app, middleware, controllers) { + app.get('/topic/:topic_id.rss', middleware.maintenanceMode, generateForTopic); + app.get('/category/:category_id.rss', middleware.maintenanceMode, generateForCategory); + app.get('/recent.rss', middleware.maintenanceMode, generateForRecent); + app.get('/popular.rss', middleware.maintenanceMode, generateForPopular); + app.get('/popular/:term.rss', middleware.maintenanceMode, generateForPopular); + app.get('/recentposts.rss', middleware.maintenanceMode, generateForRecentPosts); + app.get('/category/:category_id/recentposts.rss', middleware.maintenanceMode, generateForCategoryRecentPosts); + app.get('/user/:userslug/topics.rss', middleware.maintenanceMode, generateForUserTopics); + app.get('/tags/:tag.rss', middleware.maintenanceMode, generateForTag); +}; + function generateForTopic(req, res, callback) { if (parseInt(meta.config['feeds:disableRSS'], 10) === 1) { @@ -56,15 +69,15 @@ function generateForTopic(req, res, callback) { var author = topicData.posts.length ? topicData.posts[0].username : ''; var feed = new rss({ - title: topicData.title, - description: description, - feed_url: nconf.get('url') + '/topic/' + tid + '.rss', - site_url: nconf.get('url') + '/topic/' + topicData.slug, - image_url: image_url, - author: author, - ttl: 60 - }), - dateStamp; + title: topicData.title, + description: description, + feed_url: nconf.get('url') + '/topic/' + tid + '.rss', + site_url: nconf.get('url') + '/topic/' + topicData.slug, + image_url: image_url, + author: author, + ttl: 60 + }); + var dateStamp; if (topicData.posts.length > 0) { feed.pubDate = new Date(parseInt(topicData.posts[0].timestamp, 10)).toUTCString(); @@ -189,38 +202,42 @@ function generateForPopular(req, res, next) { }; var term = terms[req.params.term] || 'day'; - topics.getPopular(term, req.uid, 19, function (err, topics) { + async.waterfall([ + function (next) { + topics.getPopular(term, req.uid, 19, next); + }, + function (topics, next) { + generateTopicsFeed({ + uid: req.uid, + title: 'Popular Topics', + description: 'A list of topics that are sorted by post count', + feed_url: '/popular/' + (req.params.term || 'daily') + '.rss', + site_url: '/popular/' + (req.params.term || 'daily') + }, topics, next); + } + ], function (err, feed) { if (err) { return next(err); } - - generateTopicsFeed({ - uid: req.uid, - title: 'Popular Topics', - description: 'A list of topics that are sorted by post count', - feed_url: '/popular/' + (req.params.term || 'daily') + '.rss', - site_url: '/popular/' + (req.params.term || 'daily') - }, topics, function (err, feed) { - if (err) { - return next(err); - } - sendFeed(feed, res); - }); + sendFeed(feed, res); }); } function generateForTopics(options, set, req, res, next) { - topics.getTopicsFromSet(set, req.uid, 0, 19, function (err, data) { + var start = options.hasOwnProperty('start') ? options.start : 0; + var stop = options.hasOwnProperty('stop') ? options.stop : 19; + async.waterfall([ + function (next) { + topics.getTopicsFromSet(set, req.uid, start, stop, next); + }, + function (data, next) { + generateTopicsFeed(options, data.topics, next); + } + ], function (err, feed) { if (err) { return next(err); } - - generateTopicsFeed(options, data.topics, function (err, feed) { - if (err) { - return next(err); - } - sendFeed(feed, res); - }); + sendFeed(feed, res); }); } @@ -359,18 +376,29 @@ function generateForPostsFeed(feedOptions, posts) { return feed; } +function generateForTag(req, res, next) { + if (parseInt(meta.config['feeds:disableRSS'], 10) === 1) { + return next(); + } + var tag = validator.escape(String(req.params.tag)); + var page = parseInt(req.query.page, 10) || 1; + var topicsPerPage = meta.config.topicsPerPage || 20; + var start = Math.max(0, (page - 1) * topicsPerPage); + var stop = start + topicsPerPage - 1; + generateForTopics({ + uid: req.uid, + title: 'Topics tagged with ' + tag, + description: 'A list of topics that have been tagged with ' + tag, + feed_url: '/tags/' + tag + '.rss', + site_url: '/tags/' + tag, + start: start, + stop: stop + }, 'tag:' + tag + ':topics', req, res, next); +} + function sendFeed(feed, res) { var xml = feed.xml(); res.type('xml').set('Content-Length', Buffer.byteLength(xml)).send(xml); } -module.exports = function (app, middleware, controllers) { - app.get('/topic/:topic_id.rss', generateForTopic); - app.get('/category/:category_id.rss', generateForCategory); - app.get('/recent.rss', generateForRecent); - app.get('/popular.rss', generateForPopular); - app.get('/popular/:term.rss', generateForPopular); - app.get('/recentposts.rss', generateForRecentPosts); - app.get('/category/:category_id/recentposts.rss', generateForCategoryRecentPosts); - app.get('/user/:userslug/topics.rss', generateForUserTopics); -}; + diff --git a/src/routes/helpers.js b/src/routes/helpers.js index 052d99292c..2379c7ebf1 100644 --- a/src/routes/helpers.js +++ b/src/routes/helpers.js @@ -3,7 +3,7 @@ var helpers = {}; helpers.setupPageRoute = function (router, name, middleware, middlewares, controller) { - middlewares = middlewares.concat([middleware.registrationComplete, middleware.pageView, middleware.pluginHooks]); + middlewares = middlewares.concat([middleware.maintenanceMode, middleware.registrationComplete, middleware.pageView, middleware.pluginHooks]); router.get(name, middleware.busyCheck, middleware.buildHeader, middlewares, controller); router.get('/api' + name, middlewares, controller); diff --git a/src/routes/index.js b/src/routes/index.js index 13633f2bc8..b49a429420 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -15,7 +15,6 @@ var metaRoutes = require('./meta'); var apiRoutes = require('./api'); var adminRoutes = require('./admin'); var feedRoutes = require('./feeds'); -var pluginRoutes = require('./plugins'); var authRoutes = require('./authentication'); var helpers = require('./helpers'); @@ -117,13 +116,10 @@ module.exports = function (app, middleware, hotswapIds) { app.all(relativePath + '(/api/admin|/api/admin/*?)', middleware.isAdmin); app.all(relativePath + '(/admin|/admin/*?)', ensureLoggedIn.ensureLoggedIn(nconf.get('relative_path') + '/login?local=1'), middleware.applyCSRF, middleware.isAdmin); - app.use(middleware.maintenanceMode); - adminRoutes(router, middleware, controllers); metaRoutes(router, middleware, controllers); apiRoutes(router, middleware, controllers); feedRoutes(router, middleware, controllers); - pluginRoutes(router, middleware, controllers); mainRoutes(router, middleware, controllers); topicRoutes(router, middleware, controllers); @@ -145,21 +141,60 @@ module.exports = function (app, middleware, hotswapIds) { } app.use(middleware.privateUploads); - app.use(relativePath + '/assets', express.static(path.join(__dirname, '../../', 'build/public'), { - maxAge: app.enabled('cache') ? 5184000000 : 0 - })); + + var statics = [ + { route: '/assets', path: path.join(__dirname, '../../build/public') }, + { route: '/assets', path: path.join(__dirname, '../../public') }, + { route: '/plugins', path: path.join(__dirname, '../../build/public/plugins') }, + ]; + var staticOptions = { + maxAge: app.enabled('cache') ? 5184000000 : 0, + }; + + if (path.resolve(__dirname, '../../public/uploads') !== nconf.get('upload_path')) { + statics.unshift({ route: '/assets/uploads', path: nconf.get('upload_path') }); + } + + statics.forEach(function (obj) { + app.use(relativePath + obj.route, express.static(obj.path, staticOptions)); + }); + app.use(relativePath + '/uploads', function (req, res) { + res.redirect(relativePath + '/assets/uploads' + req.path + '?' + meta.config['cache-buster']); + }); + // DEPRECATED + var deprecatedPaths = [ + '/nodebb.min.js', + '/acp.min.js', + '/stylesheet.css', + '/js-enabled.css', + '/admin.css', + '/logo.png', + '/favicon.ico', + '/vendor/', + '/templates/', + '/src/', + '/images/', + '/language/', + '/sounds/', + ]; + app.use(relativePath, function (req, res, next) { + if (deprecatedPaths.some(function (path) { return req.path.startsWith(path); })) { + winston.warn('[deprecated] Accessing `' + req.path.slice(1) + '` from `/` is deprecated. ' + + 'Use `/assets' + req.path + '` to access this file.'); + res.redirect(relativePath + '/assets' + req.path + '?' + meta.config['cache-buster']); + } else { + next(); + } + }); // DEPRECATED app.use(relativePath + '/api/language', function (req, res) { - winston.warn('[deprecated] Accessing language files from `/api/language` is deprecated. ' + + winston.warn('[deprecated] Accessing language files from `/api/language` is deprecated. ' + 'Use `/assets/language' + req.path + '.json` for prefetch paths.'); res.redirect(relativePath + '/assets/language' + req.path + '.json?' + meta.config['cache-buster']); }); - app.use(relativePath, express.static(path.join(__dirname, '../../', 'public'), { - maxAge: app.enabled('cache') ? 5184000000 : 0 - })); - app.use(relativePath + '/vendor/jquery/timeago/locales', middleware.processTimeagoLocales); + app.use(relativePath + '/assets/vendor/jquery/timeago/locales', middleware.processTimeagoLocales); app.use(controllers.handle404); app.use(controllers.handleURIErrors); app.use(controllers.handleErrors); diff --git a/src/routes/meta.js b/src/routes/meta.js index c62465c8d0..cb089f1200 100644 --- a/src/routes/meta.js +++ b/src/routes/meta.js @@ -1,51 +1,6 @@ "use strict"; -var path = require('path'); -var nconf = require('nconf'); - -var meta = require('../meta'); - - -function sendMinifiedJS(req, res) { - var target = path.basename(req.path); - var cache = meta.js.target[target] ? meta.js.target[target].cache : ''; - res.type('text/javascript').send(cache); -} - -// The portions of code involving the source map are commented out as they're broken in UglifyJS2 -// Follow along here: https://github.com/mishoo/UglifyJS2/issues/700 -// function sendJSSourceMap(req, res) { -// if (meta.js.hasOwnProperty('map')) { -// res.type('application/json').send(meta.js.map); -// } else { -// res.redirect(404); -// } -// }; - -function sendStylesheet(req, res) { - res.type('text/css').status(200).send(meta.css.cache); -} - -function sendACPStylesheet(req, res) { - res.type('text/css').status(200).send(meta.css.acpCache); -} - -function sendSoundFile(req, res, next) { - var resolved = meta.sounds._filePathHash[path.basename(req.path)]; - - if (resolved) { - res.status(200).sendFile(resolved); - } else { - next(); - } -} - module.exports = function (app, middleware, controllers) { - app.get('/stylesheet.css', middleware.addExpiresHeaders, sendStylesheet); - app.get('/admin.css', middleware.addExpiresHeaders, sendACPStylesheet); - app.get('/nodebb.min.js', middleware.addExpiresHeaders, sendMinifiedJS); - app.get('/acp.min.js', middleware.addExpiresHeaders, sendMinifiedJS); - // app.get('/nodebb.min.js.map', middleware.addExpiresHeaders, sendJSSourceMap); app.get('/sitemap.xml', controllers.sitemap.render); app.get('/sitemap/pages.xml', controllers.sitemap.getPages); app.get('/sitemap/categories.xml', controllers.sitemap.getCategories); @@ -53,8 +8,4 @@ module.exports = function (app, middleware, controllers) { app.get('/robots.txt', controllers.robots); app.get('/manifest.json', controllers.manifest); app.get('/css/previews/:theme', controllers.admin.themes.get); - - if (nconf.get('local-assets') === false) { - app.get('/sounds/*', middleware.addExpiresHeaders, sendSoundFile); - } }; diff --git a/src/routes/plugins.js b/src/routes/plugins.js deleted file mode 100644 index 37e23c5ee6..0000000000 --- a/src/routes/plugins.js +++ /dev/null @@ -1,40 +0,0 @@ -"use strict"; - -var _ = require('underscore'); -var path = require('path'); - -var plugins = require('../plugins'); - -module.exports = function (app, middleware, controllers) { - // Static Assets - app.get('/plugins/:id/*', middleware.addExpiresHeaders, function (req, res, next) { - - var relPath = req._parsedUrl.pathname.replace('/plugins/', ''); - - var matches = _.map(plugins.staticDirs, function (realPath, mappedPath) { - if (relPath.match(mappedPath)) { - var pathToFile = path.join(plugins.staticDirs[mappedPath], decodeURIComponent(relPath.slice(mappedPath.length))); - if (pathToFile.startsWith(plugins.staticDirs[mappedPath])) { - return pathToFile; - } - } - - return null; - }).filter(Boolean); - - if (!matches || !matches.length) { - return next(); - } - - res.sendFile(matches[0], {}, function (err) { - if (err) { - if (err.code === 'ENOENT') { - // File doesn't exist, this isn't an error, to send to 404 handler - return next(); - } else { - return next(err); - } - } - }); - }); -}; \ No newline at end of file diff --git a/src/socket.io/admin.js b/src/socket.io/admin.js index b16bafa296..987f607ec9 100644 --- a/src/socket.io/admin.js +++ b/src/socket.io/admin.js @@ -57,7 +57,7 @@ SocketAdmin.reload = function (socket, data, callback) { }; SocketAdmin.restart = function (socket, data, callback) { - require('../../build').buildAll(function (err) { + require('../meta/build').buildAll(function (err) { if (err) { return callback(err); } diff --git a/src/socket.io/admin/rewards.js b/src/socket.io/admin/rewards.js index 266d5f532f..3d895a5281 100644 --- a/src/socket.io/admin/rewards.js +++ b/src/socket.io/admin/rewards.js @@ -1,7 +1,7 @@ "use strict"; -var rewardsAdmin = require('../../rewards/admin'), - SocketRewards = {}; +var rewardsAdmin = require('../../rewards/admin'); +var SocketRewards = module.exports; SocketRewards.save = function (socket, data, callback) { rewardsAdmin.save(data, callback); @@ -11,5 +11,3 @@ SocketRewards.delete = function (socket, data, callback) { rewardsAdmin.delete(data, callback); }; - -module.exports = SocketRewards; \ No newline at end of file diff --git a/src/socket.io/blacklist.js b/src/socket.io/blacklist.js index a05d632f3f..8592a8b901 100644 --- a/src/socket.io/blacklist.js +++ b/src/socket.io/blacklist.js @@ -1,9 +1,6 @@ 'use strict'; -var async = require('async'); -var winston = require('winston'); - var user = require('../user'); var meta = require('../meta'); diff --git a/src/socket.io/groups.js b/src/socket.io/groups.js index 5bff7ba944..47453b6e0a 100644 --- a/src/socket.io/groups.js +++ b/src/socket.io/groups.js @@ -1,6 +1,6 @@ "use strict"; -var async = require('async'); +var async = require('async'); var groups = require('../groups'); var meta = require('../meta'); @@ -77,7 +77,7 @@ function isOwner(next) { isAdmin: async.apply(user.isAdministrator, socket.uid), isOwner: async.apply(groups.ownership.isOwner, socket.uid, data.groupName) }, function (err, results) { - if (err || (!isOwner && !results.isAdmin)) { + if (err || (!results.isOwner && !results.isAdmin)) { return callback(err || new Error('[[error:no-privileges]]')); } next(socket, data, callback); @@ -141,22 +141,25 @@ SocketGroups.issueMassInvite = isOwner(function (socket, data, callback) { if (!data || !data.usernames || !data.groupName) { return callback(new Error('[[error:invalid-data]]')); } - var usernames = data.usernames.split(','); + var usernames = String(data.usernames).split(','); usernames = usernames.map(function (username) { return username && username.trim(); }); - user.getUidsByUsernames(usernames, function (err, uids) { - if (err) { - return callback(err); - } - uids = uids.filter(function (uid) { - return !!uid && parseInt(uid, 10); - }); - async.eachSeries(uids, function (uid, next) { - groups.invite(data.groupName, uid, next); - }, callback); - }); + async.waterfall([ + function (next) { + user.getUidsByUsernames(usernames, next); + }, + function (uids, next) { + uids = uids.filter(function (uid) { + return !!uid && parseInt(uid, 10); + }); + + async.eachSeries(uids, function (uid, next) { + groups.invite(data.groupName, uid, next); + }, next); + } + ], callback); }); SocketGroups.rescindInvite = isOwner(function (socket, data, callback) { @@ -181,13 +184,14 @@ SocketGroups.kick = isOwner(function (socket, data, callback) { return callback(new Error('[[error:cant-kick-self]]')); } - groups.ownership.isOwner(data.uid, data.groupName, function (err, isOwner) { - if (err) { - return callback(err); + async.waterfall([ + function (next) { + groups.ownership.isOwner(data.uid, data.groupName, next); + }, + function (isOwner, next) { + groups.kick(data.uid, data.groupName, isOwner, next); } - groups.kick(data.uid, data.groupName, isOwner, callback); - }); - + ], callback); }); SocketGroups.create = function (socket, data, callback) { @@ -199,32 +203,19 @@ SocketGroups.create = function (socket, data, callback) { return callback(new Error('[[error:invalid-group-name]]')); } - data.ownerUid = socket.uid; groups.create(data, callback); }; -SocketGroups.delete = function (socket, data, callback) { +SocketGroups.delete = isOwner(function (socket, data, callback) { if (data.groupName === 'administrators' || data.groupName === 'registered-users' || data.groupName === 'Global Moderators') { return callback(new Error('[[error:not-allowed]]')); } - async.parallel({ - isOwner: async.apply(groups.ownership.isOwner, socket.uid, data.groupName), - isAdmin: async.apply(user.isAdministrator, socket.uid) - }, function (err, checks) { - if (err) { - return callback(err); - } - if (!checks.isOwner && !checks.isAdmin) { - return callback(new Error('[[error:no-privileges]]')); - } - - groups.destroy(data.groupName, callback); - }); -}; + groups.destroy(data.groupName, callback); +}); SocketGroups.search = function (socket, data, callback) { data.options = data.options || {}; @@ -242,7 +233,7 @@ SocketGroups.search = function (socket, data, callback) { SocketGroups.loadMore = function (socket, data, callback) { if (!data.sort || !utils.isNumber(data.after) || parseInt(data.after, 10) < 0) { - return callback(); + return callback(new Error('[[error:invalid-data]]')); } var groupsPerPage = 9; @@ -261,13 +252,17 @@ SocketGroups.loadMoreMembers = function (socket, data, callback) { return callback(new Error('[[error:invalid-data]]')); } data.after = parseInt(data.after, 10); - user.getUsersFromSet('group:' + data.groupName + ':members', socket.uid, data.after, data.after + 9, function (err, users) { - if (err) { - return callback(err); + async.waterfall([ + function (next) { + user.getUsersFromSet('group:' + data.groupName + ':members', socket.uid, data.after, data.after + 9, next); + }, + function (users, next) { + next(null, { + users: users, + nextStart: data.after + 10 + }); } - - callback(null, {users: users, nextStart: data.after + 10}); - }); + ], callback); }; SocketGroups.cover = {}; diff --git a/src/socket.io/index.js b/src/socket.io/index.js index 38e73c1cc1..01a520585d 100644 --- a/src/socket.io/index.js +++ b/src/socket.io/index.js @@ -7,223 +7,263 @@ var url = require('url'); var cookieParser = require('cookie-parser')(nconf.get('secret')); var db = require('../database'); +var user = require('../user'); var logger = require('../logger'); var ratelimit = require('../middleware/ratelimit'); -(function (Sockets) { - var Namespaces = {}; - var io; - Sockets.init = function (server) { - requireModules(); +var Namespaces = {}; +var io; - var SocketIO = require('socket.io'); - var socketioWildcard = require('socketio-wildcard')(); - io = new SocketIO({ - path: nconf.get('relative_path') + '/socket.io' - }); +var Sockets = module.exports; - addRedisAdapter(io); +Sockets.init = function (server) { + requireModules(); - io.use(socketioWildcard); - io.use(authorize); + var SocketIO = require('socket.io'); + var socketioWildcard = require('socketio-wildcard')(); + io = new SocketIO({ + path: nconf.get('relative_path') + '/socket.io' + }); - io.on('connection', onConnection); + addRedisAdapter(io); - io.listen(server, { - transports: nconf.get('socket.io:transports') - }); + io.use(socketioWildcard); + io.use(authorize); - Sockets.server = io; - }; + io.on('connection', onConnection); - function onConnection(socket) { - socket.ip = socket.request.headers['x-forwarded-for'] || socket.request.connection.remoteAddress; + /* + * Restrict socket.io listener to cookie domain. If none is set, infer based on url. + * Production only so you don't get accidentally locked out. + * Can be overridden via config (socket.io:origins) + */ + if (process.env.NODE_ENV !== 'development') { + var domain = nconf.get('cookieDomain'); + var parsedUrl = url.parse(nconf.get('url')); + var override = nconf.get('socket.io:origins'); + if (!domain) { + domain = parsedUrl.hostname; // cookies don't provide isolation by port: http://stackoverflow.com/a/16328399/122353 + } - logger.io_one(socket, socket.uid); - - onConnect(socket); - - socket.on('*', function (payload) { - onMessage(socket, payload); - }); - } - - function onConnect(socket) { - if (socket.uid) { - socket.join('uid_' + socket.uid); - socket.join('online_users'); + if (!override) { + io.origins(parsedUrl.protocol + '//' + domain + ':*'); + winston.info('[socket.io] Restricting access to origin: ' + parsedUrl.protocol + '//' + domain + ':*'); } else { - socket.join('online_guests'); + io.origins(override); + winston.info('[socket.io] Restricting access to origin: ' + override); } - - socket.join('sess_' + socket.request.signedCookies[nconf.get('sessionKey')]); - io.sockets.sockets[socket.id].emit('checkSession', socket.uid); } - function onMessage(socket, payload) { - if (!payload.data.length) { - return winston.warn('[socket.io] Empty payload'); + io.listen(server, { + transports: nconf.get('socket.io:transports') + }); + + Sockets.server = io; +}; + +function onConnection(socket) { + socket.ip = socket.request.headers['x-forwarded-for'] || socket.request.connection.remoteAddress; + + logger.io_one(socket, socket.uid); + + onConnect(socket); + + socket.on('*', function (payload) { + onMessage(socket, payload); + }); +} + +function onConnect(socket) { + if (socket.uid) { + socket.join('uid_' + socket.uid); + socket.join('online_users'); + } else { + socket.join('online_guests'); + } + + socket.join('sess_' + socket.request.signedCookies[nconf.get('sessionKey')]); + io.sockets.sockets[socket.id].emit('checkSession', socket.uid); +} + +function onMessage(socket, payload) { + if (!payload.data.length) { + return winston.warn('[socket.io] Empty payload'); + } + + var eventName = payload.data[0]; + var params = payload.data[1]; + var callback = typeof payload.data[payload.data.length - 1] === 'function' ? payload.data[payload.data.length - 1] : function () { + }; + + if (!eventName) { + return winston.warn('[socket.io] Empty method name'); + } + + var parts = eventName.toString().split('.'); + var namespace = parts[0]; + var methodToCall = parts.reduce(function (prev, cur) { + if (prev !== null && prev[cur]) { + return prev[cur]; + } else { + return null; } + }, Namespaces); - var eventName = payload.data[0]; - var params = payload.data[1]; - var callback = typeof payload.data[payload.data.length - 1] === 'function' ? payload.data[payload.data.length - 1] : function () { - }; - - if (!eventName) { - return winston.warn('[socket.io] Empty method name'); + if (!methodToCall) { + if (process.env.NODE_ENV === 'development') { + winston.warn('[socket.io] Unrecognized message: ' + eventName); } + return callback({message: '[[error:invalid-event]]'}); + } - var parts = eventName.toString().split('.'); - var namespace = parts[0]; - var methodToCall = parts.reduce(function (prev, cur) { - if (prev !== null && prev[cur]) { - return prev[cur]; + socket.previousEvents = socket.previousEvents || []; + socket.previousEvents.push(eventName); + if (socket.previousEvents.length > 20) { + socket.previousEvents.shift(); + } + + if (!eventName.startsWith('admin.') && ratelimit.isFlooding(socket)) { + winston.warn('[socket.io] Too many emits! Disconnecting uid : ' + socket.uid + '. Events : ' + socket.previousEvents); + return socket.disconnect(); + } + + async.waterfall([ + function (next) { + checkMaintenance(socket, next); + }, + function (next) { + validateSession(socket, next); + }, + function (next) { + if (Namespaces[namespace].before) { + Namespaces[namespace].before(socket, eventName, params, next); } else { - return null; + next(); } - }, Namespaces); + }, + function (next) { + methodToCall(socket, params, next); + } + ], function (err, result) { + callback(err ? {message: err.message} : null, result); + }); +} - if (!methodToCall) { - if (process.env.NODE_ENV === 'development') { - winston.warn('[socket.io] Unrecognized message: ' + eventName); - } - return callback({message: '[[error:invalid-event]]'}); +function requireModules() { + var modules = ['admin', 'categories', 'groups', 'meta', 'modules', + 'notifications', 'plugins', 'posts', 'topics', 'user', 'blacklist' + ]; + + modules.forEach(function (module) { + Namespaces[module] = require('./' + module); + }); +} + +function checkMaintenance(socket, callback) { + var meta = require('../meta'); + if (parseInt(meta.config.maintenanceMode, 10) !== 1) { + return setImmediate(callback); + } + user.isAdministrator(socket.uid, function (err, isAdmin) { + if (err || isAdmin) { + return callback(err); + } + }); +} + +function validateSession(socket, callback) { + var req = socket.request; + if (!req.signedCookies || !req.signedCookies[nconf.get('sessionKey')]) { + return callback(new Error('[[error:invalid-session]]')); + } + db.sessionStore.get(req.signedCookies[nconf.get('sessionKey')], function (err, sessionData) { + if (err || !sessionData) { + return callback(err || new Error('[[error:invalid-session]]')); } - socket.previousEvents = socket.previousEvents || []; - socket.previousEvents.push(eventName); - if (socket.previousEvents.length > 20) { - socket.previousEvents.shift(); - } + callback(); + }); +} - if (!eventName.startsWith('admin.') && ratelimit.isFlooding(socket)) { - winston.warn('[socket.io] Too many emits! Disconnecting uid : ' + socket.uid + '. Events : ' + socket.previousEvents); - return socket.disconnect(); - } +function authorize(socket, callback) { + var request = socket.request; - async.waterfall([ - function (next) { - validateSession(socket, next); - }, - function (next) { - if (Namespaces[namespace].before) { - Namespaces[namespace].before(socket, eventName, params, next); - } else { - next(); + if (!request) { + return callback(new Error('[[error:not-authorized]]')); + } + + async.waterfall([ + function (next) { + cookieParser(request, {}, next); + }, + function (next) { + db.sessionStore.get(request.signedCookies[nconf.get('sessionKey')], function (err, sessionData) { + if (err) { + return next(err); } - }, - function (next) { - methodToCall(socket, params, next); - } - ], function (err, result) { - callback(err ? {message: err.message} : null, result); - }); - } - - function requireModules() { - var modules = ['admin', 'categories', 'groups', 'meta', 'modules', - 'notifications', 'plugins', 'posts', 'topics', 'user', 'blacklist' - ]; - - modules.forEach(function (module) { - Namespaces[module] = require('./' + module); - }); - } - - function validateSession(socket, callback) { - var req = socket.request; - if (!req.signedCookies || !req.signedCookies[nconf.get('sessionKey')]) { - return callback(new Error('[[error:invalid-session]]')); + if (sessionData && sessionData.passport && sessionData.passport.user) { + request.session = sessionData; + socket.uid = parseInt(sessionData.passport.user, 10); + } else { + socket.uid = 0; + } + next(); + }); } - db.sessionStore.get(req.signedCookies[nconf.get('sessionKey')], function (err, sessionData) { - if (err || !sessionData) { - return callback(err || new Error('[[error:invalid-session]]')); - } + ], callback); +} - callback(); - }); +function addRedisAdapter(io) { + if (nconf.get('redis')) { + var redisAdapter = require('socket.io-redis'); + var redis = require('../database/redis'); + var pub = redis.connect(); + var sub = redis.connect(); + io.adapter(redisAdapter({pubClient: pub, subClient: sub})); + } else if (nconf.get('isCluster') === 'true') { + winston.warn('[socket.io] Clustering detected, you are advised to configure Redis as a websocket store.'); + } +} + +Sockets.in = function (room) { + return io.in(room); +}; + +Sockets.getUserSocketCount = function (uid) { + if (!io) { + return 0; } - function authorize(socket, callback) { - var request = socket.request; + var room = io.sockets.adapter.rooms['uid_' + uid]; + return room ? room.length : 0; +}; - if (!request) { - return callback(new Error('[[error:not-authorized]]')); - } - async.waterfall([ - function (next) { - cookieParser(request, {}, next); - }, - function (next) { - db.sessionStore.get(request.signedCookies[nconf.get('sessionKey')], function (err, sessionData) { - if (err) { - return next(err); - } - if (sessionData && sessionData.passport && sessionData.passport.user) { - request.session = sessionData; - socket.uid = parseInt(sessionData.passport.user, 10); - } else { - socket.uid = 0; - } - next(); - }); - } - ], callback); +Sockets.reqFromSocket = function (socket, payload, event) { + var headers = socket.request ? socket.request.headers : {}; + var encrypted = socket.request ? !!socket.request.connection.encrypted : false; + var host = headers.host; + var referer = headers.referer || ''; + var data = ((payload || {}).data || []); + + if (!host) { + host = url.parse(referer).host || ''; } - function addRedisAdapter(io) { - if (nconf.get('redis')) { - var redisAdapter = require('socket.io-redis'); - var redis = require('../database/redis'); - var pub = redis.connect(); - var sub = redis.connect({return_buffers: true}); - io.adapter(redisAdapter({pubClient: pub, subClient: sub})); - } else if (nconf.get('isCluster') === 'true') { - winston.warn('[socket.io] Clustering detected, you are advised to configure Redis as a websocket store.'); - } - } - - Sockets.in = function (room) { - return io.in(room); - }; - - Sockets.getUserSocketCount = function (uid) { - if (!io) { - return 0; - } - - var room = io.sockets.adapter.rooms['uid_' + uid]; - return room ? room.length : 0; + return { + uid: socket.uid, + params: data[1], + method: event || data[0], + body: payload, + ip: headers['x-forwarded-for'] || socket.ip, + host: host, + protocol: encrypted ? 'https' : 'http', + secure: encrypted, + url: referer, + path: referer.substr(referer.indexOf(host) + host.length), + headers: headers }; +}; - Sockets.reqFromSocket = function (socket, payload, event) { - var headers = socket.request ? socket.request.headers : {}; - var encrypted = socket.request ? !!socket.request.connection.encrypted : false; - var host = headers.host; - var referer = headers.referer || ''; - var data = ((payload || {}).data || []); - - if (!host) { - host = url.parse(referer).host || ''; - } - - return { - uid: socket.uid, - params: data[1], - method: event || data[0], - body: payload, - ip: headers['x-forwarded-for'] || socket.ip, - host: host, - protocol: encrypted ? 'https' : 'http', - secure: encrypted, - url: referer, - path: referer.substr(referer.indexOf(host) + host.length), - headers: headers - }; - }; - -}(exports)); diff --git a/src/socket.io/modules.js b/src/socket.io/modules.js index a23e9c64bb..473a32e5d9 100644 --- a/src/socket.io/modules.js +++ b/src/socket.io/modules.js @@ -341,20 +341,8 @@ SocketModules.chats.getMessages = function (socket, data, callback) { }; /* Sounds */ -SocketModules.sounds.getSounds = function (socket, data, callback) { - // Read sounds from local directory - meta.sounds.getFiles(callback); -}; - -SocketModules.sounds.getMapping = function (socket, data, callback) { - meta.sounds.getMapping(socket.uid, callback); -}; - -SocketModules.sounds.getData = function (socket, data, callback) { - async.parallel({ - mapping: async.apply(meta.sounds.getMapping, socket.uid), - files: async.apply(meta.sounds.getFiles) - }, callback); +SocketModules.sounds.getUserSoundMap = function getUserSoundMap(socket, data, callback) { + meta.sounds.getUserSoundMap(socket.uid, callback); }; module.exports = SocketModules; diff --git a/src/socket.io/posts.js b/src/socket.io/posts.js index fe729a5c11..8ded335780 100644 --- a/src/socket.io/posts.js +++ b/src/socket.io/posts.js @@ -1,6 +1,6 @@ "use strict"; -var async = require('async'); +var async = require('async'); var posts = require('../posts'); var privileges = require('../privileges'); @@ -31,25 +31,26 @@ SocketPosts.reply = function (socket, data, callback) { data.req = websockets.reqFromSocket(socket); data.timestamp = Date.now(); - topics.reply(data, function (err, postData) { - if (err) { - return callback(err); + async.waterfall([ + function (next) { + topics.reply(data, next); + }, + function (postData, next) { + var result = { + posts: [postData], + 'reputation:disabled': parseInt(meta.config['reputation:disabled'], 10) === 1, + 'downvote:disabled': parseInt(meta.config['downvote:disabled'], 10) === 1, + }; + + next(null, postData); + + websockets.in('uid_' + socket.uid).emit('event:new_post', result); + + user.updateOnlineUsers(socket.uid); + + socketHelpers.notifyNew(socket.uid, 'newPost', result); } - - var result = { - posts: [postData], - 'reputation:disabled': parseInt(meta.config['reputation:disabled'], 10) === 1, - 'downvote:disabled': parseInt(meta.config['downvote:disabled'], 10) === 1, - }; - - callback(null, postData); - - websockets.in('uid_' + socket.uid).emit('event:new_post', result); - - user.updateOnlineUsers(socket.uid); - - socketHelpers.notifyNew(socket.uid, 'newPost', result); - }); + ], callback); }; SocketPosts.getRawPost = function (socket, pid, callback) { @@ -120,7 +121,7 @@ SocketPosts.getPidIndex = function (socket, data, callback) { SocketPosts.getReplies = function (socket, pid, callback) { if (!utils.isNumber(pid)) { - return callback(new Error('[[error:invalid-data]')); + return callback(new Error('[[error:invalid-data]]')); } var postPrivileges; async.waterfall([ diff --git a/src/socket.io/topics/move.js b/src/socket.io/topics/move.js index 25f5f8a19d..938fe22792 100644 --- a/src/socket.io/topics/move.js +++ b/src/socket.io/topics/move.js @@ -23,9 +23,7 @@ module.exports = function (SocketTopics) { if (!canMove) { return next(new Error('[[error:no-privileges]]')); } - next(); - }, - function (next) { + topics.getTopicFields(tid, ['cid', 'slug'], next); }, function (_topicData, next) { diff --git a/src/socket.io/user.js b/src/socket.io/user.js index c10a510e71..060c9e7b2e 100644 --- a/src/socket.io/user.js +++ b/src/socket.io/user.js @@ -272,35 +272,34 @@ SocketUser.invite = function (socket, email, callback) { return callback(new Error('[[error:forum-not-invite-only]]')); } - var max = meta.config.maximumInvites; + async.waterfall([ + function (next) { + user.isAdministrator(socket.uid, next); + }, + function (isAdmin, next) { + if (registrationType === 'admin-invite-only' && !isAdmin) { + return next(new Error('[[error:no-privileges]]')); + } + + var max = parseInt(meta.config.maximumInvites, 10); + if (!max) { + return user.sendInvitationEmail(socket.uid, email, callback); + } - user.isAdministrator(socket.uid, function (err, admin) { - if (err) { - return callback(err); - } - if (registrationType === 'admin-invite-only' && !admin) { - return callback(new Error('[[error:no-privileges]]')); - } - if (max) { async.waterfall([ function (next) { user.getInvitesNumber(socket.uid, next); }, function (invites, next) { - if (!admin && invites > max) { + if (!isAdmin && invites >= max) { return next(new Error('[[error:invite-maximum-met, ' + invites + ', ' + max + ']]')); } - next(); - }, - function (next) { + user.sendInvitationEmail(socket.uid, email, next); } - ], callback); - } else { - user.sendInvitationEmail(socket.uid, email, callback); + ], next); } - }); - + ], callback); }; SocketUser.getUserByUID = function (socket, uid, callback) { diff --git a/src/socket.io/user/picture.js b/src/socket.io/user/picture.js index eacc5197aa..deceb70f8a 100644 --- a/src/socket.io/user/picture.js +++ b/src/socket.io/user/picture.js @@ -86,7 +86,7 @@ module.exports = function (SocketUser) { function (userData, next) { if (userData.uploadedpicture && !userData.uploadedpicture.startsWith('http')) { var pathToFile = path.join(nconf.get('base_dir'), 'public', userData.uploadedpicture); - if (pathToFile.startsWith(path.join(nconf.get('base_dir'), nconf.get('upload_path')))) { + if (pathToFile.startsWith(nconf.get('upload_path'))) { require('fs').unlink(pathToFile, function (err) { if (err) { winston.error(err); diff --git a/src/socket.io/user/profile.js b/src/socket.io/user/profile.js index 8a59fbbff2..392c7559b7 100644 --- a/src/socket.io/user/profile.js +++ b/src/socket.io/user/profile.js @@ -37,6 +37,20 @@ module.exports = function (SocketUser) { } ], callback); }; + + SocketUser.uploadCroppedPicture = function (socket, data, callback) { + if (!socket.uid) { + return callback(new Error('[[error:no-privileges]]')); + } + async.waterfall([ + function (next) { + user.isAdminOrSelf(socket.uid, data.uid, next); + }, + function (next) { + user.uploadCroppedPicture(data, next); + } + ], callback); + }; SocketUser.removeCover = function (socket, data, callback) { if (!socket.uid) { diff --git a/src/start.js b/src/start.js index d314596036..06ffc93589 100644 --- a/src/start.js +++ b/src/start.js @@ -88,9 +88,6 @@ start.start = function () { function setupConfigs() { // nconf defaults, if not set in config - if (!nconf.get('upload_path')) { - nconf.set('upload_path', '/public/uploads'); - } if (!nconf.get('sessionKey')) { nconf.set('sessionKey', 'express.sid'); } @@ -102,7 +99,7 @@ function setupConfigs() { nconf.set('use_port', !!urlObject.port); nconf.set('relative_path', relativePath); nconf.set('port', urlObject.port || nconf.get('port') || nconf.get('PORT') || (nconf.get('PORT_ENV_VAR') ? nconf.get(nconf.get('PORT_ENV_VAR')) : false) || 4567); - nconf.set('upload_url', nconf.get('upload_path').replace(/^\/public/, '')); + nconf.set('upload_url', '/assets/uploads'); } function printStartupInfo() { diff --git a/src/topics/follow.js b/src/topics/follow.js index 0667218588..4775cdb9bc 100644 --- a/src/topics/follow.js +++ b/src/topics/follow.js @@ -153,9 +153,9 @@ module.exports = function (Topics) { function (next) { db.isSetMembers('tid:' + tid + ':ignorers', uids, next); }, - function (isMembers, next) { + function (isIgnoring, next) { var readingUids = uids.filter(function (uid, index) { - return uid && isMembers[index]; + return uid && !isIgnoring[index]; }); next(null, readingUids); } diff --git a/src/topics/posts.js b/src/topics/posts.js index aadf6bd76b..97b6f71162 100644 --- a/src/topics/posts.js +++ b/src/topics/posts.js @@ -28,23 +28,23 @@ module.exports = function (Topics) { }; Topics.getTopicPosts = function (tid, set, start, stop, uid, reverse, callback) { - callback = callback || function () {}; - async.parallel({ - posts: function (next) { - posts.getPostsFromSet(set, start, stop, uid, reverse, next); + async.waterfall([ + function (next) { + async.parallel({ + posts: function (next) { + posts.getPostsFromSet(set, start, stop, uid, reverse, next); + }, + postCount: function (next) { + Topics.getTopicField(tid, 'postcount', next); + } + }, next); }, - postCount: function (next) { - Topics.getTopicField(tid, 'postcount', next); - } - }, function (err, results) { - if (err) { - return callback(err); - } + function (results, next) { + Topics.calculatePostIndices(results.posts, start, stop, results.postCount, reverse); - Topics.calculatePostIndices(results.posts, start, stop, results.postCount, reverse); - - Topics.addPostData(results.posts, uid, callback); - }); + Topics.addPostData(results.posts, uid, next); + } + ], callback); }; Topics.addPostData = function (postData, uid, callback) { @@ -59,88 +59,82 @@ module.exports = function (Topics) { return callback(null, []); } - async.parallel({ - bookmarks: function (next) { - posts.hasBookmarked(pids, uid, next); - }, - voteData: function (next) { - posts.getVoteStatusByPostIDs(pids, uid, next); - }, - userData: function (next) { - var uids = []; + function getPostUserData(field, method, callback) { + var uids = []; - for(var i = 0; i < postData.length; ++i) { - if (postData[i] && uids.indexOf(postData[i].uid) === -1) { - uids.push(postData[i].uid); - } + postData.forEach(function (postData) { + if (postData && postData[field] && uids.indexOf(postData[field]) === -1) { + uids.push(postData[field]); } + }); - posts.getUserInfoForPosts(uids, uid, function (err, users) { - if (err) { - return next(err); - } - + async.waterfall([ + function (next) { + method(uids, next); + }, + function (users, next) { var userData = {}; users.forEach(function (user, index) { userData[uids[index]] = user; }); - next(null, userData); - }); - }, - editors: function (next) { - var editors = []; - for(var i = 0; i < postData.length; ++i) { - if (postData[i] && postData[i].editor && editors.indexOf(postData[i].editor) === -1) { - editors.push(postData[i].editor); - } } + ], callback); + } - user.getUsersFields(editors, ['uid', 'username', 'userslug'], function (err, editors) { - if (err) { - return next(err); + async.waterfall([ + function (next) { + async.parallel({ + bookmarks: function (next) { + posts.hasBookmarked(pids, uid, next); + }, + voteData: function (next) { + posts.getVoteStatusByPostIDs(pids, uid, next); + }, + userData: function (next) { + getPostUserData('uid', function (uids, next) { + posts.getUserInfoForPosts(uids, uid, next); + }, next); + + }, + editors: function (next) { + getPostUserData('editor', function (uids, next) { + user.getUsersFields(uids, ['uid', 'username', 'userslug'], next); + }, next); + }, + parents: function (next) { + Topics.addParentPosts(postData, next); } - var editorData = {}; - editors.forEach(function (editor) { - editorData[editor.uid] = editor; - }); - next(null, editorData); - }); + }, next); }, - parents: function (next) { - Topics.addParentPosts(postData, next); - } - }, function (err, results) { - if (err) { - return callback(err); - } + function (results, next) { + postData.forEach(function (postObj, i) { + if (postObj) { + postObj.deleted = parseInt(postObj.deleted, 10) === 1; + postObj.user = parseInt(postObj.uid, 10) ? results.userData[postObj.uid] : _.clone(results.userData[postObj.uid]); + postObj.editor = postObj.editor ? results.editors[postObj.editor] : null; + postObj.bookmarked = results.bookmarks[i]; + postObj.upvoted = results.voteData.upvotes[i]; + postObj.downvoted = results.voteData.downvotes[i]; + postObj.votes = postObj.votes || 0; + postObj.replies = postObj.replies || 0; + postObj.selfPost = !!parseInt(uid, 10) && parseInt(uid, 10) === parseInt(postObj.uid, 10); - postData.forEach(function (postObj, i) { - if (postObj) { - postObj.deleted = parseInt(postObj.deleted, 10) === 1; - postObj.user = parseInt(postObj.uid, 10) ? results.userData[postObj.uid] : _.clone(results.userData[postObj.uid]); - postObj.editor = postObj.editor ? results.editors[postObj.editor] : null; - postObj.bookmarked = results.bookmarks[i]; - postObj.upvoted = results.voteData.upvotes[i]; - postObj.downvoted = results.voteData.downvotes[i]; - postObj.votes = postObj.votes || 0; - postObj.replies = postObj.replies || 0; - postObj.selfPost = !!parseInt(uid, 10) && parseInt(uid, 10) === parseInt(postObj.uid, 10); - - // Username override for guests, if enabled - if (parseInt(meta.config.allowGuestHandles, 10) === 1 && parseInt(postObj.uid, 10) === 0 && postObj.handle) { - postObj.user.username = validator.escape(String(postObj.handle)); + // Username override for guests, if enabled + if (parseInt(meta.config.allowGuestHandles, 10) === 1 && parseInt(postObj.uid, 10) === 0 && postObj.handle) { + postObj.user.username = validator.escape(String(postObj.handle)); + } } - } - }); - - plugins.fireHook('filter:topics.addPostData', { - posts: postData, - uid: uid - }, function (err, data) { - callback(err, data ? data.posts : null); - }); - }); + }); + plugins.fireHook('filter:topics.addPostData', { + posts: postData, + uid: uid + }, next); + }, + function (data, next) { + next(null, data.posts); + } + ], callback); }; Topics.modifyPostsByPrivilege = function (topicData, topicPrivileges) { @@ -173,7 +167,9 @@ module.exports = function (Topics) { async.apply(posts.getPostsFields, parentPids, ['uid']), function (_parentPosts, next) { parentPosts = _parentPosts; - var parentUids = parentPosts.map(function (postObj) { return parseInt(postObj.uid, 10); }).filter(function (uid, idx, users) { + var parentUids = parentPosts.map(function (postObj) { + return parseInt(postObj.uid, 10); + }).filter(function (uid, idx, users) { return users.indexOf(uid) === idx; }); @@ -232,31 +228,31 @@ module.exports = function (Topics) { var done = false; var latestPid = null; var index = 0; + var pids; async.doWhilst( function (next) { - db.getSortedSetRevRange('tid:' + tid + ':posts', index, index, function (err, pids) { - if (err) { - return next(err); - } - - if (!Array.isArray(pids) || !pids.length) { - done = true; - return next(); - } - - posts.getPostField(pids[0], 'deleted', function (err, deleted) { - if (err) { - return next(err); + async.waterfall([ + function (_next) { + db.getSortedSetRevRange('tid:' + tid + ':posts', index, index, _next); + }, + function (_pids, _next) { + pids = _pids; + if (!Array.isArray(pids) || !pids.length) { + done = true; + return next(); } + posts.getPostField(pids[0], 'deleted', _next); + }, + function (deleted, _next) { isDeleted = parseInt(deleted, 10) === 1; if (!isDeleted) { latestPid = pids[0]; } ++index; - next(); - }); - }); + _next(); + } + ], next); }, function () { return isDeleted && !done; @@ -318,22 +314,24 @@ module.exports = function (Topics) { }; Topics.getPids = function (tid, callback) { - async.parallel({ - mainPid: function (next) { - Topics.getTopicField(tid, 'mainPid', next); + async.waterfall([ + function (next) { + async.parallel({ + mainPid: function (next) { + Topics.getTopicField(tid, 'mainPid', next); + }, + pids: function (next) { + db.getSortedSetRange('tid:' + tid + ':posts', 0, -1, next); + } + }, next); }, - pids: function (next) { - db.getSortedSetRange('tid:' + tid + ':posts', 0, -1, next); + function (results, next) { + if (results.mainPid) { + results.pids = [results.mainPid].concat(results.pids); + } + next(null, results.pids); } - }, function (err, results) { - if (err) { - return callback(err); - } - if (results.mainPid) { - results.pids = [results.mainPid].concat(results.pids); - } - callback(null, results.pids); - }); + ], callback); }; Topics.increasePostCount = function (tid, callback) { @@ -350,12 +348,14 @@ module.exports = function (Topics) { function incrementFieldAndUpdateSortedSet(tid, field, by, set, callback) { callback = callback || function () {}; - db.incrObjectFieldBy('topic:' + tid, field, by, function (err, value) { - if (err) { - return callback(err); + async.waterfall([ + function (next) { + db.incrObjectFieldBy('topic:' + tid, field, by, next); + }, + function (value, next) { + db.sortedSetAdd(set, value, tid, next); } - db.sortedSetAdd(set, value, tid, callback); - }); + ], callback); } Topics.getTitleByPid = function (pid, callback) { @@ -363,21 +363,25 @@ module.exports = function (Topics) { }; Topics.getTopicFieldByPid = function (field, pid, callback) { - posts.getPostField(pid, 'tid', function (err, tid) { - if (err) { - return callback(err); + async.waterfall([ + function (next) { + posts.getPostField(pid, 'tid', next); + }, + function (tid, next) { + Topics.getTopicField(tid, field, next); } - Topics.getTopicField(tid, field, callback); - }); + ], callback); }; Topics.getTopicDataByPid = function (pid, callback) { - posts.getPostField(pid, 'tid', function (err, tid) { - if (err) { - return callback(err); + async.waterfall([ + function (next) { + posts.getPostField(pid, 'tid', next); + }, + function (tid, next) { + Topics.getTopicData(tid, next); } - Topics.getTopicData(tid, callback); - }); + ], callback); }; Topics.getPostCount = function (tid, callback) { diff --git a/src/topics/thumb.js b/src/topics/thumb.js index 7d22365293..a5ca38ed3e 100644 --- a/src/topics/thumb.js +++ b/src/topics/thumb.js @@ -41,7 +41,7 @@ module.exports = function (Topics) { extension = '.' + mime.extension(type); } filename = Date.now() + '-topic-thumb' + extension; - pathToUpload = path.join(nconf.get('base_dir'), nconf.get('upload_path'), 'files', filename); + pathToUpload = path.join(nconf.get('upload_path'), 'files', filename); request(data.thumb).pipe(fs.createWriteStream(pathToUpload)).on('close', next); }, @@ -59,7 +59,7 @@ module.exports = function (Topics) { }, function (next) { if (!plugins.hasListeners('filter:uploadImage')) { - data.thumb = path.join(nconf.get('upload_url'), 'files', filename); + data.thumb = '/assets/uploads/files/' + filename; return callback(); } diff --git a/src/user/digest.js b/src/user/digest.js index 84cb8af489..9c86aca26d 100644 --- a/src/user/digest.js +++ b/src/user/digest.js @@ -18,7 +18,7 @@ var utils = require('../../public/src/utils'); var digestsDisabled = parseInt(meta.config.disableEmailSubscriptions, 10) === 1; if (digestsDisabled) { - winston.verbose('[user/jobs] Did not send digests (' + interval + ') because subscription system is disabled.'); + winston.info('[user/jobs] Did not send digests (' + interval + ') because subscription system is disabled.'); return callback(); } @@ -57,7 +57,7 @@ var utils = require('../../public/src/utils'); if (err) { winston.error('[user/jobs] Could not send digests (' + interval + '): ' + err.message); } else { - winston.verbose('[user/jobs] Digest (' + interval + ') scheduling completed. ' + subscribers.length + ' email(s) sent.'); + winston.info('[user/jobs] Digest (' + interval + ') scheduling completed. ' + subscribers.length + ' email(s) sent.'); } callback(err); @@ -109,6 +109,7 @@ var utils = require('../../public/src/utils'); notification.image = nconf.get('url') + notification.image; } }); + emailer.send('digest', userObj.uid, { subject: '[' + meta.config.title + '] [[email:digest.subject, ' + (now.getFullYear() + '/' + (now.getMonth() + 1) + '/' + now.getDate()) + ']]', username: userObj.username, diff --git a/src/user/invite.js b/src/user/invite.js index 1066a662ac..043bf62a7b 100644 --- a/src/user/invite.js +++ b/src/user/invite.js @@ -61,9 +61,7 @@ module.exports = function (User) { if (exists) { return next(new Error('[[error:email-taken]]')); } - next(); - }, - function (next) { + async.parallel([ function (next) { db.setAdd('invitation:uid:' + uid, email, next); @@ -131,11 +129,11 @@ module.exports = function (User) { return next(new Error('[[error:invalid-username]]')); } async.parallel([ - function deleteFromReferenceList(next) { - db.setRemove('invitation:uid:' + invitedByUid, email, next); + function (next) { + deleteFromReferenceList(invitedByUid, email, next); }, - function deleteInviteKey(next) { - db.delete('invitation:email:' + email, callback); + function (next) { + db.delete('invitation:email:' + email, next); } ], function (err) { next(err); @@ -146,7 +144,37 @@ module.exports = function (User) { User.deleteInvitationKey = function (email, callback) { callback = callback || function () {}; - db.delete('invitation:email:' + email, callback); + + async.waterfall([ + function (next) { + User.getInvitingUsers(next); + }, + function (uids, next) { + async.each(uids, function (uid, next) { + deleteFromReferenceList(uid, email, next); + }, next); + }, + function (next) { + db.delete('invitation:email:' + email, next); + } + ], callback); }; + function deleteFromReferenceList(uid, email, callback) { + async.waterfall([ + function (next) { + db.setRemove('invitation:uid:' + uid, email, next); + }, + function (next) { + db.setCount('invitation:uid:' + uid, next); + }, + function (count, next) { + if (count === 0) { + return db.setRemove('invitation:uids', uid, next); + } + setImmediate(next); + } + ], callback); + } + }; diff --git a/src/user/jobs.js b/src/user/jobs.js index 956559b470..c01f2c613c 100644 --- a/src/user/jobs.js +++ b/src/user/jobs.js @@ -32,28 +32,28 @@ module.exports = function (User) { } winston.verbose('[user/jobs] ' + terminated + ' jobs terminated'); - jobs['digest.daily'] = new cronJob('0 0 ' + digestHour + ' * * *', function () { + jobs['digest.daily'] = new cronJob('0 ' + digestHour + ' * * *', function () { winston.verbose('[user/jobs] Digest job (daily) started.'); User.digest.execute('day'); }, null, true); winston.verbose('[user/jobs] Starting job (digest.daily)'); ++started; - jobs['digest.weekly'] = new cronJob('0 0 ' + digestHour + ' * * 0', function () { + jobs['digest.weekly'] = new cronJob('0 ' + digestHour + ' * * 0', function () { winston.verbose('[user/jobs] Digest job (weekly) started.'); User.digest.execute('week'); }, null, true); winston.verbose('[user/jobs] Starting job (digest.weekly)'); ++started; - jobs['digest.monthly'] = new cronJob('0 0 ' + digestHour + ' 1 * *', function () { + jobs['digest.monthly'] = new cronJob('0 ' + digestHour + ' 1 * *', function () { winston.verbose('[user/jobs] Digest job (monthly) started.'); User.digest.execute('month'); }, null, true); winston.verbose('[user/jobs] Starting job (digest.monthly)'); ++started; - jobs['reset.clean'] = new cronJob('0 0 0 * * *', User.reset.clean, null, true); + jobs['reset.clean'] = new cronJob('0 0 * * *', User.reset.clean, null, true); winston.verbose('[user/jobs] Starting job (reset.clean)'); ++started; diff --git a/src/user/picture.js b/src/user/picture.js index 0fd1d1a3bd..09b7d636e8 100644 --- a/src/user/picture.js +++ b/src/user/picture.js @@ -1,11 +1,8 @@ 'use strict'; var async = require('async'); -var path = require('path'); var fs = require('fs'); -var os = require('os'); var nconf = require('nconf'); -var crypto = require('crypto'); var winston = require('winston'); var request = require('request'); var mime = require('mime'); @@ -19,71 +16,7 @@ var db = require('../database'); module.exports = function (User) { User.uploadPicture = function (uid, picture, callback) { - - var uploadSize = parseInt(meta.config.maximumProfileImageSize, 10) || 256; - var extension = path.extname(picture.name); - var updateUid = uid; - var imageDimension = parseInt(meta.config.profileImageDimension, 10) || 128; - var convertToPNG = parseInt(meta.config['profile:convertProfileImageToPNG'], 10) === 1; - var keepAllVersions = parseInt(meta.config['profile:keepAllUserImages'], 10) === 1; - var uploadedImage; - - if (parseInt(meta.config.allowProfileImageUploads) !== 1) { - return callback(new Error('[[error:profile-image-uploads-disabled]]')); - } - - if (picture.size > uploadSize * 1024) { - return callback(new Error('[[error:file-too-big, ' + uploadSize + ']]')); - } - - if (!extension) { - return callback(new Error('[[error:invalid-image-extension]]')); - } - - async.waterfall([ - function (next) { - if (plugins.hasListeners('filter:uploadImage')) { - return plugins.fireHook('filter:uploadImage', {image: picture, uid: updateUid}, next); - } - - var filename = updateUid + '-profileimg' + (keepAllVersions ? '-' + Date.now() : '') + (convertToPNG ? '.png' : extension); - - async.waterfall([ - function (next) { - file.isFileTypeAllowed(picture.path, next); - }, - function (next) { - image.resizeImage({ - path: picture.path, - extension: extension, - width: imageDimension, - height: imageDimension - }, next); - }, - function (next) { - if (!convertToPNG) { - return next(); - } - async.series([ - async.apply(image.normalise, picture.path, extension), - async.apply(fs.rename, picture.path + '.png', picture.path) - ], function (err) { - next(err); - }); - }, - function (next) { - file.saveFileToLocal(filename, 'profile', picture.path, next); - }, - ], next); - }, - function (_image, next) { - uploadedImage = _image; - User.setUserFields(updateUid, {uploadedpicture: uploadedImage.url, picture: uploadedImage.url}, next); - }, - function (next) { - next(null, uploadedImage); - } - ], callback); + User.uploadCroppedPicture({uid: uid, file: picture}, callback); }; User.uploadFromUrl = function (uid, url, callback) { @@ -91,32 +24,41 @@ module.exports = function (User) { return callback(new Error('[[error:no-plugin]]')); } - request.head(url, function (err, res) { - if (err) { - return callback(err); - } - var uploadSize = parseInt(meta.config.maximumProfileImageSize, 10) || 256; - var size = res.headers['content-length']; - var type = res.headers['content-type']; - var extension = mime.extension(type); + async.waterfall([ + function (next) { + request.head(url, next); + }, + function (res, body, next) { + var uploadSize = parseInt(meta.config.maximumProfileImageSize, 10) || 256; + var size = res.headers['content-length']; + var type = res.headers['content-type']; + var extension = mime.extension(type); - if (['png', 'jpeg', 'jpg', 'gif'].indexOf(extension) === -1) { - return callback(new Error('[[error:invalid-image-extension]]')); - } - - if (size > uploadSize * 1024) { - return callback(new Error('[[error:file-too-big, ' + uploadSize + ']]')); - } - - var picture = {url: url, name: ''}; - plugins.fireHook('filter:uploadImage', {image: picture, uid: uid}, function (err, image) { - if (err) { - return callback(err); + if (['png', 'jpeg', 'jpg', 'gif'].indexOf(extension) === -1) { + return callback(new Error('[[error:invalid-image-extension]]')); } - User.setUserFields(uid, {uploadedpicture: image.url, picture: image.url}); - callback(null, image); - }); - }); + + if (size > uploadSize * 1024) { + return callback(new Error('[[error:file-too-big, ' + uploadSize + ']]')); + } + + plugins.fireHook('filter:uploadImage', { + uid: uid, + image: { + url: url, + name: '' + } + }, next); + }, + function (image, next) { + User.setUserFields(uid, { + uploadedpicture: image.url, + picture: image.url + }, function (err) { + next(err, image); + }); + } + ], callback); }; User.updateCoverPosition = function (uid, position, callback) { @@ -124,8 +66,12 @@ module.exports = function (User) { }; User.updateCoverPicture = function (data, callback) { - var keepAllVersions = parseInt(meta.config['profile:keepAllUserImages'], 10) === 1; - var url, md5sum; + + var url; + var picture = { + name: 'profileCover', + uid: data.uid + }; if (!data.imageData && data.position) { return User.updateCoverPosition(data.uid, data.position, callback); @@ -144,83 +90,165 @@ module.exports = function (User) { } if (data.file) { - return next(); + return setImmediate(next, null, data.file.path); } - md5sum = crypto.createHash('md5'); - md5sum.update(data.imageData); - md5sum = md5sum.digest('hex'); - - data.file = { - path: path.join(os.tmpdir(), md5sum) - }; - - var buffer = new Buffer(data.imageData.slice(data.imageData.indexOf('base64') + 7), 'base64'); - - fs.writeFile(data.file.path, buffer, { - encoding: 'base64' - }, next); + image.writeImageDataToTempFile(data.imageData, next); }, - function (next) { - var image = { - name: 'profileCover', - path: data.file.path, - uid: data.uid - }; + function (path, next) { + picture.path = path; - if (plugins.hasListeners('filter:uploadImage')) { - return plugins.fireHook('filter:uploadImage', {image: image, uid: data.uid}, next); - } - - var filename = data.uid + '-profilecover' + (keepAllVersions ? '-' + Date.now() : ''); - async.waterfall([ - function (next) { - file.isFileTypeAllowed(data.file.path, next); - }, - function (next) { - file.saveFileToLocal(filename, 'profile', image.path, next); - }, - function (upload, next) { - next(null, { - url: nconf.get('relative_path') + upload.url, - name: image.name - }); - } - ], next); + var extension = data.file ? file.typeToExtension(data.file.type) : image.extensionFromBase64(data.imageData); + var filename = generateProfileImageFilename(data.uid, 'profilecover', extension); + uploadProfileOrCover(filename, picture, next); }, function (uploadData, next) { url = uploadData.url; User.setUserField(data.uid, 'cover:url', uploadData.url, next); }, function (next) { - fs.unlink(data.file.path, function (err) { - if (err) { - winston.error(err); - } - next(); - }); + if (data.position) { + User.updateCoverPosition(data.uid, data.position, next); + } else { + setImmediate(next); + } } ], function (err) { - if (err) { - return fs.unlink(data.file.path, function (unlinkErr) { - if (unlinkErr) { - winston.error(unlinkErr); - } - - callback(err); // send back the original error - }); - } - - if (data.position) { - User.updateCoverPosition(data.uid, data.position, function (err) { - callback(err, {url: url}); - }); - } else { - callback(err, {url: url}); - } + deleteFile(picture.path); + callback(err, { + url: url + }); }); }; + User.uploadCroppedPicture = function (data, callback) { + + if (parseInt(meta.config.allowProfileImageUploads) !== 1) { + return callback(new Error('[[error:profile-image-uploads-disabled]]')); + } + + if (!data.imageData && !data.file) { + return callback(new Error('[[error:invalid-data]]')); + } + + var size = data.file ? data.file.size : data.imageData.length; + var uploadSize = parseInt(meta.config.maximumProfileImageSize, 10) || 256; + if (size > uploadSize * 1024) { + return callback(new Error('[[error:file-too-big, ' + meta.config.maximumProfileImageSize + ']]')); + } + + var type = data.file ? data.file.type : image.mimeFromBase64(data.imageData); + var extension = file.typeToExtension(type); + if (!extension) { + return callback(new Error('[[error:invalid-image-extension]]')); + } + + var uploadedImage; + + var picture = { + name: 'profileAvatar', + uid: data.uid + }; + + async.waterfall([ + function (next) { + if (data.file) { + return setImmediate(next, null, data.file.path); + } + image.writeImageDataToTempFile(data.imageData, next); + }, + function (path, next) { + convertToPNG(path, extension, next); + }, + function (path, next) { + picture.path = path; + + var imageDimension = parseInt(meta.config.profileImageDimension, 10) || 128; + image.resizeImage({ + path: picture.path, + extension: extension, + width: imageDimension, + height: imageDimension + }, next); + }, + function (next) { + var filename = generateProfileImageFilename(data.uid, 'profileavatar', extension); + uploadProfileOrCover(filename, picture, next); + }, + function (_uploadedImage, next) { + uploadedImage = _uploadedImage; + + User.setUserFields(data.uid, { + uploadedpicture: uploadedImage.url, + picture: uploadedImage.url + }, next); + } + ], function (err) { + deleteFile(picture.path); + callback(err, uploadedImage); + }); + }; + + function convertToPNG(path, extension, callback) { + var convertToPNG = parseInt(meta.config['profile:convertProfileImageToPNG'], 10) === 1; + if (!convertToPNG) { + return setImmediate(callback, null, path); + } + + image.normalise(path, extension, function (err, newPath) { + if (err) { + return callback(err); + } + deleteFile(path); + callback(null, newPath); + }); + } + + function uploadProfileOrCover(filename, image, callback) { + if (plugins.hasListeners('filter:uploadImage')) { + return plugins.fireHook('filter:uploadImage', { + image: image, + uid: image.uid + }, callback); + } + + saveFileToLocal(filename, image, callback); + } + + function generateProfileImageFilename(uid, type, extension) { + var keepAllVersions = parseInt(meta.config['profile:keepAllUserImages'], 10) === 1; + var convertToPNG = parseInt(meta.config['profile:convertProfileImageToPNG'], 10) === 1; + return uid + '-' + type + (keepAllVersions ? '-' + Date.now() : '') + (convertToPNG ? '.png' : extension); + } + + function saveFileToLocal(filename, image, callback) { + async.waterfall([ + function (next) { + file.isFileTypeAllowed(image.path, next); + }, + function (next) { + file.saveFileToLocal(filename, 'profile', image.path, next); + }, + function (upload, next) { + next(null, { + url: nconf.get('relative_path') + upload.url, + path: upload.path, + name: image.name + }); + } + ], callback); + } + + function deleteFile(path) { + if (path) { + fs.unlink(path, function (err) { + if (err) { + winston.error(err); + } + }); + } + } + User.removeCoverPicture = function (data, callback) { db.deleteObjectFields('user:' + data.uid, ['cover:url', 'cover:position'], callback); }; diff --git a/src/views/admin/advanced/cache.tpl b/src/views/admin/advanced/cache.tpl index 70f82ab5db..126cba8db0 100644 --- a/src/views/admin/advanced/cache.tpl +++ b/src/views/admin/advanced/cache.tpl @@ -1,5 +1,5 @@ -
    +
    [[admin/advanced/cache:post-cache]]
    diff --git a/src/views/admin/advanced/database.tpl b/src/views/admin/advanced/database.tpl index 973cacf1aa..c9003e52f9 100644 --- a/src/views/admin/advanced/database.tpl +++ b/src/views/admin/advanced/database.tpl @@ -1,4 +1,4 @@ -
    +
    diff --git a/src/views/admin/advanced/events.tpl b/src/views/admin/advanced/events.tpl index b80f56ed6e..65c707920f 100644 --- a/src/views/admin/advanced/events.tpl +++ b/src/views/admin/advanced/events.tpl @@ -1,4 +1,4 @@ -
    +
    [[admin/advanced/events:events]]
    diff --git a/src/views/admin/advanced/logs.tpl b/src/views/admin/advanced/logs.tpl index a8f8a501a3..4f7772bd22 100644 --- a/src/views/admin/advanced/logs.tpl +++ b/src/views/admin/advanced/logs.tpl @@ -1,4 +1,4 @@ -
    +
    [[admin/advanced/logs:logs]]
    diff --git a/src/views/admin/appearance/skins.tpl b/src/views/admin/appearance/skins.tpl index c5d1355f08..6e87580557 100644 --- a/src/views/admin/appearance/skins.tpl +++ b/src/views/admin/appearance/skins.tpl @@ -1,4 +1,4 @@ -
    +
    [[admin/appearance/skins:loading]]
    diff --git a/src/views/admin/development/logger.tpl b/src/views/admin/development/logger.tpl index 7b33625931..dc8704a52b 100644 --- a/src/views/admin/development/logger.tpl +++ b/src/views/admin/development/logger.tpl @@ -1,4 +1,4 @@ -
    +
    [[admin/development/logger:logger-settings]]
    diff --git a/src/views/admin/extend/rewards.tpl b/src/views/admin/extend/rewards.tpl index b4256a41d3..5177d1a77e 100644 --- a/src/views/admin/extend/rewards.tpl +++ b/src/views/admin/extend/rewards.tpl @@ -1,4 +1,4 @@ -
    +
    [[admin/extend/rewards:rewards]]
    diff --git a/src/views/admin/general/navigation.tpl b/src/views/admin/general/navigation.tpl index 3d3d17f096..5b5f95cfb1 100644 --- a/src/views/admin/general/navigation.tpl +++ b/src/views/admin/general/navigation.tpl @@ -1,4 +1,4 @@ -