ECMAScript 2026 국제화 API 명세서 (ECMA-402 13번째 판)는 ECMA-262를 보완하는 주요 언어 민감 기능을 제공합니다. 이 기능들은 유니코드 국제화 컴포넌트(ICU) 라이브러리 (https://unicode-org.github.io/icu-docs/), .NET 프레임워크, Java 플랫폼
등 잘 알려진 국제화 API에서 선택되었습니다.
1번째 판 API는 Nebojša Ćirić와 Jungshik Shin의 제안에 기반하여 2010년 9월 Ecma TC39가 설립한 임시 그룹에 의해 개발되었습니다.
2번째 판 API는 2015년 6월 총회에서 ECMAScript 6번째 판을 보완하는 것으로 채택되었습니다.
3번째 판 API는 Ecma TC39의 새로운 연간 릴리즈 주기와 오픈 개발 프로세스 하에 처음으로 출시되었습니다. ECMA-402 소스 문서에서 평문 소스 문서가 구축되어
GitHub에서 완전히 개발의 기반이 되었습니다. 이 표준의 개발 기간 동안 수십 건의 풀 리퀘스트와 이슈가 제출되어 여러 버그 수정, 편집 수정 및 기타 개선 사항이 반영되었습니다. 또한 Ecmarkup,
Ecmarkdown, Grammarkdown 등 다양한 소프트웨어 도구가 개발되어 이 작업을 지원했습니다.
수많은 조직을 대표하는 수십 명의 개인이 Ecma TC39 내에서 이 판과 이전 판의 개발에 매우 중요한 기여를 했습니다. 또한 TC39의 ECMAScript 활동을 지원하는 활발한 커뮤니티가
형성되었습니다. 이 커뮤니티는 수많은 초안 검토, 버그 리포트 제출, 구현 실험, 테스트 스위트 기여, ECMAScript 국제화에 대한 전 세계 개발자 커뮤니티 교육을 수행했습니다. 불행히도 이 작업에
기여한 모든 사람과 조직을 식별하고 인정하는 것은 불가능합니다.
Norbert Lindenberg
ECMA-402, 1번째 판 프로젝트 에디터
Rick Waldron
ECMA-402, 2번째 판 프로젝트 에디터
Caridy Patiño
ECMA-402, 3번째, 4번째, 5번째 판 프로젝트 에디터
Caridy Patiño, Daniel Ehrenberg, Leo Balter
ECMA-402, 6번째 판 프로젝트 에디터
Leo Balter, Valerie Young, Isaac Durazo
ECMA-402, 7번째 판 프로젝트 에디터
Leo Balter, Richard Gibson
ECMA-402, 8번째 판 프로젝트 에디터
Leo Balter, Richard Gibson, Ujjwal Sharma
ECMA-402, 9번째 판 프로젝트 에디터
Richard Gibson, Ujjwal Sharma
ECMA-402, 10번째 판 프로젝트 에디터
Richard Gibson, Ujjwal Sharma
ECMA-402, 11번째 판 프로젝트 에디터
Ben Allen, Richard Gibson, Ujjwal Sharma
ECMA-402, 12번째 판 프로젝트 에디터
Ben Allen, Richard Gibson, Ujjwal Sharma
ECMA-402, 13번째 판 프로젝트 에디터
1 범위
이 표준은 다양한 인간 언어와 국가에서 사용되는 언어적 및 문화적 관습에 맞게 프로그램을 조정해야 하는 ECMAScript 객체를 위한 응용 프로그램 프로그래밍 인터페이스를 정의합니다.
2 적합성
이 명세의 적합한 구현은 ECMA-262를 준수해야 하며, 이 명세에서 설명된 모든 객체, 속성, 함수 및 프로그램 의미론을 제공하고 지원해야 합니다. 이 명세의 어떤 내용도 ECMA-262에서 금지된
동작을 허용하도록 의도된 것이 아니며, 그러한 충돌은 ECMA-262의 제약을 무시하는 것이 아니라 편집상의 오류로 간주해야 합니다.
적합한 구현은 이 명세에서 설명된 것 외에도 추가적인 객체, 속성, 함수 등을 제공할 수 있습니다. 특히, 적합한 구현은 이 명세에서 설명되지 않은 속성 및 해당 속성의 값을, 여기서 설명된 객체에 대해
제공할 수 있습니다. 적합한 구현은 이 명세에서 정의된 함수에 선택적 인수를 추가하는 것은 허용되지 않습니다.
적합한 구현은 다음 options 인수의 속성에 대해 추가 값을 허용하고, RangeError를 발생시키는 대신 구현 정의 동작을 할 수 있습니다:
모든 생성자와 supportedLocalesOf 메서드에서 options 속성 "localeMatcher".
Collator 생성자에서 options 속성 "usage" 및 "sensitivity".
NumberFormat 생성자에서 options 속성 "minimumIntegerDigits", "minimumFractionDigits", "maximumFractionDigits",
"minimumSignificantDigits", "maximumSignificantDigits", 추가 값이 지정된 제한보다 더 큰 정수 값으로 해석되는 경우.
PluralRules 생성자에서 options 속성 "minimumIntegerDigits", "minimumFractionDigits", "maximumFractionDigits",
"minimumSignificantDigits", 추가 값이 지정된 제한보다 더 큰 정수 값으로 해석되는 경우.
PluralRules 생성자에서 options 속성 "type".
RelativeTimeFormat 생성자에서 options 속성 "style" 및 "numeric".
DisplayNames 생성자에서 options 속성 "style" 및 "type".
3 규범적 참고문헌
다음에 참조된 문서는 이 문서의 적용에 필요합니다. 날짜가 명시된 참고문헌의 경우, 인용된 판만 적용됩니다. 날짜가 명시되지 않은 참고문헌의 경우, 참조된 문서의 최신 판(모든 개정 포함)이 적용됩니다.
이 명세의 섹션들은 이러한 참고문헌에 의존하며, 최신 표준과 일치하도록 최선을 다해 업데이트되지만, 항상 최신 상태를 보장하지는 않습니다.
4 개요
이 섹션은 비규범적입니다.
4.1 국제화, 지역화, 그리고 세계화
소프트웨어의 국제화란 다양한 언어를 사용하는 사용자와 서로 다른 문화적 기대를 가진 사용자의 요구를 지원하거나 쉽게 적응할 수 있도록 설계하는 것을 의미하며, 전 세계 사용자 간의 소통을 가능하게
합니다. 지역화는 특정 언어와 문화에 실제로 적응하는 과정입니다. 소프트웨어의 세계화는 일반적으로 국제화와 지역화의 결합으로 이해됩니다. 세계화는 모든 언어를 지원하는 텍스트 표현을 사용하고, 언어,
국가, 시간대 및 기타 관련 매개변수를 식별하기 위해 표준 식별자를 사용하는 가장 낮은 수준에서 시작합니다. 이후 사용자가 이해할 수 있는 사용자 인터페이스 언어와 데이터 표현을 사용하며, 마지막으로
제품별로 사용자의 언어, 문화, 환경에 맞춘 적응이 필요할 수 있습니다.
ECMA-262는 텍스트 표현에 유니코드를 사용하고 몇 가지 언어 민감 함수들을 제공함으로써 기반을 마련하지만, 이러한 함수들의 동작을 애플리케이션이 제어할 수 있는 방법은 거의 제공하지 않습니다. 이
명세는 커스터마이즈 가능한 언어 민감 기능을 제공함으로써 그 기반 위에 구축됩니다. 이 API는 국제화되지 않은 애플리케이션에도 유용하며, 단일 언어와 지역만을 대상으로 하는 애플리케이션도 해당 언어와
지역을 제대로 지원해야 하기 때문입니다. 또한, 이 API는 여러 언어와 지역을 동시에 지원해야 하는 서버 환경 등에서 필요한 애플리케이션도 지원할 수 있습니다.
4.2 API 개요
이 명세는 ECMA-262를 보완하기 위해 주요 언어 민감 기능을 제공하도록 설계되었으며, 전체 또는 일부를 구현에 추가할 수 있습니다. 이 명세는 ECMAScript 코드에서 관찰 가능한 새로운 언어
값(예: [[FallbackSymbol]] 내부 슬롯의 값 및 %Intl%에서 프로퍼티 접근을 통해 전이적으로
도달 가능한 값의 집합)을 도입하며, ECMA-262에서 명세된 일부 함수의 정의도 정제합니다(아래에서 설명). 두 범주 모두 ECMA-262에서 정의된 값과 인터페이스에 대해 허용된 동작을 금지하지
않으므로, 이 명세를 모든 구현에서 채택할 수 있도록 지원합니다.
이 명세는 대부분의 애플리케이션에서 필요한 여러 주요 언어 민감 기능을 제공합니다: 로케일 선택 및 검사, 문자열 비교(정렬) 및 대소문자 변환, 복수 규칙, 텍스트 분할, 숫자, 절대 및 상대 날짜와
시간, 기간, 리스트의 포매팅. ECMA-262는 이러한 기본 기능에 대한 함수를 제공합니다(Array.prototype에서: toLocaleString; String.prototype에서: localeCompare, toLocaleLowerCase,
toLocaleUpperCase; Number.prototype에서: toLocaleString;
Date.prototype에서: toLocaleString, toLocaleDateString,
toLocaleTimeString), 하지만 실제 동작은 대부분 구현 정의입니다. 이 명세는 추가 기능, 언어 및 동작 세부사항에 대한 제어, 그리고 요구되는 기능에 대한 더 완전한 명세를 제공합니다.
애플리케이션은 API를 두 가지 방식으로 사용할 수 있습니다:
서비스 생성자를 직접 사용하여 객체를 생성하고, 선호하는 언어 목록과 동작을 구성할 옵션을 지정합니다. 객체는 주요 함수(compare, select, format 등)를 제공하며,
반복적으로 호출할 수 있습니다. 또한, 애플리케이션이 객체의 정확한 구성 정보를 확인할 수 있도록 resolvedOptions 함수를 제공합니다.
위에서 언급한 ECMA-262의 함수들을 간접적으로 사용합니다. 정렬 및 포매팅 함수는 이 명세에서 Collator, NumberFormat, DateTimeFormat 생성자와 동일한 인자를 받아
compare 또는 format 메서드와 동일한 결과를 생성하도록 재정의됩니다. 대소문자 변환 함수는 선호하는 언어 목록을 받아들이도록 재정의됩니다.
ECMA 402 v1에서는 Intl 생성자가 기존 객체를 수신자로 받아 호출될 때 관련 내부 슬롯을 추가하여 해당 객체를 클래스의 인스턴스로 변환하는 동작을 지원했습니다. ECMA 402 v2에서는 기존
객체에 내부 슬롯을 추가하지 않도록 이 기능이 제거되었습니다. ECMA 402 v3에서는 생성자가 호출될 때 모든 객체에 기본 Intl 인스턴스를 체인하는 "규범적 선택적" 모드로 이 기능이 다시
추가되었습니다. 자세한 내용은 이슈 57을 참고하세요.
4.4 구현 종속성
국제화의 특성상, 이 명세는 여러 세부사항을 구현 종속적으로 남겨둬야 합니다:
구현이 충분한 지역화로 지원하는 로케일의 집합: 언어학자들은 수천 개의 인간 언어를 기술했으며, IANA 언어 서브태그 레지스트리에는 로케일 식별자의 기반이 되는 7000개 이상의 주요
언어 서브태그가 포함되어 있습니다. Common Locale Data Repository와 같은 대규모 로케일 데이터 컬렉션도 모든 언어와 그 지역 또는 방언 변형의 극히 일부만을 다룹니다. 리소스가
제한된 장치를 대상으로 하는 구현은 이 집합을 더욱 줄여야 할 수도 있습니다.
포매트 패턴과 같은 지역화의 정확한 형태: 많은 경우 로케일에 따라 달라지는 관습이 표준화되어 있지 않아 여러 형태가 공존하거나 시간이 지나면서 변화합니다. 다양한 국제화 라이브러리들이
서로 다른 형태를 구현했을 수 있으며, 그 중 어느 것도 실제로 잘못된 것은 아닙니다. 이 API가 기존 라이브러리 위에 구현될 수 있도록 이러한 변형을 허용해야 합니다.
유니코드의 부분집합: 정렬과 같은 일부 연산은 전체 유니코드 문자 집합의 문자를 포함하는 문자열에 대해 동작합니다. 그러나 유니코드 표준과 ECMAScript 표준 모두 구현이 유니코드
문자 집합의 부분집합으로 기능을 제한할 수 있도록 허용합니다. 또한, 로케일 관습은 일반적으로 전체 유니코드 문자 집합에 대한 동작을 지정하지 않고, 해당 로케일에 관련된 문자에 대해서만 지정합니다.
유니코드 정렬 알고리즘은 전체 유니코드 문자 집합에 대한 기본 정렬 순서와 로컬 관습에 맞춘 맞춤 기능을 결합하지만, 부분집합과 맞춤은 여전히 동작의 차이를 초래합니다.
브라우저 구현에서는 특정 오리진에 대해 보이는 로케일, 통화, 달력, 숫자 시스템 및 기타 열거 가능한 항목의 초기 집합이 동일한 사용자 에이전트 문자열(엔진 및 플랫폼 버전)을 공유하는 모든 사용자에게
동일해야 합니다. 또한, 이러한 집합의 동적 변경은 사용자가 서로 구별될 수 있도록 해서는 안 됩니다. 이 제약은 국제화에 내재된 지문 채취 위험을 줄이기 위해 부과되었으며, 향후 개정에서 완화될 수
있습니다. 이 제약의 결과로, 브라우저 구현이 온디맨드 로케일 설치를 허용하고 특정 오리진에서 새로운 로케일 설치가 필요할 수 있는 요청을 처음 받을 때, 해당 로케일이 이미 설치되어 있는지 여부를
공개해서는 안 됩니다.
이 명세 전체에서 구현 및 로케일 종속 동작은 ILD로, 구현, 로케일, 숫자 시스템 종속 동작은 ILND로 지칭합니다.
4.4.1 구현 간 호환성
ECMA 402는 함수에서 사용하는 데이터의 스키마를 기술합니다.
내부 데이터는 구현 종속적이며, 시간이 지남에 따라 변경되고 구현마다 다를 수 있습니다.
이러한 변형은 프로그래머에게 보이며, 특정 출력에 의존하는 프로그램을 작성할 수도 있습니다.
그러나 이 명세는 잘 작성된 프로그램이 구현 간에 동작할 수 있도록 합리적인 제약을 기술하려고 합니다.
구현은 언어 데이터의 조화를 계속 노력해야 합니다.
ECMA-262에서 설명한 바와 같이, 알고리즘은 ECMAScript 구성 요소의 요구되는 의미를 정확하게 명세하기 위해 사용되지만, 특정 구현 기술의 사용을 암시하는 것은 아닙니다. 내부 슬롯은 객체 값의
의미를 정의하기 위해 사용되지만 API의 일부가 아닙니다. 순전히 설명 목적으로 정의됩니다. API 구현은 내부 슬롯을 여기서 설명한 방식대로 생성하고 동작하는 것처럼 동작해야 합니다.
Record 명세 타입의 확장으로, “[[<name>]]” 표기는 변수 name이 String 값이어야 하며, 그 이름이 주어진 필드를 나타냅니다. 예를 들어, 변수 s가 "a" 값을
갖는 경우 [[<s>]]는 필드 [[a]]를 나타냅니다.
이 명세는 Normative Optional로 구분된 블록을 사용하여 ECMA 262의 Annex B의 의미를 나타냅니다. 즉,
normative optional 섹션은 ECMAScript 호스트가 웹 브라우저일 때 필수입니다. 섹션의 내용은 규범적이지만 ECMAScript 호스트가 웹 브라우저가 아닌 경우 선택적입니다.
6 로케일, 통화, 시간대, 측정 단위, 숫자 시스템, 정렬, 달력 및 패턴 문자열의 식별
이 절에서는 로케일, 통화, 시간대, 측정 단위, 숫자 시스템, 정렬, 달력 및 패턴 문자열을 식별하기 위해 이 명세에서 사용되는 String 값에 대해 설명합니다.
6.1 대소문자 민감성과 대소문자 매핑
로케일, 통화, 스크립트, 시간대를 식별하는 데 사용되는 String 값은 ASCII 대소문자 구분 없이 해석되며, 코드 유닛 0x0041~0x005A(유니코드 문자 LATIN CAPITAL LETTER
A~Z)는 0x0061~0x007A(유니코드 문자 LATIN SMALL LETTER a~z)와 동일하게 취급됩니다. 다른 대소문자 변환 등가는 적용되지 않습니다.
Note
예를 들어, "ß" (U+00DF)는 "SS" (U+0053, U+0053)와 일치하거나 매핑되어서는 안 됩니다. "ı" (U+0131)는 "I" (U+0049)와 일치하거나 매핑되어서는 안
됩니다.
ASCII-uppercase는 String 값 S에서 ASCII 소문자 코드 유닛(0x0061~0x007A)을 해당하는 ASCII 대문자 코드 유닛(0x0041~0x005A)으로
바꾸고, 다른 코드 유닛은 그대로 유지하여 얻은 String 값입니다.
ASCII-lowercase는 String 값 S에서 ASCII 대문자 코드 유닛(0x0041~0x005A)을 해당하는 ASCII 소문자 코드 유닛(0x0061~0x007A)으로
바꾸고, 다른 코드 유닛은 그대로 유지하여 얻은 String 값입니다.
String 값 A가 String 값 B와 ASCII-case-insensitive match라면, A의 ASCII-uppercase가 B의
ASCII-uppercase와 정확히 동일한 코드 유닛 시퀀스임을 의미합니다. 유니코드 코드 포인트 시퀀스 A가 B와 ASCII-case-insensitive match라면, B가
CodePointsToString(A)와 ASCII-case-insensitive match임을 의미합니다.
로케일 식별자는 대소문자 구분 없는 Unicode Basic Latin 영숫자 서브태그로 구성되며, "-"
(U+002D HYPHEN-MINUS) 문자로 구분됩니다. 한 글자짜리 서브태그는 "싱글톤
서브태그"라고 합니다.
Unicode Technical Standard #35 Part 1 Core, Section 3.6
Unicode BCP 47 U Extension서브태그 시퀀스가 많이 사용되며, "Unicode 로케일 확장
시퀀스"는 unicode_locale_extensions Unicode 로케일 비종단 기호로 매칭될 수 있는 언어 태그의 가장 긴 부분
문자열을 의미하며, "-x-…" 프라이빗 사용 서브태그 시퀀스에는 포함되지 않습니다. "-u-"로 시작하며, 싱글톤
서브태그가 아닌 모든 서브태그와 그 앞의 "-" 구분자를 포함합니다. 예를 들어, "en-US-u-fw-mon-x-u-ex-foobar"의
Unicode 로케일 확장 시퀀스는 "-u-fw-mon"입니다.
모든 올바른 형식의 언어 태그는 이 명세에서 정의된 API에 사용할 수 있지만, 구현체는 이를 검증하기 위해 Unicode Common Locale Data Repository(CLDR) 데이터를 사용할 필요는 없습니다. 구현체가 지원하는 로케일과 언어 태그의 집합은 구현 정의입니다. Intl 생성자는 요청된 언어 태그를 각 구현체가 지원하는 로케일로 매핑합니다.
6.2.1 IsWellFormedLanguageTag ( locale )
The abstract operation IsWellFormedLanguageTag takes argument locale (a String) and returns a Boolean. locale가 unicode_bcp47_locale_id의
올바른 형식 제약을 준수하는 올바른 형식의 언어 태그인지 결정합니다. locale이 의미 있는 정보를
전달하는지, 별칭 서브태그와 선호되는 대체 서브태그를 구분하는지, 정규화된 대소문자 또는 서브태그 순서를 요구하는지는 고려하지 않습니다. It performs the following steps when called:
The abstract operation CanonicalizeUnicodeLocaleId takes argument locale (a language tag) and returns a Unicode canonicalized locale identifier. locale의 정규화되고 대소문자가 규칙화된 형태를 반환합니다. It performs the following steps when called:
The implementation-defined abstract operation DefaultLocale takes no arguments and returns a Unicode canonicalized locale identifier. 반환된 String 값은 호스트 환경의 현재 로케일에 대한 올바른 형식(6.2.1) 및
정규화된(6.2.2) 언어 태그를 나타냅니다. Unicode 로케일 확장 시퀀스를 포함해서는 안
됩니다.
Note
반환 값은 잠재적인 지문 추적 벡터입니다. 브라우저 환경에서는 navigator.language와 일치해야 추가적인 식별
정보를 제공하지 않습니다.
6.3 통화 코드
이 명세는 ISO 4217에서 정의된 3글자 통화 코드를 사용하여 통화를 식별합니다. 정규형은 대문자입니다.
모든 올바른 형식의 3글자 ISO 4217 통화 코드를 허용합니다. 그러나 통화 코드와 언어 태그의 조합 중 로컬라이즈된 통화 기호가 제공되는 집합은 구현에 따라 다릅니다. 로컬라이즈된 통화 기호가
없으면 ISO 4217 통화 코드가 포매팅에 사용됩니다.
6.3.1 IsWellFormedCurrencyCode ( currency )
The abstract operation IsWellFormedCurrencyCode takes argument currency (a String) and returns a Boolean. currency 인자가 올바른 형식의 3글자 ISO 4217 통화 코드인지 확인합니다. It performs the following steps when called:
normalized에 0x0041~0x005A(유니코드 문자 LATIN CAPITAL LETTER A~Z) 범위를 벗어난 코드 유닛이 있으면 false를 반환한다.
true를 반환한다.
6.4 AvailableCanonicalCurrencies ( )
The implementation-defined abstract operation AvailableCanonicalCurrencies takes no arguments and returns a List of Strings. 반환된 List는 코드 유닛의 사전순으로 정렬되어 있으며, 고유하고 올바른 형식의 대문자 정규화된 3글자 ISO 4217 통화 코드만 포함합니다. 구현체가 Intl.DisplayNames 및
Intl.NumberFormat 객체의 기능을 제공하는 통화를 식별합니다.
6.5 IANA 시간대 데이터베이스의 사용
이 명세를 채택하는 구현체는 시간대 인식이 되어야 하며, IANA 시간대 데이터베이스 https://www.iana.org/time-zones/를 사용하여 ECMAScript 계산 및 포매팅에 사용되는 사용
가능한 명명된 시간대 식별자와 데이터를 제공해야 합니다.
이 섹션은 시간대 인식 구현체가 IANA 시간대 데이터베이스를 어떻게 사용해야 하는지 정의합니다.
Zone 이름 또는 Link 이름이 아니면 사용 가능한 명명된 시간대 식별자가 될 수 없습니다.
ECMAScript 내장 객체가 반환하는 사용 가능한 명명된 시간대 식별자는 IANA 시간대 데이터베이스에 있는 대소문자를 사용해야 합니다.
IANA 시간대 데이터베이스의 각 Zone은 기본 시간대 식별자여야 하며, 각 Link 이름은 해당 Zone 이름으로 해석되는 비기본 시간대 식별자여야 합니다. 다음 예외는
AvailableNamedTimeZoneIdentifiers에서 구현됩니다:
역사적 이유로 "UTC"는 기본 시간대 식별자여야 합니다.
"Etc/UTC", "Etc/GMT", "GMT" 및 이들로 해석되는 모든 Link 이름은 비기본 시간대 식별자로서 "UTC"로 해석되어야 합니다.
zone.tab 파일의 “TZ” 열에 있는 Link 이름은 기본 시간대 식별자여야 합니다.
예를 들어, "Europe/Prague"와 "Europe/Bratislava" 모두 기본 시간대 식별자여야 합니다.
이 요구사항은 각 ISO 3166-1 Alpha-2 국가 코드마다 최소 하나의 기본 시간대
식별자를 보장하며, 한 국가의 시간대 규칙 변경이 다른 국가의 시간대에 영향을 주지 않도록 합니다(영토 경계가 변경되지 않는 한).
zone.tab의 “TZ” 열에 없는 Link 이름이 단일 ISO
3166-1 Alpha-2 국가 코드의 영토 내에 완전히 포함된 지리적 영역을 나타내는 경우, 해당 Link 이름은 동일한 국가 코드의 영토 내에 완전히 포함된 기본 식별자로 해석되어야
합니다.
예를 들어, "Atlantic/Jan_Mayen"은 "Arctic/Longyearbyen"으로 해석되어야 합니다.
Note
IANA 시간대 데이터베이스는 기본 시간대 식별자가 되는 사용 가능한 명명된 시간대 식별자에 영향을 주는 빌드 옵션을 제공합니다.
기본 빌드 옵션은 서로 다른 국가의 시간대를 병합하며, 예를 들어 "Atlantic/Reykjavik"은 "Africa/Abidjan" Zone에 대한 Link로 빌드됩니다.
지리적 및 정치적으로 구별되는 위치는 향후 IANA 시간대 데이터베이스 버전에서 시간대 규칙이 달라질 가능성이 높습니다.
위의 예외는 이러한 미래 호환성 문제를 완화하기 위한 것입니다.
Unicode Common Locale Data Repository(CLDR)는 위의 예외 대부분을 구현하여 사용 가능한 명명된
시간대 식별자가 기본 또는 비기본인지 결정합니다.
구현체 간 일관성을 위해 CLDR 데이터 사용이 권장되지만 필수는 아닙니다.
CLDR 기반이 아닌 구현체도 timezone.xml의
CLDR 식별자 데이터를 사용할 수 있습니다.
구현체는 PACKRATDATA=backzone PACKRATLIST=zone.tab과 같은 빌드 옵션을 사용하여 IANA 시간대 데이터베이스를 직접 빌드할 수도 있으며, 위
요구사항을 준수하기 위한 후처리를 수행할 수 있습니다.
IANA 시간대 데이터베이스는 일반적으로 연간 5~10회 업데이트됩니다.
이러한 업데이트는 새로운 Zone 또는 Link 이름을 추가하거나, Zone을 Link로 변경하거나, 각 Zone의 UTC 오프셋 및 전환을 변경할 수 있습니다.
구현체는 IANA 시간대 데이터베이스 업데이트를 가능한 한 빨리 포함하는 것이 권장됩니다.
이렇게 하면 ECMAScript 프로그램이 시간대에 민감한 계산을 정확하게 수행하고 외부 입력이나 호스트 환경에서 제공되는 새로 추가된 사용 가능한 명명된 시간대 식별자를 사용할 수 있습니다.
IANA 시간대 데이터베이스 관리자는 안정성을 위해 노력하지만, 드물게(연 평균 1회 미만) Zone이 새로운 Zone으로 대체될 수 있습니다.
예를 들어, 2022년 "Europe/Kiev"은 새 "Europe/Kyiv" Zone으로 대체되어 Link로 폐기되었습니다.
폐기된 Link는 이름이 변경된 시간대 식별자이고, 새로 추가된 Zone은 대체 시간대 식별자입니다.
이러한 드문 변경으로 인한 혼란을 줄이기 위해, 구현체는 처음에는 각 대체 시간대 식별자를 기존 이름이 변경된 시간대 식별자로 해석되는 비기본 시간대 식별자로 추가해야 합니다.
이렇게 하면 ECMAScript 프로그램이 두 식별자를 모두 인식할 수 있지만, 아직 대체 시간대 식별자를 인식하지 못하는 다른 시스템에 해당 식별자를 보내는 가능성도 줄어듭니다.
이름 변경 대기 기간이 지난 후, 구현체는 새 Zone을 기본 시간대 식별자로 승격하고, 동시에 이름이 변경된 시간대 식별자를 비기본으로
강등해야 합니다.
다른 시스템이 업데이트될 충분한 시간을 제공하기 위해 권장되는 이름 변경 대기 기간은 2년입니다.
그러나 반드시 정확하거나 동적으로 적용할 필요는 없습니다.
대신, 구현체는 시간대 데이터 업데이트의 일반 릴리스 과정에서 대기 기간이 지난 후 대체 시간대 식별자를 기본으로 만듭니다.
대기 기간은 새 Zone이 기존 Zone을 대체할 때만 적용해야 합니다.
기존 Zone과 Link가 서로 교환된 경우, 이름 변경이 발생한 것이 아니므로 대기 기간이 필요하지 않습니다.
구현체가 에이전트의 수명 동안 시간대 정보를 수정하는 경우, 사용 가능한 명명된 시간대 식별자 목록, 각 사용 가능한 명명된 시간대 식별자에 연결된 기본 시간대 식별자, 각 사용 가능한 명명된 시간대
식별자의 UTC 오프셋 및 전환이 이전에 해당 에이전트에서 관찰된 결과와 일치해야 합니다.
이 요구사항을 지원하는 복잡성 때문에, 구현체는 각 에이전트의 수명 동안 IANA 시간대 데이터베이스의 완전히 일관된 복사본을 유지하는 것이 권장됩니다.
Assert: result에 r가 있고, r.[[Identifier]]가 "UTC"이고 r.[[PrimaryIdentifier]]가 "UTC"이다.
result를 반환한다.
Note 1
위 알고리즘은 International Components for Unicode(ICU)의
icu::TimeZone::getIanaID() 동작과 Unicode Common Locale Data Repository(CLDR)의 시간대 식별자 데이터 유지 프로세스에 대응하도록 설계되었습니다.
이 알고리즘은 ISO 3166-1 Alpha-2 국가 코드 경계를 넘지 않고, zone.tab 및 backzone 파일의 데이터를 사용하여 Link를
기본 시간대 식별자로 해석합니다.
국가 코드가 zone.tab에 한 줄만 있으면 그 줄의 “TZ” 열이 기본 시간대 식별자를 결정합니다.
국가 코드가 zone.tab에 여러 줄 있으면, backzone의 역사적 매핑을 사용하여 올바른 기본 시간대 식별자를 식별해야 합니다.
예를 들어, "Pacific/Truk"(국가 코드 "FM")이 IANA 시간대 데이터베이스 기본 빌드 옵션에서 "Pacific/Port_Moresby"(국가 코드 "PG")에 대한 Link로
식별된다면, zone.tab의 “country-code” 열에서 "FM"에 해당하는 줄을 확인해야 합니다.
한 줄만 있다면 그 줄의 “TZ” 열이 "Pacific/Truk"에 연결된 기본 시간대 식별자를 결정합니다.
"FM"이 zone.tab에 여러 줄 있다면, backzone을 확인하고 "Link Pacific/Chuuk Pacific/Truk"과 같은 줄이
있으면 "Pacific/Chuuk"을 기본 시간대 식별자로 사용합니다.
zone.tab이 매핑 데이터의 선호 소스이며, backzone 매핑은 드물게 ISO 3166-1 Alpha-2 국가 코드 경계를 넘을 수 있습니다.
예를 들어, "Atlantic/Jan_Mayen"(국가 코드 "SJ")은 backzone에서 "Europe/Oslo"(국가 코드 "NO")로 매핑됩니다.
2024a IANA 시간대 데이터베이스 릴리스 기준으로, "Atlantic/Jan_Mayen"만 해당 사례가 있습니다.
Note 2
시간대 식별자는 IANA 시간대 데이터베이스에서 시간이 지남에 따라 변경될 수 있습니다.
최소한, 구현체는 AvailableNamedTimeZoneIdentifiers의 결과 변경을 GetAvailableNamedTimeZoneIdentifier가 허용하는 변경으로 제한하는 것이
권장됩니다.
이러한 권장사항을 지원하는 복잡성 때문에, AvailableNamedTimeZoneIdentifiers(그리고 GetAvailableNamedTimeZoneIdentifier의 결과도)는 에이전트의
수명 동안 동일하게 유지하는 것이 권장됩니다.
The abstract operation GetAvailableNamedTimeZoneIdentifier takes argument timeZoneIdentifier (a String) and returns either a Time Zone Identifier Record or empty.
timeZoneIdentifier가 사용 가능한 명명된 시간대 식별자라면, AvailableNamedTimeZoneIdentifiers가 반환한 Record 중 하나를 반환합니다.
그렇지 않으면 empty를 반환합니다.
It performs the following steps when called:
The abstract operation AvailablePrimaryTimeZoneIdentifiers takes no arguments and returns a List of Strings. 반환된 List는 IANA 시간대 데이터베이스에서 지원되는 Zone 및 Link 이름의 정렬된 List입니다. It performs the following steps when called:
The abstract operation StringSplitToList takes arguments S (a String) and separator (a String) and returns a List of Strings.
반환된 List는 S에서 separator를 포함하지 않는 모든 분리된 부분 문자열을 포함하며, 각 부분 문자열은 separator 바로 앞뒤에 위치합니다.
인접한 separator 사이, S 맨 처음 separator 앞, S 맨 끝 separator 뒤에는 빈 문자열이 될 수 있지만, 그 외에는 빈 문자열이 아닙니다.
It performs the following steps when called:
The abstract operation IsWellFormedUnitIdentifier takes argument unitIdentifier (a String) and returns a Boolean. unitIdentifier 인자가 허용된 단일 단위이거나 두 허용된 단일 단위의 나눗셈으로 구성된 올바른 형식의 코어 단위 식별자인지 확인합니다. It performs the following steps when called:
The abstract operation AvailableCanonicalUnits takes no arguments and returns a List of Strings. 반환된 List는 코드 유닛의 사전순으로 정렬되어 있으며, Table 2의 각
행(헤더 제외)에 나열된 단순 단위 식별자의 고유 값으로 구성됩니다.
The implementation-defined abstract operation AvailableCanonicalNumberingSystems takes no arguments and returns a List of Strings. 반환된 List는 코드 유닛의 사전순으로 정렬되어 있으며, 구현체가 Intl.DateTimeFormat, Intl.NumberFormat, Intl.RelativeTimeFormat 객체의
기능을 제공하는 숫자 시스템을 식별하는 고유한 정규화된 숫자 시스템 식별자만 포함합니다. List에는 Table 30의 각 행(헤더 제외)의 Numbering System 값이 포함되어야 합니다.
The implementation-defined abstract operation AvailableCanonicalCollations takes no arguments and returns a List of Strings. 반환된 List는 코드 유닛의 사전순으로 정렬되어 있으며, 구현체가 Intl.Collator 객체의 기능을 제공하는 정렬 유형을 식별하는 고유한 정규화된 값만 포함합니다.
The implementation-defined abstract operation AvailableCalendars takes no arguments and returns a List of Strings. 반환된 List는 코드 유닛의 사전순으로 정렬되어 있으며, 구현체가 Intl.DateTimeFormat 객체의 기능을 제공하는 달력을 식별하는 고유한 정규화된 달력 유형만 포함합니다(예:
"islamicc"와 "islamic-civil" 모두 포함하거나 모두 제외). List에는 "iso8601"가 포함되어야 합니다.
6.10 패턴 문자열 유형
Pattern String은 "{key}" 형태의 부분 문자열을 0개 이상 포함하는 String 값이며, key는 ASCII 단어 문자로만 구성된 비어 있지 않은 시퀀스일 수
있습니다. 추상 패턴 문자열의 구문은 구현 세부사항이며 ECMA-402 사용자에게 노출되지 않습니다.
해결 옵션 디스크립터는 [[Key]](문자열,
일반적으로 [[RelevantExtensionKeys]] 리스트의 요소)와 [[Property]](문자열) 필드를 가진 레코드이며, 선택적으로 [[Type]](boolean 또는 string)과
[[Values]](empty 또는 ECMAScript 언어 값 리스트)도 포함할 수 있습니다. 이는 객체 생성 중 로케일 해결에 관련된 옵션을 읽는 방법을 설명합니다.
[[AvailableLocales]]는 사용 가능한 로케일 목록입니다. DefaultLocale에서 반환된 값을 반드시 포함해야 합니다. 또한, 두 개 이상의 서브태그를 가진 각 요소에 대해,
동일한 언어 서브태그와 동일한 후속 서브태그의 엄격한 부분집합(즉, 하나 이상 생략)으로 구성된 더 좁은 언어 태그도 포함해야 하며, 이는 ResolveLocale의 잠재적 폴백으로 사용됩니다. 특히, 언어 서브태그, 스크립트 서브태그, 지역 서브태그를 모두 가진 각
요소는 동일한 언어 서브태그와 지역 서브태그만 포함하고 스크립트 서브태그가 없는 또 다른 요소와 함께해야 합니다. 예를 들어,
[[AvailableLocales]]에 "de-DE"가 포함되어 있다면, "de"도 포함되어야 합니다(이는 "de-AT" 및 "de-CH"와 같은 요청된 로케일을 만족시키기
위해 선택될 수 있습니다).
[[AvailableLocales]]에 "az-Latn-AZ"가 포함되어 있다면, "az-AZ"도 포함되어야 합니다(이는 "az-Cyrl-AZ"와 같은 요청된 로케일을 만족시키기
위해 "az-Cyrl"이 사용 불가능할 때 선택될 수 있습니다).
[[ResolutionOptionDescriptors]]는 객체 생성 중 옵션을 읽기 위해 사용되는 해결 옵션 디스크립터 리스트입니다.
[[SortLocaleData]], [[SearchLocaleData]](Intl.Collator용), 그리고 [[LocaleData]](다른 모든 서비스 생성자용)는 레코드입니다. 각 서비스
생성자에 특정한 필드 외에도, 각 레코드는 [[AvailableLocales]]에 포함된 각 로케일에 대한 필드를 가집니다. 각 로케일명 필드의 값은 레코드이며,
[[RelevantExtensionKeys]]의 각 요소가 해당 로케일에서 구현이 지원하는 유니코드 로케일 확장 시퀀스 키에 대한 타입 값 리스트를 나타내는 필드명을 식별합니다. 리스트의 첫 번째
요소는 해당 로케일에서 해당 키의 기본값을 제공합니다.
Note
예를 들어, DateTimeFormat 구현은 [[AvailableLocales]] 내부 슬롯에 언어 태그"fa-IR"를 포함할 수 있으며, 11.2.3에 따라 [[RelevantExtensionKeys]] 내부 슬롯에 키 "ca",
"hc", "nu"를 포함해야 합니다.
해당 로케일의 기본 달력은 일반적으로 "persian"이지만, 구현은 "gregory", "islamic", "islamic-civil"도 지원할 수 있습니다.
DateTimeFormat [[LocaleData]] 내부 슬롯의 레코드는 [[fa-IR]] 필드에 { [[ca]]: « "persian", "gregory", "islamic",
"islamic-civil" », [[hc]]: « … », [[nu]]: « … » }와 같은 값을 포함하며, 다른 로케일명 필드도 동일한 값 구조이지만 리스트의 요소는 다릅니다.
9.2 추상 연산
9.2.1 CanonicalizeLocaleList ( locales )
The abstract operation CanonicalizeLocaleList takes argument locales (ECMAScript 언어 값) and returns 정상 완료 시 언어 우선순위 목록 또는 throw 완료. It performs the following steps when called:
locales가 undefined이면,
새로운 빈 리스트를 반환한다.
seen을 새로운 빈 리스트로 한다.
locales가 문자열이거나 locales가 객체이고 [[InitializedLocale]] 내부 슬롯을 가진 경우,
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. 반환된 문자열은 ukey의 값으로서 uvalue의 정규화 및 대소문자 규칙화된 형태입니다. It performs the following steps when called:
The abstract operation LookupMatchingLocaleByPrefix takes arguments availableLocales (사용 가능한 로케일 목록) and requestedLocales (언어 우선순위 목록) and returns [[locale]](유니코드 정규화된 로케일 식별자)와 [[extension]](유니코드 로케일 확장 시퀀스 또는 empty) 필드를 가진 레코드 또는 undefined. 이는 BCP 47의 RFC 4647 section 3.4에서 정의된 lookup 알고리즘을
사용하여, 유니코드 로케일 확장 시퀀스를 무시하고 requestedLocales를 만족시키기 위한 availableLocales의 최적 요소를 결정합니다. 비기본 매치가 발견되면,
availableLocales의 매칭 언어 태그와 requestedLocales의 해당 요소의 유니코드 로케일 확장 시퀀스를(없으면 empty) 포함하는 레코드를 반환합니다. It performs the following steps when called:
The implementation-defined abstract operation LookupMatchingLocaleByBestFit takes arguments availableLocales (사용 가능한 로케일 목록) and requestedLocales (언어 우선순위 목록) and returns [[locale]](유니코드 정규화된 로케일 식별자)와 [[extension]](유니코드 로케일 확장 시퀀스 또는 empty) 필드를 가진 레코드 또는 undefined. 이는 구현에 따라 달라지는 알고리즘으로, 유니코드 로케일 확장 시퀀스를 무시하고 requestedLocales를 만족시키기 위한 availableLocales의 최적 요소를 결정합니다.
일반 사용자가 LookupMatchingLocaleByPrefix 알고리즘보다 더 적합하다고 여길 결과를 제공해야 합니다. 비기본 매치가 발견되면, availableLocales의 매칭 언어
태그와 requestedLocales의 해당 요소의 유니코드 로케일 확장 시퀀스를(없으면 empty) 포함하는 레코드를 반환합니다.
9.2.5 UnicodeExtensionComponents ( extension )
The abstract operation UnicodeExtensionComponents takes argument extension (유니코드 로케일 확장 시퀀스) and returns [[Attributes]]와 [[Keywords]] 필드를 가진 레코드. extension을 고유한 속성 리스트와 고유 키를 가진 키워드 리스트로 분해합니다. 속성이나
키워드 키가 반복될 경우 첫 번째만 사용합니다.
It performs the following steps when called:
The abstract operation InsertUnicodeExtensionAndCanonicalize takes arguments locale (언어 태그), attributes (문자열 리스트), and keywords (레코드 리스트) and returns 유니코드 정규화된 로케일 식별자. attributes와 keywords를 locale에 유니코드 로케일 확장 시퀀스로 통합하고 정규화된 결과를 반환합니다. It performs the following steps when called:
The abstract operation ResolveLocale takes arguments availableLocales (사용 가능한 로케일 목록), requestedLocales (언어 우선순위 목록), options (레코드), relevantExtensionKeys (문자열 리스트), and localeData (레코드) and returns 레코드. 이는 BCP 47의 RFC 4647 section 3에서 정의된 "lookup"을 수행하며,
options.[[localeMatcher]]에 따라 LookupMatchingLocaleByBestFit 또는 LookupMatchingLocaleByPrefix 알고리즘을 사용하여 유니코드
로케일 확장 시퀀스를 무시하고 requestedLocales를 만족시키기 위한 availableLocales의 최적 요소를 결정합니다. 매치된 requestedLocales 요소에
유니코드 로케일 확장 시퀀스가 포함되어 있으면, 반환된 레코드의 [[Locale]] 필드에 복사되며, keyword 유니코드 로케일 비종결 기호의
key 값이 relevantExtensionKeys에 포함되지 않거나 type 값이 options의 다른 값으로 대체된 경우 생략됩니다.
It performs the following steps when called:
The abstract operation ResolveOptions takes arguments constructor (서비스 생성자), localeData (레코드), locales (ECMAScript 언어 값), and options (ECMAScript 언어 값) and optional arguments specialBehaviours (열거형 리스트) and modifyResolutionOptions (매개변수 하나를 가진 추상 클로저) and returns 정상 완료 시 [[Options]](객체), [[ResolvedLocale]](레코드), [[ResolutionOptions]](레코드) 필드를 가진 레코드 또는 throw 완료. constructor의 입력을 읽고 로케일로 해결합니다. It performs the following steps when called:
The abstract operation FilterLocales takes arguments availableLocales (사용 가능한 로케일 목록), requestedLocales (언어 우선순위 목록), and options (ECMAScript 언어 값) and returns 정상 완료 시 유니코드 정규화된 로케일 식별자 리스트 또는 throw 완료. 이는 BCP 47의 RFC 4647 section 3에서 정의된 "filtering"을 수행하며,
options에 지정된 알고리즘에 따라 LookupMatchingLocaleByBestFit 또는 LookupMatchingLocaleByPrefix를 사용하여
availableLocales에 매칭되는 requestedLocales의 요소를 상대적 순서를 유지하며 반환합니다. It performs the following steps when called:
The abstract operation CoerceOptionsToObject takes argument options (ECMAScript 언어 값) and returns 정상 완료 시 객체 또는 throw 완료.
options를 GetOption에 사용할 수 있는 객체로 강제 변환하며, 기본값은 빈 객체입니다.
null이 아닌 원시 값을 객체로 강제 변환하므로, 새로운 기능에서는 GetOptionsObject 사용을 권장합니다.
It performs the following steps when called:
The abstract operation GetOption takes arguments options (객체), property (프로퍼티 키), type (boolean 또는 string), values (empty 또는 ECMAScript 언어 값 리스트), and default (required 또는 ECMAScript 언어 값) and returns 정상 완료 시 ECMAScript 언어 값 또는 throw 완료. options의 지정된 프로퍼티 값을 추출하고, 요구된 type으로 변환하며, values가 empty가 아니면 허용되는 값인지 확인하고, 값이 undefined이면
default를 대체합니다. It performs the following steps when called:
The abstract operation GetBooleanOrStringNumberFormatOption takes arguments options (객체), property (프로퍼티 키), stringValues (문자열 리스트), and fallback (ECMAScript 언어 값) and returns 정상 완료 시 Boolean, 문자열 또는 fallback, 또는 throw 완료. options 객체에서 property 이름의 값을 추출합니다. 값이 undefined이면 fallback을 반환하고, 값이 true이면 true를 반환하며, 값이
false로 강제 변환되면 false를 반환합니다. 그렇지 않으면 값을 문자열로 강제 변환하고, stringValues에 허용된 값이면 반환합니다. It performs the following steps when called:
The abstract operation DefaultNumberOption takes arguments value (ECMAScript 언어 값), minimum (정수), maximum (정수), and fallback (정수 또는 undefined) and returns 정상 완료 시 정수 또는 undefined, 또는 throw 완료. value를 정수로 변환하고, 허용 범위 내인지 확인하며, 필요시 fallback 값을 채웁니다. It performs the following steps when called:
The abstract operation GetNumberOption takes arguments options (객체), property (문자열), minimum (정수), maximum (정수), and fallback (정수 또는 undefined) and returns 정상 완료 시 정수 또는 undefined, 또는 throw 완료. options 객체에서 property 이름의 값을 추출하고, 정수로 변환하며, 허용 범위 내인지 확인하고, 필요시 fallback 값을 채웁니다. It performs the following steps when called:
The abstract operation PartitionPattern takes argument pattern (패턴 문자열) and returns [[Type]](문자열)과 [[Value]](문자열 또는 undefined) 필드를 가진 레코드 리스트.
[[Type]]이 "literal"이면 [[Value]] 필드는 문자열 값이고, 그렇지 않으면 undefined입니다.
It performs the following steps when called:
result를 새로운 빈 리스트로 한다.
placeholderEnd를 -1로 한다.
placeholderStart를 StringIndexOf(pattern, "{", 0)로 한다.
반복, placeholderStart가 not-found가 아닐 동안,
literal을 pattern의 placeholderEnd + 1부터 placeholderStart까지의 부분 문자열로 한다.
[[AvailableLocales]] 내부 슬롯의 값은 9.1에서 설명된 제약 내에서 구현에 따라 정의된다.
[[RelevantExtensionKeys]] 내부 슬롯의 값은 "co" 요소를 반드시 포함하고, "kf"와 "kn" 요소를 임의로 포함할 수 있으며, 다른 요소는 포함하지 않아야 한다.
Note
Unicode Technical Standard #35 Part 1
Core, Section 3.6.1 Key and Type Definitions에서는 collation에 관련된 10개의 locale 확장 키를 설명한다: "co"는 collator 사용
및 특화, "ka"는 대체 처리, "kb"는 두 번째 수준 가중치의 역방향, "kc"는 대소문자 수준, "kf"는 대소문자 우선, "kh"는 히라가나 4차, "kk"는 정규화,
"kn"는 숫자, "kr"는 재정렬, "ks"는 collation 강도, 그리고 "vt"는 variable top. 그러나 Collator는 사용을 options 객체의 "usage"
속성으로, 대체 처리를 "ignorePunctuation" 속성으로, 대소문자 수준과 강도를 "sensitivity" 속성으로 지정해야 한다. 언어 태그의 "co" 키는 collator
특화에만 지원되며, "kb", "kh", "kk", "kr", "vt" 키는 이 버전의 Internationalization API에서 허용되지 않는다. 나머지 키의 지원은 구현에
따라 달라진다.
The implementation-defined abstract operation CompareStrings takes arguments collator (an Intl.Collator), x (a String), and y (a String) and returns a Number, but not NaN.
반환된 Number는 x와 y의 구현에 따라 정의된 locale 민감한 문자열 비교 결과를 나타낸다.
결과는 collator의 유효 locale 및 collation 옵션에 따라 문자열 값의 정렬 순서에 대응하도록 의도되며, x가 y보다 앞서면 음수, x가 y보다 뒤면 양수,
그 외에는 0(상대적 순서 없음)을 반환한다.
문자열 값은 ECMA-262, 6.1.4에서 설명된 대로 UTF-16 코드
유닛 시퀀스로 해석되어야 하며, 문자열 내 서러게이트 페어(0xD800~0xDBFF 범위의 코드 유닛 뒤에 0xDC00~0xDFFF 범위의 코드 유닛)는 해당 코드 포인트로 해석되어야 한다.
아래에서 설명된 동작은 문자열의 "base letter" 시퀀스의 locale 민감한 식별에 따라 달라지며, 서로 다른 base letter는 항상 다르게 비교된다(이를 포함하는 문자열도 다르게
비교됨). 같은 base letter의 변형을 대소문자, 발음 구별 부호 등으로 비교하는 결과는 collator.[[Sensitivity]]에 따라 달라진다:
Table 4: Collator Sensitivity의 효과
[[Sensitivity]]
설명
"a" vs. "á"
"a" vs. "A"
"base"
같은 base letter는 대소문자나 발음 구별 부호의 차이와 관계없이 다르게 비교되지 않는다.
동등
동등
"accent"
같은 base letter는 발음 구별 부호 등으로만 다르게 비교되며, 대소문자 차이는 무시된다.
다름
동등
"case"
같은 base letter는 대소문자 차이로만 다르게 비교되며, 발음 구별 부호 등은 무시된다.
동등
다름
"variant"
같은 base letter는 대소문자, 발음 구별 부호, 기타 차이로 다르게 비교된다.
다름
다름
Note 1
입력 코드 포인트에서 base letter로의 매핑에는 임의의 수축, 확장, 충돌이 포함될 수 있으며, 발음 구별 부호가 있는 특정 문자에 특별 처리를 적용할 수 있다. 예를 들어, 스웨덴어에서
"ö"는 "o"와 다른 base letter이고, "v"와 "w"는 같은 base letter로 간주된다. 슬로바키아어에서는 "ch"가 하나의 base letter이고, 영어에서는 "æ"가 "a"와
"e"로 시작하는 base letter 시퀀스이다.
collator.[[IgnorePunctuation]]이 true이면, 구두점은 무시된다(예: 구두점만 다른 문자열은 동등하게 비교됨).
실제 반환 값은 추가 정보를 인코딩할 수 있도록 구현에 따라 정의되지만, 특정 collator에 대해 x와 y의 함수로서 전체 문자열 집합에 대해 일관된 비교자를 정의하는 총 정렬이어야
한다. 또한 Unicode 표준에 따라 정규 등가를 인식하고, 구별 가능한 문자열이 정규 등가일 때 +0𝔽를 반환해야 한다.
The abstract operation FormatOffsetTimeZoneIdentifier takes argument offsetMinutes (an integer) and returns a String.
UTC 오프셋(분 단위)을 ±HH:MM 형식의 UTC 오프셋 문자열로 포맷한다.
It performs the following steps when called:
offsetMinutes ≥ 0이면, sign을 코드 유닛 0x002B (PLUS SIGN)로 하고, 아니면 코드 유닛 0x002D (HYPHEN-MINUS)로 한다.
[[LocaleData]] 내부 슬롯의 값은 9.1에 명시된 제약과 다음 추가 제약 내에서 구현 정의된다. 모든 로케일
값 locale에 대해:
[[LocaleData]].[[<locale>]].[[nu]]는 "native", "traditio", "finance" 값을 포함하지 않는 리스트여야 한다.
[[LocaleData]].[[<locale>]].[[hc]]는 « null, "h11", "h12", "h23", "h24" »여야 한다.
[[LocaleData]].[[<locale>]].[[hourCycle]]는 "h11", "h12", "h23", "h24" 중 하나의 문자열이어야 한다.
[[LocaleData]].[[<locale>]].[[hourCycle12]]는 "h11" 또는 "h12" 중 하나의 문자열이어야 한다.
[[LocaleData]].[[<locale>]].[[hourCycle24]]는 "h23" 또는 "h24" 중 하나의 문자열이어야 한다.
[[LocaleData]].[[<locale>]]는 [[formats]] 필드를 가져야 한다. 이 [[formats]] 필드의 값은 각 달력 값 calendar에 대해
[[<calendar>]] 필드를 가진 레코드여야 한다. 각 [[<calendar>]] 필드의 값은 DateTime Format Record의 리스트여야 한다. 해당 리스트의 여러
레코드는 동일한 필드 집합을 사용할 수 있지만, 적어도 하나의 필드 값은 달라야 한다. 다음 집합은 각 로케일에 대해 제공되어야 한다:
[[LocaleData]].[[<locale>]]는 [[styles]] 필드를 가져야 한다. 이 [[styles]] 필드의 값은 각 달력 값 calendar에 대해
[[<calendar>]] 필드를 가진 레코드여야 한다. 각 [[<calendar>]] 필드의 값은 DateTime Styles Record여야 한다.
[[Calendar]]는 포매팅에 사용되는 유니코드 달력 식별자를
나타내는 문자열 값입니다.
[[NumberingSystem]]은 포매팅에 사용되는 유니코드
숫자 시스템 식별자를 나타내는 문자열 값입니다.
[[TimeZone]]은 포매팅에 사용되는 문자열 값으로, 사용 가능한 명명된 시간대 식별자 또는 오프셋 시간대 식별자입니다.
[[HourCycle]]은 12시간 형식("h11", "h12") 또는 24시간 형식("h23", "h24") 중 어느 것이 사용되어야 하는지 나타내는 문자열 값입니다.
"h11"과 "h23"은 각각 0부터 11, 0부터 23까지 시작합니다. "h12"와 "h24"는 각각 1부터 12, 1부터 24까지 시작합니다. [[HourCycle]]은
[[DateTimeFormat]]에 [[hour]] 필드가 있을 때만 사용됩니다.
[[DateStyle]], [[TimeStyle]]은 각각 undefined이거나, "full", "long", "medium", "short" 값 중 하나의 문자열 값입니다.
The abstract operation DateTimeStyleFormat takes arguments dateStyle ("full", "long", "medium", "short", 또는 undefined), timeStyle ("full", "long", "medium", "short", 또는 undefined), and styles (DateTime Styles Record) and returns DateTime Format Record. It performs the following steps when called:
Assert: dateStyle이 undefined가 아니거나 timeStyle이 undefined가 아니다.
timeStyle이 undefined가 아니면,
Assert: timeStyle이 "full", "long", "medium", "short" 중 하나임을 단언한다.
timeFormat을 styles.[[Time]].[[<timeStyle>]]로 한다.
dateStyle이 undefined가 아니면,
Assert: dateStyle이 "full", "long", "medium", "short" 중 하나임을 단언한다.
11.5.5 FormatDateTimePattern ( dateTimeFormat, format, pattern, epochNanoseconds )
The abstract operation FormatDateTimePattern takes arguments dateTimeFormat (Intl.DateTimeFormat), format (DateTime Format Record 또는 DateTime Range Pattern Format Record), pattern (패턴 문자열), and epochNanoseconds (BigInt) and returns [[Type]](문자열), [[Value]](문자열) 필드를 가진 Record 리스트. It performs the following steps when called:
fv를 v를 f 형식으로 나타내는 문자열 값으로 한다. 이 값은 구현 및 dateTimeFormat의 로케일에 따라 달라진다. 또한 f가 "short", "long",
"shortOffset", "longOffset"일 때 tm의 [[InDST]] 값에 따라 달라질 수 있다. 구현에 해당 로컬라이즈된 표현이 없으면 v의 문자열 값을 사용한다.
Record { [[Type]]: p, [[Value]]: fv }를 result에 추가한다.
Record { [[Type]]: "yearName", [[Value]]: fv }를 result에 추가한다.
아니면,
unknown을 구현, 로케일, 숫자 시스템에 따라 epochNanoseconds와 p 기반의 문자열로 한다.
Record { [[Type]]: "unknown", [[Value]]: unknown }를 result에 추가한다.
result를 반환한다.
Note
구현체는 Common Locale Data Repository(https://cldr.unicode.org/)에서 제공하는 로케일
및 달력별 문자열을 사용하는 것이 권장됩니다. DateTimeFormat "short" 문자열에는 CLDR "abbreviated" 문자열을, "long"에는 CLDR "wide"
문자열을 사용하는 것이 좋습니다.
11.5.6 PartitionDateTimePattern ( dateTimeFormat, x )
The abstract operation PartitionDateTimePattern takes arguments dateTimeFormat (Intl.DateTimeFormat) and x (숫자) and returns 정상 완료 시 [[Type]](문자열), [[Value]](문자열) 필드를 가진 Record 리스트 또는 throw completion. It performs the following steps when called:
result를 FormatDateTimePattern(dateTimeFormat, format, pattern, epochNanoseconds)로 한다.
result를 반환한다.
11.5.7 FormatDateTime ( dateTimeFormat, x )
The abstract operation FormatDateTime takes arguments dateTimeFormat (Intl.DateTimeFormat) and x (숫자) and returns 정상 완료 시 문자열 또는 throw completion. It performs the following steps when called:
11.5.8 FormatDateTimeToParts ( dateTimeFormat, x )
The abstract operation FormatDateTimeToParts takes arguments dateTimeFormat (Intl.DateTimeFormat) and x (숫자) and returns 정상 완료 시 배열 또는 throw completion. It performs the following steps when called:
11.5.9 PartitionDateTimeRangePattern ( dateTimeFormat, x, y )
The abstract operation PartitionDateTimeRangePattern takes arguments dateTimeFormat (Intl.DateTimeFormat), x (숫자), and y (숫자) and returns 정상 완료 시 [[Type]](문자열), [[Value]](문자열), [[Source]](문자열) 필드를 가진 Record 리스트 또는 throw completion. It performs the following steps when called:
tm1.[[Hour]] < 12이면 v1을 "am"으로, 아니면 "pm"으로 한다. 1. tm2.[[Hour]] < 12이면 v2를 "am"으로, 아니면 "pm"으로
한다. 1. fieldName이 [[DayPeriod]]이면, 1. v1을 tm1의 day period를 나타내는 문자열 값으로 한다. 이 값은 구현 및 dateTimeFormat의
로케일에 따라 달라진다. 1. v2를 tm2의 day period를 나타내는 문자열 값으로 한다. 이 값은 구현 및 dateTimeFormat의 로케일에 따라 달라진다. 1.
fieldName이 [[FractionalSecondDigits]]이면, 1. format에 [[fractionalSecondDigits]] 필드가 있으면, 1.
fractionalSecondDigits를 format.[[fractionalSecondDigits]]로 한다. 1. 아니면, 1. fractionalSecondDigits를 3으로
한다. 1. exp를 fractionalSecondDigits - 3으로 한다. 1. v1을 floor(tm1.[[Millisecond]] × 10exp)로
한다.
11.5.10 FormatDateTimeRange ( dateTimeFormat, x, y )
The abstract operation FormatDateTimeRange takes arguments dateTimeFormat (Intl.DateTimeFormat), x (숫자), and y (숫자) and returns 정상 완료 시 문자열 또는 throw completion. It performs the following steps when called:
각 Record { [[Type]], [[Value]], [[Source]] } part에 대해 반복한다:
result를 result와 part.[[Value]]의 문자열 연결로 설정한다.
result를 반환한다.
11.5.11 FormatDateTimeRangeToParts ( dateTimeFormat, x, y )
The abstract operation FormatDateTimeRangeToParts takes arguments dateTimeFormat (Intl.DateTimeFormat), x (숫자), and y (숫자) and returns 정상 완료 시 배열 또는 throw completion. It performs the following steps when called:
11.5.12 ToLocalTime ( epochNs, calendar, timeZoneIdentifier )
The implementation-defined abstract operation ToLocalTime takes arguments epochNs (BigInt), calendar (문자열), and timeZoneIdentifier (문자열) and returns ToLocalTime Record. It performs the following steps when called:
The abstract operation UnwrapDateTimeFormat takes argument dtf (ECMAScript 언어 값) and returns 정상 완료 시 ECMAScript 언어 값 또는 throw completion. It performs the following steps when called:
[[AvailableLocales]] 내부 슬롯의 값은 9.1에 설명된 제약 내에서 구현 정의된다.
[[RelevantExtensionKeys]] 내부 슬롯의 값은 « »이다.
[[ResolutionOptionDescriptors]] 내부 슬롯의 값은 « »이다.
[[LocaleData]] 내부 슬롯의 값은 9.1에 설명된 제약과 다음 추가 제약 내에서 구현 정의된다:
[[LocaleData]].[[<locale>]]는 모든 로케일 값 locale에 대해 [[types]] 필드를 가져야 한다. 이 필드의 값은 Record이어야 하며, 모든
display name type의 이름을 가진 필드를 가져야 한다: "language", "region", "script", "currency", "calendar",
"dateTimeField".
"language" 필드의 값은 Record이어야 하며, 유효한 language display 중 하나의 이름을 가진 필드를 가져야 한다: "dialect"와 "standard".
display name type "language" 아래의 language display 필드는 유효한 display name style 중 하나의 이름을 가진 Record이어야 한다:
"narrow", "short", "long".
display name type "region", "script", "currency", "calendar", "dateTimeField"의 필드 값은 Record이어야 하며,
모든 display name style의 이름을 가진 필드를 가져야 한다: "narrow", "short", "long".
display name type "language" 아래의 display name style 필드는 unicode_language_idUnicode locale
nonterminal에 매칭될 수 있는 언어 코드에 해당하는 키를 가진 Record이어야 한다. 이 필드의 값은 문자열이어야 한다.
display name type "region" 아래의 display name style 필드는 지역 코드에 해당하는 키를 가진 Record이어야 한다. 이 필드의 값은 문자열이어야 한다.
display name type "script" 아래의 display name style 필드는 스크립트 코드에 해당하는 키를 가진 Record이어야 한다. 이 필드의 값은 문자열이어야
한다.
display name type "currency" 아래의 display name style 필드는 통화 코드에 해당하는 키를 가진 Record이어야 한다. 이 필드의 값은 문자열이어야
한다.
display name type "calendar" 아래의 display name style 필드는 typeUnicode locale nonterminal에 매칭될
수 있는 캘린더 식별자에 해당하는 키를 가진 Record이어야 한다. 이 필드의 값은 문자열이어야 한다.
display name type "dateTimeField" 아래의 display name style 필드는 Table 19에 나열된 코드에 해당하는 키를 가진 Record이어야 한다. 이 필드의 값은 문자열이어야 한다.
The abstract operation CanonicalCodeForDisplayNames takes arguments type (a String) and code (a String) and returns either a normal completion containing a String or a throw completion. code가 type에 따라 올바른 코드임을 검증하고, code의 대소문자를 정규화된 형태로 반환한다. It performs the following steps when called:
The abstract operation IsValidDateTimeFieldCode takes argument field (a String) and returns a Boolean. field 인자가 유효한 날짜/시간 필드 코드임을 검증한다. It performs the following steps when called:
The abstract operation ToIntegerIfIntegral takes argument argument (ECMAScript 언어 값) and returns 정수 값을 포함하는 정상 완료 또는 throw 완료. It performs the following steps when called:
The abstract operation ToDurationRecord takes argument input (ECMAScript 언어 값) and returns Duration Record를 포함하는 정상 완료 또는 throw 완료. It performs the following steps when called:
The abstract operation IsValidDuration takes arguments years (정수), months (정수), weeks (정수), days (정수), hours (정수), minutes (정수), seconds (정수), milliseconds (정수), microseconds (정수), and nanoseconds (정수) and returns Boolean. It performs the following steps when called:
sign을 0으로 한다.
« years, months, weeks, days, hours, minutes, seconds, milliseconds, microseconds,
nanoseconds »의 각 값 v에 대해,
NOTE: 위 단계는 부동소수점 연산으로 직접 구현할 수 없다. 10-3, 10-6, 10-9로 곱하는 것은 milliseconds,
microseconds, nanoseconds가 unsafe integer일 때 부정확할 수 있다. C++에서는 충분한 비트의 quotient를 가진 std::remquo() 구현으로
가능하다. 문자열 조작도 정확한 결과를 준다.
The abstract operation GetDurationUnitOptions takes arguments unit (String), options (Object), baseStyle (String), stylesList (String의 List), digitalBase (String), prevStyle (String), and twoDigitHours (Boolean) and returns Duration Unit Options Record를 포함하는 정상 완료 또는 throw 완료. It performs the following steps when called:
style을 ? GetOption(options, unit, string, stylesList, undefined)로 한다.
displayDefault를 "always"로 한다.
style이 undefined이면,
baseStyle이 "digital"이면,
style을 digitalBase로 설정한다.
unit이 "hours", "minutes", "seconds" 중 하나가 아니면 displayDefault를 "auto"로 설정한다.
그렇지 않고 prevStyle이 "fractional", "numeric", "2-digit" 중 하나이면,
style을 "numeric"으로 설정한다.
unit이 "minutes", "seconds"가 아니면 displayDefault를 "auto"로 설정한다.
13.5.6.2 ValidateDurationUnitStyle ( unit, style, display, prevStyle )
The abstract operation ValidateDurationUnitStyle takes arguments unit (String), style (String), display (String), and prevStyle (String) and returns unused을 포함하는 정상 완료 또는 throw 완료. It performs the following steps when called:
The abstract operation ComputeFractionalDigits takes arguments durationFormat (DurationFormat 객체) and duration (Duration Record) and returns 수학적 값. It performs the following steps when called:
value를 duration의 필드 중 현재 행의 Value Field 이름에 해당하는 값으로 한다.
result를 result + (value / 10exponent)로 설정한다.
exponent를 exponent + 3으로 설정한다.
result를 반환한다.
13.5.8 NextUnitFractional ( durationFormat, unit )
The abstract operation NextUnitFractional takes arguments durationFormat (DurationFormat 객체) and unit (문자열) and returns Boolean. It performs the following steps when called:
The abstract operation FormatNumericHours takes arguments durationFormat (DurationFormat 객체), hoursValue (정수), and signDisplayed (Boolean) and returns Record의 List. It performs the following steps when called:
The abstract operation FormatNumericMinutes takes arguments durationFormat (DurationFormat 객체), minutesValue (정수), hoursDisplayed (Boolean), and signDisplayed (Boolean) and returns Record의 List. It performs the following steps when called:
The abstract operation FormatNumericSeconds takes arguments durationFormat (DurationFormat 객체), secondsValue (수학적 값), minutesDisplayed (Boolean), and signDisplayed (Boolean) and returns Record의 List. It performs the following steps when called:
The abstract operation FormatNumericUnits takes arguments durationFormat (DurationFormat 객체), duration (Duration Record), firstNumericUnit (문자열), and signDisplayed (Boolean) and returns Record의 List. It performs the following steps when called:
Assert: firstNumericUnit은 "hours", "minutes", 또는 "seconds"이다.
The abstract operation ListFormatParts takes arguments durationFormat (DurationFormat 객체) and partitionedPartsList (Record의 List의 List) and returns List. It performs the following steps when called:
The abstract operation PartitionDurationFormatPattern takes arguments durationFormat (DurationFormat 객체) and duration (Duration Record) and returns List. It performs the following steps when called:
[[AvailableLocales]] 내부 슬롯의 값은 9.1에서 설명된 제약 내에서 구현에 따라 정의된다.
[[RelevantExtensionKeys]] 내부 슬롯의 값은 « »이다.
[[ResolutionOptionDescriptors]] 내부 슬롯의 값은 « »이다.
Note 1
Intl.ListFormat은 관련 확장 키를 가지지 않는다.
[[LocaleData]] 내부 슬롯의 값은 9.1에서 설명된 제약과 다음 추가 제약 내에서,
%Intl.ListFormat%.[[AvailableLocales]]의 각 locale 값 locale에 대해 구현에 따라 정의된다:
[[LocaleData]].[[<locale>]]는 세 필드 [[conjunction]], [[disjunction]], [[unit]]를 가지는 Record이다. 각각은 세 가지
포매팅 스타일 이름 [[long]], [[short]], [[narrow]]를 가지는 Record이어야 한다.
각 필드는 ListFormat 템플릿 집합으로 간주되며, LDML List Format Rules에 명시된 템플릿 문자열을 가지는 [[Pair]], [[Start]],
[[Middle]], [[End]] 필드가 있는 Record의 리스트여야 한다. 각 템플릿 문자열은 "{0}"와 "{1}"를 정확히 한 번씩 포함해야 한다. "{0}"는 "{1}"보다
앞에 위치해야 한다.
Note 2
구현에서는 Common Locale Data Repository (https://cldr.unicode.org/)에서 제공하는
로케일 데이터를 사용하는 것이 권장된다. LDML의
listPattern에서 conjunction은 "standard", disjunction은 "or", unit은 "unit"에 해당한다.
Note 3
리스트 타입 중에서 conjunction은 "and" 기반 리스트(예: "A, B, 그리고 C"), disjunction은 "or" 기반 리스트(예: "A, B, 또는 C"), unit은
단위가 있는 값 리스트(예: "5 파운드, 12 온스")를 의미한다.
14.3 Intl.ListFormat 프로토타입 객체의 속성
Intl.ListFormat 프로토타입 객체:
%Intl.ListFormat.prototype%이다.
일반 객체이다.
Intl.ListFormat 인스턴스가 아니며 [[InitializedListFormat]] 내부 슬롯이나 Intl.ListFormat 인스턴스 객체의 다른 내부 슬롯을 가지지 않는다.
The abstract operation DeconstructPattern takes arguments pattern (패턴 문자열) and placeables (Record) and returns 리스트. It performs the following steps when called:
The abstract operation CreatePartsFromList takes arguments listFormat (Intl.ListFormat) and list (문자열 리스트) and returns [[Type]] ("element" 또는 "literal")와 [[Value]](문자열)를 가지는 Record 리스트. It performs the following steps when called:
size를 list의 요소 개수로 한다.
size가 0이면,
새로운 빈 리스트를 반환한다.
size가 2이면,
n을 listFormat.[[Templates]]에서 listFormat.[[Locale]], list[0], list[1]에 기반한 인덱스로 한다.
pattern을 listFormat.[[Templates]][n].[[Pair]]로 한다.
first를 Record { [[Type]]: "element", [[Value]]: list[0] }로 한다.
second를 Record { [[Type]]: "element", [[Value]]: list[1] }로 한다.
placeables를 Record { [[0]]: first, [[1]]: second }로 한다.
여러 템플릿 중 인덱스 n을 선택하는 것은 스페인어처럼 다음 단어에 따라 "y" 또는 "e"를 선택하는 등 접속사가 문맥에 따라 달라질 수 있도록 한다.
14.5.3 FormatList ( listFormat, list )
The abstract operation FormatList takes arguments listFormat (Intl.ListFormat) and list (문자열 리스트) and returns 문자열. It performs the following steps when called:
The abstract operation FormatListToParts takes arguments listFormat (Intl.ListFormat) and list (문자열 리스트) and returns 배열. It performs the following steps when called:
The abstract operation StringListFromIterable takes argument iterable (ECMAScript 언어 값) and returns 문자열 리스트 또는 throw completion. It performs the following steps when called:
iterable이 undefined이면,
새로운 빈 리스트를 반환한다.
iteratorRecord를 ? GetIterator(iterable, sync)로 한다.
Intl.Locale 함수가 인자 tag와 선택적 인자 options와 함께 호출될 때, 다음 단계가 수행된다:
#### ECMARKDOWN PARSE FAILED ####
1. NewTarget이 *undefined*이면, *TypeError* 예외를 throw한다.
1. _localeExtensionKeys_를 %Intl.Locale%.[[LocaleExtensionKeys]]로 한다.
1. _internalSlotsList_를 « [[InitializedLocale]], [[Locale]], [[Calendar]], [[Collation]], [[FirstDayOfWeek]],
[[HourCycle]], [[NumberingSystem]] »로 한다.
1. _localeExtensionKeys_에 *"kf"*가 포함되어 있으면,
1. [[CaseFirst]]를 _internalSlotsList_에 추가한다.
1. _localeExtensionKeys_에 *"kn"*가 포함되어 있으면,
1. [[Numeric]]을 _internalSlotsList_에 추가한다.
1. _locale_를 ? OrdinaryCreateFromConstructor(NewTarget, *"%Intl.Locale.prototype%"*, _internalSlotsList_)로 한다.
1. _tag_가 String이 아니고 Object도 아니면, *TypeError* 예외를 throw한다.
1. _tag_가 Object이고 [[InitializedLocale]] 내부 슬롯이 있으면,
1. _tag_를 _tag_.[[Locale]]로 한다.
1. 그렇지 않으면,
1. _tag_를 ? ToString(_tag_)로 한다.
1. _options_를 ? CoerceOptionsToObject(_options_)로 한다.
1. IsWellFormedLanguageTag(_tag_)가 *false*이면, *RangeError* 예외를 throw한다.
1. NOTE: LanguageId canonicalization은 supplementalMetadata.xml의
Alias Rules에 따라 _tag_를 임의로 변경할 수 있으므로, _options_에서 오버라이드를 적용하기 전에 이러한 canonicalization을 수행해야 한다.
1. _tag_를 CanonicalizeUnicodeLocaleId(_tag_)로 한다.
1. _tag_를 ? UpdateLanguageId(_tag_, _options_)로 한다.
1. _opt_를 새 Record로 한다.
1. _calendar_를 ? GetOption(_options_, *"calendar"*, ~string~, ~empty~, *undefined*)로 한다.
1. _calendar_가 *undefined*가 아니면,
1. _calendar_가 type Unicode locale nonterminal에 매칭되지 않으면, *RangeError* 예외를 throw한다.
1. _opt_.[[ca]]를 _calendar_로 한다.
1. _collation_을 ? GetOption(_options_, *"collation"*, ~string~, ~empty~, *undefined*)로 한다.
1. _collation_이 *undefined*가 아니면,
1. _collation_이 type Unicode locale nonterminal에 매칭되지 않으면, *RangeError* 예외를 throw한다.
1. _opt_.[[co]]를 _collation_으로 한다.
1. _fw_를 ? GetOption(_options_, *"firstDayOfWeek"*, ~string~, ~empty~, *undefined*)로 한다.
1. _fw_가 *undefined*가 아니면,
1. _fw_를 WeekdayToUValue(_fw_)로 한다.
1. _fw_가 type Unicode locale nonterminal에 매칭되지 않으면, *RangeError* 예외를 throw한다.
1. _opt_.[[fw]]를 _fw_로 한다.
1. _hc_를 ? GetOption(_options_, *"hourCycle"*, ~string~, « *"h11"*, *"h12"*, *"h23"*, *"h24"* », *undefined*)로
한다.
1. _opt_.[[hc]]를 _hc_로 한다.
1. _kf_를 ? GetOption(_options_, *"caseFirst"*, ~string~, « *"upper"*, *"lower"*, *"false"* », *undefined*)로 한다.
1. _opt_.[[kf]]를 _kf_로 한다.
1. _kn_을 ? GetOption(_options_, *"numeric"*, ~boolean~, ~empty~, *undefined*)로 한다.
1. _kn_이 *undefined*가 아니면, _kn_을 ! ToString(_kn_)로 한다.
1. _opt_.[[kn]]을 _kn_으로 한다.
1. _numberingSystem_을 ? GetOption(_options_, *"numberingSystem"*, ~string~, ~empty~, *undefined*)로 한다.
1. _numberingSystem_이 *undefined*가 아니면,
1. _numberingSystem_이 type Unicode locale nonterminal에 매칭되지 않으면, *RangeError* 예외를 throw한다.
1. _opt_.[[nu]]를 _numberingSystem_으로 한다.
1. _r_를 MakeLocaleRecord(_tag_, _opt_, _localeExtensionKeys_)로 한다.
1. _locale_.[[Locale]]를 _r_.[[locale]]로 한다.
1. _locale_.[[Calendar]]를 _r_.[[ca]]로 한다.
1. _locale_.[[Collation]]을 _r_.[[co]]로 한다.
1. _locale_.[[FirstDayOfWeek]]를 _r_.[[fw]]로 한다.
1. _locale_.[[HourCycle]]를 _r_.[[hc]]로 한다.
1. _localeExtensionKeys_에 *"kf"*가 포함되어 있으면,
1. _locale_.[[CaseFirst]]를 _r_.[[kf]]로 한다.
1. _localeExtensionKeys_에 *"kn"*가 포함되어 있으면,
1. SameValue(_r_.[[kn]], *"true"*)가 *true*이거나 _r_.[[kn]]이 빈 문자열이면,
1. _locale_.[[Numeric]]을 *true*로 한다.
1. 그렇지 않으면,
1. _locale_.[[Numeric]]을 *false*로 한다.
1. _locale_.[[NumberingSystem]]을 _r_.[[nu]]로 한다.
1. _locale_를 반환한다.
15.1.2 UpdateLanguageId ( tag, options )
The abstract operation UpdateLanguageId takes arguments tag (well-formed language tag) and options (Object) and returns 정상 완료 시 well-formed language tag 또는 throw completion. It performs the following steps when called:
The abstract operation MakeLocaleRecord takes arguments tag (language tag), options (Record), and localeExtensionKeys (String 리스트) and returns Record. It performs the following steps when called:
[[LocaleExtensionKeys]] 내부 슬롯의 값은 « "ca", "co", "fw", "hc", "nu" »의 모든 요소를 포함해야 하며,
%Intl.Collator%.[[RelevantExtensionKeys]]의 요소 중 « "kf", "kn" »의 요소도 추가로 포함해야 하며, 다른 요소는 포함하지 않아야 한다.
15.3 Intl.Locale 프로토타입 객체의 속성
Intl.Locale 프로토타입 객체:
%Intl.Locale.prototype%이다.
일반 객체이다.
Intl.Locale 인스턴스가 아니며 [[InitializedLocale]] 내부 슬롯이나 Intl.Locale 인스턴스 객체의 다른 내부 슬롯을 가지지 않는다.
NOTE: unicode_region_subtag서브태그는 초기 unicode_language_subtag서브태그 바로 뒤에만 유효하며, 그
사이에 unicode_script_subtag서브태그가 하나 있을 수 있다. 해당 위치에서 unicode_region_subtag는 다른 유효 서브태그와
혼동되지 않는다.
NOTE: baseName에서 "-"로 시작하는 각 서브태그는 unicode_script_subtag,
unicode_region_subtag, unicode_variant_subtag 중 하나이며,
unicode_variant_subtag에 매칭되는 substring은 다른 production에 매칭될 수 있는 접두사보다
엄격하게 더 길다.
variants를 baseName의 가장 긴 접미사 중 "-"로 시작하고 unicode_variant_subtagUnicode locale
nonterminal에 매칭되는 substring이 있는 경우로 한다. 그런 접미사가 없으면 undefined를 반환한다.
The abstract operation UnicodeExtensionValue takes arguments locale (Unicode 정규화된 로케일 식별자) and key (String) and returns String 또는 empty. It performs the following steps when called:
The abstract operation CanonicalUnicodeSubdivision takes arguments locale (Unicode 정규화된 로케일 식별자) and key ("rg" 또는 "sd") and returns String 또는 undefined. It performs the following steps when called:
The abstract operation RegionPreference takes argument locale (Unicode 정규화된 로케일 식별자) and returns Record, 필드 [[Region]](String), [[RegionOverride]](String 또는 undefined). It performs the following steps when called:
The implementation-defined abstract operation CalendarsOfLocale takes argument loc (Intl.Locale) and returns Array. It performs the following steps when called:
regionOverride를 preference.[[RegionOverride]]로 한다.
regionOverride가 undefined가 아니고 regionOverride에 대한 calendar preference data가 있으면,
lookupRegion을 regionOverride로 한다.
그렇지 않으면,
lookupRegion을 region으로 한다.
list를 6.9의 canonical form으로 정렬된 고유 calendar type 리스트로 한다.
lookupRegion에서 날짜 및 시간 포매팅에 일반적으로 사용되는 calendar type만 포함한다. lookupRegion에 대한 calendar preference data가 없으면
리스트는 비어 있다.
The implementation-defined abstract operation CollationsOfLocale takes argument loc (Intl.Locale) and returns Array. It performs the following steps when called:
The implementation-defined abstract operation HourCyclesOfLocale takes argument loc (Intl.Locale) and returns Array. It performs the following steps when called:
regionOverride를 preference.[[RegionOverride]]로 한다.
regionOverride가 undefined가 아니고 regionOverride에 대한 time data가 있으면,
lookupRegion을 regionOverride로 한다.
그렇지 않으면,
lookupRegion을 region으로 한다.
list를 고유 hour cycle 식별자 리스트로 한다. 각 식별자는 소문자 String 값이며, 12시간 형식("h11", "h12") 또는 24시간 형식("h23",
"h24") 중 하나이다. lookupRegion에서 날짜 및 시간 포매팅에 일반적으로 사용되는 hour cycle만 포함하며, 코드 유닛 순서로 정렬한다. lookupRegion에 대한
time data가 없으면 리스트는 비어 있다.
The implementation-defined abstract operation NumberingSystemsOfLocale takes argument loc (Intl.Locale) and returns Array. It performs the following steps when called:
The implementation-defined abstract operation TimeZonesOfLocale takes argument loc (an Intl.Locale) and returns an Array or undefined. It performs the following steps when called:
list를 region에서 일반적으로 사용되는 고유 canonical time zone identifier의 리스트로 한다. 각 식별자는 IANA Time Zone Database의
canonical Zone 이름을 나타내는 String 값이어야 한다. 리스트가 비어 있으면 해당 지역에서 일반적으로 사용되는 time zone이 없음을 의미한다. 리스트는 코드 유닛 순서로 정렬된다.
The implementation-defined abstract operation TextDirectionOfLocale takes argument loc (an Intl.Locale) and returns a String or undefined. It performs the following steps when called:
script에서 줄 내 문자들의 기본 일반 정렬 방향이 오른쪽에서 왼쪽이면, "rtl"을 반환한다.
script에서 줄 내 문자들의 기본 일반 정렬 방향이 왼쪽에서 오른쪽이면, "ltr"을 반환한다.
undefined를 반환한다.
Note 1
script에서 줄 내 문자들의 기본 일반 정렬 방향을 결정할 수 없거나, 방향이 오른쪽에서 왼쪽 또는 왼쪽에서 오른쪽이 아닌 경우에는 undefined가 반환된다.
Note 2
한 언어의 텍스트는 둘 이상의 방향을 가질 수 있다. 한 언어가 한 스크립트로 작성될 때에도 둘 이상의 방향이 있을 수 있다. 따라서 텍스트에 연결된 메타데이터에 방향 정보가 포함되어 있다면, 그 방향
정보가 우선적으로 신뢰되어야 한다. TextDirectionOfLocale에서 반환되는 정보는 텍스트에 방향 정보가 없고 언어 정보만 알려진 경우에만 보조적으로 사용해야 한다. 웹 개발자는 텍스트의
방향을 결정할 때 이 API에 지나치게 의존해서는 안 된다.
15.5.15 WeekdayToUValue ( fw )
The abstract operation WeekdayToUValue takes argument fw (a String) and returns a String. It performs the following steps when called:
The abstract operation WeekdayUValueToNumber takes argument fw (a String) and returns an integral Number or undefined. It performs the following steps when called:
The implementation-defined abstract operation WeekInfoOfLocale takes argument loc (an Intl.Locale) and returns a Record. It performs the following steps when called:
locale를 loc.[[Locale]]로 한다.
Table 27에 정의된 필드를 가지는 Recordr를 생성하며, 값은 locale에 따라
결정한다.
16.1.1.1 ChainNumberFormat ( numberFormat, newTarget, this )
The abstract operation ChainNumberFormat takes arguments numberFormat (an Intl.NumberFormat), newTarget (ECMAScript 언어 값), and this (ECMAScript 언어 값) and returns 정상 완료 시 객체 또는 throw 완료. It performs the following steps when called:
The abstract operation SetNumberFormatDigitOptions takes arguments intlObj (객체), options (객체), mnfdDefault (정수), mxfdDefault (정수), and notation (문자열) and returns 정상 완료 시 unused 또는 throw 완료. It performs the following steps when called:
mnid를 ? GetNumberOption(options, "minimumIntegerDigits", 1, 21, 1)로 한다.
mnfd를 ? Get(options, "minimumFractionDigits")로 한다.
mxfd를 ? Get(options, "maximumFractionDigits")로 한다.
mnsd를 ? Get(options, "minimumSignificantDigits")로 한다.
mxsd를 ? Get(options, "maximumSignificantDigits")로 한다.
intlObj.[[MinimumIntegerDigits]]를 mnid로 설정한다.
roundingIncrement를 ? GetNumberOption(options, "roundingIncrement", 1, 5000, 1)로 한다.
The abstract operation SetNumberFormatUnitOptions takes arguments intlObj (Intl.NumberFormat) and options (객체) and returns 정상 완료 시 unused 또는 throw 완료. It performs the following steps when called:
[[LocaleData]] 내부 슬롯의 값은 9.1에 명시된 제약과 다음 추가 제약 내에서 구현 정의된다:
어떤 로케일 필드의 "nu" 필드 값이 « "native", "traditio", "finance" » 값을 포함해서는 안 된다.
[[LocaleData]].[[<locale>]]는 모든 로케일 값 locale에 대해 [[patterns]] 필드를 가져야 한다. 이 필드의 값은 Record이며, 네 가지 숫자
포맷 스타일 이름: "decimal", "percent", "currency", "unit"을 필드로 가져야 한다.
위에서 언급한 "currency"와 "unit" 필드는 최소 하나의 필드 "fallback"을 가진 Record여야 한다.
"currency"는 6.3에 따라 통화 코드 키를 추가로 가질 수 있다.
각 "currency" 필드는 "code", "symbol", "narrowSymbol", "name"의 currencyDisplay 값에 해당하는 필드를 가진 Record여야
한다.
각 필드는 "standard" 또는 "accounting"의 currencySign 값에 해당하는 필드를 가진 Record여야 한다. "unit" 필드는 6.6에 따라 코어 측정 단위 식별자 키를 추가로 가질 수 있다.
각 "unit" 필드는 "narrow", "short", "long"의 unitDisplay 값에 해당하는 필드를 가진 Record여야 한다.
지금까지 설명된 패턴 트리의 리프 필드("decimal", "percent", "currency"의 증손자, "unit"의 손자)는 "positivePattern",
"zeroPattern", "negativePattern" 키를 가진 Record여야 한다.
위 필드의 값(부호 의존 패턴 필드)은 반드시 "{number}" 서브스트링을 포함해야 한다.
"positivePattern"은 "{plusSign}"을 포함하고 "{minusSign}"은 포함하지 않아야 한다; "negativePattern"은 "{minusSign}"을
포함하고 "{plusSign}"은 포함하지 않아야 한다; "zeroPattern"은 "{plusSign}"이나 "{minusSign}"을 포함하지 않아야 한다.
또한 "percent" 필드 내 값은 "{percentSign}"을 포함해야 하며, "currency" 필드 내 값은 "{currencyCode}",
"{currencyPrefix}", "{currencySuffix}" 중 하나 이상을 포함해야 하며, "unit" 필드 내 값은 "{unitPrefix}" 또는
"{unitSuffix}" 중 하나 이상을 포함해야 한다.
패턴 문자열은 ECMA-262의 UTF-16 인코딩 코드 포인트 시퀀스로 해석할 때, Unicode Standard의 General Category "Number, decimal digit" 코드
포인트를 포함해서는 안 된다.
[[LocaleData]].[[<locale>]]는 모든 로케일 값 locale에 대해 [[notationSubPatterns]] 필드를 가져야 한다. 이 필드의 값은
Record이며, [[scientific]]와 [[compact]] 두 필드를 가져야 한다. [[scientific]] 필드는 "{number}",
"{scientificSeparator}", "{scientificExponent}" 서브스트링을 포함하는 문자열이어야 한다. [[compact]] 필드는 "short"와 "long"
두 필드를 가진 Record여야 한다. 각 필드는 구현이 지원하는 모든 compact notation의 discrete magnitude에 해당하는 정수 키를 가진 Record여야 한다. 각 필드는
"{number}" 서브스트링을 포함할 수 있다. "short"에서 내려온 문자열은 "{compactSymbol}"을, "long"에서 내려온 문자열은
"{compactName}"을 포함해야 한다.
[[Style]]는 "decimal", "currency", "percent", "unit" 중 하나의 문자열 값으로, 측정되는 수량의 유형을 식별한다.
[[Currency]]는 "currency" 단위 유형으로 포매팅할 때 사용할 통화를 식별하는 통화 코드 문자열 값이다. [[Style]]이 "currency"일 때만 사용된다.
[[CurrencyDisplay]]는 "code", "symbol", "narrowSymbol", "name" 중 하나의 문자열 값으로, "currency" 스타일로 포매팅할 때
통화를 ISO 4217 알파벳 통화 코드, 로컬라이즈된 통화 기호, 또는 로컬라이즈된 통화 이름으로 표시할지 지정한다. [[Style]]이 "currency"일 때만 사용된다.
[[CurrencySign]]은 "standard" 또는 "accounting" 중 하나의 문자열 값으로, 음수 숫자를 회계 포맷(종종 괄호로 표시)으로 렌더링할지 지정한다.
[[Style]]이 "currency"이고 [[SignDisplay]]가 "never"가 아닐 때만 사용된다.
[[Unit]]은 코어 단위 식별자이다. [[Style]]이 "unit"일 때만 사용된다.
[[UnitDisplay]]는 "short", "narrow", "long" 중 하나의 문자열 값으로, "unit" 스타일로 포매팅할 때 단위를 기호, 좁은 기호, 또는 로컬라이즈된
긴 이름으로 표시할지 지정한다. [[Style]]이 "unit"일 때만 사용된다.
[[MinimumIntegerDigits]]는 사용할 최소 정수 자릿수를 나타내는 0 이상의 정수이다. 필요하면 숫자는 앞에 0을 추가하여 패딩된다.
[[MinimumFractionDigits]]와 [[MaximumFractionDigits]]는 사용할 최소 및 최대 소수 자릿수를 나타내는 0 이상의 정수이다. 필요하면 숫자는 반올림되거나 뒤에
0을 추가하여 패딩된다. 이 속성들은 [[RoundingType]]이 fraction-digits, more-precision, less-precision일 때만 사용된다.
[[MinimumSignificantDigits]]와 [[MaximumSignificantDigits]]는 표시할 최소 및 최대 유효 자릿수를 나타내는 1 이상의 정수이다. 만약 존재한다면,
포매터는 지정된 유효 자릿수를 표시하기 위해 필요한 만큼 소수 자릿수를 사용한다. 이 속성들은 [[RoundingType]]이 significant-digits, more-precision,
less-precision일 때만 사용된다.
[[UseGrouping]]은 그룹 구분자를 사용할 조건을 나타내는 Boolean 또는 문자열 값이다. 그룹 구분자의 위치와 표시 여부는 구현 정의이다. "always" 값은 가능하다면 그룹
구분자를 표시하도록 구현에 힌트를 준다; "min2"는 그룹에 최소 2자리 숫자가 있을 때; "auto"는 로케일이 포매팅된 숫자에 그룹 구분자를 선호할 때. false 값은 그룹 구분자를
비활성화한다.
[[RoundingType]]는 fraction-digits, significant-digits, more-precision, less-precision 중 하나의 값으로, 어떤
반올림 전략을 사용할지 나타낸다. fraction-digits이면, 포매팅된 숫자는 [[MinimumFractionDigits]]와 [[MaximumFractionDigits]]에 따라 반올림된다.
significant-digits이면, 포매팅된 숫자는 [[MinimumSignificantDigits]]와 [[MaximumSignificantDigits]]에 따라 반올림된다.
more-precision 또는 less-precision이면, 네 가지 설정 모두 사용되며, 어느 것을 사용할지 구분하는 특정 규칙이 있다. [[RoundingType]]는
"roundingPriority" 옵션에서 파생된다.
[[ComputedRoundingPriority]]는 "auto", "morePrecision", "lessPrecision" 중 하나의 문자열 값이다. 이는 16.3.2에서 [[RoundingType]]를 유효한
"roundingPriority" 옵션으로 다시 변환할 때만 사용된다.
[[Notation]]은 "standard", "scientific", "engineering", "compact" 중 하나의 문자열 값으로, 포매팅된 숫자를 스케일 없이 표시할지,
과학적 표기법의 10의 거듭제곱으로 스케일할지, 엔지니어링 표기법의 가장 가까운 천 단위로 스케일할지, 또는 로케일의 compact decimal notation power of ten으로 스케일할지
지정한다.
[[CompactDisplay]]는 "short" 또는 "long" 중 하나의 문자열 값으로, "compact" 표기법으로 포매팅할 때 compact notation 접미사를 짧은
형태("5K") 또는 긴 형태("5 thousand")로 표시할지 지정한다. [[Notation]]이 "compact"일 때만 사용된다.
[[SignDisplay]]는 "auto", "always", "never", "exceptZero", "negative" 중 하나의 문자열 값으로, 언제 부호를 포함할지 지정한다(비
"auto" 옵션은 각각 항상, 절대 포함하지 않음, 0이 아닌 숫자에만, 또는 0이 아닌 음수에만 포함). 과학적 표기법에서는 이 슬롯이 가수의 부호 표시에는 영향을 주지만 지수에는 영향을 주지
않는다.
[[RoundingIncrement]]는 10, 100, 1000, 10000을 10분의 1, 5분의 1, 4분의 1, 2분의 1로 정확히 나누는 정수이다. 이는 계산된 반올림 크기와 관련하여
반올림이 이루어질 증가값을 나타낸다. 예를 들어, [[MaximumFractionDigits]]가 2이고 [[RoundingIncrement]]가 5이면, 포매팅된 숫자는 가장 가까운
0.05("nickel rounding")로 반올림된다.
[[RoundingMode]]는 반올림 모드이며, Table 29의 Identifier 열에 있는 문자열 값 중 하나이다.
[[TrailingZeroDisplay]]는 "auto" 또는 "stripIfInteger" 중 하나의 문자열 값으로, 포매팅된 숫자가 정수(즉, 0이 아닌 소수 자릿수가 없는 경우)일 때
뒤의 0을 제거할지 지정한다.
예시는 각 옵션의 고유한 동작을 보여줍니다. ⬆️는 "양의 무한대로 해결됨"을, ⬇️는 "음의 무한대로 해결됨"을 의미합니다.
마지막으로, Intl.NumberFormat 인스턴스는 format 접근자(16.3.3)에서
반환된 함수를 캐싱하는 [[BoundFormat]] 내부 슬롯을 가진다.
16.5 NumberFormat 객체의 추상 연산
16.5.1 CurrencyDigits ( currency )
The implementation-defined abstract operation CurrencyDigits takes argument currency (문자열) and returns 0 이상의 정수. It performs the following steps when called:
The abstract operation FormatNumericToString takes arguments intlObject (객체) and x (수학적 값 또는 negative-zero) and returns [[RoundedNumber]](수학적 값 또는 negative-zero), [[FormattedString]](문자열) 필드를 가진 Record. It performs the following steps when called:
Assert: intlObject는 [[RoundingMode]], [[RoundingType]], [[MinimumSignificantDigits]],
[[MaximumSignificantDigits]], [[MinimumIntegerDigits]], [[MinimumFractionDigits]], [[MaximumFractionDigits]],
[[RoundingIncrement]], [[TrailingZeroDisplay]] 내부 슬롯을 가진다.
minInteger를 intlObject.[[MinimumIntegerDigits]]로 한다.
int < minInteger이면,
forwardZeros를 0x0030(DIGIT ZERO) 코드 유닛을 minInteger - int번 반복한 문자열로 한다.
string을 forwardZeros와 string을 연결한 문자열로 설정한다.
sign이 negative이면,
x가 0이면 x를 negative-zero로, 아니면 x를 -x로 설정한다.
Record { [[RoundedNumber]]: x, [[FormattedString]]: string }를 반환한다.
16.5.4 PartitionNumberPattern ( numberFormat, x )
The abstract operation PartitionNumberPattern takes arguments numberFormat (NumberFormat으로 초기화된 객체) and x (Intl 수학적 값) and returns [[Type]](문자열), [[Value]](문자열) 필드를 가진 Record의 리스트. It performs the following steps when called:
Record { [[Type]]: "unknown", [[Value]]: unknown }를 result에 추가한다.
result를 반환한다.
16.5.5 PartitionNotationSubPattern ( numberFormat, x, n, exponent )
The abstract operation PartitionNotationSubPattern takes arguments numberFormat (Intl.NumberFormat), x (Intl 수학적 값), n (문자열), and exponent (정수) and returns [[Type]](문자열), [[Value]](문자열) 필드를 가진 Record의 리스트. It performs the following steps when called:
result를 새로운 빈 리스트로 한다.
x가 not-a-number이면,
Record { [[Type]]: "nan", [[Value]]: n }를 result에 추가한다.
아니면 x가 positive-infinity 또는 negative-infinity이면,
Record { [[Type]]: "infinity", [[Value]]: n }를 result에 추가한다.
계산은 ILD 및 ILND 문자열 값과 숫자 문자열 내 위치에 의존하며, 이는 numberFormat의 유효 로케일 또는 유효 로케일과 숫자 시스템에 따라 달라집니다. 통화 이름을 제외한 ILD 및
ILND 문자열 값은 Unicode Standard에서 지정한 General Category "Number, decimal digit" 코드 포인트를 포함해서는 안 됩니다.
The abstract operation FormatNumeric takes arguments numberFormat (an Intl.NumberFormat) and x (an Intl mathematical value) and returns 문자열. It performs the following steps when called:
The abstract operation FormatNumericToParts takes arguments numberFormat (an Intl.NumberFormat) and x (an Intl mathematical value) and returns 배열. It performs the following steps when called:
16.5.8
ToRawPrecision (
x: 0 이상의 수학적 값,
minPrecision: 1 이상 21 이하의 정수,
maxPrecision: 1 이상 21 이하의 정수,
unsignedRoundingMode: Table 31의 Unsigned Rounding Mode
열의 명세 타입 또는 undefined,
): [[FormattedString]](문자열), [[RoundedNumber]](수학적 값), [[IntegerDigitsCount]](정수), [[RoundingMagnitude]](정수) 필드를
가진 Record
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It performs the following steps when called:
p를 maxPrecision으로 한다.
x = 0이면,
m을 코드 유닛 0x0030(DIGIT ZERO) p번 반복한 문자열로 한다.
e를 0으로 한다.
xFinal을 0으로 한다.
아니면,
n1, e1를 정수로, r1을 수학적 값으로 하여 r1 = ToRawPrecisionFn(n1, e1,
p)이고 r1 ≤ x이며 r1이 최대가 되도록 한다.
n2, e2를 정수로, r2를 수학적 값으로 하여 r2 = ToRawPrecisionFn(n2, e2,
p)이고 r2 ≥ x이며 r2가 최소가 되도록 한다.
xFinal을 ApplyUnsignedRoundingMode(x, r1, r2, unsignedRoundingMode)로 한다.
xFinal이 r1이면,
n을 n1으로 한다.
e를 e1으로 한다.
아니면,
n을 n2로 한다.
e를 e2로 한다.
m을 n의 십진수 표현의 숫자들로 구성된 문자열로 한다(앞의 0 없이, 순서대로).
e ≥ (p - 1)이면,
m을 m과 e - p + 1번 코드 유닛 0x0030(DIGIT ZERO)을 연결한 문자열로 한다.
int를 e + 1로 한다.
아니면 e ≥ 0이면,
m을 처음 e + 1 코드 유닛, 코드 유닛 0x002E(FULL STOP), 그리고 남은 p - (e + 1) 코드 유닛을 연결한 문자열로 한다.
m을 "0.", -(e + 1)번 코드 유닛 0x0030(DIGIT ZERO), 그리고 m을 연결한 문자열로 한다.
int를 1로 한다.
m이 코드 유닛 0x002E(FULL STOP)를 포함하고 maxPrecision > minPrecision이면,
cut을 maxPrecision - minPrecision으로 한다.
cut > 0이고 m의 마지막 코드 유닛이 0x0030(DIGIT ZERO)인 동안 반복한다:
마지막 코드 유닛을 제거한다.
cut을 cut - 1로 한다.
m의 마지막 코드 유닛이 0x002E(FULL STOP)이면,
마지막 코드 유닛을 제거한다.
Record { [[FormattedString]]: m, [[RoundedNumber]]: xFinal, [[IntegerDigitsCount]]: int,
[[RoundingMagnitude]]: e–p+1 }를 반환한다.
16.5.9
ToRawFixed (
x: 0 이상의 수학적 값,
minFraction: 0 이상 100 이하의 정수,
maxFraction: 0 이상 100 이하의 정수,
roundingIncrement: 정수,
unsignedRoundingMode: Table 31의 Unsigned Rounding Mode
열의 명세 타입 또는 undefined,
): [[FormattedString]](문자열), [[RoundedNumber]](수학적 값), [[IntegerDigitsCount]](정수), [[RoundingMagnitude]](정수) 필드를
가진 Record
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It performs the following steps when called:
f를 maxFraction으로 한다.
n1을 정수로, r1을 수학적 값으로 하여 r1 = ToRawFixedFn(n1, f)이고
n1moduloroundingIncrement = 0, r1 ≤ x, 그리고 r1이 최대가 되도록 한다.
n2를 정수로, r2를 수학적 값으로 하여 r2 = ToRawFixedFn(n2, f)이고
n2moduloroundingIncrement = 0, r2 ≥ x, 그리고 r2가 최소가 되도록 한다.
xFinal을 ApplyUnsignedRoundingMode(x, r1, r2, unsignedRoundingMode)로 한다.
xFinal이 r1이면 n을 n1으로, 아니면 n을 n2로 한다.
n = 0이면 m을 "0"으로, 아니면 m을 n의 십진수 표현의 숫자들로 구성된 문자열로 한다(앞의 0 없이, 순서대로).
f ≠ 0이면,
k를 m의 길이로 한다.
k ≤ f이면,
z를 f + 1 - k번 코드 유닛 0x0030(DIGIT ZERO)로 구성된 문자열로 한다.
m을 z와 m을 연결한 문자열로 한다.
k를 f + 1로 한다.
a를 처음 k - f 코드 유닛, b를 남은 f 코드 유닛으로 한다.
m을 a, ".", b를 연결한 문자열로 한다.
int를 a의 길이로 한다.
아니면,
int를 m의 길이로 한다.
cut을 maxFraction - minFraction으로 한다.
cut > 0이고 m의 마지막 코드 유닛이 0x0030(DIGIT ZERO)인 동안 반복한다:
마지막 코드 유닛을 제거한다.
cut을 cut - 1로 한다.
m의 마지막 코드 유닛이 0x002E(FULL STOP)이면,
마지막 코드 유닛을 제거한다.
Record { [[FormattedString]]: m, [[RoundedNumber]]: xFinal, [[IntegerDigitsCount]]: int,
[[RoundingMagnitude]]: –f }를 반환한다.
The abstract operation UnwrapNumberFormat takes argument nf (ECMAScript 언어 값) and returns 정상 완료 시 ECMAScript 언어 값 또는 throw 완료. It performs the following steps when called:
16.5.11 GetNumberFormatPattern ( numberFormat, x )
The abstract operation GetNumberFormatPattern takes arguments numberFormat (Intl.NumberFormat) and x (Intl 수학적 값) and returns 문자열. It performs the following steps when called:
resolvedLocaleData를 numberFormat.[[LocaleData]]로 한다.
The abstract operation GetNotationSubPattern takes arguments numberFormat (Intl.NumberFormat) and exponent (정수) and returns 문자열. It performs the following steps when called:
resolvedLocaleData를 numberFormat.[[LocaleData]]로 한다.
notationSubPatterns를 resolvedLocaleData.[[notationSubPatterns]]로 한다.
compactDisplay를 numberFormat.[[CompactDisplay]]로 한다.
compactPatterns를 notationSubPatterns.[[compact]].[[<compactDisplay>]]로 한다.
compactPatterns.[[<exponent>]]을 반환한다.
아니면,
"{number}"를 반환한다.
16.5.13 ComputeExponent ( numberFormat, x )
The abstract operation ComputeExponent takes arguments numberFormat (Intl.NumberFormat) and x (수학적 값) and returns 정수. It performs the following steps when called:
The abstract operation ComputeExponentForMagnitude takes arguments numberFormat (Intl.NumberFormat) and magnitude (정수) and returns 정수. It performs the following steps when called:
The abstract operation ToIntlMathematicalValue takes argument value (ECMAScript 언어 값) and returns 정상 완료 시 Intl 수학적 값 또는 throw 완료. It performs the following steps when called:
The abstract operation GetUnsignedRoundingMode takes arguments roundingMode (반올림 모드) and sign (negative 또는 positive) and returns Table 31의 Unsigned Rounding Mode 열의 명세 타입. It performs the following steps when called:
Table 31의 Identifier 열 값이 roundingMode이고 Sign 열 값이
sign인 행의 Unsigned Rounding Mode 열의 명세 타입을 반환한다.
16.5.18
ApplyUnsignedRoundingMode (
x: 수학적 값,
r1: 수학적 값,
r2: 수학적 값,
unsignedRoundingMode: Table 31의 Unsigned Rounding Mode
열의 명세 타입 또는 undefined,
): 수학적 값
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It performs the following steps when called:
16.5.19 PartitionNumberRangePattern ( numberFormat, x, y )
The abstract operation PartitionNumberRangePattern takes arguments numberFormat (NumberFormat으로 초기화된 객체), x (Intl 수학적 값), and y (Intl 수학적 값) and returns 정상 완료 시 Record 리스트([[Type]](문자열), [[Value]](문자열), [[Source]](문자열) 필드) 또는 throw 완료. It performs the following steps when called:
16.5.20 FormatApproximately ( numberFormat, result )
The abstract operation FormatApproximately takes arguments numberFormat (NumberFormat으로 초기화된 객체) and result (PartitionNumberPattern에서 설명된 Record 리스트([[Type]](문자열), [[Value]](문자열))) and returns Record 리스트([[Type]](문자열), [[Value]](문자열)). It performs the following steps when called:
approximatelySign을 숫자가 근사값임을 나타내는 ILND 문자열 값으로 한다.
approximatelySign이 비어있지 않으면, ILND 인덱스에 Record { [[Type]]: "approximatelySign", [[Value]]:
approximatelySign }를 result에 삽입한다. 예를 들어, numberFormat의 [[Locale]]가 "en-US"이고 [[NumberingSystem]]이
"latn", [[Style]]이 "decimal"이면, 새 Record는 result의 첫 번째 요소 앞에 삽입될 수 있다.
result를 반환한다.
16.5.21 CollapseNumberRange ( numberFormat, result )
The implementation-defined abstract operation CollapseNumberRange takes arguments numberFormat (NumberFormat으로 초기화된 객체) and result (PartitionNumberRangePattern에서 생성된 Record 리스트([[Type]](문자열), [[Value]](문자열), [[Source]](문자열))) and returns Record 리스트([[Type]](문자열), [[Value]](문자열), [[Source]](문자열)).
예를 들어, 구현은 범위 구분자 뒤의 통화 기호 Record를 제거하여 "$3–$5"를 "$3–5"로 변환할 수 있다.
구현은 문법적 정확성을 위해 Record의 [[Value]] 필드를 수정할 수 있다. 예를 들어, "0.5 miles–1 mile"을 "0.5–1 miles"로 변환할 수 있다.
result를 수정하지 않고 그대로 반환하는 것은 CollapseNumberRange의 올바른 구현임이 보장된다.
16.5.22 FormatNumericRange ( numberFormat, x, y )
The abstract operation FormatNumericRange takes arguments numberFormat (NumberFormat으로 초기화된 객체), x (Intl 수학적 값), and y (Intl 수학적 값) and returns 정상 완료 시 문자열 또는 throw 완료. It performs the following steps when called:
16.5.23 FormatNumericRangeToParts ( numberFormat, x, y )
The abstract operation FormatNumericRangeToParts takes arguments numberFormat (NumberFormat으로 초기화된 객체), x (Intl 수학적 값), and y (Intl 수학적 값) and returns 정상 완료 시 배열 또는 throw 완료. It performs the following steps when called:
[[Type]]는 "cardinal" 또는 "ordinal" 중 하나의 문자열 값으로, 사용되는 복수 규칙을 식별한다.
[[Notation]]는 "standard", "scientific", "engineering", "compact" 중 하나의 문자열 값으로, 사용되는 표기법을 식별한다.
[[CompactDisplay]]는 "short" 또는 "long" 중 하나의 문자열 값으로, "compact" 표기법으로 포매팅할 때 compact 표기 접미사를 짧은 형태("5K")
또는 긴 형태("5 thousand")로 표시할지 지정한다. 이는 일부 경우 복수형 선택에 영향을 줄 수 있다. [[Notation]]이 "compact" 값일 때만 사용된다.
[[MinimumIntegerDigits]]는 사용할 최소 정수 자릿수를 나타내는 0 이상의 정수이다.
[[MinimumFractionDigits]]와 [[MaximumFractionDigits]]는 사용할 최소 및 최대 소수 자릿수를 나타내는 0 이상의 정수이다. 숫자는 필요에 따라 반올림되거나
뒤에 0이 추가된다.
[[MinimumSignificantDigits]]와 [[MaximumSignificantDigits]]는 사용할 최소 및 최대 유효 자릿수를 나타내는 양의 정수이다. 둘 중 하나만 있거나 둘 다
없을 수 있다. 둘 다 있으면 최소 및 최대 정수/소수 자릿수를 덮어쓴다.
[[RoundingType]]는 fraction-digits, significant-digits, more-precision, less-precision 중 하나의 값으로, 사용할
반올림 전략을 나타낸다. 16.4에서 논의된다.
[[ComputedRoundingPriority]]는 "auto", "morePrecision", "lessPrecision" 중 하나의 문자열 값이다. 에서 [[RoundingType]]을 "roundingPriority"
옵션으로 변환할 때만 사용된다.
[[RoundingIncrement]]는 10, 100, 1000, 10000을 10분의 1, 5분의 1, 4분의 1, 2분의 1로 나누는 정수이다. 반올림해야 할 크기에 대해 반올림이 이루어지는
증가값을 나타낸다. 예를 들어, [[MaximumFractionDigits]]가 2이고 [[RoundingIncrement]]가 5이면, 숫자는 0.05 단위로 반올림된다("nickel
rounding").
[[TrailingZeroDisplay]]는 "auto" 또는 "stripIfInteger" 중 하나의 문자열 값으로, 포매팅된 숫자가 정수(즉, 0이 아닌 소수 자릿수가 없는 경우)일 때
뒤의 0을 제거할지 여부를 나타낸다.
17.5 PluralRules 객체의 추상 연산
17.5.1 PluralRuleSelect ( locale, type, notation, compactDisplay, s )
The implementation-defined abstract operation PluralRuleSelect takes arguments locale (언어 태그), type ("cardinal" 또는 "ordinal"), notation (문자열), compactDisplay ("short" 또는 "long"), and s (10진 문자열) and returns "zero", "one", "two", "few", "many", 또는 "other".
17.5.2 ResolvePlural ( pluralRules, n )
The abstract operation ResolvePlural takes arguments pluralRules (Intl.PluralRules) and n (Intl 수학 값) and returns [[PluralCategory]]("zero", "one", "two", "few", "many", 또는 "other")와 [[FormattedString]](문자열) 필드를. It performs the following steps when called:
The implementation-defined abstract operation PluralRuleSelectRange takes arguments locale (언어 태그), type ("cardinal" 또는 "ordinal"), notation (문자열), compactDisplay ("short" 또는 "long"), xp ("zero", "one", "two", "few", "many", 또는 "other"), and yp ("zero", "one", "two", "few", "many", 또는 "other") and returns "zero", "one", "two", "few", "many", 또는 "other".
17.5.4 ResolvePluralRange ( pluralRules, x, y )
The abstract operation ResolvePluralRange takes arguments pluralRules (Intl.PluralRules), x (Intl 수학 값), and y (Intl 수학 값) and returns 정상 완료 시 "zero", "one", "two", "few", "many", 또는 "other" 중 하나의 문자열 값 또는 throw 완료. It performs the following steps when called:
[[LocaleData]] 내부 슬롯의 값은 9.1에 설명된 제약과 다음 추가 제약 내에서, 모든 로케일 값
locale에 대해 구현 정의된다:
[[LocaleData]].[[<locale>]]에는 "second", "minute", "hour", "day", "week", "month",
"quarter", "year" 필드가 있다. 이전 이름에 "-narrow" 또는 "-short" 문자열이 붙은 추가 필드가 있을 수 있다. 해당 필드의 값은 다음 두 범주의 필드를
포함하는 레코드이다:
"future" 및 "past" 필드는, 해당 로케일에 관련된 모든 복수형 카테고리의 필드를 가진 레코드이다. 해당 필드의 값은 "{0}"을 포함할 수 있는 패턴이며, 이는
포매팅된 숫자로 대체된다.
선택적으로, 키가 Number의 ToString 결과인 추가 필드가 있을 수 있으며, 해당 값은 템플릿으로 처리되지 않는 리터럴 문자열이다.
[[LocaleData]]의 어떤 로케일 필드의 "nu" 필드 값에 포함된 리스트는 "native", "traditio", 또는 "finance" 값을 포함해서는 안 된다.
The abstract operation SingularRelativeTimeUnit takes argument unit (a String) and returns 정상 완료 시 문자열을 포함하거나 throw 완료를 반환. It performs the following steps when called:
unit이 "seconds"이면, "second"를 반환한다.
unit이 "minutes"이면, "minute"를 반환한다.
unit이 "hours"이면, "hour"를 반환한다.
unit이 "days"이면, "day"를 반환한다.
unit이 "weeks"이면, "week"를 반환한다.
unit이 "months"이면, "month"를 반환한다.
unit이 "quarters"이면, "quarter"를 반환한다.
unit이 "years"이면, "year"를 반환한다.
unit이 "second", "minute", "hour", "day", "week", "month", "quarter", "year" 중 하나가 아니면,
RangeError 예외를 throw한다.
unit을 반환한다.
18.5.2 PartitionRelativeTimePattern ( relativeTimeFormat, value, unit )
The abstract operation PartitionRelativeTimePattern takes arguments relativeTimeFormat (an Intl.RelativeTimeFormat), value (a Number), and unit (a String) and returns 정상 완료 시 [[Type]](문자열), [[Value]](문자열), [[Unit]](문자열 또는 empty) 필드를 가진 레코드 리스트를 포함하거나 throw 완료를 반환. 반환된 리스트는 relativeTimeFormat의 효과적인 로케일과 포매팅 옵션에 따라 value를 나타낸다. It performs the following steps when called:
value가 NaN, +∞𝔽, 또는 -∞𝔽이면, RangeError 예외를 throw한다.
The abstract operation MakePartsList takes arguments pattern (패턴 문자열), unit (문자열), and parts (포매팅된 숫자를 나타내는 레코드 리스트) and returns [[Type]](문자열), [[Value]](문자열), [[Unit]](문자열 또는 empty) 필드를 가진 레코드 리스트. It performs the following steps when called:
다음과 같은 레코드 리스트를 반환한다:
«
{ [[Type]]: "literal", [[Value]]: "AA", [[Unit]]: empty},
{ [[Type]]: "integer", [[Value]]: "15", [[Unit]]: "hour"},
{ [[Type]]: "literal", [[Value]]: "BB", [[Unit]]: empty}
»
18.5.4 FormatRelativeTime ( relativeTimeFormat, value, unit )
The abstract operation FormatRelativeTime takes arguments relativeTimeFormat (Intl.RelativeTimeFormat), value (숫자), and unit (문자열) and returns 정상 완료 시 문자열을 포함하거나 throw 완료를 반환. It performs the following steps when called:
각 Record { [[Type]], [[Value]], [[Unit]] } part를 parts에서 반복한다.
result를 result와 part.[[Value]]의 문자열 연결로 설정한다.
result를 반환한다.
18.5.5 FormatRelativeTimeToParts ( relativeTimeFormat, value, unit )
The abstract operation FormatRelativeTimeToParts takes arguments relativeTimeFormat (Intl.RelativeTimeFormat), value (숫자), and unit (문자열) and returns 정상 완료 시 배열을 포함하거나 throw 완료를 반환. It performs the following steps when called:
[[SegmenterGranularity]]는 "grapheme", "word", 또는 "sentence" 중 하나의 문자열 값으로, 분할할 텍스트 요소의 종류를 나타낸다.
19.5 Segments 객체
Segments 인스턴스는 특정 문자열의 세그먼트를 나타내는 객체로, 생성한 Intl.Segmenter 인스턴스의 로케일과 옵션에 따라 달라진다.
19.5.1 CreateSegmentsObject ( segmenter, string )
The abstract operation CreateSegmentsObject takes arguments segmenter (an Intl.Segmenter) and string (a String) and returns a Segments instance. Segments 인스턴스는 segmenter와 string을 참조한다. It performs the following steps when called:
internalSlotsList를 « [[SegmentsSegmenter]], [[SegmentsString]] »로 한다.
The abstract operation CreateSegmentIterator takes arguments segmenter (an Intl.Segmenter) and string (a String) and returns a Segment Iterator. Segment Iterator는 segmenter의 로케일과 옵션을 사용하여 string을 반복한다. It performs the following steps when called:
internalSlotsList를 « [[IteratingSegmenter]], [[IteratedString]], [[IteratedStringNextSegmentCodeUnitIndex]]
»로 한다.
The abstract operation CreateSegmentDataObject takes arguments segmenter (an Intl.Segmenter), string (a String), startIndex (a non-negative integer), and endIndex (a non-negative integer) and returns a Segment Data object. Segment Data 객체는 segmenter의 string에서 startIndex와 endIndex로 경계된 세그먼트를 설명한다. It performs the following steps when called:
세그먼트가 "word-like"인지 여부는 구현에 따라 다르며, 구현에서는 로케일에 맞는 맞춤화를 사용하는 것이 권장된다. 일반적으로 공백 및/또는 구두점만으로 구성된 세그먼트(예:
ICU의 "WORD_NONE" 경계로 종료되는 세그먼트)는 "word-like"로 간주되지 않는다.
19.8 Segmenter 객체의 추상 연산
19.8.1 FindBoundary ( segmenter, string, startIndex, direction )
The abstract operation FindBoundary takes arguments segmenter (an Intl.Segmenter), string (a String), startIndex (a non-negative integer), and direction (before or after) and returns a non-negative integer. segmenter의 로케일과 옵션에 따라 string에서 startIndex 인덱스의 코드 유닛에서 지정된 direction으로 세분화 경계를 찾아, 바로 다음 코드 유닛 인덱스를
반환한다. It performs the following steps when called:
toLocaleLowerCase 함수는 의도적으로 제네릭입니다; this 값이 String 객체일 필요가 없습니다. 따라서 다른 종류의 객체에 메서드로 전달하여 사용할 수 있습니다.
20.1.2.1 TransformCase ( S, locales, targetCase )
The abstract operation TransformCase takes arguments S (a String), locales (an ECMAScript language value), and targetCase (lower or upper). S를 ECMA-262, 6.1.4에 설명된 대로 UTF-16 인코딩된
코드 포인트 시퀀스로 해석하고, ILD 변환을 통해 targetCase로 변환한 결과를 새로운 String 값으로 반환합니다. It performs the following steps when called:
availableLocales를 Unicode Character Database가 언어 민감 케이스 매핑을 포함하는 언어 태그를 포함하는 Available Locales List로 한다.
구현체가 추가 로케일 민감 케이스 매핑을 지원한다면, 해당 언어 태그도 포함해야 한다.
코드 포인트 매핑은 Unicode Standard의 Default Case Conversion Algorithms의 맞춤 버전에 따라 파생될 수 있습니다. 구현체는 Unicode Character
Database의 SpecialCasing.txt 파일
및/또는 CLDR 및/또는 기타 맞춤 테일러링을 사용할 수 있습니다. 테일러링과 관계없이, 적합한 구현체의 케이스 변환 알고리즘은 동일한 입력 코드 포인트, 로케일, 대상 케이스에 대해 항상 동일한
결과를 반환해야 합니다.
Note
일부 코드 포인트의 케이스 매핑은 여러 코드 포인트를 생성할 수 있으므로 결과의 길이가 입력과 같지 않을 수 있습니다. toLocaleUpperCase와 toLocaleLowerCase 모두
문맥 민감 동작을 가지므로, 함수들은 대칭적이지 않습니다. 즉, s.toLocaleUpperCase().toLocaleLowerCase()는 반드시 s.toLocaleLowerCase()와
같지 않으며, s.toLocaleLowerCase().toLocaleUpperCase()도 반드시 s.toLocaleUpperCase()와 같지 않습니다.
배열의 요소들은 각자의 toLocaleString 메서드를 사용하여 문자열로 변환되고, 이 문자열들은 구현체-정의 로케일 민감 구분자 문자열로 구분되어 연결됩니다. 이 함수는 toString과
유사하지만, 호스트 환경의 현재 로케일 관습에 맞는 로케일 민감 결과를 제공하도록 설계되었습니다.
Note 3
toLocaleString 함수는 의도적으로 제네릭입니다; this 값이 Array 객체일 필요가 없습니다. 따라서 다른 종류의 객체에 메서드로 전달하여 사용할 수 있습니다.
16.1 ECMA-402 8판에서 NumberFormat 생성자는 스타일이
"currency"이고 maximumFractionDigits가 해당 통화의 기본 소수 자릿수보다 낮게 설정된 경우 오류를 발생시켰습니다. 이 동작은 9판에서 수정되어 더 이상
오류를 발생시키지 않습니다.
Annex C (informative) 콜로폰
이 명세서는 GitHub에서 Ecmarkup라는 평문 소스 형식으로 작성되었습니다. Ecmarkup은 HTML과 Markdown 방언으로, 평문으로
ECMAScript 명세서를 작성하고, 이 문서의 편집 규칙을 따르는 완전한 HTML 렌더링으로 처리할 수 있는 프레임워크와 도구를 제공합니다. Ecmarkup은 Grammarkdown을 사용한 구문 정의와 Ecmarkdown을 사용한 알고리즘 단계 작성 등 여러 형식과 기술을 통합하여 구축되었습니다. 이 명세서의 PDF
렌더링은 CSS Paged Media 명세를 활용하는 인쇄 스타일시트를 사용하여 PrinceXML로 변환됩니다.
이전 판의 명세서는 Word로 작성되었습니다. 이 판의 기반이 된 Ecmarkup 소스 텍스트는 ECMAScript 2015 Word 문서를 자동 변환 도구로 Ecmarkup으로 변환하여 생성되었습니다.
By obtaining and/or copying this work, you (the licensee) agree that you have read, understood, and will comply with the following terms and conditions.
This document may be copied, published and distributed to others, and certain derivative works of it may be prepared, copied, published, and distributed, in whole or in part, provided that the above copyright notice and this Copyright License and Disclaimer are included on all such copies and derivative works. The only derivative works that are permissible under this Copyright License and Disclaimer are:
(i) works which incorporate all or portion of this document for the purpose of providing commentary or explanation (such as an annotated version of the document),
(ii) works which incorporate all or portion of this document for the purpose of incorporating features that provide accessibility,
(iii) translations of this document into languages other than English and into different formats and
(iv) works by making use of this specification in standard conformant products by implementing (e.g. by copy and paste wholly or partly) the functionality therein.
However, the content of this document itself may not be modified in any way, including by removing the copyright notice or references to Ecma International, except as required to translate it into languages other than English or into a different format.
The official version of an Ecma International document is the English language version on the Ecma International website. In the event of discrepancies between a translated version and the official version, the official version shall govern.
The limited permissions granted above are perpetual and will not be revoked by Ecma International or its successors or assigns.
This document and the information contained herein is provided on an “AS IS” basis and ECMA INTERNATIONAL DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY OWNERSHIP RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
Software License
All Software contained in this document ("Software") is protected by copyright and is being made available under the "BSD License", included below. This Software may be subject to third party rights (rights from parties other than Ecma International), including patent rights, and no licenses under such third party rights are granted under this license even if the third party concerned is a member of Ecma International. SEE THE ECMA CODE OF CONDUCT IN PATENT MATTERS AVAILABLE AT https://ecma-international.org/memento/codeofconduct.htm FOR INFORMATION REGARDING THE LICENSING OF PATENT CLAIMS THAT ARE REQUIRED TO IMPLEMENT ECMA INTERNATIONAL STANDARDS.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
Neither the name of the authors nor Ecma International may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE ECMA INTERNATIONAL "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ECMA INTERNATIONAL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.