Skip to content

Commit

Permalink
feat(i18n): Korean and fallback language name (#582)
Browse files Browse the repository at this point in the history
* Add Korean translations for error messages, UI elements, and shortcuts.

Created new JSON files with Korean translations for individual error messages, various UI components, application settings, and keyboard shortcuts to improve localization and enhance user experience for Korean-speaking users.

* feat: completion langs

Signed-off-by: Innei <[email protected]>

---------

Signed-off-by: Innei <[email protected]>
Co-authored-by: Innei <[email protected]>
  • Loading branch information
hellosunghyun and Innei committed Sep 23, 2024
1 parent 0a89c2f commit 2ae12c9
Show file tree
Hide file tree
Showing 28 changed files with 958 additions and 240 deletions.
3 changes: 2 additions & 1 deletion apps/renderer/src/@types/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ export const currentSupportedLanguages = [
"it",
"ru",
"es",
"ko",
]

export const dayjsLocaleImportMap = {
en: ["en", () => import("dayjs/locale/en")],
["zh-CN"]: ["zh-cn", () => import("dayjs/locale/zh-cn")],
Expand All @@ -38,6 +38,7 @@ export const dayjsLocaleImportMap = {
["ar-KW"]: ["ar-kw", () => import("dayjs/locale/ar-kw")],
["ar-TN"]: ["ar-tn", () => import("dayjs/locale/ar-tn")],
["zh-HK"]: ["zh-hk", () => import("dayjs/locale/zh-hk")],
["ko"]: ["ko", () => import("dayjs/locale/ko")],
}
export const ns = ["app", "common", "lang", "settings", "shortcuts", "errors"] as const
export const defaultNS = "app" as const
3 changes: 3 additions & 0 deletions apps/renderer/src/@types/default-resource.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import common_fi from "../../../../locales/common/fi.json"
import common_fr from "../../../../locales/common/fr.json"
import common_it from "../../../../locales/common/it.json"
import common_ja from "../../../../locales/common/ja.json"
import common_ko from "../../../../locales/common/ko.json"
import common_pt from "../../../../locales/common/pt.json"
import common_ru from "../../../../locales/common/ru.json"
import common_zhCN from "../../../../locales/common/zh-CN.json"
Expand All @@ -31,6 +32,7 @@ import lang_fi from "../../../../locales/lang/fi.json"
import lang_fr from "../../../../locales/lang/fr.json"
import lang_it from "../../../../locales/lang/it.json"
import lang_ja from "../../../../locales/lang/ja.json"
import lang_ko from "../../../../locales/lang/ko.json"
import lang_pt from "../../../../locales/lang/pt.json"
import lang_ru from "../../../../locales/lang/ru.json"
import lang_zhCN from "../../../../locales/lang/zh-CN.json"
Expand Down Expand Up @@ -75,4 +77,5 @@ export const defaultResources = {
"ar-IQ": { lang: lang_ariq, common: common_ariq },
"ar-KW": { lang: lang_arkw, common: common_arkw },
"ar-TN": { lang: lang_artn, common: common_artn },
ko: { lang: lang_ko, common: common_ko },
}
8 changes: 7 additions & 1 deletion apps/renderer/src/modules/settings/tabs/general.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { useCallback, useEffect } from "react"
import { useTranslation } from "react-i18next"

import { currentSupportedLanguages } from "~/@types/constants"
import { defaultResources } from "~/@types/default-resource"
import { langLoadingLockMapAtom } from "~/atoms/lang"
import {
setGeneralSetting,
Expand Down Expand Up @@ -236,9 +237,14 @@ export const LanguageSelector = () => {
{currentSupportedLanguages.map((lang) => {
const percent = I18N_COMPLETENESS_MAP[lang]

const languageName =
langT(`langs.${lang}` as any) === `langs.${lang}`
? defaultResources[lang].lang.name
: langT(`langs.${lang}` as any)

return (
<SelectItem key={lang} value={lang}>
{langT(`langs.${lang}` as any)}{" "}
{languageName}{" "}
{typeof percent === "number" ? (percent >= 100 ? null : `(${percent}%)`) : null}
</SelectItem>
)
Expand Down
243 changes: 243 additions & 0 deletions locales/app/ko.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,243 @@
{
"achievement.all_done": "모두 완료되었습니다!",
"achievement.first_claim_feed": "피드 소유자",
"achievement.first_claim_feed_description": "Follow에서 귀하의 피드를 소유하고 있습니다",
"achievement.mint_more_power": "하드코어 플레이어가 되어 더 많은 <power />를 획득하세요",
"ai_daily.title": "최신 뉴스 - {{title}}",
"ai_daily.tooltip.content": "여기에는 귀하의 타임라인(<From /> - <To />)에서 AI가 선택한 중요한 뉴스가 포함되어 있을 수 있습니다.",
"ai_daily.tooltip.update_schedule": "매일 오전 8시 및 오후 8시에 업데이트됩니다.",
"app.copy_logo_svg": "로고 SVG 복사",
"app.toggle_sidebar": "사이드바 토글",
"discover.any_url_or_keyword": "임의의 URL 또는 키워드",
"discover.default_option": " (기본값)",
"discover.feed_description": "이 피드의 설명은 다음과 같으며, 관련 정보를 사용하여 매개변수 양식을 작성할 수 있습니다.",
"discover.feed_maintainers": "이 피드는 RSSHub에서 제공하며, <maintainers />에게 크레딧을 제공합니다.",
"discover.import.click_to_upload": "OPML 파일 업로드 클릭",
"discover.import.conflictItems": "충돌 항목",
"discover.import.noItems": "항목 없음",
"discover.import.opml": "OPML 파일",
"discover.import.parsedErrorItems": "구문 분석 오류 항목",
"discover.import.result": "<SuccessfulNum />개의 피드가 성공적으로 가져와졌으며, <ConflictNum />개는 이미 구독 중이며, <ErrorNum />개는 가져오기에 실패했습니다.",
"discover.import.successfulItems": "성공적인 항목",
"discover.popular": "인기",
"discover.preview": "미리보기",
"discover.rss_hub_route": "RSSHub 경로",
"discover.rss_url": "RSS URL",
"discover.select_placeholder": "선택",
"discover.target": "검색 대상",
"discover.target.feeds": "피드",
"discover.target.lists": "목록",
"early_access": "얼리 액세스",
"entry_actions.copy_link": "링크 복사",
"entry_actions.failed_to_save_to_eagle": "Eagle에 저장하지 못했습니다.",
"entry_actions.failed_to_save_to_instapaper": "Instapaper에 저장하지 못했습니다.",
"entry_actions.failed_to_save_to_readwise": "Readwise에 저장하지 못했습니다.",
"entry_actions.link_copied": "링크가 클립보드에 복사되었습니다.",
"entry_actions.mark_as_read": "읽음으로 표시",
"entry_actions.mark_as_unread": "읽지 않음으로 표시",
"entry_actions.open_in_browser": "브라우저에서 열기",
"entry_actions.save_media_to_eagle": "미디어를 Eagle에 저장",
"entry_actions.save_to_instapaper": "Instapaper에 저장",
"entry_actions.save_to_readwise": "Readwise에 저장",
"entry_actions.saved_to_eagle": "Eagle에 저장되었습니다.",
"entry_actions.saved_to_instapaper": "Instapaper에 저장되었습니다.",
"entry_actions.saved_to_readwise": "Readwise에 저장되었습니다.",
"entry_actions.share": "공유",
"entry_actions.star": "별표",
"entry_actions.starred": "별표가 추가되었습니다.",
"entry_actions.tip": "",
"entry_actions.unstar": "별표 제거",
"entry_actions.unstarred": "별표가 제거되었습니다.",
"entry_column.filtered_content_tip": "필터링된 콘텐츠가 숨겨져 있습니다.",
"entry_column.filtered_content_tip_2": "위에 표시된 항목 외에도 필터링된 콘텐츠가 있습니다.",
"entry_column.refreshing": "새로운 항목을 새로고침 중...",
"entry_content.ai_summary": "AI 요약",
"entry_content.fetching_content": "원본 콘텐츠를 가져오고 처리 중...",
"entry_content.header.play_tts": "TTS 재생",
"entry_content.header.readability": "가독성",
"entry_content.no_content": "사용 가능한 미디어가 없습니다",
"entry_content.readability_notice": "이 콘텐츠는 Readability에서 제공됩니다. 오타가 있는 경우 원본 콘텐츠를 보려면 소스 사이트로 이동하십시오.",
"entry_content.render_error": "렌더링 오류:",
"entry_content.report_issue": "문제 보고",
"entry_content.support_amount": "{{amount}}명이 이 피드의 제작자를 지원했습니다.",
"entry_content.support_creator": "제작자 지원",
"entry_content.web_app_notice": "웹 앱에서 이 콘텐츠 유형을 지원하지 않을 수 있습니다. 하지만 데스크톱 앱을 다운로드할 수 있습니다.",
"entry_list.zero_unread": "읽지 않은 항목 없음",
"entry_list_header.daily_report": "일일 보고서",
"entry_list_header.hide_no_image_items": "이미지가 없는 항목 숨기기.",
"entry_list_header.items": "항목",
"entry_list_header.new_entries_available": "새로운 항목 사용 가능",
"entry_list_header.refetch": "다시 가져오기",
"entry_list_header.refresh": "새로고침",
"entry_list_header.show_all": "모두 보기",
"entry_list_header.show_all_items": "모든 항목 보기",
"entry_list_header.show_unread_only": "읽지 않은 항목만 보기",
"entry_list_header.switch_to_grid": "그리드 보기로 전환",
"entry_list_header.switch_to_masonry": "메이슨리 보기로 전환",
"entry_list_header.unread": "읽지 않음",
"feed_claim_modal.choose_verification_method": "세 가지 방법 중 하나를 선택하여 인증할 수 있습니다.",
"feed_claim_modal.claim_button": "클레임",
"feed_claim_modal.content_instructions": "아래 내용을 복사하여 최신 RSS 피드에 게시하십시오.",
"feed_claim_modal.description_current": "현재 설명:",
"feed_claim_modal.description_instructions": "다음 내용을 복사하여 RSS 피드의 <code /> 필드에 붙여넣으십시오.",
"feed_claim_modal.failed_to_load": "클레임 메시지를 불러오지 못했습니다",
"feed_claim_modal.rss_format_choice": "RSS 생성기는 일반적으로 두 가지 형식을 선택할 수 있습니다. 필요에 따라 아래의 XML 및 JSON 형식을 복사하십시오.",
"feed_claim_modal.rss_instructions": "아래 코드를 복사하여 RSS 생성기에 붙여넣으십시오.",
"feed_claim_modal.rss_json_format": "JSON 형식",
"feed_claim_modal.rss_xml_format": "XML 형식",
"feed_claim_modal.rsshub_notice": "이 피드는 RSSHub에서 제공되며 캐시 시간이 1시간입니다. 콘텐츠를 게시한 후 변경 사항이 표시되려면 최대 1시간이 소요될 수 있습니다.",
"feed_claim_modal.tab_content": "콘텐츠",
"feed_claim_modal.tab_description": "설명",
"feed_claim_modal.tab_rss": "RSS 태그",
"feed_claim_modal.title": "피드 클레임",
"feed_claim_modal.verify_ownership": "이 피드를 귀하의 소유로 클레임하려면 소유권을 인증해야 합니다.",
"feed_form.add_follow": "팔로우 추가",
"feed_form.category": "카테고리",
"feed_form.category_description": "기본적으로 귀하의 팔로우는 웹사이트별로 그룹화됩니다.",
"feed_form.error_fetching_feed": "피드를 가져오는 중 오류가 발생했습니다.",
"feed_form.fee": "팔로우 비용",
"feed_form.fee_description": "이 목록을 팔로우하려면 목록 제작자에게 비용을 지불해야 합니다.",
"feed_form.feed_not_found": "피드를 찾을 수 없습니다.",
"feed_form.feedback": "피드백",
"feed_form.follow": "팔로우",
"feed_form.follow_with_fee": "{{fee}} 파워로 팔로우",
"feed_form.followed": "🎉 팔로우 되었습니다.",
"feed_form.private_follow": "비공개 팔로우",
"feed_form.private_follow_description": "이 팔로우가 프로필 페이지에 공개적으로 표시되는지 여부.",
"feed_form.retry": "재시도",
"feed_form.title": "제목",
"feed_form.title_description": "이 피드의 사용자 정의 제목. 기본값을 사용하려면 비워 두십시오.",
"feed_form.unfollow": "언팔로우",
"feed_form.update": "업데이트",
"feed_form.update_follow": "팔로우 업데이트",
"feed_form.updated": "🎉 업데이트되었습니다.",
"feed_form.view": "보기",
"feed_item.claimed_by_owner": "이 피드는",
"feed_item.claimed_by_unknown": "소유자가 주장했습니다.",
"feed_item.claimed_by_you": "귀하가 클레임한 피드",
"feed_item.claimed_feed": "클레임된 피드",
"feed_item.error_since": "오류 발생:",
"feed_item.not_publicly_visible": "프로필 페이지에 공개적으로 표시되지 않음",
"feed_view_type.articles": "기사",
"feed_view_type.audios": "오디오",
"feed_view_type.notifications": "알림",
"feed_view_type.pictures": "사진",
"feed_view_type.social_media": "소셜 미디어",
"feed_view_type.videos": "비디오",
"mark_all_read_button.auto_confirm_info": "3초 후 자동으로 확인됩니다.",
"mark_all_read_button.confirm": "확인",
"mark_all_read_button.confirm_mark_all": "{{which}}을(를) 모두 읽음으로 표시하시겠습니까?",
"mark_all_read_button.confirm_mark_all_info": "모두 읽음으로 표시하시겠습니까?",
"mark_all_read_button.mark_all_as_read": "모두 읽음으로 표시",
"mark_all_read_button.mark_as_read": "{{which}}을(를) 읽음으로 표시",
"mark_all_read_button.undo": "실행 취소",
"notify.unfollow_feed": "<FeedItem />이(가) 언팔로우 되었습니다.",
"player.back_10s": "10초 뒤로",
"player.close": "닫기",
"player.download": "다운로드",
"player.exit_full_screen": "전체 화면 종료",
"player.forward_10s": "10초 앞으로",
"player.full_screen": "전체 화면",
"player.mute": "음소거",
"player.open_entry": "항목 열기",
"player.pause": "일시 정지",
"player.play": "재생",
"player.playback_rate": "재생 속도",
"player.unmute": "음소거 해제",
"player.volume": "볼륨",
"resize.tooltip.double_click_to_collapse": "<b>더블 클릭</b>하여 축소",
"resize.tooltip.drag_to_resize": "<b>드래그</b>하여 크기 조절",
"search.empty.no_results": "결과를 찾을 수 없습니다.",
"search.group.entries": "항목",
"search.group.feeds": "피드",
"search.options.all": "전체",
"search.options.entries": "항목",
"search.options.feeds": "피드",
"search.options.search_type": "검색 유형",
"search.placeholder": "검색...",
"search.result_count_local_mode": "(로컬 모드)",
"search.tooltip.local_search": "이 검색은 로컬에 있는 데이터를 포함합니다. 최신 데이터를 포함하려면 다시 가져오기를 시도하십시오.",
"shortcuts.guide.title": "단축키 가이드라인",
"sidebar.add_more_feeds": "더 많은 피드 추가",
"sidebar.category_remove_dialog.cancel": "취소",
"sidebar.category_remove_dialog.continue": "계속",
"sidebar.category_remove_dialog.description": "이 작업은 귀하의 카테고리를 삭제하지만 포함된 피드는 유지되며 웹사이트별로 그룹화됩니다.",
"sidebar.category_remove_dialog.title": "카테고리 삭제",
"sidebar.feed_actions.claim": "클레임",
"sidebar.feed_actions.claim_feed": "피드 클레임",
"sidebar.feed_actions.copy_feed_id": "피드 ID 복사",
"sidebar.feed_actions.copy_feed_url": "피드 URL 복사",
"sidebar.feed_actions.copy_list_id": "목록 ID 복사",
"sidebar.feed_actions.copy_list_url": "목록 URL 복사",
"sidebar.feed_actions.edit": "편집",
"sidebar.feed_actions.edit_feed": "피드 편집",
"sidebar.feed_actions.feed_owned_by_you": "이 피드는 귀하가 소유하고 있습니다",
"sidebar.feed_actions.list_owned_by_you": "이 목록은 귀하가 소유하고 있습니다",
"sidebar.feed_actions.mark_all_as_read": "모두 읽음으로 표시",
"sidebar.feed_actions.navigate_to_feed": "피드로 이동",
"sidebar.feed_actions.navigate_to_list": "목록으로 이동",
"sidebar.feed_actions.open_feed_in_browser": "브라우저에서 피드 열기",
"sidebar.feed_actions.open_list_in_browser": "브라우저에서 목록 열기",
"sidebar.feed_actions.open_site_in_browser": "브라우저에서 사이트 열기",
"sidebar.feed_actions.unfollow": "언팔로우",
"sidebar.feed_actions.unfollow_feed": "피드 언팔로우",
"sidebar.feed_column.context_menu.change_to_other_view": "다른 보기로 변경",
"sidebar.feed_column.context_menu.delete_category": "카테고리 삭제",
"sidebar.feed_column.context_menu.delete_category_confirmation": "{{folderName}} 카테고리를 삭제하시겠습니까?",
"sidebar.feed_column.context_menu.mark_as_read": "읽음으로 표시",
"sidebar.feed_column.context_menu.rename_category": "카테고리 이름 변경",
"sidebar.select_sort_method": "정렬 방법 선택",
"signin.continue_with_github": "GitHub으로 계속",
"signin.continue_with_google": "Google로 계속",
"signin.sign_in_to": "로그인",
"sync_indicator.disabled": "보안상의 이유로 동기화가 비활성화되었습니다.",
"sync_indicator.offline": "오프라인",
"sync_indicator.synced": "서버와 동기화됨",
"tip_modal.amount": "금액",
"tip_modal.claim_feed": "이 피드 클레임",
"tip_modal.create_wallet": "무료로 생성",
"tip_modal.feed_owner": "피드 소유자",
"tip_modal.low_balance": "잔액이 부족하여 이 팁을 커버할 수 없습니다. 금액을 조정하십시오.",
"tip_modal.no_wallet": "아직 지갑이 없습니다. 팁을 보내려면 지갑을 생성하십시오.",
"tip_modal.tip_amount_sent": "이 금액이 저자에게 전송되었습니다.",
"tip_modal.tip_now": "지금 팁 보내기",
"tip_modal.tip_sent": "팁이 성공적으로 전송되었습니다! 지원해 주셔서 감사합니다.",
"tip_modal.tip_support": "⭐ 지원을 표시하기 위한 팁!",
"tip_modal.unclaimed_feed": "아직 아무도 이 피드를 클레임하지 않았습니다. 수신된 파워는 클레임될 때까지 안전하게 블록체인 계약에 보관됩니다.",
"user_button.account": "계정",
"user_button.achievement": "업적",
"user_button.download_desktop_app": "데스크톱 앱 다운로드",
"user_button.log_out": "로그아웃",
"user_button.power": "파워",
"user_button.preferences": "환경설정",
"user_button.profile": "프로필",
"user_profile.close": "닫기",
"user_profile.edit": "편집",
"user_profile.loading": "로딩 중",
"user_profile.share": "공유",
"user_profile.toggle_item_style": "항목 스타일 토글",
"words.achievement": "업적",
"words.add": "추가",
"words.confirm": "확인",
"words.discover": "찾아보기",
"words.email": "이메일",
"words.feeds": "피드",
"words.import": "가져오기",
"words.items": "항목",
"words.language": "언어",
"words.lists": "목록",
"words.load_archived_entries": "보관된 항목 불러오기",
"words.login": "로그인",
"words.mint": "민트",
"words.power": "파워",
"words.rss": "RSS",
"words.rss3": "RSS3",
"words.rsshub": "RSSHub",
"words.search": "검색",
"words.starred": "별표 표시됨",
"words.undo": "실행 취소",
"words.unread": "읽지 않음",
"words.user": "사용자",
"words.which.all": "모두",
"words.zero_items": "항목 없음"
}
34 changes: 34 additions & 0 deletions locales/common/ko.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
{
"app.copied_to_clipboard": "클립보드에 복사됨",
"cancel": "취소",
"close": "닫기",
"confirm": "확인",
"ok": "확인",
"quantifier.piece": "",
"time.last_night": "어젯밤",
"time.the_night_before_last": "그저께 밤",
"time.today": "오늘",
"time.yesterday": "어제",
"tips.load-lng-error": "언어 팩을 불러오지 못했습니다",
"words.actions": "액션",
"words.back": "뒤로",
"words.copy": "복사",
"words.create": "생성",
"words.edit": "편집",
"words.entry": "항목",
"words.id": "ID",
"words.items_one": "항목",
"words.items_other": "항목들",
"words.local": "로컬",
"words.manage": "관리",
"words.record": "기록",
"words.record_one": "기록",
"words.record_other": "기록들",
"words.result": "결과",
"words.result_one": "결과",
"words.result_other": "결과들",
"words.space": " ",
"words.submit": "제출",
"words.update": "업데이트",
"words.which.all": "모두"
}
Loading

0 comments on commit 2ae12c9

Please sign in to comment.