Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 21 additions & 1 deletion apps/plumeimpactor/src/screen/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ pub struct Impactor {
login_windows: std::collections::HashMap<window::Id, login_window::LoginWindow>,
pending_installation: bool,
certificate_reset_queue: VecDeque<crate::certificate_reset::ConfirmationRequest>,
selected_locale: Option<String>,
}

#[derive(Debug, Clone, PartialEq)]
Expand All @@ -117,6 +118,10 @@ impl Impactor {
let mut tray = ImpactorTray::new();
let store = Self::init_account_store_sync();
tray.update_refresh_apps(&store);
let selected_locale = store.locale().map(str::to_string);
if let Some(code) = &selected_locale {
rust_i18n::set_locale(code);
}
let start_in_tray = crate::startup::start_in_tray_from_args();
let (main_window, open_task) = if start_in_tray {
(None, Task::none())
Expand All @@ -139,6 +144,7 @@ impl Impactor {
login_windows: std::collections::HashMap::new(),
pending_installation: false,
certificate_reset_queue: VecDeque::new(),
selected_locale,
},
open_task,
)
Expand Down Expand Up @@ -572,6 +578,20 @@ impl Impactor {
}
screen.update(msg).map(Message::SettingsScreen)
}
settings::Message::SelectLocale(choice) => {
self.selected_locale = choice.clone();
let effective = choice
.clone()
.or_else(|| current_locale::current_locale().ok())
.unwrap_or_else(|| "en".to_string());
rust_i18n::set_locale(&effective);
if let Some(store) = &mut self.account_store {
if let Err(err) = store.set_locale_sync(choice) {
log::error!("Failed to persist locale: {err}");
}
}
Task::none()
}
_ => screen.update(msg).map(Message::SettingsScreen),
}
} else {
Expand Down Expand Up @@ -835,7 +855,7 @@ impl Impactor {
ImpactorScreen::Main(screen) => screen.view().map(Message::MainScreen),
ImpactorScreen::Utilities(screen) => screen.view().map(Message::UtilitiesScreen),
ImpactorScreen::Settings(screen) => screen
.view(&self.account_store)
.view(&self.account_store, &self.selected_locale)
.map(Message::SettingsScreen),
ImpactorScreen::Installer(screen) => {
screen.view(has_device).map(Message::InstallerScreen)
Expand Down
69 changes: 68 additions & 1 deletion apps/plumeimpactor/src/screen/settings.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,38 @@ pub enum Message {
FetchTeams(String),
TeamsLoaded(String, Vec<Team>),
ToggleAutoStart(bool),
SelectLocale(Option<String>),
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct LocaleChoice {
code: Option<String>,
}

impl LocaleChoice {
fn system() -> Self {
Self { code: None }
}

fn explicit(code: String) -> Self {
Self { code: Some(code) }
}

fn code(&self) -> Option<&str> {
self.code.as_deref()
}
}

impl std::fmt::Display for LocaleChoice {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match &self.code {
None => write!(f, "{}", rust_i18n::t!("settings_system_language")),
Some(code) => {
let name = rust_i18n::t!("_language_name", locale = code);
write!(f, "{}", name)
}
}
}
}

#[derive(Debug)]
Expand Down Expand Up @@ -58,11 +90,16 @@ impl SettingsScreen {
}
Message::ToggleAutoStart(_) => Task::none(),
Message::SelectTeam(_, _) => Task::none(),
Message::SelectLocale(_) => Task::none(),
_ => Task::none(),
}
}

pub fn view<'a>(&'a self, account_store: &'a Option<AccountStore>) -> Element<'a, Message> {
pub fn view<'a>(
&'a self,
account_store: &'a Option<AccountStore>,
selected_locale: &'a Option<String>,
) -> Element<'a, Message> {
let Some(store) = account_store else {
return column![text(t!("settings_loading_accounts"))]
.spacing(appearance::THEME_PADDING)
Expand Down Expand Up @@ -156,6 +193,7 @@ impl SettingsScreen {

let auto_start_enabled = crate::startup::auto_start_enabled();
content = content.push(self.view_auto_start_toggle(auto_start_enabled));
content = content.push(self.view_language_picker(selected_locale));
content = content.push(self.view_account_buttons(selected_index));

content.into()
Expand All @@ -168,6 +206,35 @@ impl SettingsScreen {
.into()
}

fn view_language_picker<'a>(
&'a self,
selected_locale: &'a Option<String>,
) -> Element<'a, Message> {
let mut codes: Vec<String> = rust_i18n::available_locales!()
.into_iter()
.map(|s| s.to_string())
.collect();
codes.sort();

let mut choices: Vec<LocaleChoice> = Vec::with_capacity(codes.len() + 1);
choices.push(LocaleChoice::system());
choices.extend(codes.into_iter().map(LocaleChoice::explicit));

let current = match selected_locale {
None => LocaleChoice::system(),
Some(code) => LocaleChoice::explicit(code.clone()),
};

let picker = pick_list(choices, Some(current), |choice: LocaleChoice| {
Message::SelectLocale(choice.code().map(|s| s.to_string()))
})
.style(appearance::s_pick_list);

column![text(t!("settings_language")), picker]
.spacing(appearance::THEME_PADDING)
.into()
}

fn view_account_buttons(&self, selected_index: Option<usize>) -> Element<'_, Message> {
let mut buttons = row![
button(appearance::icon_text(
Expand Down
11 changes: 11 additions & 0 deletions crates/plume_store/src/store.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ pub struct AccountStore {
accounts: HashMap<String, GsaAccount>, // Email -> GsaAccount
#[serde(default)]
refreshes: HashMap<String, RefreshDevice>, // UDID -> RefreshDevice (apps?)
#[serde(default)]
locale: Option<String>, // None = system locale
#[serde(skip)]
path: Option<PathBuf>,
}
Expand Down Expand Up @@ -138,6 +140,15 @@ impl AccountStore {
}
}

pub fn locale(&self) -> Option<&str> {
self.locale.as_deref()
}

pub fn set_locale_sync(&mut self, locale: Option<String>) -> Result<(), Error> {
self.locale = locale;
self.save_sync()
}

pub async fn accounts_add_from_session(
&mut self,
email: String,
Expand Down
2 changes: 2 additions & 0 deletions locales/ar.toml
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ settings_launch_on_startup = "التشغيل عند بدء النظام"
settings_export_p12 = "تصدير P12"
settings_select_teams = "اختر فريقًا..."
settings_loading_teams = "جارٍ تحميل الفِرَق..."
settings_language = "اللغة:"
settings_system_language = "النظام"

utilities_loading = "جارٍ التحميل..."
utilities_refresh_installed_apps = "تحديث التطبيقات المثبتة"
Expand Down
2 changes: 2 additions & 0 deletions locales/de.toml
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ settings_launch_on_startup = "Beim Systemstart öffnen"
settings_export_p12 = "P12 Exportieren"
settings_select_teams = "Team auswählen..."
settings_loading_teams = "Lade Teams..."
settings_language = "Language:"
settings_system_language = "System"

utilities_loading = "Laden..."
utilities_refresh_installed_apps = "Installierte Apps reinstallieren"
Expand Down
2 changes: 2 additions & 0 deletions locales/en.toml
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ settings_launch_on_startup = "Launch on Startup"
settings_export_p12 = "Export P12"
settings_select_teams = "Select team..."
settings_loading_teams = "Loading teams..."
settings_language = "Language:"
settings_system_language = "System"

utilities_loading = "Loading..."
utilities_refresh_installed_apps = "Refresh Installed Apps"
Expand Down
2 changes: 2 additions & 0 deletions locales/es.toml
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ settings_launch_on_startup = "Abrir al iniciar el sistema"
settings_export_p12 = "Exportar P12"
settings_select_teams = "Seleccionar equipo..."
settings_loading_teams = "Cargando equipos..."
settings_language = "Language:"
settings_system_language = "System"

utilities_loading = "Cargando..."
utilities_refresh_installed_apps = "Actualizar aplicaciones instaladas"
Expand Down
2 changes: 2 additions & 0 deletions locales/fi.toml
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ settings_launch_on_startup = "Avaa käynnistyksen yhteydessä"
settings_export_p12 = "Ulosvie P12"
settings_select_teams = "Valitse tiimi..."
settings_loading_teams = "Ladataan tiimejä..."
settings_language = "Language:"
settings_system_language = "System"

utilities_loading = "Ladataan..."
utilities_refresh_installed_apps = "Päivitä Asennetut Sovellukset"
Expand Down
2 changes: 2 additions & 0 deletions locales/fr.toml
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ settings_launch_on_startup = "Lancer au démarrage"
settings_export_p12 = "Exporter P12"
settings_select_teams = "Choisir une équipe..."
settings_loading_teams = "Chargement des équipes..."
settings_language = "Language:"
settings_system_language = "System"

utilities_loading = "Chargement..."
utilities_refresh_installed_apps = "Actualiser les apps installées"
Expand Down
2 changes: 2 additions & 0 deletions locales/it.toml
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ settings_launch_on_startup = "Launcia all'avvio"
settings_export_p12 = "Esporta P12"
settings_select_teams = "Scelgo il team..."
settings_loading_teams = "Carico team..."
settings_language = "Language:"
settings_system_language = "System"

utilities_loading = "Carico..."
utilities_refresh_installed_apps = "Refresh App Installate"
Expand Down
2 changes: 2 additions & 0 deletions locales/pl.toml
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ settings_launch_on_startup = "Uruchamiaj przy starcie systemu"
settings_export_p12 = "Eksportuj P12"
settings_select_teams = "Wybierz zespół..."
settings_loading_teams = "Ładowanie zespołów..."
settings_language = "Language:"
settings_system_language = "System"

utilities_loading = "Ładowanie..."
utilities_refresh_installed_apps = "Odśwież zainstalowane aplikacje"
Expand Down
4 changes: 3 additions & 1 deletion locales/ru.toml
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ settings_launch_on_startup = "Запускать при старте систе
settings_export_p12 = "Экспортировать P12"
settings_select_teams = "Выбрать команду..."
settings_loading_teams = "Загрузка команд..."
settings_language = "Language:"
settings_system_language = "System"

utilities_loading = "Загрузка..."
utilities_refresh_installed_apps = "Обновить список установленных приложений"
Expand All @@ -70,4 +72,4 @@ login_loading = "Вход в систему..."
login_two_fa = "Двухфакторная аутентификация"
login_two_fa_desc = "Введите проверочный код, отправленный на ваше устройство:"
login_verify = "Подтвердить"
login_verifying = "Проверка..."
login_verifying = "Проверка..."
4 changes: 3 additions & 1 deletion locales/ua.toml
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ settings_launch_on_startup = "Запускати під час старту си
settings_export_p12 = "Експортувати P12"
settings_select_teams = "Обрати команду..."
settings_loading_teams = "Завантаження команд..."
settings_language = "Language:"
settings_system_language = "System"

utilities_loading = "Завантаження..."
utilities_refresh_installed_apps = "Оновити список встановлених програм"
Expand All @@ -70,4 +72,4 @@ login_loading = "Вхід до системи..."
login_two_fa = "Двофакторна автентифікація"
login_two_fa_desc = "Введіть перевірочний код, надісланий на ваш пристрій:"
login_verify = "Підтвердити"
login_verifying = "Перевірка..."
login_verifying = "Перевірка..."
2 changes: 2 additions & 0 deletions locales/vi.toml
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ settings_launch_on_startup = "Khởi động cùng hệ điều hành"
settings_export_p12 = "Xuất chứng chỉ P12"
settings_select_teams = "Chọn nhóm..."
settings_loading_teams = "Đang tải danh sách nhóm..."
settings_language = "Language:"
settings_system_language = "System"

utilities_loading = "Đang tải công cụ..."
utilities_refresh_installed_apps = "Làm mới các ứng dụng đã cài đặt"
Expand Down
2 changes: 2 additions & 0 deletions locales/zh_cn.toml
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ settings_launch_on_startup = "开机自启动"
settings_export_p12 = "导出 P12 文件"
settings_select_teams = "选择团队..."
settings_loading_teams = "正在加载团队..."
settings_language = "Language:"
settings_system_language = "System"

utilities_loading = "加载中..."
utilities_refresh_installed_apps = "刷新已安装应用"
Expand Down