feat: Korean (ko) translation#10820
Merged
Merged
Conversation
|
Connected to Huly®: UBERF-16403 |
Signed-off-by: FVOCI <150913557+fvoci@users.noreply.github.com>
Member
|
Hello @fvoci Thank you for your contribution. |
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.
feat: Korean (ko) translation
Summary
First Korean (한국어) localization for Huly Platform, following the structural pattern of PR #10478 (Brazilian Portuguese).
ko.jsonfiles with 4,084 translated stringsui/lang/*.jsonfiles updated with theKoreanlabelen.jsonkey sets preserved 1:1; ICU plurals, variables, HTML, and brand names kept verbatimKorean 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
packages/ui/src/plugin.tsKorean: '' as IntlStringpackages/ui/src/components/internal/SettingsPopup.svelte{ id: 'ko', label: ui.string.Korean, logo: '🇰🇷' }tolangsdev/prod/src/platform.ts'ko'to default languages arraydesktop/src/ui/platform.ts'ko'to default languages arraydev/prod/public/branding.jsonkotolanguagesforhuly.local:8080and:8087plugins/love/src/types.tsandplugins/love-resources/src/types.tsalready include'ko'— no changes needed.1. Translation criteria (priority order)
Each translation decision traces back to one of three sources, in priority order:
huly-docs— for domain concepts (QMS lifecycle, Owner vs. Author, Action items, Star reactions, etc.). Whenen.jsonis ambiguous,huly-docsis the deciding source of truth.en.json— preserved literally for terminology, structure, key order, and part-of-speech distinctions where Korean grammar allows.2. Consistency goals
The translation pursues consistency along five axes:
Reviewis "면접" in recruit but "검토" in controlled-documents —huly-docsdefines them as distinct concepts).Added→ passive~됨; verb stemset→ active~함).Document/Documents → 문서,Issue/Issues → 이슈.3. Korean grammar background (for non-Korean reviewers)
The choices below follow Korean grammar, not stylistic preference.
No plural inflection — Korean does not mark plurals morphologically.
DocumentandDocumentsboth translate to문서. The same applies across this PR forIssue/Issues → 이슈,Member/Members → 멤버,Reviewer/Reviewers → 검토자, etc. ICU plural blocks adjust the noun position only:=1 {1 issue}/other {# issues}→이슈 1개/이슈 #개.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.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는).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 ofhuly-docs. Casual~해요form is not used.Subject omission — Korean rarely uses explicit second-person pronouns. English "You cannot delete this" →
삭제할 수 없습니다(no subject), not당신은 삭제할 수 없습니다. Including 당신 sounds translated rather than native.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.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).Counter words (분류사) — Korean numeric expressions require a measure word.
5 issues→이슈 5개,5 people→5명,5 minutes→5분. ICU plural blocks are written noun-first (이슈 #개), not number-first (#개 이슈).Style policies derived from the above
~하시겠습니까?; notifications →~합니다/~되었습니다; errors →~할 수 없습니다/~에 실패했습니다{name}님,{count}개,{ws}에서)이슈 #개)4. Faithful representation — key terminology decisions
Each row traces back to either a
huly-docsconcept, anen.jsondistinction, or a Korean grammar/etymology rule.Maintaineren.jsonkeepsAdmin(관리자) andManager(매니저) as separate keys, so this name is rendered distinctly.Worker(hr.Staff)en.json—WorkerandEmployeeare separate source words; rendered as 근무자 / 직원 to preserve the distinction.Type/Master tagen.json— same source word "Type" acrosstask-assetsandcard-assets; unified for cross-plugin consistency.Action itemhuly-docs/task-tracking/scheduling-action-items.mdx,team-resources/team-planner.mdxdefine this as a distinct concept from genericTodo.Traininghuly-docscontrolled-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.mdxexplicitly distinguishes Owner (lifecycle responsible) from Author (PDF signatory = 작성자).Rating(rating-assets)RatingWidgetEmptyreads "No starred documents yet…", neighboringAddStaris rendered "즐겨찾기 추가".Rejecthuly-docscontrolled-documents review/approval flow. 반려 is the established Korean term for QMS approval rejection, used incontrolled-documents-assets,process-assets,test-management-assets,request-assets.Severityen.json— same source word inproducts-assetsandcontrolled-documents-assets; unified.Vacationhuly-docsHR 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 forTierandPlan; rendered as 등급 / 플랜.List(board-assets)huly-docsBoard is a Trello-style kanban;Listhere means a board column (used inCopyCard/MoveCardpopups), not a generic list view. Loanword reflects the domain meaning. GenericList(e.g.,view-assets.List) renders as 목록.Inboxhuly-docs/communication/inbox.mdxdescribes a unified notifications/mentions/messages stream — not a mail-only inbox. 수신함 (general "received items") matches that scope.Configure(single-word verb button)Configurebuttons unify withSettings(also 설정). Compound forms remain위젯 구성,연동 구성.Mention/Mentionedhuly-docsusesMentionas a feature name (chat tagging). Rendered as a loanword to preserve feature-name semantics; the literal "언급" is too generic for a feature label.Direct messageshuly-docs/communicationusesDirect messagesas a feature name. Loanword used because the literal "직접 메시지" is grammatically awkward in Korean.5. Verification
5.1
en.json↔ko.jsonintegrityko.jsonfilesen.jsoncontrolled-documents.ChangeOwnerHintBeginning— split-string head absorbed by Korean particle in the surrounding sentence)DOC-1,PRJCT,+1 555 333 7777, etc.)5.2 Within-file translation consistency
Each
ko.jsonfile was scanned for cases where a single plugin renders the same English value as different Korean strings.CreateFolder/CreateFolderPermission(both EN: "Create Folder") → unified to "폴더 만들기".On/OnUntil, text-editorAdd before/Add after, workbenchArchive/Archived, timeCompleted/MarkedAsDone, chunterMentioned/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)
{var} 님(space before particle)비밀번호is the etymologically Korean term (비밀+번호);패스워드is a transliterated loanword{n}개의(drop unnecessary "의")의선택한reads more naturally than passive선택된6. Test plan
ko.jsonfiles parse as valid JSON; key sets matchen.jsonexactlysh ./scripts/fast-start.sh; selected Korean from the language pickerserver/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-docsconcept, anen.jsondistinction, 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
교육훈련,유지관리자, andConfigure → 설정— 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.