fn norm_into<'a>(buf: &'a mut [u8; 40], tag: &str) -> &'a str {
let bytes = tag.as_bytes();
let len = bytes.len().min(buf.len());
for k in 0..len {
let b = bytes[k].to_ascii_lowercase();
buf[k] = if b == b'_' { b'-' } else { b };
}
core::str::from_utf8(&buf[..len]).unwrap_or("")
}
fn lookup(
display_locale: &str,
code: &str,
f: fn(&str, &str) -> Option<&'static str>,
) -> Option<&'static str> {
let mut buf = [0u8; 40];
let norm = norm_into(&mut buf, display_locale);
let mut end = norm.len();
loop {
if let Some(name) = f(&norm[..end], code) {
return Some(name);
}
match norm[..end].rfind('-') {
Some(i) => end = i,
None => return f("en", code),
}
}
}
#[must_use]
pub fn language_name(display_locale: &str, code: &str) -> Option<&'static str> {
let mut buf = [0u8; 40];
let code = norm_into(&mut buf, code); lookup(display_locale, code, crate::cldr::language_name)
}
#[must_use]
pub fn region_name(display_locale: &str, code: &str) -> Option<&'static str> {
let mut buf = [0u8; 8];
let bytes = code.as_bytes();
let len = bytes.len().min(buf.len());
for k in 0..len {
buf[k] = bytes[k].to_ascii_uppercase(); }
let code = core::str::from_utf8(&buf[..len]).unwrap_or("");
lookup(display_locale, code, crate::cldr::region_name)
}