fix(region): only display 'Install additional languages' if gnome-language-selector is available

This commit is contained in:
nicole mikołajczyk 2026-02-12 19:58:19 +01:00 committed by GitHub
parent f5f6d3e8f0
commit a0245a29e8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 52 additions and 13 deletions

24
Cargo.lock generated
View file

@ -1730,6 +1730,7 @@ dependencies = [
"udev",
"upower_dbus",
"url",
"which",
"xkb-data",
"xkeysym",
"zbus 5.13.2",
@ -2398,6 +2399,12 @@ dependencies = [
"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]]
name = "equator"
version = "0.4.2"
@ -8424,6 +8431,17 @@ dependencies = [
"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]]
name = "widestring"
version = "1.2.1"
@ -9072,6 +9090,12 @@ dependencies = [
"memchr",
]
[[package]]
name = "winsafe"
version = "0.0.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904"
[[package]]
name = "wit-bindgen"
version = "0.46.0"

View file

@ -92,6 +92,7 @@ gettext-rs = { version = "0.7.7", features = [
], optional = true }
num-traits = "0.2"
pwhash = "1"
which = "8.0.0"
[dependencies.icu]
version = "2.1.1"

View file

@ -26,6 +26,8 @@ use icu::{
use locales_rs as locale;
use slotmap::{DefaultKey, SlotMap};
static GNOME_LANGUAGE_SELECTOR: &str = "gnome-language-selector";
#[derive(Clone, Debug)]
pub enum Message {
AddLanguage(DefaultKey),
@ -99,6 +101,7 @@ pub struct PageRefresh {
region: Option<SystemLocale>,
available_languages: SlotMap<DefaultKey, SystemLocale>,
system_locales: BTreeMap<String, SystemLocale>,
language_selector_available: bool,
}
#[derive(Default)]
@ -113,6 +116,8 @@ pub struct Page {
registry: Option<locale::Registry>,
expanded_source_popover: Option<usize>,
add_language_search: String,
/// Whether gnome-language-selector is in the path.
language_selector_available: bool,
/// Cached LC_NUMERIC locale in icu locale format.
numeric_locale: Option<Locale>,
/// 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()))
.apply(Element::from)
.map(crate::pages::Message::from);
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);
context_drawer(
let drawer = context_drawer(
self.add_language_view().map(crate::pages::Message::from),
crate::pages::Message::CloseContextDrawer,
)
.title(fl!("add-language", "context"))
.header(search)
.footer(install_additional_button)
.header(search);
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 => {
let search = widget::search_input("", &self.add_language_search)
@ -259,7 +269,7 @@ impl Page {
Message::InstallAdditionalLanguages => {
return cosmic::task::future(async move {
_ = tokio::process::Command::new("gnome-language-selector")
_ = tokio::process::Command::new(GNOME_LANGUAGE_SELECTOR)
.status()
.await;
@ -275,6 +285,7 @@ impl Page {
self.language = page_refresh.language;
self.region = page_refresh.region;
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.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);
}
let language_selector_available = which::which(GNOME_LANGUAGE_SELECTOR).is_ok();
Ok(PageRefresh {
config,
registry: Registry(registry),
@ -772,6 +785,7 @@ pub async fn page_reload() -> eyre::Result<PageRefresh> {
region,
available_languages,
system_locales,
language_selector_available,
})
}