public inbox for yew-devel@lists.proxmox.com
 help / color / mirror / Atom feed
* [yew-devel] [PATCH yew-comp/yew-widget-toolkit v2 0/4] Enable RTL text direction for relevant languages
@ 2025-09-12  8:47 Dominik Csapak
  2025-09-12  8:47 ` [yew-devel] [PATCH yew-widget-toolkit v2 1/3] state: language: add text direction setting Dominik Csapak
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Dominik Csapak @ 2025-09-12  8:47 UTC (permalink / raw)
  To: yew-devel

This series automatically enables rtl text direction for languages where
this is usual, when the LanguagueSwitcher is used.

changes from v1:
* fixed accidentally commited leftover hunk

proxmox-yew-widget-toolkit:

Dominik Csapak (3):
  state: language: add text direction setting
  widget: rtl switcher: refactor setting rtl direction
  widget: language selector: automatically set text direction from
    language

 src/state/language.rs           | 31 ++++++++++++++++---
 src/state/mod.rs                |  3 +-
 src/widget/language_selector.rs | 18 ++++++++++-
 src/widget/rtl_switcher.rs      | 55 +++++++++++++++++++++++----------
 4 files changed, 85 insertions(+), 22 deletions(-)


proxmox-yew-comp:

Dominik Csapak (1):
  languages: add text direction information where necessary

 src/lib.rs | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)


Summary over all repositories:
  5 files changed, 90 insertions(+), 26 deletions(-)

-- 
Generated by git-murpp 0.8.1


_______________________________________________
yew-devel mailing list
yew-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/yew-devel


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [yew-devel] [PATCH yew-widget-toolkit v2 1/3] state: language: add text direction setting
  2025-09-12  8:47 [yew-devel] [PATCH yew-comp/yew-widget-toolkit v2 0/4] Enable RTL text direction for relevant languages Dominik Csapak
@ 2025-09-12  8:47 ` Dominik Csapak
  2025-09-12  8:47 ` [yew-devel] [PATCH yew-widget-toolkit v2 2/3] widget: rtl switcher: refactor setting rtl direction Dominik Csapak
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Dominik Csapak @ 2025-09-12  8:47 UTC (permalink / raw)
  To: yew-devel

Languages can have a text direction that is not left-to-right (LTR), so
add that setting to the LanguageInfo. Expose it only via a builder style
method, since most languages don't need this.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
 src/state/language.rs | 24 ++++++++++++++++++++----
 src/state/mod.rs      |  1 +
 2 files changed, 21 insertions(+), 4 deletions(-)

diff --git a/src/state/language.rs b/src/state/language.rs
index 182dcc9..3848731 100644
--- a/src/state/language.rs
+++ b/src/state/language.rs
@@ -8,12 +8,21 @@ use crate::props::ExtractPrimaryKey;
 
 use super::{PersistentState, SharedState, SharedStateObserver};
 
+/// The text direction, default is LTR
+#[derive(Default, Debug, Copy, Clone, PartialEq, Eq)]
+pub enum TextDirection {
+    #[default]
+    Ltr,
+    Rtl,
+}
+
 #[derive(Clone, PartialEq, Debug)]
 pub struct LanguageInfo {
-    pub lang: String,            // id (de, en, ...)
-    pub text: String,            // Language name (native).
-    pub english_text: String,    // English language name.
-    pub translated_text: String, // Translated language name.
+    pub lang: String,             // id (de, en, ...)
+    pub text: String,             // Language name (native).
+    pub english_text: String,     // English language name.
+    pub translated_text: String,  // Translated language name.
+    pub direction: TextDirection, // Text direction of the language
 }
 
 impl LanguageInfo {
@@ -28,8 +37,15 @@ impl LanguageInfo {
             text: text.into(),
             translated_text: gettext(&english_text),
             english_text,
+            direction: Default::default(),
         }
     }
+
+    /// Builder style method to set the text direction
+    pub fn direction(mut self, direction: TextDirection) -> Self {
+        self.direction = direction;
+        self
+    }
 }
 
 impl ExtractPrimaryKey for LanguageInfo {
diff --git a/src/state/mod.rs b/src/state/mod.rs
index 4cd37a0..ff91faa 100644
--- a/src/state/mod.rs
+++ b/src/state/mod.rs
@@ -40,6 +40,7 @@ pub use theme::{
 mod language;
 pub use language::{
     get_available_languages, set_available_languages, Language, LanguageInfo, LanguageObserver,
+    TextDirection,
 };
 
 use crate::props::StorageLocation;
-- 
2.47.3



_______________________________________________
yew-devel mailing list
yew-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/yew-devel


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [yew-devel] [PATCH yew-widget-toolkit v2 2/3] widget: rtl switcher: refactor setting rtl direction
  2025-09-12  8:47 [yew-devel] [PATCH yew-comp/yew-widget-toolkit v2 0/4] Enable RTL text direction for relevant languages Dominik Csapak
  2025-09-12  8:47 ` [yew-devel] [PATCH yew-widget-toolkit v2 1/3] state: language: add text direction setting Dominik Csapak
@ 2025-09-12  8:47 ` Dominik Csapak
  2025-09-12  8:47 ` [yew-devel] [PATCH yew-widget-toolkit v2 3/3] widget: language selector: automatically set text direction from language Dominik Csapak
  2025-09-12  8:47 ` [yew-devel] [PATCH yew-comp v2 1/1] languages: add text direction information where necessary Dominik Csapak
  3 siblings, 0 replies; 5+ messages in thread
From: Dominik Csapak @ 2025-09-12  8:47 UTC (permalink / raw)
  To: yew-devel

we want to use that from the language selector too, so refactor this.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
 src/widget/rtl_switcher.rs | 55 +++++++++++++++++++++++++++-----------
 1 file changed, 39 insertions(+), 16 deletions(-)

diff --git a/src/widget/rtl_switcher.rs b/src/widget/rtl_switcher.rs
index 2400dd7..8c18bbd 100644
--- a/src/widget/rtl_switcher.rs
+++ b/src/widget/rtl_switcher.rs
@@ -1,8 +1,13 @@
+use anyhow::format_err;
+
 use pwt_macros::widget;
 use yew::{Classes, Component, Properties};
 
 use super::form::Checkbox;
-use crate::props::{FieldBuilder, WidgetBuilder};
+use crate::{
+    props::{FieldBuilder, WidgetBuilder},
+    state::TextDirection,
+};
 
 /// A checkbox to switch between Left-to-Right and Right-to-Left layouts
 #[widget(pwt=crate, comp=PwtRtlSwitcher, @input, @element)]
@@ -51,25 +56,23 @@ impl Component for PwtRtlSwitcher {
     fn update(&mut self, _ctx: &yew::Context<Self>, msg: Self::Message) -> bool {
         match msg {
             Msg::ToggleRtl => {
-                let elements = gloo_utils::document().get_elements_by_tag_name("html");
-                if let Some(html) = elements.get_with_index(0) {
-                    if self.rtl {
-                        if let Err(err) = html.remove_attribute("dir") {
-                            log::error!("could not remove dir attribute: {:?}", err);
-                            return false;
-                        }
-                        self.rtl = false;
-                    } else {
-                        if let Err(err) = html.set_attribute("dir", "rtl") {
-                            log::error!("could not set dir attribute: {:?}", err);
-                            return false;
-                        }
-                        self.rtl = true;
+                let direction = if self.rtl {
+                    TextDirection::Ltr
+                } else {
+                    TextDirection::Rtl
+                };
+                match set_text_direction(direction) {
+                    Err(err) => {
+                        log::error!("{err}");
+                        false
+                    }
+                    Ok(()) => {
+                        self.rtl = !self.rtl;
+                        true
                     }
                 }
             }
         }
-        true
     }
 
     fn create(_ctx: &yew::Context<Self>) -> Self {
@@ -94,3 +97,23 @@ impl Component for PwtRtlSwitcher {
             .into()
     }
 }
+
+/// Sets the global text direction on the root HTML element (if possible).
+/// Otherwise returns an error.
+pub fn set_text_direction(direction: TextDirection) -> Result<(), anyhow::Error> {
+    let elements = gloo_utils::document().get_elements_by_tag_name("html");
+    let html = elements
+        .get_with_index(0)
+        .ok_or_else(|| format_err!("no html element found"))?;
+    match direction {
+        TextDirection::Ltr => {
+            html.remove_attribute("dir")
+                .map_err(|err| format_err!("could not remove dir attribute: {err:?}"))?;
+        }
+        TextDirection::Rtl => {
+            html.set_attribute("dir", "rtl")
+                .map_err(|err| format_err!("could not set dir attribute: {err:?}"))?;
+        }
+    }
+    Ok(())
+}
-- 
2.47.3



_______________________________________________
yew-devel mailing list
yew-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/yew-devel


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [yew-devel] [PATCH yew-widget-toolkit v2 3/3] widget: language selector: automatically set text direction from language
  2025-09-12  8:47 [yew-devel] [PATCH yew-comp/yew-widget-toolkit v2 0/4] Enable RTL text direction for relevant languages Dominik Csapak
  2025-09-12  8:47 ` [yew-devel] [PATCH yew-widget-toolkit v2 1/3] state: language: add text direction setting Dominik Csapak
  2025-09-12  8:47 ` [yew-devel] [PATCH yew-widget-toolkit v2 2/3] widget: rtl switcher: refactor setting rtl direction Dominik Csapak
@ 2025-09-12  8:47 ` Dominik Csapak
  2025-09-12  8:47 ` [yew-devel] [PATCH yew-comp v2 1/1] languages: add text direction information where necessary Dominik Csapak
  3 siblings, 0 replies; 5+ messages in thread
From: Dominik Csapak @ 2025-09-12  8:47 UTC (permalink / raw)
  To: yew-devel

on first render and when changing the language.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
changes from v1:
* remove use of 'get_current_language_info', was a leftover

 src/state/language.rs           |  7 +++++++
 src/state/mod.rs                |  4 ++--
 src/widget/language_selector.rs | 18 +++++++++++++++++-
 3 files changed, 26 insertions(+), 3 deletions(-)

diff --git a/src/state/language.rs b/src/state/language.rs
index 3848731..5621a80 100644
--- a/src/state/language.rs
+++ b/src/state/language.rs
@@ -76,6 +76,13 @@ pub fn get_available_languages() -> Vec<LanguageInfo> {
         .collect()
 }
 
+/// Get [`LanguageInfo`] by its short name.
+pub fn get_language_info(lang: &str) -> Option<LanguageInfo> {
+    get_available_languages()
+        .into_iter()
+        .find(|info| info.lang == lang)
+}
+
 // this `thread_local!` definition should be fine as this crate is essentially WASM only where
 // besides web workers and similar ways to spawn futures, there is only one thread. if this
 // assumption changes, this will need to be adapted.
diff --git a/src/state/mod.rs b/src/state/mod.rs
index ff91faa..5a3ffc5 100644
--- a/src/state/mod.rs
+++ b/src/state/mod.rs
@@ -39,8 +39,8 @@ pub use theme::{
 
 mod language;
 pub use language::{
-    get_available_languages, set_available_languages, Language, LanguageInfo, LanguageObserver,
-    TextDirection,
+    get_available_languages, get_language_info, set_available_languages, Language, LanguageInfo,
+    LanguageObserver, TextDirection,
 };
 
 use crate::props::StorageLocation;
diff --git a/src/widget/language_selector.rs b/src/widget/language_selector.rs
index 588cfab..ff5d467 100644
--- a/src/widget/language_selector.rs
+++ b/src/widget/language_selector.rs
@@ -1,6 +1,7 @@
 use std::rc::Rc;
 
-use crate::state::{Selection, Store};
+use crate::state::{get_language_info, Selection, Store};
+use crate::widget::rtl_switcher::set_text_direction;
 use yew::html::IntoEventCallback;
 use yew::virtual_dom::{Key, VComp, VNode};
 
@@ -122,6 +123,11 @@ impl Component for PwtLanguageSelector {
                 } else {
                     Language::store(lang);
                 }
+                if let Some(info) = get_language_info(&self.lang) {
+                    if let Err(err) = set_text_direction(info.direction) {
+                        log::error!("could not set text direction: {err}");
+                    }
+                }
                 true
             }
         }
@@ -163,6 +169,16 @@ impl Component for PwtLanguageSelector {
             })
             .into()
     }
+
+    fn rendered(&mut self, _ctx: &Context<Self>, first_render: bool) {
+        if first_render {
+            if let Some(info) = get_language_info(&self.lang) {
+                if let Err(err) = set_text_direction(info.direction) {
+                    log::error!("could not set text direction: {err}");
+                }
+            }
+        }
+    }
 }
 
 impl From<LanguageSelector> for VNode {
-- 
2.47.3



_______________________________________________
yew-devel mailing list
yew-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/yew-devel


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [yew-devel] [PATCH yew-comp v2 1/1] languages: add text direction information where necessary
  2025-09-12  8:47 [yew-devel] [PATCH yew-comp/yew-widget-toolkit v2 0/4] Enable RTL text direction for relevant languages Dominik Csapak
                   ` (2 preceding siblings ...)
  2025-09-12  8:47 ` [yew-devel] [PATCH yew-widget-toolkit v2 3/3] widget: language selector: automatically set text direction from language Dominik Csapak
@ 2025-09-12  8:47 ` Dominik Csapak
  3 siblings, 0 replies; 5+ messages in thread
From: Dominik Csapak @ 2025-09-12  8:47 UTC (permalink / raw)
  To: yew-devel

we have 3 languages that are RTL (right-to-left):
* Aarabic
* Persian (Farsi)
* Hebrew

so set the RTL direction there.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
 src/lib.rs | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/src/lib.rs b/src/lib.rs
index c884167..ca34e67 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -206,7 +206,7 @@ mod xtermjs;
 pub use xtermjs::{ConsoleType, ProxmoxXTermJs, XTermJs};
 
 use pwt::gettext_noop;
-use pwt::state::LanguageInfo;
+use pwt::state::{LanguageInfo, TextDirection};
 
 // Bindgen javascript code from js-helper-module.js
 
@@ -261,7 +261,7 @@ pub fn load_csrf_token() -> Option<String> {
 /// All Proxmox products should support those languages.
 pub fn available_language_list() -> Vec<LanguageInfo> {
     vec![
-        LanguageInfo::new("ar", "العربية", gettext_noop("Arabic")),
+        LanguageInfo::new("ar", "العربية", gettext_noop("Arabic")).direction(TextDirection::Rtl),
         LanguageInfo::new("bg", "Български", gettext_noop("Bulgarian")),
         LanguageInfo::new("ca", "Català", gettext_noop("Catalan")),
         LanguageInfo::new("cs", "Czech", gettext_noop("Czech")),
@@ -270,9 +270,10 @@ pub fn available_language_list() -> Vec<LanguageInfo> {
         LanguageInfo::new("en", "English", gettext_noop("English")),
         LanguageInfo::new("es", "Español", gettext_noop("Spanish")),
         LanguageInfo::new("eu", "Euskera (Basque)", gettext_noop("Euskera (Basque)")),
-        LanguageInfo::new("fa", "فارسی", gettext_noop("Persian (Farsi)")),
+        LanguageInfo::new("fa", "فارسی", gettext_noop("Persian (Farsi)"))
+            .direction(TextDirection::Rtl),
         LanguageInfo::new("fr", "Français", gettext_noop("French")),
-        LanguageInfo::new("he", "עברית", gettext_noop("Hebrew")),
+        LanguageInfo::new("he", "עברית", gettext_noop("Hebrew")).direction(TextDirection::Rtl),
         LanguageInfo::new("hr", "Hrvatski", gettext_noop("Croatian")),
         LanguageInfo::new("it", "Italiano", gettext_noop("Italian")),
         LanguageInfo::new("ja", "日本語", gettext_noop("Japanese")),
-- 
2.47.3



_______________________________________________
yew-devel mailing list
yew-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/yew-devel

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2025-09-12  8:48 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-09-12  8:47 [yew-devel] [PATCH yew-comp/yew-widget-toolkit v2 0/4] Enable RTL text direction for relevant languages Dominik Csapak
2025-09-12  8:47 ` [yew-devel] [PATCH yew-widget-toolkit v2 1/3] state: language: add text direction setting Dominik Csapak
2025-09-12  8:47 ` [yew-devel] [PATCH yew-widget-toolkit v2 2/3] widget: rtl switcher: refactor setting rtl direction Dominik Csapak
2025-09-12  8:47 ` [yew-devel] [PATCH yew-widget-toolkit v2 3/3] widget: language selector: automatically set text direction from language Dominik Csapak
2025-09-12  8:47 ` [yew-devel] [PATCH yew-comp v2 1/1] languages: add text direction information where necessary Dominik Csapak

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal