use std::char::decode_utf16;
use super::{Locale, Utf16String};
pub(crate) fn to_lower_case_default(value: &Utf16String) -> Utf16String {
let locale = Locale::get_default();
let language = locale
.to_language_tag()
.to_string_lossy()
.split(['-', '_'])
.next()
.unwrap_or("")
.to_ascii_lowercase();
let turkic = matches!(language.as_str(), "tr" | "az");
let mut result = Vec::with_capacity(value.len());
for decoded in decode_utf16(value.as_utf16().iter().copied()) {
match decoded {
Ok(character) if turkic && character == 'I' => {
result.extend('\u{131}'.encode_utf16(&mut [0; 2]).iter().copied());
}
Ok(character) if turkic && character == '\u{130}' => {
result.extend('i'.encode_utf16(&mut [0; 2]).iter().copied());
}
Ok(character) => {
for lower in character.to_lowercase() {
let mut buffer = [0_u16; 2];
let encoded = lower.encode_utf16(&mut buffer);
result.extend_from_slice(encoded);
}
}
Err(error) => result.push(error.unpaired_surrogate()),
}
}
Utf16String::from_utf16(result)
}