From 6a8bba0a99088d5a847b439f104aff3688d7a99b Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Fri, 29 Sep 2017 20:14:37 -0400 Subject: [PATCH] Fix all remaining misuses of macro _ in static initializers... ... I found them using a rewritten macro _ that dynamically checked that translations have been initialized. But I do not commit that changed macro. --- src/AudacityApp.cpp | 9 +-- src/Dependencies.cpp | 16 +++-- src/Tags.cpp | 60 ++++++++++------- src/effects/NoiseReduction.cpp | 22 +++--- src/export/ExportFFmpeg.cpp | 6 +- src/export/ExportFFmpegDialogs.cpp | 74 ++++++++++++++++---- src/export/ExportFFmpegDialogs.h | 6 +- src/widgets/NumericTextCtrl.cpp | 104 ++++++++++++++++------------- 8 files changed, 188 insertions(+), 109 deletions(-) diff --git a/src/AudacityApp.cpp b/src/AudacityApp.cpp index 3c7e7c03e..2887cf198 100644 --- a/src/AudacityApp.cpp +++ b/src/AudacityApp.cpp @@ -1047,6 +1047,11 @@ wxString AudacityApp::InitLang( const wxString & lang ) ProcessEvent(evt); } + // PRL: Moved this, do it only after language intialized + // Unused strings that we want to be translated, even though + // we're not using them yet... + wxString future1 = _("Master Gain Control"); + return result; } @@ -1256,10 +1261,6 @@ bool AudacityApp::OnInit() wxTheApp->SetAppDisplayName(appName); wxTheApp->SetVendorName(appName); - // Unused strings that we want to be translated, even though - // we're not using them yet... - wxString future1 = _("Master Gain Control"); - ::wxInitAllImageHandlers(); // AddHandler takes ownership diff --git a/src/Dependencies.cpp b/src/Dependencies.cpp index 6b43ab9fa..bb7d458c2 100644 --- a/src/Dependencies.cpp +++ b/src/Dependencies.cpp @@ -310,20 +310,26 @@ DependencyDialog::DependencyDialog(wxWindow *parent, PopulateOrExchange(S); } -const wxString kStdMsg = +static const wxString kStdMsg() +{ + return _("Copying these files into your project will remove this dependency.\ \nThis is safer, but needs more disk space."); +} -const wxString kExtraMsgForMissingFiles = +static const wxString kExtraMsgForMissingFiles() +{ + return _("\n\nFiles shown as MISSING have been moved or deleted and cannot be copied.\ \nRestore them to their original location to be able to copy into project."); +} void DependencyDialog::PopulateOrExchange(ShuttleGui& S) { S.SetBorder(5); S.StartVerticalLay(); { - mMessageStaticText = S.AddVariableText(kStdMsg, false); + mMessageStaticText = S.AddVariableText(kStdMsg(), false); S.StartStatic(_("Project Dependencies")); { @@ -422,9 +428,9 @@ void DependencyDialog::PopulateList() ++i; } - wxString msg = kStdMsg; + wxString msg = kStdMsg(); if (mHasMissingFiles) - msg += kExtraMsgForMissingFiles; + msg += kExtraMsgForMissingFiles(); mMessageStaticText->SetLabel(msg); if (mCopyAllFilesButton) diff --git a/src/Tags.cpp b/src/Tags.cpp index 5cd803f41..3b6cd7698 100644 --- a/src/Tags.cpp +++ b/src/Tags.cpp @@ -45,6 +45,7 @@ #include "Internat.h" #include "Prefs.h" #include "ShuttleGui.h" +#include "TranslatableStringArray.h" #include "widgets/Grid.h" #include "xml/XMLFileReader.h" @@ -675,24 +676,41 @@ public: // Editor // -#define LABEL_ARTIST _("Artist Name") -#define LABEL_TITLE _("Track Title") -#define LABEL_ALBUM _("Album Title") -#define LABEL_TRACK _("Track Number") -#define LABEL_YEAR _("Year") -#define LABEL_GENRE _("Genre") -#define LABEL_COMMENTS _("Comments") +#define LABEL_ARTIST XO("Artist Name") +#define LABEL_TITLE XO("Track Title") +#define LABEL_ALBUM XO("Album Title") +#define LABEL_TRACK XO("Track Number") +#define LABEL_YEAR XO("Year") +#define LABEL_GENRE XO("Genre") +#define LABEL_COMMENTS XO("Comments") -static wxString names[] = +static wxArrayString names() { - LABEL_ARTIST, - LABEL_TITLE, - LABEL_ALBUM, - LABEL_TRACK, - LABEL_YEAR, - LABEL_GENRE, - LABEL_COMMENTS -}; + static wxString theNames[] = + { + LABEL_ARTIST, + LABEL_TITLE, + LABEL_ALBUM, + LABEL_TRACK, + LABEL_YEAR, + LABEL_GENRE, + LABEL_COMMENTS + }; + + class NamesArray final : public TranslatableStringArray + { + void Populate() override + { + for (auto &name : theNames) + mContents.push_back( wxGetTranslation( name ) ); + } + }; + + static NamesArray theArray; + + // Yes, return array by value + return theArray.Get(); +} static struct { @@ -751,14 +769,6 @@ TagsEditor::TagsEditor(wxWindow * parent, { SetName(GetTitle()); - names[0] = LABEL_ARTIST; - names[1] = LABEL_TITLE; - names[2] = LABEL_ALBUM; - names[3] = LABEL_TRACK; - names[4] = LABEL_YEAR; - names[5] = LABEL_GENRE; - names[6] = LABEL_COMMENTS; - labelmap[0].label = LABEL_ARTIST; labelmap[1].label = LABEL_TITLE; labelmap[2].label = LABEL_ALBUM; @@ -858,7 +868,7 @@ void TagsEditor::PopulateOrExchange(ShuttleGui & S) mGrid->SetColLabelSize(mGrid->GetDefaultRowSize()); - wxArrayString cs(WXSIZEOF(names), names); + wxArrayString cs(names()); // Build the initial (empty) grid mGrid->CreateGrid(0, 2); diff --git a/src/effects/NoiseReduction.cpp b/src/effects/NoiseReduction.cpp index 01192b3be..55bea20c4 100644 --- a/src/effects/NoiseReduction.cpp +++ b/src/effects/NoiseReduction.cpp @@ -97,9 +97,10 @@ enum DiscriminationMethod { const struct DiscriminationMethodInfo { const wxChar *name; } discriminationMethodInfo[DM_N_METHODS] = { - { _("Median") }, - { _("Second greatest") }, - { _("Old") }, + // Experimental only, don't need translations + { wxT("Median") }, + { wxT("Second greatest") }, + { wxT("Old") }, }; // magic number used only in the old statistics @@ -130,13 +131,14 @@ const struct WindowTypesInfo { // is the product of the windows' two constant terms, // plus one half the product of the first cosine coefficients. - { _("none, Hann (2.0.6 behavior)"), 2, { 1, 0, 0 }, { 0.5, -0.5, 0 }, 0.5 }, - { _("Hann, none"), 2, { 0.5, -0.5, 0 }, { 1, 0, 0 }, 0.5 }, - { _("Hann, Hann (default)"), 4, { 0.5, -0.5, 0 }, { 0.5, -0.5, 0 }, 0.375 }, - { _("Blackman, Hann"), 4, { 0.42, -0.5, 0.08 }, { 0.5, -0.5, 0 }, 0.335 }, - { _("Hamming, none"), 2, { 0.54, -0.46, 0.0 }, { 1, 0, 0 }, 0.54 }, - { _("Hamming, Hann"), 4, { 0.54, -0.46, 0.0 }, { 0.5, -0.5, 0 }, 0.385 }, - { _("Hamming, Reciprocal Hamming"), 2, { 0.54, -0.46, 0.0 }, { 1, 0, 0 }, 1.0 }, // output window is special + // Experimental only, don't need translations + { wxT("none, Hann (2.0.6 behavior)"), 2, { 1, 0, 0 }, { 0.5, -0.5, 0 }, 0.5 }, + { wxT("Hann, none"), 2, { 0.5, -0.5, 0 }, { 1, 0, 0 }, 0.5 }, + { wxT("Hann, Hann (default)"), 4, { 0.5, -0.5, 0 }, { 0.5, -0.5, 0 }, 0.375 }, + { wxT("Blackman, Hann"), 4, { 0.42, -0.5, 0.08 }, { 0.5, -0.5, 0 }, 0.335 }, + { wxT("Hamming, none"), 2, { 0.54, -0.46, 0.0 }, { 1, 0, 0 }, 0.54 }, + { wxT("Hamming, Hann"), 4, { 0.54, -0.46, 0.0 }, { 0.5, -0.5, 0 }, 0.385 }, + { wxT("Hamming, Reciprocal Hamming"), 2, { 0.54, -0.46, 0.0 }, { 1, 0, 0 }, 1.0 }, // output window is special }; enum { diff --git a/src/export/ExportFFmpeg.cpp b/src/export/ExportFFmpeg.cpp index fd57fdff7..a3f7e9dba 100644 --- a/src/export/ExportFFmpeg.cpp +++ b/src/export/ExportFFmpeg.cpp @@ -223,7 +223,7 @@ ExportFFmpeg::ExportFFmpeg() } SetMaxChannels(ExportFFmpegOptions::fmts[newfmt].maxchannels,fmtindex); - SetDescription(ExportFFmpegOptions::fmts[newfmt].description,fmtindex); + SetDescription(ExportFFmpegOptions::fmts[newfmt].Description(), fmtindex); int canmeta = ExportFFmpegOptions::fmts[newfmt].canmetadata; if (canmeta && (canmeta == AV_VERSION_INT(-1,-1,-1) || canmeta <= avfver)) @@ -872,8 +872,8 @@ ProgressResult ExportFFmpeg::Export(AudacityProject *project, { ProgressDialog progress(wxFileName(fName).GetName(), selectionOnly ? - wxString::Format(_("Exporting selected audio as %s"), ExportFFmpegOptions::fmts[mSubFormat].description) : - wxString::Format(_("Exporting entire file as %s"), ExportFFmpegOptions::fmts[mSubFormat].description)); + wxString::Format(_("Exporting selected audio as %s"), ExportFFmpegOptions::fmts[mSubFormat].Description()) : + wxString::Format(_("Exporting entire file as %s"), ExportFFmpegOptions::fmts[mSubFormat].Description())); while (updateResult == ProgressResult::Success) { auto pcmNumSamples = mixer->Process(pcmBufferSize); diff --git a/src/export/ExportFFmpegDialogs.cpp b/src/export/ExportFFmpegDialogs.cpp index b7a369c20..8619a5e29 100644 --- a/src/export/ExportFFmpegDialogs.cpp +++ b/src/export/ExportFFmpegDialogs.cpp @@ -61,6 +61,7 @@ #include "../Prefs.h" #include "../Project.h" #include "../Tags.h" +#include "../TranslatableStringArray.h" #include "Export.h" @@ -1191,23 +1192,44 @@ int ExportFFmpegOptions::iAACProfileValues[] = { }; /// Names of AAC profiles to be displayed -const wxChar *ExportFFmpegOptions::iAACProfileNames[] = { - _("LC"), - _("Main"), - /*_("SSR"),*/ //SSR is not supported - _("LTP") -}; +static wxString iAACProfileNames(int index) +{ + static const wxString names[] = { + XO("LC"), + XO("Main"), + /*_("SSR"),*/ //SSR is not supported + XO("LTP") + }; + + class NamesArray final : public TranslatableStringArray + { + void Populate() override + { + for (auto &name : names) + mContents.push_back( wxGetTranslation( name ) ); + } + }; + + static NamesArray theArray; + + return theArray.Get()[ index ]; +} /// List of export types ExposedFormat ExportFFmpegOptions::fmts[] = { - {FMT_M4A, wxT("M4A"), wxT("m4a"), wxT("ipod"), 48, AV_VERSION_INT(-1,-1,-1), true, _("M4A (AAC) Files (FFmpeg)"), AV_CODEC_ID_AAC, true}, - {FMT_AC3, wxT("AC3"), wxT("ac3"), wxT("ac3"), 7, AV_VERSION_INT(0,0,0), false, _("AC3 Files (FFmpeg)"), AV_CODEC_ID_AC3, true}, - {FMT_AMRNB, wxT("AMRNB"), wxT("amr"), wxT("amr"), 1, AV_VERSION_INT(0,0,0), false, _("AMR (narrow band) Files (FFmpeg)"), AV_CODEC_ID_AMR_NB, true}, - {FMT_WMA2, wxT("WMA"), wxT("wma"), wxT("asf"), 2, AV_VERSION_INT(52,53,0), false, _("WMA (version 2) Files (FFmpeg)"), AV_CODEC_ID_WMAV2, true}, - {FMT_OTHER, wxT("FFMPEG"), wxT(""), wxT(""), 255, AV_VERSION_INT(-1,-1,-1), true, _("Custom FFmpeg Export"), AV_CODEC_ID_NONE, true} + {FMT_M4A, wxT("M4A"), wxT("m4a"), wxT("ipod"), 48, AV_VERSION_INT(-1,-1,-1), true, XO("M4A (AAC) Files (FFmpeg)"), AV_CODEC_ID_AAC, true}, + {FMT_AC3, wxT("AC3"), wxT("ac3"), wxT("ac3"), 7, AV_VERSION_INT(0,0,0), false, XO("AC3 Files (FFmpeg)"), AV_CODEC_ID_AC3, true}, + {FMT_AMRNB, wxT("AMRNB"), wxT("amr"), wxT("amr"), 1, AV_VERSION_INT(0,0,0), false, XO("AMR (narrow band) Files (FFmpeg)"), AV_CODEC_ID_AMR_NB, true}, + {FMT_WMA2, wxT("WMA"), wxT("wma"), wxT("asf"), 2, AV_VERSION_INT(52,53,0), false, XO("WMA (version 2) Files (FFmpeg)"), AV_CODEC_ID_WMAV2, true}, + {FMT_OTHER, wxT("FFMPEG"), wxT(""), wxT(""), 255, AV_VERSION_INT(-1,-1,-1), true, XO("Custom FFmpeg Export"), AV_CODEC_ID_NONE, true} }; +wxString ExposedFormat::Description() const +{ + return wxGetTranslation(description_); +} + /// Sample rates supported by AAC encoder (must end with zero-element) const int ExportFFmpegOptions::iAACSampleRates[] = { 7350, 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, 64000, 88200, 0 }; @@ -1297,7 +1319,31 @@ ApplicableFor ExportFFmpegOptions::apptable[] = }; /// Prediction order method - names. Labels are indices of this array. -const wxChar *ExportFFmpegOptions::PredictionOrderMethodNames[] = { _("Estimate"), _("2-level"), _("4-level"), _("8-level"), _("Full search"), _("Log search")}; +static wxString PredictionOrderMethodNames(int index) +{ + static const wxString names[] = { + XO("Estimate"), + XO("2-level"), + XO("4-level"), + XO("8-level"), + XO("Full search"), + XO("Log search") + }; + + class NamesArray final : public TranslatableStringArray + { + void Populate() override + { + for (auto &name : names) + mContents.push_back( wxGetTranslation( name ) ); + } + }; + + static NamesArray theArray; + + return theArray.Get()[ index ]; +} + ExportFFmpegOptions::~ExportFFmpegOptions() @@ -1325,12 +1371,12 @@ ExportFFmpegOptions::ExportFFmpegOptions(wxWindow *parent) for (unsigned int i = 0; i < 6; i++) { mPredictionOrderMethodLabels.Add(i); - mPredictionOrderMethodNames.Add(wxString::Format(wxT("%s"),PredictionOrderMethodNames[i])); + mPredictionOrderMethodNames.Add(wxString::Format(wxT("%s"),PredictionOrderMethodNames(i))); } for (unsigned int i=0; i < (sizeof(iAACProfileValues)/sizeof(int)); i++) { - mProfileNames.Add(wxString::Format(wxT("%s"),iAACProfileNames[i])); + mProfileNames.Add(wxString::Format(wxT("%s"),iAACProfileNames(i))); mProfileLabels.Add(iAACProfileValues[i]); } diff --git a/src/export/ExportFFmpegDialogs.h b/src/export/ExportFFmpegDialogs.h index 9b3d90227..6370d318e 100644 --- a/src/export/ExportFFmpegDialogs.h +++ b/src/export/ExportFFmpegDialogs.h @@ -44,9 +44,11 @@ struct ExposedFormat unsigned maxchannels; //!< how many channels this format could handle int canmetadata; //!< !=0 if format supports metadata, -1 any avformat version, otherwise version support added bool canutf8; //!< true if format supports metadata in UTF-8, false otherwise - const wxChar *description; //!< format description (will be shown in export dialog) + const wxChar *description_; //!< format description (will be shown in export dialog) (untranslated!) AVCodecID codecid; //!< codec ID (see libavcodec/avcodec.h) bool compiledIn; //!< support for this codec/format is compiled in (checked at runtime) + + wxString Description() const; // get translation }; @@ -199,11 +201,9 @@ public: // Static tables static CompatibilityEntry CompatibilityList[]; static int iAACProfileValues[]; - static const wxChar *iAACProfileNames[]; static ExposedFormat fmts[]; static const int iAACSampleRates[]; static ApplicableFor apptable[]; - static const wxChar *PredictionOrderMethodNames[]; private: diff --git a/src/widgets/NumericTextCtrl.cpp b/src/widgets/NumericTextCtrl.cpp index 0ff630509..75e15ee02 100644 --- a/src/widgets/NumericTextCtrl.cpp +++ b/src/widgets/NumericTextCtrl.cpp @@ -197,6 +197,20 @@ different formats. * Used in an array to hold the built-in time formats that are always available * to the user */ struct BuiltinFormatString +{ + wxString name; + wxString formatStr; +}; + +// +// ---------------------------------------------------------------------------- +// UntranslatedBuiltinFormatString Struct +// ---------------------------------------------------------------------------- +// +/** \brief struct to hold a formatting control string and its untranslated name + * Used in an array to hold the built-in time formats that are always available + * to the user */ +struct UntranslatedBuiltinFormatString { wxString name; wxString formatStr; @@ -282,74 +296,74 @@ const std::vector &TimeConverterFormats() { * array of string pairs for name of the format and the format string * needed to create that format output. This is used for the pop-up * list of formats to choose from in the control. */ -static const BuiltinFormatString TimeConverterFormats_[] = { +static const UntranslatedBuiltinFormatString TimeConverterFormats_[] = { { /* i18n-hint: Name of time display format that shows time in seconds */ - _("seconds"), + XO("seconds"), /* i18n-hint: Format string for displaying time in seconds. Change the comma * in the middle to the 1000s separator for your locale, and the 'seconds' * on the end to the word for seconds. Don't change the numbers. */ - _("01000,01000 seconds") + XO("01000,01000 seconds") }, { /* i18n-hint: Name of time display format that shows time in hours, minutes * and seconds */ - _("hh:mm:ss"), + XO("hh:mm:ss"), /* i18n-hint: Format string for displaying time in hours, minutes and * seconds. Change the 'h' to the abbreviation for hours, 'm' to the * abbreviation for minutes and 's' to the abbreviation for seconds. Don't * change the numbers unless there aren't 60 seconds in a minute in your * locale */ - _("0100 h 060 m 060 s") + XO("0100 h 060 m 060 s") }, { /* i18n-hint: Name of time display format that shows time in days, hours, * minutes and seconds */ - _("dd:hh:mm:ss"), + XO("dd:hh:mm:ss"), /* i18n-hint: Format string for displaying time in days, hours, minutes and * seconds. Change the 'days' to the word for days, 'h' to the abbreviation * for hours, 'm' to the abbreviation for minutes and 's' to the * abbreviation for seconds. Don't change the numbers unless there aren't * 24 hours in a day in your locale */ - _("0100 days 024 h 060 m 060 s") + XO("0100 days 024 h 060 m 060 s") }, { /* i18n-hint: Name of time display format that shows time in hours, * minutes, seconds and hundredths of a second (1/100 second) */ - _("hh:mm:ss + hundredths"), + XO("hh:mm:ss + hundredths"), /* i18n-hint: Format string for displaying time in hours, minutes, seconds * and hundredths of a second. Change the 'h' to the abbreviation for hours, * 'm' to the abbreviation for minutes and 's' to the abbreviation for seconds * (the hundredths are shown as decimal seconds) . Don't change the numbers * unless there aren't 60 minutes in an hour in your locale */ - _("0100 h 060 m 060.0100 s") + XO("0100 h 060 m 060.0100 s") }, { /* i18n-hint: Name of time display format that shows time in hours, * minutes, seconds and milliseconds (1/1000 second) */ - _("hh:mm:ss + milliseconds"), + XO("hh:mm:ss + milliseconds"), /* i18n-hint: Format string for displaying time in hours, minutes, seconds * and milliseconds. Change the 'h' to the abbreviation for hours, 'm' to the * abbreviation for minutes and 's' to the abbreviation for seconds (the * milliseconds are shown as decimal seconds) . Don't change the numbers * unless there aren't 60 minutes in an hour in your locale */ - _("0100 h 060 m 060.01000 s") + XO("0100 h 060 m 060.01000 s") }, { /* i18n-hint: Name of time display format that shows time in hours, * minutes, seconds and samples (at the current project sample rate) */ - _("hh:mm:ss + samples"), + XO("hh:mm:ss + samples"), /* i18n-hint: Format string for displaying time in hours, minutes, seconds * and samples. Change the 'h' to the abbreviation for hours, 'm' to the * abbreviation for minutes, 's' to the abbreviation for seconds and * translate samples . Don't change the numbers * unless there aren't 60 seconds in a minute in your locale */ - _("0100 h 060 m 060 s+.# samples") + XO("0100 h 060 m 060 s+.# samples") }, { @@ -357,116 +371,116 @@ static const BuiltinFormatString TimeConverterFormats_[] = { * current project sample rate). For example the number of a sample at 1 * second into a recording at 44.1KHz would be 44,100. */ - _("samples"), + XO("samples"), /* i18n-hint: Format string for displaying time in samples (lots of samples). * Change the ',' to the 1000s separator for your locale, and translate * samples. If 1000s aren't a base multiple for your number system, then you * can change the numbers to an appropriate one, and put a 0 on the front */ - _("01000,01000,01000 samples|#") + XO("01000,01000,01000 samples|#") }, { /* i18n-hint: Name of time display format that shows time in hours, minutes, * seconds and frames at 24 frames per second (commonly used for films) */ - _("hh:mm:ss + film frames (24 fps)"), + XO("hh:mm:ss + film frames (24 fps)"), /* i18n-hint: Format string for displaying time in hours, minutes, seconds * and frames at 24 frames per second. Change the 'h' to the abbreviation * for hours, 'm' to the abbreviation for minutes, 's' to the abbreviation * for seconds and translate 'frames' . Don't change the numbers * unless there aren't 60 seconds in a minute in your locale */ - _("0100 h 060 m 060 s+.24 frames") + XO("0100 h 060 m 060 s+.24 frames") }, { /* i18n-hint: Name of time display format that shows time in frames (lots of * frames) at 24 frames per second (commonly used for films) */ - _("film frames (24 fps)"), + XO("film frames (24 fps)"), /* i18n-hint: Format string for displaying time in frames at 24 frames per * second. Change the comma * in the middle to the 1000s separator for your locale, * translate 'frames' and leave the rest alone */ - _("01000,01000 frames|24") + XO("01000,01000 frames|24") }, { /* i18n-hint: Name of time display format that shows time in hours, minutes, * seconds and frames at NTSC TV drop-frame rate (used for American / * Japanese TV, and very odd) */ - _("hh:mm:ss + NTSC drop frames"), + XO("hh:mm:ss + NTSC drop frames"), /* i18n-hint: Format string for displaying time in hours, minutes, seconds * and frames with NTSC drop frames. Change the 'h' to the abbreviation * for hours, 'm' to the abbreviation for minutes, 's' to the abbreviation * for seconds and translate 'frames'. Leave the |N alone, it's important! */ - _("0100 h 060 m 060 s+.30 frames|N") + XO("0100 h 060 m 060 s+.30 frames|N") }, { /* i18n-hint: Name of time display format that shows time in hours, minutes, * seconds and frames at NTSC TV non-drop-frame rate (used for American / * Japanese TV, and doesn't quite match wall time */ - _("hh:mm:ss + NTSC non-drop frames"), + XO("hh:mm:ss + NTSC non-drop frames"), /* i18n-hint: Format string for displaying time in hours, minutes, seconds * and frames with NTSC drop frames. Change the 'h' to the abbreviation * for hours, 'm' to the abbreviation for minutes, 's' to the abbreviation * for seconds and translate 'frames'. Leave the | .999000999 alone, * the whole things really is slightly off-speed! */ - _("0100 h 060 m 060 s+.030 frames| .999000999") + XO("0100 h 060 m 060 s+.030 frames| .999000999") }, { /* i18n-hint: Name of time display format that shows time in frames at NTSC * TV frame rate (used for American / Japanese TV */ - _("NTSC frames"), + XO("NTSC frames"), /* i18n-hint: Format string for displaying time in frames with NTSC frames. * Change the comma * in the middle to the 1000s separator for your locale, * translate 'frames' and leave the rest alone. That really is the frame * rate! */ - _("01000,01000 frames|29.97002997") + XO("01000,01000 frames|29.97002997") }, { /* i18n-hint: Name of time display format that shows time in hours, minutes, * seconds and frames at PAL TV frame rate (used for European TV) */ - _("hh:mm:ss + PAL frames (25 fps)"), + XO("hh:mm:ss + PAL frames (25 fps)"), /* i18n-hint: Format string for displaying time in hours, minutes, seconds * and frames with PAL TV frames. Change the 'h' to the abbreviation * for hours, 'm' to the abbreviation for minutes, 's' to the abbreviation * for seconds and translate 'frames'. Nice simple time code! */ - _("0100 h 060 m 060 s+.25 frames") + XO("0100 h 060 m 060 s+.25 frames") }, { /* i18n-hint: Name of time display format that shows time in frames at PAL * TV frame rate (used for European TV) */ - _("PAL frames (25 fps)"), + XO("PAL frames (25 fps)"), /* i18n-hint: Format string for displaying time in frames with NTSC frames. * Change the comma * in the middle to the 1000s separator for your locale, * translate 'frames' and leave the rest alone. */ - _("01000,01000 frames|25") + XO("01000,01000 frames|25") }, { /* i18n-hint: Name of time display format that shows time in hours, minutes, * seconds and frames at CD Audio frame rate (75 frames per second) */ - _("hh:mm:ss + CDDA frames (75 fps)"), + XO("hh:mm:ss + CDDA frames (75 fps)"), /* i18n-hint: Format string for displaying time in hours, minutes, seconds * and frames with CD Audio frames. Change the 'h' to the abbreviation * for hours, 'm' to the abbreviation for minutes, 's' to the abbreviation * for seconds and translate 'frames'. */ - _("0100 h 060 m 060 s+.75 frames") + XO("0100 h 060 m 060 s+.75 frames") }, { /* i18n-hint: Name of time display format that shows time in frames at CD * Audio frame rate (75 frames per second) */ - _("CDDA frames (75 fps)"), + XO("CDDA frames (75 fps)"), /* i18n-hint: Format string for displaying time in frames with CD Audio * frames. Change the comma * in the middle to the 1000s separator for your locale, * translate 'frames' and leave the rest alone */ - _("01000,01000 frames|75") + XO("01000,01000 frames|75") }, }; @@ -491,20 +505,20 @@ const std::vector &FrequencyConverterFormats() { * array of string pairs for name of the format and the format string * needed to create that format output. This is used for the pop-up * list of formats to choose from in the control. */ -static const BuiltinFormatString FrequencyConverterFormats_[] = { +static const UntranslatedBuiltinFormatString FrequencyConverterFormats_[] = { /* i18n-hint: Name of display format that shows frequency in hertz */ { - _("Hz"), + XO("Hz"), /* i18n-hint: Format string for displaying frequency in hertz. Change * the decimal point for your locale. Don't change the numbers. */ - _("0100000.0100 Hz") + XO("0100000.0100 Hz") }, { - _("kHz"), + XO("kHz"), /* i18n-hint: Format string for displaying frequency in kilohertz. Change * the decimal point for your locale. Don't change the numbers. */ - _("01000.01000 kHz|0.001") + XO("01000.01000 kHz|0.001") }, }; @@ -529,36 +543,36 @@ const std::vector &BandwidthConverterFormats() { * array of string pairs for name of the format and the format string * needed to create that format output. This is used for the pop-up * list of formats to choose from in the control. */ -static const BuiltinFormatString BandwidthConverterFormats_[] = { +static const UntranslatedBuiltinFormatString BandwidthConverterFormats_[] = { { /* i18n-hint: Name of display format that shows log of frequency * in octaves */ - _("octaves"), + XO("octaves"), /* i18n-hint: Format string for displaying log of frequency in octaves. * Change the decimal points for your locale. Don't change the numbers. */ // Scale factor is 1 / ln (2) - _("100.01000 octaves|1.442695041") + XO("100.01000 octaves|1.442695041") }, { /* i18n-hint: Name of display format that shows log of frequency * in semitones and cents */ - _("semitones + cents"), + XO("semitones + cents"), /* i18n-hint: Format string for displaying log of frequency in semitones * and cents. * Change the decimal points for your locale. Don't change the numbers. */ // Scale factor is 12 / ln (2) - _("1000 semitones .0100 cents|17.312340491") + XO("1000 semitones .0100 cents|17.312340491") }, { /* i18n-hint: Name of display format that shows log of frequency * in decades */ - _("decades"), + XO("decades"), /* i18n-hint: Format string for displaying log of frequency in decades. * Change the decimal points for your locale. Don't change the numbers. */ // Scale factor is 1 / ln (10) - _("10.01000 decades|0.434294482") + XO("10.01000 decades|0.434294482") }, };