fix(region): only display 'Install additional languages' if gnome-language-selector is available
This commit is contained in:
parent
f5f6d3e8f0
commit
a0245a29e8
3 changed files with 52 additions and 13 deletions
24
Cargo.lock
generated
24
Cargo.lock
generated
|
|
@ -1730,6 +1730,7 @@ dependencies = [
|
||||||
"udev",
|
"udev",
|
||||||
"upower_dbus",
|
"upower_dbus",
|
||||||
"url",
|
"url",
|
||||||
|
"which",
|
||||||
"xkb-data",
|
"xkb-data",
|
||||||
"xkeysym",
|
"xkeysym",
|
||||||
"zbus 5.13.2",
|
"zbus 5.13.2",
|
||||||
|
|
@ -2398,6 +2399,12 @@ dependencies = [
|
||||||
"syn 2.0.114",
|
"syn 2.0.114",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "env_home"
|
||||||
|
version = "0.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c7f84e12ccf0a7ddc17a6c41c93326024c42920d7ee630d04950e6926645c0fe"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "equator"
|
name = "equator"
|
||||||
version = "0.4.2"
|
version = "0.4.2"
|
||||||
|
|
@ -8424,6 +8431,17 @@ dependencies = [
|
||||||
"web-sys",
|
"web-sys",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "which"
|
||||||
|
version = "8.0.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d3fabb953106c3c8eea8306e4393700d7657561cb43122571b172bbfb7c7ba1d"
|
||||||
|
dependencies = [
|
||||||
|
"env_home",
|
||||||
|
"rustix 1.1.3",
|
||||||
|
"winsafe",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "widestring"
|
name = "widestring"
|
||||||
version = "1.2.1"
|
version = "1.2.1"
|
||||||
|
|
@ -9072,6 +9090,12 @@ dependencies = [
|
||||||
"memchr",
|
"memchr",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "winsafe"
|
||||||
|
version = "0.0.19"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wit-bindgen"
|
name = "wit-bindgen"
|
||||||
version = "0.46.0"
|
version = "0.46.0"
|
||||||
|
|
|
||||||
|
|
@ -92,6 +92,7 @@ gettext-rs = { version = "0.7.7", features = [
|
||||||
], optional = true }
|
], optional = true }
|
||||||
num-traits = "0.2"
|
num-traits = "0.2"
|
||||||
pwhash = "1"
|
pwhash = "1"
|
||||||
|
which = "8.0.0"
|
||||||
|
|
||||||
[dependencies.icu]
|
[dependencies.icu]
|
||||||
version = "2.1.1"
|
version = "2.1.1"
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,8 @@ use icu::{
|
||||||
use locales_rs as locale;
|
use locales_rs as locale;
|
||||||
use slotmap::{DefaultKey, SlotMap};
|
use slotmap::{DefaultKey, SlotMap};
|
||||||
|
|
||||||
|
static GNOME_LANGUAGE_SELECTOR: &str = "gnome-language-selector";
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub enum Message {
|
pub enum Message {
|
||||||
AddLanguage(DefaultKey),
|
AddLanguage(DefaultKey),
|
||||||
|
|
@ -99,6 +101,7 @@ pub struct PageRefresh {
|
||||||
region: Option<SystemLocale>,
|
region: Option<SystemLocale>,
|
||||||
available_languages: SlotMap<DefaultKey, SystemLocale>,
|
available_languages: SlotMap<DefaultKey, SystemLocale>,
|
||||||
system_locales: BTreeMap<String, SystemLocale>,
|
system_locales: BTreeMap<String, SystemLocale>,
|
||||||
|
language_selector_available: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
|
|
@ -113,6 +116,8 @@ pub struct Page {
|
||||||
registry: Option<locale::Registry>,
|
registry: Option<locale::Registry>,
|
||||||
expanded_source_popover: Option<usize>,
|
expanded_source_popover: Option<usize>,
|
||||||
add_language_search: String,
|
add_language_search: String,
|
||||||
|
/// Whether gnome-language-selector is in the path.
|
||||||
|
language_selector_available: bool,
|
||||||
/// Cached LC_NUMERIC locale in icu locale format.
|
/// Cached LC_NUMERIC locale in icu locale format.
|
||||||
numeric_locale: Option<Locale>,
|
numeric_locale: Option<Locale>,
|
||||||
/// Cached LC_TIME locale in icu locale format.
|
/// Cached LC_TIME locale in icu locale format.
|
||||||
|
|
@ -165,22 +170,27 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
.on_clear(Message::AddLanguageSearch(String::new()))
|
.on_clear(Message::AddLanguageSearch(String::new()))
|
||||||
.apply(Element::from)
|
.apply(Element::from)
|
||||||
.map(crate::pages::Message::from);
|
.map(crate::pages::Message::from);
|
||||||
let install_additional_button =
|
let drawer = context_drawer(
|
||||||
widget::button::standard(fl!("install-additional-languages"))
|
|
||||||
.on_press(Message::InstallAdditionalLanguages)
|
|
||||||
.apply(widget::container)
|
|
||||||
.width(Length::Fill)
|
|
||||||
.align_x(Alignment::End)
|
|
||||||
.apply(Element::from)
|
|
||||||
.map(crate::pages::Message::from);
|
|
||||||
|
|
||||||
context_drawer(
|
|
||||||
self.add_language_view().map(crate::pages::Message::from),
|
self.add_language_view().map(crate::pages::Message::from),
|
||||||
crate::pages::Message::CloseContextDrawer,
|
crate::pages::Message::CloseContextDrawer,
|
||||||
)
|
)
|
||||||
.title(fl!("add-language", "context"))
|
.title(fl!("add-language", "context"))
|
||||||
.header(search)
|
.header(search);
|
||||||
.footer(install_additional_button)
|
|
||||||
|
if self.language_selector_available {
|
||||||
|
let install_additional_button =
|
||||||
|
widget::button::standard(fl!("install-additional-languages"))
|
||||||
|
.on_press(Message::InstallAdditionalLanguages)
|
||||||
|
.apply(widget::container)
|
||||||
|
.width(Length::Fill)
|
||||||
|
.align_x(Alignment::End)
|
||||||
|
.apply(Element::from)
|
||||||
|
.map(crate::pages::Message::from);
|
||||||
|
|
||||||
|
drawer.footer(install_additional_button)
|
||||||
|
} else {
|
||||||
|
drawer
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ContextView::Region => {
|
ContextView::Region => {
|
||||||
let search = widget::search_input("", &self.add_language_search)
|
let search = widget::search_input("", &self.add_language_search)
|
||||||
|
|
@ -259,7 +269,7 @@ impl Page {
|
||||||
|
|
||||||
Message::InstallAdditionalLanguages => {
|
Message::InstallAdditionalLanguages => {
|
||||||
return cosmic::task::future(async move {
|
return cosmic::task::future(async move {
|
||||||
_ = tokio::process::Command::new("gnome-language-selector")
|
_ = tokio::process::Command::new(GNOME_LANGUAGE_SELECTOR)
|
||||||
.status()
|
.status()
|
||||||
.await;
|
.await;
|
||||||
|
|
||||||
|
|
@ -275,6 +285,7 @@ impl Page {
|
||||||
self.language = page_refresh.language;
|
self.language = page_refresh.language;
|
||||||
self.region = page_refresh.region;
|
self.region = page_refresh.region;
|
||||||
self.registry = Some(page_refresh.registry.0);
|
self.registry = Some(page_refresh.registry.0);
|
||||||
|
self.language_selector_available = page_refresh.language_selector_available;
|
||||||
self.numeric_locale = self.icu_locale_from_env("LC_NUMERIC");
|
self.numeric_locale = self.icu_locale_from_env("LC_NUMERIC");
|
||||||
self.time_locale = self.icu_locale_from_env("LC_TIME");
|
self.time_locale = self.icu_locale_from_env("LC_TIME");
|
||||||
}
|
}
|
||||||
|
|
@ -765,6 +776,8 @@ pub async fn page_reload() -> eyre::Result<PageRefresh> {
|
||||||
available_languages.insert(language);
|
available_languages.insert(language);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let language_selector_available = which::which(GNOME_LANGUAGE_SELECTOR).is_ok();
|
||||||
|
|
||||||
Ok(PageRefresh {
|
Ok(PageRefresh {
|
||||||
config,
|
config,
|
||||||
registry: Registry(registry),
|
registry: Registry(registry),
|
||||||
|
|
@ -772,6 +785,7 @@ pub async fn page_reload() -> eyre::Result<PageRefresh> {
|
||||||
region,
|
region,
|
||||||
available_languages,
|
available_languages,
|
||||||
system_locales,
|
system_locales,
|
||||||
|
language_selector_available,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue