From 1f78ca6abaa7f9bb8e790dac9dc5dd826e171755 Mon Sep 17 00:00:00 2001 From: AKY <85772856+arksky1@users.noreply.github.com> Date: Wed, 21 Oct 2026 13:34:40 +0900 Subject: [PATCH 1/5] Add Korean support Preserve existing Korean translations and exclude unused keys and keys already proposed in open PRs. Static catalog, key, placeholder, ellipsis, shortcut and whitespace checks passed. Cargo fmt, clippy, tests, xtasks and native/web UI validation were not run: Rust tools are unavailable and installation awaits approval. See docs/korean-translation-validation.md. --- crates/ui-egui/locales/ko.toml | 141 ++++++++++++++++++++++++++ docs/korean-translation-validation.md | 25 +++++ 2 files changed, 166 insertions(+) create mode 100644 docs/korean-translation-validation.md diff --git a/crates/ui-egui/locales/ko.toml b/crates/ui-egui/locales/ko.toml index b33b36b9..e7ad4f08 100644 --- a/crates/ui-egui/locales/ko.toml +++ b/crates/ui-egui/locales/ko.toml @@ -1641,6 +1641,122 @@ status = "draft — needs native review" "⌘ click" = "⌘ 클릭" "⌘ scroll" = "⌘ 스크롤" "⌥ drag" = "⌥ 드래그" +"A responsive product page: hero, features, figures, a quote and a footer" = "대표 영역, 기능, 수치, 인용문, 푸터로 구성된 반응형 제품 페이지" +"A title, an agenda, a big figure, a chart and a closing slide" = "제목, 목차, 주요 수치, 차트, 마무리 슬라이드" +"A to Z" = "이름 오름차순" +"Adding to {name}" = "{name}에 추가 중" +"All the fonts this file uses are installed" = "이 파일에 사용된 모든 글꼴이 설치되어 있습니다." +"Alphabetical" = "가나다순" +"An analytics screen on a grid: figures, charts drawn from vectors and a table" = "수치, 벡터 차트, 표를 격자로 배치한 분석 화면" +"Apps" = "앱" +"Apr" = "4월" +"Aug" = "8월" +"Bottom padding" = "아래쪽 안쪽 여백" +"Bound to {name}. Click to detach the variable." = "{name}에 연결되어 있습니다. 클릭하면 변수 연결을 해제합니다." +"Checking the fonts installed on this computer…" = "이 컴퓨터에 설치된 글꼴 확인 중…" +"Colour and text styles, Light and Dark variables, buttons, inputs and cards" = "색상 및 텍스트 스타일, 밝게·어둡게 변수, 버튼, 입력란, 카드" +"Convert to frame" = "프레임으로 변환" +"Convert to section" = "섹션으로 변환" +"Couldn't download the variables" = "변수를 다운로드할 수 없습니다." +"Created" = "만든 날짜" +"Dashboard" = "대시보드" +"Date created" = "만든 날짜" +"Dec" = "12월" +"Design system starter" = "디자인 시스템 시작 키트" +"Draw a frame" = "프레임 그리기" +"Drop a .figcraft, .fig, .json, .svg or image file." = ".figcraft, .fig, .json, .svg 또는 이미지 파일을 놓으세요." +"Drop to import" = "놓아서 가져오기" +"Drop to open" = "놓아서 열기" +"Edited {when}" = "{when} 편집" +"Export frames and layers as PNG, JPG, SVG or PDF" = "프레임과 레이어를 PNG, JPG, SVG 또는 PDF로 내보내기" +"Feb" = "2월" +"File not found" = "파일을 찾을 수 없습니다." +"Four screens of a trail app with components and a prototype flow" = "컴포넌트와 프로토타입 흐름이 포함된 트레일 앱 화면 4개" +"Getting started" = "시작하기" +"Greyscale components and two example screens to sketch a flow with" = "흐름을 구상할 수 있는 회색 음영 컴포넌트와 예시 화면 2개" +"Hide these tips (Getting started in the Help menu shows them again)" = "팁 숨기기(도움말 메뉴의 시작하기에서 다시 표시)" +"Hide when publishing" = "게시할 때 숨기기" +"Icon components on a 24 px grid with keylines and a size preview" = "키라인과 크기 미리 보기가 포함된 24px 격자의 아이콘 컴포넌트" +"Icon set starter" = "아이콘 세트 시작 키트" +"Individual padding" = "개별 안쪽 여백" +"Interface size" = "인터페이스 크기" +"Jan" = "1월" +"Jul" = "7월" +"Jun" = "6월" +"Kits" = "키트" +"Landing page" = "랜딩 페이지" +"Last modified" = "마지막 수정" +"Left padding" = "왼쪽 안쪽 여백" +"Link frames on the Prototype tab, then present the flow" = "프로토타입 탭에서 프레임을 연결한 다음 흐름을 실행해 보세요." +"Make a component" = "컴포넌트 만들기" +"Mar" = "3월" +"May" = "5월" +"Missing fonts" = "없는 글꼴" +"Mobile app" = "모바일 앱" +"Newest first" = "최신순" +"No files or templates match your search" = "검색 조건에 맞는 파일이나 템플릿이 없습니다." +"No other pages" = "다른 페이지 없음" +"No templates match your search" = "검색 조건에 맞는 템플릿이 없습니다." +"Nov" = "11월" +"Oct" = "10월" +"Oldest first" = "오래된순" +"One announcement in five common sizes: square, portrait, story, link and banner" = "하나의 공지를 정사각형, 세로형, 스토리, 링크, 배너의 일반적인 5가지 크기로 구성" +"Opening the file…" = "파일 여는 중…" +"Opening {n} files as new files" = { other = "파일 {n}개를 새 파일로 여는 중" } +"Order" = "순서" +"Other" = "기타" +"Pick the Frame tool, then drag on the canvas or choose a device size" = "프레임 도구를 선택한 뒤 캔버스에서 드래그하거나 기기 크기를 고르세요." +"Plugin" = "플러그인" +"Plugins & widgets" = "플러그인 및 위젯" +"Presentation slides" = "프레젠테이션 슬라이드" +"Playground" = "실험 공간" +"Relative to your system's display scaling (100% is the system's own size). Document zoom is separate." = "시스템 디스플레이 배율을 기준으로 합니다(100%는 시스템 기본 크기). 문서 확대/축소는 별도입니다." +"Remove from recents" = "최근 목록에서 제거" +"Reorder selection" = "선택 항목 순서 변경" +"Right padding" = "오른쪽 안쪽 여백" +"Search templates" = "템플릿 검색" +"See all templates" = "모든 템플릿 보기" +"Select layers and they space themselves as their content changes" = "레이어를 선택하면 내용 변경에 맞춰 간격이 자동으로 조정됩니다." +"Search files and templates" = "파일 및 템플릿 검색" +"Search results" = "검색 결과" +"Search pages" = "페이지 검색" +"Sep" = "9월" +"Share with a code" = "코드로 공유" +"Show all templates" = "모든 템플릿 표시" +"Show in Explorer" = "탐색기에서 보기" +"Show in Finder" = "Finder에서 보기" +"Show in folder" = "폴더에서 보기" +"Social and slides" = "소셜 및 슬라이드" +"Social post sizes" = "소셜 게시물 크기" +"Sort by" = "정렬 기준" +"Sort by {column}" = "{column} 기준 정렬" +"Start from a template" = "템플릿으로 시작" +"Start sharing with the Share button, then pass on the code it gives" = "공유 버튼으로 공유를 시작한 뒤 표시되는 코드를 전달하세요." +"Templates" = "템플릿" +"The destination document is unavailable. Nothing was imported." = "대상 문서를 사용할 수 없습니다. 아무것도 가져오지 않았습니다." +"The destination document was closed. Nothing was imported." = "대상 문서가 닫혔습니다. 아무것도 가져오지 않았습니다." +"The destination page was removed. Nothing was imported." = "대상 페이지가 삭제되었습니다. 아무것도 가져오지 않았습니다." +"The window is too small for {size}%, so the interface is drawn at {drawn}%. Make the window larger to use {size}%." = "창이 너무 작아 {size}% 대신 {drawn}%로 표시합니다. {size}%를 사용하려면 창을 키우세요." +"This file is too large to join here (up to {mb} MB)" = "이 파일은 여기에 추가하기에 너무 큽니다(최대 {mb}MB)." +"This file uses fonts that aren't installed on this computer. Their text is drawn in a fallback font until you install them." = "이 파일은 이 컴퓨터에 없는 글꼴을 사용합니다. 해당 글꼴을 설치할 때까지 대체 글꼴로 표시합니다." +"Top padding" = "위쪽 안쪽 여백" +"Try another search, or browse templates." = "다른 검색어를 입력하거나 템플릿을 둘러보세요." +"Try another word, or look at every kind." = "다른 단어를 검색하거나 모든 종류를 확인하세요." +"Turn a layer into a component, reuse it, and change every copy at once" = "레이어를 컴포넌트로 만들고 재사용하여 모든 사본을 한 번에 변경하세요." +"Use your browser's zoom to change the interface size." = "인터페이스 크기는 브라우저의 확대/축소로 변경하세요." +"Uses variables: each layer shows them in its own mode" = "변수 사용: 각 레이어의 모드에 따라 표시합니다." +"Websites" = "웹사이트" +"What you try here changes this preview and the code below, not the file" = "여기서 변경한 내용은 미리 보기와 아래 코드에만 적용되며 파일은 바뀌지 않습니다." +"Widget" = "위젯" +"Wireframe kit" = "와이어프레임 키트" +"Z to A" = "이름 내림차순" +"just now" = "방금" +"only in a text style or variable" = "텍스트 스타일 또는 변수에서만 사용" +"slot layers without a matching slot property were imported as frames" = "일치하는 슬롯 속성이 없는 슬롯 레이어를 프레임으로 가져왔습니다." +"yesterday" = "어제" +"{month} {day}, {year}" = "{year}년 {month} {day}일" +"{n} text layers" = { other = "텍스트 레이어 {n}개" } +"{percent}%" = "{percent}%" [commands] "align.bottom" = "아래쪽 정렬" @@ -2199,6 +2315,24 @@ status = "draft — needs native review" "widget.list" = "위젯 목록" "window.focus" = "창을 맨 앞으로 가져오기" "window.new" = "새 창" +"arrange.reorder" = "선택 항목 순서 변경" +"component.hideWhenPublishing" = "게시할 때 숨기기" +"object.convertToGroup" = "그룹으로 변환" +"object.convertToFrame" = "프레임으로 변환" +"object.convertToSection" = "섹션으로 변환" +"text.rescanFonts" = "설치된 글꼴 다시 검색" +"text.loadFont" = "글꼴 파일 불러오기" +"view.outlinesHiddenLayers" = "윤곽선에 숨겨진 레이어 포함" +"view.outlinesObjectBounds" = "윤곽선에 개체 경계 포함" +"view.panelWidths" = "패널 너비 초기화" +"pref.uiScale" = "인터페이스 크기" +"help.gettingStarted" = "시작하기" +"style.bind" = "스타일에 변수 연결" +"component.playground" = "컴포넌트 실험실" +"text.missingFonts" = "누락된 글꼴" +"text.refit" = "글꼴에 맞게 텍스트 조정" +"template.list" = "템플릿 목록" +"file.newFromTemplate" = "템플릿에서 새로 만들기" [menu] "bool.exclude" = "제외" @@ -2230,3 +2364,10 @@ status = "draft — needs native review" "view.themeDark" = "다크" "view.themeLight" = "라이트" "view.themeSystem" = "시스템 따르기" +"file.newFromTemplate" = "템플릿에서 새로 만들기…" +"view.outlinesHiddenLayers" = "숨겨진 레이어 포함" +"view.outlinesObjectBounds" = "개체 경계 포함" +"view.panelWidths" = "패널 너비 초기화" +"text.missingFonts" = "누락된 글꼴…" +"component.hideWhenPublishing" = "게시할 때 숨기기" +"help.gettingStarted" = "시작하기" diff --git a/docs/korean-translation-validation.md b/docs/korean-translation-validation.md new file mode 100644 index 00000000..ad5cdcec --- /dev/null +++ b/docs/korean-translation-validation.md @@ -0,0 +1,25 @@ +# Korean translation validation + +Catalog additions against `d9c924c3ba7114dff9141c667aec56d3764f3af9`: **141** entries. Existing Korean entries are unchanged. The provided translation data was checked against the current Rust sources; candidate keys with no matching production literal were excluded. No new translations were generated. + +## Static checks + +- Catalog structure, unique keys, original key preservation, named placeholders, trailing ellipses, and explicit shortcut tokens checked with Python 3.14.5. +- FigCraft TOML was parsed with the standard TOML parser; Korean plural entries keep only `other`. +- New entries have source-location evidence in the local audit; dynamic labels use the existing translation paths. +- `git diff --check` passed. + +## Checks not run + +Cargo, rustc, and rustfmt are unavailable in this environment. Rust installation is awaiting user approval; no tools were installed. The following checks have **not** been run: + +- `cargo test -p figcraft-ui-egui` +- `cargo fmt --all --check` +- `cargo clippy -p figcraft-ui-egui --all-targets -- -D warnings` +- `cargo xtask layers`, `cargo xtask assets`, `cargo xtask wasm`, and the full `cargo xtask ci` gate +- Native and web UI rendering, layout, runtime language switching, and font/glyph coverage + +## Candidate filtering + +- Excluded 0 supplied candidate keys without a matching production source literal. +- Excluded 0 supplied keys already proposed in open Korean translation PRs. From 9cbe31221a81cf058ff72e1e1a928a5cfee2fe3b Mon Sep 17 00:00:00 2001 From: AKY <85772856+arksky1@users.noreply.github.com> Date: Wed, 21 Oct 2026 13:56:38 +0900 Subject: [PATCH 2/5] Record Korean translation coverage checks Use only root-supplied Korean translations; overlapping unmerged PRs are not dependencies. Preserve existing main translations. Static catalog, placeholder and source-lookup checks passed. Rust and native/web UI tests were not run because Rust installation remains awaiting approval. --- docs/korean-translation-validation.md | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/docs/korean-translation-validation.md b/docs/korean-translation-validation.md index ad5cdcec..8b679261 100644 --- a/docs/korean-translation-validation.md +++ b/docs/korean-translation-validation.md @@ -1,25 +1,30 @@ # Korean translation validation -Catalog additions against `d9c924c3ba7114dff9141c667aec56d3764f3af9`: **141** entries. Existing Korean entries are unchanged. The provided translation data was checked against the current Rust sources; candidate keys with no matching production literal were excluded. No new translations were generated. +Catalog additions against `d9c924c3ba7114dff9141c667aec56d3764f3af9`: **141** entries. Every existing Korean entry is preserved. Only translations supplied by the root task were used. + +## Independent coverage + +- Restored 0 root-supplied keys previously omitted because an unmerged third-party PR also proposed them. These keys are included in this branch; no unmerged PR is required to supply them. +- The third-party PR patches were used to identify overlap, not as translation sources. +- The correction ZIP contains 153 direct-lookup mappings. All 153 keys and root-provided values were verified against their current source locations. +- Correction ZIP SHA256: `a97cb9c22e110d177ca7a5f0a70db976aee34056ae030fca2c3d9a0e884f755f`. ## Static checks -- Catalog structure, unique keys, original key preservation, named placeholders, trailing ellipses, and explicit shortcut tokens checked with Python 3.14.5. -- FigCraft TOML was parsed with the standard TOML parser; Korean plural entries keep only `other`. -- New entries have source-location evidence in the local audit; dynamic labels use the existing translation paths. +- Catalog syntax/table shape, unique keys, source keys, named placeholders, trailing ellipses, explicit shortcut tokens, and preservation of all existing Korean entries passed. +- Tokenized source audit: 1449 unique direct translation lookup keys; 0 word-bearing keys still missing from this catalog. +- Recorded 153 dynamic lookup sites for source inspection. Variable document text, file names, and machine identifiers retain their existing behavior. +- Finite dynamic checks passed: PhotoCraft menu catalog (632 keys), VectorCraft render-site table (21 keys), FigCraft English UI (1,747 keys), required command reference (574 keys), and menu reference (31 keys). All accepted root-supplied context/id/plural keys resolve. - `git diff --check` passed. ## Checks not run -Cargo, rustc, and rustfmt are unavailable in this environment. Rust installation is awaiting user approval; no tools were installed. The following checks have **not** been run: +Cargo, rustc, and rustfmt are unavailable. Rust installation remains awaiting user approval; no tools were installed. The following were not run: - `cargo test -p figcraft-ui-egui` - `cargo fmt --all --check` - `cargo clippy -p figcraft-ui-egui --all-targets -- -D warnings` -- `cargo xtask layers`, `cargo xtask assets`, `cargo xtask wasm`, and the full `cargo xtask ci` gate -- Native and web UI rendering, layout, runtime language switching, and font/glyph coverage +- `cargo xtask layers`, `cargo xtask assets`, `cargo xtask wasm`, and `cargo xtask ci` +- Native/web UI rendering, layout, runtime switching, and font/glyph coverage -## Candidate filtering - -- Excluded 0 supplied candidate keys without a matching production source literal. -- Excluded 0 supplied keys already proposed in open Korean translation PRs. +Static checks do not replace runtime verification or prove coverage of arbitrary runtime-generated messages. From ae35d1d794f5818efa3485b4216e8edbde1ca895 Mon Sep 17 00:00:00 2001 From: bflatastic Date: Sat, 24 Oct 2026 10:10:52 +0700 Subject: [PATCH 3/5] #966: drop the translation-validation notes (not part of the change) --- docs/korean-translation-validation.md | 30 --------------------------- 1 file changed, 30 deletions(-) delete mode 100644 docs/korean-translation-validation.md diff --git a/docs/korean-translation-validation.md b/docs/korean-translation-validation.md deleted file mode 100644 index 8b679261..00000000 --- a/docs/korean-translation-validation.md +++ /dev/null @@ -1,30 +0,0 @@ -# Korean translation validation - -Catalog additions against `d9c924c3ba7114dff9141c667aec56d3764f3af9`: **141** entries. Every existing Korean entry is preserved. Only translations supplied by the root task were used. - -## Independent coverage - -- Restored 0 root-supplied keys previously omitted because an unmerged third-party PR also proposed them. These keys are included in this branch; no unmerged PR is required to supply them. -- The third-party PR patches were used to identify overlap, not as translation sources. -- The correction ZIP contains 153 direct-lookup mappings. All 153 keys and root-provided values were verified against their current source locations. -- Correction ZIP SHA256: `a97cb9c22e110d177ca7a5f0a70db976aee34056ae030fca2c3d9a0e884f755f`. - -## Static checks - -- Catalog syntax/table shape, unique keys, source keys, named placeholders, trailing ellipses, explicit shortcut tokens, and preservation of all existing Korean entries passed. -- Tokenized source audit: 1449 unique direct translation lookup keys; 0 word-bearing keys still missing from this catalog. -- Recorded 153 dynamic lookup sites for source inspection. Variable document text, file names, and machine identifiers retain their existing behavior. -- Finite dynamic checks passed: PhotoCraft menu catalog (632 keys), VectorCraft render-site table (21 keys), FigCraft English UI (1,747 keys), required command reference (574 keys), and menu reference (31 keys). All accepted root-supplied context/id/plural keys resolve. -- `git diff --check` passed. - -## Checks not run - -Cargo, rustc, and rustfmt are unavailable. Rust installation remains awaiting user approval; no tools were installed. The following were not run: - -- `cargo test -p figcraft-ui-egui` -- `cargo fmt --all --check` -- `cargo clippy -p figcraft-ui-egui --all-targets -- -D warnings` -- `cargo xtask layers`, `cargo xtask assets`, `cargo xtask wasm`, and `cargo xtask ci` -- Native/web UI rendering, layout, runtime switching, and font/glyph coverage - -Static checks do not replace runtime verification or prove coverage of arbitrary runtime-generated messages. From 4667a7dbd261fffd262bf61141a0d8675d3d1706 Mon Sep 17 00:00:00 2001 From: bflatastic Date: Sat, 24 Oct 2026 10:10:53 +0700 Subject: [PATCH 4/5] #966: drop the five [menu] wordings that read like their command ([commands] covers them) --- crates/ui-egui/locales/ko.toml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/crates/ui-egui/locales/ko.toml b/crates/ui-egui/locales/ko.toml index d923932b..bbce75eb 100644 --- a/crates/ui-egui/locales/ko.toml +++ b/crates/ui-egui/locales/ko.toml @@ -2417,10 +2417,5 @@ status = "draft — needs native review" "view.themeDark" = "다크" "view.themeLight" = "라이트" "view.themeSystem" = "시스템 따르기" -"file.newFromTemplate" = "템플릿에서 새로 만들기…" "view.outlinesHiddenLayers" = "숨겨진 레이어 포함" "view.outlinesObjectBounds" = "개체 경계 포함" -"view.panelWidths" = "패널 너비 초기화" -"text.missingFonts" = "누락된 글꼴…" -"component.hideWhenPublishing" = "게시할 때 숨기기" -"help.gettingStarted" = "시작하기" From 420e704eee7854535c0fa370c0be7d099a7d95e5 Mon Sep 17 00:00:00 2001 From: bflatastic Date: Mon, 26 Oct 2026 22:25:10 +0700 Subject: [PATCH 5/5] #966: one Templates entry, and the drop hint names .sketch, as main's catalogs do --- crates/ui-egui/locales/ko.toml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/crates/ui-egui/locales/ko.toml b/crates/ui-egui/locales/ko.toml index 4406c96b..5a976f97 100644 --- a/crates/ui-egui/locales/ko.toml +++ b/crates/ui-egui/locales/ko.toml @@ -1742,7 +1742,7 @@ status = "draft — needs native review" "Dec" = "12월" "Design system starter" = "디자인 시스템 시작 키트" "Draw a frame" = "프레임 그리기" -"Drop a .figcraft, .fig, .json, .svg or image file." = ".figcraft, .fig, .json, .svg 또는 이미지 파일을 놓으세요." +"Drop a .figcraft, .fig, .sketch, .json, .svg or image file." = ".figcraft, .fig, .sketch, .json, .svg 또는 이미지 파일을 놓으세요." "Drop to import" = "놓아서 가져오기" "Drop to open" = "놓아서 열기" "Edited {when}" = "{when} 편집" @@ -1810,7 +1810,6 @@ status = "draft — needs native review" "Sort by {column}" = "{column} 기준 정렬" "Start from a template" = "템플릿으로 시작" "Start sharing with the Share button, then pass on the code it gives" = "공유 버튼으로 공유를 시작한 뒤 표시되는 코드를 전달하세요." -"Templates" = "템플릿" "The destination document is unavailable. Nothing was imported." = "대상 문서를 사용할 수 없습니다. 아무것도 가져오지 않았습니다." "The destination document was closed. Nothing was imported." = "대상 문서가 닫혔습니다. 아무것도 가져오지 않았습니다." "The destination page was removed. Nothing was imported." = "대상 페이지가 삭제되었습니다. 아무것도 가져오지 않았습니다."