Conversation
`ko` joined `UI_LOCALES` in the core layer, and `ONBOARDING_COPY_BY_LOCALE` is annotated `UiCatalog<OnboardingCatalog>`, so the renderer stopped typechecking at that catalog. Add the Korean branch after `en`, the order the core catalogs already use. The translation follows the English values rather than the key names. `Enable` becomes `켜기`: the screen `needs_model` opens (`settings/provider-connection-detail.tsx`) is a real switch, so no separate wording for non-toggle actions is needed. `credentials` becomes `인증 정보`, keeping the `인증` family of the core `인증 실패`. `retired` becomes `지원 종료` so it stays distinct from `removed` (`제거`) where `blocked:all_connections_retired` uses both in one body. `Try again later.` is a request after a failure and takes the `…해 주세요` form. Verified with `tsc -p tsconfig.renderer.json --noEmit` in `apps/desktop` before and after the change: the only difference is the missing-`ko` TS2741 on this catalog going away, and no error is added. The tree still reports unresolved `@maka/ui` imports and the other catalogs without `ko`, which are left to their own commits. biome check is clean on the file. Tests were not run. Refs apache#3977 Generated-by: Claude Code
Add the Korean branch to `PERMISSION_CENTER_COPY` after `en`. The
catalog closes with `satisfies UiCatalog<PermissionCenterCopy>`, so the
missing `ko` surfaced twice: the TS2741 on the literal and a TS7053 in
`getPermissionCenterCopy`, whose `[locale]` index had no `ko` member.
Both go away with this branch.
macOS surface names use the Korean names System Settings shows, since
the user has to find them there: `시스템 설정`, `개인정보 보호 및 보안`,
`손쉬운 사용`, `자동화(Apple Events)`, and `화면 및 시스템 오디오 녹음`.
The last is what macOS 15 and later list for the pane
`Privacy_ScreenCapture` opens; the English `Screen Recording` is the
older name. The zh branches already localize these labels.
A few English words are split so they stay distinct on this page:
`configuration` is `구성` against `Settings` as `설정`, `action` is `동작`
against `task` as `작업`, and `revoke` is `철회` against `Cancel` as
`취소`. `capability` has no single rendering; the page title and
section read `권한과 기능 상태` / `기능 상태`, apart from `feature`
(`기능`) and `readiness` (`준비 상태`). `Status unavailable` becomes
`상태를 알 수 없음`, because the state could not be read, not because
the permission is unavailable.
One template changes shape: the unselected branch of
`summaryFilterAria` drops `.toLowerCase()` and reads
`${label} 권한만 표시, ${count}개`. Korean has no case, and the zh
branches already use `${label}` directly. The placeholders are
unchanged.
Verified with `tsc -p tsconfig.renderer.json --noEmit` in
`apps/desktop` before and after the change: the two errors above are
the only difference, and no error is added. The `ko` branch mirrors
the `en` branch line for line with the same 114 string literals, and it
references no `EN_*` constant. biome check is clean on the file. Tests
were not run.
Refs apache#3977
Generated-by: Claude Code
This catalog does not inline its locales. Each one is a module-level
constant collected into `COPY`, which closes with
`satisfies UiCatalog<ShellRemainingCopy>`. Add `koCopy` after `enCopy`,
typed the same way so a missing key fails at its declaration, and
register it as `ko` after `en`. The missing `ko` had surfaced twice: the
TS2741 on `COPY` and a TS7053 in `getShellRemainingCopy`. Both go away.
Scheduled-task toast titles keep the short `작업` where English says
`task`; their descriptions spell out `정기 작업`. The exceptions are
`enabled` and `paused`, which are shown as a title with no detail. In
Korean, `작업` on its own reads as a conversation task, so those two say
`정기 작업 켜짐` / `정기 작업 일시 중지됨`.
A few verbs are kept apart. `clear` is `지우기` because it keeps the task
and empties its history, next to `delete` as `삭제`. `trigger` is `실행`,
matching `run history` as `실행 기록`. `snooze` is `연기`, and `refresh`
is `새로고침`. `This cannot be undone.` becomes `이 동작은 되돌릴 수
없습니다.` so it does not collide with `작업` in the sentence before.
One template changes shape. `deleteTitle` drops the object particle
and reads `“${name}” 삭제할까요?`, because the particle would depend on
whether a user-chosen name ends in a consonant.
Six keys have no reader: `dailyReview.yesterday`, `followSettings`,
`unavailable`, `historyUnavailable`, `settingsUnavailable`, and
`tasks.loadFailed`. `ShellRemainingCopy` still requires them, so they
are translated too. Removing them is left out of this change.
Verified with `tsc -p tsconfig.renderer.json --noEmit` in
`apps/desktop` before and after the change: the two errors above are
the only difference, and no error is added. `koCopy` mirrors `enCopy`
key for key with the same 56 strings and does not reference `enCopy`.
biome check is clean on the file. Tests were not run.
Refs apache#3977
Generated-by: Claude Code
…nd the language selector Add a `ko` block after `en` in `SETTINGS_PREFERENCES_COPY_BY_LOCALE`, which closes with `satisfies UiCatalog<SettingsPreferencesCopy>`. The missing `ko` had surfaced twice: the TS2741 on the catalog literal and a TS7053 in its getter. Both go away. This change also touches the other three locales. apache#3977 requires Korean to appear in the interface language selector, but `localeOptions` is typed as `ReadonlyArray<readonly [UiLocalePreference, string]>`, not as a record keyed by locale. The type does not require a `ko` row, so adding a `ko` block alone would type-check and still leave Korean out of the selector. Each of `zh-CN`, `zh-TW` and `en` therefore gets a `['ko', …]` row before `['en', …]`: `한국어` in the two Chinese catalogs (matching how they list `English` and each other by endonym) and `Korean` in `en`. The `ko` catalog lists the same five options, with `auto` as `시스템 설정 따름` and the other languages by endonym. The `en` block grows from 325 to 327 strings: the `'ko'` code and `'Korean'`. One template changes shape. `autoBypass` drops its singular/plural ternary. Korean counters do not inflect, so the `ko` value is a single template, `도메인 ${count}개가 …`. Appearance wording is split by what it names. Where the text points at the operating system setting it uses the macOS Korean name, `화면 모드`, with `라이트` / `다크`. Maka's own appearance setting is not in System Settings, so its save-failure toast says `모양`. Color and icon names are transliterated rather than translated, and descriptions that repeat an icon's own name use the same transliteration. Verified with `tsc -p tsconfig.renderer.json --noEmit` in `apps/desktop` before and after the change: the two errors above are the only difference, and no error is added. The `ko` block mirrors the `en` block key for key with the same 327 strings and does not reference any `EN_` constant or the `en` block. The 325 existing `en` values are unchanged. biome check is clean on the file. Tests were not run. Refs apache#3977 Generated-by: Claude Code
Add a `ko` block after `en` in `SHELL_COPY_BY_LOCALE`, which closes with `satisfies UiCatalog<ShellCopy>`. The missing `ko` had surfaced twice: the TS2741 on the catalog literal and a TS7053 in `getShellCopy`. Both go away. This catalog does not keep all of its copy inline. `commands` and `settingsSections` point at module-level constants, and `zh-CN` and `zh-TW` share one pair of them. Korean has nothing to share with, so this adds `KO_STATIC_COMMANDS` after `EN_STATIC_COMMANDS` and `KO_SETTINGS_SECTIONS` after `EN_SETTINGS_SECTIONS`, typed the same way, and the `ko` block refers to those. Pointing `ko` at the `EN_` constants would have type-checked and shown 86 English strings in the Korean UI. `staticKeywords` stays on the shared `STATIC_COMMAND_KEYWORDS`. The search-keyword arrays are not UI copy. The Korean ones keep the English keywords and use Korean in place of the Chinese ones, as `zh-TW` does with its own script, so each array keeps its length. One template changes shape. `deletedSubtaskNote` drops its singular/plural ternary, as the `zh-CN` and `zh-TW` blocks already do, because Korean counters do not inflect. The `ko` block therefore has one string fewer than `en`: 523 against 524. Where a user-provided value would be followed by a particle whose form depends on its final consonant, the sentence is reordered so that no such particle follows the value. Affected: `openPath`, `saveSummary`, `deleteTitle`, `deleteRestoredTitle`, `deletedDescription`, and `planModeExitPendingDescription`. Some wording choices: - The phrases shared with the core `redaction.ts` catalog (`인증 실패`, `네트워크 오류`, `요청 시간 초과`) are kept verbatim where the English uses the same words. - The command palette group `Diagnostics` is `진단`; the diagnostics data itself stays `진단 정보`. `task workbar` is `작업 워크바`. `Command palette` is `명령 팔레트`, as in VS Code. - `flag` follows macOS Mail (`깃발 표시` / `깃발 제거`). - Key cap names and shortcut chords are left as printed on the keys. - `Plan mode` and `Plan Mode` are both written `Plan Mode`. - Requests that follow a product failure end in `…해 주세요`; requests to correct user input, and plain guidance, end in `…하세요`. `app.useSkillPrompt` is inserted into the composer and reaches the model. It is translated like the rest, but how the model handles the Korean prefix was not verified. Verified with `tsc -p tsconfig.renderer.json --noEmit` in `apps/desktop` before and after the change: the two errors above are the only difference, and no error is added. The `ko` block and the two `KO_` constants reference no `EN_` constant. With string literals masked, the `KO_` constants match their `EN_` counterparts token for token, and the `ko` block matches `en` except for the removed ternary. The 524 existing `en` strings are unchanged. biome check is clean on the file. Tests were not run. Refs apache#3977 Generated-by: Claude Code
…on onboarding message The Korean copy separates two kinds of instruction. When the product could not do something and asks the user to act again, the sentence ends in `…해 주세요`. When the product is guiding the next step, or the user's own input needs correcting, it ends in `…하세요`. The input case counts as guidance because the product did its job by validating the input. A message whose causes span both sides uses `…해 주세요`. These rules were written down only after the shell catalog was done. All five slice 1 catalogs were then reviewed against them. Of the 27 shell strings ending in `…하세요`, 1 was changed before the shell commit. Of the 26 such strings in the four catalogs already committed, this is the only one that changes. In `hero.blocked:all_connections_retired.body`, the user has to add a new connection because Maka removed the sign-in those connections use. The reason for the extra work lies with the product, so the sentence now ends `…추가해 주세요.` This also aligns the onboarding hero set: the three `needs_*` states guide with `…하세요`, and both `blocked:*` states ask with `…해 주세요`. `blocked:all_connections_unhealthy` already reads `…다시 테스트해 주세요.` Only this one string changes. biome check is clean on the file. Refs apache#3977 Generated-by: Claude Code
5 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Refs #3977
The Korean catalogs for the four desktop surfaces #3977 scopes, plus the
language selector rows that make them reachable.
This sits on the shared core base from #5100 and does not typecheck on
its own. The other slices' catalogs still have no
koentry, so theworkspace typecheck stays red until the stack is assembled. That is the
stack boundary, not a defect in this branch. Within this branch, each
translation commit removes exactly the missing-
koerrors its file wasproducing and adds none (see Verification).
settings-preferences-copy.tsonboarding-copy.tsshell-copy.tsshell-remaining-copy.tspermission-center-copy.tsCounted on the
encopy at the base. The remaining 44 strings are:and the second branch of two ternaries
shell-copy.tsalso needed two new module-level constants,KO_STATIC_COMMANDS(70) andKO_SETTINGS_SECTIONS(16).zh-CNandzh-TWshare oneZH_*pair; Korean has no variant to share with, so itgets its own. Pointing
koat theEN_*constants would havetypechecked and shown 86 English strings in the Korean UI.
The language selector
#3977 requires Korean to be selectable.
localeOptionsis a plain arraythat the
UiCatalog<T>type does not constrain, so adding akoblockalone leaves the selector without Korean and nothing fails. This PR
therefore also adds a
korow to thezh-CN,zh-TWandencatalogs,following the existing convention: endonyms everywhere (
한국어), and atranslated name only in
en(Korean).That is the only reason files outside the
koblocks are touched. Theencatalog grows by two strings, the'ko'code and'Korean'.Three English-only branches removed
Korean has no case distinction and no plural agreement, so three
expressions in the templates do nothing once the locale is Korean:
permission-center-copy.ts:${label.toLowerCase()}→${label}settings-preferences-copy.ts: a singular/plural ternary → one templateshell-copy.ts: a singular/plural ternary → one templatezh-CNandzh-TWalready do the same in these places. Otherwise, everyplaceholder keeps the name and count it has in the English. Because of
the last change, the Korean
shell-copy.tshas 523 strings against 524.One string needs a maintainer's call
app.useSkillPrompt(Use the ${skillName} skill:) is inserted into thecomposer at
app-shell.tsx:973and reaches the model, so it is prompttext as much as UI copy. I translated it like the rest, but I could not
verify how the model handles the Korean prefix. If you would rather keep
this one in English so skill invocation stays on the path it was tuned
for, say so and I will revert just this string.
How the copy was decided
Core anchors. The copy is anchored on the Korean strings already in
the core layer (
redaction.ts,relative-time.ts,tool-quiet-preview.ts): 14 fixed values this slice must notcontradict. They apply to status labels, not to the same English word
used as a verb, so
could not be writtenis not forced into thewrittenlabel.Cross-domain terms first. Terms that cross domain boundaries were
fixed before translating. Their frequencies were measured by a script
over the base commit rather than estimated, so the table is
reproducible rather than remembered. Where one English word covers two
concepts, the Korean keeps them apart:
Remove(non-destructive) /Delete/Clearare three differentwords.
Diagnosticsis진단 정보for the data and진단for a commandgroup.
OS surface names. These follow what macOS actually shows in
Korean, because the copy sends users to find them there:
시스템 설정,손쉬운 사용,화면 및 시스템 오디오 녹음,개인정보 보호 및 보안. The names were read from the macOS 26.6system
.loctableresources.Screen Recordingin the English copyis the pre-macOS 15 name; see below.
Instruction endings. The Korean distinguishes guidance from a
request.
again ends in
…해 주세요.…하세요.…해 주세요.all five catalogs were then re-checked against it. That is the last
commit (one string in onboarding).
Consonant-dependent particles. Korean particles such as
을/를change form with the preceding word's final consonant, which a
placeholder's value makes unknowable. Sentences are reordered so no
such particle follows a placeholder, for example
`“${name}” 삭제할까요?`.Four mechanical checks ran over all five finished catalogs:
are compared exactly; inside sentences, the fixed stem must be present.
Results on the five catalogs as committed:
shell-copy.tsand 2 insettings-preferences-copy.ts. Examples arekey cap names left as printed on the keys, the adjective in
clear sky, and the nouncopy.on inflected forms:
지원이 종료for지원 종료,켤for켜,지울for지우. 1 is an approved wording,생성할 수 없음forDaily Review generation is unavailable.Check 1 has a known limitation. It matches the fixed Korean stem as a
literal substring, so a correctly inflected form whose stem changes
shape is reported as a mismatch and needs a human look. On
shell-copy.ts, each checker was also verified by seeding a deliberateerror and confirming that it was caught.
Verification
Renderer typecheck.
tsc -p tsconfig.renderer.json --noEmitinapps/desktop, run at the base and after each commit:a193ad8d1TS2741(typed catalog, so noTS7053)TS2741,TS7053TS2741,TS7053TS2741,TS7053TS2741,TS7053Property 'ko' is missingerrors in other slices' catalogs, plustheir indexing errors.
@maka/uiimports, because workspace packages were notbuilt in my checkout.
identically at the base: one unresolved
@maka/uiimport inpermission-center-copy.ts, and two missing exports from the built@maka/coreinshell-copy.ts.No English fallbacks. The Korean copy never points at the English
copy. Lines added on this branch contain no
EN_*orenCopyreference.In
shell-copy.ts, the only identifiers in value position inside theKorean copy are:
KO_STATIC_COMMANDSKO_SETTINGS_SECTIONSSTATIC_COMMAND_KEYWORDSStructure. With string literals masked:
KO_STATIC_COMMANDSandKO_SETTINGS_SECTIONSmatch theirEN_*counterparts token for token.
koblock matches itsenblock, except for the removedternaries.
String counts. Every Korean catalog has the same keys and the same
number of strings as its English one, except
shell-copy.ts(523 against524, see above). The English strings that existed at the base are
unchanged.
Lint and format.
biome checkis clean on the five files.Not run:
to stay red; see Summary.
ci.yml, which provides the requiredtestcheck, triggers only on pullrequests targeting
main, so that check will not run here until the stack isassembled. The Verification section above is the evidence until then.
Observations about the English copy
These are not change requests, and this PR does not touch them. They are
just things that surfaced while translating:
Screen Recordingis the name macOS used before 15. The current pane is"Screen & System Audio Recording", and the Korean follows the current
name so users can find it.
ensearch-keyword arrays inshell-copy.tscarry a few SimplifiedChinese entries, which look like a copy from the
zh-CNrow.Plan modeandPlan Modeboth appear. The Korean uses the proper-nounspelling consistently.
Remaining before this is ready
kounit tests for the five catalogsstack, not on this branch
#3977's acceptance criteria include all three, which is why this is a draft
and why it says
Refsrather thanFixes.Not in scope
workHubHelpdisagrees acrossen,zh-CNandzh-TW(workHubHelp copy disagrees across en, zh-CN, and zh-TW #5289).The Korean follows
enpending that issue.zh-CNandzh-TWshare Simplifiedconstants in the command palette and settings sections (
zh-TWshows Simplified Chinese in the command palette and settings section names #5377).shell-remaining-copy.tsare read by nocode. The type requires them, so they are translated.
settings-navigation-copy.ts,which belongs to a later slice. The command palette's section names
here use the same English. When that catalog is translated, its labels
should use the same Korean as
KO_SETTINGS_SECTIONS.AI use
Select exactly one:
Tool(s) and scope: Claude Code — drafted the Korean copy for the five
catalogs, the verification scripts, and this description. The terminology
and every judgment call were reviewed and decided by me, and I verified
and submitted the result. Each of the six commits ends with a
Generated-by: Claude Codetrailer. This repository merges by squashonly, and GitHub's default squash message lists the commit messages, so
the trailer is carried into the squash commit and remains its final
trailer. If the squash message is edited at merge time, please keep that
line as the last paragraph.
Checklist
No tests were added (
kounit tests are a remaining #3977 criterion).biomepasses on the changed files, and the per-file typecheck result isunder Verification. Repo-wide typecheck is expected to stay red on this
branch alone.
Does this PR entail a change in behavior?