From af07240df011745ab801dbe136d9fc18b6922b8a Mon Sep 17 00:00:00 2001 From: codytseng Date: Thu, 3 Jul 2025 22:00:19 +0800 Subject: [PATCH] feat: add Korean language support --- src/i18n/index.ts | 4 + src/i18n/locales/ko.ts | 286 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 290 insertions(+) create mode 100644 src/i18n/locales/ko.ts diff --git a/src/i18n/index.ts b/src/i18n/index.ts index 92a3abd..d4fb62b 100644 --- a/src/i18n/index.ts +++ b/src/i18n/index.ts @@ -9,6 +9,7 @@ import es from './locales/es' import fr from './locales/fr' import it from './locales/it' import ja from './locales/ja' +import ko from './locales/ko' import pl from './locales/pl' import pt_BR from './locales/pt-BR' import pt_PT from './locales/pt-PT' @@ -24,6 +25,7 @@ const languages = { fr: { resource: fr, name: 'Français' }, it: { resource: it, name: 'Italiano' }, ja: { resource: ja, name: '日本語' }, + ko: { resource: ko, name: '한국어' }, pl: { resource: pl, name: 'Polski' }, 'pt-BR': { resource: pt_BR, name: 'Português (Brasil)' }, 'pt-PT': { resource: pt_PT, name: 'Português (Portugal)' }, @@ -77,6 +79,8 @@ i18n.services.formatter?.add('date', (timestamp, lng) => { case 'ar': case 'th': return dayjs(timestamp).format('DD/MM/YYYY') + case 'ko': + return dayjs(timestamp).format('YYYY년 MM월 DD일') default: return dayjs(timestamp).format('MMM D, YYYY') } diff --git a/src/i18n/locales/ko.ts b/src/i18n/locales/ko.ts new file mode 100644 index 0000000..c09d3c6 --- /dev/null +++ b/src/i18n/locales/ko.ts @@ -0,0 +1,286 @@ +export default { + translation: { + 'Welcome! 🥳': '환영합니다! 🥳', + About: '정보', + 'New Note': '새 노트 작성', + Post: '노트 게시', + Home: '홈', + 'Relay settings': '릴레이 설정', + Settings: '설정', + SidebarRelays: '릴레이', + Refresh: '새로고침', + Profile: '프로필', + Logout: '로그아웃', + Following: '팔로잉', + followings: '팔로잉', + reposted: '리포스트', + 'just now': '방금 전', + 'n minutes ago': '{{n}}분 전', + 'n m': '{{n}}분', + 'n hours ago': '{{n}}시간 전', + 'n h': '{{n}}시간', + 'n days ago': '{{n}}일 전', + 'n d': '{{n}}일', + date: '{{timestamp, date}}', + Follow: '팔로우', + Unfollow: '언팔로우', + 'Follow failed': '팔로우 실패', + 'Unfollow failed': '언팔로우 실패', + 'show new notes': '새 노트 보기', + 'loading...': '로딩 중...', + 'no more notes': '더 이상 노트 없음', + 'reply to': '답글', + reply: '답글', + Reply: '답글', + 'load more older replies': '이전 답글 더 보기', + 'Write something...': '무엇인가 작성하세요...', + Cancel: '취소', + Mentions: '멘션', + 'Failed to post': '게시 실패', + 'Post successful': '게시 성공', + 'Your post has been published': '게시물이 게시되었습니다', + Repost: '리포스트', + Quote: '인용', + 'Copy event ID': '이벤트 ID 복사', + 'Copy user ID': '사용자 ID 복사', + 'View raw event': '원본 이벤트 보기', + Like: '좋아요', + 'switch to light theme': '라이트 테마로 전환', + 'switch to dark theme': '다크 테마로 전환', + 'switch to system theme': '시스템 테마로 전환', + Note: '노트', + note: '노트', + "username's following": '{{username}}님의 팔로잉', + "username's used relays": '{{username}}님이 사용하는 릴레이', + "username's muted": '{{username}}님이 차단한 사용자', + Login: '로그인', + 'Follows you': '회원님을 팔로우함', + 'Relay Settings': '릴레이 설정', + 'Relay set name': '릴레이 세트 이름', + 'Add a new relay set': '새 릴레이 세트 추가', + Add: '추가', + 'n relays': '{{n}}개의 릴레이', + Rename: '이름 변경', + 'Copy share link': '공유 링크 복사', + Delete: '삭제', + 'Relay already exists': '릴레이가 이미 존재합니다', + 'invalid relay URL': '유효하지 않은 릴레이 주소', + 'Add a new relay': '새 릴레이 추가', + back: '뒤로', + 'Lost in the void': '공허 속에서 길을 잃음', + 'Carry me home': '집으로 데려다줘', + 'no replies': '답글 없음', + 'Reply to': '답글', + Search: '검색', + 'The relays you are connected to do not support search': + '연결된 릴레이가 검색을 지원하지 않습니다', + 'Show more...': '더 보기...', + 'All users': '모든 사용자', + 'Display replies': '답글 표시', + Notes: '노트', + Replies: '답글', + Notifications: '알림', + 'no more notifications': '더 이상 알림 없음', + 'Using private key login is insecure. It is recommended to use a browser extension for login, such as alby, nostr-keyx or nos2x. If you must use a private key, please set a password for encryption at minimum.': + '개인 키 로그인은 안전하지 않습니다. alby, nostr-keyx, nos2x와 같은 브라우저 확장 프로그램을 사용하는 것이 좋습니다. 꼭 개인 키를 사용해야 한다면 최소한 암호를 설정하세요.', + 'Login with Browser Extension': '브라우저 확장으로 로그인', + 'Login with Bunker': 'Bunker로 로그인', + 'Login with Private Key': '개인 키로 로그인', + 'reload notes': '노트 다시 불러오기', + 'Logged in Accounts': '로그인된 계정', + 'Add an Account': '계정 추가', + 'More options': '더 많은 옵션', + 'Add client tag': '클라이언트 태그 추가', + 'Show others this was sent via Jumble': '이 노트가 Jumble을 통해 전송되었음을 표시', + 'Are you sure you want to logout?': '로그아웃 하시겠습니까?', + 'relay sets': '릴레이 세트', + edit: '편집', + Languages: '언어', + Theme: '테마', + System: '시스템', + Light: '라이트', + Dark: '다크', + Temporary: '임시', + 'Choose a relay set': '릴레이 세트 선택', + 'Switch account': '계정 전환', + Pictures: '사진', + 'Picture note': '사진 노트', + 'A special note for picture-first clients like Olas': + 'Olas와 같은 사진 우선 클라이언트에서 표시되는 특별한 노트', + 'Picture note requires images': '사진 노트에는 이미지가 필요합니다', + Relays: '릴레이', + image: '이미지', + Normal: '일반', + 'R & W': '읽기/쓰기', + Read: '읽기 전용', + Write: '쓰기 전용', + 'Pull relay sets': '릴레이 세트 가져오기', + 'Select the relay sets you want to pull': '가져올 릴레이 세트 선택', + 'No relay sets found': '릴레이 세트를 찾을 수 없음', + 'Pull n relay sets': '{{n}}개의 릴레이 세트 가져오기', + Pull: '가져오기', + 'Select all': '전체 선택', + 'Relay Sets': '릴레이 세트', + Mailbox: '메일박스', + 'Read & Write Relays': '읽기/쓰기 릴레이', + 'read relays description': + '읽기 릴레이는 회원님과 관련된 이벤트를 찾는 데 사용됩니다. 다른 사용자는 회원님이 보길 원하는 이벤트를 회원님의 읽기 릴레이에 게시합니다.', + 'write relays description': + '쓰기 릴레이는 회원님의 이벤트를 게시하는 데 사용됩니다. 다른 사용자는 회원님의 쓰기 릴레이에서 회원님이 게시한 이벤트를 찾습니다.', + 'read & write relays notice': '읽기 및 쓰기 릴레이는 각각 2~4개 정도가 적당합니다.', + "Don't have an account yet?": '아직 계정이 없으신가요?', + 'or simply generate a private key': '또는 간단히 개인 키 생성', + 'This is a private key. Do not share it with anyone. Keep it safe and secure. You will not be able to recover it if you lose it.': + '이것은 개인 키입니다. 절대 다른 사람과 공유하지 마세요. 안전하게 보관하세요. 분실 시 복구할 수 없습니다.', + Edit: '편집', + Save: '저장', + 'Display Name': '표시 이름', + Bio: '소개', + 'Nostr Address (NIP-05)': 'Nostr 주소 (NIP-05)', + 'Invalid NIP-05 address': '유효하지 않은 NIP-05 주소', + 'Copy private key': '개인 키 복사', + 'Enter the password to decrypt your ncryptsec': 'ncryptsec를 복호화할 비밀번호 입력', + Back: '뒤로', + 'password (optional): encrypt nsec': '비밀번호(선택): nsec 암호화', + 'optional: encrypt nsec': '선택: nsec 암호화', + password: '비밀번호', + 'Sign up': '회원가입', + 'Save to': '저장 위치', + 'Enter a name for the new relay set': '새 릴레이 세트 이름 입력', + 'Save to a new relay set': '새 릴레이 세트에 저장', + Mute: '차단', + Muted: '차단됨', + Unmute: '차단 해제', + 'Unmute user': '사용자 차단 해제', + 'Append n relays': '{{n}}개의 릴레이 추가', + Append: '추가', + 'Select relays to append': '추가할 릴레이 선택', + 'calculating...': '계산 중...', + 'Calculate optimal read relays': '최적의 읽기 릴레이 계산', + 'Login to set': '설정하려면 로그인', + 'Please login to view following feed': '팔로잉 피드를 보려면 로그인하세요', + 'Send only to r': '{{r}}에만 전송', + 'Send only to these relays': '이 릴레이에만 전송', + Explore: '탐색', + 'Search relays': '릴레이 검색', + relayInfoBadgeAuth: '로그인 필요', + relayInfoBadgeSearch: '검색 지원', + relayInfoBadgePayment: '유료', + Operator: '운영자', + Contact: '연락처', + Software: '소프트웨어', + Version: '버전', + 'Random Relays': '무작위 릴레이', + randomRelaysRefresh: '새로고침', + 'Explore more': '더 탐색하기', + 'Payment page': '결제 페이지', + 'Supported NIPs': '지원 NIP', + 'Open in a': '{{a}}에서 열기', + 'Cannot handle event of kind k': '{{k}} 유형의 이벤트를 처리할 수 없습니다', + 'Sorry! The note cannot be found 😔': '죄송합니다! 해당 노트를 찾을 수 없습니다 😔', + 'This user has been muted': '이 사용자는 차단되었습니다', + Wallet: '지갑', + Sats: '사토시', + sats: '사토시', + 'Zap to': '즙 보내기', + 'Zap n sats': '{{n}} 사토시 즙 보내기', + zapComment: '코멘트', + 'Default zap amount': '기본 즙 금액', + 'Default zap comment': '기본 즙 코멘트', + 'Lightning Address (or LNURL)': '라이트닝 주소(또는 LNURL)', + 'Quick zap': '빠른 즙', + 'If enabled, you can zap with a single click. Click and hold for custom amounts': + '활성화하면 한 번 클릭으로 즙을 보낼 수 있습니다. 길게 누르면 금액을 직접 입력할 수 있습니다.', + All: '전체', + Reactions: '반응', + Zaps: '즙', + 'Enjoying Jumble?': 'Jumble이 마음에 드시나요?', + 'Your donation helps me maintain Jumble and make it better! 😊': + '후원해주시면 Jumble을 더 잘 유지하고 발전시킬 수 있습니다! 😊', + 'Earlier notifications': '이전 알림', + 'Temporarily display this note': '이 노트 임시 표시', + buttonFollowing: '팔로잉 중', + 'Are you sure you want to unfollow this user?': '이 사용자를 언팔로우하시겠습니까?', + 'Recent Supporters': '최근 후원자', + 'Seen on': '출처', + 'Temporarily display this reply': '이 답글 임시 표시', + 'Note not found': '노트를 찾을 수 없음', + 'no more replies': '더 이상 답글 없음', + 'Relay sets': '릴레이 세트', + 'Favorite Relays': '즐겨찾는 릴레이', + "Following's Favorites": '팔로잉의 즐겨찾기', + 'no more relays': '더 이상 릴레이 없음', + 'Favorited by': '즐겨찾기한 사람', + 'Post settings': '게시 설정', + 'Media upload service': '미디어 업로드 서비스', + 'Choose a relay': '릴레이 선택', + 'no relays found': '릴레이를 찾을 수 없음', + video: '비디오', + 'Show n new notes': '{{n}}개의 새 노트 보기', + YouTabName: '나와 함께', + Bookmark: '북마크', + 'Remove bookmark': '북마크 제거', + 'no bookmarks found': '북마크 없음', + 'no more bookmarks': '더 이상 북마크 없음', + Bookmarks: '북마크', + 'Show more': '더 보기', + General: '일반', + Autoplay: '자동 재생', + 'Enable video autoplay on this device': '이 기기에서 비디오 자동 재생 활성화', + 'Paste or drop media files to upload': '미디어 파일을 붙여넣거나 드래그하여 업로드', + Preview: '미리보기', + 'You are about to publish an event signed by [{{eventAuthorName}}]. You are currently logged in as [{{currentUsername}}]. Are you sure?': + '[{{eventAuthorName}}]가 서명한 이벤트를 게시하려고 합니다. 현재 [{{currentUsername}}]로 로그인되어 있습니다. 계속하시겠습니까?', + 'Platinum Sponsors': '플래티넘 스폰서', + From: '출처', + 'Comment on': '댓글', + 'View on njump.me': 'njump.me에서 보기', + 'Hide content from untrusted users': '신뢰하지 않는 사용자의 콘텐츠 숨기기', + 'Only show content from your followed users and the users they follow': + '내가 팔로우하는 사용자와 그들이 팔로우하는 사용자의 콘텐츠만 표시', + 'Followed by': '팔로워', + 'Mute user privately': '비공개 차단', + 'Mute user publicly': '공개 차단', + Quotes: '인용', + 'Lightning Invoice': '라이트닝 인보이스', + 'Bookmark failed': '북마크 실패', + 'Remove bookmark failed': '북마크 제거 실패', + Translation: '번역', + Balance: '잔액', + characters: '글자', + jumbleTranslateApiKeyDescription: + '이 API 키는 LibreTranslate를 지원하는 모든 곳에서 사용할 수 있습니다. 서비스 주소: {{serviceUrl}}', + 'Top up': '충전', + 'Will receive: {n} characters': '{{n}} 글자를 받게 됩니다', + 'Top up {n} sats': '{{n}} 사토시 충전', + 'Minimum top up is {n} sats': '최소 충전 금액은 {{n}} 사토시입니다', + Service: '서비스', + 'Reset API key': 'API 키 재설정', + 'Are you sure you want to reset your API key? This action cannot be undone.': + 'API 키를 재설정하시겠습니까? 이 작업은 되돌릴 수 없습니다.', + Warning: '경고', + 'Your current API key will become invalid immediately, and any applications using it will stop working until you update them with the new key.': + '현재 API 키는 즉시 무효화되며, 새 키로 업데이트하기 전까지 관련 앱이 작동하지 않습니다.', + 'Service address': '서비스 주소', + Pay: '결제', + interactions: '상호작용', + notifications: '알림', + 'Show untrusted {type}': '신뢰하지 않는 {{type}} 표시', + 'Hide untrusted {type}': '신뢰하지 않는 {{type}} 숨기기', + 'Currently hiding {type} from untrusted users.': + '현재 신뢰하지 않는 사용자의 {{type}}을(를) 숨기고 있습니다.', + 'Currently showing all {type}.': '현재 모든 {{type}}을(를) 표시하고 있습니다.', + 'Click continue to show all {type}.': '계속을 클릭하면 모든 {{type}}을(를) 표시합니다.', + 'Click continue to hide {type} from untrusted users.': + '계속을 클릭하면 신뢰하지 않는 사용자의 {{type}}을(를) 숨깁니다.', + 'Trusted users include people you follow and people they follow.': + '신뢰하는 사용자는 내가 팔로우하는 사람과 그들이 팔로우하는 사람을 포함합니다.', + Continue: '계속', + 'Successfully updated mute list': '차단 목록이 성공적으로 업데이트되었습니다', + 'No pubkeys found from {url}': '{{url}}에서 pubkey를 찾을 수 없습니다', + 'Translating...': '번역 중...', + Translate: '번역', + 'Show original': '원본 보기', + Website: '웹사이트' + } +}