Skip to content

Conversation

@yslpn
Copy link
Contributor

@yslpn yslpn commented Sep 14, 2025

i18n: Migrate Korean to ko, deprecate kr

  • Use the correct ISO 639-1 language code for Korean: ko
  • Keep kr as a deprecated alias for backward compatibility
  • Add ko to build scripts (npm & JSR); preserve kr outputs
  • Update types and documentation accordingly
  • No breaking changes in this release; kr will be removed in a future major

Migration: prefer @valibot/i18n/ko instead of @valibot/i18n/kr.

Closes #1285

Copilot AI review requested due to automatic review settings September 14, 2025 14:16
@vercel
Copy link

vercel bot commented Sep 14, 2025

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Preview Comments Updated (UTC)
valibot Ready Ready Preview Comment Sep 14, 2025 2:20pm

@dosubot dosubot bot added size:XL This PR changes 500-999 lines, ignoring generated files. fix A smaller enhancement or bug fix labels Sep 14, 2025
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull Request Overview

This PR migrates Korean language support from the incorrect ISO code 'kr' to the correct ISO 639-1 code 'ko' while maintaining backward compatibility.

  • Adds proper 'ko' language code support with complete Korean translations
  • Deprecates 'kr' with a JSDoc comment and keeps it as an alias for backward compatibility
  • Updates build scripts, package exports, and documentation to include both codes

Reviewed Changes

Copilot reviewed 10 out of 10 changed files in this pull request and generated no comments.

Show a summary per file
File Description
packages/i18n/src/types.ts Adds 'ko' to the Language union type
packages/i18n/src/kr.ts Adds deprecation comment for 'kr' code
packages/i18n/src/ko.ts Creates new Korean language file with 'ko' code
packages/i18n/scripts/build-npm.ts Imports and includes 'ko' in build script
packages/i18n/scripts/build-jsr.ts Imports and includes 'ko' in JSR build script
packages/i18n/package.json Adds 'ko' export paths alongside existing 'kr' paths
packages/i18n/jsr.json Adds 'ko' export mappings for JSR
packages/i18n/README.md Updates documentation to show Korean as 'ko' instead of 'kr'
packages/i18n/CHANGELOG.md Documents the migration and deprecation
packages/i18n/.gitignore Adds 'ko' directory to gitignore

Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

@fabian-hiller
Copy link
Member

Thank you so much! I will try to make some time to merge it this or next week and publish a new version.

@pkg-pr-new
Copy link

pkg-pr-new bot commented Sep 16, 2025

Open in StackBlitz

npm i https://pkg.pr.new/valibot@1306

commit: 803e5a6

@yslpn yslpn mentioned this pull request Sep 24, 2025
@fabian-hiller
Copy link
Member

I haven't forgotten this PR and will probably merge it in 1 to 2 weeks. I am currently focused on Formisch a few other things.

Copy link
Contributor

@tats-u tats-u left a comment

Choose a reason for hiding this comment

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

You should deduplicate the data.

@@ -1,81 +1,86 @@
import type { Language } from './types';
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
import type { Language } from './types';
import type { Language } from './types';
import ko from './ko';

Comment on lines 9 to 86
const language: Language = {
code: 'kr',
schema: (issue) => `유효하지 않은 타입: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
specific: {
base64: (issue) => `유효하지 않은 Base64: ${issue.received} 을(를) 받았습니다`,
bic: (issue) => `유효하지 않은 사업자 식별코드(BIC): ${issue.received} 을(를) 받았습니다`,
bytes: (issue) => `유효하지 않은 바이트: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
check: (issue) => `유효하지 않은 입력: ${issue.received} 을(를) 받았습니다`,
checkAsync: (issue) => `유효하지 않은 입력: ${issue.received} 을(를) 받았습니다`,
checkItems: (issue) => `유효하지 않은 항목: ${issue.received} 을(를) 받았습니다`,
checkItemsAsync: (issue) => `유효하지 않은 항목: ${issue.received} 을(를) 받았습니다`,
creditCard: (issue) => `유효하지 않은 신용카드: ${issue.received} 을(를) 받았습니다`,
cuid2: (issue) => `유효하지 않은 Cuid2: ${issue.received} 을(를) 받았습니다`,
decimal: (issue) => `유효하지 않은 십진수: ${issue.received} 을(를) 받았습니다`,
digits: (issue) => `유효하지 않은 숫자: ${issue.received} 을(를) 받았습니다`,
email: (issue) => `유효하지 않은 이메일: ${issue.received} 을(를) 받았습니다`,
emoji: (issue) => `유효하지 않은 이모지: ${issue.received} 을(를) 받았습니다`,
empty: (issue) => `유효하지 않은 길이: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
endsWith: (issue) => `유효하지 않은 끝: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
everyItem: (issue) => `유효하지 않은 항목: ${issue.received} 을(를) 받았습니다`,
excludes: (issue) => `유효하지 않은 컨텐츠: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
finite: (issue) => `유효하지 않은 유한 숫자: ${issue.received} 을(를) 받았습니다`,
graphemes: (issue) => `유효하지 않은 그래프: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
hash: (issue) => `유효하지 않은 해쉬: ${issue.received} 을(를) 받았습니다`,
hexColor: (issue) => `유효하지 않은 hex 색상 코드: ${issue.received} 을(를) 받았습니다`,
hexadecimal: (issue) => `유효하지 않은 16진수: ${issue.received} 을(를) 받았습니다`,
imei: (issue) => `유효하지 않은 IMEI: ${issue.received} 을(를) 받았습니다`,
includes: (issue) => `유효하지 않은 컨텐츠: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
integer: (issue) => `유효하지 않은 정수: ${issue.received} 을(를) 받았습니다`,
ip: (issue) => `유효하지 않은 IP: ${issue.received} 을(를) 받았습니다`,
ipv4: (issue) => `유효하지 않은 IPv4: ${issue.received} 을(를) 받았습니다`,
ipv6: (issue) => `유효하지 않은 IPv6: ${issue.received} 을(를) 받았습니다`,
isoDate: (issue) => `유효하지 않은 날짜: ${issue.received} 을(를) 받았습니다`,
isoDateTime: (issue) => `유효하지 않은 날짜-시각: ${issue.received} 을(를) 받았습니다`,
isoTime: (issue) => `유효하지 않은 시각: ${issue.received} 을(를) 받았습니다`,
isoTimeSecond: (issue) => `유효하지 않은 시각-초: ${issue.received} 을(를) 받았습니다`,
isoTimestamp: (issue) => `유효하지 않은 타임스탬프: ${issue.received} 을(를) 받았습니다`,
isoWeek: (issue) => `유효하지 않은 주: ${issue.received} 을(를) 받았습니다`,
length: (issue) => `유효하지 않은 길이: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
mac: (issue) => `유효하지 않은 MAC: ${issue.received} 을(를) 받았습니다`,
mac48: (issue) => `유효하지 않은 48-bit MAC: ${issue.received} 을(를) 받았습니다`,
mac64: (issue) => `유효하지 않은 64-bit MAC: ${issue.received} 을(를) 받았습니다`,
maxBytes: (issue) => `유효하지 않은 바이트: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
maxGraphemes: (issue) => `유효하지 않은 그래프: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
maxLength: (issue) => `유효하지 않은 길이: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
maxSize: (issue) => `유효하지 않은 크기: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
maxValue: (issue) => `유효하지 않은 값: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
maxWords: (issue) => `유효하지 않은 단어: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
mimeType: (issue) => `유효하지 않은 MIME 타입: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
minBytes: (issue) => `유효하지 않은 바이트: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
minGraphemes: (issue) => `유효하지 않은 그래프: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
minLength: (issue) => `유효하지 않은 길이: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
minSize: (issue) => `유효하지 않은 크기: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
minValue: (issue) => `유효하지 않은 값: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
minWords: (issue) => `유효하지 않은 단어: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
multipleOf: (issue) => `유효하지 않은 배수: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
nanoid: (issue) => `유효하지 않은 Nano ID: ${issue.received} 을(를) 받았습니다`,
nonEmpty: (issue) => `유효하지 않은 길이: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
notBytes: (issue) => `유효하지 않은 바이트: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
notGraphemes: (issue) => `유효하지 않은 그래프: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
notLength: (issue) => `유효하지 않은 길이: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
notSize: (issue) => `유효하지 않은 크기: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
notValue: (issue) => `유효하지 않은 값: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
notWords: (issue) => `유효하지 않은 단어: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
octal: (issue) => `유효하지 않은 8진수: ${issue.received} 을(를) 받았습니다`,
partialCheck: (issue) => `유효하지 않은 입력: ${issue.received} 을(를) 받았습니다`,
regex: (issue) => `유효하지 않은 형식: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
safeInteger: (issue) => `유효하지 않은 안전한 정수: ${issue.received} 을(를) 받았습니다`,
size: (issue) => `유효하지 않은 크기: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
someItem: (issue) => `유효하지 않은 항목: ${issue.received} 을(를) 받았습니다`,
startsWith: (issue) => `유효하지 않은 시작: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
ulid: (issue) => `유효하지 않은 ULID: ${issue.received} 을(를) 받았습니다`,
url: (issue) => `유효하지 않은 URL: ${issue.received} 을(를) 받았습니다`,
uuid: (issue) => `유효하지 않은 UUID: ${issue.received} 을(를) 받았습니다`,
value: (issue) => `유효하지 않은 값: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
words: (issue) => `유효하지 않은 단어: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
},
};
Copy link
Contributor

@tats-u tats-u Nov 10, 2025

Choose a reason for hiding this comment

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

-const language: Language = {
+const language: Language = { ...ko, code: 'kr' };
-  code:               'kr',
-  schema:             (issue) => `유효하지 않은 타입: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
-  specific: {
-    base64:           (issue) => `유효하지 않은 Base64: ${issue.received} 을(를) 받았습니다`,
-    bic:              (issue) => `유효하지 않은 사업자 식별코드(BIC): ${issue.received} 을(를) 받았습니다`,
-    bytes:            (issue) => `유효하지 않은 바이트: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
-    check:            (issue) => `유효하지 않은 입력: ${issue.received} 을(를) 받았습니다`,
-    checkAsync:       (issue) => `유효하지 않은 입력: ${issue.received} 을(를) 받았습니다`,
-    checkItems:       (issue) => `유효하지 않은 항목: ${issue.received} 을(를) 받았습니다`,
-    checkItemsAsync:  (issue) => `유효하지 않은 항목: ${issue.received} 을(를) 받았습니다`,
-    creditCard:       (issue) => `유효하지 않은 신용카드: ${issue.received} 을(를) 받았습니다`,
-    cuid2:            (issue) => `유효하지 않은 Cuid2: ${issue.received} 을(를) 받았습니다`,
-    decimal:          (issue) => `유효하지 않은 십진수: ${issue.received} 을(를) 받았습니다`,
-    digits:           (issue) => `유효하지 않은 숫자: ${issue.received} 을(를) 받았습니다`,
-    email:            (issue) => `유효하지 않은 이메일: ${issue.received} 을(를) 받았습니다`,
-    emoji:            (issue) => `유효하지 않은 이모지: ${issue.received} 을(를) 받았습니다`,
-    empty:            (issue) => `유효하지 않은 길이: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
-    endsWith:         (issue) => `유효하지 않은 끝: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
-    everyItem:        (issue) => `유효하지 않은 항목: ${issue.received} 을(를) 받았습니다`,
-    excludes:         (issue) => `유효하지 않은 컨텐츠: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
-    finite:           (issue) => `유효하지 않은 유한 숫자: ${issue.received} 을(를) 받았습니다`,
-    graphemes:        (issue) => `유효하지 않은 그래프: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
-    hash:             (issue) => `유효하지 않은 해쉬: ${issue.received} 을(를) 받았습니다`,
-    hexColor:         (issue) => `유효하지 않은 hex 색상 코드: ${issue.received} 을(를) 받았습니다`,
-    hexadecimal:      (issue) => `유효하지 않은 16진수: ${issue.received} 을(를) 받았습니다`,
-    imei:             (issue) => `유효하지 않은 IMEI: ${issue.received} 을(를) 받았습니다`,
-    includes:         (issue) => `유효하지 않은 컨텐츠: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
-    integer:          (issue) => `유효하지 않은 정수: ${issue.received} 을(를) 받았습니다`,
-    ip:               (issue) => `유효하지 않은 IP: ${issue.received} 을(를) 받았습니다`,
-    ipv4:             (issue) => `유효하지 않은 IPv4: ${issue.received} 을(를) 받았습니다`,
-    ipv6:             (issue) => `유효하지 않은 IPv6: ${issue.received} 을(를) 받았습니다`,
-    isoDate:          (issue) => `유효하지 않은 날짜: ${issue.received} 을(를) 받았습니다`,
-    isoDateTime:      (issue) => `유효하지 않은 날짜-시각: ${issue.received} 을(를) 받았습니다`,
-    isoTime:          (issue) => `유효하지 않은 시각: ${issue.received} 을(를) 받았습니다`,
-    isoTimeSecond:    (issue) => `유효하지 않은 시각-초: ${issue.received} 을(를) 받았습니다`,
-    isoTimestamp:     (issue) => `유효하지 않은 타임스탬프: ${issue.received} 을(를) 받았습니다`,
-    isoWeek:          (issue) => `유효하지 않은 주: ${issue.received} 을(를) 받았습니다`,
-    length:           (issue) => `유효하지 않은 길이: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
-    mac:              (issue) => `유효하지 않은 MAC: ${issue.received} 을(를) 받았습니다`,
-    mac48:            (issue) => `유효하지 않은 48-bit MAC: ${issue.received} 을(를) 받았습니다`,
-    mac64:            (issue) => `유효하지 않은 64-bit MAC: ${issue.received} 을(를) 받았습니다`,
-    maxBytes:         (issue) => `유효하지 않은 바이트: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
-    maxGraphemes:     (issue) => `유효하지 않은 그래프: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
-    maxLength:        (issue) => `유효하지 않은 길이: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
-    maxSize:          (issue) => `유효하지 않은 크기: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
-    maxValue:         (issue) => `유효하지 않은 값: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
-    maxWords:         (issue) => `유효하지 않은 단어: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
-    mimeType:         (issue) => `유효하지 않은 MIME 타입: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
-    minBytes:         (issue) => `유효하지 않은 바이트: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
-    minGraphemes:     (issue) => `유효하지 않은 그래프: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
-    minLength:        (issue) => `유효하지 않은 길이: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
-    minSize:          (issue) => `유효하지 않은 크기: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
-    minValue:         (issue) => `유효하지 않은 값: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
-    minWords:         (issue) => `유효하지 않은 단어: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
-    multipleOf:       (issue) => `유효하지 않은 배수: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
-    nanoid:           (issue) => `유효하지 않은 Nano ID: ${issue.received} 을(를) 받았습니다`,
-    nonEmpty:         (issue) => `유효하지 않은 길이: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
-    notBytes:         (issue) => `유효하지 않은 바이트: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
-    notGraphemes:     (issue) => `유효하지 않은 그래프: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
-    notLength:        (issue) => `유효하지 않은 길이: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
-    notSize:          (issue) => `유효하지 않은 크기: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
-    notValue:         (issue) => `유효하지 않은 값: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
-    notWords:         (issue) => `유효하지 않은 단어: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
-    octal:            (issue) => `유효하지 않은 8진수: ${issue.received} 을(를) 받았습니다`,
-    partialCheck:     (issue) => `유효하지 않은 입력: ${issue.received} 을(를) 받았습니다`,
-    regex:            (issue) => `유효하지 않은 형식: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
-    safeInteger:      (issue) => `유효하지 않은 안전한 정수: ${issue.received} 을(를) 받았습니다`,
-    size:             (issue) => `유효하지 않은 크기: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
-    someItem:         (issue) => `유효하지 않은 항목: ${issue.received} 을(를) 받았습니다`,
-    startsWith:       (issue) => `유효하지 않은 시작: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
-    ulid:             (issue) => `유효하지 않은 ULID: ${issue.received} 을(를) 받았습니다`,
-    url:              (issue) => `유효하지 않은 URL: ${issue.received} 을(를) 받았습니다`,
-    uuid:             (issue) => `유효하지 않은 UUID: ${issue.received} 을(를) 받았습니다`,
-    value:            (issue) => `유효하지 않은 값: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
-    words:            (issue) => `유효하지 않은 단어: ${issue.expected} 을(를) 예상했으나 ${issue.received} 을(를) 받았습니다`,
-  },
-};

↓GitHub probably has a bug:

Suggested change
const language: Language = { ...ko, code: 'kr' };

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

Labels

fix A smaller enhancement or bug fix size:XL This PR changes 500-999 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Incorrect ISO 639-1 code for Korean language

3 participants