로케일 식별자에서 중복 정보를 제거하는 방법

minimize 메서드를 사용하여 의미를 잃지 않고 간결한 로케일 식별자 생성하기

소개

en-Latn-USzh-Hans-CN와 같은 로케일 식별자는 언어, 문자 체계, 지역을 지정하는 여러 구성 요소를 포함합니다. 그러나 로케일을 식별하는 데 이러한 구성 요소가 모두 필요한 것은 아닙니다. 일부 구성 요소는 식별자의 다른 부분에서 추론할 수 있기 때문에 중복됩니다.

minimize() 메서드는 이러한 중복 구성 요소를 제거하여 가장 짧은 동등한 로케일 식별자를 생성합니다. 이를 통해 의미를 보존하면서 저장 공간을 줄이고 가독성을 향상시키는 간결한 식별자를 생성합니다.

로케일 식별자의 중복성 이해하기

로케일 식별자는 다른 구성 요소에 이미 암시된 정보를 명시적으로 표시할 때 중복됩니다. 각 언어에는 문자 체계와 지역에 대한 기본값이 있기 때문에 중복이 발생합니다.

식별자 en-Latn-US를 고려해 보세요. 이 식별자는 다음을 지정합니다:

  • 언어: 영어 (en)
  • 문자 체계: 라틴 문자 (Latn)
  • 지역: 미국 (US)

영어는 라틴 문자로만 작성되며, 지역이 지정되지 않은 경우 영어는 기본적으로 미국을 의미합니다. 문자 체계와 지역 구성 요소는 모두 영어의 기본값과 일치하기 때문에 중복됩니다. 식별자 en는 동일한 정보를 전달합니다.

동일한 원칙이 다른 언어에도 적용됩니다. 한국어 (ko)는 한글 (Kore)로 작성되며 주로 대한민국 (KR)에서 사용됩니다. 식별자 ko-Kore-KRko만으로도 이러한 기본값을 암시하기 때문에 중복 정보를 포함합니다.

minimize 메서드의 작동 방식

minimize() 메서드는 Intl.Locale 인스턴스에서 사용할 수 있습니다. 이 메서드는 로케일 식별자를 분석하고 기본값과 일치하는 구성 요소를 제거합니다.

const locale = new Intl.Locale("en-Latn-US");
const minimized = locale.minimize();

console.log(minimized.baseName);
// Output: "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());
// Output: "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);
// Output: "en"

const korean = new Intl.Locale("ko-Kore-KR");
console.log(korean.minimize().baseName);
// Output: "ko"

const japanese = new Intl.Locale("ja-Jpan-JP");
console.log(japanese.minimize().baseName);
// Output: "ja"

기본값이 아닌 지역 유지

지역이 기본값과 다르면 최소화된 식별자에 유지됩니다.

const britishEnglish = new Intl.Locale("en-Latn-GB");
console.log(britishEnglish.minimize().baseName);
// Output: "en-GB"

const canadianFrench = new Intl.Locale("fr-Latn-CA");
console.log(canadianFrench.minimize().baseName);
// Output: "fr-CA"

const mexicanSpanish = new Intl.Locale("es-Latn-MX");
console.log(mexicanSpanish.minimize().baseName);
// Output: "es-MX"

문자 체계 구성 요소는 기본값과 일치하므로 제거되지만, 지역은 언어의 기본값이 아닌 변형을 지정하므로 보존됩니다.

기본값이 아닌 문자 체계 유지

문자 체계가 기본값과 다르면 최소화된 식별자에 유지됩니다.

const simplifiedChinese = new Intl.Locale("zh-Hans-CN");
console.log(simplifiedChinese.minimize().baseName);
// Output: "zh-Hans"

const traditionalChinese = new Intl.Locale("zh-Hant-TW");
console.log(traditionalChinese.minimize().baseName);
// Output: "zh-Hant"

const serbianCyrillic = new Intl.Locale("sr-Cyrl-RS");
console.log(serbianCyrillic.minimize().baseName);
// Output: "sr-Cyrl"

중국어는 간체와 번체 변형을 구분하기 위해 문자 체계 구성 요소가 필요합니다. 세르비아어는 키릴 문자와 라틴 문자를 구분하기 위해 문자 체계 구성 요소가 필요합니다.

이미 최소화된 식별자

로케일 식별자가 이미 최소화되어 있으면 메서드는 변경 없이 동등한 로케일을 반환합니다.

const minimal = new Intl.Locale("fr");
console.log(minimal.minimize().baseName);
// Output: "fr"

maximize와의 관계

minimize() 메서드는 maximize()의 역함수입니다. maximize() 메서드는 완전한 식별자를 생성하기 위해 가능성 있는 하위 태그를 추가하는 반면, minimize()는 간결한 식별자를 생성하기 위해 중복 하위 태그를 제거합니다.

이 메서드들은 완전한 형식과 간결한 형식 간의 양방향 변환을 가능하게 하는 쌍을 형성합니다:

const compact = new Intl.Locale("en");
const complete = compact.maximize();
console.log(complete.baseName);
// Output: "en-Latn-US"

const compactAgain = complete.minimize();
console.log(compactAgain.baseName);
// Output: "en"

간결한 형식에서 완전한 형식으로, 그리고 다시 간결한 형식으로의 왕복 변환은 원래 형식을 생성합니다.

그러나 모든 로케일이 왕복 변환 후 정확히 원래 형식으로 돌아가는 것은 아닙니다. 이 메서드는 원래 구조를 보존하기보다는 정규화된 최소 형식을 생성합니다:

const locale = new Intl.Locale("en-US");
const maximized = locale.maximize();
console.log(maximized.baseName);
// Output: "en-Latn-US"

const minimized = maximized.minimize();
console.log(minimized.baseName);
// Output: "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");
// Stores "en" instead of "en-Latn-US"

이는 정보 손실 없이 저장 데이터 크기를 줄입니다.

읽기 쉬운 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로 최소화되지만, 달력 및 시간 주기 확장은 유지됩니다.