From 681950fc61bc41bd3527944e567df402a5b5dc37 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Sat, 7 Dec 2019 21:00:39 -0500 Subject: [PATCH] TranslatableString for names, labels, tooltips of wxPanelWrapper... ... and Grabber too --- include/audacity/Types.h | 3 ++ src/AdornedRulerPanel.cpp | 46 +++++++++---------- src/CellularPanel.cpp | 5 +- src/HitTestResult.h | 7 +-- src/Internat.cpp | 2 + src/MixerBoard.cpp | 8 ++-- src/TrackPanel.cpp | 4 +- src/effects/Effect.cpp | 4 +- src/prefs/BatchPrefs.cpp | 2 +- src/prefs/DevicePrefs.cpp | 2 +- src/prefs/DirectoriesPrefs.cpp | 2 +- src/prefs/EffectsPrefs.cpp | 2 +- src/prefs/ExtImportPrefs.cpp | 2 +- src/prefs/GUIPrefs.cpp | 2 +- src/prefs/ImportExportPrefs.cpp | 2 +- src/prefs/KeyConfigPrefs.cpp | 2 +- src/prefs/LibraryPrefs.cpp | 2 +- src/prefs/MidiIOPrefs.cpp | 2 +- src/prefs/ModulePrefs.cpp | 2 +- src/prefs/MousePrefs.cpp | 2 +- src/prefs/PlaybackPrefs.cpp | 2 +- src/prefs/PrefsPanel.h | 3 +- src/prefs/ProjectsPrefs.cpp | 2 +- src/prefs/QualityPrefs.cpp | 2 +- src/prefs/RecordingPrefs.cpp | 2 +- src/prefs/SpectrumPrefs.cpp | 2 +- src/prefs/ThemePrefs.cpp | 2 +- src/prefs/TracksBehaviorsPrefs.cpp | 2 +- src/prefs/TracksPrefs.cpp | 2 +- src/prefs/WarningsPrefs.cpp | 2 +- src/prefs/WaveformPrefs.cpp | 2 +- src/toolbars/ControlToolBar.cpp | 4 +- src/toolbars/DeviceToolBar.cpp | 4 +- src/toolbars/EditToolBar.cpp | 4 +- src/toolbars/MeterToolBar.cpp | 20 ++++---- src/toolbars/MixerToolBar.cpp | 4 +- src/toolbars/ScrubbingToolBar.cpp | 4 +- src/toolbars/SelectionBar.cpp | 4 +- src/toolbars/SpectralSelectionBar.cpp | 4 +- src/toolbars/ToolBar.cpp | 17 +++++-- src/toolbars/ToolBar.h | 11 +++-- src/toolbars/ToolDock.cpp | 4 +- src/toolbars/ToolsToolBar.cpp | 2 +- src/toolbars/TranscriptionToolBar.cpp | 4 +- .../ui/PlayableTrackButtonHandles.cpp | 20 ++++---- .../ui/PlayableTrackButtonHandles.h | 4 +- src/tracks/ui/ButtonHandle.cpp | 2 +- src/tracks/ui/ButtonHandle.h | 3 +- src/tracks/ui/TrackButtonHandles.cpp | 30 ++++++------ src/tracks/ui/TrackButtonHandles.h | 8 ++-- src/tracks/ui/TrackSelectHandle.cpp | 17 ++++--- src/widgets/Grabber.cpp | 6 ++- src/widgets/Grabber.h | 5 ++ src/widgets/Meter.cpp | 2 +- src/widgets/wxPanelWrapper.cpp | 20 ++++++++ src/widgets/wxPanelWrapper.h | 15 ++++-- 56 files changed, 204 insertions(+), 140 deletions(-) diff --git a/include/audacity/Types.h b/include/audacity/Types.h index 825237c5d..ee4ba7022 100644 --- a/include/audacity/Types.h +++ b/include/audacity/Types.h @@ -540,6 +540,9 @@ inline TranslatableString operator +( using TranslatableStrings = std::vector; +// A special string value that will have no screen reader pronunciation +extern const TranslatableString InaudibleString; + // For using std::unordered_map on TranslatableString // Note: hashing on msgids only, which is not all of the information namespace std diff --git a/src/AdornedRulerPanel.cpp b/src/AdornedRulerPanel.cpp index ca05308c2..338188be7 100644 --- a/src/AdornedRulerPanel.cpp +++ b/src/AdornedRulerPanel.cpp @@ -415,9 +415,9 @@ public: (void)state;// Compiler food // May come here when recording is in progress, so hit tests are turned // off. - wxString tooltip; + TranslatableString tooltip; if (mParent->mTimelineToolTip) - tooltip = _("Timeline actions disabled during recording"); + tooltip = XO("Timeline actions disabled during recording"); static wxCursor cursor{ wxCURSOR_DEFAULT }; return { @@ -628,7 +628,7 @@ protected: return { _( "Click and drag to adjust, double-click to reset" ), &cursor, - _( "Record/Play head" ) + XO( "Record/Play head" ) }; } @@ -903,8 +903,8 @@ AdornedRulerPanel::AdornedRulerPanel(AudacityProject* project, for (auto &button : mButtons) button = nullptr; - SetLabel( _("Timeline") ); - SetName(GetLabel()); + SetLabel( XO("Timeline") ); + SetName(); SetBackgroundStyle(wxBG_STYLE_PAINT); mLeftOffset = 0; @@ -1066,7 +1066,7 @@ void AdornedRulerPanel::InvalidateRuler() } namespace { - const wxString StartScrubbingMessage(const Scrubber &/*scrubber*/) + const TranslatableString StartScrubbingMessage(const Scrubber &/*scrubber*/) { /* i18n-hint: These commands assist the user in finding a sound by ear. ... "Scrubbing" is variable-speed playback, ... @@ -1074,15 +1074,15 @@ namespace { */ #if 0 if(scrubber.Seeks()) - return _("Click or drag to begin Seek"); + return XO("Click or drag to begin Seek"); else - return _("Click or drag to begin Scrub"); + return XO("Click or drag to begin Scrub"); #else - return _("Click & move to Scrub. Click & drag to Seek."); + return XO("Click & move to Scrub. Click & drag to Seek."); #endif } - const wxString ContinueScrubbingMessage( + const TranslatableString ContinueScrubbingMessage( const Scrubber &scrubber, bool clicked) { /* i18n-hint: These commands assist the user in finding a sound by ear. ... @@ -1091,26 +1091,26 @@ namespace { */ #if 0 if(scrubber.Seeks()) - return _("Move to Seek"); + return XO("Move to Seek"); else - return _("Move to Scrub"); + return XO("Move to Scrub"); #else if( clicked ) { // Since mouse is down, mention dragging first. // IsScrubbing is true if Scrubbing OR seeking. if( scrubber.IsScrubbing() ) // User is dragging already, explain. - return _("Drag to Seek. Release to stop seeking."); + return XO("Drag to Seek. Release to stop seeking."); else // User has clicked but not yet moved or released. - return _("Drag to Seek. Release and move to Scrub."); + return XO("Drag to Seek. Release and move to Scrub."); } // Since mouse is up, mention moving first. - return _("Move to Scrub. Drag to Seek."); + return XO("Move to Scrub. Drag to Seek."); #endif } - const wxString ScrubbingMessage(const Scrubber &scrubber, bool clicked) + const TranslatableString ScrubbingMessage(const Scrubber &scrubber, bool clicked) { if (scrubber.HasMark()) return ContinueScrubbingMessage(scrubber, clicked); @@ -1501,10 +1501,10 @@ auto AdornedRulerPanel::ScrubbingHandle::Preview auto message = ScrubbingMessage(scrubber, mClicked == Button::Left); return { - message, + message.Translation(), {}, // Tooltip is same as status message, or blank - ((mParent && mParent->mTimelineToolTip) ? message : wxString{}), + ((mParent && mParent->mTimelineToolTip) ? message : TranslatableString{}), }; } @@ -1512,15 +1512,15 @@ auto AdornedRulerPanel::QPHandle::Preview (const TrackPanelMouseState &state, const AudacityProject *pProject) -> HitTestPreview { - wxString tooltip; + TranslatableString tooltip; if (mParent && mParent->mTimelineToolTip) { if (!mParent->mQuickPlayEnabled) - tooltip = _("Quick-Play disabled"); + tooltip = XO("Quick-Play disabled"); else - tooltip = _("Quick-Play enabled"); + tooltip = XO("Quick-Play enabled"); } - wxString message; + TranslatableString message; auto &scrubber = Scrubber::Get( *pProject ); const bool scrubbing = scrubber.HasMark(); if (scrubbing) @@ -1543,7 +1543,7 @@ auto AdornedRulerPanel::QPHandle::Preview state.state.m_x, mParent->mOldPlayRegion.GetEnd()); return { - message, + message.Translation(), showArrows ? &cursorSizeWE : &cursorHand, tooltip, }; diff --git a/src/CellularPanel.cpp b/src/CellularPanel.cpp index e10dbb049..4b1b613f1 100644 --- a/src/CellularPanel.cpp +++ b/src/CellularPanel.cpp @@ -271,7 +271,8 @@ void CellularPanel::HandleMotion auto oldCell = state.mLastCell.lock(); auto oldHandle = Target(); - wxString status{}, tooltip{}; + wxString status{}; + TranslatableString tooltip{}; wxCursor *pCursor{}; unsigned refreshCode = 0; @@ -373,7 +374,7 @@ void CellularPanel::HandleMotion UpdateStatusMessage(status); #if wxUSE_TOOLTIPS - if (tooltip != GetToolTipText()) { + if (tooltip.Translation() != GetToolTipText()) { // Unset first, by analogy with AButton UnsetToolTip(); SetToolTip(tooltip); diff --git a/src/HitTestResult.h b/src/HitTestResult.h index 7da6415b3..e1ed59ad1 100644 --- a/src/HitTestResult.h +++ b/src/HitTestResult.h @@ -12,6 +12,7 @@ Paul Licameli #define __AUDACITY_HIT_TEST_RESULT__ #include "MemoryX.h" +#include "Internat.h" // for TranslatableString class wxCursor; @@ -21,13 +22,13 @@ struct HitTestPreview {} HitTestPreview(const wxString &message_, wxCursor *cursor_, - const wxString &tooltip_ = wxString{}) - : message(message_), cursor(cursor_), tooltip(tooltip_) + const TranslatableString &tooltip_ = {}) + : message(message_), cursor(cursor_), tooltip{ tooltip_ } {} wxString message {}; wxCursor *cursor {}; - wxString tooltip{}; + TranslatableString tooltip{}; }; #endif diff --git a/src/Internat.cpp b/src/Internat.cpp index 924972d7f..2f8ce4aac 100644 --- a/src/Internat.cpp +++ b/src/Internat.cpp @@ -401,3 +401,5 @@ TranslatableString &TranslatableString::Join( }; return *this; } + +const TranslatableString InaudibleString{ wxT("\a") }; diff --git a/src/MixerBoard.cpp b/src/MixerBoard.cpp index e57b45b9b..ea4df098f 100644 --- a/src/MixerBoard.cpp +++ b/src/MixerBoard.cpp @@ -175,7 +175,7 @@ MixerTrackCluster::MixerTrackCluster(wxWindow* parent, mProject = project; wxASSERT( pTrack ); - SetName(mTrack->GetName()); + SetName( TranslatableString{ mTrack->GetName() } ); //this->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE)); this->SetBackgroundColour( theTheme.Colour( clrMedium ) ); @@ -308,7 +308,7 @@ MixerTrackCluster::MixerTrackCluster(wxWindow* parent, false, // bool isInput ctrlPos, ctrlSize, // const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, MeterPanel::MixerTrackCluster); // Style style = HorizontalStereo, - mMeter->SetName(_("Signal Level Meter")); + mMeter->SetName(XO("Signal Level Meter")); } #if wxUSE_TOOLTIPS @@ -316,7 +316,7 @@ MixerTrackCluster::MixerTrackCluster(wxWindow* parent, mToggleButton_Mute->SetToolTip(_("Mute")); mToggleButton_Solo->SetToolTip(_("Solo")); if (GetWave()) - mMeter->SetToolTip(_("Signal Level Meter")); + mMeter->SetToolTip(XO("Signal Level Meter")); #endif // wxUSE_TOOLTIPS UpdateForStateChange(); @@ -463,7 +463,7 @@ void MixerTrackCluster::UpdateForStateChange() { const wxString newName = mTrack->GetName(); if (newName != GetName()) { - SetName(newName); + SetName( TranslatableString{ newName } ); mStaticText_TrackName->SetLabel(newName); mStaticText_TrackName->SetName(newName); #if wxUSE_TOOLTIPS diff --git a/src/TrackPanel.cpp b/src/TrackPanel.cpp index 9af03c952..798d0c1ef 100644 --- a/src/TrackPanel.cpp +++ b/src/TrackPanel.cpp @@ -259,8 +259,8 @@ TrackPanel::TrackPanel(wxWindow * parent, wxWindowID id, #endif { SetLayoutDirection(wxLayout_LeftToRight); - SetLabel(_("Track Panel")); - SetName(_("Track Panel")); + SetLabel(XO("Track Panel")); + SetName(XO("Track Panel")); SetBackgroundStyle(wxBG_STYLE_PAINT); { diff --git a/src/effects/Effect.cpp b/src/effects/Effect.cpp index be9e9297c..e19304c00 100644 --- a/src/effects/Effect.cpp +++ b/src/effects/Effect.cpp @@ -2567,8 +2567,8 @@ public: : wxPanelWrapper(parent) { // This fools NVDA into not saying "Panel" when the dialog gets focus - SetName(wxT("\a")); - SetLabel(wxT("\a")); + SetName(InaudibleString); + SetLabel(InaudibleString); mAcceptsFocus = true; } diff --git a/src/prefs/BatchPrefs.cpp b/src/prefs/BatchPrefs.cpp index ce112d6a6..a454bddf2 100644 --- a/src/prefs/BatchPrefs.cpp +++ b/src/prefs/BatchPrefs.cpp @@ -30,7 +30,7 @@ END_EVENT_TABLE() /// Constructor BatchPrefs::BatchPrefs(wxWindow * parent, wxWindowID winid): - PrefsPanel(parent, winid, _("Batch")) + PrefsPanel(parent, winid, XO("Batch")) { Populate(); } diff --git a/src/prefs/DevicePrefs.cpp b/src/prefs/DevicePrefs.cpp index 2883521ad..6a797b761 100644 --- a/src/prefs/DevicePrefs.cpp +++ b/src/prefs/DevicePrefs.cpp @@ -53,7 +53,7 @@ BEGIN_EVENT_TABLE(DevicePrefs, PrefsPanel) END_EVENT_TABLE() DevicePrefs::DevicePrefs(wxWindow * parent, wxWindowID winid) -: PrefsPanel(parent, winid, _("Devices")) +: PrefsPanel(parent, winid, XO("Devices")) { Populate(); } diff --git a/src/prefs/DirectoriesPrefs.cpp b/src/prefs/DirectoriesPrefs.cpp index d0544baa7..350211eee 100644 --- a/src/prefs/DirectoriesPrefs.cpp +++ b/src/prefs/DirectoriesPrefs.cpp @@ -49,7 +49,7 @@ END_EVENT_TABLE() DirectoriesPrefs::DirectoriesPrefs(wxWindow * parent, wxWindowID winid) /* i18n-hint: Directories, also called folders, in computer file systems */ -: PrefsPanel(parent, winid, _("Directories")), +: PrefsPanel(parent, winid, XO("Directories")), mFreeSpace(NULL), mTempDir(NULL) { diff --git a/src/prefs/EffectsPrefs.cpp b/src/prefs/EffectsPrefs.cpp index eff25f371..66b883d17 100644 --- a/src/prefs/EffectsPrefs.cpp +++ b/src/prefs/EffectsPrefs.cpp @@ -31,7 +31,7 @@ #include "../ShuttleGui.h" EffectsPrefs::EffectsPrefs(wxWindow * parent, wxWindowID winid) -: PrefsPanel(parent, winid, _("Effects")) +: PrefsPanel(parent, winid, XO("Effects")) { Populate(); } diff --git a/src/prefs/ExtImportPrefs.cpp b/src/prefs/ExtImportPrefs.cpp index 4d4c75f0e..0534311ae 100644 --- a/src/prefs/ExtImportPrefs.cpp +++ b/src/prefs/ExtImportPrefs.cpp @@ -60,7 +60,7 @@ END_EVENT_TABLE() ExtImportPrefs::ExtImportPrefs(wxWindow * parent, wxWindowID winid) /* i18n-hint: Title of dialog governing "Extended", or "advanced," * audio file import options */ -: PrefsPanel(parent, winid, _("Extended Import")), RuleTable(NULL), +: PrefsPanel(parent, winid, XO("Extended Import")), RuleTable(NULL), PluginList(NULL), mCreateTable (false), mDragFocus (NULL), mFakeKeyEvent (false), mStopRecursiveSelection (false), last_selected (-1) { diff --git a/src/prefs/GUIPrefs.cpp b/src/prefs/GUIPrefs.cpp index 1d9784ae1..9ea5f3561 100644 --- a/src/prefs/GUIPrefs.cpp +++ b/src/prefs/GUIPrefs.cpp @@ -42,7 +42,7 @@ wxDEFINE_EVENT(EVT_LANGUAGE_CHANGE, wxCommandEvent); GUIPrefs::GUIPrefs(wxWindow * parent, wxWindowID winid) /* i18n-hint: refers to Audacity's user interface settings */ -: PrefsPanel(parent, winid, _("Interface")) +: PrefsPanel(parent, winid, XO("Interface")) { Populate(); } diff --git a/src/prefs/ImportExportPrefs.cpp b/src/prefs/ImportExportPrefs.cpp index 583cd5abc..8551299c2 100644 --- a/src/prefs/ImportExportPrefs.cpp +++ b/src/prefs/ImportExportPrefs.cpp @@ -25,7 +25,7 @@ #include "../ShuttleGui.h" ImportExportPrefs::ImportExportPrefs(wxWindow * parent, wxWindowID winid) -: PrefsPanel(parent, winid, _("Import / Export")) +: PrefsPanel(parent, winid, XO("Import / Export")) { Populate(); } diff --git a/src/prefs/KeyConfigPrefs.cpp b/src/prefs/KeyConfigPrefs.cpp index 0d76b126b..8c5338b82 100644 --- a/src/prefs/KeyConfigPrefs.cpp +++ b/src/prefs/KeyConfigPrefs.cpp @@ -83,7 +83,7 @@ END_EVENT_TABLE() KeyConfigPrefs::KeyConfigPrefs(wxWindow * parent, wxWindowID winid, const CommandID &name) /* i18n-hint: as in computer keyboard (not musical!) */ -: PrefsPanel(parent, winid, _("Keyboard")), +: PrefsPanel(parent, winid, XO("Keyboard")), mView(NULL), mKey(NULL), mFilter(NULL), diff --git a/src/prefs/LibraryPrefs.cpp b/src/prefs/LibraryPrefs.cpp index 66de1ea01..c00c841c2 100644 --- a/src/prefs/LibraryPrefs.cpp +++ b/src/prefs/LibraryPrefs.cpp @@ -47,7 +47,7 @@ END_EVENT_TABLE() LibraryPrefs::LibraryPrefs(wxWindow * parent, wxWindowID winid) /* i18-hint: refers to optional plug-in software libraries */ -: PrefsPanel(parent, winid, _("Libraries")) +: PrefsPanel(parent, winid, XO("Libraries")) { Populate(); } diff --git a/src/prefs/MidiIOPrefs.cpp b/src/prefs/MidiIOPrefs.cpp index d7c4a19ef..f164665e7 100644 --- a/src/prefs/MidiIOPrefs.cpp +++ b/src/prefs/MidiIOPrefs.cpp @@ -58,7 +58,7 @@ END_EVENT_TABLE() MidiIOPrefs::MidiIOPrefs(wxWindow * parent, wxWindowID winid) /* i18n-hint: untranslatable acronym for "Musical Instrument Device Interface" */ -: PrefsPanel(parent, winid, _("MIDI Devices")) +: PrefsPanel(parent, winid, XO("MIDI Devices")) { Populate(); } diff --git a/src/prefs/ModulePrefs.cpp b/src/prefs/ModulePrefs.cpp index ae6241e4d..2f9ba835d 100644 --- a/src/prefs/ModulePrefs.cpp +++ b/src/prefs/ModulePrefs.cpp @@ -29,7 +29,7 @@ with names like mnod-script-pipe that add NEW features. /* i18n-hint: Modules are optional extensions to Audacity that add NEW features.*/ ModulePrefs::ModulePrefs(wxWindow * parent, wxWindowID winid) -: PrefsPanel(parent, winid, _("Modules")) +: PrefsPanel(parent, winid, XO("Modules")) { Populate(); } diff --git a/src/prefs/MousePrefs.cpp b/src/prefs/MousePrefs.cpp index 5848b7e74..7de3a8494 100644 --- a/src/prefs/MousePrefs.cpp +++ b/src/prefs/MousePrefs.cpp @@ -61,7 +61,7 @@ enum /// Constructor MousePrefs::MousePrefs(wxWindow * parent, wxWindowID winid) -: PrefsPanel(parent, winid, _("Mouse")) +: PrefsPanel(parent, winid, XO("Mouse")) { Populate(); } diff --git a/src/prefs/PlaybackPrefs.cpp b/src/prefs/PlaybackPrefs.cpp index 2c41639dc..3c7855aac 100644 --- a/src/prefs/PlaybackPrefs.cpp +++ b/src/prefs/PlaybackPrefs.cpp @@ -28,7 +28,7 @@ #include "../Prefs.h" PlaybackPrefs::PlaybackPrefs(wxWindow * parent, wxWindowID winid) -: PrefsPanel(parent, winid, _("Playback")) +: PrefsPanel(parent, winid, XO("Playback")) { Populate(); } diff --git a/src/prefs/PrefsPanel.h b/src/prefs/PrefsPanel.h index ccde697de..2b4094cf6 100644 --- a/src/prefs/PrefsPanel.h +++ b/src/prefs/PrefsPanel.h @@ -52,7 +52,8 @@ class PrefsPanel /* not final */ : public wxPanelWrapper, ComponentInterface using Factory = std::function< PrefsPanel * (wxWindow *parent, wxWindowID winid) >; - PrefsPanel(wxWindow * parent, wxWindowID winid, const wxString &title) + PrefsPanel( + wxWindow * parent, wxWindowID winid, const TranslatableString &title) : wxPanelWrapper(parent, winid) { SetLabel(title); // Provide visual label diff --git a/src/prefs/ProjectsPrefs.cpp b/src/prefs/ProjectsPrefs.cpp index f1fdfc91e..778031240 100644 --- a/src/prefs/ProjectsPrefs.cpp +++ b/src/prefs/ProjectsPrefs.cpp @@ -31,7 +31,7 @@ handling. ProjectsPrefs::ProjectsPrefs(wxWindow * parent, wxWindowID winid) : PrefsPanel(parent, winid, /* i18n-hint: (noun) i.e Audacity projects. */ - _("Projects")) + XO("Projects")) { Populate(); } diff --git a/src/prefs/QualityPrefs.cpp b/src/prefs/QualityPrefs.cpp index df0ad28c2..776352ff0 100644 --- a/src/prefs/QualityPrefs.cpp +++ b/src/prefs/QualityPrefs.cpp @@ -57,7 +57,7 @@ END_EVENT_TABLE() QualityPrefs::QualityPrefs(wxWindow * parent, wxWindowID winid) /* i18n-hint: meaning accuracy in reproduction of sounds */ -: PrefsPanel(parent, winid, _("Quality")) +: PrefsPanel(parent, winid, XO("Quality")) { Populate(); } diff --git a/src/prefs/RecordingPrefs.cpp b/src/prefs/RecordingPrefs.cpp index bd4c1a167..61a35d73b 100644 --- a/src/prefs/RecordingPrefs.cpp +++ b/src/prefs/RecordingPrefs.cpp @@ -42,7 +42,7 @@ BEGIN_EVENT_TABLE(RecordingPrefs, PrefsPanel) END_EVENT_TABLE() RecordingPrefs::RecordingPrefs(wxWindow * parent, wxWindowID winid) -: PrefsPanel(parent, winid, _("Recording")) +: PrefsPanel(parent, winid, XO("Recording")) { gPrefs->Read(wxT("/GUI/TrackNames/RecordingNameCustom"), &mUseCustomTrackName, false); mOldNameChoice = mUseCustomTrackName; diff --git a/src/prefs/SpectrumPrefs.cpp b/src/prefs/SpectrumPrefs.cpp index e75aa144f..7c9346b76 100644 --- a/src/prefs/SpectrumPrefs.cpp +++ b/src/prefs/SpectrumPrefs.cpp @@ -38,7 +38,7 @@ #include "../widgets/AudacityMessageBox.h" SpectrumPrefs::SpectrumPrefs(wxWindow * parent, wxWindowID winid, WaveTrack *wt) -: PrefsPanel(parent, winid, wt ? _("Spectrogram Settings") : _("Spectrograms")) +: PrefsPanel(parent, winid, wt ? XO("Spectrogram Settings") : XO("Spectrograms")) , mWt(wt) , mPopulating(false) { diff --git a/src/prefs/ThemePrefs.cpp b/src/prefs/ThemePrefs.cpp index 0bdc5a123..d4a64cbd7 100644 --- a/src/prefs/ThemePrefs.cpp +++ b/src/prefs/ThemePrefs.cpp @@ -63,7 +63,7 @@ ThemePrefs::ThemePrefs(wxWindow * parent, wxWindowID winid) graphical user interface, including choices of colors, and similarity of images such as those on button controls. Audacity can load and save alternative themes. */ -: PrefsPanel(parent, winid, _("Theme")) +: PrefsPanel(parent, winid, XO("Theme")) { Populate(); } diff --git a/src/prefs/TracksBehaviorsPrefs.cpp b/src/prefs/TracksBehaviorsPrefs.cpp index 2552b3cd5..396549f60 100644 --- a/src/prefs/TracksBehaviorsPrefs.cpp +++ b/src/prefs/TracksBehaviorsPrefs.cpp @@ -24,7 +24,7 @@ TracksBehaviorsPrefs::TracksBehaviorsPrefs(wxWindow * parent, wxWindowID winid) /* i18n-hint: i.e. the behaviors of tracks */ -: PrefsPanel(parent, winid, _("Tracks Behaviors")) +: PrefsPanel(parent, winid, XO("Tracks Behaviors")) { Populate(); } diff --git a/src/prefs/TracksPrefs.cpp b/src/prefs/TracksPrefs.cpp index 1fd2fd61b..e8156bfc9 100644 --- a/src/prefs/TracksPrefs.cpp +++ b/src/prefs/TracksPrefs.cpp @@ -218,7 +218,7 @@ TracksPrefs::TracksPrefs(wxWindow * parent, wxWindowID winid) /* i18n-hint: "Tracks" include audio recordings but also other collections of * data associated with a time line, such as sequences of labels, and musical * notes */ -: PrefsPanel(parent, winid, _("Tracks")) +: PrefsPanel(parent, winid, XO("Tracks")) { Populate(); } diff --git a/src/prefs/WarningsPrefs.cpp b/src/prefs/WarningsPrefs.cpp index cb5f0b25a..a65084f66 100644 --- a/src/prefs/WarningsPrefs.cpp +++ b/src/prefs/WarningsPrefs.cpp @@ -27,7 +27,7 @@ //////////////////////////////////////////////////////////////////////////////// WarningsPrefs::WarningsPrefs(wxWindow * parent, wxWindowID winid) -: PrefsPanel(parent, winid, _("Warnings")) +: PrefsPanel(parent, winid, XO("Warnings")) { Populate(); } diff --git a/src/prefs/WaveformPrefs.cpp b/src/prefs/WaveformPrefs.cpp index 0f7811c99..26eec486d 100644 --- a/src/prefs/WaveformPrefs.cpp +++ b/src/prefs/WaveformPrefs.cpp @@ -32,7 +32,7 @@ Paul Licameli WaveformPrefs::WaveformPrefs(wxWindow * parent, wxWindowID winid, WaveTrack *wt) /* i18n-hint: A waveform is a visual representation of vibration */ -: PrefsPanel(parent, winid, _("Waveforms")) +: PrefsPanel(parent, winid, XO("Waveforms")) , mWt(wt) , mPopulating(false) { diff --git a/src/toolbars/ControlToolBar.cpp b/src/toolbars/ControlToolBar.cpp index 51bd79b85..71e705197 100644 --- a/src/toolbars/ControlToolBar.cpp +++ b/src/toolbars/ControlToolBar.cpp @@ -105,7 +105,7 @@ static const TranslatableString // gets written to prefs and cannot be changed in prefs to maintain backwards // compatibility ControlToolBar::ControlToolBar( AudacityProject &project ) -: ToolBar(project, TransportBarID, _("Transport"), wxT("Control")) +: ToolBar(project, TransportBarID, XO("Transport"), wxT("Control")) { gPrefs->Read(wxT("/GUI/ErgonomicTransportButtons"), &mErgonomicTransportButtons, true); mStrLocale = gPrefs->Read(wxT("/Locale/Language"), wxT("")); @@ -343,7 +343,7 @@ void ControlToolBar::UpdatePrefs() // Set label to pull in language change - SetLabel(_("Transport")); + SetLabel(XO("Transport")); // Give base class a chance ToolBar::UpdatePrefs(); diff --git a/src/toolbars/DeviceToolBar.cpp b/src/toolbars/DeviceToolBar.cpp index eba210e33..7baeadd34 100644 --- a/src/toolbars/DeviceToolBar.cpp +++ b/src/toolbars/DeviceToolBar.cpp @@ -73,7 +73,7 @@ static int DeviceToolbarPrefsID() //Standard contructor DeviceToolBar::DeviceToolBar( AudacityProject &project ) -: ToolBar( project, DeviceBarID, _("Device"), wxT("Device"), true ) +: ToolBar( project, DeviceBarID, XO("Device"), wxT("Device"), true ) { wxTheApp->Bind( EVT_RESCANNED_DEVICES, &DeviceToolBar::OnRescannedDevices, this ); @@ -324,7 +324,7 @@ void DeviceToolBar::UpdatePrefs() RegenerateTooltips(); // Set label to pull in language change - SetLabel(_("Device")); + SetLabel(XO("Device")); // Give base class a chance ToolBar::UpdatePrefs(); diff --git a/src/toolbars/EditToolBar.cpp b/src/toolbars/EditToolBar.cpp index 77ca5f083..ded6b1dab 100644 --- a/src/toolbars/EditToolBar.cpp +++ b/src/toolbars/EditToolBar.cpp @@ -78,7 +78,7 @@ END_EVENT_TABLE() //Standard contructor EditToolBar::EditToolBar( AudacityProject &project ) -: ToolBar(project, EditBarID, _("Edit"), wxT("Edit")) +: ToolBar(project, EditBarID, XO("Edit"), wxT("Edit")) { } @@ -206,7 +206,7 @@ void EditToolBar::UpdatePrefs() RegenerateTooltips(); // Set label to pull in language change - SetLabel(_("Edit")); + SetLabel(XO("Edit")); // Give base class a chance ToolBar::UpdatePrefs(); diff --git a/src/toolbars/MeterToolBar.cpp b/src/toolbars/MeterToolBar.cpp index 0fab2e640..a869f8b93 100644 --- a/src/toolbars/MeterToolBar.cpp +++ b/src/toolbars/MeterToolBar.cpp @@ -49,15 +49,15 @@ END_EVENT_TABLE() //Standard contructor MeterToolBar::MeterToolBar(AudacityProject &project, int type) -: ToolBar(project, type, _("Combined Meter"), wxT("CombinedMeter"), true) +: ToolBar(project, type, XO("Combined Meter"), wxT("CombinedMeter"), true) { if( mType == RecordMeterBarID ){ mWhichMeters = kWithRecordMeter; - mLabel = _("Recording Meter"); + mLabel = XO("Recording Meter"); mSection = wxT("RecordMeter"); } else if( mType == PlayMeterBarID ){ mWhichMeters = kWithPlayMeter; - mLabel = _("Playback Meter"); + mLabel = XO("Playback Meter"); mSection = wxT("PlayMeter"); } else { mWhichMeters = kWithPlayMeter | kWithRecordMeter; @@ -126,11 +126,11 @@ void MeterToolBar::Populate() wxDefaultPosition, wxSize( 260, 28 ) ); /* i18n-hint: (noun) The meter that shows the loudness of the audio being recorded.*/ - mRecordMeter->SetName( _("Record Meter")); + mRecordMeter->SetName( XO("Record Meter")); /* i18n-hint: (noun) The meter that shows the loudness of the audio being recorded. This is the name used in screen reader software, where having 'Meter' first apparently is helpful to partially sighted people. */ - mRecordMeter->SetLabel( _("Meter-Record") ); + mRecordMeter->SetLabel( XO("Meter-Record") ); mSizer->Add( mRecordMeter, wxGBPosition( 0, 0 ), wxDefaultSpan, wxEXPAND ); } @@ -142,11 +142,11 @@ void MeterToolBar::Populate() wxDefaultPosition, wxSize( 260, 28 ) ); /* i18n-hint: (noun) The meter that shows the loudness of the audio playing.*/ - mPlayMeter->SetName( _("Play Meter")); + mPlayMeter->SetName( XO("Play Meter")); /* i18n-hint: (noun) The meter that shows the loudness of the audio playing. This is the name used in screen reader software, where having 'Meter' first apparently is helpful to partially sighted people. */ - mPlayMeter->SetLabel( _("Meter-Play")); + mPlayMeter->SetLabel( XO("Meter-Play")); mSizer->Add( mPlayMeter, wxGBPosition( (mWhichMeters & kWithRecordMeter)?1:0, 0 ), wxDefaultSpan, wxEXPAND ); } @@ -158,7 +158,7 @@ void MeterToolBar::UpdatePrefs() RegenerateTooltips(); // Set label to pull in language change - SetLabel(_("Meter")); + SetLabel(XO("Meter")); // Give base class a chance ToolBar::UpdatePrefs(); @@ -168,9 +168,9 @@ void MeterToolBar::RegenerateTooltips() { #if wxUSE_TOOLTIPS if( mPlayMeter ) - mPlayMeter->SetToolTip( _("Playback Level") ); + mPlayMeter->SetToolTip( XO("Playback Level") ); if( mRecordMeter ) - mRecordMeter->SetToolTip( _("Recording Level") ); + mRecordMeter->SetToolTip( XO("Recording Level") ); #endif } diff --git a/src/toolbars/MixerToolBar.cpp b/src/toolbars/MixerToolBar.cpp index c866d1104..0306e3b58 100644 --- a/src/toolbars/MixerToolBar.cpp +++ b/src/toolbars/MixerToolBar.cpp @@ -56,7 +56,7 @@ END_EVENT_TABLE() //Standard contructor MixerToolBar::MixerToolBar( AudacityProject &project ) -: ToolBar(project, MixerBarID, _("Mixer"), wxT("Mixer"), true) +: ToolBar(project, MixerBarID, XO("Mixer"), wxT("Mixer"), true) { mInputSliderVolume = 0.0; mOutputSliderVolume = 0.0; @@ -196,7 +196,7 @@ void MixerToolBar::UpdatePrefs() #endif // Set label to pull in language change - SetLabel(_("Mixer")); + SetLabel(XO("Mixer")); RegenerateTooltips(); diff --git a/src/toolbars/ScrubbingToolBar.cpp b/src/toolbars/ScrubbingToolBar.cpp index 51b16fd39..66ae7fa9e 100644 --- a/src/toolbars/ScrubbingToolBar.cpp +++ b/src/toolbars/ScrubbingToolBar.cpp @@ -57,7 +57,7 @@ END_EVENT_TABLE() //Standard contructor ScrubbingToolBar::ScrubbingToolBar( AudacityProject &project ) -: ToolBar(project, ScrubbingBarID, _("Scrub"), wxT("Scrub")) +: ToolBar(project, ScrubbingBarID, XO("Scrub"), wxT("Scrub")) { } @@ -135,7 +135,7 @@ void ScrubbingToolBar::UpdatePrefs() RegenerateTooltips(); // Set label to pull in language change - SetLabel(_("Scrubbing")); + SetLabel(XO("Scrubbing")); // Give base class a chance ToolBar::UpdatePrefs(); diff --git a/src/toolbars/SelectionBar.cpp b/src/toolbars/SelectionBar.cpp index 2024f1493..1ed1d9925 100644 --- a/src/toolbars/SelectionBar.cpp +++ b/src/toolbars/SelectionBar.cpp @@ -108,7 +108,7 @@ BEGIN_EVENT_TABLE(SelectionBar, ToolBar) END_EVENT_TABLE() SelectionBar::SelectionBar( AudacityProject &project ) -: ToolBar(project, SelectionBarID, _("Selection"), wxT("Selection")), +: ToolBar(project, SelectionBarID, XO("Selection"), wxT("Selection")), mListener(NULL), mRate(0.0), mStart(0.0), mEnd(0.0), mLength(0.0), mCenter(0.0), mAudio(0.0), mDrive1( StartTimeID), mDrive2( EndTimeID ), @@ -373,7 +373,7 @@ void SelectionBar::UpdatePrefs() OnUpdate(e); // Set label to pull in language change - SetLabel(_("Selection")); + SetLabel(XO("Selection")); RegenerateTooltips(); // Give base class a chance diff --git a/src/toolbars/SpectralSelectionBar.cpp b/src/toolbars/SpectralSelectionBar.cpp index 4f0957304..9d25980f7 100644 --- a/src/toolbars/SpectralSelectionBar.cpp +++ b/src/toolbars/SpectralSelectionBar.cpp @@ -96,7 +96,7 @@ static const wxString preferencePath SpectralSelectionBar::SpectralSelectionBar( AudacityProject &project ) : ToolBar( project, - SpectralSelectionBarID, _("Spectral Selection"), wxT("SpectralSelection") ) + SpectralSelectionBarID, XO("Spectral Selection"), wxT("SpectralSelection") ) , mListener(NULL), mbCenterAndWidth(true) , mCenter(0.0), mWidth(0.0), mLow(0.0), mHigh(0.0) , mCenterCtrl(NULL), mWidthCtrl(NULL), mLowCtrl(NULL), mHighCtrl(NULL) @@ -258,7 +258,7 @@ void SpectralSelectionBar::UpdatePrefs() } // Set label to pull in language change - SetLabel(_("Spectral Selection")); + SetLabel(XO("Spectral Selection")); RegenerateTooltips(); diff --git a/src/toolbars/ToolBar.cpp b/src/toolbars/ToolBar.cpp index e17b3c727..5fd75dc62 100644 --- a/src/toolbars/ToolBar.cpp +++ b/src/toolbars/ToolBar.cpp @@ -316,7 +316,7 @@ END_EVENT_TABLE() // ToolBar::ToolBar( AudacityProject &project, int type, - const wxString &label, + const TranslatableString &label, const wxString §ion, bool resizable ) : wxPanelWrapper() @@ -349,16 +349,16 @@ ToolBar::~ToolBar() // // Returns the toolbar title // -wxString ToolBar::GetTitle() +TranslatableString ToolBar::GetTitle() { /* i18n-hint: %s will be replaced by the name of the kind of toolbar.*/ - return wxString::Format( _("Audacity %s Toolbar"), GetLabel() ); + return XO("Audacity %s Toolbar").Format( GetLabel() ); } // // Returns the toolbar label // -wxString ToolBar::GetLabel() +TranslatableString ToolBar::GetLabel() { return mLabel; } @@ -384,6 +384,15 @@ int ToolBar::GetType() // void ToolBar::SetLabel(const wxString & label) { + // Probably shouldn't reach this overload, but perhaps virtual function + // dispatch will take us here from a pointer to the wxPanel base class + mLabel = TranslatableString{ label }; +} + +void ToolBar::SetLabel(const TranslatableString & label) +{ + // Only this overload is publicly accessible when you have a pointer to + // Toolbar or a subclass of it mLabel = label; } diff --git a/src/toolbars/ToolBar.h b/src/toolbars/ToolBar.h index 15f7909cf..bfced6fc0 100644 --- a/src/toolbars/ToolBar.h +++ b/src/toolbars/ToolBar.h @@ -99,7 +99,7 @@ class ToolBar /* not final */ using Holder = wxWindowPtr; ToolBar( AudacityProject &project, - int type, const wxString & label, const wxString & section, + int type, const TranslatableString & label, const wxString & section, bool resizable = false); virtual ~ToolBar(); @@ -114,12 +114,15 @@ class ToolBar /* not final */ virtual void RegenerateTooltips() = 0; int GetType(); - wxString GetTitle(); - wxString GetLabel(); + TranslatableString GetTitle(); + TranslatableString GetLabel(); wxString GetSection(); ToolDock *GetDock(); +private: void SetLabel(const wxString & label) override; +public: + void SetLabel(const TranslatableString & label); virtual void SetDocked(ToolDock *dock, bool pushed); // NEW virtual: @@ -222,7 +225,7 @@ class ToolBar /* not final */ protected: AudacityProject &mProject; - wxString mLabel; + TranslatableString mLabel; wxString mSection; int mType; private: diff --git a/src/toolbars/ToolDock.cpp b/src/toolbars/ToolDock.cpp index 203e10f03..6f0ce2aa7 100644 --- a/src/toolbars/ToolDock.cpp +++ b/src/toolbars/ToolDock.cpp @@ -381,8 +381,8 @@ END_EVENT_TABLE() ToolDock::ToolDock( ToolManager *manager, wxWindow *parent, int dockid ): wxPanelWrapper( parent, dockid, wxDefaultPosition, parent->GetSize() ) { - SetLabel( _( "ToolDock" ) ); - SetName( _( "ToolDock" ) ); + SetLabel( XO( "ToolDock" ) ); + SetName( XO( "ToolDock" ) ); // Init mManager = manager; diff --git a/src/toolbars/ToolsToolBar.cpp b/src/toolbars/ToolsToolBar.cpp index d555f8d0e..6881bbc58 100644 --- a/src/toolbars/ToolsToolBar.cpp +++ b/src/toolbars/ToolsToolBar.cpp @@ -73,7 +73,7 @@ END_EVENT_TABLE() //Standard constructor ToolsToolBar::ToolsToolBar( AudacityProject &project ) -: ToolBar(project, ToolsBarID, _("Tools"), wxT("Tools")) +: ToolBar(project, ToolsBarID, XO("Tools"), wxT("Tools")) { using namespace ToolCodes; diff --git a/src/toolbars/TranscriptionToolBar.cpp b/src/toolbars/TranscriptionToolBar.cpp index 27f2a317f..cbb99b6ff 100644 --- a/src/toolbars/TranscriptionToolBar.cpp +++ b/src/toolbars/TranscriptionToolBar.cpp @@ -96,7 +96,7 @@ END_EVENT_TABLE() ////Standard Constructor TranscriptionToolBar::TranscriptionToolBar( AudacityProject &project ) : ToolBar( project, - TranscriptionBarID, _("Play-at-Speed"), wxT("Transcription"), true ) + TranscriptionBarID, XO("Play-at-Speed"), wxT("Transcription"), true ) { SetPlaySpeed( 1.0 * 100.0 ); #ifdef EXPERIMENTAL_VOICE_DETECTION @@ -322,7 +322,7 @@ void TranscriptionToolBar::UpdatePrefs() RegenerateTooltips(); // Set label to pull in language change - SetLabel(_("Play-at-Speed")); + SetLabel(XO("Play-at-Speed")); // Give base class a chance ToolBar::UpdatePrefs(); diff --git a/src/tracks/playabletrack/ui/PlayableTrackButtonHandles.cpp b/src/tracks/playabletrack/ui/PlayableTrackButtonHandles.cpp index 4cf796215..8d80cde49 100644 --- a/src/tracks/playabletrack/ui/PlayableTrackButtonHandles.cpp +++ b/src/tracks/playabletrack/ui/PlayableTrackButtonHandles.cpp @@ -41,9 +41,9 @@ UIHandle::Result MuteButtonHandle::CommitChanges return RefreshCode::RefreshNone; } -wxString MuteButtonHandle::Tip(const wxMouseState &) const +TranslatableString MuteButtonHandle::Tip(const wxMouseState &) const { - auto name = _("Mute"); + auto name = XO("Mute"); auto project = ::GetActiveProject(); auto focused = TrackFocus::Get( *project ).Get() == GetTrack().get(); @@ -51,8 +51,10 @@ wxString MuteButtonHandle::Tip(const wxMouseState &) const return name; auto &commandManager = CommandManager::Get( *project ); - TranslatedInternalString command{ wxT("TrackMute"), name }; - return commandManager.DescribeCommandsAndShortcuts(&command, 1u); + TranslatedInternalString command{ wxT("TrackMute"), name.Translation() }; + return TranslatableString{ + commandManager.DescribeCommandsAndShortcuts(&command, 1u) + }; } UIHandlePtr MuteButtonHandle::HitTest @@ -97,9 +99,9 @@ UIHandle::Result SoloButtonHandle::CommitChanges return RefreshCode::RefreshNone; } -wxString SoloButtonHandle::Tip(const wxMouseState &) const +TranslatableString SoloButtonHandle::Tip(const wxMouseState &) const { - auto name = _("Solo"); + auto name = XO("Solo"); auto project = ::GetActiveProject(); auto focused = TrackFocus::Get( *project ).Get() == GetTrack().get(); @@ -107,8 +109,10 @@ wxString SoloButtonHandle::Tip(const wxMouseState &) const return name; auto &commandManager = CommandManager::Get( *project ); - TranslatedInternalString command{ wxT("TrackSolo"), name }; - return commandManager.DescribeCommandsAndShortcuts( &command, 1u ); + TranslatedInternalString command{ wxT("TrackSolo"), name.Translation() }; + return TranslatableString{ + commandManager.DescribeCommandsAndShortcuts( &command, 1u ) + }; } UIHandlePtr SoloButtonHandle::HitTest diff --git a/src/tracks/playabletrack/ui/PlayableTrackButtonHandles.h b/src/tracks/playabletrack/ui/PlayableTrackButtonHandles.h index 46a775994..7de3db68b 100644 --- a/src/tracks/playabletrack/ui/PlayableTrackButtonHandles.h +++ b/src/tracks/playabletrack/ui/PlayableTrackButtonHandles.h @@ -31,7 +31,7 @@ protected: (const wxMouseEvent &event, AudacityProject *pProject, wxWindow *pParent) override; - wxString Tip(const wxMouseState &state) const override; + TranslatableString Tip(const wxMouseState &state) const override; bool StopsOnKeystroke () override { return true; } @@ -61,7 +61,7 @@ protected: (const wxMouseEvent &event, AudacityProject *pProject, wxWindow *pParent) override; - wxString Tip(const wxMouseState &state) const override; + TranslatableString Tip(const wxMouseState &state) const override; bool StopsOnKeystroke () override { return true; } diff --git a/src/tracks/ui/ButtonHandle.cpp b/src/tracks/ui/ButtonHandle.cpp index 81b1c4f2f..05ea64fb0 100644 --- a/src/tracks/ui/ButtonHandle.cpp +++ b/src/tracks/ui/ButtonHandle.cpp @@ -75,7 +75,7 @@ HitTestPreview ButtonHandle::Preview { // No special cursor auto message = Tip(st.state); - return { message, {}, message }; + return { message.Translation(), {}, message }; } UIHandle::Result ButtonHandle::Release diff --git a/src/tracks/ui/ButtonHandle.h b/src/tracks/ui/ButtonHandle.h index b4384c813..b670cd5d8 100644 --- a/src/tracks/ui/ButtonHandle.h +++ b/src/tracks/ui/ButtonHandle.h @@ -17,6 +17,7 @@ class wxMouseEvent; class wxMouseState; class Track; +class TranslatableString; /// \brief A UIHandle for a TrackPanel button, such as the Mute and Solo @@ -45,7 +46,7 @@ protected: (const wxMouseEvent &event, AudacityProject *pProject, wxWindow *pParent) = 0; // Define a message for the status bar and tooltip. - virtual wxString Tip(const wxMouseState &state) const = 0; + virtual TranslatableString Tip(const wxMouseState &state) const = 0; void Enter(bool forward) final override; diff --git a/src/tracks/ui/TrackButtonHandles.cpp b/src/tracks/ui/TrackButtonHandles.cpp index 589035717..c7006191f 100644 --- a/src/tracks/ui/TrackButtonHandles.cpp +++ b/src/tracks/ui/TrackButtonHandles.cpp @@ -57,11 +57,11 @@ UIHandle::Result MinimizeButtonHandle::CommitChanges return RefreshNone; } -wxString MinimizeButtonHandle::Tip(const wxMouseState &) const +TranslatableString MinimizeButtonHandle::Tip(const wxMouseState &) const { auto pTrack = GetTrack(); return TrackView::Get( *pTrack ).GetMinimized() - ? _("Expand") : _("Collapse"); + ? XO("Expand") : XO("Collapse"); } UIHandlePtr MinimizeButtonHandle::HitTest @@ -108,13 +108,13 @@ UIHandle::Result SelectButtonHandle::CommitChanges return RefreshNone; } -wxString SelectButtonHandle::Tip(const wxMouseState &) const +TranslatableString SelectButtonHandle::Tip(const wxMouseState &) const { auto pTrack = GetTrack(); #if defined(__WXMAC__) - return pTrack->GetSelected() ? _("Command+Click to Unselect") : _("Select track"); + return pTrack->GetSelected() ? XO("Command+Click to Unselect") : XO("Select track"); #else - return pTrack->GetSelected() ? _("Ctrl+Click to Unselect") : _("Select track"); + return pTrack->GetSelected() ? XO("Ctrl+Click to Unselect") : XO("Select track"); #endif } @@ -170,9 +170,9 @@ UIHandle::Result CloseButtonHandle::CommitChanges return result; } -wxString CloseButtonHandle::Tip(const wxMouseState &) const +TranslatableString CloseButtonHandle::Tip(const wxMouseState &) const { - auto name = _("Close"); + auto name = XO("Close"); auto project = ::GetActiveProject(); auto focused = TrackFocus::Get( *project ).Get() == GetTrack().get(); @@ -180,8 +180,10 @@ wxString CloseButtonHandle::Tip(const wxMouseState &) const return name; auto &commandManager = CommandManager::Get( *project ); - TranslatedInternalString command{ wxT("TrackClose"), name }; - return commandManager.DescribeCommandsAndShortcuts( &command, 1u ); + TranslatedInternalString command{ wxT("TrackClose"), name.Translation() }; + return TranslatableString{ + commandManager.DescribeCommandsAndShortcuts( &command, 1u ) + }; } UIHandlePtr CloseButtonHandle::HitTest @@ -230,9 +232,9 @@ UIHandle::Result MenuButtonHandle::CommitChanges return RefreshCode::RefreshNone; } -wxString MenuButtonHandle::Tip(const wxMouseState &) const +TranslatableString MenuButtonHandle::Tip(const wxMouseState &) const { - auto name = _("Open menu..."); + auto name = XO("Open menu..."); auto project = ::GetActiveProject(); auto focused = TrackFocus::Get( *project ).Get() == GetTrack().get(); @@ -240,8 +242,10 @@ wxString MenuButtonHandle::Tip(const wxMouseState &) const return name; auto &commandManager = CommandManager::Get( *project ); - TranslatedInternalString command{ wxT("TrackMenu"), name }; - return commandManager.DescribeCommandsAndShortcuts( &command, 1u ); + TranslatedInternalString command{ wxT("TrackMenu"), name.Translation() }; + return TranslatableString{ + commandManager.DescribeCommandsAndShortcuts( &command, 1u ) + }; } UIHandlePtr MenuButtonHandle::HitTest diff --git a/src/tracks/ui/TrackButtonHandles.h b/src/tracks/ui/TrackButtonHandles.h index 96af9c7d2..f1d30d9c8 100644 --- a/src/tracks/ui/TrackButtonHandles.h +++ b/src/tracks/ui/TrackButtonHandles.h @@ -24,7 +24,7 @@ protected: (const wxMouseEvent &event, AudacityProject *pProject, wxWindow *pParent) override; - wxString Tip(const wxMouseState &state) const override; + TranslatableString Tip(const wxMouseState &state) const override; public: explicit MinimizeButtonHandle @@ -49,7 +49,7 @@ protected: (const wxMouseEvent &event, AudacityProject *pProject, wxWindow *pParent) override; - wxString Tip(const wxMouseState &state) const override; + TranslatableString Tip(const wxMouseState &state) const override; public: explicit SelectButtonHandle @@ -74,7 +74,7 @@ protected: (const wxMouseEvent &event, AudacityProject *pProject, wxWindow *pParent) override; - wxString Tip(const wxMouseState &state) const override; + TranslatableString Tip(const wxMouseState &state) const override; bool StopsOnKeystroke () override { return true; } @@ -102,7 +102,7 @@ protected: (const wxMouseEvent &event, AudacityProject *pProject, wxWindow *pParent) override; - wxString Tip(const wxMouseState &state) const override; + TranslatableString Tip(const wxMouseState &state) const override; public: explicit MenuButtonHandle diff --git a/src/tracks/ui/TrackSelectHandle.cpp b/src/tracks/ui/TrackSelectHandle.cpp index 6af5aaa96..a9c64f371 100644 --- a/src/tracks/ui/TrackSelectHandle.cpp +++ b/src/tracks/ui/TrackSelectHandle.cpp @@ -35,17 +35,16 @@ Paul Licameli split from TrackPanel.cpp #endif namespace { - wxString Message(unsigned trackCount) { + TranslatableString Message(unsigned trackCount) { if (trackCount > 1) // i18n-hint: %s is replaced by (translation of) 'Ctrl-Click' on windows, 'Command-Click' on Mac - return wxString::Format( - _("%s to select or deselect track. Drag up or down to change track order."), - CTRL_CLICK ); + return XO( +"%s to select or deselect track. Drag up or down to change track order.") + .Format( CTRL_CLICK ); else // i18n-hint: %s is replaced by (translation of) 'Ctrl-Click' on windows, 'Command-Click' on Mac - return wxString::Format( - _("%s to select or deselect track."), - CTRL_CLICK ); + return XO("%s to select or deselect track.") + .Format( CTRL_CLICK ); } } @@ -157,7 +156,7 @@ HitTestPreview TrackSelectHandle::Preview const bool unsafe = ProjectAudioIO::Get( *GetActiveProject() ).IsAudioActive(); return { - message, + message.Translation(), (unsafe ? &*disabledCursor : &*rearrangeCursor) @@ -169,7 +168,7 @@ HitTestPreview TrackSelectHandle::Preview // Don't test safety, because the click to change selection is allowed static wxCursor arrowCursor{ wxCURSOR_ARROW }; return { - message, + message.Translation(), &arrowCursor, message }; diff --git a/src/widgets/Grabber.cpp b/src/widgets/Grabber.cpp index 61b170e2b..3356ace27 100644 --- a/src/widgets/Grabber.cpp +++ b/src/widgets/Grabber.cpp @@ -106,6 +106,10 @@ void Grabber::SetAsSpacer( bool bIsSpacer ) { mAsSpacer = bIsSpacer; }; +void Grabber::SetToolTip(TranslatableString toolTip) +{ + wxWindow::SetToolTip( toolTip.Strip().Translation() ); +} // // Draw the grabber @@ -215,7 +219,7 @@ void Grabber::OnEnter(wxMouseEvent & WXUNUSED(event)) // to make it pop up when we want it. const auto text = GetToolTipText(); UnsetToolTip(); - SetToolTip(text); + wxWindow::SetToolTip(text); if( mAsSpacer ) return; diff --git a/src/widgets/Grabber.h b/src/widgets/Grabber.h index a82139d7a..338f49d85 100644 --- a/src/widgets/Grabber.h +++ b/src/widgets/Grabber.h @@ -34,6 +34,8 @@ flicker-free use. #include #include // to inherit +class TranslatableString; + //////////////////////////////////////////////////////////// /// Grabber Class //////////////////////////////////////////////////////////// @@ -116,6 +118,9 @@ class Grabber final : public wxWindow void PushButton(bool state); void SetAsSpacer( bool bIsSpacer ); + // overload and hide the inherited function that takes naked wxString: + void SetToolTip(TranslatableString toolTip); + protected: void OnLeftDown(wxMouseEvent & event); diff --git a/src/widgets/Meter.cpp b/src/widgets/Meter.cpp index fdbe16daa..50cbeb969 100644 --- a/src/widgets/Meter.cpp +++ b/src/widgets/Meter.cpp @@ -319,7 +319,7 @@ MeterPanel::MeterPanel(AudacityProject *project, mAccSilent(false) { // i18n-hint: Noun (the meter is used for playback or record level monitoring) - SetName( _("Meter") ); + SetName( XO("Meter") ); // Suppress warnings about the header file wxUnusedVar(SpeakerMenu_xpm); wxUnusedVar(MicMenu_xpm); diff --git a/src/widgets/wxPanelWrapper.cpp b/src/widgets/wxPanelWrapper.cpp index 0d997ab07..5cbaad9b8 100644 --- a/src/widgets/wxPanelWrapper.cpp +++ b/src/widgets/wxPanelWrapper.cpp @@ -38,6 +38,26 @@ void wxTabTraversalWrapperCharHook(wxKeyEvent &event) event.Skip(); } +void wxPanelWrapper::SetLabel(const TranslatableString & label) +{ + wxPanel::SetLabel( label.Translation() ); +} + +void wxPanelWrapper::SetName(const TranslatableString & name) +{ + wxPanel::SetName( name.Translation() ); +} + +void wxPanelWrapper::SetToolTip(TranslatableString toolTip) +{ + wxPanel::SetToolTip( toolTip.Strip().Translation() ); +} + +void wxPanelWrapper::SetName() +{ + wxPanel::SetName( GetLabel() ); +} + void wxDialogWrapper::SetTitle(const TranslatableString & title) { wxDialog::SetTitle( title.Translation() ); diff --git a/src/widgets/wxPanelWrapper.h b/src/widgets/wxPanelWrapper.h index 1268e0939..5ff01df3a 100644 --- a/src/widgets/wxPanelWrapper.h +++ b/src/widgets/wxPanelWrapper.h @@ -50,8 +50,9 @@ public: const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL | wxNO_BORDER, // Important: default window name localizes! - const wxString& name = _("Panel")) - : wxTabTraversalWrapper ( parent, winid, pos, size, style, name ) + const TranslatableString& name = XO("Panel")) + : wxTabTraversalWrapper ( + parent, winid, pos, size, style, name.Translation() ) {} // Pseudo ctor @@ -62,12 +63,18 @@ public: const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL | wxNO_BORDER, // Important: default window name localizes! - const wxString& name = _("Panel")) + const TranslatableString& name = XO("Panel")) { return wxTabTraversalWrapper::Create( - parent, winid, pos, size, style, name + parent, winid, pos, size, style, name.Translation() ); } + // overload and hide the inherited functions that take naked wxString: + void SetLabel(const TranslatableString & label); + void SetName(const TranslatableString & name); + void SetToolTip(TranslatableString toolTip); + // Set the name to equal the label: + void SetName(); }; class AUDACITY_DLL_API wxDialogWrapper : public wxTabTraversalWrapper