Merge remote-tracking branch 'refs/remotes/origin/master' into develop

v1.18.x
Barış Soner Uşaklı 8 years ago
commit 7fe9366103

@ -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.14",
"nodebb-plugin-dbsearch": "2.0.4",
"nodebb-plugin-emoji-extended": "1.1.1",
"nodebb-plugin-emoji-one": "1.2.1",
@ -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",

@ -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": "컨텐츠"
}

@ -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": "캐시 설정 변경"

@ -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"
}

@ -3,12 +3,12 @@
"error-events-per-day": "하루당 <code>%1</code>개의 이벤트 ",
"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 찾을 수 없음\" 오류 삭제 완료"
}

@ -1,7 +1,7 @@
{
"logs": "기록",
"control-panel": "기록 제어판",
"reload": "기록 다시로드",
"clear": "록 삭제",
"clear-success": "기록 삭제완료!"
"logs": "로그",
"control-panel": "로그 제어판",
"reload": "로그 리로드",
"clear": "로그 지우기",
"clear-success": "로그가 지워졌습니다!"
}

@ -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을 입력하십시오 (예시. 자바스크립트, 메타 태그, 등등). 당신의 포럼 마크업<code>&lt;head&gt;1</code> 섹션에 추가됩니다.",
"custom-header.description": "이곳에 사용자 정의 HTML을 입력하십시오 (예. JavaScript, Meta Tags, 등등). 당신의 포럼의 <code>&lt;head&gt;1</code> 섹션에 추가됩니다.",
"custom-header.enable": "사용자 정의 헤더 허용",
"custom-css.livereload": "실시간 새로고침 허용",
"custom-css.livereload.description": "이곳을 클릭하면 당신의 계정에 속한 장치들의 모든 세션들이 세이브할 때마다 새로고침 됩니다."
"custom-css.livereload": "실시간 새로 고침 허용",
"custom-css.livereload.description": "세이브를 누를 때마다 당신의 계정에 속한 디바이스의 모든 세션들이 새로고침 되게 하시려면 이것을 활성화하세요."
}

@ -5,5 +5,5 @@
"current-skin": "현재 스킨",
"skin-updated": "스킨 업데이트 됨",
"applied-success": "%1 스킨 적용 완료",
"revert-success": "기본 색로 스킨 복구됨"
"revert-success": "기본 색로 스킨 복구됨"
}

@ -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를 다시 시작해주십시오"
}

@ -1,18 +1,18 @@
{
"you-are-on": "정보 - 여기에 위치합니다 <strong>%1:%2</strong>",
"nodes-responded": "%1 노드가 %2ms 안으로 응답하였습니다",
"you-are-on": "정보 - <strong>%1:%2</strong>에 있습니다.",
"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": "정보"
}

@ -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": "로거 설정 업데이트"
}

@ -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": "플러그인을 만드는 과정 관련문서는 <a target=\"_blank\" href=\"https://docs.nodebb.org/en/latest/plugins/create.html\">NodeBB Docs Portal</a>에서 찾아보실 수 있습니다.",
"plugin-search-placeholder": "플러그인 검색하세요...",
"reorder-plugins": "플러그인 작동 순서 재배열",
"order-active": "사용 중인 플러그인 작동 순서 배열",
"dev-interested": "NodeBB 플러그인을 만드는 데 관심이 있으십니까?",
"docs-info": "플러그인 제작 관련 문서는 <a target=\"_blank\" href=\"https://docs.nodebb.org/en/latest/plugins/create.html\">NodeBB Docs Portal</a>에서 찾아보실 수 있습니다.",
"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": "<p>NodeBB가 페키지 매니저 접근에 실패하였습니다. 최신 버젼을 설치하시겠습니까?</p><div class=\"alert alert-danger\"><strong>서버의 응답 (%1)</strong>:%2</div>",
"alert.package-manager-unreachable": "<p>NodeBB가 페키지 매니저 접근에 실패했습니다. 지금 업그레이드 하는것을 추천하지 않습니다.</p>",
"alert.incompatible": "<p>지금 사용하시는 NodeBB버젼 (v%1)는 이 플러그인을 v%2 버젼까지 업그레이드 할 수 있습니다. 새로운 버젼을 설치하고 싶으시다면 NodeBB를 업그레이드 해주십시오.</p>",
"alert.possibly-incompatible": "<div class=\"alert alert-warning\"><p><strong>호환성관련 정보를 찾지 못했습니다.</strong></p><p>이 플러그인은 현재 사용중이신 NodeBB 버젼에 적합한 버젼을 말하지 않았습니다. 완전한 호환성은 보장 못 하고 지금 사용중이신 NodeBB가 고장나실 수 있습니다.</p></div><p>만약 NodeBB가 제대로 켜지지 않을시:</p><pre><code>$ ./nodebb reset plugin=\"%1\"</code></pre><p>이 플러그인의 최신버젼을 계속해서 다운로드 하시겠습니까?</p>"
"alert.package-manager-unreachable": "<p>NodeBB가 페키지 매니저 접근에 실패했습니다. 지금 업그레이드 하는 것을 추천하지 않습니다.</p>",
"alert.incompatible": "<p>지금 사용하시는 NodeBB 버젼(v%1)에서는 이 플러그인을 v%2 버젼까지만 업그레이드 할 수 있습니다. 이 플러그인의 최신 버젼을 설치하고 싶으시다면 먼저 NodeBB를 업그레이드 해주십시오.</p>",
"alert.possibly-incompatible": "<div class=\"alert alert-warning\"><p><strong>호환성 관련 정보를 찾지 못했습니다.</strong></p><p>이 플러그인은 현재 사용 중이신 NodeBB 버젼에 적합한 버젼을 명시하지 않았습니다. 따라서 완전한 호환성을 보장할 수 없고, 결과적으로 지금 사용중이신 NodeBB에 오류를 일으킬 수도 있습니다.</p></div><p>만약 NodeBB가 제대로 시작되지 않는다면:</p><pre><code>$ ./nodebb reset plugin=\"%1\"</code></pre><p>이 플러그인의 최신 버젼을 설치를 계속 하시겠습니까?</p>"
}

@ -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": "성공적으로 보상을 저장했습니다."
}

@ -1,18 +1,18 @@
{
"available": "사용 가능 위젯",
"explanation": "드롭다운 메뉴에서 위젯을 고르고 왼쪽에 있는 템플렛의 위젯 위치로 드래그하여 옮기십시오.",
"none-installed": "위젯을 찾지 못함! 필수적인 위젯 플러그인들을 <a href=\"%1\">플러그인</a> 제어판에서 활성화시켜주십시오.",
"containers.available": "사용 가능한 컨테이너",
"none-installed": "위젯을 찾을 수 없습니다! 필수 위젯 플러그인들을 <a href=\"%1\">플러그인</a> 제어판에서 활성화하세요.",
"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": "성공적으로 업데이트 된 위젯"

@ -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": "유효한 기간을 다음 형식으로 써주십시오 <code>YYYY-MM-DD</code>",
"page-views-custom-help": "페이지 뷰를 확인하고 싶은 기간을 입력하세요. 만약 데이트 피커를 사용할 수 없다면, YYYY-MM-DD 포맷으로 입력해주세요.",
"page-views-custom-error": "유효한 기간을 다음과 같은 포맷으로 입력하세요 <code>YYYY-MM-DD</code>",
"stats.day": "날",
"stats.week": "주",
@ -20,13 +20,13 @@
"stats.all": "항상",
"updates": "업데이트",
"running-version": "<strong>NodeBB v<span id=\"version\">%1</span></strong> 가 돌아가고 있습니다.",
"keep-updated": "사용하시는 NodeBB의 보안 및 에러 업데이트가 항상 최신 버전이도록 유의하여 주십시오",
"running-version": "<strong>NodeBB v<span id=\"version\">%1</span></strong> 를 사용 중입니다.",
"keep-updated": "사용하시는 NodeBB의 보안 및 오류 업데이트를 항상 최신 버젼으로 유지하십시오.",
"up-to-date": "<p><strong>최신 버전입니다</strong><i class=\"fa fa-check\"></i></p>",
"upgrade-available": "<p>새로운 버전 (v%1) 이 출시 되었습니다. <a href=\"https://docs.nodebb.org/en/latest/upgrading/index.html\">사용하시는 NodeBB</a>를 업데이트 하는 것을 고려하십시오.</p>",
"upgrade-available": "<p>새로운 버전 (v%1) 이 출시 되었습니다. <a href=\"https://docs.nodebb.org/en/latest/upgrading/index.html\">사용하시는 NodeBB</a>의 업데이트를 고려해보세요.</p>",
"prerelease-upgrade-available": "<p>옛 버전의 NodeBB를 사용하고 계십니다. 새로운 버전의(v%1) NodeBB가 출시되었으니 <a href=\"https://docs.nodebb.org/en/latest/upgrading/index.html\">업데이트</a> 하시는 것을 추천드립니다.</p>",
"prerelease-warning": "<p>이것은 <strong>구 버전</strong>의 NodeBB 입니다. 예상치 못한 버그가 생길 수 있습니다.<i class=\"fa fa-exclamation-triangle\"></i></p>",
"running-in-development": "<span>포럼이 개발자 모드로 실행되고 있습니다. 갖가지 취약점에 노출되어 있을 수 있으니 시스템 관리자에게 문의하십시오.</span>",
"prerelease-warning": "<p>이것은 <strong>정식 발표 전 버젼</strong>의 NodeBB 입니다. 예상치 못한 버그가 발생할 수 있습니다.<i class=\"fa fa-exclamation-triangle\"></i></p>",
"running-in-development": "<span>포럼이 개발자 모드로 실행되고 있습니다. 잠재적 취약점에 노출되어 있을 수 있으니 시스템 관리자에게 문의하십시오.</span>",
"notices": "알림",
"restart-not-required": "재시작 필요 없음",

@ -3,5 +3,5 @@
"description": "사용자가 루트 URL에 들어갔을 때 어떤 페이지가 보일지 선택하세요.",
"home-page-route": "홈페이지 경로",
"custom-route": "사용자 지정 경로",
"allow-user-home-pages": "사용자가 직접 홈페이지를 설정할 수 있게 허"
"allow-user-home-pages": "사용자가 직접 홈페이지를 설정할 수 있게 허"
}

@ -1,5 +1,5 @@
{
"post-sharing": "게시물 공유",
"info-plugins-additional": "플러그인에 새로운 네트워크를 추가하여 게시물을 공유할 수 있습니다.",
"save-success": "게시물 공유 네트워크 추가 완료!"
"post-sharing": "포스트 공유",
"info-plugins-additional": "플러그인을 이용해서 포스트를 공유할 수 있는 네트워크를 추가할 수 있습니다.",
"save-success": "포스트 공유 네트워크 추가 완료!"
}

@ -1,9 +1,9 @@
{
"notifications": "알림",
"chat-messages": "대화 메세지",
"chat-messages": "채팅 메세지",
"play-sound": "재생",
"incoming-message": "들어오는 메세지",
"outgoing-message": "나가는 메세지",
"incoming-message": "수신 메시지",
"outgoing-message": "발신 메시지",
"upload-new-sound": "새로운 사운드 업로드",
"saved": "설정 저장됨"
}

@ -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": "<strong>참고</strong>: 권한 설정은 즉시 적용됩니다. 설정을 변경한 후 카테고리를 따로 저장할 필요가 없습니다.",
"privileges.description": "이 섹션에서 게시판에 대한 접근 권한을 설정할 수 있습니다. 권한은 사용자 별 또는 그룹 별로 부여할 수 있습니다. 아래 양식으로 검색하여 새로운 사용자를 테이블에 추가할 수 있습니다.",
"privileges.warning": "<strong>참고</strong>: 권한 설정은 즉시 적용됩니다. 설정을 변경한 후 게시판을 따로 저장할 필요가 없습니다.",
"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": "만약 <code>registered-users</code>그룹이 특정 권한을 허가 받는다면 모든 다른 그룹들 또한 따로 추가하거나 체크하지 않더라도 <strong>권한</strong>을 얻게 됩니다. 모든 유저가 <code>registered-users</code> 그룹의 멤버이기 때문에 다른 추가적인 그룹에 대한 권한은 따로 허가 받을 필요가 없습니다.",
"privileges.copy-from-category": "게시판에서 복사",
"privileges.inherit": "만약 <code>registered-users</code>그룹이 특정 권한을 허가 받는다면 모든 다른 그룹들 또한 따로 추가하거나 체크하지 않더라도 <strong>암시적 권한</strong>을 얻게 됩니다. 모든 유저가 <code>registered-users</code> 그룹의 멤버이기 때문에 다른 추가적인 그룹에 대한 권한은 따로 허가 받을 필요가 없습니다.",
"analytics.back": "카테고리 리스트로 돌아가기",
"analytics.title": "\"%1\" 카테고리 분석",
"analytics.pageviews-hourly": "<strong>Figure 1</strong> &ndash; 이 카테고리에 대한 시간 당 페이지 뷰 수</small>",
"analytics.pageviews-daily": "<strong>Figure 2</strong> &ndash; 이 카테고리에 대한 일일 페이지 뷰 수</small>",
"analytics.topics-daily": "<strong>Figure 3</strong> &ndash; 이 카테고리의 오늘의 주제들</small>",
"analytics.posts-daily": "<strong>Figure 4</strong> &ndash; 이 카테고리의 오늘의 게시물</small>",
"analytics.back": "게시판 목록으로 돌아가기",
"analytics.title": "\"%1\" 게시판 분석 결과",
"analytics.pageviews-hourly": "<strong>Figure 1</strong> &ndash; 이 게시판에 대한 시간 당 페이지 뷰 수</small>",
"analytics.pageviews-daily": "<strong>Figure 2</strong> &ndash; 이 게시판에 대한 일일 페이지 뷰 수</small>",
"analytics.topics-daily": "<strong>Figure 3</strong> &ndash; 오늘 이 게시판에 생성된 게시물들</small>",
"analytics.posts-daily": "<strong>Figure 4</strong> &ndash; 오늘 이 게시판에 생성된 포스트들</small>",
"alert.created": "생성되었습니다",
"alert.create-success": "카테고리 성공적으로 생성됨!",
"alert.none-active": "활동 중인 카테고리가 없습니다.",
"alert.create": "카테고리 생성",
"alert.confirm-moderate": "<strong>이 사용자 그룹에 관리 권한을 부여하시겠습니까?</strong> 이 그룹은 공개 그룹이므로 모든 사용자가 자유롭게 가입 할 수 있습니다.",
"alert.confirm-purge": "<p class=\"lead\">이 카테고리를 \"%1\" 정말로 제거하시겠습니까?</p><h5><strong class=\"text-danger\">경고!</strong>이 카테고리에 속한 모든 토픽과 게시물들이 삭제됩니다!</h5><p class=\"help-block\">카테고리를 제거하시는 것은 모든 토픽과 게시물들을 삭제하고 데이타베이스에서 이 카테고리를 삭제시킵니다. 만약 일시적으로 카테고리를 삭제하고 싶으시다면 삭제 대신 \"비활성화\"를 해주십시오.</p>",
"alert.purge-success": "카테고리 제거됨!",
"alert.created": "생성",
"alert.create-success": "게시판 성공적으로 생성됨!",
"alert.none-active": "활성화된 게시판이 없습니다.",
"alert.create": "게시판 생성",
"alert.confirm-moderate": "<strong>이 사용자 그룹에 (준)관리 권한을 부여하시겠습니까?</strong> 이 그룹은 공개 그룹이므로 모든 사용자가 자유롭게 가입 할 수 있습니다.",
"alert.confirm-purge": "<p class=\"lead\">정말로 이 게시판을 \"%1\" 제거하시겠습니까?</p><h5><strong class=\"text-danger\">경고!</strong>이 게시판에 속한 모든 게시물과 포스트가 삭제됩니다!</h5><p class=\"help-block\">게시판을 제거하게 되면 모든 게시물과 포스트가 삭제되고 데이터베이스에서도 이 게시판이 삭제됩니다. 만약 일시적으로 게시판을 없애고 싶으시다면 삭제 대신 \"비활성화\"를 해주십시오.</p>",
"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": "여기 그룹을 검색하십시오..."
}

@ -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을 이용해서 이메일이나 사용자명으로 목록을 검색하세요. <br><br>초대에 응답한 사용자들은 이메일 옆에 사용자명이 표시됩니다.",

@ -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": "검색결과 표시방법"
}

@ -2,5 +2,5 @@
"success": "성공",
"topic-post": "성공적으로 게시물을 작성했습니다.",
"authentication-successful": "인증에 성공했습니다.",
"settings-saved": "성공적으로 설정을 저장했습니다."
"settings-saved": "설정이 저장되었습니다!"
}

@ -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": "아직 태그가 달리지 않았습니다."
}

@ -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": "새로운 답글에 대한 알림 받기. <br/> 읽지 않음에서 주제 보여주기.",
"not-watching.description": "새로운 답글에 대해 알림 받지 않기. 해당 카테고리를 팔로우 중이라면 \"읽지않은 토픽\" 에서 보여주기.",
"ignoring.description": "새로운 답글에 대한 알림 받지 않기. \"읽지않은 토픽\"에서 보여주지 않기.",
"thread_tools.title": "주제 관리",
"thread_tools.markAsUnreadForAll": "모 읽지 않음으로 표시",
"ignoring": "무시하는 중",
"watching.description": "새로운 답글에 대한 알림 받기. <br/> 읽지 않은 게시물에 보여주기.",
"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)"
}

@ -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": "관심있는 게시물"
}

@ -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": "정말 계정을 삭제하시겠습니까? <br /><strong>이 동작은 되돌릴 수 없으며 삭제된 데이터도 복구할 수 없습니다.</strong><br /><br />계정 삭제를 원하면 사용자 이름을 입력하세요.",
"delete_this_account_confirm": "정말 계정을 삭제하시겠습니까? <br /><strong>이 행동은 되돌릴 수 없으며 삭제된 사용자 정보도 복구할 수 없습니다.</strong><br /><br />",
"account-deleted": "삭제된 계정",
"delete_account_confirm": "정말 계정을 삭제 하시겠습니까? <br /><strong>이 동작은 되돌릴 수 없으며 삭제된 데이터도 복구할 수 없습니다.</strong><br /><br />계정 삭제를 원하면 사용자 이름을 입력하세요.",
"delete_this_account_confirm": "정말 계정을 삭제 하시겠습니까? <br /><strong>이 행동은 되돌릴 수 없으며 삭제된 사용자 정보도 복구할 수 없습니다.</strong><br /><br />",
"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": "새 사용자 이름이 이미 존재하여 <strong>%1</strong>로 저장되었습니다.",
"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": "관리자 노트 저장완료",

@ -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": "사용자를 찾을 수 없습니다!"
}

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

@ -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']);
}

@ -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),

@ -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) {

@ -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);
});

@ -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):

@ -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) {

@ -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',

@ -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,

@ -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,

@ -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) {

@ -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);
},
};

@ -648,6 +648,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,
@ -669,6 +670,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,

@ -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,63 @@ 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);
var tags = result.topic.tags.map(function (tag) {
return tag.value;
});
assert(tags.indexOf('tag1') !== -1);
assert(tags.indexOf('tag2') !== -1);
done();
});
});
});
});
});
});

Loading…
Cancel
Save