From 2d04bb9d330ef653b4a1644de49290387cb08489 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Fri, 16 Jun 2017 09:25:06 +0000 Subject: [PATCH 1/7] Latest translations and fallbacks --- public/language/ko/admin/admin.json | 4 +- public/language/ko/admin/advanced/cache.json | 10 +- .../language/ko/admin/advanced/database.json | 36 ++--- public/language/ko/admin/advanced/errors.json | 10 +- public/language/ko/admin/advanced/logs.json | 10 +- .../ko/admin/appearance/customise.json | 8 +- .../language/ko/admin/appearance/skins.json | 2 +- .../language/ko/admin/appearance/themes.json | 6 +- .../language/ko/admin/development/info.json | 14 +- .../language/ko/admin/development/logger.json | 16 +- public/language/ko/admin/extend/plugins.json | 58 +++---- public/language/ko/admin/extend/rewards.json | 16 +- public/language/ko/admin/extend/widgets.json | 10 +- .../language/ko/admin/general/dashboard.json | 18 +-- .../language/ko/admin/general/homepage.json | 2 +- public/language/ko/admin/general/social.json | 6 +- public/language/ko/admin/general/sounds.json | 6 +- .../language/ko/admin/manage/categories.json | 68 ++++----- .../ko/admin/manage/registration.json | 6 +- public/language/ko/search.json | 24 +-- public/language/ko/success.json | 2 +- public/language/ko/tags.json | 8 +- public/language/ko/topic.json | 142 +++++++++--------- public/language/ko/unread.json | 14 +- public/language/ko/user.json | 92 ++++++------ public/language/ko/users.json | 24 +-- .../language/vi/admin/advanced/database.json | 2 +- 27 files changed, 307 insertions(+), 307 deletions(-) diff --git a/public/language/ko/admin/admin.json b/public/language/ko/admin/admin.json index 547d2b6bc7..866b8eee28 100644 --- a/public/language/ko/admin/admin.json +++ b/public/language/ko/admin/admin.json @@ -1,7 +1,7 @@ { - "alert.confirm-reload": "NodeBB를 다시 로드 하시겠습니까?", + "alert.confirm-reload": "NodeBB를 새로 고침 하시겠습니까?", "alert.confirm-restart": "NodeBB를 다시 시작하시겠습니까?", "acp-title": "%1 | NodeBB 관리자 제어판", - "settings-header-contents": "내용" + "settings-header-contents": "컨텐츠" } \ No newline at end of file diff --git a/public/language/ko/admin/advanced/cache.json b/public/language/ko/admin/advanced/cache.json index 11e23eab97..5fb24659e6 100644 --- a/public/language/ko/admin/advanced/cache.json +++ b/public/language/ko/admin/advanced/cache.json @@ -1,10 +1,10 @@ { - "post-cache": "캐시 게시물", - "posts-in-cache": "캐시 게시물", - "average-post-size": "평균 게시물 크기", + "post-cache": "포스트 캐시", + "posts-in-cache": "캐시된 포스트", + "average-post-size": "평균 포스트 크기", "length-to-max": "길이 / 최대", - "percent-full": "1 %1% 꽉 참", - "post-cache-size": "게시물 캐시 크기", + "percent-full": "%1%꽉참", + "post-cache-size": "포스트 캐시 크기", "items-in-cache": "캐시된 항목들", "control-panel": "제어판", "update-settings": "캐시 설정 변경" diff --git a/public/language/ko/admin/advanced/database.json b/public/language/ko/admin/advanced/database.json index ca4fc5d97b..ee38140153 100644 --- a/public/language/ko/admin/advanced/database.json +++ b/public/language/ko/admin/advanced/database.json @@ -1,36 +1,36 @@ { - "x-b": "%1 바이트", - "x-mb": "%1 메가바이트", - "x-gb": "%1 기가바이트", - "uptime-seconds": "가동시간 초단위", - "uptime-days": "가동시간 일단위", + "x-b": "%1 B", + "x-mb": "%1 MB", + "x-gb": "%1 GB", + "uptime-seconds": "Uptime (초)", + "uptime-days": "Uptime (일)", "mongo": "Mongo", - "mongo.version": "MongoDB 버전", - "mongo.storage-engine": "스토리지 엔진", - "mongo.collections": "컬렉션", + "mongo.version": "MongoDB 버젼", + "mongo.storage-engine": "Storage Engine", + "mongo.collections": "Collections", "mongo.objects": "객체", "mongo.avg-object-size": "평균 객체 크기", - "mongo.data-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 미가공 정보", + "mongo.resident-memory": "Resident Memory", + "mongo.virtual-memory": "Virtual Memory", + "mongo.mapped-memory": "Mapped Memory", + "mongo.raw-info": "MongoDB Raw Info", "redis": "Redis", - "redis.version": "Redis 버전", + "redis.version": "Redis 버젼", "redis.connected-clients": "연결된 클라이언트", "redis.connected-slaves": "연결된 slaves", "redis.blocked-clients": "차단된 클라이언트", "redis.used-memory": "사용된 메모리", - "redis.memory-frag-ratio": "메모리 단편화 비율", + "redis.memory-frag-ratio": "Memory Fragmentation Ratio", "redis.total-connections-recieved": "받은 총 커넥션 수", - "redis.total-commands-processed": "처리된 총 명령 수", - "redis.iops": "초당 순시동작 수", + "redis.total-commands-processed": "처리된 총 커맨드 수", + "redis.iops": "초당 Instantaneous Ops", "redis.keyspace-hits": "Keyspace 히트", "redis.keyspace-misses": "Keyspace 미스", - "redis.raw-info": "Redis 미가공 정보" + "redis.raw-info": "Redis Raw Info" } \ No newline at end of file diff --git a/public/language/ko/admin/advanced/errors.json b/public/language/ko/admin/advanced/errors.json index 78db3b697b..af520c8d00 100644 --- a/public/language/ko/admin/advanced/errors.json +++ b/public/language/ko/admin/advanced/errors.json @@ -3,12 +3,12 @@ "error-events-per-day": "하루당 %1개의 이벤트 ", "error.404": "404 찾을 수 없음", "error.503": "503 서비스를 사용할 수 없음", - "manage-error-log": "오류 기록 관리", - "export-error-log": "오류 기록 내보내기 (CSV)", - "clear-error-log": "오류 기록 삭제", - "route": "Route", + "manage-error-log": "오류 로그 관리", + "export-error-log": "오류 기록 Export (CSV)", + "clear-error-log": "오류 기록 지우기", + "route": "라우트", "count": "카운트", - "no-routes-not-found": "만세! 404 오류 없음", + "no-routes-not-found": "만세! 404 오류 없음!", "clear404-confirm": "404 오류 기록을 지우시겠습니까?", "clear404-success": "\"404 찾을 수 없음\" 오류 삭제 완료" } \ No newline at end of file diff --git a/public/language/ko/admin/advanced/logs.json b/public/language/ko/admin/advanced/logs.json index f67d566669..9d327241ad 100644 --- a/public/language/ko/admin/advanced/logs.json +++ b/public/language/ko/admin/advanced/logs.json @@ -1,7 +1,7 @@ { - "logs": "기록", - "control-panel": "기록 제어판", - "reload": "기록 다시로드", - "clear": "기록 삭제", - "clear-success": "기록 삭제완료!" + "logs": "로그", + "control-panel": "로그 제어판", + "reload": "로그 리로드", + "clear": "로그 지우기", + "clear-success": "로그가 지워졌습니다!" } \ No newline at end of file diff --git a/public/language/ko/admin/appearance/customise.json b/public/language/ko/admin/appearance/customise.json index 6d75168426..37a5dc71a4 100644 --- a/public/language/ko/admin/appearance/customise.json +++ b/public/language/ko/admin/appearance/customise.json @@ -1,12 +1,12 @@ { "custom-css": "사용자 정의 CSS", - "custom-css.description": "사용자 정의 CSS를 이곳에 입력하세요. 다른 스타일이 적용된 후 적용됩니다.", + "custom-css.description": "사용자 정의 CSS를 이곳에 입력하세요. 이 스타일들은 맨 마지막에 적용됩니다.", "custom-css.enable": "사용자 정의 CSS 허용", "custom-header": "사용자 정의 헤더", - "custom-header.description": "이곳에 사용자 정의된 HTML을 입력하십시오 (예시. 자바스크립트, 메타 태그, 등등). 당신의 포럼 마크업<head>1 섹션에 추가됩니다.", + "custom-header.description": "이곳에 사용자 정의 HTML을 입력하십시오 (예. JavaScript, Meta Tags, 등등). 당신의 포럼의 <head>1 섹션에 추가됩니다.", "custom-header.enable": "사용자 정의 헤더 허용", - "custom-css.livereload": "실시간 새로고침 허용", - "custom-css.livereload.description": "이곳을 클릭하면 당신의 계정에 속한 장치들의 모든 세션들이 세이브할 때마다 새로고침 됩니다." + "custom-css.livereload": "실시간 새로 고침 허용", + "custom-css.livereload.description": "세이브를 누를 때마다 당신의 계정에 속한 디바이스의 모든 세션들이 새로고침 되게 하시려면 이것을 활성화하세요." } \ No newline at end of file diff --git a/public/language/ko/admin/appearance/skins.json b/public/language/ko/admin/appearance/skins.json index 69c0fd3d63..46ff0c9730 100644 --- a/public/language/ko/admin/appearance/skins.json +++ b/public/language/ko/admin/appearance/skins.json @@ -5,5 +5,5 @@ "current-skin": "현재 스킨", "skin-updated": "스킨 업데이트 됨", "applied-success": "%1 스킨 적용 완료", - "revert-success": "기본 색깔로 스킨 복구됨" + "revert-success": "기본 색으로 스킨 복구됨" } \ No newline at end of file diff --git a/public/language/ko/admin/appearance/themes.json b/public/language/ko/admin/appearance/themes.json index 56e7be53f6..0cfebc6430 100644 --- a/public/language/ko/admin/appearance/themes.json +++ b/public/language/ko/admin/appearance/themes.json @@ -1,11 +1,11 @@ { - "checking-for-installed": "설치된 테마들 확인 중...", + "checking-for-installed": "설치된 테마 확인 중...", "homepage": "홈페이지", "select-theme": "테마 선택", "current-theme": "현재 테마", "no-themes": "설치된 테마가 없습니다", - "revert-confirm": "기본 NodeBB 테마로 복원하시겠습니까?", + "revert-confirm": "정말 기본 NodeBB 테마로 복원하시겠습니까?", "theme-changed": "테마 변경 완료", - "revert-success": "기본 NodeBB 테마로 성공적으로 복원 완료되었습니다", + "revert-success": "성공적으로 기본 NodeBB 테마로 복원됐습니다.", "restart-to-activate": "변경된 테마를 완전히 활성화시키기 위해 NodeBB를 다시 시작해주십시오" } \ No newline at end of file diff --git a/public/language/ko/admin/development/info.json b/public/language/ko/admin/development/info.json index 8bea471bef..cc6edaa69d 100644 --- a/public/language/ko/admin/development/info.json +++ b/public/language/ko/admin/development/info.json @@ -1,18 +1,18 @@ { - "you-are-on": "정보 - 여기에 위치합니다 %1:%2", - "nodes-responded": "%1 노드가 %2ms 안으로 응답하였습니다", + "you-are-on": "정보 - %1:%2에 있습니다.", + "nodes-responded": "%1 노드가 %2ms 내로 응답했습니다.", "host": "호스트", - "pid": "프로세스 아이디", + "pid": "pid", "nodejs": "nodejs", "online": "온라인", - "git": "깃", + "git": "git", "memory": "메모리", "load": "로드", - "uptime": "가동 시간", + "uptime": "Uptime", "registered": "등록됨", - "sockets": "소켓", - "guests": "게스트", + "sockets": "Sockets", + "guests": "미가입 사용자", "info": "정보" } \ No newline at end of file diff --git a/public/language/ko/admin/development/logger.json b/public/language/ko/admin/development/logger.json index 4b40cddab8..9a2a443810 100644 --- a/public/language/ko/admin/development/logger.json +++ b/public/language/ko/admin/development/logger.json @@ -1,12 +1,12 @@ { - "logger-settings": "기록 설정", - "description": "체크박스를 클릭함으로써 터미널로 기록을 받게됩니다. 만약 파일 경로를 지정하면 기록들이 지정한 파일로 저장됩니다. HTTP 기록은 누가, 언제, 무엇을 포럼에서 했는지에 대한 통계를 내는 데 유용합니다. HTTP 리퀘스트들을 기록함과 더불어 socket.io 이벤트들도 기록할 수 있습니다. Socket.io 기록은 redis-cli 모니터링과 함께 사용하면 NodeBB의 내부를 배우는데 아주 유용할 수 있습니다.", - "explanation": "원하실때 기록 환경을 활성화/비활성화 하십시오. 재시작을 할 필요는 없습니다.", - "enable-http": "HTTP 기록하기 허용", - "enable-socket": "socket.io 이벤트 기록하기 허용", + "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 ::: 터미널로 기록을 보시려면 빈칸으로 두십시오", + "file-path-placeholder": "/path/to/log/file.log ::: 터미널에서 로그를 보시려면 빈칸으로 두세요", - "control-panel": "기록 제어판", - "update-settings": "기록 설정 업데이트" + "control-panel": "로거 제어판", + "update-settings": "로거 설정 업데이트" } \ No newline at end of file diff --git a/public/language/ko/admin/extend/plugins.json b/public/language/ko/admin/extend/plugins.json index b77ecafc2c..a669c7e2eb 100644 --- a/public/language/ko/admin/extend/plugins.json +++ b/public/language/ko/admin/extend/plugins.json @@ -1,47 +1,47 @@ { "installed": "설치됨", - "active": "활동 중", - "inactive": "비활성", - "out-of-date": "오래된", + "active": "사용 중", + "inactive": "사용하지 않는 중", + "out-of-date": "업데이트가 안된", "none-found": "플러그인을 찾을 수 없습니다.", - "none-active": "활성화된 플러그인이 없습니다.", + "none-active": "사용 중인 플러그인이 없습니다.", "find-plugins": "플러그인 찾기", "plugin-search": "플러그인 검색", - "plugin-search-placeholder": "플러그인 검색...", - "reorder-plugins": "플러그인들 재정리", - "order-active": "활성화된 플러그인 배열", - "dev-interested": "NodeBB 플러그인들을 만드는데 관심이 있으십니까?", - "docs-info": "플러그인을 만드는 과정 관련문서는 NodeBB Docs Portal에서 찾아보실 수 있습니다.", + "plugin-search-placeholder": "플러그인을 검색하세요...", + "reorder-plugins": "플러그인 작동 순서 재배열", + "order-active": "사용 중인 플러그인 작동 순서 배열", + "dev-interested": "NodeBB 플러그인을 만드는 데 관심이 있으십니까?", + "docs-info": "플러그인 제작 관련 문서는 NodeBB Docs Portal에서 찾아보실 수 있습니다.", - "order.description": "어떤 플러그인들은 다른 플러그인들의 활성화 전/후에 이상적으로 작동합니다.", - "order.explanation": "플러그인들은 여기에 나열되어있는 순서로 로드 됩니다.", + "order.description": "특정 플러그인은 다른 플러그인의 초기화 전/후에 가장 이상적으로 작동합니다.", + "order.explanation": "플러그인들은 여기에 나열된 순서로 로드됩니다.", - "plugin-item.themes": "주제들/테마들", + "plugin-item.themes": "테마", "plugin-item.deactivate": "비활성화", "plugin-item.activate": "활성화", "plugin-item.install": "설치", - "plugin-item.uninstall": "삭제", - "plugin-item.settings": "환경", + "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": "이 플러그인의 상태를 분별할 수 없습니다. 잘못된 구성의 탓일 수 있습니다.", + "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.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.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가 제대로 켜지지 않을시:

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

이 플러그인의 최신버젼을 계속해서 다운로드 하시겠습니까?

" + "alert.package-manager-unreachable": "

NodeBB가 페키지 매니저 접근에 실패했습니다. 지금 업그레이드 하는 것을 추천하지 않습니다.

", + "alert.incompatible": "

지금 사용하시는 NodeBB 버젼(v%1)에서는 이 플러그인을 v%2 버젼까지만 업그레이드 할 수 있습니다. 이 플러그인의 최신 버젼을 설치하고 싶으시다면 먼저 NodeBB를 업그레이드 해주십시오.

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

호환성 관련 정보를 찾지 못했습니다.

이 플러그인은 현재 사용 중이신 NodeBB 버젼에 적합한 버젼을 명시하지 않았습니다. 따라서 완전한 호환성을 보장할 수 없고, 결과적으로 지금 사용중이신 NodeBB에 오류를 일으킬 수도 있습니다.

만약 NodeBB가 제대로 시작되지 않는다면:

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

이 플러그인의 최신 버젼을 설치를 계속 하시겠습니까?

" } diff --git a/public/language/ko/admin/extend/rewards.json b/public/language/ko/admin/extend/rewards.json index 297a46f7aa..8262d98597 100644 --- a/public/language/ko/admin/extend/rewards.json +++ b/public/language/ko/admin/extend/rewards.json @@ -1,17 +1,17 @@ { "rewards": "보상", "condition-if-users": "만약 사용자의", - "condition-is": "이:", - "condition-then": "하다면:", - "max-claims": "보상이 유효한 기간", + "condition-is": "다음의 조건을 충족한다면:", + "condition-then": "다음과 같은 행동을 취합니다:", + "max-claims": "보상을 받을 수 있는 횟수", "zero-infinite": "무제한으로 설정하려면 0 으로 설정하세요", "delete": "삭제", "enable": "활성화", "disable": "비활성화", - "control-panel": "보상 시스템 제어판", - "new-reward": "새로운 보상 시스템", + "control-panel": "보상 제어판", + "new-reward": "새로운 보상", - "alert.delete-success": "성공적으로 보상 시스템을 삭제하였습니다.", - "alert.no-inputs-found": "잘못된 보상 시스템 - 인풋이 없습니다.", - "alert.save-success": "성공적으로 보상 시스템을 저장하였습니다." + "alert.delete-success": "성공적으로 보상을 삭제했습니다.", + "alert.no-inputs-found": "잘못된 보상 - 인풋이 없습니다!", + "alert.save-success": "성공적으로 보상을 저장했습니다." } \ No newline at end of file diff --git a/public/language/ko/admin/extend/widgets.json b/public/language/ko/admin/extend/widgets.json index 6b5a893377..135d0bc43b 100644 --- a/public/language/ko/admin/extend/widgets.json +++ b/public/language/ko/admin/extend/widgets.json @@ -1,18 +1,18 @@ { "available": "사용 가능 위젯", "explanation": "드롭다운 메뉴에서 위젯을 고르고 왼쪽에 있는 템플렛의 위젯 위치로 드래그하여 옮기십시오.", - "none-installed": "위젯을 찾지 못함! 필수적인 위젯 플러그인들을 플러그인 제어판에서 활성화시켜주십시오.", - "containers.available": "사용 가능한 컨테이너들", + "none-installed": "위젯을 찾을 수 없습니다! 필수 위젯 플러그인들을 플러그인 제어판에서 활성화하세요.", + "containers.available": "사용 가능한 컨테이너", "containers.explanation": "아무 활성화된 위젯 위로 드래그해서 옮겨주십시오.", "containers.none": "없음", - "container.well": "좋음", - "container.jumbotron": "점보트론", + "container.well": "Well", + "container.jumbotron": "Jumbotron", "container.panel": "제어판", "container.panel-header": "제어판 헤더", "container.panel-body": "제어판 몸통", "container.alert": "경고", - "alert.confirm-delete": "위젯을 삭제하시겠습니까?", + "alert.confirm-delete": "정말 이 위젯을 삭제하시겠습니까?", "alert.updated": "위젯 업데이트 됨", "alert.update-success": "성공적으로 업데이트 된 위젯" diff --git a/public/language/ko/admin/general/dashboard.json b/public/language/ko/admin/general/dashboard.json index 026ace2474..b608a99113 100644 --- a/public/language/ko/admin/general/dashboard.json +++ b/public/language/ko/admin/general/dashboard.json @@ -3,16 +3,16 @@ "page-views": "페이지 뷰", "unique-visitors": "순 방문자수", "users": "사용자", - "posts": "게시물", - "topics": "주제", + "posts": "포스트", + "topics": "게시물", "page-views-seven": "지난 7일간", "page-views-thirty": "지난 30일간", "page-views-last-day": "지난 24시간 동안", "page-views-custom": "사용자 설정 날짜 기간", "page-views-custom-start": "기간 시작", "page-views-custom-end": "기간 끝", - "page-views-custom-help": "보고자 하시는 날짜 기간 동안의 페이지 본 횟수를 ", - "page-views-custom-error": "유효한 기간을 다음 형식으로 써주십시오 YYYY-MM-DD", + "page-views-custom-help": "페이지 뷰를 확인하고 싶은 기간을 입력하세요. 만약 데이트 피커를 사용할 수 없다면, YYYY-MM-DD 포맷으로 입력해주세요.", + "page-views-custom-error": "유효한 기간을 다음과 같은 포맷으로 입력하세요 YYYY-MM-DD", "stats.day": "날", "stats.week": "주", @@ -20,13 +20,13 @@ "stats.all": "항상", "updates": "업데이트", - "running-version": "NodeBB v%1 가 돌아가고 있습니다.", - "keep-updated": "사용하시는 NodeBB의 보안 및 에러 업데이트가 항상 최신 버전이도록 유의하여 주십시오", + "running-version": "NodeBB v%1 를 사용 중입니다.", + "keep-updated": "사용하시는 NodeBB의 보안 및 오류 업데이트를 항상 최신 버젼으로 유지하십시오.", "up-to-date": "

최신 버전입니다

", - "upgrade-available": "

새로운 버전 (v%1) 이 출시 되었습니다. 사용하시는 NodeBB를 업데이트 하는 것을 고려하십시오.

", + "upgrade-available": "

새로운 버전 (v%1) 이 출시 되었습니다. 사용하시는 NodeBB의 업데이트를 고려해보세요.

", "prerelease-upgrade-available": "

옛 버전의 NodeBB를 사용하고 계십니다. 새로운 버전의(v%1) NodeBB가 출시되었으니 업데이트 하시는 것을 추천드립니다.

", - "prerelease-warning": "

이것은 구 버전의 NodeBB 입니다. 예상치 못한 버그가 생길 수 있습니다.

", - "running-in-development": "포럼이 개발자 모드로 실행되고 있습니다. 갖가지 취약점에 노출되어 있을 수 있으니 시스템 관리자에게 문의하십시오.", + "prerelease-warning": "

이것은 정식 발표 전 버젼의 NodeBB 입니다. 예상치 못한 버그가 발생할 수 있습니다.

", + "running-in-development": "포럼이 개발자 모드로 실행되고 있습니다. 잠재적 취약점에 노출되어 있을 수 있으니 시스템 관리자에게 문의하십시오.", "notices": "알림", "restart-not-required": "재시작 필요 없음", diff --git a/public/language/ko/admin/general/homepage.json b/public/language/ko/admin/general/homepage.json index 1c172dd662..13d43e4de7 100644 --- a/public/language/ko/admin/general/homepage.json +++ b/public/language/ko/admin/general/homepage.json @@ -3,5 +3,5 @@ "description": "사용자가 루트 URL에 들어갔을 때 어떤 페이지가 보일지 선택하세요.", "home-page-route": "홈페이지 경로", "custom-route": "사용자 지정 경로", - "allow-user-home-pages": "사용자가 직접 홈페이지를 설정할 수 있게 허락" + "allow-user-home-pages": "사용자가 직접 홈페이지를 설정할 수 있게 허용" } \ No newline at end of file diff --git a/public/language/ko/admin/general/social.json b/public/language/ko/admin/general/social.json index 05b9f3f92f..35c38ef758 100644 --- a/public/language/ko/admin/general/social.json +++ b/public/language/ko/admin/general/social.json @@ -1,5 +1,5 @@ { - "post-sharing": "게시물 공유", - "info-plugins-additional": "플러그인에 새로운 네트워크를 추가하여 게시물을 공유할 수 있습니다.", - "save-success": "게시물 공유 네트워크 추가 완료!" + "post-sharing": "포스트 공유", + "info-plugins-additional": "플러그인을 이용해서 포스트를 공유할 수 있는 네트워크를 추가할 수 있습니다.", + "save-success": "포스트 공유 네트워크 추가 완료!" } \ No newline at end of file diff --git a/public/language/ko/admin/general/sounds.json b/public/language/ko/admin/general/sounds.json index 701e9d68cc..70cbb40922 100644 --- a/public/language/ko/admin/general/sounds.json +++ b/public/language/ko/admin/general/sounds.json @@ -1,9 +1,9 @@ { "notifications": "알림", - "chat-messages": "대화 메세지", + "chat-messages": "채팅 메세지", "play-sound": "재생", - "incoming-message": "들어오는 메세지", - "outgoing-message": "나가는 메세지", + "incoming-message": "수신 메시지", + "outgoing-message": "발신 메시지", "upload-new-sound": "새로운 사운드 업로드", "saved": "설정 저장됨" } \ No newline at end of file diff --git a/public/language/ko/admin/manage/categories.json b/public/language/ko/admin/manage/categories.json index 5008312d51..ede245b57b 100644 --- a/public/language/ko/admin/manage/categories.json +++ b/public/language/ko/admin/manage/categories.json @@ -1,9 +1,9 @@ { - "settings": "카테고리 설정", + "settings": "게시판 설정", "privileges": "권한", - "name": "카테고리 이름", - "description": "카테고리 설명", + "name": "게시판 이름", + "description": "게시판 설명", "bg-color": "배경 색", "text-color": "글자 색", "bg-image-size": "배경 이미지 크기", @@ -12,57 +12,57 @@ "ext-link": "외부 링크", "upload-image": "이미지 업로드", "delete-image": "삭제", - "category-image": "카테고리 이미지", + "category-image": "게시판 이미지", "parent-category": "상위 카테고리", - "optional-parent-category": "(선택) 상위 카테고리", + "optional-parent-category": "(선택) 상위 게시판", "parent-category-none": "(없음)", "copy-settings": "에서 설정 복사", - "optional-clone-settings": "(선택) 카테고리에서 설정 복사", - "purge": "카테고리 삭제", + "optional-clone-settings": "(선택) 게시판에서 설정 복사", + "purge": "게시판 삭제", "enable": "활성화", "disable": "비활성화", "edit": "편집", - "select-category": "카테고리 설정", - "set-parent-category": "상위 카테고리 설정", + "select-category": "게시판 선택", + "set-parent-category": "상위 게시판 설정", - "privileges.description": "이 섹션에서는 카테고리에 대한 접근 권한을 설정할 수 있습니다. 권한은 사용자 별 또는 그룹 별로 부여할 수 있습니다. 아래 양식으로 검색하여 새로운 사용자를 표에 추가할 수 있습니다.", - "privileges.warning": "참고: 권한 설정은 즉시 적용됩니다. 설정을 변경한 후 카테고리를 따로 저장할 필요가 없습니다.", + "privileges.description": "이 섹션에서 게시판에 대한 접근 권한을 설정할 수 있습니다. 권한은 사용자 별 또는 그룹 별로 부여할 수 있습니다. 아래 양식으로 검색하여 새로운 사용자를 테이블에 추가할 수 있습니다.", + "privileges.warning": "참고: 권한 설정은 즉시 적용됩니다. 설정을 변경한 후 게시판을 따로 저장할 필요가 없습니다.", "privileges.section-viewing": "권한 보기", "privileges.section-posting": "게시물 작성 권한", - "privileges.section-moderation": "관리 권한", + "privileges.section-moderation": "(준)관리자 권한", "privileges.section-user": "사용자", "privileges.search-user": "사용자 추가", - "privileges.no-users": "이 카테고리에는 사용자 별 권한이 없습니다.", + "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 그룹의 멤버이기 때문에 다른 추가적인 그룹에 대한 권한은 따로 허가 받을 필요가 없습니다.", + "privileges.copy-from-category": "게시판에서 복사", + "privileges.inherit": "만약 registered-users그룹이 특정 권한을 허가 받는다면 모든 다른 그룹들 또한 따로 추가하거나 체크하지 않더라도 암시적 권한을 얻게 됩니다. 모든 유저가 registered-users 그룹의 멤버이기 때문에 다른 추가적인 그룹에 대한 권한은 따로 허가 받을 필요가 없습니다.", - "analytics.back": "카테고리 리스트로 돌아가기", - "analytics.title": "\"%1\" 카테고리 분석", - "analytics.pageviews-hourly": "Figure 1 – 이 카테고리에 대한 시간 당 페이지 뷰 수", - "analytics.pageviews-daily": "Figure 2 – 이 카테고리에 대한 일일 페이지 뷰 수", - "analytics.topics-daily": "Figure 3 – 이 카테고리의 오늘의 주제들", - "analytics.posts-daily": "Figure 4 – 이 카테고리의 오늘의 게시물", + "analytics.back": "게시판 목록으로 돌아가기", + "analytics.title": "\"%1\" 게시판 분석 결과", + "analytics.pageviews-hourly": "Figure 1 – 이 게시판에 대한 시간 당 페이지 뷰 수", + "analytics.pageviews-daily": "Figure 2 – 이 게시판에 대한 일일 페이지 뷰 수", + "analytics.topics-daily": "Figure 3 – 오늘 이 게시판에 생성된 게시물들", + "analytics.posts-daily": "Figure 4 – 오늘 이 게시판에 생성된 포스트들", - "alert.created": "생성되었습니다", - "alert.create-success": "카테고리 성공적으로 생성됨!", - "alert.none-active": "활동 중인 카테고리가 없습니다.", - "alert.create": "카테고리 생성", - "alert.confirm-moderate": "이 사용자 그룹에 관리 권한을 부여하시겠습니까? 이 그룹은 공개 그룹이므로 모든 사용자가 자유롭게 가입 할 수 있습니다.", - "alert.confirm-purge": "

이 카테고리를 \"%1\" 정말로 제거하시겠습니까?

경고!이 카테고리에 속한 모든 토픽과 게시물들이 삭제됩니다!

카테고리를 제거하시는 것은 모든 토픽과 게시물들을 삭제하고 데이타베이스에서 이 카테고리를 삭제시킵니다. 만약 일시적으로 카테고리를 삭제하고 싶으시다면 삭제 대신 \"비활성화\"를 해주십시오.

", - "alert.purge-success": "카테고리 제거됨!", + "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.set-parent-category": "상위 게시판 설정", + "alert.updated": "업데이트 된 게시판", + "alert.updated-success": "게시판 ID %1 성공적으로 업데이트 됨.", + "alert.upload-image": "게시판 이미지 업로드", "alert.find-user": "사용자 검색", - "alert.user-search": "여기에 사용자를 검색하십시오...", + "alert.user-search": "여기서 사용자를 검색하십시오...", "alert.find-group": "그룹 검색", - "alert.group-search": "여기에 그룹을 검색하십시오..." + "alert.group-search": "여기서 그룹을 검색하십시오..." } \ No newline at end of file diff --git a/public/language/ko/admin/manage/registration.json b/public/language/ko/admin/manage/registration.json index 84e61d5829..b96c52c1ac 100644 --- a/public/language/ko/admin/manage/registration.json +++ b/public/language/ko/admin/manage/registration.json @@ -6,9 +6,9 @@ "list.email": "이메일", "list.ip": "IP 주소", "list.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.username-spam": "빈도: %1 출연 유무: %2 신뢰도: %3", + "list.email-spam": "빈도: %1 출연 유무: %2", + "list.ip-spam": "빈도: %1 출연 유무: %2", "invitations": "초대", "invitations.description": "발송된 초대의 목록을 아래에서 보실 수 있습니다. ctrl-f을 이용해서 이메일이나 사용자명으로 목록을 검색하세요.

초대에 응답한 사용자들은 이메일 옆에 사용자명이 표시됩니다.", diff --git a/public/language/ko/search.json b/public/language/ko/search.json index addd305d1e..41d207e08c 100644 --- a/public/language/ko/search.json +++ b/public/language/ko/search.json @@ -1,14 +1,14 @@ { - "results_matching": "\"%2\"와 일치하는 %1개의 결과를 찾았습니다 (검색시간: %3초)", + "results_matching": "\"%2\"와 일치하는 %1 개의 결과를 찾았습니다 (검색시간: %3초)", "no-matches": "일치하는 결과가 없습니다.", "advanced-search": "고급 검색", - "in": "안에서 검색", + "in": "검색 기준", "titles": "제목", - "titles-posts": "제목과 게시물", - "posted-by": "다음 사용자에 의해 작성됨", - "in-categories": "카테고리 내", - "search-child-categories": "하위 카테고리를 검색", - "has-tags": "태그 달린 게시물", + "titles-posts": "제목과 내용", + "posted-by": "작성자", + "in-categories": "게시판 지정", + "search-child-categories": "하위 게시판도 검색", + "has-tags": "태그로 검색", "reply-count": "답변 수", "at-least": "적어도", "at-most": "최대", @@ -24,19 +24,19 @@ "three-months": "세 달", "six-months": "여섯 달", "one-year": "일 년", - "sort-by": "정렬", + "sort-by": "정렬 기준", "last-reply-time": "마지막으로 답글이 달린 시간", - "topic-title": "주제 제목", + "topic-title": "게시물 제목", "number-of-replies": "답글 수", "number-of-views": "조회 수", - "topic-start-date": "주제가 게시된 날짜", + "topic-start-date": "게시물이 작성된 날짜", "username": "사용자명", - "category": "카테고리", + "category": "게시판", "descending": "내림차순", "ascending": "오름차순", "save-preferences": "설정 저장", "clear-preferences": "설정 초기화", "search-preferences-saved": "검색 설정이 저장되었습니다.", "search-preferences-cleared": "검색 설정이 초기화되었습니다.", - "show-results-as": "검색결과 정렬 - " + "show-results-as": "검색결과 표시방법" } \ No newline at end of file diff --git a/public/language/ko/success.json b/public/language/ko/success.json index e7b911bb2d..051a6c2299 100644 --- a/public/language/ko/success.json +++ b/public/language/ko/success.json @@ -2,5 +2,5 @@ "success": "성공", "topic-post": "성공적으로 게시물을 작성했습니다.", "authentication-successful": "인증에 성공했습니다.", - "settings-saved": "성공적으로 설정을 저장했습니다." + "settings-saved": "설정이 저장되었습니다!" } \ No newline at end of file diff --git a/public/language/ko/tags.json b/public/language/ko/tags.json index d088ef7041..aa0f44e62c 100644 --- a/public/language/ko/tags.json +++ b/public/language/ko/tags.json @@ -1,7 +1,7 @@ { - "no_tag_topics": "이 태그에 해당하는 주제가 없습니다.", - "tags": "태그", - "enter_tags_here": "%1 와 %2 글자 안에서 태그를 입력하세요.", + "no_tag_topics": "이 태그가 달린 게시물이 없습니다.", + "tags": "태그 목록", + "enter_tags_here": "%1 에서 %2 자 안에서 태그를 입력하세요.", "enter_tags_here_short": "태그 입력...", - "no_tags": "아직 아무런 태그도 없습니다." + "no_tags": "아직 태그가 달리지 않았습니다." } \ No newline at end of file diff --git a/public/language/ko/topic.json b/public/language/ko/topic.json index 9043fc42bb..11884b0118 100644 --- a/public/language/ko/topic.json +++ b/public/language/ko/topic.json @@ -1,58 +1,58 @@ { - "topic": "주제", - "topic_id": "주제 ID", - "topic_id_placeholder": "여기에 주제 ID를 입력하세요.", - "no_topics_found": "주제를 찾을 수 없습니다.", - "no_posts_found": "게시물을 찾을 수 없습니다.", - "post_is_deleted": "이 게시물은 삭제됐습니다!", - "topic_is_deleted": "이 주제는 삭제됐습니다!", + "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": "게스트에 의해 작성됨", + "posted_by": "%1 님에 의해 작성됨", + "posted_by_guest": "미가입 사용자에 의해 작성됨", "chat": "채팅", - "notify_me": "이 주제의 새 답글에 대한 알림 받기", + "notify_me": "이 게시물의 새 답글에 대한 알림 받기", "quote": "인용", "reply": "답글", - "replies_to_this_post": "%1개의 답글", - "one_reply_to_this_post": "1개의 답글", + "replies_to_this_post": "%1 개의 답글", + "one_reply_to_this_post": "1 개의 답글", "last_reply_time": "마지막 답글", - "reply-as-topic": "주제로 답글", - "guest-login-reply": "답변을 위해 로그인하세요", + "reply-as-topic": "게시물로 답글하기", + "guest-login-reply": "답글을 작성하기 위해 로그인", "edit": "수정", "delete": "삭제", "purge": "폐기", "restore": "복원", "move": "이동", "fork": "분리", - "link": "링크", + "link": "바로가기", "share": "공유", "tools": "도구", - "locked": "잠김", - "pinned": "고정됨", - "moved": "이동됨", - "bookmark_instructions": "이 스레드에서 읽은 마지막 게시글로 이동하시려면 여기를 클릭하세요.", - "flag_title": "이 게시물을 신고", - "deleted_message": "이 주제는 삭제됐습니다. 주제 관리 권한이 있는 사용자만 볼 수 있습니다.", - "following_topic.message": "이제 이 주제에 새 답글이 달리면 알림을 받습니다.", - "not_following_topic.message": "이 주제를 아직 읽지 않은 주제 목록에서 볼 수 있지만, 누군가 이 주제에 포스트하기 전까지는 알림을 받지 않습니다.", - "ignoring_topic.message": "더 이상 이 주제는 읽지 않은 주제 목록에서 보이지 않습니다. 누군가 나를 언급하거나 내 포스트가 upvote되면 알림을 받습니다.", - "login_to_subscribe": "이 주제를 구독하기 위해서는 로그인해야 합니다.", + "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": "이 게시물 공유", + "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": "모두 읽지 않음으로 표시", + "ignoring": "무시하는 중", + "watching.description": "새로운 답글에 대한 알림 받기.
읽지 않은 게시물에 보여주기.", + "not-watching.description": "새로운 답글에 대해 알림 받지 않기. 해당 게시판을 팔로우 중이라면 \"읽지않은 게시물\" 에서 보여주기.", + "ignoring.description": "새로운 답글에 대한 알림 받지 않기. \"읽지않은 게시물\"에서 보여주지 않기.", + "thread_tools.title": "게시물 관리", + "thread_tools.markAsUnreadForAll": "모든 사용자에게 읽지 않음으로 표시", "thread_tools.pin": "상단 고정", "thread_tools.unpin": "상단 고정 해제", "thread_tools.lock": "잠금", @@ -61,60 +61,60 @@ "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": "비활성화된 카테고리는 회색으로 표시됩니다.", + "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": "여기에 제목을 입력하세요.", + "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": "새 주제 생성", "composer.uploading": "업로드 중", - "composer.thumb_url_label": "섬네일 URL", - "composer.thumb_title": "이 주제에 섬네일 추가", + "composer.thumb_url_label": "섬네일 URL을 붙여넣으세요", + "composer.thumb_title": "이 게시물에 섬네일 추가", "composer.thumb_url_placeholder": "http://example.com/thumb.png", - "composer.thumb_file_label": "혹은 파일 업로드", + "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": "정렬", + "sort_by": "정렬 기준", "oldest_to_newest": "오래된 순으로 정렬", "newest_to_oldest": "최신 순으로 정렬", "most_votes": "추천수 순으로 정렬", "most_posts": "포스트 많은 순으로 정렬", - "stale.title": "새로 주제를 생성하시겠습니까?", - "stale.warning": "현재 답글을 작성중인 주제가 꽤 오래되었습니다. 새로 주제를 생성하시고 이글을 인용하시겠습니까?", - "stale.create": "새로운 주제를 작성", - "stale.reply_anyway": "아무튼 이 주제에 답변해주세요.", + "stale.title": "새로운 게시물을 생성 하시겠습니까?", + "stale.warning": "현재 답글을 작성중인 게시물은 오래전에 작성 되었습니다. 새로 게시물을 생성하시고 이 게시물을 인용 하시겠습니까?", + "stale.create": "새로운 게시물 작성", + "stale.reply_anyway": "이 게시물에 답글 작성", "link_back": "답글: [%1](%2)" } \ No newline at end of file diff --git a/public/language/ko/unread.json b/public/language/ko/unread.json index 2c710aa499..362d75cbe9 100644 --- a/public/language/ko/unread.json +++ b/public/language/ko/unread.json @@ -1,13 +1,13 @@ { "title": "읽지 않음", - "no_unread_topics": "읽지 않은 주제가 없습니다.", + "no_unread_topics": "읽지 않은 게시물이 없습니다.", "load_more": "더 보기", "mark_as_read": "읽음으로 표시", - "selected": "선택됨", + "selected": "선택된 게시물", "all": "전체", - "all_categories": "모든 카테고리", - "topics_marked_as_read.success": "토픽들을 읽음으로 표시했습니다.", - "all-topics": "모든 주제", - "new-topics": "새 주제", - "watched-topics": "관심 주제" + "all_categories": "모든 게시판", + "topics_marked_as_read.success": "게시물들을 읽음으로 표시했습니다.", + "all-topics": "모든 게시물", + "new-topics": "새 게시물", + "watched-topics": "관심있는 게시물" } \ No newline at end of file diff --git a/public/language/ko/user.json b/public/language/ko/user.json index 981aa5c1ec..7ae2e74f74 100644 --- a/public/language/ko/user.json +++ b/public/language/ko/user.json @@ -1,9 +1,9 @@ { - "banned": "차단됨", + "banned": "차단된 계정", "offline": "오프라인", "username": "사용자 이름", "joindate": "가입일", - "postcount": "게시물 수", + "postcount": "포스트 수", "email": "이메일", "confirm_email": "이메일 확인", "account_info": "계정 정보", @@ -11,33 +11,33 @@ "ban_account_confirm": "이 사용자를 차단하시겠습니까?", "unban_account": "차단 해제", "delete_account": "계정 삭제", - "delete_account_confirm": "정말 계정을 삭제하시겠습니까?
이 동작은 되돌릴 수 없으며 삭제된 데이터도 복구할 수 없습니다.

계정 삭제를 원하면 사용자 이름을 입력하세요.", - "delete_this_account_confirm": "정말 계정을 삭제하시겠습니까?
이 행동은 되돌릴 수 없으며 삭제된 사용자 정보도 복구할 수 없습니다.

", - "account-deleted": "삭제된 계정", + "delete_account_confirm": "정말 계정을 삭제 하시겠습니까?
이 동작은 되돌릴 수 없으며 삭제된 데이터도 복구할 수 없습니다.

계정 삭제를 원하면 사용자 이름을 입력하세요.", + "delete_this_account_confirm": "정말 계정을 삭제 하시겠습니까?
이 행동은 되돌릴 수 없으며 삭제된 사용자 정보도 복구할 수 없습니다.

", + "account-deleted": "계정이 삭제 되었습니다", "fullname": "이름", "website": "웹 사이트", "location": "위치", "age": "나이", "joined": "가입됨", - "lastonline": "마지막 로그인", + "lastonline": "최근 온라인 시점", "profile": "프로필", "profile_views": "프로필 조회 수", - "reputation": "평판", + "reputation": "등급", "bookmarks": "즐겨찾기", - "watched": "읽음", + "watched": "관심있는 게시물", "followers": "팔로워", - "following": "팔로우하는 중", - "aboutme": "자기 소개", + "following": "팔로잉", + "aboutme": "자기소개", "signature": "서명", "birthday": "생일", "chat": "채팅", "chat_with": "%1과/와 채팅 계속", "new_chat_with": "%1과/와 새로운 채팅", - "flag-profile": "프로필 플래그", + "flag-profile": "프로필 신고", "follow": "팔로우", "unfollow": "팔로우 취소", "more": "더 보기", - "profile_update_success": "성공적으로 프로필을 저장했습니다!", + "profile_update_success": "프로필을 성공적으로 저장했습니다.", "change_picture": "사진 변경", "change_username": "사용자명 변경", "change_email": "이메일 변경", @@ -49,13 +49,13 @@ "upload_new_picture_from_url": "URL을 통해 새 사진 업로드", "current_password": "현재 비밀번호", "change_password": "비밀번호 변경", - "change_password_error": "올바르지 않은 비밀번호", + "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": "비밀번호를 변경했습니다.", - "confirm_password": "비밀번호 재입력", + "confirm_password": "비밀번호 확인", "password": "비밀번호", "username_taken_workaround": "새 사용자 이름이 이미 존재하여 %1로 저장되었습니다.", "password_same_as_username": "비밀번호가 사용자명과 동일합니다. 다른 비밀번호를 입력하세요.", @@ -63,7 +63,7 @@ "weak_password": "보안이 취약한 비밀번호입니다.", "upload_picture": "사진 업로드", "upload_a_picture": "사진 업로드", - "remove_uploaded_picture": "등록된 사진을 삭제", + "remove_uploaded_picture": "업로드한 사진을 삭제", "upload_cover_picture": "커버 사진 업로드", "remove_cover_picture_confirm": "커버 사진을 제거하시겠습니까?", "crop_picture": "사진 잘라내기", @@ -72,63 +72,63 @@ "show_email": "내 이메일 보기", "show_fullname": "내 이름 보기", "restrict_chats": "내가 팔로우하는 이용자들로부터만 대화를 허용", - "digest_label": "포럼 이메일 수신", - "digest_description": "지정된 주기로 이 포럼의 이메일(새 알림과 토픽)을 수신", + "digest_label": "포럼 이메일 구독", + "digest_description": "주기적으로 포럼 이메일(새 알림과 게시물)을 구독", "digest_off": "해제", "digest_daily": "매일", "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_upvoted_posts": "이 사용자가 upvote한 게시물이 없습니다.", - "has_no_downvoted_posts": "이 사용자가 downvote한 게시물이 없습니다.", - "has_no_voted_posts": "이 사용자가 vote한 게시물이 없습니다.", + "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": "페이지 당 게시물 수", + "paginate_description": "주제와 게시물을 페이지로 정리", + "topics_per_page": "페이지 당 게시물 수", + "posts_per_page": "페이지 당 포스트 수", "notification_sounds": "알림 수신시 소리로 알려주기", - "notifications_and_sounds": "알림과 알림음", + "notifications_and_sounds": "알림 / 알림음 설정", "incoming-message-sound": "수신 메시지 알림음", "outgoing-message-sound": "발신 메시지 알림음", "notification-sound": "알림음", - "no-sound": "묵음", - "browsing": "브라우징 세팅", + "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": "만약 활성화된다면, 이미지 위치로 스크롤을 움직이기 전까지 이미지가 로드 되지 않습니다.", "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": "스킨 선택", "select-homepage": "홈페이지 선택", "homepage": "홈페이지", "homepage_description": "포럼 홈페이지로 사용할 페이지를 선택하거나 'None'으로 설정하여 기본 홈페이지를 사용합니다.", - "custom_route": "홈페이지 수동 경로", - "custom_route_help": "라우팅 이름을 앞쪽 '/' 없이 입력해주세요 (예: \"최근 목록\", \"인기 게시물\")", + "custom_route": "사용자 지정 홈페이지 라우트", + "custom_route_help": "라우트 이름을 앞쪽 '/' 없이 입력해주세요 (예: \"/recent\" => \"recent\", \"/popular\" => \"popular\")", "sso.title": "통합 인증 서비스", - "sso.associated": "와/과 연관된", - "sso.not-associated": "이 곳을 클릭하여 연관지으세요.", - "info.latest-flags": "최신 플래그", - "info.no-flags": "플래그된 포스트가 없습니다.", + "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.banned-reason-label": "사유", + "info.banned-no-reason": "제공된 사유가 없습니다.", + "info.username-history": "사용자명 변경 히스토리", "info.email-history": "이메일 히스토리", "info.moderation-note": "관리자 노트", "info.moderation-note.success": "관리자 노트 저장완료", diff --git a/public/language/ko/users.json b/public/language/ko/users.json index b71d5c35fa..317fd7e208 100644 --- a/public/language/ko/users.json +++ b/public/language/ko/users.json @@ -1,21 +1,21 @@ { - "latest_users": "최근 사용자", - "top_posters": "가장 많은 게시물을 올린 사용자", - "most_reputation": "가장 높은 평판", - "most_flags": "가장 많은 플래그", + "latest_users": "최근 가입 순", + "top_posters": "작성 게시물 순", + "most_reputation": "사용자 등급 순", + "most_flags": "신고 순", "search": "검색", - "enter_username": "검색할 사용자 이름을 입력하세요.", + "enter_username": "검색할 사용자명을 입력하세요.", "load_more": "더 보기", - "users-found-search-took": "%1명의 사용자를 찾았습니다. 검색 소요 시간 %2 초", - "filter-by": "에 의해 분류", - "online-only": "온라인 전용", + "users-found-search-took": "%1명의 사용자를 찾았습니다. 검색 소요 시간 %2초", + "filter-by": "필터 기준", + "online-only": "접속한 사용자", "invite": "초대", "invitation-email-sent": "%1님에게 초대 메일을 보냈습니다.", "user_list": "사용자 목록", - "recent_topics": "최근 주제", - "popular_topics": "인기 주제", - "unread_topics": "읽지 않은 주제", - "categories": "카테고리", + "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/database.json b/public/language/vi/admin/advanced/database.json index 7dd15423dc..27aaa79b67 100644 --- a/public/language/vi/admin/advanced/database.json +++ b/public/language/vi/admin/advanced/database.json @@ -17,7 +17,7 @@ "mongo.file-size": "Kích thước tập tin", "mongo.resident-memory": "Resident Memory", "mongo.virtual-memory": "Bộ nhớ ảo", - "mongo.mapped-memory": "Mapped Memory", + "mongo.mapped-memory": "Nhìn vào bộ nhớ ảo", "mongo.raw-info": "Thông tin MongoDB", "redis": "Redis", From f4fb9ee04ba737ede58b2847d582480f97e2e73a Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 16 Jun 2017 10:58:15 -0400 Subject: [PATCH 2/7] adding filter hooks for flag list and retrieval --- src/flags.js | 23 ++++++++++++++++++++++- src/plugins/hooks.js | 2 ++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/flags.js b/src/flags.js index 1f6d932de1..ebc3e37ba6 100644 --- a/src/flags.js +++ b/src/flags.js @@ -46,6 +46,13 @@ Flags.get = function (flagId, callback) { })); }); }, + function (flagObj, next) { + plugins.fireHook('filter:flags.get', { + flag: flagObj, + }, function (err, data) { + next(err, data.flag); + }); + }, ], callback); }; @@ -181,6 +188,13 @@ Flags.list = function (filters, uid, callback) { }); }, next); }, + function (flags, next) { + plugins.fireHook('filter:flags.list', { + flags: flags, + }, function (err, data) { + next(err, data.flags); + }); + }, ], callback); }; @@ -505,7 +519,8 @@ Flags.update = function (flagId, uid, changeset, callback) { tasks.push(async.apply(Flags.appendHistory, flagId, uid, changeset)); // Fire plugin hook - tasks.push(async.apply(plugins.fireHook, 'action:flag.update', { flagId: flagId, changeset: changeset, uid: uid })); + tasks.push(async.apply(plugins.fireHook, 'action:flag.update', { flagId: flagId, changeset: changeset, uid: uid })); // delete @ NodeBB v1.6.0 + tasks.push(async.apply(plugins.fireHook, 'action:flags.update', { flagId: flagId, changeset: changeset, uid: uid })); async.parallel(tasks, function (err) { return next(err); @@ -644,6 +659,9 @@ Flags.notify = function (flagObj, uid, callback) { plugins.fireHook('action:flag.create', { flag: flagObj, + }); // delete @ NodeBB v1.6.0 + plugins.fireHook('action:flags.create', { + flag: flagObj, }); notifications.push(notification, results.admins.concat(results.moderators).concat(results.globalMods), callback); }); @@ -673,6 +691,9 @@ Flags.notify = function (flagObj, uid, callback) { plugins.fireHook('action:flag.create', { flag: flagObj, + }); // delete @ NodeBB v1.6.0 + plugins.fireHook('action:flags.create', { + flag: flagObj, }); notifications.push(notification, results.admins.concat(results.globalMods), callback); }); diff --git a/src/plugins/hooks.js b/src/plugins/hooks.js index 16ceb32878..40684e31ab 100644 --- a/src/plugins/hooks.js +++ b/src/plugins/hooks.js @@ -9,6 +9,8 @@ module.exports = function (Plugins) { 'filter:post.save': 'filter:post.create', 'filter:user.profileLinks': 'filter:user.profileMenu', 'action:post.flag': 'action:flag.create', + 'action:flag.create': 'action:flags.create', + 'action:flag.update': 'action:flags.update', }; /* `data` is an object consisting of (* is required): From 07982a3fa2e04c72e65db617697c5cb310c23694 Mon Sep 17 00:00:00 2001 From: Ben Lubar Date: Fri, 16 Jun 2017 10:37:23 -0500 Subject: [PATCH 3/7] Fix uploading a file with no extension resulting in invalid-extension even if the file extension list is blank (allow all) --- src/controllers/uploads.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/controllers/uploads.js b/src/controllers/uploads.js index cae09a5043..ab651d1325 100644 --- a/src/controllers/uploads.js +++ b/src/controllers/uploads.js @@ -217,13 +217,10 @@ uploadsController.uploadFile = function (uid, uploadedFile, callback) { }; function saveFileToLocal(uploadedFile, callback) { - var extension = path.extname(uploadedFile.name); - if (!extension || extension === '.') { - return callback(new Error('[[error:invalid-extension]]')); - } var filename = uploadedFile.name || 'upload'; + var extension = path.extname(filename) || ''; - filename = Date.now() + '-' + validator.escape(filename.replace(path.extname(uploadedFile.name) || '', '')).substr(0, 255) + extension; + filename = Date.now() + '-' + validator.escape(filename.substr(0, filename.length - extension.length)).substr(0, 255) + extension; async.waterfall([ function (next) { From 2ed48375455e03a3fdc83756efbfbff7f2e3fc27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 16 Jun 2017 12:26:29 -0400 Subject: [PATCH 4/7] up composer-default --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d9cdf3781b..2d31b4b442 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "morgan": "^1.3.2", "mousetrap": "^1.5.3", "nconf": "~0.8.2", - "nodebb-plugin-composer-default": "4.4.12", + "nodebb-plugin-composer-default": "4.4.13", "nodebb-plugin-dbsearch": "2.0.4", "nodebb-plugin-emoji-extended": "1.1.1", "nodebb-plugin-emoji-one": "1.2.1", From 8f5f5eb56a5a445de57bacb6314819377d38d8e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 16 Jun 2017 12:55:26 -0400 Subject: [PATCH 5/7] closes #5761 --- package.json | 2 +- public/src/client/account/edit/username.js | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 2d31b4b442..180f23bbd9 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "nodebb-plugin-spam-be-gone": "0.5.0", "nodebb-rewards-essentials": "0.0.9", "nodebb-theme-lavender": "4.0.1", - "nodebb-theme-persona": "5.0.7", + "nodebb-theme-persona": "5.0.8", "nodebb-theme-slick": "1.1.0", "nodebb-theme-vanilla": "6.0.6", "nodebb-widget-essentials": "3.0.0", diff --git a/public/src/client/account/edit/username.js b/public/src/client/account/edit/username.js index 33d8ea99cd..f00e4d16fe 100644 --- a/public/src/client/account/edit/username.js +++ b/public/src/client/account/edit/username.js @@ -33,6 +33,8 @@ define('forum/account/edit/username', ['forum/account/header'], function (header var userslug = utils.slugify(userData.username); if (userData.username && userslug && parseInt(userData.uid, 10) === parseInt(app.user.uid, 10)) { $('[component="header/profilelink"]').attr('href', config.relative_path + '/user/' + userslug); + $('[component="header/profilelink/edit"]').attr('href', config.relative_path + '/user/' + userslug + '/edit'); + $('[component="header/profilelink/settings"]').attr('href', config.relative_path + '/user/' + userslug + '/settings'); $('[component="header/username"]').text(userData.username); $('[component="header/usericon"]').css('background-color', data['icon:bgColor']).text(data['icon:text']); } From d65f494c6d701aef0cf4a2ef8b892b0a7e0e8e52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 16 Jun 2017 14:25:40 -0400 Subject: [PATCH 6/7] closes #5127 --- package.json | 2 +- src/categories/create.js | 13 +++++- src/posts/edit.js | 19 ++++++-- src/privileges.js | 17 ++++++++ src/privileges/categories.js | 22 ++-------- src/privileges/topics.js | 3 +- src/topics/create.js | 26 ++++++++--- src/upgrades/1.5.2/tags_privilege.js | 22 ++++++++++ test/categories.js | 2 + test/topics.js | 65 ++++++++++++++++++++++++++-- 10 files changed, 156 insertions(+), 35 deletions(-) create mode 100644 src/upgrades/1.5.2/tags_privilege.js diff --git a/package.json b/package.json index 180f23bbd9..6f03e3c465 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "morgan": "^1.3.2", "mousetrap": "^1.5.3", "nconf": "~0.8.2", - "nodebb-plugin-composer-default": "4.4.13", + "nodebb-plugin-composer-default": "4.4.14", "nodebb-plugin-dbsearch": "2.0.4", "nodebb-plugin-emoji-extended": "1.1.1", "nodebb-plugin-emoji-one": "1.2.1", diff --git a/src/categories/create.js b/src/categories/create.js index 326545d76c..e489bfa815 100644 --- a/src/categories/create.js +++ b/src/categories/create.js @@ -52,7 +52,18 @@ module.exports = function (Categories) { function (data, next) { category = data.category; - var defaultPrivileges = ['find', 'read', 'topics:read', 'topics:create', 'topics:reply', 'posts:edit', 'posts:delete', 'topics:delete', 'upload:post:image']; + var defaultPrivileges = [ + 'find', + 'read', + 'topics:read', + 'topics:create', + 'topics:reply', + 'topics:tag', + 'posts:edit', + 'posts:delete', + 'topics:delete', + 'upload:post:image', + ]; async.series([ async.apply(db.setObject, 'category:' + category.cid, category), diff --git a/src/posts/edit.js b/src/posts/edit.js index 65ca05fc2f..0a9867feeb 100644 --- a/src/posts/edit.js +++ b/src/posts/edit.js @@ -48,9 +48,7 @@ module.exports = function (Posts) { }, function (result, next) { postData = result.post; - Posts.setPostFields(data.pid, postData, next); - }, - function (next) { + async.parallel({ editor: function (next) { user.getUserFields(data.uid, ['username', 'userslug'], next); @@ -62,7 +60,9 @@ module.exports = function (Posts) { }, function (_results, next) { results = _results; - + Posts.setPostFields(data.pid, postData, next); + }, + function (next) { postData.cid = results.topic.cid; postData.topic = results.topic; plugins.fireHook('action:post.edit', { post: _.clone(postData), uid: data.uid }); @@ -123,6 +123,17 @@ module.exports = function (Posts) { data.tags = data.tags || []; + if (!data.tags.length) { + return next(null, true); + } + + privileges.categories.can('topics:tag', topicData.cid, data.uid, next); + }, + function (canTag, next) { + if (!canTag) { + return next(new Error('[[error:no-privileges]]')); + } + plugins.fireHook('filter:topic.edit', { req: data.req, topic: topicData, data: data }, next); }, function (results, next) { diff --git a/src/privileges.js b/src/privileges.js index 63bae570e1..c1ac018ec7 100644 --- a/src/privileges.js +++ b/src/privileges.js @@ -2,12 +2,29 @@ var privileges = module.exports; +privileges.privilegeLabels = [ + { name: 'Find Category' }, + { name: 'Access Category' }, + { name: 'Access Topics' }, + { name: 'Create Topics' }, + { name: 'Reply to Topics' }, + { name: 'Tag Topics' }, + { name: 'Edit Posts' }, + { name: 'Delete Posts' }, + { name: 'Delete Topics' }, + { name: 'Upload Images' }, + { name: 'Upload Files' }, + { name: 'Purge' }, + { name: 'Moderate' }, +]; + privileges.userPrivilegeList = [ 'find', 'read', 'topics:read', 'topics:create', 'topics:reply', + 'topics:tag', 'posts:edit', 'posts:delete', 'topics:delete', diff --git a/src/privileges/categories.js b/src/privileges/categories.js index 4ec3eacaf3..604c2c5ac7 100644 --- a/src/privileges/categories.js +++ b/src/privileges/categories.js @@ -16,28 +16,13 @@ module.exports = function (privileges) { privileges.categories.list = function (cid, callback) { // Method used in admin/category controller to show all users/groups with privs in that given cid - var privilegeLabels = [ - { name: 'Find Category' }, - { name: 'Access Category' }, - { name: 'Access Topics' }, - { name: 'Create Topics' }, - { name: 'Reply to Topics' }, - { name: 'Edit Posts' }, - { name: 'Delete Posts' }, - { name: 'Delete Topics' }, - { name: 'Upload Images' }, - { name: 'Upload Files' }, - { name: 'Purge' }, - { name: 'Moderate' }, - ]; - async.waterfall([ function (next) { async.parallel({ labels: function (next) { async.parallel({ - users: async.apply(plugins.fireHook, 'filter:privileges.list_human', privilegeLabels), - groups: async.apply(plugins.fireHook, 'filter:privileges.groups.list_human', privilegeLabels), + users: async.apply(plugins.fireHook, 'filter:privileges.list_human', privileges.privilegeLabels), + groups: async.apply(plugins.fireHook, 'filter:privileges.groups.list_human', privileges.privilegeLabels), }, next); }, users: function (next) { @@ -155,7 +140,7 @@ module.exports = function (privileges) { }; privileges.categories.get = function (cid, uid, callback) { - var privs = ['topics:create', 'topics:read', 'read']; + var privs = ['topics:create', 'topics:read', 'topics:tag', 'read']; async.waterfall([ function (next) { async.parallel({ @@ -177,6 +162,7 @@ module.exports = function (privileges) { plugins.fireHook('filter:privileges.categories.get', { 'topics:create': privData['topics:create'] || isAdminOrMod, 'topics:read': privData['topics:read'] || isAdminOrMod, + 'topics:tag': privData['topics:tag'] || isAdminOrMod, read: privData.read || isAdminOrMod, cid: cid, uid: uid, diff --git a/src/privileges/topics.js b/src/privileges/topics.js index 88273800fe..ac602cc25a 100644 --- a/src/privileges/topics.js +++ b/src/privileges/topics.js @@ -16,7 +16,7 @@ module.exports = function (privileges) { privileges.topics.get = function (tid, uid, callback) { var topic; - var privs = ['topics:reply', 'topics:read', 'topics:delete', 'posts:edit', 'posts:delete', 'read']; + var privs = ['topics:reply', 'topics:read', 'topics:tag', 'topics:delete', 'posts:edit', 'posts:delete', 'read']; async.waterfall([ async.apply(topics.getTopicFields, tid, ['cid', 'uid', 'locked', 'deleted']), function (_topic, next) { @@ -41,6 +41,7 @@ module.exports = function (privileges) { plugins.fireHook('filter:privileges.topics.get', { 'topics:reply': (privData['topics:reply'] && !locked && !deleted) || isAdminOrMod, 'topics:read': privData['topics:read'] || isAdminOrMod, + 'topics:tag': privData['topics:tag'] || isAdminOrMod, 'topics:delete': (isOwner && privData['topics:delete']) || isAdminOrMod, 'posts:edit': (privData['posts:edit'] && !locked) || isAdminOrMod, 'posts:delete': (privData['posts:delete'] && !locked) || isAdminOrMod, diff --git a/src/topics/create.js b/src/topics/create.js index 071093e967..e758f5f513 100644 --- a/src/topics/create.js +++ b/src/topics/create.js @@ -107,18 +107,30 @@ module.exports = function (Topics) { check(data.content, meta.config.minimumPostLength, meta.config.maximumPostLength, 'content-too-short', 'content-too-long', next); }, function (next) { - categories.exists(data.cid, next); + async.parallel({ + categoryExists: function (next) { + categories.exists(data.cid, next); + }, + canCreate: function (next) { + privileges.categories.can('topics:create', data.cid, data.uid, next); + }, + canTag: function (next) { + if (!data.tags.length) { + return next(null, true); + } + privileges.categories.can('topics:tag', data.cid, data.uid, next); + }, + }, next); }, - function (categoryExists, next) { - if (!categoryExists) { + function (results, next) { + if (!results.categoryExists) { return next(new Error('[[error:no-category]]')); } - privileges.categories.can('topics:create', data.cid, data.uid, next); - }, - function (canCreate, next) { - if (!canCreate) { + + if (!results.canCreate || !results.canTag) { return next(new Error('[[error:no-privileges]]')); } + guestHandleValid(data, next); }, function (next) { diff --git a/src/upgrades/1.5.2/tags_privilege.js b/src/upgrades/1.5.2/tags_privilege.js new file mode 100644 index 0000000000..d5d703407c --- /dev/null +++ b/src/upgrades/1.5.2/tags_privilege.js @@ -0,0 +1,22 @@ +'use strict'; + +var async = require('async'); + +var batch = require('../../batch'); + +module.exports = { + name: 'Give tag privilege to registered-users on all categories', + timestamp: Date.UTC(2017, 5, 16), + method: function (callback) { + var progress = this.progress; + var privileges = require('../../privileges'); + batch.processSortedSet('categories:cid', function (cids, next) { + async.eachSeries(cids, function (cid, next) { + progress.incr(); + privileges.categories.give(['topics:tag'], cid, 'registered-users', next); + }, next); + }, { + progress: progress, + }, callback); + }, +}; diff --git a/test/categories.js b/test/categories.js index 18e125f3c7..53a867e858 100644 --- a/test/categories.js +++ b/test/categories.js @@ -645,6 +645,7 @@ describe('Categories', function () { 'topics:reply': false, 'topics:read': false, 'topics:create': false, + 'topics:tag': false, 'topics:delete': false, 'posts:edit': false, 'upload:post:file': false, @@ -666,6 +667,7 @@ describe('Categories', function () { 'groups:topics:delete': false, 'groups:topics:create': true, 'groups:topics:reply': true, + 'groups:topics:tag': true, 'groups:posts:delete': true, 'groups:read': true, 'groups:topics:read': true, diff --git a/test/topics.js b/test/topics.js index da3d148e70..3aed603c95 100644 --- a/test/topics.js +++ b/test/topics.js @@ -7,7 +7,9 @@ var nconf = require('nconf'); var db = require('./mocks/databasemock'); var topics = require('../src/topics'); +var posts = require('../src/posts'); var categories = require('../src/categories'); +var privileges = require('../src/privileges'); var meta = require('../src/meta'); var User = require('../src/user'); var groups = require('../src/groups'); @@ -825,7 +827,7 @@ describe('Topic\'s', function () { }); it('should 404 if tid is not a number', function (done) { - request(nconf.get('url') + '/api/topic/teaser/nan', { json: true }, function (err, response, body) { + request(nconf.get('url') + '/api/topic/teaser/nan', { json: true }, function (err, response) { assert.ifError(err); assert.equal(response.statusCode, 404); done(); @@ -858,7 +860,7 @@ describe('Topic\'s', function () { it('should 404 if tid is not a number', function (done) { - request(nconf.get('url') + '/api/topic/pagination/nan', { json: true }, function (err, response, body) { + request(nconf.get('url') + '/api/topic/pagination/nan', { json: true }, function (err, response) { assert.ifError(err); assert.equal(response.statusCode, 404); done(); @@ -866,7 +868,7 @@ describe('Topic\'s', function () { }); it('should 404 if tid does not exist', function (done) { - request(nconf.get('url') + '/api/topic/pagination/1231231', { json: true }, function (err, response, body) { + request(nconf.get('url') + '/api/topic/pagination/1231231', { json: true }, function (err, response) { assert.ifError(err); assert.equal(response.statusCode, 404); done(); @@ -1643,4 +1645,61 @@ describe('Topic\'s', function () { }); }); }); + + describe('tag privilege', function () { + var uid; + var cid; + before(function (done) { + async.waterfall([ + function (next) { + User.create({ username: 'tag_poster' }, next); + }, + function (_uid, next) { + uid = _uid; + categories.create({ name: 'tag category' }, next); + }, + function (categoryObj, next) { + cid = categoryObj.cid; + next(); + }, + ], done); + }); + + it('should fail to post if user does not have tag privilege', function (done) { + privileges.categories.rescind(['topics:tag'], cid, 'registered-users', function (err) { + assert.ifError(err); + topics.post({ uid: uid, cid: cid, tags: ['tag1'], title: 'topic with tags', content: 'some content here' }, function (err) { + assert.equal(err.message, '[[error:no-privileges]]'); + done(); + }); + }); + }); + + it('should fail to edit if user does not have tag privilege', function (done) { + topics.post({ uid: uid, cid: cid, title: 'topic with tags', content: 'some content here' }, function (err, result) { + assert.ifError(err); + var pid = result.postData.pid; + posts.edit({ pid: pid, uid: uid, content: 'edited content', tags: ['tag2'] }, function (err) { + assert.equal(err.message, '[[error:no-privileges]]'); + done(); + }); + }); + }); + + it('should be able to edit topic and add tags if allowed', function (done) { + privileges.categories.give(['topics:tag'], cid, 'registered-users', function (err) { + assert.ifError(err); + topics.post({ uid: uid, cid: cid, tags: ['tag1'], title: 'topic with tags', content: 'some content here' }, function (err, result) { + assert.ifError(err); + posts.edit({ pid: result.postData.pid, uid: uid, content: 'edited content', tags: ['tag1', 'tag2'] }, function (err, result) { + assert.ifError(err); + assert.deepEqual(result.topic.tags.map(function (tag) { + return tag.value; + }), ['tag1', 'tag2']); + done(); + }); + }); + }); + }); + }); }); From be79b85526df4207c61b2543fceaa2237fb39255 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 16 Jun 2017 15:02:06 -0400 Subject: [PATCH 7/7] fix test --- test/topics.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test/topics.js b/test/topics.js index 3aed603c95..541000dd52 100644 --- a/test/topics.js +++ b/test/topics.js @@ -1693,9 +1693,11 @@ describe('Topic\'s', function () { assert.ifError(err); posts.edit({ pid: result.postData.pid, uid: uid, content: 'edited content', tags: ['tag1', 'tag2'] }, function (err, result) { assert.ifError(err); - assert.deepEqual(result.topic.tags.map(function (tag) { + var tags = result.topic.tags.map(function (tag) { return tag.value; - }), ['tag1', 'tag2']); + }); + assert(tags.indexOf('tag1') !== -1); + assert(tags.indexOf('tag2') !== -1); done(); }); });