#![cfg(any(target_os = "macos", target_os = "ios"))]
use crate::LocaleError;
use objc::runtime::Object;
use objc::{class, msg_send, sel, sel_impl}; use objc_foundation::{INSString, NSString};
pub(crate) fn current_locale() -> Result<String, LocaleError> {
let nslocale = class!(NSLocale);
let identifier = unsafe {
let current: *const Object = msg_send![nslocale, currentLocale]; let identifier: *const NSString = msg_send![current, localeIdentifier]; identifier.as_ref().unwrap()
};
Ok(identifier.as_str().replace("_", "-"))
}
#[cfg(test)]
mod test {
use objc::{class, msg_send, sel, sel_impl}; use objc_foundation::{INSArray, INSString, NSArray, NSString};
#[test]
fn list_available() {
let nslocale = class!(NSLocale);
let available = unsafe {
let available: *const NSArray<NSString> =
msg_send![nslocale, availableLocaleIdentifiers];
available.as_ref().unwrap()
};
for locale in available.to_vec() {
println!("{}", locale.as_str());
}
}
}