From aa8b03657f965d7d169d1c5fe519ff9cff0a64af Mon Sep 17 00:00:00 2001 From: x1z53 Date: Fri, 16 Jan 2026 17:26:26 +0300 Subject: [PATCH 1/2] chore: add gettext-rs --- Cargo.lock | 128 +++++++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 1 + 2 files changed, 129 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 3b75e00a..7af81af2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,15 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + [[package]] name = "anstream" version = "0.6.21" @@ -244,6 +253,12 @@ version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + [[package]] name = "blocking" version = "1.6.2" @@ -629,6 +644,26 @@ dependencies = [ "wasip2", ] +[[package]] +name = "gettext-rs" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5857dc1b7f0fee86961de833f434e29494d72af102ce5355738c0664222bdf" +dependencies = [ + "gettext-sys", + "locale_config", +] + +[[package]] +name = "gettext-sys" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea859ab0dd7e70ff823032b3e077d03d39c965d68c6c10775add60e999d8ee9" +dependencies = [ + "cc", + "temp-dir", +] + [[package]] name = "gio" version = "0.18.4" @@ -951,6 +986,12 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + [[package]] name = "libc" version = "0.2.177" @@ -1029,12 +1070,34 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" +[[package]] +name = "locale_config" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d2c35b16f4483f6c26f0e4e9550717a2f6575bcd6f12a53ff0c490a94a6934" +dependencies = [ + "lazy_static", + "objc", + "objc-foundation", + "regex", + "winapi", +] + [[package]] name = "log" version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + [[package]] name = "memchr" version = "2.7.6" @@ -1063,6 +1126,35 @@ dependencies = [ "memoffset", ] +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", +] + +[[package]] +name = "objc-foundation" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" +dependencies = [ + "block", + "objc", + "objc_id", +] + +[[package]] +name = "objc_id" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" +dependencies = [ + "objc", +] + [[package]] name = "once_cell" version = "1.21.3" @@ -1125,6 +1217,7 @@ dependencies = [ "async-global-executor", "clap", "futures-util", + "gettext-rs", "glib 0.18.5", "glib-build-tools", "glob", @@ -1273,6 +1366,35 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +[[package]] +name = "regex" +version = "1.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" + [[package]] name = "rustc_version" version = "0.4.1" @@ -1483,6 +1605,12 @@ version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df7f62577c25e07834649fc3b39fafdc597c0a3527dc1c60129201ccfcbaa50c" +[[package]] +name = "temp-dir" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83176759e9416cf81ee66cb6508dbfe9c96f20b8b56265a39917551c23c70964" + [[package]] name = "tempfile" version = "3.23.0" diff --git a/Cargo.toml b/Cargo.toml index d618c0cf..d7eb56c3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,6 +9,7 @@ glob = "0.3.1" greetd_ipc = { version = "0.10.0", features = ["sync-codec"] } async-channel = "2.2.1" anyhow = "1.0.82" +gettext-rs = "0.7" libphosh = "0.0.7" clap = { version = "4.5.4", features = ["derive"] } wayland-client = "0.31" From 431ab08b19b191eb4c83477f531db30c4e7d10ae Mon Sep 17 00:00:00 2001 From: x1z53 Date: Fri, 16 Jan 2026 19:07:59 +0300 Subject: [PATCH 2/2] i18n: init --- src/lib.rs | 3 +++ src/lockscreen.rs | 12 ++++++------ src/main.rs | 3 +++ 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 9c650760..030deace 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -47,6 +47,9 @@ fn is_phoc_detected() -> anyhow::Result { pub fn init() -> anyhow::Result<()> { gio::resources_register_include!("phrog.gresource").context("failed to register resources.")?; + let _ = gettextrs::bindtextdomain("phosh", "/usr/share/locale"); + gettextrs::textdomain("phosh")?; + if !is_phoc_detected().context("failed to detect Wayland compositor globals")? { return Err(anyhow!("Phoc parent compositor not detected")); } diff --git a/src/lockscreen.rs b/src/lockscreen.rs index 89d285a0..81f83ea0 100644 --- a/src/lockscreen.rs +++ b/src/lockscreen.rs @@ -189,7 +189,7 @@ mod imp { self.session.replace(user.clone()); let username = user.unwrap(); info!("creating greetd session for user {}", username); - self.obj().set_unlock_status("Please wait..."); + self.obj().set_unlock_status(&gettextrs::gettext("Please wait...")); self.obj().set_sensitive(false); let mut req = Some(Request::CreateSession { username }); while let Some(next_req) = req.take() { @@ -248,7 +248,7 @@ mod imp { if let Err(err) = resp { error!("failed to send greetd request: {:?}", err); - self.obj().set_unlock_status("Error, please try again"); + self.obj().set_unlock_status(&gettextrs::gettext("Error, please try again")); self.obj().set_sensitive(true); return None; } @@ -286,7 +286,7 @@ mod imp { } } Response::Success => { - self.obj().set_unlock_status("Success. Logging in..."); + self.obj().set_unlock_status(&gettextrs::gettext("Success. Logging in...")); self.start_session().await.unwrap(); g_message!("phrog", "launched session, exiting in {}ms", QUIT_DELAY); Shell::default().fade_out(0); @@ -300,7 +300,7 @@ mod imp { description, } => { warn!("auth error: '{}'", description); - self.obj().set_unlock_status("Login failed, please try again"); + self.obj().set_unlock_status(&gettextrs::gettext("Login failed, please try again")); self.obj().shake_pin_entry(); // Greetd IPC dox seem to suggest that this isn't necessary, but then agreety // does this, and if we don't we get a "session is already being configured" @@ -329,7 +329,7 @@ mod imp { impl LockscreenImpl for Lockscreen { fn unlock_submit(&self) { glib::spawn_future_local(clone!(@weak self as this => async move { - this.obj().set_unlock_status("Please wait..."); + this.obj().set_unlock_status(&gettextrs::gettext("Please wait...")); this.obj().set_sensitive(false); let mut req = Some(Request::PostAuthMessageResponse { response: Some(this.obj().pin_entry().to_string()) @@ -347,7 +347,7 @@ fn fake_greetd_interaction(req: Request) -> anyhow::Result { match req { Request::CreateSession { .. } => anyhow::Ok(Response::AuthMessage { auth_message_type: Secret, - auth_message: "Password:".into(), + auth_message: gettextrs::gettext("Password:").into(), }), Request::PostAuthMessageResponse { response } => { if response.is_none() || response.unwrap() != "0" { diff --git a/src/main.rs b/src/main.rs index ce2a2ef5..e9572dbd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -24,6 +24,9 @@ struct Args { } fn main() -> anyhow::Result<()> { + let _ = gettextrs::bindtextdomain("phosh", "/usr/share/locale"); + gettextrs::textdomain("phosh")?; + log::set_logger(&GLIB_LOGGER).unwrap(); log::set_max_level(log::LevelFilter::Debug);