8 releases (3 stable)

2.1.1 Oct 28, 2025
2.0.0 May 7, 2025
2.0.0-beta2 Feb 26, 2025
2.0.0-beta1 Nov 23, 2024
0.1.2 Mar 8, 2024

#45 in Internationalization (i18n)

Download history 82192/week @ 2025-09-23 79648/week @ 2025-09-30 68744/week @ 2025-10-07 76125/week @ 2025-10-14 91471/week @ 2025-10-21 85417/week @ 2025-10-28 103408/week @ 2025-11-04 106280/week @ 2025-11-11 105266/week @ 2025-11-18 90988/week @ 2025-11-25 122595/week @ 2025-12-02 152841/week @ 2025-12-09 158810/week @ 2025-12-16 158966/week @ 2025-12-23 183192/week @ 2025-12-30 193755/week @ 2026-01-06

720,974 downloads per month
Used in 114 crates (32 directly)

Unicode-3.0

1.5MB
21K SLoC

icu_locale crates.io

Canonicalization of locale identifiers based on CLDR data.

This module is published as its own crate (icu_locale) and as part of the icu crate. See the latter for more details on the ICU4X project.

It currently supports locale canonicalization based upon the canonicalization algorithm from UTS #35: Unicode LDML 3. LocaleId Canonicalization, as well as the minimize and maximize likely subtags algorithms as described in UTS #35: Unicode LDML 3. Likely Subtags.

The maximize method potentially updates a passed in locale in place depending up the results of running the 'Add Likely Subtags' algorithm from UTS #35: Unicode LDML 3. Likely Subtags.

This minimize method returns a new Locale that is the result of running the 'Remove Likely Subtags' algorithm from UTS #35: Unicode LDML 3. Likely Subtags.

Examples

use icu::locale::Locale;
use icu::locale::{LocaleCanonicalizer, TransformResult};

let lc = LocaleCanonicalizer::new_extended();

let mut locale: Locale = "ja-Latn-fonipa-hepburn-heploc"
    .parse()
    .expect("parse failed");
assert_eq!(lc.canonicalize(&mut locale), TransformResult::Modified);
assert_eq!(locale, "ja-Latn-alalc97-fonipa".parse::<Locale>().unwrap());
use icu::locale::{locale, LocaleExpander, TransformResult};

let lc = LocaleExpander::new_common();

let mut locale = locale!("zh-CN");
assert_eq!(lc.maximize(&mut locale.id), TransformResult::Modified);
assert_eq!(locale, locale!("zh-Hans-CN"));

let mut locale = locale!("zh-Hant-TW");
assert_eq!(lc.maximize(&mut locale.id), TransformResult::Unmodified);
assert_eq!(locale, locale!("zh-Hant-TW"));
use icu::locale::{locale, LocaleExpander, TransformResult};
use writeable::assert_writeable_eq;

let lc = LocaleExpander::new_common();

let mut locale = locale!("zh-Hans-CN");
assert_eq!(lc.minimize(&mut locale.id), TransformResult::Modified);
assert_eq!(locale, locale!("zh"));

let mut locale = locale!("zh");
assert_eq!(lc.minimize(&mut locale.id), TransformResult::Unmodified);
assert_eq!(locale, locale!("zh"));

More Information

For more information on development, authorship, contributing etc. please visit ICU4X home page.

Dependencies

~0.7–1.5MB
~30K SLoC