Skip to content

feat: add Korean localization for macOS - #308

Closed
sylph2nd wants to merge 1 commit into
vinzdg:mainfrom
sylph2nd:feat/korean-localization
Closed

sylph2nd wants to merge 1 commit into
vinzdg:mainfrom
sylph2nd:feat/korean-localization

Conversation

@sylph2nd

Copy link
Copy Markdown

Summary

Adds Korean (ko) as the eleventh language Codenotch can be switched to. Korean is offered in Settings › General › Language as "한국어", and every one of the catalog's 805 keys now carries a ko value. 19 of those are product names and identifiers (Opus, Sonnet, VS Code, Dock, Authorization, the OpenAI base URL, …) that stay in English, which is how every other locale files them too.

The translation follows Apple's Korean macOS vocabulary (메뉴 막대, 키체인, 손쉬운 사용, 로그인 시 열기) and keeps one Korean word per app concept: Keep open → 열어 두기, pin-to-display → 고정, Always show → 항상 표시, Watch/Critical limit → 주의/위험 기준, provider → 제공자, endpoint → 엔드포인트. Buttons and labels end in noun form, descriptions in 합쇼체 (~합니다), instructions in ~하세요. Em dashes in the source were rewritten as full stops or colons; no emoji, no exclamation marks.

After the first pass the whole set went through two review rounds: a rule-based Korean spell checker (Nara/PNU) over all values in 18 chunks, and a translationese pass that removed direct-from-English patterns (~을 통해, ~의 경우, have → 가지다, mixed politeness levels) and unified terms across strings. 42 strings changed in review; a mistranslation of "main Codex window" (a limit window, not a GUI window) was caught there.

Changes

  • Sources/Localizable.xcstrings: ko values for all 805 keys. No existing locale's value changed and key order is untouched, so the diff is additions only. Placeholders match the English key one-for-one (checked by script, 0 mismatches); the one string whose word order had to move (%lld%% of its %@ limit used.) uses positional %1$lld / %2$@ the way zh-Hans does.
  • Sources/Settings/AppLanguage.swift: new korean = "ko" case with locale, title "한국어" and the shared description.
  • Sources/Info.plist, project.yml: ko added to CFBundleLocalizations / knownRegions so the build emits ko.lproj.
  • Tests/AppLanguageTests.swift: testKoreanIsOfferedAndMapsToKo and testApplyKoreanStoresTheOverride, mirroring the Japanese cases.
  • Tests/LocalizationTests.swift: testEveryOfferedLanguageResolves expects ko in the language list.

Test Plan

  • Run test suite (make test): 1712 tests, 0 failures, 3 skipped
  • Tested on macOS (version: 27.0 (26A428))
  • UI / Notch interactions verified: Settings › Language lists 한국어; the built app contains ko.lproj/Localizable.strings with 805 entries
  • Catalog checks: placeholder parity for every ko value, byte-identical round trip of the JSON, no non-ko changes against main

Screenshots / Screen Recordings

CleanShot 2026-09-22 at 13 21 04@2x CleanShot 2026-09-22 at 13 21 17@2x CleanShot 2026-09-22 at 13 21 25@2x CleanShot 2026-09-22 at 13 21 34@2x CleanShot 2026-09-22 at 13 21 41@2x CleanShot 2026-09-22 at 13 21 50@2x CleanShot 2026-09-22 at 13 21 58@2x CleanShot 2026-09-22 at 13 22 05@2x

Notes for review

Terms where Apple's Korean UI and the official orthography disagree were resolved in favour of Apple's UI: 데스크탑 (not 데스크톱), 임계값 (not 임곗값). "피커" (picker) appears in five settings descriptions; "팝업 메뉴" is the alternative if a reviewer prefers it. The phone-pairing step "Tap Scan QR Code" is rendered as "'QR Code 스캔' 탭하기" and should be aligned with whatever the iOS companion app actually shows.

XXX of the catalog's 805 keys. The rest are product names that every
other locale also leaves in English, and they fall back to English as
CONTRIBUTING asks.

Verified: every `ko` value carries the placeholders its English key
does (checked by script, 0 mismatches), no existing locale's value
changed, and the catalog round-trips byte-identically so the diff is
additions only.

`make test` passes on macOS 27.
@sylph2nd
sylph2nd requested a review from vinzdg as a code owner September 22, 2026 04:25
@vinzdg

vinzdg commented Sep 22, 2026

Copy link
Copy Markdown
Owner

Thank you @sylph2nd — and I want to be clear this was close, because it was.

I'm taking #305. The deciding factors were not translation quality:

  1. Coverage against reality. The catalog on main was 36 keys stale against the L10n.t call sites in Sources/Settings/ReleaseNotes.swift — my own omission, including the 1.16.0 notes I wrote two days ago. Add Korean on the Mac and on Windows #305 noticed, added those keys and translated them, so it covers 842/842 of real call sites. Yours is 805/805 of the stale catalog, which is 805/842 in practice: the newest release notes would have stayed English through no fault of yours.
  2. Agreement with the Korean already shipping. windows/codenotch/src/i18n.rs already says 시스템 따르기 and ui/settings.html already says 주간 제한. Add Korean on the Mac and on Windows #305 matches those (시스템 따르기, 주간 제한, 재설정); yours uses 시스템 설정 따르기, 주간 한도, 초기화. Taking yours would have left the Mac and Windows disagreeing on the core nouns.
  3. It also completes the Windows side — tray arms, the notch card, and a CI test.

Your Korean is good, and in places I prefer it: the 해요체 -세요 register reads warmer than #305's 하십시오체 for an app that sits quietly in a menu bar, and 23 of the 37 keys I sampled were identical anyway.

Concretely: would you review #305 now that it's merged and send a follow-up for the lines you'd word differently? Register is a real choice and I'd rather have it argued than defaulted, and you clearly have the ear for it. I'd merge that.

Closing this one so the two don't drift apart, not because the work wasn't good.

@vinzdg vinzdg closed this Sep 22, 2026
@vinzdg vinzdg mentioned this pull request Sep 22, 2026
3 of 6 tasks
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.

3 participants