From 66222b2d6078b383867d143ff0839ccf28852182 Mon Sep 17 00:00:00 2001 From: moduvoice Date: Sun, 14 Jun 2026 00:53:58 +0700 Subject: [PATCH 1/2] feat(i18n): add Korean (ko) translation Add Korean locale files (i18n/locales/ko/{global,navigation,contact,writing}.json), register them in i18n/locales/messages.ts, and add the ko locale to nuxt.config.ts (i18n.locales + prerender routes). --- i18n/locales/ko/contact.json | 20 ++++++++++++++++++++ i18n/locales/ko/global.json | 22 ++++++++++++++++++++++ i18n/locales/ko/navigation.json | 8 ++++++++ i18n/locales/ko/writing.json | 16 ++++++++++++++++ i18n/locales/messages.ts | 10 ++++++++++ nuxt.config.ts | 3 ++- 6 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 i18n/locales/ko/contact.json create mode 100644 i18n/locales/ko/global.json create mode 100644 i18n/locales/ko/navigation.json create mode 100644 i18n/locales/ko/writing.json diff --git a/i18n/locales/ko/contact.json b/i18n/locales/ko/contact.json new file mode 100644 index 00000000..b56b94ac --- /dev/null +++ b/i18n/locales/ko/contact.json @@ -0,0 +1,20 @@ +{ + "title": "연락하기", + "description": "여러분의 아이디어, 프로젝트 등 무엇이든 이야기해요", + "fullname": "이름", + "email": "이메일", + "phone": "전화번호", + "subject": "메시지 제목", + "message": "메시지", + "submit": "보내기", + "disabled": "resend API 키를 설정해야 합니다", + "success": "메시지가 성공적으로 전송되었습니다", + "error": "이런, 메시지를 전송하는 중 오류가 발생했습니다", + "budget": "예산", + "subject_types": { + "project": "프로젝트 논의", + "bug": "버그 신고", + "question": "질문하기", + "other": "기타" + } +} diff --git a/i18n/locales/ko/global.json b/i18n/locales/ko/global.json new file mode 100644 index 00000000..3a786916 --- /dev/null +++ b/i18n/locales/ko/global.json @@ -0,0 +1,22 @@ +{ + "app_description": "Canvas는 Nuxt와 Tailwind CSS로 제작된, 디자이너와 개발자를 위한 단순하지만 아름다운 포트폴리오 템플릿입니다. HugoRCD가 ❤️를 담아 만들었습니다", + "copied_to_clipboard": "클립보드에 복사되었습니다", + "article_link_copied": "글 링크가 클립보드에 복사되었습니다", + "email_copied": "이메일이 클립보드에 복사되었습니다", + "back_to_home": "홈으로 돌아가기", + "switch_french": "프랑스어로 전환", + "switch_english": "영어로 전환", + "search": "명령어 검색", + "command": "사용 가능한 명령어", + "not_found": "명령어를 찾을 수 없습니다", + "see_more": "더 보기", + "soon": "곧 공개", + "experiences": "경력", + "contact": "함께 일해요", + "email": "이메일 복사", + "cv": "이력서 다운로드", + "meeting": "미팅 예약", + "available": "새로운 기회를 찾고 있습니다", + "unavailable": "현재 다른 멋진 프로젝트를 진행 중입니다", + "all_rights_reserved": "모든 권리 보유" +} diff --git a/i18n/locales/ko/navigation.json b/i18n/locales/ko/navigation.json new file mode 100644 index 00000000..fde34b96 --- /dev/null +++ b/i18n/locales/ko/navigation.json @@ -0,0 +1,8 @@ +{ + "home": "홈", + "works": "작업", + "writing": "글", + "stack": "스택", + "about": "소개", + "contact": "연락처" +} diff --git a/i18n/locales/ko/writing.json b/i18n/locales/ko/writing.json new file mode 100644 index 00000000..625c6883 --- /dev/null +++ b/i18n/locales/ko/writing.json @@ -0,0 +1,16 @@ +{ + "title": "글", + "description": "제가 쓴 글 모음", + "empty": "아직 글이 없습니다. 곧 다시 확인해 주세요!", + "not_found" : "글을 찾을 수 없습니다", + "not_found_description" : "원하시는 글을 찾을 수 없습니다.", + "back_link" : "글 목록으로", + "readingTime" : "분 분량", + "share" : "글 공유", + "copy_link" : "링크 복사", + "search_article" : "글 검색", + "blog" : "블로그", + "unknown_author" : "알 수 없는 작성자", + "show_search" : "검색", + "hide_search" : "검색 숨기기" +} diff --git a/i18n/locales/messages.ts b/i18n/locales/messages.ts index 7b34f0d3..166721b8 100644 --- a/i18n/locales/messages.ts +++ b/i18n/locales/messages.ts @@ -1,14 +1,18 @@ import en_navigation from './en/navigation.json' import fr_navigation from './fr/navigation.json' +import ko_navigation from './ko/navigation.json' import en_contact from './en/contact.json' import fr_contact from './fr/contact.json' +import ko_contact from './ko/contact.json' import en_global from './en/global.json' import fr_global from './fr/global.json' +import ko_global from './ko/global.json' import en_writing from './en/writing.json' import fr_writing from './fr/writing.json' +import ko_writing from './ko/writing.json' const messages = { en: { @@ -23,6 +27,12 @@ const messages = { global: fr_global, writing: fr_writing, }, + ko: { + navigation: ko_navigation, + contact: ko_contact, + global: ko_global, + writing: ko_writing, + }, } export default messages diff --git a/nuxt.config.ts b/nuxt.config.ts index 0fa4d268..d4791975 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -78,7 +78,7 @@ export default defineNuxtConfig({ prerender: { autoSubfolderIndex: false, crawlLinks: true, - routes: ['/en', '/fr'], + routes: ['/en', '/fr', '/ko'], }, }, @@ -98,6 +98,7 @@ export default defineNuxtConfig({ locales: [ { code: 'en', name: 'English', language: 'en-US' }, { code: 'fr', name: 'French', language: 'fr-FR' }, + { code: 'ko', name: 'Korean', language: 'ko-KR' }, ], detectBrowserLanguage: { useCookie: true, From 42de0b7d83953c5dd6892a19743d0079459e1665 Mon Sep 17 00:00:00 2001 From: moduvoice Date: Sun, 14 Jun 2026 01:21:46 +0700 Subject: [PATCH 2/2] fix(i18n): refine Korean readingTime suffix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit readingTime renders as a suffix after the minute count ({{ readingTime }} {{ $t('writing.readingTime') }}), so '분 분량' produced an awkward, redundant '10 분 분량'. Use '분 읽기' to match the English/French intent ('mins to read' / 'min de lecture'). --- i18n/locales/ko/writing.json | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/i18n/locales/ko/writing.json b/i18n/locales/ko/writing.json index 625c6883..8925721c 100644 --- a/i18n/locales/ko/writing.json +++ b/i18n/locales/ko/writing.json @@ -2,15 +2,15 @@ "title": "글", "description": "제가 쓴 글 모음", "empty": "아직 글이 없습니다. 곧 다시 확인해 주세요!", - "not_found" : "글을 찾을 수 없습니다", - "not_found_description" : "원하시는 글을 찾을 수 없습니다.", - "back_link" : "글 목록으로", - "readingTime" : "분 분량", - "share" : "글 공유", - "copy_link" : "링크 복사", - "search_article" : "글 검색", - "blog" : "블로그", - "unknown_author" : "알 수 없는 작성자", - "show_search" : "검색", - "hide_search" : "검색 숨기기" + "not_found": "글을 찾을 수 없습니다", + "not_found_description": "원하시는 글을 찾을 수 없습니다.", + "back_link": "글 목록으로", + "readingTime": "분 읽기", + "share": "글 공유", + "copy_link": "링크 복사", + "search_article": "글 검색", + "blog": "블로그", + "unknown_author": "알 수 없는 작성자", + "show_search": "검색", + "hide_search": "검색 숨기기" }