Compare commits

...

1 Commits
v1.4.0 ... lang

7 changed files with 79 additions and 23 deletions

20
Cargo.lock generated
View File

@ -54,6 +54,15 @@ name = "cc"
version = "1.0.45"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "dbus"
version = "0.6.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
"libdbus-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "dtoa"
version = "0.4.4"
@ -232,6 +241,14 @@ name = "libc"
version = "0.2.62"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "libdbus-sys"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"pkg-config 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "linked-hash-map"
version = "0.5.2"
@ -324,6 +341,7 @@ name = "rs"
version = "0.1.0"
dependencies = [
"bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
"dbus 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
"gio 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
"glib 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)",
"glib-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
@ -436,6 +454,7 @@ dependencies = [
"checksum cairo-rs 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dd940f0d609699e343ef71c4af5f66423afbf30d666f796dabd8fd15229cf5b6"
"checksum cairo-sys-rs 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d25596627380be4381247dba06c69ad05ca21b3b065bd9827e416882ac41dcd2"
"checksum cc 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)" = "4fc9a35e1f4290eb9e5fc54ba6cf40671ed2a2514c3eeb2b2a908dda2ea5a1be"
"checksum dbus 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "48b5f0f36f1eebe901b0e6bee369a77ed3396334bf3f09abd46454a576f71819"
"checksum dtoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "ea57b42383d091c85abcc2706240b94ab2a8fa1fc81c10ff23c4de06e2a90b5e"
"checksum fragile 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05f8140122fa0d5dcb9fc8627cfce2b37cc1500f752636d46ea28bc26785c2f9"
"checksum gdk 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bcc52c7244046df9d959df87289f1fc5cca23f9f850bab0c967963e2ecb83a96"
@ -451,6 +470,7 @@ dependencies = [
"checksum gtk-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d487d333a4b87072e6bf9f2e55befa0ebef01b9496c2e263c0f4a1ff3d6c04b1"
"checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
"checksum libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)" = "34fcd2c08d2f832f376f4173a231990fa5aef4e99fb569867318a227ef4c06ba"
"checksum libdbus-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dc12a3bc971424edbbf7edaf6e5740483444db63aa8e23d3751ff12a30f306f0"
"checksum linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ae91b68aebc4ddb91978b11a1b02ddd8602a05ec19002801c5666000e05e0f83"
"checksum maplit 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d"
"checksum memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "88579771288728879b57485cc7d6b07d648c9f0141eb955f8ab7f9d45394468e"

View File

@ -4,6 +4,7 @@ version = "0.1.0"
[dependencies]
bitflags = "1.0.*"
dbus = "0.6.*"
maplit = "1.0.*"
regex = "1.1.*"
serde = { version = "1.0.*", features = ["derive"] }

1
debian/control vendored
View File

@ -12,6 +12,7 @@ Build-Depends:
libgtk-3-dev,
libcroco3-dev,
librust-bitflags-1-dev (>= 1.0),
librust-dbus-0.6-dev (>= 0.6),
librust-gio+v2-44-dev,
librust-glib+v2-44-dev,
librust-glib-sys-dev,

View File

@ -1,5 +1,6 @@
#[macro_use]
extern crate bitflags;
extern crate dbus;
extern crate gio;
extern crate glib;
extern crate glib_sys;

View File

@ -1,8 +1,8 @@
/*! Locale detection and management.
* Based on https://github.com/rust-locale/locale_config
*
* Ready for deletion/replacement once Debian starts packaging this,
* although this version doesn't need lazy_static.
* Modified for dbus querying.
* This version doesn't need lazy_static.
*
* Copyright (c) 20162019 Jan Hudec <bulb@ucw.cz>
Copyright (c) 2016 A.J. Gardner <aaron.j.gardner@gmail.com>
@ -11,10 +11,13 @@
Copyright (c) 2019, Sophie Tauchert <999eagle@999eagle.moe>
*/
use dbus::Connection;
use regex::Regex;
use std::borrow::Cow;
use std::env;
use dbus::stdintf::org_freedesktop_dbus::Properties;
/// Errors that may be returned by `locale_config`.
#[derive(Copy,Clone,Debug,PartialEq,Eq)]
pub enum Error {
@ -463,19 +466,23 @@ fn tag(s: &str) -> Result<LanguageRange> {
// TODO: Read /etc/locale.alias
fn tag_inv(s: &str) -> LanguageRange {
tag(s).unwrap_or(LanguageRange::invariant())
tag(s).unwrap_or_else(|_e| LanguageRange::invariant())
}
pub fn system_locale() -> Option<Locale> {
/// Returns the locale using Unix roles and the given lookup method.
// TODO: maybe don't drop all errors on the floor like that
fn unix_locale<'a, 'b, F, E>(get: F) -> Locale
where F: Fn(&'a str) -> ::std::result::Result<String, E>
{
// LC_ALL overrides everything
if let Ok(all) = env::var("LC_ALL") {
if let Ok(all) = get("LC_ALL") {
if let Ok(t) = tag(all.as_ref()) {
return Some(Locale::from(t));
return Locale::from(t);
}
}
// LANG is default
let mut loc =
if let Ok(lang) = env::var("LANG") {
if let Ok(lang) = get("LANG") {
Locale::from(tag_inv(lang.as_ref()))
} else {
Locale::invariant()
@ -494,7 +501,7 @@ pub fn system_locale() -> Option<Locale> {
("telephone", "LC_TELEPHONE"),
("measurement", "LC_MEASUREMENT"),
].iter() {
if let Ok(val) = env::var(var) {
if let Ok(val) = get(var) {
if let Ok(tag) = tag(val.as_ref())
{
loc.add_category(cat, &tag);
@ -502,7 +509,7 @@ pub fn system_locale() -> Option<Locale> {
}
}
// LANGUAGE defines fallbacks
if let Ok(langs) = env::var("LANGUAGE") {
if let Ok(langs) = get("LANGUAGE") {
for i in langs.split(':') {
if i != "" {
if let Ok(tag) = tag(i) {
@ -511,16 +518,44 @@ pub fn system_locale() -> Option<Locale> {
}
}
}
if loc.as_ref() != "" {
return Some(loc);
} else {
return None;
}
loc
}
fn env_locale() -> Locale {
unix_locale(env::var)
}
fn dbus_locale()
-> std::result::Result<Locale, Box<dyn std::error::Error>>
{
let connection = Connection::get_private(dbus::BusType::Session)?;
let property = connection.with_path(
"org.freedesktop.locale1", "/org/freedesktop/locale1", 100
);
let locales: Vec<String>
= property.get("org.freedesktop.locale1", "Locale")?;
let val_pairs: Vec<(String, String)> = locales.into_iter().map(|s| {
let mut splits = s.splitn(2, "=");
(splits.next().unwrap().into(), splits.next().unwrap_or("").into())
}).collect();
Ok(unix_locale(|var| {
match val_pairs.iter().find(|(name, _val)| name == &var) {
Some((_name, val)) => Ok(val.clone()),
None => Err(()),
}
}))
}
pub fn system_locale() -> Locale {
dbus_locale().unwrap_or_else(|_e| env_locale())
}
#[cfg(test)]
mod test {
use super::LanguageRange;
use super::*;
#[test]
fn unix_tags() {

View File

@ -39,6 +39,7 @@ cc = meson.get_compiler('c')
deps = [
# dependency('glib-2.0', version: '>=2.26.0'),
dependency('dbus-1', version: '>=1.3'),
dependency('gio-2.0', version: '>=2.26.0'),
dependency('gtk+-3.0', version: '>=3.0'),
dependency('libcroco-0.6'),

View File

@ -110,14 +110,11 @@ pub fn show(window: EekGtkKeyboard, position: ::layout::c::Bounds) {
.map(|(_kind, name)| name.as_str())
.collect();
let translations = system_locale()
.map(|locale|
locale.tags_for("messages")
.next().unwrap() // guaranteed to exist
.as_ref()
.to_owned()
)
.and_then(|lang| resources::get_layout_names(lang.as_str()));
let translations = resources::get_layout_names(system_locale()
.tags_for("messages")
.next().unwrap() // guaranteed to exist by locale_config
.as_ref()
);
// sorted collection of human and machine names
let mut human_names: Vec<(&str, &str)> = match translations {