locale: Add translations for layout names
Pulled in some Unix-specific code from https://github.com/rust-locale/locale_config to reduce dependencies. First reason to reduce dependencies: gettext-rs is not in Debian. Copying gettext-sys might have made sense, but the interface is somewhat confusing. For translating a couple identifiers, detection and some hand-rolled hash map is all that is needed, and the option to move to gettext later remains. locale_config has been stripped of the lazy_static dependency, which, messing with the strtup sequence, might be a source of debugging woes. Plus setting language once in the beginning is somewhat inflexible regarding runtime changes.
This commit is contained in:
39
src/locale.rs
Normal file
39
src/locale.rs
Normal file
@ -0,0 +1,39 @@
|
||||
/*! Locale-specific functions */
|
||||
|
||||
use std::cmp;
|
||||
use std::ffi::CString;
|
||||
|
||||
mod c {
|
||||
use std::os::raw::c_char;
|
||||
|
||||
#[allow(non_camel_case_types)]
|
||||
pub type c_int = i32;
|
||||
|
||||
#[no_mangle]
|
||||
extern "C" {
|
||||
// from libc
|
||||
pub fn strcoll(cs: *const c_char, ct: *const c_char) -> c_int;
|
||||
}
|
||||
}
|
||||
|
||||
fn cstring_safe(s: &str) -> CString {
|
||||
CString::new(s)
|
||||
.unwrap_or(CString::new("").unwrap())
|
||||
}
|
||||
|
||||
pub fn compare_current_locale(a: &str, b: &str) -> cmp::Ordering {
|
||||
let a = cstring_safe(a);
|
||||
let b = cstring_safe(b);
|
||||
let a = a.as_ptr();
|
||||
let b = b.as_ptr();
|
||||
let result = unsafe { c::strcoll(a, b) };
|
||||
if result == 0 {
|
||||
cmp::Ordering::Equal
|
||||
} else if result > 0 {
|
||||
cmp::Ordering::Greater
|
||||
} else if result < 0 {
|
||||
cmp::Ordering::Less
|
||||
} else {
|
||||
unreachable!()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user