refactor: make UI localization extensible and integrate upstream

This commit is contained in:
bherbruck committed 2026-10-11 07:52:08 -04:00
commit 6d4c031090
199 files changed
+31595 -2151

No files matched your search

+13 -16
View File
@@ -81,6 +81,8 @@ fn swap_in(app: &mut SolveApp, slot: DocSlot) -> DocSlot {
app.cam_anim = None;
app.preview = crate::preview::PreviewState::default();
app.viewport.hover = None;
app.menu.props = None;
crate::sketch_attachment_ui::clear(app);
let out_rev = app.session.revision;
let out = DocSlot {
session: std::mem::replace(&mut app.session, slot.session),
@@ -140,6 +142,8 @@ pub fn adopt(app: &mut SolveApp, session: Session) {
let rev = app.session.revision;
crate::dialogs::cancel(app);
app.tool = None;
app.menu.props = None;
crate::sketch_attachment_ui::clear(app);
app.session = session;
app.session.invalidate_view(rev);
app.cam = Camera::default();
@@ -307,7 +311,7 @@ pub fn tabs(app: &mut SolveApp, ui: &mut egui::Ui, r: Rect, x0: f32, x1: f32) {
t.app_bar
},
);
let home_text = app.tr("Home");
let home_text = app.tr("ui.home");
ui.painter().text(
home.center(),
Align2::CENTER_CENTER,
@@ -349,7 +353,7 @@ pub fn tabs(app: &mut SolveApp, ui: &mut egui::Ui, r: Rect, x0: f32, x1: f32) {
};
ui.painter().rect_filled(tr, egui::CornerRadius { nw: 5, ne: 5, sw: 0, se: 0 }, fill);
let ink = if active { t.text } else { t.app_bar_text };
let name_display = if name == "Untitled" { app.tr("Untitled") } else { name };
let name_display = if name == "Untitled" { app.tr("ui.untitled") } else { name };
let label = format!("{name_display}{}", if *dirty { " •" } else { "" });
let g = ui.painter().layout_no_wrap(label, FontId::proportional(13.0), ink);
let text_w = (tr.width() - 30.0).max(10.0);
@@ -452,36 +456,29 @@ pub enum Answer {
/// The "save changes?" prompt for a tab being closed, or for each unsaved design when quitting.
pub fn prompt(app: &mut SolveApp, ctx: &egui::Context) {
let _language = crate::i18n::scope(&app.preferences.language);
quit_step(app);
let Some(i) = app.docs.closing else { return };
let name = tabs_info(app).get(i).map(|x| x.0.clone()).unwrap_or_default();
let name_display = if name == "Untitled" { crate::i18n::tr("Untitled") } else { &name };
let name_display = if name == "Untitled" { crate::i18n::tr("ui.untitled") } else { &name };
let mut answer: Option<Answer> = None;
let title = if crate::i18n::current_lang() == "ja" {
format!("{name_display} への変更を保存しますか?")
} else {
format!("Save changes to {name}?")
};
let title = crate::i18n::format("document.save_changes", &[("name", name_display)]);
crate::frame::window(ctx, title, crate::frame::Width::Normal)
.id(egui::Id::new("sc_close_prompt"))
.collapsible(false)
.resizable(false)
.anchor(Align2::CENTER_CENTER, vec2(0.0, 0.0))
.show(ctx, |ui| {
if crate::i18n::current_lang() == "ja" {
ui.label(format!("{name_display} には保存されていない変更があります。保存しない場合、変更内容は失われます。"));
} else {
ui.label(format!("{name} has unsaved changes. If you don't save, they are lost."));
}
ui.label(crate::i18n::format("document.unsaved_changes", &[("name", name_display)]));
ui.add_space(8.0);
ui.horizontal(|ui| {
if ui.button(crate::i18n::tr("Save")).clicked() {
if ui.button(crate::i18n::tr("ui.save")).clicked() {
answer = Some(Answer::Save);
}
if ui.button(crate::i18n::tr("Don't Save")).clicked() {
if ui.button(crate::i18n::tr("ui.don_t_save")).clicked() {
answer = Some(Answer::DontSave);
}
if ui.button(crate::i18n::tr("Cancel")).clicked() {
if ui.button(crate::i18n::tr("ui.cancel")).clicked() {
answer = Some(Answer::Cancel);
}
});