* [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