로케일은 사용자의 언어와 위치를 가리키므로 로케일로 사용자가 선호하는 표기방식을 알수 있다.
예를들면, 언어와 위치에 따라 숫자의 표시, 날짜의 표기등이 달라진다.
로케일은 최대 5가지 요소를 갖는다.
로케일은 'en-US', 'de-DE' 처럼 하이픈을 연결한 태그로 정의, 스위스에서 독일어를 사용하는 사람이라면 'de-CH'
const newYearEve = new Date(1999, 11, 31, 23, 59)
newYearEve.toLocaleString('de') // '31.12.1999, 23:59:00'
newYearEve.toLocaleString('kr') // '1999. 12. 31. 오후 11:59:00'
newYearEve.toLocaleString('en') // '12/31/1999, 11:59:00 PM'
newYearEve.toLocaleString('de', {timeZone: 'Asia/Tokyo'}) // 정상동작 안함
Number 클래스의 toLocaleString 메서드에 로케일 태그를 인수로 전달해 숫자형식을 변환한다.
let number = 123456.78
let result = number.toLocaleString('de') // '123,456.78'
let formatter = new Intl.NumberFormat('de')
result = formatter.format(number) // '123,456.78'
number.toLocaleString('th-u-nu-thai')
new Intl.NumberFormat('th-u-nu-thai').format(number) // '๑๒๓,๔๕๖.๗๘'
number.toLocaleString('de', { style: 'currency', currency: 'EUR' }) // '123.456,78 €'
formatter = new Intl.NumberFormat('de', { style: 'currency', currency: 'EUR' })
formatter.format(number) // '123.456,78 €'
날짜와 시간 지역화시 고려할 점
const newYearsEve = new Date(1999, 11, 31, 23, 59)
newYearsEve.toLocaleDateString('de') // '31.12.1999'
newYearsEve.toLocaleTimeString('de') // '23:59:00'
newYearsEve.toLocaleString('de') // '31.12.1999, 23:59:00'
const germanDateTimeFormatter = new Intl.DateTimeFormat('de')
germanDateTimeFormatter.format(newYearsEve) // '31.12.1999'
newYearsEve.toLocaleDateString('en', {
year: 'numeric',
month: 'short',
day: 'numeric',
}) // 'Dec 31, 1999'
new Intl.DateTimeFormat('de', {
hour: 'numeric',
minute: '2-digit'
}).format(newYearsEve) // '23:59
newYearsEve.toLocaleDateString('en', { dateStyle: 'medium' }) // 'Dec 31, 1999'
newYearsEve.toLocaleDateString('de', { dateStyle: 'medium' }) // '31.12.1999'
상대적 시간표시, format 메서드는 수량과 단위를 받으며, 단위는 year, quarter, month, week, day, hour, minute, second
new Intl.RelativeTimeFormat('en', { numeric: 'auto'}).format(-1, 'day') // 'yesterday'
new Intl.RelativeTimeFormat('fr').format(3, 'hours') // 'dans 3 heures'
new Intl.RelativeTimeFormat('ko', { numeric: 'auto'}).format(-1, 'day') // '어제'
문자열을 정렬할때 항상 로케일을 적용해 비교 동작을 수행해야 한다.
String 클래스의 localeCompare 의 두번째 인수에 로케일을 지정한다.
const words = ['Alpha', 'Ångström', 'Zulu', 'able', 'zebra']
words.sort((x, y) => x.localeCompare(y, 'en')) // ['able', 'Alpha', 'Ångström', 'zebra', 'Zulu']
const parts = ['part1', 'part10', 'part2', 'part9']
parts.sort((x, y) => x.localeCompare(y, 'en-u-kn-true')) // ['part1', 'part2', 'part9', 'part10']
[0, 1, 2, 3, 4, 5].map(i => (new Intl.PluralRules('en').select(i)))
// ['other', 'one', 'other', 'other', 'other', 'other']
Chapter 8 Internationalization 178
[0, 1, 2, 3, 4, 5].map(i => (new Intl.PluralRules('ru').select(i)))
// ['many', 'one', 'few', 'few', 'few', 'many']
dollars = { one: 'dollar', other: 'dollars' }
[0, 1, 2, 3, 4, 5].map(i => (dollars[new Intl.PluralRules('en').select(i)])) // ['dollars', 'dollar', 'dollars', 'dollars', 'dollars', 'dollars']