[EXT-017][실무] 수량에 맞는 문구 고르기 > IT 기술 공유

본문 바로가기
사이트 내 전체검색

IT 기술 공유

[EXT-017][실무] 수량에 맞는 문구 고르기

페이지 정보

profile_image
작성자 기술팀장
댓글 0건 조회 11회 작성일 26-09-08 07:36

본문

[이번 수업]

영어의 1 file과 2 files처럼 수량에 따라 문장이 달라지는 언어가 있습니다. 이번에는 복수 규칙(plural rule, 숫자에 맞는 문장 형태를 고르는 언어별 규칙)을 Intl.PluralRules로 적용합니다.

[선수지식]

JavaScript 함수·객체와 Node.js 실행 방법을 알아야 합니다. 언어 선택은 EXT-016, 숫자 표시는 EXT-015에서 연습합니다.

[학습목표]

1. 복수 범주가 언어마다 다른 이유를 설명한다.
2. Intl.PluralRules가 고른 범주를 번역 문구와 연결한다.
3. cardinal과 ordinal 규칙을 구분한다.

[핵심개념]

Unicode CLDR은 zero, one, two, few, many, other라는 복수 범주를 정의하지만 모든 언어가 전부 사용하지는 않습니다. 영어 기수(cardinal, 개수를 나타내는 수)는 보통 one과 other를 사용하고, 한국어 기수는 예제의 수들에서 모두 other가 됩니다. one이 항상 숫자 1만을 뜻한다고 가정하지 말고 로케일 규칙의 결과를 사용하세요. other는 반드시 대비책으로 준비합니다.

cardinal은 파일 2개처럼 수량을 나타내고, ordinal은 1st·2nd처럼 순서를 나타냅니다. Intl.PluralRules의 select는 완성 문장이 아닌 범주 문자열만 반환합니다. 프로그램은 그 범주를 번역 문구와 연결하고 숫자는 Intl.NumberFormat으로 따로 표시합니다.

[따라하기]

plural_message.js 파일에 다음 코드를 저장합니다.

```javascript
const messages = {
  en: { one: "{count} file", other: "{count} files" },
  ko: { other: "파일 {count}개" },
};

function fileMessage(locale, count) {
  const language = new Intl.Locale(locale).language;
  const table = messages[language] ?? messages.en;
  const rules = new Intl.PluralRules(locale, { type: "cardinal" });
  const category = rules.select(count);
  const template = table[category] ?? table.other;
  const shown = new Intl.NumberFormat(locale).format(count);
  return template.replace("{count}", shown);
}

console.log(fileMessage("en-US", 1));
console.log(fileMessage("en-US", 2));
console.log(fileMessage("ko-KR", 1));
console.log(fileMessage("ko-KR", 5));
```

Windows PowerShell·명령 프롬프트, macOS 터미널, Linux 셸에서 다음 명령을 실행합니다.

```text
node plural_message.js
```

예상 결과입니다.

```text
1 file
2 files
파일 1개
파일 5개
```

Node.js의 Intl은 ICU와 CLDR 데이터를 사용합니다. 지원 로케일이나 세부 결과는 데이터 버전의 영향을 받을 수 있으므로 운영과 테스트의 Node.js 계열을 맞추세요. 새 언어는 CLDR 규칙표에서 필요한 범주를 확인하고 문장 전체를 검토해야 합니다.

[흔한 실수]

첫째, 모든 언어에 count === 1 조건만 적용합니다. 둘째, 영어 단어 뒤에 s만 붙이고 국제화를 끝냅니다. 셋째, 필요한 범주가 번역에 없는데 other 대비책도 두지 않습니다. 넷째, cardinal과 ordinal을 바꿔 씁니다. 다섯째, 화면용 "1,000" 문자열을 규칙에 넣습니다. 검증된 숫자를 전달하세요.

[보안 주의]

count가 유한한 숫자이며 허용 범위 안인지 서버에서 검증하고 locale은 지원 목록으로 제한하세요. 범주나 로케일을 파일 경로로 조합하지 않습니다. 번역 문구에 사용자 입력을 넣어 HTML로 보여 줄 때는 이스케이프하세요. 복수 문구는 재고나 결제 수량의 권위 있는 값이 아니므로 업무 규칙은 서버 값으로 다시 검사합니다. 실습은 본인 소유의 로컬 파일에서만 진행합니다.

[직접 해볼 과제]

0과 3을 영어·한국어로 출력하세요. 이어서 new Intl.PluralRules("en", { type: "ordinal" })로 1, 2, 3, 4의 범주를 출력하고 cardinal 결과와 비교하세요. messages에서 en의 other를 제거했을 때 생기는 문제와 필요한 검증도 적어 보세요.

[확인문제]

1. 복수 범주의 one을 모든 언어에서 숫자 1과 같다고 보면 안 되는 이유는 무엇인가요?
2. cardinal과 ordinal은 각각 어떤 상황에 사용하나요?
3. 번역 카탈로그에 other 문구가 필요한 이유는 무엇인가요?

[다음 학습]

다음에는 이름 목록을 언어에 맞는 쉼표와 접속사로 조합하는 Intl.ListFormat을 학습합니다.

[공식 참고 자료]

ECMA-402 PluralRules 객체
https://tc39.es/ecma402/#pluralrules-objects

Unicode LDML 언어별 복수 규칙
https://www.unicode.org/reports/tr35/tr35-numbers.html#Language_Plural_Rules

Unicode CLDR 복수 규칙표
https://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html

Unicode CLDR 복수 규칙 안내
https://cldr.unicode.org/index/cldr-spec/plural-rules

Node.js 국제화 지원과 ICU
https://nodejs.org/api/intl.html

댓글목록

등록된 댓글이 없습니다.

회원로그인

회원가입

사이트 정보

회사명 : 회사명 / 대표 : 대표자명
주소 : OO도 OO시 OO구 OO동 123-45
사업자 등록번호 : 123-45-67890
전화 : 02-123-4567 팩스 : 02-123-4568
통신판매업신고번호 : 제 OO구 - 123호
개인정보관리책임자 : 정보책임자명

접속자집계

오늘
4,398
어제
6,862
최대
16,772
전체
770,349
Copyright © 소유하신 도메인. All rights reserved.