diff --git a/CHANGELOG.md b/CHANGELOG.md index 41903683..123475cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ All notable changes to eww will be listed here, starting at changes since versio - Fix values in the `EWW_NET` variable (By: mario-kr) - Fix the gtk `expander` widget (By: ovalkonia) - Fix wayland monitor names support (By: dragonnn) +- `get_locale` now follows POSIX standard for locale selection (By: mirhahn, w-lfchen) ### Features - Add OnDemand support for focusable on wayland (By: GallowsDove) diff --git a/crates/eww_shared_util/src/locale.rs b/crates/eww_shared_util/src/locale.rs index 028e84b2..08184dc9 100644 --- a/crates/eww_shared_util/src/locale.rs +++ b/crates/eww_shared_util/src/locale.rs @@ -1,14 +1,12 @@ use chrono::Locale; use std::env::var; -/// Returns the `Locale` enum based on the `LC_TIME` environment variable. +/// Returns the `Locale` enum based on the `LC_ALL`, `LC_TIME`, and `LANG` environment variables in +/// that order, which is the precedence order prescribed by Section 8.2 of POSIX.1-2017. /// If the environment variable is not defined or is malformed use the POSIX locale. pub fn get_locale() -> Locale { - let locale_string: String = - var("LC_TIME").map_or_else(|_| "C".to_string(), |v| v.split(".").next().unwrap_or("C").to_string()); - - match (&*locale_string).try_into() { - Ok(x) => x, - Err(_) => Locale::POSIX, - } + var("LC_ALL") + .or_else(|_| var("LC_TIME")) + .or_else(|_| var("LANG")) + .map_or(Locale::POSIX, |v| v.split('.').next().and_then(|x| x.try_into().ok()).unwrap_or_default()) }