Skip to content

Add Korean on the Mac and on Windows - #305

Merged
vinzdg merged 2 commits into
vinzdg:mainfrom
progh2:add-korean
Sep 22, 2026
Merged

vinzdg merged 2 commits into
vinzdg:mainfrom
progh2:add-korean

Conversation

@progh2

@progh2 progh2 commented Sep 22, 2026

Copy link
Copy Markdown
Contributor

Summary

Korean joins the Mac catalog and the Language picker, and the Windows port's card, tray and Settings finish the Korean they had started. Same shape as #250 (Traditional Chinese on both platforms), with the release-note keys filled in the way #252 did for Japanese.

Every key in Sources/Localizable.xcstrings now has a Korean value — 842 of 842 — including 37 release-note strings (1.12 through 1.14) that had no catalog entry at all.

Changes

The Mac

  • ko added to CFBundleLocalizations; AppLanguage offers 한국어, following Add Traditional Chinese on the Mac and on Windows #250.
  • A Korean value for every catalog key, state: translated.
  • Korean cases in AppLanguageTests, CatalogCoverageTests, CatalogFormatTests and LocalizationTests, mirroring the Traditional Chinese ones.

Windows

  • notch.html gets a Korean TEXT, PATTERNS and UI table, as Ukrainian, Russian and both Chinese already have, so a Korean machine no longer shows a translated tray above an English card.
  • The card's "Updated 20m ago" line becomes a per-language UI formatter beside the reset ones, because Korean puts the time first (20분 전에 마지막 업데이트됨) and a dictionary prefix cannot. The other languages keep their word order; their Updated dictionary rows move into the formatter.
  • i18n.rs fills in refresh_now and open_host; traymenu.rs fills in Current session, Included usage, API usage, the limit names and the reset countdowns. The comments saying the Mac catalog had no Korean are gone, because it now does.
  • settings.html gets its last three untranslated strings, and the existing Korean is brought in line with the Mac catalog (reading is 측정값 throughout, Off is 끄기, Medium is 중간).
  • windows/scripts/test-ko-i18n.cjs drives the card's own textCopy and UI formatters in Korean; it runs in the Windows workflow after the existing UI checks.

Translation notes

  • Terms follow the Korean the Windows tray already spoke — 후크 for hook, 새로 고침 for refresh, 설정… and 종료 — and Apple's Korean conventions elsewhere (재설정 for reset, 사용자 지정 for custom).
  • Watch limit and Critical limit read 주의 표시 기준 / 위험 표시 기준 ("display threshold for caution / danger"): they name the points where a ring turns amber and red, not a quota — the same reading Japanese (しきい値) and Ukrainian (поріг) took.
  • Buttons and menu items are short noun forms (새로 고침, 폴더 열기); descriptions end in ~합니다, instructions in ~하십시오, as the existing Windows Korean does.
  • Product and language names stay exactly as written: Claude Code, Codex, Cursor, Ollama, LM Studio, Kimi, Ghostty, Deutsch, 日本語, 简体中文, Українська. Units (tok/s, RAM, VRAM) stay too.
  • The 80% alert body uses positional specifiers (%2$@ 한도의 %1$lld%%를 사용했습니다.), as the Traditional Chinese one does since 1.13.1.

What this does not touch

Only ko is added. No other language's value is modified — verified at the JSON level, along with the existing key set and its order (the 37 new keys are appended after the last existing one).

Test Plan

  • Run test suite (make test-ci) — not run: this was prepared on Linux without Xcode. The four new Mac tests are written against the catalog values with the same helpers Add Traditional Chinese on the Mac and on Windows #250's tests use; CI will be the first to run them.
  • Tested on macOS (version: ) — not available here.
  • UI / Notch interactions verified — not on the Mac; on Windows the card was exercised through its own script (below), not on a live machine.
  • Every Korean value checked mechanically against its English source: matching %@ / %lld / %% counts (positional forms normalised), no empty strings, state: translated, and no change to any other language's value or to the key order.
  • node scripts/check-ui-scripts.mjs, node scripts/test-claude-auth-ui.cjs, node --test scripts/test-ko-i18n.cjs pass.
  • i18n and traymenu unit tests pass (17/17, including the new Korean ones and the card-and-tray agreement check) when the two modules are compiled on their own; the full cargo test needs a Windows toolchain, so the Windows workflow will be the first to run it.

Screenshots / Screen Recordings

None — no layout change; Korean strings only. Happy to add screenshots from a Korean Mac if a reviewer wants to see any pane in particular.

🤖 Generated with Claude Code

progh2 and others added 2 commits September 22, 2026 09:04
Every key in the catalog now has a Korean value — 842 of 842, including
37 release-note strings that had no catalog entry at all. Korean joins
the Language picker as 한국어 and the bundle's localizations.

Terms follow the Korean the Windows tray already spoke (후크, 새로 고침,
설정…, 종료) and macOS conventions elsewhere. Watch limit and Critical
limit read 주의 표시 기준 / 위험 표시 기준: they are the points where a
ring changes colour, not a quota. Product names, units and language
names stay as written.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The hover card gets a Korean table like the ones Ukrainian, Russian and
both Chinese already have, so a Korean machine no longer shows a
translated tray above an English card. The tray fills in the keys
Korean was missing — Refresh now, Open %@, Current session, Included
usage, API usage, limit names, reset countdowns — and Settings gets its
last three untranslated strings.

The card's "Updated 20m ago" line moves from a dictionary prefix to a
per-language formatter, beside the reset ones: Korean puts the time
first (20분 전에 마지막 업데이트됨), which a prefix cannot say. The
other languages keep their word order.

Existing Korean is brought in line with the Mac catalog: reading is
측정값 throughout, Off is 끄기, Medium is 중간.

A node test drives the card's own lookup and formatters in Korean, and
the tray test checks that card and tray agree on every shared name.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@progh2
progh2 requested a review from vinzdg as a code owner September 22, 2026 01:20
@vinzdg
vinzdg merged commit 53033ae into vinzdg:main Sep 22, 2026
vinzdg added a commit that referenced this pull request Sep 22, 2026
The catalog conflict with #305 was resolved structurally rather than by hand:
the post-Korean catalog kept its order and the 590 uz values were grafted onto
it, so neither language's entries moved.

Two things of mine are in this commit rather than beside it:

- Uzbek orthography. Uzbek Latin writes oʻ and gʻ with U+02BB and the glottal
  stop with U+02BC; an ASCII apostrophe is neither and reads as a typewriter
  mark. Normalised 233 values and the language's own name in the picker.
- Four full-screen fold tests now use the pointer check this file already
  provides. handleActiveSpaceOrAppChange deliberately refuses to fold out from
  under the cursor, so those tests assert nothing when the notch has landed
  beneath it — which depends on what earlier tests left in Preferences, not on
  the test. They passed alone and failed in the full suite once 12 tests were
  added ahead of them.

Thanks @SunnatilloDev.
@vinzdg

vinzdg commented Sep 22, 2026

Copy link
Copy Markdown
Owner

Merged as 53033ae. Thanks @progh2 — and thank you particularly for catching that the catalog was 36 keys behind the L10n.t literals in ReleaseNotes.swift. That gap was mine: I added the 1.16.0 notes on Saturday and never added the catalog entries, so they were English in every language. Your PR is the reason it's fixed, and it's why Korean is the only locale at 842/842 of real call sites rather than of a stale snapshot.

The rest held up on inspection: the positional %2$@ 한도의 %1$lld%% is exactly right, the nouns match the Korean already shipping in the Windows tray (시스템 따르기, 주간 제한, 재설정) so the two ports stay in step, and moving Updated out of the per-language TEXT tables into UI.updated() formatters — because Korean puts the time first — is careful work rather than a shortcut. windows/scripts/test-ko-i18n.cjs wired into CI is a nice touch.

Two things you should know happened around this merge:

  • I closed feat: add Korean localization for macOS #308, a second Korean PR opened a few hours before yours by @sylph2nd. Neither of you knew about the other. His register (해요체 -세요) reads warmer than yours in places and I've asked him to send a follow-up on top of what you landed, so don't be surprised by a wording PR.
  • Merging feat: add Brazilian Portuguese localization #300 (Brazilian Portuguese for Windows) on top of yours, I resolved a notch.html conflict badly and dropped the closing brace of TEXT.ko and the bracket of PATTERNS.ko — the pt-BR tables ended up nested inside the Korean ones and the page stopped parsing. check-ui-scripts.mjs caught it before it went anywhere. Fixed in 0f9e3a1, and I verified structurally that both locales are present in TEXT, PATTERNS and UI with their own key counts. Mentioning it because it was my error on your file.

One small thing I left alone: you changed Windows Medium from 보통 to 중간 for consistency with your Mac choice. Apple's Korean convention is 보통; either reads fine, so I've left your call standing rather than overrule it.

1,734 tests green, all four CI workflows green.

@vinzdg vinzdg mentioned this pull request Sep 22, 2026
3 tasks done
@progh2

progh2 commented Sep 22, 2026

Copy link
Copy Markdown
Contributor Author

Thanks for merging, @vinzdg, and for the thoughtful notes — the context on #308, the conflict fix, and Medium were all good to know.
On register: I agree 해요체 (~세요) is a fine choice too, and I'd be glad to see @sylph2nd's follow-up land. Happy to review it if useful.

vinzdg added a commit that referenced this pull request Sep 23, 2026
Adds the release note's own strings to the catalog this time. 1.16.0's notes
went out as L10n.t literals with no catalog entries, so they were English in
every language until #305 noticed.
abhishekthakur7 pushed a commit to abhishekthakur7/codenotch that referenced this pull request Sep 28, 2026
Also adds the 37 release-note keys the catalog was missing against
ReleaseNotes.swift, so Korean covers every real call site rather than a
stale snapshot of the file. Thanks @progh2.
abhishekthakur7 pushed a commit to abhishekthakur7/codenotch that referenced this pull request Sep 28, 2026
The catalog conflict with vinzdg#305 was resolved structurally rather than by hand:
the post-Korean catalog kept its order and the 590 uz values were grafted onto
it, so neither language's entries moved.

Two things of mine are in this commit rather than beside it:

- Uzbek orthography. Uzbek Latin writes oʻ and gʻ with U+02BB and the glottal
  stop with U+02BC; an ASCII apostrophe is neither and reads as a typewriter
  mark. Normalised 233 values and the language's own name in the picker.
- Four full-screen fold tests now use the pointer check this file already
  provides. handleActiveSpaceOrAppChange deliberately refuses to fold out from
  under the cursor, so those tests assert nothing when the notch has landed
  beneath it — which depends on what earlier tests left in Preferences, not on
  the test. They passed alone and failed in the full suite once 12 tests were
  added ahead of them.

Thanks @SunnatilloDev.
abhishekthakur7 pushed a commit to abhishekthakur7/codenotch that referenced this pull request Sep 28, 2026
Adds the release note's own strings to the catalog this time. 1.16.0's notes
went out as L10n.t literals with no catalog entries, so they were English in
every language until vinzdg#305 noticed.
abhishekthakur7 pushed a commit to abhishekthakur7/codenotch that referenced this pull request Sep 28, 2026
Also adds the 37 release-note keys the catalog was missing against
ReleaseNotes.swift, so Korean covers every real call site rather than a
stale snapshot of the file. Thanks @progh2.
abhishekthakur7 pushed a commit to abhishekthakur7/codenotch that referenced this pull request Sep 28, 2026
The catalog conflict with vinzdg#305 was resolved structurally rather than by hand:
the post-Korean catalog kept its order and the 590 uz values were grafted onto
it, so neither language's entries moved.

Two things of mine are in this commit rather than beside it:

- Uzbek orthography. Uzbek Latin writes oʻ and gʻ with U+02BB and the glottal
  stop with U+02BC; an ASCII apostrophe is neither and reads as a typewriter
  mark. Normalised 233 values and the language's own name in the picker.
- Four full-screen fold tests now use the pointer check this file already
  provides. handleActiveSpaceOrAppChange deliberately refuses to fold out from
  under the cursor, so those tests assert nothing when the notch has landed
  beneath it — which depends on what earlier tests left in Preferences, not on
  the test. They passed alone and failed in the full suite once 12 tests were
  added ahead of them.

Thanks @SunnatilloDev.
abhishekthakur7 pushed a commit to abhishekthakur7/codenotch that referenced this pull request Sep 28, 2026
Adds the release note's own strings to the catalog this time. 1.16.0's notes
went out as L10n.t literals with no catalog entries, so they were English in
every language until vinzdg#305 noticed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants