Skip to content

feat: Korean (ko) translation#10820

Merged
BykhovDenis merged 1 commit into
hcengineering:developfrom
fvoci:develop
May 5, 2026
Merged

feat: Korean (ko) translation#10820
BykhovDenis merged 1 commit into
hcengineering:developfrom
fvoci:develop

Conversation

@fvoci

@fvoci fvoci commented May 5, 2026

Copy link
Copy Markdown
Contributor

feat: Korean (ko) translation

Summary

First Korean (한국어) localization for Huly Platform, following the structural pattern of PR #10478 (Brazilian Portuguese).

  • 66 new ko.json files with 4,084 translated strings
  • 5 code changes to register Korean as a selectable language
  • 12 existing ui/lang/*.json files updated with the Korean label
  • All en.json key sets preserved 1:1; ICU plurals, variables, HTML, and brand names kept verbatim

Korean joins the existing 12 languages (en, ru, es, pt, pt-br, zh, fr, cs, it, de, ja, tr).

Hopefully this is the last project management open source tool I'll ever have to look for. I put in 4,084 strings. Please let this be the one. I can't keep searching for project management tools.

Also, if anyone from the Huly team is reading this: please don't deprecate the project. I just spent 4,084 strings on you.


Code changes

File Change
packages/ui/src/plugin.ts Add Korean: '' as IntlString
packages/ui/src/components/internal/SettingsPopup.svelte Add { id: 'ko', label: ui.string.Korean, logo: '🇰🇷' } to langs
dev/prod/src/platform.ts Add 'ko' to default languages array
desktop/src/ui/platform.ts Add 'ko' to default languages array
dev/prod/public/branding.json Add ko to languages for huly.local:8080 and :8087

plugins/love/src/types.ts and plugins/love-resources/src/types.ts already include 'ko' — no changes needed.


1. Translation criteria (priority order)

Each translation decision traces back to one of three sources, in priority order:

  1. huly-docs — for domain concepts (QMS lifecycle, Owner vs. Author, Action items, Star reactions, etc.). When en.json is ambiguous, huly-docs is the deciding source of truth.
  2. en.json — preserved literally for terminology, structure, key order, and part-of-speech distinctions where Korean grammar allows.
  3. Korean grammar (no plural inflection, postpositional particles, honorifics, SOV order, counter words, vowel/consonant-aware particles) — applied where (1) and (2) underdetermine the choice.

2. Consistency goals

The translation pursues consistency along five axes:

  1. Same English term → same Korean term within a plugin (no within-file drift).
  2. Same English term → same Korean term across plugins, except where the underlying domain concept differs (e.g., Review is "면접" in recruit but "검토" in controlled-documents — huly-docs defines them as distinct concepts).
  3. English part-of-speech preserved when Korean grammar allows (e.g., past participle Added → passive ~됨; verb stem set → active ~함).
  4. English singular/plural collapsed in Korean (Korean has no plural inflection): Document/Documents → 문서, Issue/Issues → 이슈.
  5. No anti-patterns (literal-translation tells, Korean spelling errors, redundant subjects). See verification section below.

3. Korean grammar background (for non-Korean reviewers)

The choices below follow Korean grammar, not stylistic preference.

  1. No plural inflection — Korean does not mark plurals morphologically. Document and Documents both translate to 문서. The same applies across this PR for Issue/Issues → 이슈, Member/Members → 멤버, Reviewer/Reviewers → 검토자, etc. ICU plural blocks adjust the noun position only: =1 {1 issue} / other {# issues}이슈 1개 / 이슈 #개.

  2. Postpositional particles attach to the preceding word — Korean grammatical particles (subject 이/가, object 을/를, topic 은/는, locative 에/에서, honorific , counter , etc.) are written without space to the preceding word. For variable interpolation, {name} + honorific is written as {name}님이, not {name} 님이. A space here is a grammatical error.

  3. Vowel/consonant-aware particles — Some particles have two forms based on whether the preceding word ends in a consonant or vowel ( after consonant, after vowel). For runtime variables we cannot predict this, so we use the standard paired form 을(를), 이(가), 은(는). For known brand names we apply the appropriate form: consonant-ending (Slack을, GitHub은) vs. vowel-ending (Huly를, Linear는).

  4. Honorific levels (politeness) — Korean has multiple politeness registers. This translation uses 격식체 (formal-polite, ~합니다 ending) for system messages and notifications, and 명사형 (noun form, no verb ending) for buttons, menu items, tooltips, and placeholders, matching the formal register of huly-docs. Casual ~해요 form is not used.

  5. Subject omission — Korean rarely uses explicit second-person pronouns. English "You cannot delete this" → 삭제할 수 없습니다 (no subject), not 당신은 삭제할 수 없습니다. Including 당신 sounds translated rather than native.

  6. Active vs. passive form mapping — The translation maps English voice deliberately: past participle (Added, Removed, Created) → passive ~됨; bare verb in activity-log mid-sentence position (set, removed) → active ~함; intransitive verbs (Joined, Reacted) → bare stem (참여, 반응함) since Korean intransitives have no passive form.

  7. SOV word order — Korean is subject-object-verb. Some English label structures need rearrangement for natural reading. Example: "Connected to issue X in repo Y" → Y의 이슈 X에 연결됨 (not the literal English order).

  8. Counter words (분류사) — Korean numeric expressions require a measure word. 5 issues이슈 5개, 5 people5명, 5 minutes5분. ICU plural blocks are written noun-first (이슈 #개), not number-first (#개 이슈).

Style policies derived from the above

  • UI form by context: buttons / menus / tooltips → noun form (저장, 취소, 검색); confirmations → ~하시겠습니까?; notifications → ~합니다/~되었습니다; errors → ~할 수 없습니다 / ~에 실패했습니다
  • Variable + particle spacing: no space ({name}님, {count}개, {ws}에서)
  • ICU plural counter: noun-first (이슈 #개)
  • Singular/plural collapse: one Korean form per concept

4. Faithful representation — key terminology decisions

Each row traces back to either a huly-docs concept, an en.json distinction, or a Korean grammar/etymology rule.

English Korean Source of decision
Maintainer 유지관리자 Korean etymology — literal rendering of the verb root maintain (유지하다 / 관리하다). en.json keeps Admin (관리자) and Manager (매니저) as separate keys, so this name is rendered distinctly.
Worker (hr.Staff) 근무자 en.jsonWorker and Employee are separate source words; rendered as 근무자 / 직원 to preserve the distinction.
Type / Master tag 유형 en.json — same source word "Type" across task-assets and card-assets; unified for cross-plugin consistency.
Action item 액션 아이템 huly-docs/task-tracking/scheduling-action-items.mdx, team-resources/team-planner.mdx define this as a distinct concept from generic Todo.
Training 교육훈련 huly-docs controlled-documents context (ISO 9001/13485 QMS). 교육훈련 is the established Korean term for the combined Education+Training concept used in QMS/HRM standards.
Owner (controlled docs) 소유자 huly-docs/controlled-documents/ownership-authorship.mdx explicitly distinguishes Owner (lifecycle responsible) from Author (PDF signatory = 작성자).
Rating (rating-assets) 즐겨찾기 The plugin's actual function is a star-reaction (favorites) system — RatingWidgetEmpty reads "No starred documents yet…", neighboring AddStar is rendered "즐겨찾기 추가".
Reject 반려 huly-docs controlled-documents review/approval flow. 반려 is the established Korean term for QMS approval rejection, used in controlled-documents-assets, process-assets, test-management-assets, request-assets.
Severity 심각도 en.json — same source word in products-assets and controlled-documents-assets; unified.
Vacation 휴가 huly-docs HR plugin describes a generic vacation. 연차 (Korean-labor-specific annual leave) was not chosen because the source covers a broader meaning.
Tier (billing) 등급 en.json — distinct keys for Tier and Plan; rendered as 등급 / 플랜.
List (board-assets) 리스트 huly-docs Board is a Trello-style kanban; List here means a board column (used in CopyCard/MoveCard popups), not a generic list view. Loanword reflects the domain meaning. Generic List (e.g., view-assets.List) renders as 목록.
Inbox 수신함 huly-docs/communication/inbox.mdx describes a unified notifications/mentions/messages stream — not a mail-only inbox. 수신함 (general "received items") matches that scope.
Configure (single-word verb button) 설정 Korean grammar — English verb/noun distinction does not map cleanly to Korean (both naturally render as 설정). Single-word Configure buttons unify with Settings (also 설정). Compound forms remain 위젯 구성, 연동 구성.
Mention / Mentioned 멘션 / 멘션됨 huly-docs uses Mention as a feature name (chat tagging). Rendered as a loanword to preserve feature-name semantics; the literal "언급" is too generic for a feature label.
Direct messages 다이렉트 메시지 huly-docs/communication uses Direct messages as a feature name. Loanword used because the literal "직접 메시지" is grammatically awkward in Korean.

5. Verification

5.1 en.jsonko.json integrity

Check Result
Total ko.json files 66
Total Korean strings 4,084
JSON validity all valid
Key set match with en.json 100% (zero missing/extra)
Empty Korean values 1 (intentional: controlled-documents.ChangeOwnerHintBeginning — split-string head absorbed by Korean particle in the surrounding sentence)
Untranslated entries 10, all brand names or example placeholders (DOC-1, PRJCT, +1 555 333 7777, etc.)

5.2 Within-file translation consistency

Each ko.json file was scanned for cases where a single plugin renders the same English value as different Korean strings.

  • drive-assets CreateFolder / CreateFolderPermission (both EN: "Create Folder") → unified to "폴더 만들기".
  • Remaining 6 cases (calendar On/OnUntil, text-editor Add before/Add after, workbench Archive/Archived, time Completed/MarkedAsDone, chunter Mentioned/MentionNotification) have identical English values but distinct semantic roles in source code; Korean intentionally splits to preserve clarity (e.g., 보관 vs. 보관됨 — action vs. state; 앞에 추가 vs. 위에 추가 — column vs. row direction).

5.3 Anti-pattern scan (regex, all 66 files)

Pattern Hits Why it's an anti-pattern
{var} 님 (space before particle) 0 Korean particles must attach without space (grammar rule §3.2)
성공적으로 (redundant "successfully") 0 Korean past tense already implies success; the adverb is redundant
패스워드 (use 비밀번호) 0 비밀번호 is the etymologically Korean term (비밀+번호); 패스워드 is a transliterated loanword
아니오 (use 아니요) 0 아니요 is the modern standard spelling per the National Institute of Korean Language
당신의 / 당신은 / 귀하 (drop "you") 0 Korean rarely uses explicit second-person pronouns in declarative sentences (grammar rule §3.5)
{n}개의 (drop unnecessary "의") 0 Counters typically don't take the possessive particle
선택된 (use 선택한 active form) 0 Active adjective 선택한 reads more naturally than passive 선택된

6. Test plan

  • All 66 ko.json files parse as valid JSON; key sets match en.json exactly
  • Built and ran locally via sh ./scripts/fast-start.sh; selected Korean from the language picker
  • Verified rendering across Login, Workspace, Tracker, Cards, Controlled Documents, Office (love), HR, and Inbox
  • Reviewer verification across email templates (server/account/lang/ko.json)

7. Notes for reviewers

This is the first Korean translation for Huly. Each terminology decision in §4 traces back to either a huly-docs concept, an en.json distinction, or a Korean grammar/etymology rule — not to comparisons with other Korean apps. Please flag any term that reads unnaturally in your UI context; adjustments don't affect key structure.

A few translation choices — notably 교육훈련, 유지관리자, and Configure → 설정 — are reasonable but may benefit from real user feedback down the line.

If this PR gets rejected, I will need therapy. The 반려 key has been translated. I know what it means.

@huly-github-staging

Copy link
Copy Markdown

Connected to Huly®: UBERF-16403

Signed-off-by: FVOCI <150913557+fvoci@users.noreply.github.com>
@BykhovDenis

Copy link
Copy Markdown
Member

Hello @fvoci Thank you for your contribution.

@BykhovDenis BykhovDenis merged commit 2d73be1 into hcengineering:develop May 5, 2026
13 checks passed
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