로케일 식별자에서 중복 정보를 제거하는 방법
의미를 잃지 않고 간결한 로케일 식별자를 생성하기 위해 minimize 메서드 사용하기
소개
en-Latn-US와 zh-Hans-CN과 같은 로케일 식별자는 언어, 문자 체계, 지역을 지정하는 여러 구성 요소를 포함합니다. 그러나 로케일을 식별하기 위해 이러한 모든 구성 요소가 필요한 것은 아닙니다. 일부 구성 요소는 식별자의 다른 부분에서 유추할 수 있기 때문에 중복됩니다.
minimize() 메서드는 이러한 중복 구성 요소를 제거하여 가장 짧은 동등한 로케일 식별자를 생성합니다. 이는 의미를 보존하면서 저장 공간을 줄이고 가독성을 향상시키는 간결한 식별자를 생성합니다.
로케일 식별자의 중복성 이해하기
로케일 식별자는 이미 다른 구성 요소에 의해 암시된 정보를 명시적으로 표시할 때 중복됩니다. 이러한 중복은 각 언어가 문자 체계와 지역에 대한 가능성 높은 기본값을 가지고 있기 때문에 발생합니다.
en-Latn-US 식별자를 고려해보세요. 이 식별자는 다음을 지정합니다:
- 언어: 영어(
en) - 문자 체계: 라틴어(
Latn) - 지역: 미국(
US)
영어는 라틴 문자로만 작성되며, 지역이 지정되지 않은 경우 영어는 기본적으로 미국을 의미합니다. 문자 체계와 지역 구성 요소는 영어의 가능성 높은 기본값과 일치하기 때문에 중복됩니다. en 식별자만으로도 동일한 정보를 전달합니다.
동일한 원칙이 다른 언어에도 적용됩니다. 한국어(ko)는 한글 문자 체계(Kore)로 작성되며 주로 한국(KR)에서 사용됩니다. ko-Kore-KR 식별자는 ko만으로도 이러한 기본값을 암시하기 때문에 중복 정보를 포함합니다.
minimize 메서드의 작동 방식
minimize() 메서드는 Intl.Locale 인스턴스에서 사용할 수 있습니다. 이 메서드는 로케일 식별자를 분석하고 가능성 높은 기본값과 일치하는 구성 요소를 제거합니다.
const locale = new Intl.Locale("en-Latn-US");
const minimized = locale.minimize();
console.log(minimized.baseName);
// 출력: "en"
이 메서드는 중복 서브태그가 제거된 새로운 Intl.Locale 인스턴스를 반환합니다. 원래 로케일 객체를 수정하지 않습니다.
최소화 프로세스는 유니코드 CLDR의 "Remove Likely Subtags" 알고리즘을 따릅니다. 이 알고리즘은 가능성 높은 서브태그 연관성 데이터베이스를 사용하여 정보 손실 없이 제거할 수 있는 구성 요소를 결정합니다.
minimize에 의해 영향을 받는 컴포넌트
minimize() 메서드는 언어, 스크립트, 지역과 같은 핵심 로케일 컴포넌트에만 영향을 미칩니다. 서식 지정 환경설정을 지정하는 유니코드 확장 서브태그는 제거하거나 수정하지 않습니다.
const locale = new Intl.Locale("en-Latn-US-u-ca-gregory-nu-latn");
const minimized = locale.minimize();
console.log(minimized.toString());
// 출력: "en-u-ca-gregory-nu-latn"
달력(ca-gregory)과 숫자 체계(nu-latn) 확장은 그대로 유지됩니다. 중복되는 스크립트(Latn)와 지역(US) 컴포넌트만 제거됩니다.
최소화 예시
어떤 컴포넌트가 중복되는지에 따라 다양한 로케일 식별자는 서로 다른 길이로 최소화됩니다.
스크립트와 지역 제거
스크립트와 지역이 모두 기본값과 일치할 때, 둘 다 제거됩니다:
const english = new Intl.Locale("en-Latn-US");
console.log(english.minimize().baseName);
// 출력: "en"
const korean = new Intl.Locale("ko-Kore-KR");
console.log(korean.minimize().baseName);
// 출력: "ko"
const japanese = new Intl.Locale("ja-Jpan-JP");
console.log(japanese.minimize().baseName);
// 출력: "ja"
기본값이 아닌 지역 유지
지역이 기본값과 다를 경우, 최소화된 식별자에 유지됩니다:
const britishEnglish = new Intl.Locale("en-Latn-GB");
console.log(britishEnglish.minimize().baseName);
// 출력: "en-GB"
const canadianFrench = new Intl.Locale("fr-Latn-CA");
console.log(canadianFrench.minimize().baseName);
// 출력: "fr-CA"
const mexicanSpanish = new Intl.Locale("es-Latn-MX");
console.log(mexicanSpanish.minimize().baseName);
// 출력: "es-MX"
스크립트 컴포넌트는 기본값과 일치하기 때문에 제거되지만, 지역은 언어의 기본값이 아닌 변형을 지정하기 때문에 유지됩니다.
기본값이 아닌 스크립트 유지
스크립트가 기본값과 다를 경우, 최소화된 식별자에 유지됩니다:
const simplifiedChinese = new Intl.Locale("zh-Hans-CN");
console.log(simplifiedChinese.minimize().baseName);
// 출력: "zh-Hans"
const traditionalChinese = new Intl.Locale("zh-Hant-TW");
console.log(traditionalChinese.minimize().baseName);
// 출력: "zh-Hant"
const serbianCyrillic = new Intl.Locale("sr-Cyrl-RS");
console.log(serbianCyrillic.minimize().baseName);
// 출력: "sr-Cyrl"
중국어는 간체와 번체 변형을 구분하기 위해 스크립트 컴포넌트가 필요합니다. 세르비아어는 키릴 문자와 라틴 문자를 구분하기 위해 스크립트 컴포넌트가 필요합니다.
이미 최소화된 식별자
로케일 식별자가 이미 최소화되어 있는 경우, 이 메서드는 변경 없이 동등한 로케일을 반환합니다:
const minimal = new Intl.Locale("fr");
console.log(minimal.minimize().baseName);
// 출력: "fr"
maximize와의 관계
minimize() 메서드는 maximize()의 역함수입니다. maximize() 메서드는 완전한 식별자를 만들기 위해 가능성 높은 서브태그를 추가하는 반면, minimize()는 중복 서브태그를 제거하여 간결한 식별자를 만듭니다.
이 메서드들은 완전한 형태와 간결한 형태 사이의 양방향 변환을 가능하게 하는 쌍을 형성합니다:
const compact = new Intl.Locale("en");
const complete = compact.maximize();
console.log(complete.baseName);
// 출력: "en-Latn-US"
const compactAgain = complete.minimize();
console.log(compactAgain.baseName);
// 출력: "en"
간결한 형태에서 완전한 형태로, 다시 간결한 형태로의 왕복 과정은 원래 형태를 생성합니다.
그러나 모든 로케일이 왕복 후 정확히 원래 형태로 돌아오는 것은 아닙니다. 이 메서드는 원래 구조를 보존하기보다 표준적인 최소 형태를 생성합니다:
const locale = new Intl.Locale("en-US");
const maximized = locale.maximize();
console.log(maximized.baseName);
// 출력: "en-Latn-US"
const minimized = maximized.minimize();
console.log(minimized.baseName);
// 출력: "en"
원래 식별자 en-US는 중복되지 않은 지역을 포함했지만, 최대화와 최소화 후에는 en이 됩니다. 이는 미국이 영어의 가능성 높은 기본 지역이기 때문에 발생합니다.
minimize를 사용하는 경우
명확성을 유지하면서 간결한 로케일 식별자가 필요할 때 minimize()를 사용하세요. 여러 시나리오에서 최소화의 이점을 얻을 수 있습니다.
로케일 환경설정 저장
최소화된 식별자는 데이터베이스, 로컬 스토리지 또는 구성 파일에서 저장 공간을 줄입니다:
function saveUserLocale(localeString) {
const locale = new Intl.Locale(localeString);
const minimized = locale.minimize().toString();
localStorage.setItem("userLocale", minimized);
}
saveUserLocale("en-Latn-US");
// "en-Latn-US" 대신 "en"을 저장합니다
이는 정보 손실 없이 저장된 데이터 크기를 줄입니다.
읽기 쉬운 URL 생성
최소화된 식별자는 언어 선택을 위한 더 깔끔한 URL을 생성합니다:
function createLocalizedURL(path, localeString) {
const locale = new Intl.Locale(localeString);
const minimized = locale.minimize().baseName;
return `/${minimized}${path}`;
}
const url = createLocalizedURL("/products", "en-Latn-US");
console.log(url);
// Output: "/en/products"
URL /en/products는 /en-Latn-US/products보다 더 읽기 쉽습니다.
로케일 식별자 비교
최소화는 두 로케일 식별자가 동일한 로케일을 나타내는지 확인하는 데 도움이 됩니다:
function areLocalesEquivalent(locale1String, locale2String) {
const locale1 = new Intl.Locale(locale1String).minimize();
const locale2 = new Intl.Locale(locale2String).minimize();
return locale1.toString() === locale2.toString();
}
console.log(areLocalesEquivalent("en", "en-Latn-US"));
// Output: true
console.log(areLocalesEquivalent("en-US", "en-Latn-US"));
// Output: true
console.log(areLocalesEquivalent("en-US", "en-GB"));
// Output: false
최소화는 직접 비교를 가능하게 하는 표준 형식을 생성합니다.
사용자 입력 정규화
사용자나 외부 시스템에서 로케일 식별자를 받을 때, 이를 표준 형식으로 최소화합니다:
function normalizeLocale(localeString) {
try {
const locale = new Intl.Locale(localeString);
return locale.minimize().toString();
} catch (error) {
return null;
}
}
console.log(normalizeLocale("en-US"));
// Output: "en"
console.log(normalizeLocale("en-Latn-US"));
// Output: "en"
console.log(normalizeLocale("en-GB"));
// Output: "en-GB"
이 함수는 동일한 로케일의 다양한 형식을 받아 일관된 표현을 반환합니다.
minimize와 다른 로케일 작업 결합하기
minimize() 메서드는 유연한 로케일 처리를 위해 다른 Intl.Locale 기능과 함께 작동합니다.
로케일 속성 수정 후 최소화
컴포넌트에서 로케일을 구성할 때, 불필요한 부분을 제거하기 위해 최소화합니다:
const locale = new Intl.Locale("en", {
region: "US",
script: "Latn"
});
const minimized = locale.minimize();
console.log(minimized.baseName);
// Output: "en"
이는 최종 식별자가 입력 컴포넌트가 허용하는 한 가능한 간결하도록 보장합니다.
최소화하면서 확장 기능 보존
최소화 과정에서 확장 요소는 그대로 유지되므로, 핵심 구성 요소를 최소화하면서도 서식 지정 환경설정을 유지할 수 있습니다:
function createCompactLocaleWithPreferences(language, region, preferences) {
const locale = new Intl.Locale(language, {
region: region,
...preferences
});
return locale.minimize().toString();
}
const localeString = createCompactLocaleWithPreferences("en", "US", {
hourCycle: "h23",
calendar: "gregory"
});
console.log(localeString);
// Output: "en-u-ca-gregory-hc-h23"
핵심 구성 요소는 en으로 최소화되지만, 달력과 시간 주기 확장 요소는 그대로 유지됩니다.