mirror of
https://github.com/johrpan/musicus.git
synced 2025-10-26 19:57:25 +01:00
Add translation infrastructure and German translation
This commit is contained in:
parent
4b88eec93f
commit
a83b650398
23 changed files with 834 additions and 51 deletions
1
src/config.rs.in
Normal file
1
src/config.rs.in
Normal file
|
|
@ -0,0 +1 @@
|
|||
pub static LOCALEDIR: &str = @LOCALEDIR@;
|
||||
|
|
@ -2,6 +2,7 @@ use super::{InstrumentSelector, PersonSelector};
|
|||
use crate::backend::*;
|
||||
use crate::database::*;
|
||||
use crate::widgets::*;
|
||||
use gettextrs::gettext;
|
||||
use glib::clone;
|
||||
use gtk::prelude::*;
|
||||
use gtk_macros::get_widget;
|
||||
|
|
@ -95,7 +96,7 @@ impl PartEditor {
|
|||
|
||||
reset_composer_button.connect_clicked(clone!(@strong result => move |_| {
|
||||
result.composer.replace(None);
|
||||
result.composer_label.set_text("Select …");
|
||||
result.composer_label.set_text(&gettext("Select …"));
|
||||
}));
|
||||
|
||||
add_instrument_button.connect_clicked(clone!(@strong result => move |_| {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
use super::*;
|
||||
use crate::backend::Backend;
|
||||
use crate::database::*;
|
||||
use gettextrs::gettext;
|
||||
use glib::clone;
|
||||
use gtk::prelude::*;
|
||||
use gtk_macros::get_widget;
|
||||
|
|
@ -108,7 +109,7 @@ where
|
|||
result.person.replace(Some(person.clone()));
|
||||
result.person_label.set_text(&person.name_fl());
|
||||
result.ensemble.replace(None);
|
||||
result.ensemble_label.set_text("Select …");
|
||||
result.ensemble_label.set_text(&gettext("Select …"));
|
||||
result.save_button.set_sensitive(true);
|
||||
})).show();
|
||||
}));
|
||||
|
|
@ -118,7 +119,7 @@ where
|
|||
result.ensemble.replace(Some(ensemble.clone()));
|
||||
result.ensemble_label.set_text(&ensemble.name);
|
||||
result.person.replace(None);
|
||||
result.person_label.set_text("Select …");
|
||||
result.person_label.set_text(&gettext("Select …"));
|
||||
result.save_button.set_sensitive(true);
|
||||
})).show();
|
||||
}));
|
||||
|
|
@ -132,7 +133,7 @@ where
|
|||
|
||||
reset_role_button.connect_clicked(clone!(@strong result => move |_| {
|
||||
result.role.replace(None);
|
||||
result.role_label.set_text("Select …");
|
||||
result.role_label.set_text(&gettext("Select …"));
|
||||
}));
|
||||
|
||||
result.window.set_transient_for(Some(parent));
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
use crate::backend::Backend;
|
||||
use gettextrs::gettext;
|
||||
use glib::clone;
|
||||
use gtk::prelude::*;
|
||||
use gtk_macros::get_widget;
|
||||
|
|
@ -23,21 +24,25 @@ impl Preferences {
|
|||
music_library_path_row.set_subtitle(Some(path.to_str().unwrap()));
|
||||
}
|
||||
|
||||
select_music_library_path_button.connect_clicked(clone!(@strong window, @strong backend, @strong music_library_path_row => move |_| {
|
||||
let dialog = gtk::FileChooserNative::new(Some("Select music library folder"), Some(&window), gtk::FileChooserAction::SelectFolder, None, None);
|
||||
select_music_library_path_button.connect_clicked(
|
||||
clone!(@strong window, @strong backend, @strong music_library_path_row => move |_| {
|
||||
let dialog = gtk::FileChooserNative::new(
|
||||
Some(&gettext("Select music library folder")),
|
||||
Some(&window), gtk::FileChooserAction::SelectFolder,None, None);
|
||||
|
||||
if let gtk::ResponseType::Accept = dialog.run() {
|
||||
if let Some(path) = dialog.get_filename() {
|
||||
music_library_path_row.set_subtitle(Some(path.to_str().unwrap()));
|
||||
|
||||
let context = glib::MainContext::default();
|
||||
let backend = backend.clone();
|
||||
context.spawn_local(async move {
|
||||
backend.set_music_library_path(path).await.unwrap();
|
||||
});
|
||||
if let gtk::ResponseType::Accept = dialog.run() {
|
||||
if let Some(path) = dialog.get_filename() {
|
||||
music_library_path_row.set_subtitle(Some(path.to_str().unwrap()));
|
||||
|
||||
let context = glib::MainContext::default();
|
||||
let backend = backend.clone();
|
||||
context.spawn_local(async move {
|
||||
backend.set_music_library_path(path).await.unwrap();
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}));
|
||||
}),
|
||||
);
|
||||
|
||||
Self { window }
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ use super::*;
|
|||
use crate::backend::Backend;
|
||||
use crate::database::*;
|
||||
use crate::widgets::*;
|
||||
use gettextrs::gettext;
|
||||
use gio::prelude::*;
|
||||
use glib::clone;
|
||||
use gtk::prelude::*;
|
||||
|
|
@ -25,8 +26,7 @@ impl RecordingSelector {
|
|||
P: IsA<gtk::Window>,
|
||||
F: Fn(RecordingDescription) -> () + 'static,
|
||||
{
|
||||
let builder =
|
||||
gtk::Builder::from_resource("/de/johrpan/musicus/ui/recording_selector.ui");
|
||||
let builder = gtk::Builder::from_resource("/de/johrpan/musicus/ui/recording_selector.ui");
|
||||
|
||||
get_widget!(builder, gtk::Window, window);
|
||||
get_widget!(builder, libhandy::Leaflet, leaflet);
|
||||
|
|
@ -92,9 +92,8 @@ struct RecordingSelectorPersonScreen {
|
|||
|
||||
impl RecordingSelectorPersonScreen {
|
||||
pub fn new(backend: Rc<Backend>, selector: Rc<RecordingSelector>, person: Person) -> Rc<Self> {
|
||||
let builder = gtk::Builder::from_resource(
|
||||
"/de/johrpan/musicus/ui/recording_selector_screen.ui",
|
||||
);
|
||||
let builder =
|
||||
gtk::Builder::from_resource("/de/johrpan/musicus/ui/recording_selector_screen.ui");
|
||||
|
||||
get_widget!(builder, gtk::Box, widget);
|
||||
get_widget!(builder, libhandy::HeaderBar, header);
|
||||
|
|
@ -110,7 +109,7 @@ impl RecordingSelectorPersonScreen {
|
|||
label.upcast()
|
||||
},
|
||||
|_| true,
|
||||
"No works found.",
|
||||
&gettext("No works found."),
|
||||
);
|
||||
|
||||
stack.add_named(&work_list.widget, "content");
|
||||
|
|
@ -186,9 +185,8 @@ impl RecordingSelectorWorkScreen {
|
|||
selector: Rc<RecordingSelector>,
|
||||
work: WorkDescription,
|
||||
) -> Rc<Self> {
|
||||
let builder = gtk::Builder::from_resource(
|
||||
"/de/johrpan/musicus/ui/recording_selector_screen.ui",
|
||||
);
|
||||
let builder =
|
||||
gtk::Builder::from_resource("/de/johrpan/musicus/ui/recording_selector_screen.ui");
|
||||
|
||||
get_widget!(builder, gtk::Box, widget);
|
||||
get_widget!(builder, libhandy::HeaderBar, header);
|
||||
|
|
@ -217,7 +215,7 @@ impl RecordingSelectorWorkScreen {
|
|||
vbox.upcast()
|
||||
},
|
||||
|_| true,
|
||||
"No recordings found.",
|
||||
&gettext("No recordings found."),
|
||||
);
|
||||
|
||||
stack.add_named(&recording_list.widget, "content");
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ use super::*;
|
|||
use crate::backend::*;
|
||||
use crate::database::*;
|
||||
use crate::widgets::*;
|
||||
use gettextrs::gettext;
|
||||
use glib::clone;
|
||||
use gtk::prelude::*;
|
||||
use gtk_macros::get_widget;
|
||||
|
|
@ -53,7 +54,7 @@ impl TracksEditor {
|
|||
}
|
||||
|
||||
let title = if title_parts.is_empty() {
|
||||
String::from("Unknown")
|
||||
gettext("Unknown")
|
||||
} else {
|
||||
title_parts.join(", ")
|
||||
};
|
||||
|
|
@ -74,7 +75,7 @@ impl TracksEditor {
|
|||
vbox.upcast()
|
||||
}),
|
||||
|_| true,
|
||||
"Add some tracks.",
|
||||
&gettext("Add some tracks."),
|
||||
);
|
||||
|
||||
let autofill_parts = Rc::new(clone!(@strong recording, @strong tracks, @strong track_list => move || {
|
||||
|
|
@ -141,7 +142,7 @@ impl TracksEditor {
|
|||
add_track_button.connect_clicked(clone!(@strong window, @strong tracks, @strong track_list, @strong autofill_parts => move |_| {
|
||||
let music_library_path = backend.get_music_library_path().unwrap();
|
||||
|
||||
let dialog = gtk::FileChooserNative::new(Some("Select audio files"), Some(&window), gtk::FileChooserAction::Open, None, None);
|
||||
let dialog = gtk::FileChooserNative::new(Some(&gettext("Select audio files")), Some(&window), gtk::FileChooserAction::Open, None, None);
|
||||
dialog.set_select_multiple(true);
|
||||
dialog.set_current_folder(&music_library_path);
|
||||
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@ use glib::clone;
|
|||
use std::cell::RefCell;
|
||||
use std::rc::Rc;
|
||||
|
||||
mod config;
|
||||
mod backend;
|
||||
mod database;
|
||||
mod dialogs;
|
||||
|
|
@ -23,6 +24,10 @@ use window::Window;
|
|||
mod resources;
|
||||
|
||||
fn main() {
|
||||
gettextrs::setlocale(gettextrs::LocaleCategory::LcAll, "");
|
||||
gettextrs::bindtextdomain("musicus", config::LOCALEDIR);
|
||||
gettextrs::textdomain("musicus");
|
||||
|
||||
gtk::init().expect("Failed to initialize GTK!");
|
||||
libhandy::init();
|
||||
resources::init().expect("Failed to initialize resources!");
|
||||
|
|
|
|||
|
|
@ -1,3 +1,21 @@
|
|||
prefix = get_option('prefix')
|
||||
localedir = join_paths(prefix, get_option('localedir'))
|
||||
|
||||
global_conf = configuration_data()
|
||||
global_conf.set_quoted('LOCALEDIR', localedir)
|
||||
config_rs = configure_file(
|
||||
input: 'config.rs.in',
|
||||
output: 'config.rs',
|
||||
configuration: global_conf
|
||||
)
|
||||
|
||||
run_command(
|
||||
'cp',
|
||||
config_rs,
|
||||
meson.current_source_dir(),
|
||||
check: true
|
||||
)
|
||||
|
||||
resource_conf = configuration_data()
|
||||
resource_conf.set_quoted('RESOURCEFILE', resources.full_path())
|
||||
resource_rs = configure_file(
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ use super::*;
|
|||
use crate::backend::*;
|
||||
use crate::database::*;
|
||||
use crate::widgets::*;
|
||||
use gettextrs::gettext;
|
||||
use glib::clone;
|
||||
use gtk::prelude::*;
|
||||
use gtk_macros::get_widget;
|
||||
|
|
@ -19,8 +20,7 @@ pub struct EnsembleScreen {
|
|||
|
||||
impl EnsembleScreen {
|
||||
pub fn new(backend: Rc<Backend>, ensemble: Ensemble) -> Rc<Self> {
|
||||
let builder =
|
||||
gtk::Builder::from_resource("/de/johrpan/musicus/ui/ensemble_screen.ui");
|
||||
let builder = gtk::Builder::from_resource("/de/johrpan/musicus/ui/ensemble_screen.ui");
|
||||
|
||||
get_widget!(builder, gtk::Box, widget);
|
||||
get_widget!(builder, libhandy::HeaderBar, header);
|
||||
|
|
@ -32,13 +32,13 @@ impl EnsembleScreen {
|
|||
|
||||
header.set_title(Some(&ensemble.name));
|
||||
|
||||
let edit_menu_item = gio::MenuItem::new(Some("Edit ensemble"), None);
|
||||
let edit_menu_item = gio::MenuItem::new(Some(&gettext("Edit ensemble")), None);
|
||||
edit_menu_item.set_action_and_target_value(
|
||||
Some("win.edit-ensemble"),
|
||||
Some(&glib::Variant::from(ensemble.id)),
|
||||
);
|
||||
|
||||
let delete_menu_item = gio::MenuItem::new(Some("Delete ensemble"), None);
|
||||
let delete_menu_item = gio::MenuItem::new(Some(&gettext("Delete ensemble")), None);
|
||||
delete_menu_item.set_action_and_target_value(
|
||||
Some("win.delete-ensemble"),
|
||||
Some(&glib::Variant::from(ensemble.id)),
|
||||
|
|
@ -73,7 +73,7 @@ impl EnsembleScreen {
|
|||
let text = recording.work.get_title() + &recording.get_performers();
|
||||
search.is_empty() || text.contains(&search)
|
||||
}),
|
||||
"No recordings found.",
|
||||
&gettext("No recordings found."),
|
||||
);
|
||||
|
||||
recording_frame.add(&recording_list.widget.clone());
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ use super::*;
|
|||
use crate::backend::*;
|
||||
use crate::database::*;
|
||||
use crate::widgets::*;
|
||||
use gettextrs::gettext;
|
||||
use glib::clone;
|
||||
use gtk::prelude::*;
|
||||
use gtk_macros::get_widget;
|
||||
|
|
@ -35,13 +36,13 @@ impl PersonScreen {
|
|||
|
||||
header.set_title(Some(&person.name_fl()));
|
||||
|
||||
let edit_menu_item = gio::MenuItem::new(Some("Edit person"), None);
|
||||
let edit_menu_item = gio::MenuItem::new(Some(&gettext("Edit person")), None);
|
||||
edit_menu_item.set_action_and_target_value(
|
||||
Some("win.edit-person"),
|
||||
Some(&glib::Variant::from(person.id)),
|
||||
);
|
||||
|
||||
let delete_menu_item = gio::MenuItem::new(Some("Delete person"), None);
|
||||
let delete_menu_item = gio::MenuItem::new(Some(&gettext("Delete person")), None);
|
||||
delete_menu_item.set_action_and_target_value(
|
||||
Some("win.delete-person"),
|
||||
Some(&glib::Variant::from(person.id)),
|
||||
|
|
@ -64,7 +65,7 @@ impl PersonScreen {
|
|||
let title = work.title.to_lowercase();
|
||||
search.is_empty() || title.contains(&search)
|
||||
}),
|
||||
"No works found.",
|
||||
&gettext("No works found."),
|
||||
);
|
||||
|
||||
let recording_list = List::new(
|
||||
|
|
@ -90,7 +91,7 @@ impl PersonScreen {
|
|||
let text = recording.work.get_title() + &recording.get_performers();
|
||||
search.is_empty() || text.contains(&search)
|
||||
}),
|
||||
"No recordings found.",
|
||||
&gettext("No recordings found."),
|
||||
);
|
||||
|
||||
work_frame.add(&work_list.widget);
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
use crate::backend::*;
|
||||
use crate::database::*;
|
||||
use crate::widgets::*;
|
||||
use gettextrs::gettext;
|
||||
use glib::clone;
|
||||
use gtk::prelude::*;
|
||||
use gtk_macros::get_widget;
|
||||
|
|
@ -30,13 +31,13 @@ impl RecordingScreen {
|
|||
header.set_title(Some(&recording.work.get_title()));
|
||||
header.set_subtitle(Some(&recording.get_performers()));
|
||||
|
||||
let edit_menu_item = gio::MenuItem::new(Some("Edit recording"), None);
|
||||
let edit_menu_item = gio::MenuItem::new(Some(&gettext("Edit recording")), None);
|
||||
edit_menu_item.set_action_and_target_value(
|
||||
Some("win.edit-recording"),
|
||||
Some(&glib::Variant::from(recording.id)),
|
||||
);
|
||||
|
||||
let delete_menu_item = gio::MenuItem::new(Some("Delete recording"), None);
|
||||
let delete_menu_item = gio::MenuItem::new(Some(&gettext("Delete recording")), None);
|
||||
delete_menu_item.set_action_and_target_value(
|
||||
Some("win.delete-recording"),
|
||||
Some(&glib::Variant::from(recording.id)),
|
||||
|
|
@ -57,7 +58,7 @@ impl RecordingScreen {
|
|||
}
|
||||
|
||||
let title = if title_parts.is_empty() {
|
||||
String::from("Unknown")
|
||||
gettext("Unknown")
|
||||
} else {
|
||||
title_parts.join(", ")
|
||||
};
|
||||
|
|
@ -78,7 +79,7 @@ impl RecordingScreen {
|
|||
vbox.upcast()
|
||||
}),
|
||||
|_| true,
|
||||
"No tracks found.",
|
||||
&gettext("No tracks found."),
|
||||
);
|
||||
|
||||
frame.add(&list.widget);
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ use super::*;
|
|||
use crate::backend::*;
|
||||
use crate::database::*;
|
||||
use crate::widgets::*;
|
||||
use gettextrs::gettext;
|
||||
use glib::clone;
|
||||
use gtk::prelude::*;
|
||||
use gtk_macros::get_widget;
|
||||
|
|
@ -32,13 +33,13 @@ impl WorkScreen {
|
|||
header.set_title(Some(&work.title));
|
||||
header.set_subtitle(Some(&work.composer.name_fl()));
|
||||
|
||||
let edit_menu_item = gio::MenuItem::new(Some("Edit work"), None);
|
||||
let edit_menu_item = gio::MenuItem::new(Some(&gettext("Edit work")), None);
|
||||
edit_menu_item.set_action_and_target_value(
|
||||
Some("win.edit-work"),
|
||||
Some(&glib::Variant::from(work.id)),
|
||||
);
|
||||
|
||||
let delete_menu_item = gio::MenuItem::new(Some("Delete work"), None);
|
||||
let delete_menu_item = gio::MenuItem::new(Some(&gettext("Delete work")), None);
|
||||
delete_menu_item.set_action_and_target_value(
|
||||
Some("win.delete-work"),
|
||||
Some(&glib::Variant::from(work.id)),
|
||||
|
|
@ -73,7 +74,7 @@ impl WorkScreen {
|
|||
let text = recording.work.get_title() + &recording.get_performers();
|
||||
search.is_empty() || text.contains(&search)
|
||||
}),
|
||||
"No recordings found.",
|
||||
&gettext("No recordings found."),
|
||||
);
|
||||
|
||||
recording_frame.add(&recording_list.widget);
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
use super::*;
|
||||
use crate::backend::Backend;
|
||||
use crate::database::*;
|
||||
use gettextrs::gettext;
|
||||
use glib::clone;
|
||||
use gtk::prelude::*;
|
||||
use gtk_macros::get_widget;
|
||||
|
|
@ -33,7 +34,7 @@ impl PersonList {
|
|||
let name = person.name_fl().to_lowercase();
|
||||
search.is_empty() || name.contains(&search)
|
||||
}),
|
||||
"No persons found.",
|
||||
&gettext("No persons found."),
|
||||
);
|
||||
|
||||
scrolled_window.add(&list.widget);
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
use super::*;
|
||||
use crate::backend::Backend;
|
||||
use crate::database::*;
|
||||
use gettextrs::gettext;
|
||||
use glib::clone;
|
||||
use gtk::prelude::*;
|
||||
use gtk_macros::get_widget;
|
||||
|
|
@ -48,7 +49,7 @@ impl PoeList {
|
|||
let title = poe.get_title().to_lowercase();
|
||||
search.is_empty() || title.contains(&search)
|
||||
}),
|
||||
"No persons or ensembles found.",
|
||||
&gettext("No persons or ensembles found."),
|
||||
);
|
||||
|
||||
scrolled_window.add(&list.widget);
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ use crate::dialogs::*;
|
|||
use crate::screens::*;
|
||||
use crate::widgets::*;
|
||||
use futures::prelude::*;
|
||||
use gettextrs::gettext;
|
||||
use gio::prelude::*;
|
||||
use glib::clone;
|
||||
use gtk::prelude::*;
|
||||
|
|
@ -51,10 +52,15 @@ impl Window {
|
|||
result.window.set_application(Some(app));
|
||||
|
||||
select_music_library_path_button.connect_clicked(clone!(@strong result => move |_| {
|
||||
let dialog = gtk::FileChooserNative::new(Some("Select music library folder"), Some(&result.window), gtk::FileChooserAction::SelectFolder, None, None);
|
||||
let dialog = gtk::FileChooserNative::new(
|
||||
Some(&gettext("Select music library folder")),
|
||||
Some(&result.window),
|
||||
gtk::FileChooserAction::SelectFolder,
|
||||
None,
|
||||
None);
|
||||
|
||||
if let gtk::ResponseType::Accept = dialog.run() {
|
||||
if let Some(path) = dialog.get_filename() {
|
||||
if let Some(path) = dialog.get_filename() {
|
||||
let context = glib::MainContext::default();
|
||||
let backend = result.backend.clone();
|
||||
context.spawn_local(async move {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue