diff --git a/app/models/enum/locale.go b/app/models/enum/locale.go index 4bf9b7dd6..358fd021f 100644 --- a/app/models/enum/locale.go +++ b/app/models/enum/locale.go @@ -99,6 +99,16 @@ var ( IsRTL: false, } + // LocaleKorean represents Korean + LocaleKorean = Locale{ + Code: "ko", + Name: "Korean", + MessageFormatCode: "ko", + PostgresConfig: "simple", + LinguaLanguage: lingua.Korean, + IsRTL: false, + } + // LocaleDutch represents Dutch LocaleDutch = Locale{ Code: "nl", @@ -209,6 +219,7 @@ var ( LocaleSwedishSE, LocaleItalian, LocaleJapanese, + LocaleKorean, LocaleDutch, LocalePolish, LocaleRussian, diff --git a/locale/ko/client.json b/locale/ko/client.json index d8d796e4f..c6ecaf74a 100644 --- a/locale/ko/client.json +++ b/locale/ko/client.json @@ -8,28 +8,28 @@ "action.edit": "편집", "action.markallasread": "모두 읽은 상태로 표시", "action.ok": "확인", - "action.respond": "상태 업데이트", + "action.respond": "답변", "action.save": "저장", - "action.signin": "가입하기", - "action.submit": "확인", - "action.vote": "이 아이디어에 투표하세요", - "action.voted": "투표했습니다!", - "d41FkJ": "{count, plural, one {# tag} other {# tags}}", + "action.signin": "로그인", + "action.submit": "제출", + "action.vote": "이 제안에 공감", + "action.voted": "공감 완료", + "d41FkJ": "{count, plural, other {태그 #개}}", "editor.markdownmode": "마크다운 편집기로 전환", "editor.richtextmode": "서식 있는 텍스트 편집기로 전환", "enum.poststatus.completed": "완료", "enum.poststatus.declined": "거절됨", "enum.poststatus.deleted": "삭제됨", - "enum.poststatus.duplicate": "복제하다", - "enum.poststatus.open": "열려 있는", - "enum.poststatus.planned": "계획된", - "enum.poststatus.started": "시작함", + "enum.poststatus.duplicate": "중복", + "enum.poststatus.open": "제안됨", + "enum.poststatus.planned": "계획됨", + "enum.poststatus.started": "진행 중", "error.expired.text": "클릭하신 링크는 만료되었습니다.", "error.expired.title": "만료됨", "error.forbidden.text": "이 페이지를 볼 권한이 없습니다.", - "error.forbidden.title": "금지됨", + "error.forbidden.title": "접근 권한 없음", "error.internalerror.text": "오류가 발생하여 문제 해결을 위해 노력하고 있습니다! 곧 정상 작동될 예정입니다.", - "error.internalerror.title": "이런! 으, 이건 예상치 못한 일이야…", + "error.internalerror.title": "이런! 예상치 못한 오류가 발생했습니다.", "error.notinvited.text": "귀하의 이메일 주소로 계정을 찾을 수 없습니다.", "error.notinvited.title": "초대받지 않음", "error.pagenotfound.text": "클릭하신 링크가 끊어졌거나, 페이지가 삭제되었을 수 있습니다.", @@ -40,35 +40,35 @@ "home.filter.search.label": "필터로 검색...", "home.form.defaultinvitation": "여기에 제안을 입력하세요...", "home.form.defaultwelcomemessage": "여러분의 의견을 듣고 싶습니다.\n\n무엇을 개선할 수 있을까요? 여기는 여러분이 투표하고, 토론하고, 아이디어를 공유하는 공간입니다.", - "home.lonely.suggestion": "이 사이트를 공유하기 전에 여기에 <0>최소 3개개의 제안을 작성하는 것이 좋습니다. 잠재고객의 참여를 유도하려면 초기 콘텐츠가 중요합니다.", + "home.lonely.suggestion": "이 사이트를 공유하기 전에 <0>최소 3개의 제안을 먼저 작성하는 것을 권장합니다. 초기 콘텐츠는 방문자의 참여를 이끌어내는 데 중요합니다.", "home.lonely.text": "아직 게시물이 생성되지 않았습니다.", - "home.postfilter.label.view": "보다", - "home.postfilter.option.mostdiscussed": "가장 많이 논의된", - "home.postfilter.option.mostwanted": "가장 원하는", - "home.postfilter.option.myvotes": "내 투표", - "home.postfilter.option.recent": "최근의", - "home.postfilter.option.trending": "트렌드", + "home.postfilter.label.view": "보기", + "home.postfilter.option.mostdiscussed": "가장 많은 토론", + "home.postfilter.option.mostwanted": "가장 많은 공감", + "home.postfilter.option.myvotes": "내 공감", + "home.postfilter.option.recent": "최신순", + "home.postfilter.option.trending": "인기 급상승", "home.postinput.description.placeholder": "제안 내용을 설명해주세요(선택 사항)", "home.postscontainer.label.noresults": "검색어와 일치하는 결과가 없습니다. 다른 것을 입력해 보세요.", "home.postscontainer.label.viewmore": "더 많은 게시물 보기", - "home.postscontainer.query.placeholder": "찾다", - "home.postsort.label": "정렬 기준:", - "home.similar.subtitle": "대신 기존 게시물에 투표하는 것을 고려해 보세요.", + "home.postscontainer.query.placeholder": "검색", + "home.postsort.label": "정렬:", + "home.similar.subtitle": "대신 기존 게시물에 공감해 보세요.", "home.similar.title": "비슷한 게시물", "home.tagsfilter.label.with": "~와 함께", "home.tagsfilter.selected.none": "모든 태그", - "label.actions": "행위", - "label.avatar": "화신", - "label.custom": "관습", + "label.actions": "작업", + "label.avatar": "아바타", + "label.custom": "사용자 지정", "label.description": "설명", - "label.discussion": "논의", + "label.discussion": "토론", "label.edittags": "태그 편집", "label.email": "이메일", - "label.follow": "따르다", - "label.following": "수행원", + "label.follow": "팔로우", + "label.following": "팔로우 중", "label.gravatar": "그라바타", - "label.letter": "편지", - "label.moderation": "절도", + "label.letter": "이니셜", + "label.moderation": "검토", "label.name": "이름", "label.none": "없음", "label.notagsavailable": "사용 가능한 태그가 없습니다", @@ -76,12 +76,12 @@ "label.notifications": "알림", "label.or": "또는", "label.selecttags": "태그를 선택하세요...", - "label.subscribe": "구독하다", + "label.subscribe": "구독", "label.tags": "태그", "label.unfollow": "팔로우 취소", - "label.unread": "읽히지 않는", + "label.unread": "읽지 않음", "label.unsubscribe": "구독 취소", - "label.voters": "유권자들", + "label.voters": "공감한 사용자", "labels.notagsavailable": "사용 가능한 태그가 없습니다", "legal.agreement": "<0/> 및 <1/> 조항을 읽고 동의합니다.", "legal.notice": "로그인하면 <0/><1/> 및 <2/>에 동의하는 것입니다.", @@ -116,7 +116,7 @@ "mysettings.apikey.newkeynotice": "서버에 안전하게 저장하고 앱의 클라이언트 측에는 절대로 저장하지 마세요.", "mysettings.apikey.notice": "API 키는 생성될 때마다 표시됩니다. 키를 분실했거나 손상된 경우 새 키를 생성하여 보관하세요.", "mysettings.apikey.title": "API 키", - "mysettings.dangerzone.delete": "내 계정 삭제", + "mysettings.dangerzone.delete": "계정 삭제", "mysettings.dangerzone.notice": "이 과정은 되돌릴 수 없습니다. 주의해 주세요.", "mysettings.dangerzone.text": "계정 삭제를 선택하시면 모든 개인 정보가 영구적으로 삭제됩니다. 게시하신 콘텐츠는 그대로 유지되지만 익명으로 처리됩니다.", "mysettings.dangerzone.title": "계정 삭제", @@ -126,8 +126,8 @@ "mysettings.message.noemail": "귀하의 계정에 이메일이 없습니다.", "mysettings.message.privateemail": "귀하의 이메일은 비공개이며 절대로 공개되지 않습니다.", "mysettings.notification.channelemail": "이메일", - "mysettings.notification.channelweb": "편물", - "mysettings.notification.event.discussion": "논의", + "mysettings.notification.channelweb": "웹", + "mysettings.notification.event.discussion": "토론", "mysettings.notification.event.discussion.staff": "개별적으로 구독을 취소하지 않는 한 모든 게시물에 대한 댓글", "mysettings.notification.event.discussion.visitors": "구독한 게시물에 대한 댓글", "mysettings.notification.event.mention": "언급", @@ -144,7 +144,7 @@ "mysettings.notification.title": "다음 패널을 사용하여 알림을 받고 싶은 이벤트를 선택하세요.", "mysettings.page.subtitle": "프로필 설정 관리", "mysettings.page.title": "설정", - "page.backhome": "<0>{0} 홈페이지로 돌아가겠습니다.", + "page.backhome": "<0>{0} 홈으로 돌아가기", "page.notinvited.text": "귀하의 이메일 주소로 계정을 찾을 수 없습니다.", "page.notinvited.title": "초대받지 않음", "page.pendingactivation.text": "귀하의 사이트를 활성화하기 위한 링크가 포함된 확인 이메일을 보냈습니다.", @@ -160,17 +160,17 @@ "showpost.message.nodescription": "설명이 제공되지 않았습니다.", "showpost.moderationpanel.text.help": "이 작업은 실행 취소할 수 <0>없습니다.", "showpost.moderationpanel.text.placeholder": "이 게시물을 삭제하는 이유는 무엇입니까? (선택 사항)", - "showpost.mostwanted.comments": "{count, plural, one {# comment} other {# comments}}", - "showpost.mostwanted.votes": "{count, plural, one {# votes} other {# votes}}", + "showpost.mostwanted.comments": "{count, plural, other {댓글 #개}}", + "showpost.mostwanted.votes": "{count, plural, other {공감 #개}}", "showpost.notificationspanel.message.subscribed": "이 게시물의 활동에 대한 알림을 받고 있습니다.", "showpost.notificationspanel.message.unsubscribed": "이 게시물에 대한 어떠한 알림도 받지 않습니다.", - "showpost.postsearch.numofvotes": "{0} 투표", + "showpost.postsearch.numofvotes": "공감 {0}개", "showpost.postsearch.query.placeholder": "원본 게시물 검색...", - "showpost.response.date": "상태가 {statusDate}에서 {status}로 변경되었습니다.", - "showpost.responseform.message.mergedvotes": "이 게시물에 대한 투표는 원래 게시물에 병합됩니다.", + "showpost.response.date": "{statusDate}에 상태가 {status}(으)로 변경되었습니다.", + "showpost.responseform.message.mergedvotes": "이 게시물의 공감은 원본 게시물로 합산됩니다.", "showpost.responseform.text.placeholder": "이 게시물은 무슨 일인가요? 사용자들에게 당신의 계획을 알려주세요...", "showpost.votespanel.more": "+{extraVotesCount} 더", - "showpost.votespanel.seedetails": "자세한 내용을 확인하세요", + "showpost.votespanel.seedetails": "자세히 보기", "signin.email.placeholder": "이메일 주소", "signin.message.email": "이메일로 계속하기", "signin.message.emaildisabled": "관리자가 이메일 인증을 비활성화했습니다. 관리자 계정이 있고 이 제한을 우회하려면 <0>여기를 클릭하세요.", @@ -191,14 +191,14 @@ "newpost.modal.addimage": "이미지 추가", "newpost.modal.description.placeholder": "자세히 설명해 주세요. 숨기지 말고, 정보가 많을수록 좋습니다.", "newpost.modal.title": "여러분의 아이디어를 공유해 보세요...", - "newpost.modal.title.label": "당신의 아이디어에 제목을 붙이세요", - "newpost.modal.title.placeholder": "짧고 간결하게 요약하자면 몇 마디로 요약할 수 있습니다.", - "newpost.modal.submit": "아이디어를 제출하세요", + "newpost.modal.title.label": "아이디어 제목", + "newpost.modal.title.placeholder": "몇 마디로 짧게 요약해 주세요.", + "newpost.modal.submit": "아이디어 제출", "validation.custom.maxattachments": "최대 {number}개의 첨부 파일이 허용됩니다.", "validation.custom.maximagesize": "이미지 크기는 {kilobytes}KB보다 작아야 합니다.", "modal.rss.description": "이 ATOM 피드를 구독하려면 이 URL을 복사하여 RSS/ATOM 리더에 붙여넣으세요.", "modal.rss.title": "ATOM 피드 구독하기", - "home.postfilter.label.myactivity": "소유하다", + "home.postfilter.label.myactivity": "내 활동", "home.postfilter.label.status": "상태", "home.postfilter.option.myposts": "내 게시물", "home.postfilter.option.notags": "태그 없음", @@ -212,29 +212,30 @@ "page.pendingactivation.didntreceive": "이메일을 받지 못하셨나요?", "page.pendingactivation.resend": "인증 이메일 재전송", "page.pendingactivation.resending": "다시 보내는 중...", - "action.continue": "계속하다", - "action.signup": "가입하기", - "signin.code.edit": "편집하다", + "action.continue": "계속", + "action.signup": "회원가입", + "signin.code.edit": "수정", "signin.code.expired": "이 코드는 만료되었거나 이미 사용되었습니다. 새 코드를 요청하세요.", "signin.code.getnew": "새로운 코드를 받으세요", "signin.code.instruction": "방금 <0>{email}으로 보낸 코드를 입력하세요.", "signin.code.invalid": "입력하신 코드가 잘못되었습니다. 다시 시도해 주세요.", "signin.code.placeholder": "여기에 코드를 입력하세요", "signin.code.sent": "귀하의 이메일로 새로운 코드가 전송되었습니다.", - "signin.code.submit": "제출하다", + "signin.code.submit": "제출", "signin.name.placeholder": "당신의 이름", "action.delete.block": "삭제 및 차단", - "action.postcomment": "우편", + "action.postcomment": "댓글 작성", "action.publish": "게시", - "action.publish.verify": "출판 및 신뢰", + "action.publish.verify": "게시 및 승인", "error.accessdenied.contact": "이것이 오류라고 생각되시면 관리자에게 문의하십시오.", "error.accessdenied.text": "이 사이트에 접속하는 데 필요한 권한이 없습니다.", "error.accessdenied.title": "접근 불가", "header.nav.feedback": "모든 피드백", "header.nav.roadmap": "로드맵", - "home.postfilter.label.moderation": "절도", - "label.vote": "투표", - "label.votes": "투표", + "home.postfilter.label.moderation": "검토", + "label.vote": "공감", + "label.votes": "공감", + "listposts.label.showmore": "{0} 더 보기", "moderation.comment.delete.block.error": "댓글 삭제 및 사용자 차단에 실패했습니다.", "moderation.comment.delete.error": "댓글 삭제에 실패했습니다", "moderation.comment.deleted": "댓글이 성공적으로 삭제되었습니다.", @@ -253,14 +254,14 @@ "moderation.post.publish.verify.error": "게시물 발행 및 사용자 인증에 실패했습니다.", "moderation.post.published": "게시물이 성공적으로 게시되었습니다.", "moderation.post.published.verified": "게시됨 및 사용자 확인 완료", - "moderation.subtitle": "이러한 아이디어와 의견은 신뢰하는 사용자 목록에 없는 사람들의 것이므로 게시 여부는 본인이 결정합니다.", + "moderation.subtitle": "이 제안과 의견은 신뢰 사용자 목록에 없는 분들이 남긴 것입니다. 게시 여부는 직접 결정하세요.", "moderation.title": "검토 대기열", "pagination.next": "다음", - "pagination.prev": "이전의", + "pagination.prev": "이전", "post.pending": "보류 중", "postdetails.backtoall": "모든 제안 보기로 돌아가기", "postdetails.backtoroadmap": "로드맵으로 돌아가기", - "roadmap.blank.description": "게시글을 '계획 중' 또는 '진행 중'으로 표시하면 로드맵에 표시됩니다.", + "roadmap.blank.description": "게시물을 '계획됨' 또는 '진행 중'으로 표시하면 로드맵에 표시됩니다.", "roadmap.blank.title": "로드맵이 첫 번째 업데이트를 기다리고 있습니다.", "roadmap.column.showmore": "더보기", "roadmap.upsell.billing": "PRO 버전으로 업그레이드하세요", @@ -268,7 +269,7 @@ "roadmap.upsell.title": "로드맵 보기에서 진행 상황을 확인하세요.", "showpost.loading": "로딩 중...", "showpost.moderation.admin.description": "이 아이디어는 게시하기 전에 귀하의 승인이 필요합니다.", - "showpost.moderation.admin.title": "절도", + "showpost.moderation.admin.title": "검토", "showpost.moderation.approved": "게시물이 성공적으로 승인되었습니다", "showpost.moderation.approveerror": "게시물 승인 실패", "showpost.moderation.awaiting": "검토 대기 중입니다.", @@ -277,7 +278,7 @@ "showpost.moderation.comment.approveerror": "댓글 승인에 실패했습니다", "showpost.moderation.comment.awaiting": "검토 대기 중입니다.", "showpost.moderation.comment.declined": "댓글이 거부되었습니다.", - "showpost.moderation.comment.declineerror": "논평을 거부하지 못했습니다.", + "showpost.moderation.comment.declineerror": "댓글 거절에 실패했습니다.", "showpost.moderation.commentsuccess": "댓글이 검토 대기 중입니다 📝", "showpost.moderation.declined": "게시물이 성공적으로 거절되었습니다.", "showpost.moderation.declineerror": "게시물 거절에 실패했습니다", diff --git a/locale/ko/server.json b/locale/ko/server.json index 3a3fb90f3..a295f96e2 100644 --- a/locale/ko/server.json +++ b/locale/ko/server.json @@ -74,5 +74,7 @@ "email.delete_account_requested.scheduled": "삭제 작업은 {scheduledAt}에 예약되어 있습니다. 일단 실행되면 되돌릴 수 없습니다.", "email.delete_account_requested.cancel": "삭제를 요청하지 않았거나 마음이 바뀌셨나요? 아래 링크를 사용하여 삭제를 취소하세요.", "email.delete_account_completed.subject": "귀하의 Fider 사이트 {tenantName}이 삭제되었습니다.", - "email.delete_account_completed.text": "귀하의 Fider 사이트 {tenantName} ({subdomain}) 및 모든 데이터가 영구적으로 삭제되었습니다. 이 작업은 복구할 수 없습니다." + "email.delete_account_completed.text": "귀하의 Fider 사이트 {tenantName} ({subdomain}) 및 모든 데이터가 영구적으로 삭제되었습니다. 이 작업은 복구할 수 없습니다.", + "feed.global.title": "{count, plural, other {(투표 {count}) {title}}}", + "feed.post.title": "# {title}\n{votes, plural, other {투표 #}}, {comments, plural, other {댓글 #}}" } \ No newline at end of file diff --git a/locale/locales.ts b/locale/locales.ts index 74d1ace35..45931a738 100644 --- a/locale/locales.ts +++ b/locale/locales.ts @@ -30,6 +30,9 @@ const locales: { [key: string]: Locale } = { ja: { text: "Japanese", }, + ko: { + text: "Korean", + }, nl: { text: "Dutch", },