mirror of
				https://github.com/NodeBB/NodeBB.git
				synced 2025-10-31 11:05:54 +01:00 
			
		
		
		
	Merge remote-tracking branch 'refs/remotes/origin/master' into develop
This commit is contained in:
		| @@ -55,7 +55,7 @@ | |||||||
|     "morgan": "^1.3.2", |     "morgan": "^1.3.2", | ||||||
|     "mousetrap": "^1.5.3", |     "mousetrap": "^1.5.3", | ||||||
|     "nconf": "~0.8.2", |     "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-dbsearch": "2.0.4", | ||||||
|     "nodebb-plugin-emoji-extended": "1.1.1", |     "nodebb-plugin-emoji-extended": "1.1.1", | ||||||
|     "nodebb-plugin-emoji-one": "1.2.1", |     "nodebb-plugin-emoji-one": "1.2.1", | ||||||
| @@ -65,7 +65,7 @@ | |||||||
|     "nodebb-plugin-spam-be-gone": "0.5.0", |     "nodebb-plugin-spam-be-gone": "0.5.0", | ||||||
|     "nodebb-rewards-essentials": "0.0.9", |     "nodebb-rewards-essentials": "0.0.9", | ||||||
|     "nodebb-theme-lavender": "4.0.1", |     "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-slick": "1.1.0", | ||||||
|     "nodebb-theme-vanilla": "6.0.6", |     "nodebb-theme-vanilla": "6.0.6", | ||||||
|     "nodebb-widget-essentials": "3.0.0", |     "nodebb-widget-essentials": "3.0.0", | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| { | { | ||||||
| 	"alert.confirm-reload": "NodeBB를 다시 로드 하시겠습니까?", | 	"alert.confirm-reload": "NodeBB를 새로 고침 하시겠습니까?", | ||||||
| 	"alert.confirm-restart": "NodeBB를 다시 시작하시겠습니까?", | 	"alert.confirm-restart": "NodeBB를 다시 시작하시겠습니까?", | ||||||
|  |  | ||||||
| 	"acp-title": "%1 | NodeBB 관리자 제어판", | 	"acp-title": "%1 | NodeBB 관리자 제어판", | ||||||
| 	"settings-header-contents": "내용" | 	"settings-header-contents": "컨텐츠" | ||||||
| } | } | ||||||
| @@ -1,10 +1,10 @@ | |||||||
| { | { | ||||||
| 	"post-cache": "캐시 게시물", | 	"post-cache": "포스트 캐시", | ||||||
| 	"posts-in-cache": "캐시 게시물", | 	"posts-in-cache": "캐시된 포스트", | ||||||
| 	"average-post-size": "평균 게시물 크기", | 	"average-post-size": "평균 포스트 크기", | ||||||
| 	"length-to-max": "길이 / 최대", | 	"length-to-max": "길이 / 최대", | ||||||
| 	"percent-full": "1 %1% 꽉 참", | 	"percent-full": "%1%꽉참", | ||||||
| 	"post-cache-size": "게시물 캐시 크기", | 	"post-cache-size": "포스트 캐시 크기", | ||||||
| 	"items-in-cache": "캐시된 항목들", | 	"items-in-cache": "캐시된 항목들", | ||||||
| 	"control-panel": "제어판", | 	"control-panel": "제어판", | ||||||
| 	"update-settings": "캐시 설정 변경" | 	"update-settings": "캐시 설정 변경" | ||||||
|   | |||||||
| @@ -1,36 +1,36 @@ | |||||||
| { | { | ||||||
| 	"x-b": "%1 바이트", | 	"x-b": "%1 B", | ||||||
| 	"x-mb": "%1 메가바이트", | 	"x-mb": "%1 MB", | ||||||
| 	"x-gb": "%1 기가바이트", | 	"x-gb": "%1 GB", | ||||||
| 	"uptime-seconds": "가동시간 초단위", | 	"uptime-seconds": "Uptime (초)", | ||||||
| 	"uptime-days": "가동시간 일단위", | 	"uptime-days": "Uptime (일)", | ||||||
|  |  | ||||||
| 	"mongo": "Mongo", | 	"mongo": "Mongo", | ||||||
| 	"mongo.version": "MongoDB 버전", | 	"mongo.version": "MongoDB 버젼", | ||||||
| 	"mongo.storage-engine": "스토리지 엔진", | 	"mongo.storage-engine": "Storage Engine", | ||||||
| 	"mongo.collections": "컬렉션", | 	"mongo.collections": "Collections", | ||||||
| 	"mongo.objects": "객체", | 	"mongo.objects": "객체", | ||||||
| 	"mongo.avg-object-size": "평균 객체 크기", | 	"mongo.avg-object-size": "평균 객체 크기", | ||||||
| 	"mongo.data-size": "데이타 크기", | 	"mongo.data-size": "데이터 크기", | ||||||
| 	"mongo.storage-size": "저장공간 크기", | 	"mongo.storage-size": "저장공간 크기", | ||||||
| 	"mongo.index-size": "인덱스 크기", | 	"mongo.index-size": "인덱스 크기", | ||||||
| 	"mongo.file-size": "파일 크기", | 	"mongo.file-size": "파일 크기", | ||||||
| 	"mongo.resident-memory": "상주 메모리", | 	"mongo.resident-memory": "Resident Memory", | ||||||
| 	"mongo.virtual-memory": "가상 메모리", | 	"mongo.virtual-memory": "Virtual Memory", | ||||||
| 	"mongo.mapped-memory": "매핑된 메모리", | 	"mongo.mapped-memory": "Mapped Memory", | ||||||
| 	"mongo.raw-info": "MongoDB 미가공 정보", | 	"mongo.raw-info": "MongoDB Raw Info", | ||||||
|  |  | ||||||
| 	"redis": "Redis", | 	"redis": "Redis", | ||||||
| 	"redis.version": "Redis 버전", | 	"redis.version": "Redis 버젼", | ||||||
| 	"redis.connected-clients": "연결된 클라이언트", | 	"redis.connected-clients": "연결된 클라이언트", | ||||||
| 	"redis.connected-slaves": "연결된 slaves", | 	"redis.connected-slaves": "연결된 slaves", | ||||||
| 	"redis.blocked-clients": "차단된 클라이언트", | 	"redis.blocked-clients": "차단된 클라이언트", | ||||||
| 	"redis.used-memory": "사용된 메모리", | 	"redis.used-memory": "사용된 메모리", | ||||||
| 	"redis.memory-frag-ratio": "메모리 단편화 비율", | 	"redis.memory-frag-ratio": "Memory Fragmentation Ratio", | ||||||
| 	"redis.total-connections-recieved": "받은 총 커넥션 수", | 	"redis.total-connections-recieved": "받은 총 커넥션 수", | ||||||
| 	"redis.total-commands-processed": "처리된 총 명령 수", | 	"redis.total-commands-processed": "처리된 총 커맨드 수", | ||||||
| 	"redis.iops": "초당 순시동작 수", | 	"redis.iops": "초당 Instantaneous Ops", | ||||||
| 	"redis.keyspace-hits": "Keyspace 히트", | 	"redis.keyspace-hits": "Keyspace 히트", | ||||||
| 	"redis.keyspace-misses": "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-events-per-day": "하루당 <code>%1</code>개의 이벤트 ", | ||||||
| 	"error.404": "404 찾을 수 없음", | 	"error.404": "404 찾을 수 없음", | ||||||
| 	"error.503": "503 서비스를 사용할 수 없음", | 	"error.503": "503 서비스를 사용할 수 없음", | ||||||
| 	"manage-error-log": "오류 기록 관리", | 	"manage-error-log": "오류 로그 관리", | ||||||
| 	"export-error-log": "오류 기록 내보내기 (CSV)", | 	"export-error-log": "오류 기록 Export (CSV)", | ||||||
| 	"clear-error-log": "오류 기록 삭제", | 	"clear-error-log": "오류 기록 지우기", | ||||||
| 	"route": "Route", | 	"route": "라우트", | ||||||
| 	"count": "카운트", | 	"count": "카운트", | ||||||
| 	"no-routes-not-found": "만세! 404 오류 없음", | 	"no-routes-not-found": "만세! 404 오류 없음!", | ||||||
| 	"clear404-confirm": "404 오류 기록을 지우시겠습니까?", | 	"clear404-confirm": "404 오류 기록을 지우시겠습니까?", | ||||||
| 	"clear404-success": "\"404 찾을 수 없음\" 오류 삭제 완료" | 	"clear404-success": "\"404 찾을 수 없음\" 오류 삭제 완료" | ||||||
| } | } | ||||||
| @@ -1,7 +1,7 @@ | |||||||
| { | { | ||||||
| 	"logs": "기록", | 	"logs": "로그", | ||||||
| 	"control-panel": "기록 제어판", | 	"control-panel": "로그 제어판", | ||||||
| 	"reload": "기록 다시로드", | 	"reload": "로그 리로드", | ||||||
| 	"clear": "기록 삭제", | 	"clear": "로그 지우기", | ||||||
| 	"clear-success": "기록 삭제완료!" | 	"clear-success": "로그가 지워졌습니다!" | ||||||
| } | } | ||||||
| @@ -1,12 +1,12 @@ | |||||||
| { | { | ||||||
| 	"custom-css": "사용자 정의 CSS", | 	"custom-css": "사용자 정의 CSS", | ||||||
| 	"custom-css.description": "사용자 정의 CSS를 이곳에 입력하세요. 다른 스타일이 적용된 후 적용됩니다.", | 	"custom-css.description": "사용자 정의 CSS를 이곳에 입력하세요. 이 스타일들은 맨 마지막에 적용됩니다.", | ||||||
| 	"custom-css.enable": "사용자 정의 CSS 허용", | 	"custom-css.enable": "사용자 정의 CSS 허용", | ||||||
|  |  | ||||||
| 	"custom-header": "사용자 정의 헤더", | 	"custom-header": "사용자 정의 헤더", | ||||||
| 	"custom-header.description": "이곳에 사용자 정의된 HTML을 입력하십시오 (예시. 자바스크립트, 메타 태그, 등등). 당신의 포럼 마크업<code><head>1</code> 섹션에 추가됩니다.", | 	"custom-header.description": "이곳에 사용자 정의 HTML을 입력하십시오 (예. JavaScript, Meta Tags, 등등). 당신의 포럼의 <code><head>1</code> 섹션에 추가됩니다.", | ||||||
| 	"custom-header.enable": "사용자 정의 헤더 허용", | 	"custom-header.enable": "사용자 정의 헤더 허용", | ||||||
|  |  | ||||||
| 	"custom-css.livereload": "실시간 새로고침 허용", | 	"custom-css.livereload": "실시간 새로 고침 허용", | ||||||
| 	"custom-css.livereload.description": "이곳을 클릭하면 당신의 계정에 속한 장치들의 모든 세션들이 세이브할 때마다 새로고침 됩니다." | 	"custom-css.livereload.description": "세이브를 누를 때마다 당신의 계정에 속한 디바이스의 모든 세션들이 새로고침 되게 하시려면 이것을 활성화하세요." | ||||||
| } | } | ||||||
| @@ -5,5 +5,5 @@ | |||||||
| 	"current-skin": "현재 스킨", | 	"current-skin": "현재 스킨", | ||||||
| 	"skin-updated": "스킨 업데이트 됨", | 	"skin-updated": "스킨 업데이트 됨", | ||||||
| 	"applied-success": "%1 스킨 적용 완료", | 	"applied-success": "%1 스킨 적용 완료", | ||||||
| 	"revert-success": "기본 색깔로 스킨 복구됨" | 	"revert-success": "기본 색으로 스킨 복구됨" | ||||||
| } | } | ||||||
| @@ -1,11 +1,11 @@ | |||||||
| { | { | ||||||
|     "checking-for-installed": "설치된 테마들 확인 중...", |     "checking-for-installed": "설치된 테마 확인 중...", | ||||||
|     "homepage": "홈페이지", |     "homepage": "홈페이지", | ||||||
|     "select-theme": "테마 선택", |     "select-theme": "테마 선택", | ||||||
|     "current-theme": "현재 테마", |     "current-theme": "현재 테마", | ||||||
|     "no-themes": "설치된 테마가 없습니다", |     "no-themes": "설치된 테마가 없습니다", | ||||||
|     "revert-confirm": "기본 NodeBB 테마로 복원하시겠습니까?", |     "revert-confirm": "정말 기본 NodeBB 테마로 복원하시겠습니까?", | ||||||
|     "theme-changed": "테마 변경 완료", |     "theme-changed": "테마 변경 완료", | ||||||
|     "revert-success": "기본 NodeBB 테마로 성공적으로 복원 완료되었습니다", |     "revert-success": "성공적으로 기본 NodeBB 테마로 복원됐습니다.", | ||||||
|     "restart-to-activate": "변경된 테마를 완전히 활성화시키기 위해 NodeBB를 다시 시작해주십시오" |     "restart-to-activate": "변경된 테마를 완전히 활성화시키기 위해 NodeBB를 다시 시작해주십시오" | ||||||
| } | } | ||||||
| @@ -1,18 +1,18 @@ | |||||||
| { | { | ||||||
| 	"you-are-on": "정보 - 여기에 위치합니다 <strong>%1:%2</strong>", | 	"you-are-on": "정보 - <strong>%1:%2</strong>에 있습니다.", | ||||||
| 	"nodes-responded": "%1 노드가 %2ms 안으로 응답하였습니다", | 	"nodes-responded": "%1 노드가 %2ms 내로 응답했습니다.", | ||||||
| 	"host": "호스트", | 	"host": "호스트", | ||||||
| 	"pid": "프로세스 아이디", | 	"pid": "pid", | ||||||
| 	"nodejs": "nodejs", | 	"nodejs": "nodejs", | ||||||
| 	"online": "온라인", | 	"online": "온라인", | ||||||
| 	"git": "깃", | 	"git": "git", | ||||||
| 	"memory": "메모리", | 	"memory": "메모리", | ||||||
| 	"load": "로드", | 	"load": "로드", | ||||||
| 	"uptime": "가동 시간", | 	"uptime": "Uptime", | ||||||
|  |  | ||||||
| 	"registered": "등록됨", | 	"registered": "등록됨", | ||||||
| 	"sockets": "소켓", | 	"sockets": "Sockets", | ||||||
| 	"guests": "게스트", | 	"guests": "미가입 사용자", | ||||||
|  |  | ||||||
| 	"info": "정보" | 	"info": "정보" | ||||||
| } | } | ||||||
| @@ -1,12 +1,12 @@ | |||||||
| { | { | ||||||
| 	"logger-settings": "기록 설정", | 	"logger-settings": "로거 설정", | ||||||
| 	"description": "체크박스를 클릭함으로써 터미널로 기록을 받게됩니다. 만약 파일 경로를 지정하면 기록들이 지정한 파일로 저장됩니다. HTTP 기록은 누가, 언제, 무엇을 포럼에서 했는지에 대한 통계를 내는 데 유용합니다. HTTP 리퀘스트들을 기록함과 더불어 socket.io 이벤트들도 기록할 수 있습니다. Socket.io 기록은 redis-cli 모니터링과 함께 사용하면 NodeBB의 내부를 배우는데 아주 유용할 수 있습니다.", | 	"description": "체크 박스를 활성화하면, 터미널에서 로그를 볼 수 있게 됩니다. 만약 파일 경로를 지정하면, 로그가 지정한 파일에 대신 저장됩니다. HTTP 기록은 누가, 언제, 무엇을 포럼에서 했는지에 대한 통계를 내는 데 유용합니다. HTTP 리퀘스트들을 기록할 뿐 아니라, socket.io 이벤트들도 기록할 수 있습니다. Socket.io 기록은 redis-cli 모니터와 함께 사용하면 NodeBB의 내부 사항을 모니터하는 데 아주 유용할 수 있습니다.", | ||||||
| 	"explanation": "원하실때 기록 환경을 활성화/비활성화 하십시오. 재시작을 할 필요는 없습니다.", | 	"explanation": "원하실 때 로깅 환경을 활성화/비활성화 하십시오. 재시작 할 필요는 없습니다.", | ||||||
| 	"enable-http": "HTTP 기록하기 허용", | 	"enable-http": "HTTP 로깅 허용", | ||||||
| 	"enable-socket": "socket.io 이벤트 기록하기 허용", | 	"enable-socket": "socket.io 이벤트 로깅 허용", | ||||||
| 	"file-path": "로그 파일 경로", | 	"file-path": "로그 파일 경로", | ||||||
| 	"file-path-placeholder": "/기록을/저장할/파일까지의경로/file.log ::: 터미널로 기록을 보시려면 빈칸으로 두십시오", | 	"file-path-placeholder": "/path/to/log/file.log ::: 터미널에서 로그를 보시려면 빈칸으로 두세요", | ||||||
|  |  | ||||||
| 	"control-panel": "기록 제어판", | 	"control-panel": "로거 제어판", | ||||||
| 	"update-settings": "기록 설정 업데이트" | 	"update-settings": "로거 설정 업데이트" | ||||||
| } | } | ||||||
| @@ -1,47 +1,47 @@ | |||||||
| { | { | ||||||
| 	"installed": "설치됨", | 	"installed": "설치됨", | ||||||
| 	"active": "활동 중", | 	"active": "사용 중", | ||||||
| 	"inactive": "비활성", | 	"inactive": "사용하지 않는 중", | ||||||
| 	"out-of-date": "오래된", | 	"out-of-date": "업데이트가 안된", | ||||||
| 	"none-found": "플러그인을 찾을 수 없습니다.", | 	"none-found": "플러그인을 찾을 수 없습니다.", | ||||||
| 	"none-active": "활성화된 플러그인이 없습니다.", | 	"none-active": "사용 중인 플러그인이 없습니다.", | ||||||
| 	"find-plugins": "플러그인 찾기", | 	"find-plugins": "플러그인 찾기", | ||||||
|  |  | ||||||
| 	"plugin-search": "플러그인 검색", | 	"plugin-search": "플러그인 검색", | ||||||
| 	"plugin-search-placeholder": "플러그인 검색...", | 	"plugin-search-placeholder": "플러그인을 검색하세요...", | ||||||
| 	"reorder-plugins": "플러그인들 재정리", | 	"reorder-plugins": "플러그인 작동 순서 재배열", | ||||||
| 	"order-active": "활성화된 플러그인 배열", | 	"order-active": "사용 중인 플러그인 작동 순서 배열", | ||||||
| 	"dev-interested": "NodeBB 플러그인들을 만드는데 관심이 있으십니까?", | 	"dev-interested": "NodeBB 플러그인을 만드는 데 관심이 있으십니까?", | ||||||
| 	"docs-info": "플러그인을 만드는 과정 관련문서는 <a target=\"_blank\" href=\"https://docs.nodebb.org/en/latest/plugins/create.html\">NodeBB Docs Portal</a>에서 찾아보실 수 있습니다.", | 	"docs-info": "플러그인 제작 관련 문서는 <a target=\"_blank\" href=\"https://docs.nodebb.org/en/latest/plugins/create.html\">NodeBB Docs Portal</a>에서 찾아보실 수 있습니다.", | ||||||
|  |  | ||||||
| 	"order.description": "어떤 플러그인들은 다른 플러그인들의 활성화 전/후에 이상적으로 작동합니다.", | 	"order.description": "특정 플러그인은 다른 플러그인의 초기화 전/후에 가장 이상적으로 작동합니다.", | ||||||
| 	"order.explanation": "플러그인들은 여기에 나열되어있는 순서로 로드 됩니다.", | 	"order.explanation": "플러그인들은 여기에 나열된 순서로 로드됩니다.", | ||||||
| 	 | 	 | ||||||
| 	"plugin-item.themes": "주제들/테마들", | 	"plugin-item.themes": "테마", | ||||||
| 	"plugin-item.deactivate": "비활성화", | 	"plugin-item.deactivate": "비활성화", | ||||||
| 	"plugin-item.activate": "활성화", | 	"plugin-item.activate": "활성화", | ||||||
| 	"plugin-item.install": "설치", | 	"plugin-item.install": "설치", | ||||||
| 	"plugin-item.uninstall": "삭제", | 	"plugin-item.uninstall": "제거", | ||||||
| 	"plugin-item.settings": "환경", | 	"plugin-item.settings": "설정", | ||||||
| 	"plugin-item.installed": "설치됨", | 	"plugin-item.installed": "설치됨", | ||||||
| 	"plugin-item.latest": "최신", | 	"plugin-item.latest": "최신", | ||||||
| 	"plugin-item.upgrade": "업그레이드", | 	"plugin-item.upgrade": "업그레이드", | ||||||
| 	"plugin-item.more-info": "추가적인 정보를 원할시:", | 	"plugin-item.more-info": "추가적인 정보를 원하시면:", | ||||||
| 	"plugin-item.unknown": "알려지지 않은 것", | 	"plugin-item.unknown": "알려지지 않은", | ||||||
| 	"plugin-item.unknown-explanation": "이 플러그인의 상태를 분별할 수 없습니다. 잘못된 구성의 탓일 수 있습니다.", | 	"plugin-item.unknown-explanation": "이 플러그인의 상태를 알 수 없습니다. 환경 설정에서 발생한 오류 때문일 수 있습니다.", | ||||||
|  |  | ||||||
| 	"alert.enabled": "플러그인이 활성화되었습니다", | 	"alert.enabled": "플러그인이 활성화됐습니다", | ||||||
| 	"alert.disabled": "플러그인이 비활성화되었습니다.", | 	"alert.disabled": "플러그인이 비활성화됐습니다.", | ||||||
| 	"alert.upgraded": "플러그인이 업그레이드되었습니다.", | 	"alert.upgraded": "플러그인이 업그레이드됐습니다.", | ||||||
| 	"alert.installed": "플러그인이 설치되었습니다.", | 	"alert.installed": "플러그인이 설치됐습니다.", | ||||||
| 	"alert.uninstalled": "플러그인이 삭제되었습니다.", | 	"alert.uninstalled": "플러그인이 제거됐습니다.", | ||||||
| 	"alert.activate-success": "이 플러그인을 완전히 활성화하려면 NodeBB를 재시작해주십시오.", | 	"alert.activate-success": "이 플러그인을 완전히 활성화하려면 NodeBB를 다시 시작해주십시오.", | ||||||
| 	"alert.deactivate-success": "플러그인이 성공적으로 비활성화되었습니다.", | 	"alert.deactivate-success": "플러그인이 성공적으로 비활성화됐습니다.", | ||||||
| 	"alert.upgrade-success": "이 플러그인을 완전히 업그레이드 시키려면 NodeBB를 다시 로드해주십시오.", | 	"alert.upgrade-success": "이 플러그인을 완전히 업그레이드 시키려면 NodeBB를 다시 로드해주십시오.", | ||||||
| 	"alert.install-success": "플러그인 설치가 성공적이었습니다. 플러그인을 활성화 해주십시오.", | 	"alert.install-success": "플러그인이 성공적으로 설치됐습니다. 플러그인을 활성화 해주십시오.", | ||||||
| 	"alert.uninstall-success": "플러그인이 성공적으로 비활성화되고 삭제되었습니다.", | 	"alert.uninstall-success": "플러그인이 성공적으로 비활성화되고 삭제됐습니다.", | ||||||
| 	"alert.suggest-error": "<p>NodeBB가 페키지 매니저 접근에 실패하였습니다. 최신 버젼을 설치하시겠습니까?</p><div class=\"alert alert-danger\"><strong>서버의 응답 (%1)</strong>:%2</div>", | 	"alert.suggest-error": "<p>NodeBB가 페키지 매니저 접근에 실패하였습니다. 최신 버젼을 설치하시겠습니까?</p><div class=\"alert alert-danger\"><strong>서버의 응답 (%1)</strong>:%2</div>", | ||||||
| 	"alert.package-manager-unreachable": "<p>NodeBB가 페키지 매니저 접근에 실패했습니다. 지금 업그레이드 하는것을 추천하지 않습니다.</p>", | 	"alert.package-manager-unreachable": "<p>NodeBB가 페키지 매니저 접근에 실패했습니다. 지금 업그레이드 하는 것을 추천하지 않습니다.</p>", | ||||||
| 	"alert.incompatible": "<p>지금 사용하시는 NodeBB버젼 (v%1)는 이 플러그인을 v%2 버젼까지 업그레이드 할 수 있습니다. 새로운 버젼을 설치하고 싶으시다면 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.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": "보상", | 	"rewards": "보상", | ||||||
| 	"condition-if-users": "만약 사용자의", | 	"condition-if-users": "만약 사용자의", | ||||||
| 	"condition-is": "이:", | 	"condition-is": "다음의 조건을 충족한다면:", | ||||||
| 	"condition-then": "하다면:", | 	"condition-then": "다음과 같은 행동을 취합니다:", | ||||||
| 	"max-claims": "보상이 유효한 기간", | 	"max-claims": "보상을 받을 수 있는 횟수", | ||||||
| 	"zero-infinite": "무제한으로 설정하려면 0 으로 설정하세요", | 	"zero-infinite": "무제한으로 설정하려면 0 으로 설정하세요", | ||||||
| 	"delete": "삭제", | 	"delete": "삭제", | ||||||
| 	"enable": "활성화", | 	"enable": "활성화", | ||||||
| 	"disable": "비활성화", | 	"disable": "비활성화", | ||||||
| 	"control-panel": "보상 시스템 제어판", | 	"control-panel": "보상 제어판", | ||||||
| 	"new-reward": "새로운 보상 시스템", | 	"new-reward": "새로운 보상", | ||||||
|  |  | ||||||
| 	"alert.delete-success": "성공적으로 보상 시스템을 삭제하였습니다.", | 	"alert.delete-success": "성공적으로 보상을 삭제했습니다.", | ||||||
| 	"alert.no-inputs-found": "잘못된 보상 시스템 - 인풋이 없습니다.", | 	"alert.no-inputs-found": "잘못된 보상 - 인풋이 없습니다!", | ||||||
| 	"alert.save-success": "성공적으로 보상 시스템을 저장하였습니다." | 	"alert.save-success": "성공적으로 보상을 저장했습니다." | ||||||
| } | } | ||||||
| @@ -1,18 +1,18 @@ | |||||||
| { | { | ||||||
| 	"available": "사용 가능 위젯", | 	"available": "사용 가능 위젯", | ||||||
| 	"explanation": "드롭다운 메뉴에서 위젯을 고르고 왼쪽에 있는 템플렛의 위젯 위치로 드래그하여 옮기십시오.", | 	"explanation": "드롭다운 메뉴에서 위젯을 고르고 왼쪽에 있는 템플렛의 위젯 위치로 드래그하여 옮기십시오.", | ||||||
| 	"none-installed": "위젯을 찾지 못함! 필수적인 위젯 플러그인들을 <a href=\"%1\">플러그인</a> 제어판에서 활성화시켜주십시오.", | 	"none-installed": "위젯을 찾을 수 없습니다! 필수 위젯 플러그인들을 <a href=\"%1\">플러그인</a> 제어판에서 활성화하세요.", | ||||||
| 	"containers.available": "사용 가능한 컨테이너들", | 	"containers.available": "사용 가능한 컨테이너", | ||||||
| 	"containers.explanation": "아무 활성화된 위젯 위로 드래그해서 옮겨주십시오.", | 	"containers.explanation": "아무 활성화된 위젯 위로 드래그해서 옮겨주십시오.", | ||||||
| 	"containers.none": "없음", | 	"containers.none": "없음", | ||||||
| 	"container.well": "좋음", | 	"container.well": "Well", | ||||||
| 	"container.jumbotron": "점보트론", | 	"container.jumbotron": "Jumbotron", | ||||||
| 	"container.panel": "제어판", | 	"container.panel": "제어판", | ||||||
| 	"container.panel-header": "제어판 헤더", | 	"container.panel-header": "제어판 헤더", | ||||||
| 	"container.panel-body": "제어판 몸통", | 	"container.panel-body": "제어판 몸통", | ||||||
| 	"container.alert": "경고", | 	"container.alert": "경고", | ||||||
|  |  | ||||||
| 	"alert.confirm-delete": "위젯을 삭제하시겠습니까?", | 	"alert.confirm-delete": "정말 이 위젯을 삭제하시겠습니까?", | ||||||
| 	"alert.updated": "위젯 업데이트 됨", | 	"alert.updated": "위젯 업데이트 됨", | ||||||
| 	"alert.update-success": "성공적으로 업데이트 된 위젯" | 	"alert.update-success": "성공적으로 업데이트 된 위젯" | ||||||
|  |  | ||||||
|   | |||||||
| @@ -3,16 +3,16 @@ | |||||||
| 	"page-views": "페이지 뷰", | 	"page-views": "페이지 뷰", | ||||||
| 	"unique-visitors": "순 방문자수", | 	"unique-visitors": "순 방문자수", | ||||||
| 	"users": "사용자", | 	"users": "사용자", | ||||||
| 	"posts": "게시물", | 	"posts": "포스트", | ||||||
| 	"topics": "주제", | 	"topics": "게시물", | ||||||
| 	"page-views-seven": "지난 7일간", | 	"page-views-seven": "지난 7일간", | ||||||
| 	"page-views-thirty": "지난 30일간", | 	"page-views-thirty": "지난 30일간", | ||||||
| 	"page-views-last-day": "지난 24시간 동안", | 	"page-views-last-day": "지난 24시간 동안", | ||||||
| 	"page-views-custom": "사용자 설정 날짜 기간", | 	"page-views-custom": "사용자 설정 날짜 기간", | ||||||
| 	"page-views-custom-start": "기간 시작", | 	"page-views-custom-start": "기간 시작", | ||||||
| 	"page-views-custom-end": "기간 끝", | 	"page-views-custom-end": "기간 끝", | ||||||
| 	"page-views-custom-help": "보고자 하시는 날짜 기간 동안의 페이지 본 횟수를 ", | 	"page-views-custom-help": "페이지 뷰를 확인하고 싶은 기간을 입력하세요. 만약 데이트 피커를 사용할 수 없다면, YYYY-MM-DD 포맷으로 입력해주세요.", | ||||||
| 	"page-views-custom-error": "유효한 기간을 다음 형식으로 써주십시오 <code>YYYY-MM-DD</code>", | 	"page-views-custom-error": "유효한 기간을 다음과 같은 포맷으로 입력하세요 <code>YYYY-MM-DD</code>", | ||||||
|  |  | ||||||
| 	"stats.day": "날", | 	"stats.day": "날", | ||||||
| 	"stats.week": "주", | 	"stats.week": "주", | ||||||
| @@ -20,13 +20,13 @@ | |||||||
| 	"stats.all": "항상", | 	"stats.all": "항상", | ||||||
| 	 | 	 | ||||||
| 	"updates": "업데이트", | 	"updates": "업데이트", | ||||||
| 	"running-version": "<strong>NodeBB v<span id=\"version\">%1</span></strong> 가 돌아가고 있습니다.", | 	"running-version": "<strong>NodeBB v<span id=\"version\">%1</span></strong> 를 사용 중입니다.", | ||||||
| 	"keep-updated": "사용하시는 NodeBB의 보안 및 에러 업데이트가 항상 최신 버전이도록 유의하여 주십시오", | 	"keep-updated": "사용하시는 NodeBB의 보안 및 오류 업데이트를 항상 최신 버젼으로 유지하십시오.", | ||||||
| 	"up-to-date": "<p><strong>최신 버전입니다</strong><i class=\"fa fa-check\"></i></p>", | 	"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-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>", | 	"prerelease-warning": "<p>이것은 <strong>정식 발표 전 버젼</strong>의 NodeBB 입니다.  예상치 못한 버그가 발생할 수 있습니다.<i class=\"fa fa-exclamation-triangle\"></i></p>", | ||||||
| 	"running-in-development": "<span>포럼이 개발자 모드로 실행되고 있습니다. 갖가지 취약점에 노출되어 있을 수 있으니 시스템 관리자에게 문의하십시오.</span>", | 	"running-in-development": "<span>포럼이 개발자 모드로 실행되고 있습니다. 잠재적 취약점에 노출되어 있을 수 있으니 시스템 관리자에게 문의하십시오.</span>", | ||||||
|  |  | ||||||
| 	"notices": "알림", | 	"notices": "알림", | ||||||
| 	"restart-not-required": "재시작 필요 없음", | 	"restart-not-required": "재시작 필요 없음", | ||||||
|   | |||||||
| @@ -3,5 +3,5 @@ | |||||||
| 	"description": "사용자가 루트 URL에 들어갔을 때 어떤 페이지가 보일지 선택하세요.", | 	"description": "사용자가 루트 URL에 들어갔을 때 어떤 페이지가 보일지 선택하세요.", | ||||||
| 	"home-page-route": "홈페이지 경로", | 	"home-page-route": "홈페이지 경로", | ||||||
| 	"custom-route": "사용자 지정 경로", | 	"custom-route": "사용자 지정 경로", | ||||||
| 	"allow-user-home-pages": "사용자가 직접 홈페이지를 설정할 수 있게 허락" | 	"allow-user-home-pages": "사용자가 직접 홈페이지를 설정할 수 있게 허용" | ||||||
| } | } | ||||||
| @@ -1,5 +1,5 @@ | |||||||
| { | { | ||||||
| 	"post-sharing": "게시물 공유", | 	"post-sharing": "포스트 공유", | ||||||
| 	"info-plugins-additional": "플러그인에 새로운 네트워크를 추가하여 게시물을 공유할 수 있습니다.", | 	"info-plugins-additional": "플러그인을 이용해서 포스트를 공유할 수 있는 네트워크를 추가할 수 있습니다.", | ||||||
| 	"save-success": "게시물 공유 네트워크 추가 완료!" | 	"save-success": "포스트 공유 네트워크 추가 완료!" | ||||||
| } | } | ||||||
| @@ -1,9 +1,9 @@ | |||||||
| { | { | ||||||
| 	"notifications": "알림", | 	"notifications": "알림", | ||||||
| 	"chat-messages": "대화 메세지", | 	"chat-messages": "채팅 메세지", | ||||||
| 	"play-sound": "재생", | 	"play-sound": "재생", | ||||||
| 	"incoming-message": "들어오는 메세지", | 	"incoming-message": "수신 메시지", | ||||||
| 	"outgoing-message": "나가는 메세지", | 	"outgoing-message": "발신 메시지", | ||||||
| 	"upload-new-sound": "새로운 사운드 업로드", | 	"upload-new-sound": "새로운 사운드 업로드", | ||||||
| 	"saved": "설정 저장됨" | 	"saved": "설정 저장됨" | ||||||
| } | } | ||||||
| @@ -1,9 +1,9 @@ | |||||||
| { | { | ||||||
| 	"settings": "카테고리 설정", | 	"settings": "게시판 설정", | ||||||
| 	"privileges": "권한", | 	"privileges": "권한", | ||||||
|  |  | ||||||
| 	"name": "카테고리 이름", | 	"name": "게시판 이름", | ||||||
| 	"description": "카테고리 설명", | 	"description": "게시판 설명", | ||||||
| 	"bg-color": "배경 색", | 	"bg-color": "배경 색", | ||||||
| 	"text-color": "글자 색", | 	"text-color": "글자 색", | ||||||
| 	"bg-image-size": "배경 이미지 크기", | 	"bg-image-size": "배경 이미지 크기", | ||||||
| @@ -12,57 +12,57 @@ | |||||||
| 	"ext-link": "외부 링크", | 	"ext-link": "외부 링크", | ||||||
| 	"upload-image": "이미지 업로드", | 	"upload-image": "이미지 업로드", | ||||||
| 	"delete-image": "삭제", | 	"delete-image": "삭제", | ||||||
| 	"category-image": "카테고리 이미지", | 	"category-image": "게시판 이미지", | ||||||
| 	"parent-category": "상위 카테고리", | 	"parent-category": "상위 카테고리", | ||||||
| 	"optional-parent-category": "(선택) 상위 카테고리", | 	"optional-parent-category": "(선택) 상위 게시판", | ||||||
| 	"parent-category-none": "(없음)", | 	"parent-category-none": "(없음)", | ||||||
| 	"copy-settings": "에서 설정 복사", | 	"copy-settings": "에서 설정 복사", | ||||||
| 	"optional-clone-settings": "(선택) 카테고리에서 설정 복사", | 	"optional-clone-settings": "(선택) 게시판에서 설정 복사", | ||||||
| 	"purge": "카테고리 삭제", | 	"purge": "게시판 삭제", | ||||||
|  |  | ||||||
| 	"enable": "활성화", | 	"enable": "활성화", | ||||||
| 	"disable": "비활성화", | 	"disable": "비활성화", | ||||||
| 	"edit": "편집", | 	"edit": "편집", | ||||||
|  |  | ||||||
| 	"select-category": "카테고리 설정", | 	"select-category": "게시판 선택", | ||||||
| 	"set-parent-category": "상위 카테고리 설정", | 	"set-parent-category": "상위 게시판 설정", | ||||||
|  |  | ||||||
| 	"privileges.description": "이 섹션에서는 카테고리에 대한 접근 권한을 설정할 수 있습니다. 권한은 사용자 별 또는 그룹 별로 부여할 수 있습니다. 아래 양식으로 검색하여 새로운 사용자를 표에 추가할 수 있습니다.", | 	"privileges.description": "이 섹션에서 게시판에 대한 접근 권한을 설정할 수 있습니다. 권한은 사용자 별 또는 그룹 별로 부여할 수 있습니다. 아래 양식으로 검색하여 새로운 사용자를 테이블에 추가할 수 있습니다.", | ||||||
| 	"privileges.warning": "<strong>참고</strong>: 권한 설정은 즉시 적용됩니다. 설정을 변경한 후 카테고리를 따로 저장할 필요가 없습니다.", | 	"privileges.warning": "<strong>참고</strong>: 권한 설정은 즉시 적용됩니다. 설정을 변경한 후 게시판을 따로 저장할 필요가 없습니다.", | ||||||
| 	"privileges.section-viewing": "권한 보기", | 	"privileges.section-viewing": "권한 보기", | ||||||
| 	"privileges.section-posting": "게시물 작성 권한", | 	"privileges.section-posting": "게시물 작성 권한", | ||||||
| 	"privileges.section-moderation": "관리 권한", | 	"privileges.section-moderation": "(준)관리자 권한", | ||||||
| 	"privileges.section-user": "사용자", | 	"privileges.section-user": "사용자", | ||||||
| 	"privileges.search-user": "사용자 추가", | 	"privileges.search-user": "사용자 추가", | ||||||
| 	"privileges.no-users": "이 카테고리에는 사용자 별 권한이 없습니다.", | 	"privileges.no-users": "이 게시판에는 사용자 별 권한이 없습니다.", | ||||||
| 	"privileges.section-group": "그룹", | 	"privileges.section-group": "그룹", | ||||||
| 	"privileges.group-private": "이 그룹은 비공개입니다", | 	"privileges.group-private": "이 그룹은 비공개입니다", | ||||||
| 	"privileges.search-group": "그룹 추가", | 	"privileges.search-group": "그룹 추가", | ||||||
| 	"privileges.copy-to-children": "하위로 복사", | 	"privileges.copy-to-children": "하위로 복사", | ||||||
| 	"privileges.copy-from-category": "카테고리에서 복사", | 	"privileges.copy-from-category": "게시판에서 복사", | ||||||
| 	"privileges.inherit": "만약 <code>registered-users</code>그룹이 특정 권한을 허가 받는다면 모든 다른 그룹들 또한 따로 추가하거나 체크하지 않더라도 <strong>권한</strong>을 얻게 됩니다. 모든 유저가 <code>registered-users</code> 그룹의 멤버이기 때문에 다른 추가적인 그룹에 대한 권한은 따로 허가 받을 필요가 없습니다.", | 	"privileges.inherit": "만약 <code>registered-users</code>그룹이 특정 권한을 허가 받는다면 모든 다른 그룹들 또한 따로 추가하거나 체크하지 않더라도 <strong>암시적 권한</strong>을 얻게 됩니다. 모든 유저가 <code>registered-users</code> 그룹의 멤버이기 때문에 다른 추가적인 그룹에 대한 권한은 따로 허가 받을 필요가 없습니다.", | ||||||
|  |  | ||||||
| 	"analytics.back": "카테고리 리스트로 돌아가기", | 	"analytics.back": "게시판 목록으로 돌아가기", | ||||||
| 	"analytics.title": "\"%1\" 카테고리 분석", | 	"analytics.title": "\"%1\" 게시판 분석 결과", | ||||||
| 	"analytics.pageviews-hourly": "<strong>Figure 1</strong> – 이 카테고리에 대한 시간 당 페이지 뷰 수</small>", | 	"analytics.pageviews-hourly": "<strong>Figure 1</strong> – 이 게시판에 대한 시간 당 페이지 뷰 수</small>", | ||||||
| 	"analytics.pageviews-daily": "<strong>Figure 2</strong> – 이 카테고리에 대한 일일 페이지 뷰 수</small>", | 	"analytics.pageviews-daily": "<strong>Figure 2</strong> – 이 게시판에 대한 일일 페이지 뷰 수</small>", | ||||||
| 	"analytics.topics-daily": "<strong>Figure 3</strong> – 이 카테고리의 오늘의 주제들</small>", | 	"analytics.topics-daily": "<strong>Figure 3</strong> – 오늘 이 게시판에 생성된 게시물들</small>", | ||||||
| 	"analytics.posts-daily": "<strong>Figure 4</strong> – 이 카테고리의 오늘의 게시물</small>", | 	"analytics.posts-daily": "<strong>Figure 4</strong> – 오늘 이 게시판에 생성된 포스트들</small>", | ||||||
|  |  | ||||||
| 	"alert.created": "생성되었습니다", | 	"alert.created": "생성됨", | ||||||
| 	"alert.create-success": "카테고리 성공적으로 생성됨!", | 	"alert.create-success": "게시판 성공적으로 생성됨!", | ||||||
| 	"alert.none-active": "활동 중인 카테고리가 없습니다.", | 	"alert.none-active": "활성화된 게시판이 없습니다.", | ||||||
| 	"alert.create": "카테고리 생성", | 	"alert.create": "게시판 생성", | ||||||
| 	"alert.confirm-moderate": "<strong>이 사용자 그룹에 관리 권한을 부여하시겠습니까?</strong> 이 그룹은 공개 그룹이므로 모든 사용자가 자유롭게 가입 할 수 있습니다.", | 	"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.confirm-purge": "<p class=\"lead\">정말로 이 게시판을 \"%1\" 제거하시겠습니까?</p><h5><strong class=\"text-danger\">경고!</strong>이 게시판에 속한 모든 게시물과 포스트가 삭제됩니다!</h5><p class=\"help-block\">게시판을 제거하게 되면 모든 게시물과 포스트가 삭제되고 데이터베이스에서도 이 게시판이 삭제됩니다. 만약 일시적으로 게시판을 없애고 싶으시다면 삭제 대신 \"비활성화\"를 해주십시오.</p>", | ||||||
| 	"alert.purge-success": "카테고리 제거됨!", | 	"alert.purge-success": "게시판 제거됨!", | ||||||
| 	"alert.copy-success": "설정 복사됨!", | 	"alert.copy-success": "설정 복사됨!", | ||||||
| 	"alert.set-parent-category": "상위 카테고리 설정", | 	"alert.set-parent-category": "상위 게시판 설정", | ||||||
| 	"alert.updated": "업데이트 된 카테고리들", | 	"alert.updated": "업데이트 된 게시판", | ||||||
| 	"alert.updated-success": "카테고리 ID %1 성공적으로 업데이트 됨.", | 	"alert.updated-success": "게시판 ID %1 성공적으로 업데이트 됨.", | ||||||
| 	"alert.upload-image": "카테고리 이미지 업로드", | 	"alert.upload-image": "게시판 이미지 업로드", | ||||||
| 	"alert.find-user": "사용자 검색", | 	"alert.find-user": "사용자 검색", | ||||||
| 	"alert.user-search": "여기에 사용자를 검색하십시오...", | 	"alert.user-search": "여기서 사용자를 검색하십시오...", | ||||||
| 	"alert.find-group": "그룹 검색", | 	"alert.find-group": "그룹 검색", | ||||||
| 	"alert.group-search": "여기에 그룹을 검색하십시오..." | 	"alert.group-search": "여기서 그룹을 검색하십시오..." | ||||||
| } | } | ||||||
| @@ -6,9 +6,9 @@ | |||||||
| 	"list.email": "이메일", | 	"list.email": "이메일", | ||||||
| 	"list.ip": "IP 주소", | 	"list.ip": "IP 주소", | ||||||
| 	"list.time": "시간", | 	"list.time": "시간", | ||||||
| 	"list.username-spam": "Frequency: %1 Appears: %2 Confidence: %3", | 	"list.username-spam": "빈도: %1 출연 유무: %2 신뢰도: %3", | ||||||
| 	"list.email-spam": "Frequency: %1 Appears: %2", | 	"list.email-spam": "빈도: %1 출연 유무: %2", | ||||||
| 	"list.ip-spam": "Frequency: %1 Appears: %2", | 	"list.ip-spam": "빈도: %1 출연 유무: %2", | ||||||
|  |  | ||||||
| 	"invitations": "초대", | 	"invitations": "초대", | ||||||
| 	"invitations.description": "발송된 초대의 목록을 아래에서 보실 수 있습니다. ctrl-f을 이용해서 이메일이나 사용자명으로 목록을 검색하세요. <br><br>초대에 응답한 사용자들은 이메일 옆에 사용자명이 표시됩니다.", | 	"invitations.description": "발송된 초대의 목록을 아래에서 보실 수 있습니다. ctrl-f을 이용해서 이메일이나 사용자명으로 목록을 검색하세요. <br><br>초대에 응답한 사용자들은 이메일 옆에 사용자명이 표시됩니다.", | ||||||
|   | |||||||
| @@ -1,14 +1,14 @@ | |||||||
| { | { | ||||||
|     "results_matching": "\"%2\"와 일치하는 %1개의 결과를 찾았습니다 (검색시간: %3초)", |     "results_matching": "\"%2\"와 일치하는 %1 개의 결과를 찾았습니다 (검색시간: %3초)", | ||||||
|     "no-matches": "일치하는 결과가 없습니다.", |     "no-matches": "일치하는 결과가 없습니다.", | ||||||
|     "advanced-search": "고급 검색", |     "advanced-search": "고급 검색", | ||||||
|     "in": "안에서 검색", |     "in": "검색 기준", | ||||||
|     "titles": "제목", |     "titles": "제목", | ||||||
|     "titles-posts": "제목과 게시물", |     "titles-posts": "제목과 내용", | ||||||
|     "posted-by": "다음 사용자에 의해 작성됨", |     "posted-by": "작성자", | ||||||
|     "in-categories": "카테고리 내", |     "in-categories": "게시판 지정", | ||||||
|     "search-child-categories": "하위 카테고리를 검색", |     "search-child-categories": "하위 게시판도 검색", | ||||||
|     "has-tags": "태그 달린 게시물", |     "has-tags": "태그로 검색", | ||||||
|     "reply-count": "답변 수", |     "reply-count": "답변 수", | ||||||
|     "at-least": "적어도", |     "at-least": "적어도", | ||||||
|     "at-most": "최대", |     "at-most": "최대", | ||||||
| @@ -24,19 +24,19 @@ | |||||||
|     "three-months": "세 달", |     "three-months": "세 달", | ||||||
|     "six-months": "여섯 달", |     "six-months": "여섯 달", | ||||||
|     "one-year": "일 년", |     "one-year": "일 년", | ||||||
|     "sort-by": "정렬", |     "sort-by": "정렬 기준", | ||||||
|     "last-reply-time": "마지막으로 답글이 달린 시간", |     "last-reply-time": "마지막으로 답글이 달린 시간", | ||||||
|     "topic-title": "주제 제목", |     "topic-title": "게시물 제목", | ||||||
|     "number-of-replies": "답글 수", |     "number-of-replies": "답글 수", | ||||||
|     "number-of-views": "조회 수", |     "number-of-views": "조회 수", | ||||||
|     "topic-start-date": "주제가 게시된 날짜", |     "topic-start-date": "게시물이 작성된 날짜", | ||||||
|     "username": "사용자명", |     "username": "사용자명", | ||||||
|     "category": "카테고리", |     "category": "게시판", | ||||||
|     "descending": "내림차순", |     "descending": "내림차순", | ||||||
|     "ascending": "오름차순", |     "ascending": "오름차순", | ||||||
|     "save-preferences": "설정 저장", |     "save-preferences": "설정 저장", | ||||||
|     "clear-preferences": "설정 초기화", |     "clear-preferences": "설정 초기화", | ||||||
|     "search-preferences-saved": "검색 설정이 저장되었습니다.", |     "search-preferences-saved": "검색 설정이 저장되었습니다.", | ||||||
|     "search-preferences-cleared": "검색 설정이 초기화되었습니다.", |     "search-preferences-cleared": "검색 설정이 초기화되었습니다.", | ||||||
|     "show-results-as": "검색결과 정렬 - " |     "show-results-as": "검색결과 표시방법" | ||||||
| } | } | ||||||
| @@ -2,5 +2,5 @@ | |||||||
|     "success": "성공", |     "success": "성공", | ||||||
|     "topic-post": "성공적으로 게시물을 작성했습니다.", |     "topic-post": "성공적으로 게시물을 작성했습니다.", | ||||||
|     "authentication-successful": "인증에 성공했습니다.", |     "authentication-successful": "인증에 성공했습니다.", | ||||||
|     "settings-saved": "성공적으로 설정을 저장했습니다." |     "settings-saved": "설정이 저장되었습니다!" | ||||||
| } | } | ||||||
| @@ -1,7 +1,7 @@ | |||||||
| { | { | ||||||
|     "no_tag_topics": "이 태그에 해당하는 주제가 없습니다.", |     "no_tag_topics": "이 태그가 달린 게시물이 없습니다.", | ||||||
|     "tags": "태그", |     "tags": "태그 목록", | ||||||
|     "enter_tags_here": "%1 와 %2 글자 안에서 태그를 입력하세요.", |     "enter_tags_here": "%1 에서 %2 자 안에서 태그를 입력하세요.", | ||||||
|     "enter_tags_here_short": "태그 입력...", |     "enter_tags_here_short": "태그 입력...", | ||||||
|     "no_tags": "아직 아무런 태그도 없습니다." |     "no_tags": "아직 태그가 달리지 않았습니다." | ||||||
| } | } | ||||||
| @@ -1,58 +1,58 @@ | |||||||
| { | { | ||||||
|     "topic": "주제", |     "topic": "게시물", | ||||||
|     "topic_id": "주제 ID", |     "topic_id": "게시물 ID", | ||||||
|     "topic_id_placeholder": "여기에 주제 ID를 입력하세요.", |     "topic_id_placeholder": "여기에 게시물 ID를 입력하세요.", | ||||||
|     "no_topics_found": "주제를 찾을 수 없습니다.", |     "no_topics_found": "게시물을 찾을 수 없습니다!", | ||||||
|     "no_posts_found": "게시물을 찾을 수 없습니다.", |     "no_posts_found": "포스트를 찾을 수 없습니다!", | ||||||
|     "post_is_deleted": "이 게시물은 삭제됐습니다!", |     "post_is_deleted": "이 포스트는 삭제됐습니다!", | ||||||
|     "topic_is_deleted": "이 주제는 삭제됐습니다!", |     "topic_is_deleted": "이 포스트는 삭제됐습니다!", | ||||||
|     "profile": "프로필", |     "profile": "프로필", | ||||||
|     "posted_by": "%1님에 의해 작성됨", |     "posted_by": "%1 님에 의해 작성됨", | ||||||
|     "posted_by_guest": "게스트에 의해 작성됨", |     "posted_by_guest": "미가입 사용자에 의해 작성됨", | ||||||
|     "chat": "채팅", |     "chat": "채팅", | ||||||
|     "notify_me": "이 주제의 새 답글에 대한 알림 받기", |     "notify_me": "이 게시물의 새 답글에 대한 알림 받기", | ||||||
|     "quote": "인용", |     "quote": "인용", | ||||||
|     "reply": "답글", |     "reply": "답글", | ||||||
|     "replies_to_this_post": "%1개의 답글", |     "replies_to_this_post": "%1 개의 답글", | ||||||
|     "one_reply_to_this_post": "1개의 답글", |     "one_reply_to_this_post": "1 개의 답글", | ||||||
|     "last_reply_time": "마지막 답글", |     "last_reply_time": "마지막 답글", | ||||||
|     "reply-as-topic": "주제로 답글", |     "reply-as-topic": "게시물로 답글하기", | ||||||
|     "guest-login-reply": "답변을 위해 로그인하세요", |     "guest-login-reply": "답글을 작성하기 위해 로그인", | ||||||
|     "edit": "수정", |     "edit": "수정", | ||||||
|     "delete": "삭제", |     "delete": "삭제", | ||||||
|     "purge": "폐기", |     "purge": "폐기", | ||||||
|     "restore": "복원", |     "restore": "복원", | ||||||
|     "move": "이동", |     "move": "이동", | ||||||
|     "fork": "분리", |     "fork": "분리", | ||||||
|     "link": "링크", |     "link": "바로가기", | ||||||
|     "share": "공유", |     "share": "공유", | ||||||
|     "tools": "도구", |     "tools": "도구", | ||||||
|     "locked": "잠김", |     "locked": "잠긴 게시물", | ||||||
|     "pinned": "고정됨", |     "pinned": "고정된 게시물", | ||||||
|     "moved": "이동됨", |     "moved": "이동된 게시물", | ||||||
|     "bookmark_instructions": "이 스레드에서 읽은 마지막 게시글로 이동하시려면 여기를 클릭하세요.", |     "bookmark_instructions": "이 스레드에서 읽은 마지막 포스트로 이동하시려면 여기를 클릭 하세요.", | ||||||
|     "flag_title": "이 게시물을 신고", |     "flag_title": "이 포스트를 신고", | ||||||
|     "deleted_message": "이 주제는 삭제됐습니다. 주제 관리 권한이 있는 사용자만 볼 수 있습니다.", |     "deleted_message": "이 게시물은 삭제됐습니다. 게시물 관리 권한이 있는 사용자만 볼 수 있습니다.", | ||||||
|     "following_topic.message": "이제 이 주제에 새 답글이 달리면 알림을 받습니다.", |     "following_topic.message": "이제 이 게시물에 새 답글이 달리면 알림을 받습니다.", | ||||||
|     "not_following_topic.message": "이 주제를 아직 읽지 않은 주제 목록에서 볼 수 있지만, 누군가 이 주제에 포스트하기 전까지는 알림을 받지 않습니다.", |     "not_following_topic.message": "이 게시물을 아직 읽지 않은 게시물 목록에서 볼 수 있지만, 이 주제에 달린 포스트에 대해서는 알림을 받지 않습니다.", | ||||||
|     "ignoring_topic.message": "더 이상 이 주제는 읽지 않은 주제 목록에서 보이지 않습니다. 누군가 나를 언급하거나 내 포스트가 upvote되면 알림을 받습니다.", |     "ignoring_topic.message": "더 이상 이 게시물은 읽지 않은 게시물 목록에서 보이지 않습니다. 누군가 나를 언급하거나 내 포스트가 추천 받으면 알림을 받습니다.", | ||||||
|     "login_to_subscribe": "이 주제를 구독하기 위해서는 로그인해야 합니다.", |     "login_to_subscribe": "이 게시물을 관심 목록에 추가하기 위해서는 로그인해야 합니다.", | ||||||
|     "markAsUnreadForAll.success": "모든 사용자에 대해 읽지 않음으로 표시했습니다.", |     "markAsUnreadForAll.success": "모든 사용자에 대해 읽지 않음으로 표시했습니다.", | ||||||
|     "mark_unread": "읽지 않음으로 표시", |     "mark_unread": "읽지 않음으로 표시", | ||||||
|     "mark_unread.success": "성공적으로 읽지 않음으로 표시했습니다.", |     "mark_unread.success": "게시물을 읽지 않음으로 표시했습니다", | ||||||
|     "watch": "관심 주제 설정", |     "watch": "관심 목록에 추가", | ||||||
|     "unwatch": "관심 주제 해제", |     "unwatch": "관심 목록에서 제거", | ||||||
|     "watch.title": "이 주제의 새 답글 알리기", |     "watch.title": "이 게시물의 새 답글에 대해 알림 받기", | ||||||
|     "unwatch.title": "이 주제에 대한 관심을 해제합니다.", |     "unwatch.title": "이 게시물을 관심 목록에서 제거합니다.", | ||||||
|     "share_this_post": "이 게시물 공유", |     "share_this_post": "이 포스트를 공유", | ||||||
|     "watching": "관심 있음", |     "watching": "관심 있음", | ||||||
|     "not-watching": "관심 없음", |     "not-watching": "관심 없음", | ||||||
|     "ignoring": "무시하기", |     "ignoring": "무시하는 중", | ||||||
|     "watching.description": "새로운 답글에 대한 알림 받기. <br/> 읽지 않음에서 주제 보여주기.", |     "watching.description": "새로운 답글에 대한 알림 받기. <br/> 읽지 않은 게시물에 보여주기.", | ||||||
|     "not-watching.description": "새로운 답글에 대해 알림 받지 않기. 해당 카테고리를 팔로우 중이라면 \"읽지않은 토픽\" 에서 보여주기.", |     "not-watching.description": "새로운 답글에 대해 알림 받지 않기. 해당 게시판을 팔로우 중이라면 \"읽지않은 게시물\" 에서 보여주기.", | ||||||
|     "ignoring.description": "새로운 답글에 대한 알림 받지 않기. \"읽지않은 토픽\"에서 보여주지 않기.", |     "ignoring.description": "새로운 답글에 대한 알림 받지 않기. \"읽지않은 게시물\"에서 보여주지 않기.", | ||||||
|     "thread_tools.title": "주제 관리", |     "thread_tools.title": "게시물 관리", | ||||||
|     "thread_tools.markAsUnreadForAll": "모두 읽지 않음으로 표시", |     "thread_tools.markAsUnreadForAll": "모든 사용자에게 읽지 않음으로 표시", | ||||||
|     "thread_tools.pin": "상단 고정", |     "thread_tools.pin": "상단 고정", | ||||||
|     "thread_tools.unpin": "상단 고정 해제", |     "thread_tools.unpin": "상단 고정 해제", | ||||||
|     "thread_tools.lock": "잠금", |     "thread_tools.lock": "잠금", | ||||||
| @@ -61,60 +61,60 @@ | |||||||
|     "thread_tools.move_all": "모두 이동", |     "thread_tools.move_all": "모두 이동", | ||||||
|     "thread_tools.fork": "주제 분리", |     "thread_tools.fork": "주제 분리", | ||||||
|     "thread_tools.delete": "삭제", |     "thread_tools.delete": "삭제", | ||||||
|     "thread_tools.delete-posts": "게시물 삭제", |     "thread_tools.delete-posts": "포스트 삭제", | ||||||
|     "thread_tools.delete_confirm": "이 주제를 삭제하시겠습니까?", |     "thread_tools.delete_confirm": "이 게시물을 삭제 하시겠습니까?", | ||||||
|     "thread_tools.restore": "복원", |     "thread_tools.restore": "게시물 복원", | ||||||
|     "thread_tools.restore_confirm": "이 주제를 복원하시겠습니까?", |     "thread_tools.restore_confirm": "이 게시물을 복원 하시겠습니까?", | ||||||
|     "thread_tools.purge": "주제 폐기", |     "thread_tools.purge": "게시물 폐기", | ||||||
|     "thread_tools.purge_confirm": "이 주제를 폐기하시겠습니까?", |     "thread_tools.purge_confirm": "이 게시물을 폐기 하시겠습니까?", | ||||||
|     "topic_move_success": "성공적으로 이 주제를 %1로 이동했습니다.", |     "topic_move_success": "성공적으로 이 게시물을 %1로 이동했습니다.", | ||||||
|     "post_delete_confirm": "이 게시물을 삭제하시겠습니까?", |     "post_delete_confirm": "이 포스트를 삭제 하시겠습니까?", | ||||||
|     "post_restore_confirm": "이 게시물을 복원하시겠습니까?", |     "post_restore_confirm": "이 포스트를 복원 하시겠습니까?", | ||||||
|     "post_purge_confirm": "이 게시물을 폐기하시겠습니까?", |     "post_purge_confirm": "이 포스트를 폐기 하시겠습니까?", | ||||||
|     "load_categories": "카테고리 로딩 중", |     "load_categories": "게시판들을 읽어오는 중입니다.", | ||||||
|     "disabled_categories_note": "비활성화된 카테고리는 회색으로 표시됩니다.", |     "disabled_categories_note": "비활성화된 게시판은 회색으로 표시됩니다.", | ||||||
|     "confirm_move": "이동", |     "confirm_move": "이동", | ||||||
|     "confirm_fork": "분리", |     "confirm_fork": "분리", | ||||||
|     "bookmark": "즐겨찾기", |     "bookmark": "즐겨찾기", | ||||||
|     "bookmarks": "즐겨찾기 목록", |     "bookmarks": "즐겨찾기 목록", | ||||||
|     "bookmarks.has_no_bookmarks": "즐겨찾기에 추가한 게시글이 없습니다.", |     "bookmarks.has_no_bookmarks": "즐겨찾기에 추가한 포스트가 없습니다.", | ||||||
|     "loading_more_posts": "게시물을 로딩 중", |     "loading_more_posts": "포스트를 읽어오는 중입니다.", | ||||||
|     "move_topic": "주제 이동", |     "move_topic": "게시물 이동", | ||||||
|     "move_topics": "주제 이동", |     "move_topics": "게시물 이동", | ||||||
|     "move_post": "게시물 이동", |     "move_post": "포스트 이동", | ||||||
|     "post_moved": "게시물이 이동되었습니다.", |     "post_moved": "포스트가 이동되었습니다.", | ||||||
|     "fork_topic": "주제 분리", |     "fork_topic": "게시물 분리", | ||||||
|     "topic_will_be_moved_to": "이 주제를 지정한 카테고리로 이동합니다.", |     "topic_will_be_moved_to": "이 게시물이 지정한 게시판으로 이동합니다.", | ||||||
|     "fork_topic_instruction": "분리할 게시물을 선택하세요.", |     "fork_topic_instruction": "분리할 포스트를 선택하세요.", | ||||||
|     "fork_no_pids": "게시물이 선택되지 않았습니다.", |     "fork_no_pids": "선택된 포스트가 없습니다.", | ||||||
|     "fork_pid_count": "%1 개의 게시물(들)이 선택되었습니다", |     "fork_pid_count": "%1 개의 포스트(들)이 선택되었습니다", | ||||||
|     "fork_success": "주제가 분리되었습니다! 분리된 주제를 보려면 여기를 클릭하세요.", |     "fork_success": "게시물이 분리되었습니다! 분리된 게시물을 보려면 여기를 클릭 하세요.", | ||||||
|     "delete_posts_instruction": "삭제할 게시물을 선택하세요.", |     "delete_posts_instruction": "삭제할 포스트를 선택하세요.", | ||||||
|     "composer.title_placeholder": "여기에 제목을 입력하세요.", |     "composer.title_placeholder": "게시물 제목을 입력하세요.", | ||||||
|     "composer.handle_placeholder": "이름", |     "composer.handle_placeholder": "이름", | ||||||
|     "composer.discard": "취소", |     "composer.discard": "취소", | ||||||
|     "composer.submit": "등록", |     "composer.submit": "등록", | ||||||
|     "composer.replying_to": "'%1'에 대한 답글", |     "composer.replying_to": "'%1'에 대한 답글", | ||||||
|     "composer.new_topic": "새 주제 생성", |     "composer.new_topic": "새 주제 생성", | ||||||
|     "composer.uploading": "업로드 중", |     "composer.uploading": "업로드 중", | ||||||
|     "composer.thumb_url_label": "섬네일 URL", |     "composer.thumb_url_label": "섬네일 URL을 붙여넣으세요", | ||||||
|     "composer.thumb_title": "이 주제에 섬네일 추가", |     "composer.thumb_title": "이 게시물에 섬네일 추가", | ||||||
|     "composer.thumb_url_placeholder": "http://example.com/thumb.png", |     "composer.thumb_url_placeholder": "http://example.com/thumb.png", | ||||||
|     "composer.thumb_file_label": "혹은 파일 업로드", |     "composer.thumb_file_label": "혹은 파일을 업로드 해주세요", | ||||||
|     "composer.thumb_remove": "섬네일 삭제", |     "composer.thumb_remove": "섬네일 삭제", | ||||||
|     "composer.drag_and_drop_images": "이미지를 여기에 드래그&드롭하세요.", |     "composer.drag_and_drop_images": "이미지를 여기에 드래그&드롭하세요.", | ||||||
|     "more_users_and_guests": "%1명 이상의 회원과 %2명의 익명 사용자", |     "more_users_and_guests": "%1명 이상의 회원과 %2명의 익명 사용자", | ||||||
|     "more_users": "%1명 이상의 회원", |     "more_users": "%1명 이상의 회원", | ||||||
|     "more_guests": "%1명 이상의 익명 사용자", |     "more_guests": "%1명 이상의 익명 사용자", | ||||||
|     "users_and_others": "%1님 외 %2명", |     "users_and_others": "%1님 외 %2명", | ||||||
|     "sort_by": "정렬", |     "sort_by": "정렬 기준", | ||||||
|     "oldest_to_newest": "오래된 순으로 정렬", |     "oldest_to_newest": "오래된 순으로 정렬", | ||||||
|     "newest_to_oldest": "최신 순으로 정렬", |     "newest_to_oldest": "최신 순으로 정렬", | ||||||
|     "most_votes": "추천수 순으로 정렬", |     "most_votes": "추천수 순으로 정렬", | ||||||
|     "most_posts": "포스트 많은 순으로 정렬", |     "most_posts": "포스트 많은 순으로 정렬", | ||||||
|     "stale.title": "새로 주제를 생성하시겠습니까?", |     "stale.title": "새로운 게시물을 생성 하시겠습니까?", | ||||||
|     "stale.warning": "현재 답글을 작성중인 주제가 꽤 오래되었습니다. 새로 주제를 생성하시고 이글을 인용하시겠습니까?", |     "stale.warning": "현재 답글을 작성중인 게시물은 오래전에 작성 되었습니다. 새로 게시물을 생성하시고 이 게시물을 인용 하시겠습니까?", | ||||||
|     "stale.create": "새로운 주제를 작성", |     "stale.create": "새로운 게시물 작성", | ||||||
|     "stale.reply_anyway": "아무튼 이 주제에 답변해주세요.", |     "stale.reply_anyway": "이 게시물에 답글 작성", | ||||||
|     "link_back": "답글: [%1](%2)" |     "link_back": "답글: [%1](%2)" | ||||||
| } | } | ||||||
| @@ -1,13 +1,13 @@ | |||||||
| { | { | ||||||
|     "title": "읽지 않음", |     "title": "읽지 않음", | ||||||
|     "no_unread_topics": "읽지 않은 주제가 없습니다.", |     "no_unread_topics": "읽지 않은 게시물이 없습니다.", | ||||||
|     "load_more": "더 보기", |     "load_more": "더 보기", | ||||||
|     "mark_as_read": "읽음으로 표시", |     "mark_as_read": "읽음으로 표시", | ||||||
|     "selected": "선택됨", |     "selected": "선택된 게시물", | ||||||
|     "all": "전체", |     "all": "전체", | ||||||
|     "all_categories": "모든 카테고리", |     "all_categories": "모든 게시판", | ||||||
|     "topics_marked_as_read.success": "토픽들을 읽음으로 표시했습니다.", |     "topics_marked_as_read.success": "게시물들을 읽음으로 표시했습니다.", | ||||||
|     "all-topics": "모든 주제", |     "all-topics": "모든 게시물", | ||||||
|     "new-topics": "새 주제", |     "new-topics": "새 게시물", | ||||||
|     "watched-topics": "관심 주제" |     "watched-topics": "관심있는 게시물" | ||||||
| } | } | ||||||
| @@ -1,9 +1,9 @@ | |||||||
| { | { | ||||||
|     "banned": "차단됨", |     "banned": "차단된 계정", | ||||||
|     "offline": "오프라인", |     "offline": "오프라인", | ||||||
|     "username": "사용자 이름", |     "username": "사용자 이름", | ||||||
|     "joindate": "가입일", |     "joindate": "가입일", | ||||||
|     "postcount": "게시물 수", |     "postcount": "포스트 수", | ||||||
|     "email": "이메일", |     "email": "이메일", | ||||||
|     "confirm_email": "이메일 확인", |     "confirm_email": "이메일 확인", | ||||||
|     "account_info": "계정 정보", |     "account_info": "계정 정보", | ||||||
| @@ -11,33 +11,33 @@ | |||||||
|     "ban_account_confirm": "이 사용자를 차단하시겠습니까?", |     "ban_account_confirm": "이 사용자를 차단하시겠습니까?", | ||||||
|     "unban_account": "차단 해제", |     "unban_account": "차단 해제", | ||||||
|     "delete_account": "계정 삭제", |     "delete_account": "계정 삭제", | ||||||
|     "delete_account_confirm": "정말 계정을 삭제하시겠습니까? <br /><strong>이 동작은 되돌릴 수 없으며 삭제된 데이터도 복구할 수 없습니다.</strong><br /><br />계정 삭제를 원하면 사용자 이름을 입력하세요.", |     "delete_account_confirm": "정말 계정을 삭제 하시겠습니까? <br /><strong>이 동작은 되돌릴 수 없으며 삭제된 데이터도 복구할 수 없습니다.</strong><br /><br />계정 삭제를 원하면 사용자 이름을 입력하세요.", | ||||||
|     "delete_this_account_confirm": "정말 계정을 삭제하시겠습니까? <br /><strong>이 행동은 되돌릴 수 없으며 삭제된 사용자 정보도 복구할 수 없습니다.</strong><br /><br />", |     "delete_this_account_confirm": "정말 계정을 삭제 하시겠습니까? <br /><strong>이 행동은 되돌릴 수 없으며 삭제된 사용자 정보도 복구할 수 없습니다.</strong><br /><br />", | ||||||
|     "account-deleted": "삭제된 계정", |     "account-deleted": "계정이 삭제 되었습니다", | ||||||
|     "fullname": "이름", |     "fullname": "이름", | ||||||
|     "website": "웹 사이트", |     "website": "웹 사이트", | ||||||
|     "location": "위치", |     "location": "위치", | ||||||
|     "age": "나이", |     "age": "나이", | ||||||
|     "joined": "가입됨", |     "joined": "가입됨", | ||||||
|     "lastonline": "마지막 로그인", |     "lastonline": "최근 온라인 시점", | ||||||
|     "profile": "프로필", |     "profile": "프로필", | ||||||
|     "profile_views": "프로필 조회 수", |     "profile_views": "프로필 조회 수", | ||||||
|     "reputation": "평판", |     "reputation": "등급", | ||||||
|     "bookmarks": "즐겨찾기", |     "bookmarks": "즐겨찾기", | ||||||
|     "watched": "읽음", |     "watched": "관심있는 게시물", | ||||||
|     "followers": "팔로워", |     "followers": "팔로워", | ||||||
|     "following": "팔로우하는 중", |     "following": "팔로잉", | ||||||
|     "aboutme": "자기 소개", |     "aboutme": "자기소개", | ||||||
|     "signature": "서명", |     "signature": "서명", | ||||||
|     "birthday": "생일", |     "birthday": "생일", | ||||||
|     "chat": "채팅", |     "chat": "채팅", | ||||||
|     "chat_with": "%1과/와 채팅 계속", |     "chat_with": "%1과/와 채팅 계속", | ||||||
|     "new_chat_with": "%1과/와 새로운 채팅", |     "new_chat_with": "%1과/와 새로운 채팅", | ||||||
|     "flag-profile": "프로필 플래그", |     "flag-profile": "프로필 신고", | ||||||
|     "follow": "팔로우", |     "follow": "팔로우", | ||||||
|     "unfollow": "팔로우 취소", |     "unfollow": "팔로우 취소", | ||||||
|     "more": "더 보기", |     "more": "더 보기", | ||||||
|     "profile_update_success": "성공적으로 프로필을 저장했습니다!", |     "profile_update_success": "프로필을 성공적으로 저장했습니다.", | ||||||
|     "change_picture": "사진 변경", |     "change_picture": "사진 변경", | ||||||
|     "change_username": "사용자명 변경", |     "change_username": "사용자명 변경", | ||||||
|     "change_email": "이메일 변경", |     "change_email": "이메일 변경", | ||||||
| @@ -49,13 +49,13 @@ | |||||||
|     "upload_new_picture_from_url": "URL을 통해 새 사진 업로드", |     "upload_new_picture_from_url": "URL을 통해 새 사진 업로드", | ||||||
|     "current_password": "현재 비밀번호", |     "current_password": "현재 비밀번호", | ||||||
|     "change_password": "비밀번호 변경", |     "change_password": "비밀번호 변경", | ||||||
|     "change_password_error": "올바르지 않은 비밀번호", |     "change_password_error": "올바르지 않은 비밀번호입니다!", | ||||||
|     "change_password_error_wrong_current": "현재 비밀번호가 일치하지 않습니다!", |     "change_password_error_wrong_current": "현재 비밀번호가 일치하지 않습니다!", | ||||||
|     "change_password_error_length": "비밀번호가 너무 짧습니다.", |     "change_password_error_length": "비밀번호가 너무 짧습니다!", | ||||||
|     "change_password_error_match": "재입력한 비밀번호가 새 비밀번호와 일치하지 않습니다!", |     "change_password_error_match": "재입력한 비밀번호가 새 비밀번호와 일치하지 않습니다!", | ||||||
|     "change_password_error_privileges": "비밀번호를 바꿀 권한이 없습니다.", |     "change_password_error_privileges": "비밀번호를 바꿀 권한이 없습니다.", | ||||||
|     "change_password_success": "비밀번호를 변경했습니다.", |     "change_password_success": "비밀번호를 변경했습니다.", | ||||||
|     "confirm_password": "비밀번호 재입력", |     "confirm_password": "비밀번호 확인", | ||||||
|     "password": "비밀번호", |     "password": "비밀번호", | ||||||
|     "username_taken_workaround": "새 사용자 이름이 이미 존재하여 <strong>%1</strong>로 저장되었습니다.", |     "username_taken_workaround": "새 사용자 이름이 이미 존재하여 <strong>%1</strong>로 저장되었습니다.", | ||||||
|     "password_same_as_username": "비밀번호가 사용자명과 동일합니다. 다른 비밀번호를 입력하세요.", |     "password_same_as_username": "비밀번호가 사용자명과 동일합니다. 다른 비밀번호를 입력하세요.", | ||||||
| @@ -63,7 +63,7 @@ | |||||||
|     "weak_password": "보안이 취약한 비밀번호입니다.", |     "weak_password": "보안이 취약한 비밀번호입니다.", | ||||||
|     "upload_picture": "사진 업로드", |     "upload_picture": "사진 업로드", | ||||||
|     "upload_a_picture": "사진 업로드", |     "upload_a_picture": "사진 업로드", | ||||||
|     "remove_uploaded_picture": "등록된 사진을 삭제", |     "remove_uploaded_picture": "업로드한 사진을 삭제", | ||||||
|     "upload_cover_picture": "커버 사진 업로드", |     "upload_cover_picture": "커버 사진 업로드", | ||||||
|     "remove_cover_picture_confirm": "커버 사진을 제거하시겠습니까?", |     "remove_cover_picture_confirm": "커버 사진을 제거하시겠습니까?", | ||||||
|     "crop_picture": "사진 잘라내기", |     "crop_picture": "사진 잘라내기", | ||||||
| @@ -72,63 +72,63 @@ | |||||||
|     "show_email": "내 이메일 보기", |     "show_email": "내 이메일 보기", | ||||||
|     "show_fullname": "내 이름 보기", |     "show_fullname": "내 이름 보기", | ||||||
|     "restrict_chats": "내가 팔로우하는 이용자들로부터만 대화를 허용", |     "restrict_chats": "내가 팔로우하는 이용자들로부터만 대화를 허용", | ||||||
|     "digest_label": "포럼 이메일 수신", |     "digest_label": "포럼 이메일 구독", | ||||||
|     "digest_description": "지정된 주기로 이 포럼의 이메일(새 알림과 토픽)을 수신", |     "digest_description": "주기적으로 포럼 이메일(새 알림과 게시물)을 구독", | ||||||
|     "digest_off": "해제", |     "digest_off": "해제", | ||||||
|     "digest_daily": "매일", |     "digest_daily": "매일", | ||||||
|     "digest_weekly": "매주", |     "digest_weekly": "매주", | ||||||
|     "digest_monthly": "매월", |     "digest_monthly": "매월", | ||||||
|     "send_chat_notifications": "오프라인일 때 채팅 메시지가 도착하면 알림 메일을 보냅니다.", |     "send_chat_notifications": "오프라인일 때 채팅 메시지가 도착하면 알림 메일을 보냅니다.", | ||||||
|     "send_post_notifications": "내가 구독한 주제에 답글이 달리면 메일 보내기.", |     "send_post_notifications": "내가 관심있는 게시물에 답글이 달리면 메일을 보냅니다.", | ||||||
|     "settings-require-reload": "일부 설정 변경은 리로딩이 필요합니다. 여기를 눌러서 페이지를 리로딩 해주세요.", |     "settings-require-reload": "일부 설정 변경은 새로고침이 필요합니다. 여기를 눌러서 페이지를 새로고침 해주세요.", | ||||||
|     "has_no_follower": "이 사용자는 팔로워가 없습니다 :(", |     "has_no_follower": "이 사용자는 팔로워가 없습니다 :(", | ||||||
|     "follows_no_one": "이 사용자는 아무도 팔로우하지 않습니다 :(", |     "follows_no_one": "이 사용자는 아무도 팔로우하고 있지 않습니다 :(", | ||||||
|     "has_no_posts": "이 사용자가 포스트한 게시물이 없습니다.", |     "has_no_posts": "이 사용자가 작성한 포스트가 없습니다.", | ||||||
|     "has_no_topics": "이 사용자가 포스트한 주제가 없습니다.", |     "has_no_topics": "이 사용자가 작성한 게시물이 없습니다.", | ||||||
|     "has_no_watched_topics": "이 사용자가 관심 목록에 추가한 주제가 없습니다.", |     "has_no_watched_topics": "이 사용자가 관심 목록에 추가한 게시물이 없습니다.", | ||||||
|     "has_no_upvoted_posts": "이 사용자가 upvote한 게시물이 없습니다.", |     "has_no_upvoted_posts": "이 사용자가 추천한 포스트가 없습니다.", | ||||||
|     "has_no_downvoted_posts": "이 사용자가 downvote한 게시물이 없습니다.", |     "has_no_downvoted_posts": "이 사용자가 비추천한 포스트가 없습니다.", | ||||||
|     "has_no_voted_posts": "이 사용자가 vote한 게시물이 없습니다.", |     "has_no_voted_posts": "평가받은 게시물이 없습니다.", | ||||||
|     "email_hidden": "이메일 비공개", |     "email_hidden": "이메일 비공개", | ||||||
|     "hidden": "비공개", |     "hidden": "비공개", | ||||||
|     "paginate_description": "주제와 게시물을 무한 스크롤 대신 페이지뷰로 보기", |     "paginate_description": "주제와 게시물을 페이지로 정리", | ||||||
|     "topics_per_page": "페이지 당 주제 수", |     "topics_per_page": "페이지 당 게시물 수", | ||||||
|     "posts_per_page": "페이지 당 게시물 수", |     "posts_per_page": "페이지 당 포스트 수", | ||||||
|     "notification_sounds": "알림 수신시 소리로 알려주기", |     "notification_sounds": "알림 수신시 소리로 알려주기", | ||||||
|     "notifications_and_sounds": "알림과 알림음", |     "notifications_and_sounds": "알림 / 알림음 설정", | ||||||
|     "incoming-message-sound": "수신 메시지 알림음", |     "incoming-message-sound": "수신 메시지 알림음", | ||||||
|     "outgoing-message-sound": "발신 메시지 알림음", |     "outgoing-message-sound": "발신 메시지 알림음", | ||||||
|     "notification-sound": "알림음", |     "notification-sound": "알림음", | ||||||
|     "no-sound": "묵음", |     "no-sound": "음소거", | ||||||
|     "browsing": "브라우징 세팅", |     "browsing": "브라우징 설정", | ||||||
|     "open_links_in_new_tab": "외부 링크를 새로운 탭에서 열람", |     "open_links_in_new_tab": "외부 링크를 새로운 탭에서 열람", | ||||||
|     "enable_topic_searching": "주제 내 검색 허용", |     "enable_topic_searching": "게시물 내 검색 허용", | ||||||
|     "topic_search_help": "만약 활성화된다면, 브라우저의 기본 검색 기능은 무효화되고 주제 내 검색을 통해 화면에 보여지는 것 뿐만 아니라 주제 전체의 내용을 검색할 수 있습니다.", |     "topic_search_help": "만약 활성화된다면, 브라우저의 기본 검색 기능은 무효화되고 게시물 내 검색을 통해 화면에 보여지는 것 뿐만 아니라 게시물 전체의 내용을 검색할 수 있습니다.", | ||||||
|     "delay_image_loading": "이미지 로딩 지연", |     "delay_image_loading": "이미지 로딩 지연", | ||||||
|     "image_load_delay_help": "만약 활성화된다면, 이미지 위치로 스크롤을 움직이기 전까지 이미지가 로드 되지 않습니다.", |     "image_load_delay_help": "만약 활성화된다면, 이미지 위치로 스크롤을 움직이기 전까지 이미지가 로드 되지 않습니다.", | ||||||
|     "scroll_to_my_post": "답글 게시 후 새 포스트 보여주기", |     "scroll_to_my_post": "답글 게시 후 새 포스트 보여주기", | ||||||
|     "follow_topics_you_reply_to": "내가 답글을 단 토픽을 관심 주제로 설정", |     "follow_topics_you_reply_to": "내가 답글을 단 게시물을 관심 목록에 추가", | ||||||
|     "follow_topics_you_create": "내가 게시한 토픽을 관심 토픽으로 설정", |     "follow_topics_you_create": "내가 작성한 게시물을 관심 목록에 추가", | ||||||
|     "grouptitle": "그룹 이름", |     "grouptitle": "그룹 이름", | ||||||
|     "no-group-title": "그룹 이름이 없습니다.", |     "no-group-title": "그룹 이름이 없습니다.", | ||||||
|     "select-skin": "스킨 선택", |     "select-skin": "스킨 선택", | ||||||
|     "select-homepage": "홈페이지 선택", |     "select-homepage": "홈페이지 선택", | ||||||
|     "homepage": "홈페이지", |     "homepage": "홈페이지", | ||||||
|     "homepage_description": "포럼 홈페이지로 사용할 페이지를 선택하거나 'None'으로 설정하여 기본 홈페이지를 사용합니다.", |     "homepage_description": "포럼 홈페이지로 사용할 페이지를 선택하거나 'None'으로 설정하여 기본 홈페이지를 사용합니다.", | ||||||
|     "custom_route": "홈페이지 수동 경로", |     "custom_route": "사용자 지정 홈페이지 라우트", | ||||||
|     "custom_route_help": "라우팅 이름을 앞쪽 '/' 없이 입력해주세요 (예: \"최근 목록\", \"인기 게시물\")", |     "custom_route_help": "라우트 이름을 앞쪽 '/' 없이 입력해주세요 (예: \"/recent\" => \"recent\", \"/popular\" => \"popular\")", | ||||||
|     "sso.title": "통합 인증 서비스", |     "sso.title": "통합 인증 서비스", | ||||||
|     "sso.associated": "와/과 연관된", |     "sso.associated": "와/과 연동된", | ||||||
|     "sso.not-associated": "이 곳을 클릭하여 연관지으세요.", |     "sso.not-associated": "이 곳을 클릭하여 연동시키세요.", | ||||||
|     "info.latest-flags": "최신 플래그", |     "info.latest-flags": "최근에 들어온 신고", | ||||||
|     "info.no-flags": "플래그된 포스트가 없습니다.", |     "info.no-flags": "신고된 포스트가 없습니다.", | ||||||
|     "info.ban-history": "최근 차단 히스토리", |     "info.ban-history": "최근 차단 히스토리", | ||||||
|     "info.no-ban-history": "이 사용자는 차단된 적이 없습니다.", |     "info.no-ban-history": "이 사용자는 차단된 적이 없습니다.", | ||||||
|     "info.banned-until": "%1까지 차단됨", |     "info.banned-until": "%1까지 차단됨", | ||||||
|     "info.banned-permanently": "영구 차단", |     "info.banned-permanently": "영구 차단", | ||||||
|     "info.banned-reason-label": "이유", |     "info.banned-reason-label": "사유", | ||||||
|     "info.banned-no-reason": "제공된 이유가 없습니다.", |     "info.banned-no-reason": "제공된 사유가 없습니다.", | ||||||
|     "info.username-history": "사용자 이름 히스토리", |     "info.username-history": "사용자명 변경 히스토리", | ||||||
|     "info.email-history": "이메일 히스토리", |     "info.email-history": "이메일 히스토리", | ||||||
|     "info.moderation-note": "관리자 노트", |     "info.moderation-note": "관리자 노트", | ||||||
|     "info.moderation-note.success": "관리자 노트 저장완료", |     "info.moderation-note.success": "관리자 노트 저장완료", | ||||||
|   | |||||||
| @@ -1,21 +1,21 @@ | |||||||
| { | { | ||||||
|     "latest_users": "최근 사용자", |     "latest_users": "최근 가입 순", | ||||||
|     "top_posters": "가장 많은 게시물을 올린 사용자", |     "top_posters": "작성 게시물 순", | ||||||
|     "most_reputation": "가장 높은 평판", |     "most_reputation": "사용자 등급 순", | ||||||
|     "most_flags": "가장 많은 플래그", |     "most_flags": "신고 순", | ||||||
|     "search": "검색", |     "search": "검색", | ||||||
|     "enter_username": "검색할 사용자 이름을 입력하세요.", |     "enter_username": "검색할 사용자명을 입력하세요.", | ||||||
|     "load_more": "더 보기", |     "load_more": "더 보기", | ||||||
|     "users-found-search-took": "%1명의 사용자를 찾았습니다. 검색 소요 시간 %2 초", |     "users-found-search-took": "%1명의 사용자를 찾았습니다. 검색 소요 시간 %2초", | ||||||
|     "filter-by": "에 의해 분류", |     "filter-by": "필터 기준", | ||||||
|     "online-only": "온라인 전용", |     "online-only": "접속한 사용자", | ||||||
|     "invite": "초대", |     "invite": "초대", | ||||||
|     "invitation-email-sent": "%1님에게 초대 메일을 보냈습니다.", |     "invitation-email-sent": "%1님에게 초대 메일을 보냈습니다.", | ||||||
|     "user_list": "사용자 목록", |     "user_list": "사용자 목록", | ||||||
|     "recent_topics": "최근 주제", |     "recent_topics": "최근 게시물", | ||||||
|     "popular_topics": "인기 주제", |     "popular_topics": "인기 게시물", | ||||||
|     "unread_topics": "읽지 않은 주제", |     "unread_topics": "읽지 않은 게시물", | ||||||
|     "categories": "카테고리", |     "categories": "게시판 목록", | ||||||
|     "tags": "태그", |     "tags": "태그", | ||||||
|     "no-users-found": "사용자를 찾을 수 없습니다!" |     "no-users-found": "사용자를 찾을 수 없습니다!" | ||||||
| } | } | ||||||
| @@ -17,7 +17,7 @@ | |||||||
| 	"mongo.file-size": "Kích thước tập tin", | 	"mongo.file-size": "Kích thước tập tin", | ||||||
| 	"mongo.resident-memory": "Resident Memory", | 	"mongo.resident-memory": "Resident Memory", | ||||||
| 	"mongo.virtual-memory": "Bộ nhớ ảo", | 	"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", | 	"mongo.raw-info": "Thông tin MongoDB", | ||||||
|  |  | ||||||
| 	"redis": "Redis", | 	"redis": "Redis", | ||||||
|   | |||||||
| @@ -33,6 +33,8 @@ define('forum/account/edit/username', ['forum/account/header'], function (header | |||||||
| 				var userslug = utils.slugify(userData.username); | 				var userslug = utils.slugify(userData.username); | ||||||
| 				if (userData.username && userslug && parseInt(userData.uid, 10) === parseInt(app.user.uid, 10)) { | 				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"]').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/username"]').text(userData.username); | ||||||
| 					$('[component="header/usericon"]').css('background-color', data['icon:bgColor']).text(data['icon:text']); | 					$('[component="header/usericon"]').css('background-color', data['icon:bgColor']).text(data['icon:text']); | ||||||
| 				} | 				} | ||||||
|   | |||||||
| @@ -52,7 +52,18 @@ module.exports = function (Categories) { | |||||||
| 			function (data, next) { | 			function (data, next) { | ||||||
| 				category = data.category; | 				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.series([ | ||||||
| 					async.apply(db.setObject, 'category:' + category.cid, category), | 					async.apply(db.setObject, 'category:' + category.cid, category), | ||||||
|   | |||||||
| @@ -217,13 +217,10 @@ uploadsController.uploadFile = function (uid, uploadedFile, callback) { | |||||||
| }; | }; | ||||||
|  |  | ||||||
| function saveFileToLocal(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 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([ | 	async.waterfall([ | ||||||
| 		function (next) { | 		function (next) { | ||||||
|   | |||||||
							
								
								
									
										23
									
								
								src/flags.js
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								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); | 	], callback); | ||||||
| }; | }; | ||||||
|  |  | ||||||
| @@ -181,6 +188,13 @@ Flags.list = function (filters, uid, callback) { | |||||||
| 				}); | 				}); | ||||||
| 			}, next); | 			}, next); | ||||||
| 		}, | 		}, | ||||||
|  | 		function (flags, next) { | ||||||
|  | 			plugins.fireHook('filter:flags.list', { | ||||||
|  | 				flags: flags, | ||||||
|  | 			}, function (err, data) { | ||||||
|  | 				next(err, data.flags); | ||||||
|  | 			}); | ||||||
|  | 		}, | ||||||
| 	], callback); | 	], callback); | ||||||
| }; | }; | ||||||
|  |  | ||||||
| @@ -505,7 +519,8 @@ Flags.update = function (flagId, uid, changeset, callback) { | |||||||
| 			tasks.push(async.apply(Flags.appendHistory, flagId, uid, changeset)); | 			tasks.push(async.apply(Flags.appendHistory, flagId, uid, changeset)); | ||||||
|  |  | ||||||
| 			// Fire plugin hook | 			// 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) { | 			async.parallel(tasks, function (err) { | ||||||
| 				return next(err); | 				return next(err); | ||||||
| @@ -644,6 +659,9 @@ Flags.notify = function (flagObj, uid, callback) { | |||||||
|  |  | ||||||
| 				plugins.fireHook('action:flag.create', { | 				plugins.fireHook('action:flag.create', { | ||||||
| 					flag: flagObj, | 					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); | 				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', { | 				plugins.fireHook('action:flag.create', { | ||||||
| 					flag: flagObj, | 					flag: flagObj, | ||||||
|  | 				});	// delete @ NodeBB v1.6.0 | ||||||
|  | 				plugins.fireHook('action:flags.create', { | ||||||
|  | 					flag: flagObj, | ||||||
| 				}); | 				}); | ||||||
| 				notifications.push(notification, results.admins.concat(results.globalMods), callback); | 				notifications.push(notification, results.admins.concat(results.globalMods), callback); | ||||||
| 			}); | 			}); | ||||||
|   | |||||||
| @@ -9,6 +9,8 @@ module.exports = function (Plugins) { | |||||||
| 		'filter:post.save': 'filter:post.create', | 		'filter:post.save': 'filter:post.create', | ||||||
| 		'filter:user.profileLinks': 'filter:user.profileMenu', | 		'filter:user.profileLinks': 'filter:user.profileMenu', | ||||||
| 		'action:post.flag': 'action:flag.create', | 		'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): | 		`data` is an object consisting of (* is required): | ||||||
|   | |||||||
| @@ -48,9 +48,7 @@ module.exports = function (Posts) { | |||||||
| 			}, | 			}, | ||||||
| 			function (result, next) { | 			function (result, next) { | ||||||
| 				postData = result.post; | 				postData = result.post; | ||||||
| 				Posts.setPostFields(data.pid, postData, next); |  | ||||||
| 			}, |  | ||||||
| 			function (next) { |  | ||||||
| 				async.parallel({ | 				async.parallel({ | ||||||
| 					editor: function (next) { | 					editor: function (next) { | ||||||
| 						user.getUserFields(data.uid, ['username', 'userslug'], next); | 						user.getUserFields(data.uid, ['username', 'userslug'], next); | ||||||
| @@ -62,7 +60,9 @@ module.exports = function (Posts) { | |||||||
| 			}, | 			}, | ||||||
| 			function (_results, next) { | 			function (_results, next) { | ||||||
| 				results = _results; | 				results = _results; | ||||||
|  | 				Posts.setPostFields(data.pid, postData, next); | ||||||
|  | 			}, | ||||||
|  | 			function (next) { | ||||||
| 				postData.cid = results.topic.cid; | 				postData.cid = results.topic.cid; | ||||||
| 				postData.topic = results.topic; | 				postData.topic = results.topic; | ||||||
| 				plugins.fireHook('action:post.edit', { post: _.clone(postData), uid: data.uid }); | 				plugins.fireHook('action:post.edit', { post: _.clone(postData), uid: data.uid }); | ||||||
| @@ -123,6 +123,17 @@ module.exports = function (Posts) { | |||||||
|  |  | ||||||
| 				data.tags = data.tags || []; | 				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); | 				plugins.fireHook('filter:topic.edit', { req: data.req, topic: topicData, data: data }, next); | ||||||
| 			}, | 			}, | ||||||
| 			function (results, next) { | 			function (results, next) { | ||||||
|   | |||||||
| @@ -2,12 +2,29 @@ | |||||||
|  |  | ||||||
| var privileges = module.exports; | 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 = [ | privileges.userPrivilegeList = [ | ||||||
| 	'find', | 	'find', | ||||||
| 	'read', | 	'read', | ||||||
| 	'topics:read', | 	'topics:read', | ||||||
| 	'topics:create', | 	'topics:create', | ||||||
| 	'topics:reply', | 	'topics:reply', | ||||||
|  | 	'topics:tag', | ||||||
| 	'posts:edit', | 	'posts:edit', | ||||||
| 	'posts:delete', | 	'posts:delete', | ||||||
| 	'topics:delete', | 	'topics:delete', | ||||||
|   | |||||||
| @@ -16,28 +16,13 @@ module.exports = function (privileges) { | |||||||
| 	privileges.categories.list = function (cid, callback) { | 	privileges.categories.list = function (cid, callback) { | ||||||
| 		// Method used in admin/category controller to show all users/groups with privs in that given cid | 		// 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([ | 		async.waterfall([ | ||||||
| 			function (next) { | 			function (next) { | ||||||
| 				async.parallel({ | 				async.parallel({ | ||||||
| 					labels: function (next) { | 					labels: function (next) { | ||||||
| 						async.parallel({ | 						async.parallel({ | ||||||
| 							users: async.apply(plugins.fireHook, 'filter:privileges.list_human', privilegeLabels), | 							users: async.apply(plugins.fireHook, 'filter:privileges.list_human', privileges.privilegeLabels), | ||||||
| 							groups: async.apply(plugins.fireHook, 'filter:privileges.groups.list_human', privilegeLabels), | 							groups: async.apply(plugins.fireHook, 'filter:privileges.groups.list_human', privileges.privilegeLabels), | ||||||
| 						}, next); | 						}, next); | ||||||
| 					}, | 					}, | ||||||
| 					users: function (next) { | 					users: function (next) { | ||||||
| @@ -155,7 +140,7 @@ module.exports = function (privileges) { | |||||||
| 	}; | 	}; | ||||||
|  |  | ||||||
| 	privileges.categories.get = function (cid, uid, callback) { | 	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([ | 		async.waterfall([ | ||||||
| 			function (next) { | 			function (next) { | ||||||
| 				async.parallel({ | 				async.parallel({ | ||||||
| @@ -177,6 +162,7 @@ module.exports = function (privileges) { | |||||||
| 				plugins.fireHook('filter:privileges.categories.get', { | 				plugins.fireHook('filter:privileges.categories.get', { | ||||||
| 					'topics:create': privData['topics:create'] || isAdminOrMod, | 					'topics:create': privData['topics:create'] || isAdminOrMod, | ||||||
| 					'topics:read': privData['topics:read'] || isAdminOrMod, | 					'topics:read': privData['topics:read'] || isAdminOrMod, | ||||||
|  | 					'topics:tag': privData['topics:tag'] || isAdminOrMod, | ||||||
| 					read: privData.read || isAdminOrMod, | 					read: privData.read || isAdminOrMod, | ||||||
| 					cid: cid, | 					cid: cid, | ||||||
| 					uid: uid, | 					uid: uid, | ||||||
|   | |||||||
| @@ -16,7 +16,7 @@ module.exports = function (privileges) { | |||||||
|  |  | ||||||
| 	privileges.topics.get = function (tid, uid, callback) { | 	privileges.topics.get = function (tid, uid, callback) { | ||||||
| 		var topic; | 		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.waterfall([ | ||||||
| 			async.apply(topics.getTopicFields, tid, ['cid', 'uid', 'locked', 'deleted']), | 			async.apply(topics.getTopicFields, tid, ['cid', 'uid', 'locked', 'deleted']), | ||||||
| 			function (_topic, next) { | 			function (_topic, next) { | ||||||
| @@ -41,6 +41,7 @@ module.exports = function (privileges) { | |||||||
| 				plugins.fireHook('filter:privileges.topics.get', { | 				plugins.fireHook('filter:privileges.topics.get', { | ||||||
| 					'topics:reply': (privData['topics:reply'] && !locked && !deleted) || isAdminOrMod, | 					'topics:reply': (privData['topics:reply'] && !locked && !deleted) || isAdminOrMod, | ||||||
| 					'topics:read': privData['topics:read'] || isAdminOrMod, | 					'topics:read': privData['topics:read'] || isAdminOrMod, | ||||||
|  | 					'topics:tag': privData['topics:tag'] || isAdminOrMod, | ||||||
| 					'topics:delete': (isOwner && privData['topics:delete']) || isAdminOrMod, | 					'topics:delete': (isOwner && privData['topics:delete']) || isAdminOrMod, | ||||||
| 					'posts:edit': (privData['posts:edit'] && !locked) || isAdminOrMod, | 					'posts:edit': (privData['posts:edit'] && !locked) || isAdminOrMod, | ||||||
| 					'posts:delete': (privData['posts:delete'] && !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); | 				check(data.content, meta.config.minimumPostLength, meta.config.maximumPostLength, 'content-too-short', 'content-too-long', next); | ||||||
| 			}, | 			}, | ||||||
| 			function (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) { | 			function (results, next) { | ||||||
| 				if (!categoryExists) { | 				if (!results.categoryExists) { | ||||||
| 					return next(new Error('[[error:no-category]]')); | 					return next(new Error('[[error:no-category]]')); | ||||||
| 				} | 				} | ||||||
| 				privileges.categories.can('topics:create', data.cid, data.uid, next); |  | ||||||
| 			}, | 				if (!results.canCreate || !results.canTag) { | ||||||
| 			function (canCreate, next) { |  | ||||||
| 				if (!canCreate) { |  | ||||||
| 					return next(new Error('[[error:no-privileges]]')); | 					return next(new Error('[[error:no-privileges]]')); | ||||||
| 				} | 				} | ||||||
|  |  | ||||||
| 				guestHandleValid(data, next); | 				guestHandleValid(data, next); | ||||||
| 			}, | 			}, | ||||||
| 			function (next) { | 			function (next) { | ||||||
|   | |||||||
							
								
								
									
										22
									
								
								src/upgrades/1.5.2/tags_privilege.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								src/upgrades/1.5.2/tags_privilege.js
									
									
									
									
									
										Normal file
									
								
							| @@ -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:reply': false, | ||||||
| 					'topics:read': false, | 					'topics:read': false, | ||||||
| 					'topics:create': false, | 					'topics:create': false, | ||||||
|  | 					'topics:tag': false, | ||||||
| 					'topics:delete': false, | 					'topics:delete': false, | ||||||
| 					'posts:edit': false, | 					'posts:edit': false, | ||||||
| 					'upload:post:file': false, | 					'upload:post:file': false, | ||||||
| @@ -669,6 +670,7 @@ describe('Categories', function () { | |||||||
| 					'groups:topics:delete': false, | 					'groups:topics:delete': false, | ||||||
| 					'groups:topics:create': true, | 					'groups:topics:create': true, | ||||||
| 					'groups:topics:reply': true, | 					'groups:topics:reply': true, | ||||||
|  | 					'groups:topics:tag': true, | ||||||
| 					'groups:posts:delete': true, | 					'groups:posts:delete': true, | ||||||
| 					'groups:read': true, | 					'groups:read': true, | ||||||
| 					'groups:topics:read': true, | 					'groups:topics:read': true, | ||||||
|   | |||||||
| @@ -7,7 +7,9 @@ var nconf = require('nconf'); | |||||||
|  |  | ||||||
| var db = require('./mocks/databasemock'); | var db = require('./mocks/databasemock'); | ||||||
| var topics = require('../src/topics'); | var topics = require('../src/topics'); | ||||||
|  | var posts = require('../src/posts'); | ||||||
| var categories = require('../src/categories'); | var categories = require('../src/categories'); | ||||||
|  | var privileges = require('../src/privileges'); | ||||||
| var meta = require('../src/meta'); | var meta = require('../src/meta'); | ||||||
| var User = require('../src/user'); | var User = require('../src/user'); | ||||||
| var groups = require('../src/groups'); | var groups = require('../src/groups'); | ||||||
| @@ -825,7 +827,7 @@ describe('Topic\'s', function () { | |||||||
| 		}); | 		}); | ||||||
|  |  | ||||||
| 		it('should 404 if tid is not a number', function (done) { | 		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.ifError(err); | ||||||
| 				assert.equal(response.statusCode, 404); | 				assert.equal(response.statusCode, 404); | ||||||
| 				done(); | 				done(); | ||||||
| @@ -858,7 +860,7 @@ describe('Topic\'s', function () { | |||||||
|  |  | ||||||
|  |  | ||||||
| 		it('should 404 if tid is not a number', function (done) { | 		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.ifError(err); | ||||||
| 				assert.equal(response.statusCode, 404); | 				assert.equal(response.statusCode, 404); | ||||||
| 				done(); | 				done(); | ||||||
| @@ -866,7 +868,7 @@ describe('Topic\'s', function () { | |||||||
| 		}); | 		}); | ||||||
|  |  | ||||||
| 		it('should 404 if tid does not exist', function (done) { | 		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.ifError(err); | ||||||
| 				assert.equal(response.statusCode, 404); | 				assert.equal(response.statusCode, 404); | ||||||
| 				done(); | 				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(); | ||||||
|  | 					}); | ||||||
|  | 				}); | ||||||
|  | 			}); | ||||||
|  | 		}); | ||||||
|  | 	}); | ||||||
| }); | }); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user