From 4050ea8bfe6f7c5306bb58df18d3a2943087ad48 Mon Sep 17 00:00:00 2001 From: Josh Megnauth Date: Tue, 27 Aug 2024 08:39:16 -0400 Subject: [PATCH] Localize date strings Mostly closes: #103 Analogous to my other patches that localize date strings (e.g. pop-os/cosmic-files#277). The "password:" prompt is not localized in this patch because PAM should yield translated strings on its own. This needs further investigation. --- Cargo.lock | 7 +++++++ Cargo.toml | 2 +- src/greeter.rs | 7 +++---- src/localize.rs | 18 +++++++++++++++++- src/locker.rs | 7 +++---- 5 files changed, 31 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9a9ec2c..d987f19 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -699,6 +699,7 @@ dependencies = [ "iana-time-zone", "js-sys", "num-traits", + "pure-rust-locales", "wasm-bindgen", "windows-targets 0.52.6", ] @@ -3752,6 +3753,12 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43d84d1d7a6ac92673717f9f6d1518374ef257669c24ebc5ac25d5033828be58" +[[package]] +name = "pure-rust-locales" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1190fd18ae6ce9e137184f207593877e70f39b015040156b1e05081cdfe3733a" + [[package]] name = "pwd" version = "1.4.0" diff --git a/Cargo.toml b/Cargo.toml index 8c2c641..50060fc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] -chrono = "0.4.38" +chrono = { version = "0.4", features = ["unstable-locales"] } cosmic-bg-config.workspace = true cosmic-comp-config.workspace = true cosmic-config = { workspace = true, features = ["calloop", "macro"] } diff --git a/src/greeter.rs b/src/greeter.rs index 87d3908..98afe7b 100644 --- a/src/greeter.rs +++ b/src/greeter.rs @@ -912,14 +912,13 @@ impl cosmic::Application for App { let mut column = widget::column::with_capacity(2).padding(16.0).spacing(12.0); let dt = chrono::Local::now(); + let locale = *crate::localize::LANGUAGE_CHRONO; - //TODO: localized format - let date = dt.format("%A, %B %-d"); + let date = dt.format_localized("%A, %B %-d", locale); column = column .push(widget::text::title2(format!("{}", date)).style(style::Text::Accent)); - //TODO: localized format - let time = dt.format("%R"); + let time = dt.format_localized("%R", locale); column = column.push( widget::text(format!("{}", time)) .size(112.0) diff --git a/src/localize.rs b/src/localize.rs index 1aab45a..c012f86 100644 --- a/src/localize.rs +++ b/src/localize.rs @@ -1,6 +1,9 @@ // SPDX-License-Identifier: GPL-3.0-only -use std::sync::OnceLock; +use std::{ + str::FromStr, + sync::{LazyLock, OnceLock}, +}; use i18n_embed::{ fluent::{fluent_language_loader, FluentLanguageLoader}, @@ -13,6 +16,19 @@ use rust_embed::RustEmbed; struct Localizations; pub static LANGUAGE_LOADER: OnceLock = OnceLock::new(); +pub static LANGUAGE_CHRONO: LazyLock = LazyLock::new(|| { + std::env::var("LC_TIME") + .ok() + .or_else(|| std::env::var("LANG").ok()) + .and_then(|locale_full| { + // Split LANG because it may be set to a locale such as en_US.UTF8 + locale_full + .split('.') + .next() + .and_then(|locale| chrono::Locale::from_str(locale).ok()) + }) + .unwrap_or(chrono::Locale::en_US) +}); #[macro_export] macro_rules! fl { diff --git a/src/locker.rs b/src/locker.rs index f620bb1..92be8e3 100644 --- a/src/locker.rs +++ b/src/locker.rs @@ -564,14 +564,13 @@ impl cosmic::Application for App { let mut column = widget::column::with_capacity(2).padding(16.0); let dt = chrono::Local::now(); + let locale = *crate::localize::LANGUAGE_CHRONO; - //TODO: localized format - let date = dt.format("%A, %B %-d"); + let date = dt.format_localized("%A, %B %-d", locale); column = column .push(widget::text::title2(format!("{}", date)).style(style::Text::Accent)); - //TODO: localized format - let time = dt.format("%R"); + let time = dt.format_localized("%R", locale); column = column.push( widget::text(format!("{}", time)) .size(112.0)