improv(region): localize languages and regions with dgettext
This commit is contained in:
parent
5b41a76da7
commit
d9519a5c8d
1 changed files with 45 additions and 22 deletions
|
|
@ -143,6 +143,19 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
cosmic::task::future(async move { Message::Refresh(Arc::new(page_reload().await)) })
|
cosmic::task::future(async move { Message::Refresh(Arc::new(page_reload().await)) })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn on_leave(&mut self) -> cosmic::Task<crate::pages::Message> {
|
||||||
|
self.add_language_search = String::new();
|
||||||
|
self.available_languages = SlotMap::new();
|
||||||
|
self.config = None;
|
||||||
|
self.context = None;
|
||||||
|
self.expanded_source_popover = None;
|
||||||
|
self.language = None;
|
||||||
|
self.region = None;
|
||||||
|
self.registry = None;
|
||||||
|
self.system_locales = BTreeMap::new();
|
||||||
|
cosmic::Task::none()
|
||||||
|
}
|
||||||
|
|
||||||
fn context_drawer(&self) -> Option<Element<'_, crate::pages::Message>> {
|
fn context_drawer(&self) -> Option<Element<'_, crate::pages::Message>> {
|
||||||
Some(match self.context.as_ref()? {
|
Some(match self.context.as_ref()? {
|
||||||
ContextView::AddLanguage => self.add_language_view(),
|
ContextView::AddLanguage => self.add_language_view(),
|
||||||
|
|
@ -574,6 +587,8 @@ impl Page {
|
||||||
impl page::AutoBind<crate::pages::Message> for Page {}
|
impl page::AutoBind<crate::pages::Message> for Page {}
|
||||||
|
|
||||||
mod preferred_languages {
|
mod preferred_languages {
|
||||||
|
use crate::pages::time::region::localized_iso_codes;
|
||||||
|
|
||||||
use super::Message;
|
use super::Message;
|
||||||
use cosmic::{
|
use cosmic::{
|
||||||
iced::{Alignment, Length},
|
iced::{Alignment, Length},
|
||||||
|
|
@ -602,9 +617,11 @@ mod preferred_languages {
|
||||||
{
|
{
|
||||||
for (id, locale) in locales.iter().enumerate() {
|
for (id, locale) in locales.iter().enumerate() {
|
||||||
if let Some(locale) = registry.locale(locale) {
|
if let Some(locale) = registry.locale(locale) {
|
||||||
|
let (language, country) = localized_iso_codes(&locale);
|
||||||
|
|
||||||
content = content.add(super::language_element(
|
content = content.add(super::language_element(
|
||||||
id,
|
id,
|
||||||
locale.display_name.clone(),
|
format!("{} ({})", language, country),
|
||||||
page.expanded_source_popover,
|
page.expanded_source_popover,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
@ -754,21 +771,11 @@ pub async fn page_reload() -> eyre::Result<PageRefresh> {
|
||||||
let mut fields = expression.split('=');
|
let mut fields = expression.split('=');
|
||||||
let var = fields.next()?;
|
let var = fields.next()?;
|
||||||
let lang_code = fields.next()?;
|
let lang_code = fields.next()?;
|
||||||
let locale = registry.locale(lang_code);
|
let locale = registry.locale(lang_code)?;
|
||||||
|
|
||||||
Some((
|
Some((
|
||||||
var.to_owned(),
|
var.to_owned(),
|
||||||
SystemLocale {
|
localized_locale(&locale, lang_code.to_owned()),
|
||||||
lang_code: lang_code.to_owned(),
|
|
||||||
display_name: registry
|
|
||||||
.locale(lang_code)
|
|
||||||
.map_or(String::from(""), |locale| locale.display_name.clone()),
|
|
||||||
region_name: locale.map_or(String::from(""), |locale| {
|
|
||||||
format!(
|
|
||||||
"{} ({})",
|
|
||||||
locale.territory.display_name, locale.language.display_name
|
|
||||||
)
|
|
||||||
}),
|
|
||||||
},
|
|
||||||
))
|
))
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
|
|
@ -816,14 +823,7 @@ pub async fn page_reload() -> eyre::Result<PageRefresh> {
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(locale) = registry.locale(line) {
|
if let Some(locale) = registry.locale(line) {
|
||||||
available_languages_set.insert(SystemLocale {
|
available_languages_set.insert(localized_locale(&locale, line.to_owned()));
|
||||||
lang_code: line.to_owned(),
|
|
||||||
display_name: locale.display_name.clone(),
|
|
||||||
region_name: format!(
|
|
||||||
"{} ({})",
|
|
||||||
locale.territory.display_name, locale.language.display_name
|
|
||||||
),
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -852,6 +852,29 @@ fn language_element(
|
||||||
widget::settings::item(description, popover_button(id, expanded)).into()
|
widget::settings::item(description, popover_button(id, expanded)).into()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn localized_iso_codes(locale: &lichen_system::locale::Locale) -> (String, String) {
|
||||||
|
let mut language = gettextrs::dgettext("iso_639", &locale.language.display_name);
|
||||||
|
let country = gettextrs::dgettext("iso_3166", &locale.territory.display_name);
|
||||||
|
|
||||||
|
// Ensure language is title-cased.
|
||||||
|
let mut chars = language.chars();
|
||||||
|
if let Some(c) = chars.next() {
|
||||||
|
language = c.to_uppercase().collect::<String>() + chars.as_str();
|
||||||
|
}
|
||||||
|
|
||||||
|
(language, country)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn localized_locale(locale: &lichen_system::locale::Locale, lang_code: String) -> SystemLocale {
|
||||||
|
let (language, country) = localized_iso_codes(locale);
|
||||||
|
|
||||||
|
SystemLocale {
|
||||||
|
lang_code,
|
||||||
|
display_name: format!("{language} ({country})"),
|
||||||
|
region_name: format!("{country} ({language})"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn popover_button(id: usize, expanded: bool) -> Element<'static, Message> {
|
fn popover_button(id: usize, expanded: bool) -> Element<'static, Message> {
|
||||||
let on_press = Message::ExpandLanguagePopover(if expanded { None } else { Some(id) });
|
let on_press = Message::ExpandLanguagePopover(if expanded { None } else { Some(id) });
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue