Skip to content

i18n: add Korean (ko-KR) translation#1568

Open
moduvoice wants to merge 3 commits into
scriptscat:mainfrom
moduvoice:i18n/add-korean
Open

i18n: add Korean (ko-KR) translation#1568
moduvoice wants to merge 3 commits into
scriptscat:mainfrom
moduvoice:i18n/add-korean

Conversation

@moduvoice

Copy link
Copy Markdown

Korean (ko-KR) translation PR body

Motivation

This adds Korean (ko-KR) translation support — to help Korean-speaking users use this
open-source project more comfortably in their own language.

한국 사람들의 오픈소스 이용에 도움이 되게 하기 위해서 한글화 작업을 하였습니다.

Changes

  • New src/locales/ko-KR/ locale: 11 namespace files (agent.json, common.json, editor.json, guide.json, install.json, logs.json, permission.json, popup.json, script.json, settings.json, tools.json) + index.ts, mirroring the en-US structure — 959 translated keys, verified 1:1 key parity against en-US (0 missing / 0 extra).
  • Registered the new locale in src/locales/locales.ts ("ko-KR": { title: "한국어", ...koKR }).
  • New src/assets/_locales/ko/messages.json — legacy chrome.i18n extension metadata (name/description) for the Chrome Web Store listing.
  • src/pkg/utils/monaco-editor/langs.ts — added Korean strings for the in-editor GM API grant-value hover prompts and metadata-field prompts (script header fields, crontab examples, etc.) used by the Monaco editor.

Testing

  • Programmatic key-parity check: all 11 ko-KR/*.json namespace files diffed key-by-key against en-US, confirming 959/959 keys with 0 missing and 0 extra.
  • Scanned all translated strings for leftover CJK Unified Ideograph (Hanja/Hanzi/Kanji) characters — none found.
  • Followed docs/translation.md: no terminology-ko-KR.md exists yet, so translation style was kept consistent with the existing locale conventions rather than introducing new ad-hoc terminology; verified terminology consistency for core concepts across all 11 files (스크립트/유저스크립트, 권한, 구독, 백그라운드 스크립트, 샌드박스, 에이전트).
  • Spot-checked translation quality, with extra attention to install.json (security/permission warning copy) and agent.json (AI coding agent feature UI).
  • npx tsc --noEmit — clean.
  • npx eslint . — clean.
  • npx vitest run — 3084/3084 tests passing (289 test files).

Adds a full Korean UI translation for ScriptCat:

- src/locales/ko-KR/: 11 i18next namespace JSON files (959 leaf keys)
  translated from the en-US source, covering common, popup, script,
  editor, settings, install, agent, logs, guide, tools, permission.
- Registers ko-KR in src/locales/locales.ts (import + i18next resources).
- Adds a Korean entry to the Monaco editor prompt/grant-value strings
  in src/pkg/utils/monaco-editor/langs.ts.
- Adds src/assets/_locales/ko/messages.json for the chrome.i18n
  extension-market metadata (name/description), matching the existing
  per-locale files there.

No terminology-ko-KR.md exists yet, so translations follow the existing
style/voice used by ja-JP and de-DE per docs/translation.md guidance
rather than introducing new terminology conventions.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@cyfung1031 cyfung1031 self-requested a review July 11, 2026 14:56

@cyfung1031 cyfung1031 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Korean translation review — changes requested

I reviewed the Korean locale against both the English (en-US) source and the Simplified Chinese (zh-CN) source, together with the existing terminology guides.

The contribution is substantially complete and many strings are clear and accurate. However, the following issues should be corrected before merge:

  1. Authorization is mistranslated as authentication in the permission flow.
  2. The normal-script product type is translated as the generic userscript concept, losing a product distinction that both terminology guides require.
  3. Scheduled Script terminology is mixed with crontab script, even though the product term is already established.
  4. An exclude-rule explanation says “match rule,” producing incorrect UI meaning.
  5. A “clear storage” success message says the storage was reset, which is a different operation.
  6. A split popup sentence is grammatically broken when the number is inserted.
  7. Cross-browser background-running copy unnecessarily names Chrome.
  8. A Simplified Chinese full-width colon was copied into Korean text.

Must-fix findings

M1. Authorization is translated as authentication

File: src/locales/ko-KR/permission.json
Keys: auth_duration, loading_confirm, confirm_expired_title, confirm_expired_desc

The English source uses Authorization, and Simplified Chinese uses 授权. The Korean strings use 인증, which means authentication/identity verification rather than granting a script permission.

Current concepts:

  • 인증 유효 기간
  • 인증 요청을 불러오는 중…
  • 인증 요청이 만료되었습니다

Suggested wording:

{
  "auth_duration": "권한 허용 기간",
  "loading_confirm": "권한 요청을 불러오는 중…",
  "confirm_expired_title": "권한 요청이 만료되었습니다",
  "confirm_expired_desc": "이 권한 요청은 시간이 초과되었거나 이미 처리되었습니다. 페이지로 돌아가 다시 시도해 주세요."
}

This is a semantic issue, not only a style preference.

M2. The normal-script product type is translated as generic userscript

File: src/locales/ko-KR/script.json
Key: create_user_script

Current:

"create_user_script": "유저스크립트 만들기"

In this UI, the key creates ScriptCat’s ordinary/normal script type. 유저스크립트 is also used as the generic userscript ecosystem concept elsewhere. Simplified Chinese deliberately resolves this product type as 普通脚本, and both terminology guides require preserving the distinction among normal, page, background, and scheduled scripts.

Suggested:

"create_user_script": "일반 스크립트 만들기"

Use 유저스크립트 for the generic userscript concept and 일반 스크립트 for this ScriptCat type.

M3. Scheduled Script is mixed with crontab script

File: src/locales/ko-KR/editor.json
Key: only_background_scheduled_can_run

Current:

"only_background_scheduled_can_run": "백그라운드 스크립트/예약(crontab) 스크립트만 실행할 수 있습니다"

The English crontab scripts wording is already identified as a source-copy review target. Simplified Chinese correctly uses the established scheduled-script product term.

Suggested:

"only_background_scheduled_can_run": "백그라운드 스크립트와 예약 스크립트만 실행할 수 있습니다"

Keep cron/crontab only for the scheduling syntax, not the script-type name.

M4. Exclude-rule explanation incorrectly says “match rule”

File: src/locales/ko-KR/editor.json
Key: after_deleting_exclude_item

Current:

"after_deleting_exclude_item": "삭제 후에도 스크립트에 정의된 매치 규칙은 제외 목록에 다시 추가됩니다"

This is the exclude list and should refer to an exclude rule.

Suggested:

"after_deleting_exclude_item": "삭제 후에도 스크립트에 정의된 제외 규칙은 제외 목록에 다시 추가됩니다"

The English and Chinese strings appear to contain the same source-level inconsistency, but the Korean translation should not reproduce it when the key and UI context are clear.

M5. Clear storage is translated as reset

File: src/locales/ko-KR/editor.json
Key: clear_success

Current:

"clear_success": "초기화되었습니다"

초기화 means reset/initialize and can imply restoring defaults. The action clears stored data; the UI already has separate reset and restore operations.

Suggested:

"clear_success": "저장소를 비웠습니다"

모두 지웠습니다 may also work if the surrounding notification already identifies the storage object.

M6. Split popup sentence becomes grammatically incorrect

File: src/locales/ko-KR/popup.json
Keys: menu_expand_num_before, menu_expand_num_after

Current:

{
  "menu_expand_num_before": "메뉴 항목이",
  "menu_expand_num_after": "개를 초과하면 숨겨집니다."
}

After inserting a number, this produces wording like 메뉴 항목이 5개를 초과하면 숨겨집니다, which is ungrammatical. It is the number of menu items that exceeds the limit.

Suggested:

{
  "menu_expand_num_before": "메뉴 항목 수가 ",
  "menu_expand_num_after": "개를 초과하면 자동으로 숨겨집니다."
}

Please verify the exact leading/trailing spaces against the component concatenation.

M7. Cross-browser copy unnecessarily names Chrome

File: src/locales/ko-KR/settings.json
Key: enable_background.description

Current wording says the process remains active until the user manually quits Chrome. ScriptCat supports multiple browsers, and the Simplified Chinese source correctly generalizes this to “the browser.” The English terminology guide also identifies this as a source-copy review target.

Suggested:

활성화하면 모든 창을 닫아도 브라우저가 트레이에 최소화된 상태로 백그라운드에서 계속 실행되며, 브라우저를 직접 종료할 때까지 유지됩니다. 이를 통해 백그라운드 스크립트가 계속 실행될 수 있습니다.

M8. Simplified Chinese punctuation appears in Korean text

File: src/locales/ko-KR/settings.json
Key: migration_confirm_message

Current text contains the full-width Chinese colon :

자세한 내용:https://docs.scriptcat.org/docs/change/v0.17/

Suggested:

저장소 엔진 마이그레이션을 다시 시도하면 기존 데이터가 변경됩니다. 진행하기 전에 확인해 주세요. 자세한 내용: https://docs.scriptcat.org/docs/change/v0.17/

Recommended improvements

R1. Translate generic “Source” as 출처, not 소스

File/key: src/locales/ko-KR/common.jsonsource

Suggested:

"source": "출처"

Reserve 소스 or 소스 코드 for source code.

R2. Make “All” explicitly refer to browser tabs

File/key: src/locales/ko-KR/settings.jsonscript_run_env.all

Current: 전체
Suggested: 모든 탭

The sibling values are 일반 탭 and 시크릿 탭, so the bare label is ambiguous.

R3. Avoid the literal 절대 범위

File/key: src/locales/ko-KR/logs.jsonabsolute_range

Current: 절대 범위
Suggested: 절대 시간 범위

This follows the meaning clarified by the Simplified Chinese 绝对时间范围.

R4. Use desktop-appropriate wording for expanding update details

File/key: src/locales/ko-KR/install.jsonupdatepage.tap_to_expand

Current: 탭하여 펼치기
Suggested: 클릭하여 펼치기

This is primarily a desktop extension interface; Simplified Chinese also resolves the source’s ambiguous “Tap” to “click.”

R5. Clarify that models are fetched/listed, not imported

File/key: src/locales/ko-KR/agent.jsonmodel_fetch

Current: 모델 가져오기
Suggested: 모델 목록 불러오기

가져오기 is already used for import operations elsewhere.

R6. Prefer 매개변수 for user-facing tool arguments

File/key: src/locales/ko-KR/agent.jsonchat_tool_arguments

Current: 인수
Suggested: 매개변수

인수 is technically valid, but 매개변수 is clearer in this user-facing chat UI.

R7. Improve the OPFS expansion

File/key: src/locales/ko-KR/agent.jsonopfs_subtitle

Current:

출처별 프라이빗 파일 시스템(OPFS) · 에이전트 전용 저장소

Suggested:

오리진 전용 파일 시스템(OPFS) · 에이전트 전용 저장소

출처별 does not clearly express the web-platform security-origin concept.

R8. Correct the CORS label

File/key: src/locales/ko-KR/permission.jsonpermission_cors

Current: 교차 도메인(CORS)
Suggested: 교차 출처 접근(CORS)

CORS specifically concerns cross-origin resource sharing.

R9. Normalize Skill as 스킬 in ordinary Korean UI

File/keys: src/locales/ko-KR/script.json

  • import_skill
  • link_import_hint
  • drop_to_install
  • drop_to_install_hint

The locale already uses 스킬 throughout agent.json and install.json, but these strings retain English Skill.

Suggested:

{
  "import_skill": "스킬 가져오기",
  "link_import_hint": "유저스크립트 / 구독 / 스킬 URL을 지원합니다",
  "drop_to_install": "스크립트 또는 스킬을 여기에 드롭하여 설치",
  "drop_to_install_hint": ".js 유저스크립트 / 구독 · .zip 스킬 패키지를 드롭하세요"
}

Preserve exact identifiers and filenames such as SKILL.md, SKILL.cat.md, and SkillScript.

R10. Avoid placeholder particle notation

File/key: src/locales/ko-KR/script.jsonconfirm_delete_script_content

Current:

스크립트 "{{name}}"을(를) 삭제하시겠습니까?

Suggested:

"{{name}}" 스크립트를 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.

Rephrasing is more natural than exposing Korean particle alternatives.

R11. Make execution exclusion labels more natural

File/keys: src/locales/ko-KR/common.jsonexclude_on, exclude_off

Suggested:

{
  "exclude_on": "$0에서 다시 실행",
  "exclude_off": "$0에서 실행 제외"
}

The current compressed noun phrases read like literal machine translation.

R12. Keep the generic userscript term consistent in Monaco

File/key: src/pkg/utils/monaco-editor/langs.tsthisIsAUserScript

Current: 사용자 스크립트
Suggested: 유저스크립트

This aligns with the dominant generic term in the Korean locale. The normal ScriptCat product type should remain 일반 스크립트.

R13. Smooth two Monaco quick-fix strings

File/keys:

  • replaceMatchTldWildcardWithInclude
  • replaceIncludeWithMatch

Suggested:

@match 최상위 도메인 와일드카드를 @include {0}으로 바꾸기
@include를 @match {0}으로 바꾸기

This removes visible particle notation and reads more naturally as an action.

R14. Consider improving the extension-store description

File/key: src/assets/_locales/ko/messages.jsonscriptcat_description

Current:

브라우저의 모든 잠재력을 끌어내는 강력한 유저스크립트 매니저!

Suggested:

브라우저의 잠재력을 최대한 활용할 수 있는 강력한 유저스크립트 관리자!

The current sentence is understandable, but the suggestion is more natural and neutral Korean product copy.

@cyfung1031 cyfung1031 added the i18n Internationalization or localization issue label Jul 11, 2026
@CodFrm

CodFrm commented Jul 14, 2026

Copy link
Copy Markdown
Member

@cyfung1031 Thanks for the thorough review 🙏

I did a pass focused only on structure (not wording/grammar), and there's one thing that needs handling:

ko-KR/install.json is behind main — missing 30 keys

This PR branched from 9a65cd73. After that, main merged #1554, which added 30 importpage.* keys to install.json for every existing locale (restore_settings_* / settings_group_* / section_* / import_*_settings). Since ko-KR was created after that point, it will end up as the only locale missing these keys once merged.

  • Impact: it merges cleanly at the git level and won't fail CI (i18n-usage.test.ts only validates against zh-CN — there's no cross-locale parity check — and fallbackLng: en-US covers it at runtime), but Korean users will see these 30 strings in English on the backup/restore/import screens.
  • Action needed: sync with main and translate the 30 new keys.

Everything else structural looks good — the 11 namespaces + index.ts layout, the locales.ts registration, the ko-KR block in langs.ts (57/57 keys aligned with en-US), _locales/ko/messages.json, and the new terminology-ko-KR.md are all correct.

On the wording-level findings

One thing I'd like to check with you: for the M1–M8 / R1–R14 wording/semantic points above — are you confident all of those calls are accurate? If you're not fully sure, I'd lean toward gating only on the structural issue this round (filling in the 30 keys) and not blocking the merge on language-level wording, leaving that to a native Korean speaker or contributor to iterate on later.

@cyfung1031

Copy link
Copy Markdown
Collaborator

@moduvoice I am waiting for your follow-up.

If there is no follow-up within this week, I will just use AI to apply all above suggestions.

Then you might make another PR for any further changing.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

i18n Internationalization or localization issue

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants