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", "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"

View file

@ -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"

View file

@ -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,
}) })
} }