| @@ -173,9 +173,9 @@ FileBasedDocument::SaveResult OpenDocumentManager::saveIfNeededAndUserAgrees (Op | |||||
| TRANS("Closing document..."), | TRANS("Closing document..."), | ||||
| TRANS("Do you want to save the changes to \"") | TRANS("Do you want to save the changes to \"") | ||||
| + doc->getName() + "\"?", | + doc->getName() + "\"?", | ||||
| TRANS("save"), | |||||
| TRANS("discard changes"), | |||||
| TRANS("cancel")); | |||||
| TRANS("Save"), | |||||
| TRANS("Discard changes"), | |||||
| TRANS("Cancel")); | |||||
| if (r == 1) // save changes | if (r == 1) // save changes | ||||
| return doc->save() ? FileBasedDocument::savedOk | return doc->save() ? FileBasedDocument::savedOk | ||||
| @@ -714,16 +714,19 @@ static void addFileWithGroups (Project::Item& group, const RelativePath& file, c | |||||
| } | } | ||||
| } | } | ||||
| void LibraryModule::findBrowseableFiles (const File& localModuleFolder, Array<File>& filesFound) const | |||||
| { | |||||
| const var filesArray (moduleInfo ["browse"]); | |||||
| const Array<var>* const files = filesArray.getArray(); | |||||
| for (int i = 0; i < files->size(); ++i) | |||||
| findWildcardMatches (localModuleFolder, files->getReference(i), filesFound); | |||||
| } | |||||
| void LibraryModule::addBrowsableCode (ProjectExporter& exporter, const Array<File>& compiled, const File& localModuleFolder) const | void LibraryModule::addBrowsableCode (ProjectExporter& exporter, const Array<File>& compiled, const File& localModuleFolder) const | ||||
| { | { | ||||
| if (sourceFiles.size() == 0) | if (sourceFiles.size() == 0) | ||||
| { | |||||
| const var filesArray (moduleInfo ["browse"]); | |||||
| const Array<var>* const files = filesArray.getArray(); | |||||
| for (int i = 0; i < files->size(); ++i) | |||||
| findWildcardMatches (localModuleFolder, files->getReference(i), sourceFiles); | |||||
| } | |||||
| findBrowseableFiles (localModuleFolder, sourceFiles); | |||||
| Project::Item sourceGroup (Project::Item::createGroup (exporter.getProject(), getID(), "__mainsourcegroup" + getID())); | Project::Item sourceGroup (Project::Item::createGroup (exporter.getProject(), getID(), "__mainsourcegroup" + getID())); | ||||
| @@ -51,6 +51,7 @@ public: | |||||
| void createPropertyEditors (ProjectExporter&, PropertyListBuilder&) const; | void createPropertyEditors (ProjectExporter&, PropertyListBuilder&) const; | ||||
| void getConfigFlags (Project&, OwnedArray<Project::ConfigFlag>& flags) const; | void getConfigFlags (Project&, OwnedArray<Project::ConfigFlag>& flags) const; | ||||
| void getLocalCompiledFiles (const File& localModuleFolder, Array<File>& files) const; | void getLocalCompiledFiles (const File& localModuleFolder, Array<File>& files) const; | ||||
| void findBrowseableFiles (const File& localModuleFolder, Array<File>& files) const; | |||||
| File getLocalFolderFor (Project&) const; | File getLocalFolderFor (Project&) const; | ||||
| static String getInfoFileName() { return "juce_module_info"; } | static String getInfoFileName() { return "juce_module_info"; } | ||||
| @@ -355,7 +355,7 @@ private: | |||||
| bool doNextScan() | bool doNextScan() | ||||
| { | { | ||||
| progressMessage = TRANS("Testing:\n\n") + scanner->getNextPluginFileThatWillBeScanned(); | |||||
| progressMessage = TRANS("Testing") + ":\n\n" + scanner->getNextPluginFileThatWillBeScanned(); | |||||
| if (scanner->scanNextFile (true)) | if (scanner->scanNextFile (true)) | ||||
| { | { | ||||
| @@ -419,6 +419,7 @@ void PluginListComponent::scanFinished (const StringArray& failedFiles) | |||||
| if (shortNames.size() > 0) | if (shortNames.size() > 0) | ||||
| AlertWindow::showMessageBoxAsync (AlertWindow::InfoIcon, | AlertWindow::showMessageBoxAsync (AlertWindow::InfoIcon, | ||||
| TRANS("Scan complete"), | TRANS("Scan complete"), | ||||
| TRANS("Note that the following files appeared to be plugin files, but failed to load correctly:\n\n") | |||||
| TRANS("Note that the following files appeared to be plugin files, but failed to load correctly") | |||||
| + ":\n\n" | |||||
| + shortNames.joinIntoString (", ")); | + shortNames.joinIntoString (", ")); | ||||
| } | } | ||||
| @@ -70,7 +70,6 @@ class AudioDeviceSelectorComponent::MidiInputSelectorComponentListBox : public | |||||
| private ListBoxModel | private ListBoxModel | ||||
| { | { | ||||
| public: | public: | ||||
| //============================================================================== | |||||
| MidiInputSelectorComponentListBox (AudioDeviceManager& deviceManager_, | MidiInputSelectorComponentListBox (AudioDeviceManager& deviceManager_, | ||||
| const String& noItemsMessage_, | const String& noItemsMessage_, | ||||
| const int minNumber_, | const int minNumber_, | ||||
| @@ -193,6 +192,7 @@ struct AudioDeviceSetupDetails | |||||
| bool useStereoPairs; | bool useStereoPairs; | ||||
| }; | }; | ||||
| static String getNoDeviceString() { return "<< " + TRANS("none") + " >>"); } | |||||
| //============================================================================== | //============================================================================== | ||||
| class AudioDeviceSettingsPanel : public Component, | class AudioDeviceSettingsPanel : public Component, | ||||
| @@ -515,7 +515,7 @@ private: | |||||
| for (int i = 0; i < devs.size(); ++i) | for (int i = 0; i < devs.size(); ++i) | ||||
| combo.addItem (devs[i], i + 1); | combo.addItem (devs[i], i + 1); | ||||
| combo.addItem (TRANS("<< none >>"), -1); | |||||
| combo.addItem (getNoDeviceString(), -1); | |||||
| combo.setSelectedId (-1, true); | combo.setSelectedId (-1, true); | ||||
| } | } | ||||
| @@ -959,7 +959,7 @@ AudioDeviceSelectorComponent::AudioDeviceSelectorComponent (AudioDeviceManager& | |||||
| { | { | ||||
| addAndMakeVisible (midiInputsList | addAndMakeVisible (midiInputsList | ||||
| = new MidiInputSelectorComponentListBox (deviceManager, | = new MidiInputSelectorComponentListBox (deviceManager, | ||||
| TRANS("(No MIDI inputs available)"), | |||||
| "(" + TRANS("No MIDI inputs available") + ")", | |||||
| 0, 0)); | 0, 0)); | ||||
| midiInputsLabel = new Label (String::empty, TRANS ("Active MIDI inputs:")); | midiInputsLabel = new Label (String::empty, TRANS ("Active MIDI inputs:")); | ||||
| @@ -1102,7 +1102,7 @@ void AudioDeviceSelectorComponent::updateAllControls() | |||||
| const StringArray midiOuts (MidiOutput::getDevices()); | const StringArray midiOuts (MidiOutput::getDevices()); | ||||
| midiOutputSelector->addItem (TRANS("<< none >>"), -1); | |||||
| midiOutputSelector->addItem (getNoDeviceString(), -1); | |||||
| midiOutputSelector->addSeparator(); | midiOutputSelector->addSeparator(); | ||||
| for (int i = 0; i < midiOuts.size(); ++i) | for (int i = 0; i < midiOuts.size(); ++i) | ||||
| @@ -109,7 +109,7 @@ public: | |||||
| /** Returns the currently selected set of mappings. | /** Returns the currently selected set of mappings. | ||||
| This is the object that was last passed to setCurrentMappings(). It may | This is the object that was last passed to setCurrentMappings(). It may | ||||
| be 0 if none has been created. | |||||
| be nullptr if none has been created. | |||||
| */ | */ | ||||
| static LocalisedStrings* getCurrentMappings(); | static LocalisedStrings* getCurrentMappings(); | ||||
| @@ -195,6 +195,15 @@ private: | |||||
| #define TRANS(stringLiteral) juce::translate (stringLiteral) | #define TRANS(stringLiteral) juce::translate (stringLiteral) | ||||
| #endif | #endif | ||||
| /** A dummy version of the TRANS macro, used to indicate a string literal that should be | |||||
| added to the translation file by source-code scanner tools. | |||||
| Wrapping a string literal in this macro has no effect, but by using it around strings | |||||
| that your app needs to translate at a later stage, it lets automatic code-scanning tools | |||||
| find this string and add it to the list of strings that need translation. | |||||
| */ | |||||
| #define NEEDS_TRANS(stringLiteral) (stringLiteral) | |||||
| /** Uses the LocalisedStrings class to translate the given string literal. | /** Uses the LocalisedStrings class to translate the given string literal. | ||||
| @see LocalisedStrings | @see LocalisedStrings | ||||
| */ | */ | ||||
| @@ -61,6 +61,13 @@ bool operator>= (const RelativeTime& t1, const RelativeTime& t2) noexcept | |||||
| bool operator<= (const RelativeTime& t1, const RelativeTime& t2) noexcept { return t1.inSeconds() <= t2.inSeconds(); } | bool operator<= (const RelativeTime& t1, const RelativeTime& t2) noexcept { return t1.inSeconds() <= t2.inSeconds(); } | ||||
| //============================================================================== | //============================================================================== | ||||
| static void translateTimeField (String& result, int n, const char* singular, const char* plural) | |||||
| { | |||||
| result << TRANS (n == 1 ? singular : plural) | |||||
| .replace (n == 1 ? "1" : "2", String (n)) | |||||
| << ' '; | |||||
| } | |||||
| String RelativeTime::getDescription (const String& returnValueForZeroTime) const | String RelativeTime::getDescription (const String& returnValueForZeroTime) const | ||||
| { | { | ||||
| if (seconds < 0.001 && seconds > -0.001) | if (seconds < 0.001 && seconds > -0.001) | ||||
| @@ -76,16 +83,14 @@ String RelativeTime::getDescription (const String& returnValueForZeroTime) const | |||||
| int n = std::abs ((int) inWeeks()); | int n = std::abs ((int) inWeeks()); | ||||
| if (n > 0) | if (n > 0) | ||||
| { | { | ||||
| result << n << TRANS (n == 1 ? " week " | |||||
| : " weeks "); | |||||
| translateTimeField (result, n, NEEDS_TRANS("1 week"), NEEDS_TRANS("2 weeks")); | |||||
| ++fieldsShown; | ++fieldsShown; | ||||
| } | } | ||||
| n = std::abs ((int) inDays()) % 7; | n = std::abs ((int) inDays()) % 7; | ||||
| if (n > 0) | if (n > 0) | ||||
| { | { | ||||
| result << n << TRANS (n == 1 ? " day " | |||||
| : " days "); | |||||
| translateTimeField (result, n, NEEDS_TRANS("1 day"), NEEDS_TRANS("2 days")); | |||||
| ++fieldsShown; | ++fieldsShown; | ||||
| } | } | ||||
| @@ -94,8 +99,7 @@ String RelativeTime::getDescription (const String& returnValueForZeroTime) const | |||||
| n = std::abs ((int) inHours()) % 24; | n = std::abs ((int) inHours()) % 24; | ||||
| if (n > 0) | if (n > 0) | ||||
| { | { | ||||
| result << n << TRANS (n == 1 ? " hr " | |||||
| : " hrs "); | |||||
| translateTimeField (result, n, NEEDS_TRANS("1 hr"), NEEDS_TRANS("2 hrs")); | |||||
| ++fieldsShown; | ++fieldsShown; | ||||
| } | } | ||||
| @@ -104,8 +108,7 @@ String RelativeTime::getDescription (const String& returnValueForZeroTime) const | |||||
| n = std::abs ((int) inMinutes()) % 60; | n = std::abs ((int) inMinutes()) % 60; | ||||
| if (n > 0) | if (n > 0) | ||||
| { | { | ||||
| result << n << TRANS (n == 1 ? " min " | |||||
| : " mins "); | |||||
| translateTimeField (result, n, NEEDS_TRANS("1 min"), NEEDS_TRANS("2 mins")); | |||||
| ++fieldsShown; | ++fieldsShown; | ||||
| } | } | ||||
| @@ -114,8 +117,7 @@ String RelativeTime::getDescription (const String& returnValueForZeroTime) const | |||||
| n = std::abs ((int) inSeconds()) % 60; | n = std::abs ((int) inSeconds()) % 60; | ||||
| if (n > 0) | if (n > 0) | ||||
| { | { | ||||
| result << n << TRANS (n == 1 ? " sec " | |||||
| : " secs "); | |||||
| translateTimeField (result, n, NEEDS_TRANS("1 sec"), NEEDS_TRANS("2 secs")); | |||||
| ++fieldsShown; | ++fieldsShown; | ||||
| } | } | ||||
| @@ -123,7 +125,7 @@ String RelativeTime::getDescription (const String& returnValueForZeroTime) const | |||||
| { | { | ||||
| n = std::abs ((int) inMilliseconds()) % 1000; | n = std::abs ((int) inMilliseconds()) % 1000; | ||||
| if (n > 0) | if (n > 0) | ||||
| result << n << TRANS (" ms"); | |||||
| result << n << ' ' << TRANS ("ms"); | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -102,7 +102,7 @@ FileBrowserComponent::FileBrowserComponent (int flags_, | |||||
| addAndMakeVisible (goUpButton = getLookAndFeel().createFileBrowserGoUpButton()); | addAndMakeVisible (goUpButton = getLookAndFeel().createFileBrowserGoUpButton()); | ||||
| goUpButton->addListener (this); | goUpButton->addListener (this); | ||||
| goUpButton->setTooltip (TRANS ("go up to parent directory")); | |||||
| goUpButton->setTooltip (TRANS ("Go up to parent directory")); | |||||
| if (previewComp != nullptr) | if (previewComp != nullptr) | ||||
| addAndMakeVisible (previewComp); | addAndMakeVisible (previewComp); | ||||
| @@ -523,7 +523,7 @@ void FileBrowserComponent::getRoots (StringArray& rootNames, StringArray& rootPa | |||||
| } | } | ||||
| else if (drive.isOnCDRomDrive()) | else if (drive.isOnCDRomDrive()) | ||||
| { | { | ||||
| name << TRANS(" [CD/DVD drive]"); | |||||
| name << " [" << TRANS("CD/DVD drive") << ']'; | |||||
| } | } | ||||
| rootNames.add (name); | rootNames.add (name); | ||||
| @@ -209,12 +209,13 @@ void FileChooserDialogBox::okButtonPressed() | |||||
| && content->chooserComponent.getSelectedFile(0).exists()) | && content->chooserComponent.getSelectedFile(0).exists()) | ||||
| { | { | ||||
| AlertWindow::showOkCancelBox (AlertWindow::WarningIcon, | AlertWindow::showOkCancelBox (AlertWindow::WarningIcon, | ||||
| TRANS("File already exists"), | |||||
| TRANS("There's already a file called:") | |||||
| + "\n\n" + content->chooserComponent.getSelectedFile(0).getFullPathName() | |||||
| + "\n\n" + TRANS("Are you sure you want to overwrite it?"), | |||||
| TRANS("overwrite"), | |||||
| TRANS("cancel"), | |||||
| TRANS("File already exists"), | |||||
| TRANS("There's already a file called: FLMN") | |||||
| .replace ("FLNM", content->chooserComponent.getSelectedFile(0).getFullPathName()) | |||||
| + "\n\n" | |||||
| + TRANS("Are you sure you want to overwrite it?"), | |||||
| TRANS("Overwrite"), | |||||
| TRANS("Cancel"), | |||||
| this, | this, | ||||
| ModalCallbackFunction::forComponent (okToOverwriteFileCallback, this)); | ModalCallbackFunction::forComponent (okToOverwriteFileCallback, this)); | ||||
| } | } | ||||
| @@ -708,8 +708,9 @@ private: | |||||
| : factory (factory_), | : factory (factory_), | ||||
| toolbar (toolbar_), | toolbar (toolbar_), | ||||
| palette (factory_, toolbar_), | palette (factory_, toolbar_), | ||||
| instructions (String::empty, TRANS ("You can drag the items above and drop them onto a toolbar to add them.\n\n" | |||||
| "Items on the toolbar can also be dragged around to change their order, or dragged off the edge to delete them.")), | |||||
| instructions (String::empty, TRANS ("You can drag the items above and drop them onto a toolbar to add them.") | |||||
| + "\n\n" | |||||
| + TRANS ("Items on the toolbar can also be dragged around to change their order, or dragged off the edge to delete them.")), | |||||
| defaultButton (TRANS ("Restore to default set of items")) | defaultButton (TRANS ("Restore to default set of items")) | ||||
| { | { | ||||
| addAndMakeVisible (&palette); | addAndMakeVisible (&palette); | ||||
| @@ -632,7 +632,7 @@ void AlertWindow::showMessageBox (AlertIconType iconType, | |||||
| else | else | ||||
| { | { | ||||
| AlertWindowInfo info (title, message, associatedComponent, iconType, 1, nullptr, true); | AlertWindowInfo info (title, message, associatedComponent, iconType, 1, nullptr, true); | ||||
| info.button1 = buttonText.isEmpty() ? TRANS("ok") : buttonText; | |||||
| info.button1 = buttonText.isEmpty() ? TRANS("OK") : buttonText; | |||||
| info.invoke(); | info.invoke(); | ||||
| } | } | ||||
| @@ -653,7 +653,7 @@ void AlertWindow::showMessageBoxAsync (AlertIconType iconType, | |||||
| else | else | ||||
| { | { | ||||
| AlertWindowInfo info (title, message, associatedComponent, iconType, 1, callback, false); | AlertWindowInfo info (title, message, associatedComponent, iconType, 1, callback, false); | ||||
| info.button1 = buttonText.isEmpty() ? TRANS("ok") : buttonText; | |||||
| info.button1 = buttonText.isEmpty() ? TRANS("OK") : buttonText; | |||||
| info.invoke(); | info.invoke(); | ||||
| } | } | ||||
| @@ -671,8 +671,8 @@ bool AlertWindow::showOkCancelBox (AlertIconType iconType, | |||||
| return NativeMessageBox::showOkCancelBox (iconType, title, message, associatedComponent, callback); | return NativeMessageBox::showOkCancelBox (iconType, title, message, associatedComponent, callback); | ||||
| AlertWindowInfo info (title, message, associatedComponent, iconType, 2, callback, callback == nullptr); | AlertWindowInfo info (title, message, associatedComponent, iconType, 2, callback, callback == nullptr); | ||||
| info.button1 = button1Text.isEmpty() ? TRANS("ok") : button1Text; | |||||
| info.button2 = button2Text.isEmpty() ? TRANS("cancel") : button2Text; | |||||
| info.button1 = button1Text.isEmpty() ? TRANS("OK") : button1Text; | |||||
| info.button2 = button2Text.isEmpty() ? TRANS("Cancel") : button2Text; | |||||
| return info.invoke() != 0; | return info.invoke() != 0; | ||||
| } | } | ||||
| @@ -690,9 +690,9 @@ int AlertWindow::showYesNoCancelBox (AlertIconType iconType, | |||||
| return NativeMessageBox::showYesNoCancelBox (iconType, title, message, associatedComponent, callback); | return NativeMessageBox::showYesNoCancelBox (iconType, title, message, associatedComponent, callback); | ||||
| AlertWindowInfo info (title, message, associatedComponent, iconType, 3, callback, callback == nullptr); | AlertWindowInfo info (title, message, associatedComponent, iconType, 3, callback, callback == nullptr); | ||||
| info.button1 = button1Text.isEmpty() ? TRANS("yes") : button1Text; | |||||
| info.button2 = button2Text.isEmpty() ? TRANS("no") : button2Text; | |||||
| info.button3 = button3Text.isEmpty() ? TRANS("cancel") : button3Text; | |||||
| info.button1 = button1Text.isEmpty() ? TRANS("Yes") : button1Text; | |||||
| info.button2 = button2Text.isEmpty() ? TRANS("No") : button2Text; | |||||
| info.button3 = button3Text.isEmpty() ? TRANS("Cancel") : button3Text; | |||||
| return info.invoke(); | return info.invoke(); | ||||
| } | } | ||||
| @@ -98,8 +98,8 @@ bool FileBasedDocument::loadFrom (const File& newFile, | |||||
| { | { | ||||
| AlertWindow::showMessageBox (AlertWindow::WarningIcon, | AlertWindow::showMessageBox (AlertWindow::WarningIcon, | ||||
| TRANS("Failed to open file..."), | TRANS("Failed to open file..."), | ||||
| TRANS("There was an error while trying to load the file:\n\n") | |||||
| + newFile.getFullPathName() | |||||
| TRANS("There was an error while trying to load the file: FLNM") | |||||
| .replace ("FLNM", "\n" + newFile.getFullPathName()) | |||||
| + "\n\n" | + "\n\n" | ||||
| + result.getErrorMessage()); | + result.getErrorMessage()); | ||||
| } | } | ||||
| @@ -119,6 +119,18 @@ bool FileBasedDocument::loadFromUserSpecifiedFile (const bool showMessageOnFailu | |||||
| return false; | return false; | ||||
| } | } | ||||
| static bool askToOverwriteFile (const File& newFile) | |||||
| { | |||||
| return AlertWindow::showOkCancelBox (AlertWindow::WarningIcon, | |||||
| TRANS("File already exists"), | |||||
| TRANS("There's already a file called: FLMN") | |||||
| .replace ("FLNM", newFile.getFullPathName()) | |||||
| + "\n\n" | |||||
| + TRANS("Are you sure you want to overwrite it?"), | |||||
| TRANS("Overwrite"), | |||||
| TRANS("Cancel")); | |||||
| } | |||||
| //============================================================================== | //============================================================================== | ||||
| FileBasedDocument::SaveResult FileBasedDocument::save (const bool askUserForFileIfNotSpecified, | FileBasedDocument::SaveResult FileBasedDocument::save (const bool askUserForFileIfNotSpecified, | ||||
| const bool showMessageOnFailure) | const bool showMessageOnFailure) | ||||
| @@ -144,19 +156,10 @@ FileBasedDocument::SaveResult FileBasedDocument::saveAs (const File& newFile, | |||||
| return failedToWriteToFile; | return failedToWriteToFile; | ||||
| } | } | ||||
| if (warnAboutOverwritingExistingFiles && newFile.exists()) | |||||
| { | |||||
| if (! AlertWindow::showOkCancelBox (AlertWindow::WarningIcon, | |||||
| TRANS("File already exists"), | |||||
| TRANS("There's already a file called:\n\n") | |||||
| + newFile.getFullPathName() | |||||
| + TRANS("\n\nAre you sure you want to overwrite it?"), | |||||
| TRANS("overwrite"), | |||||
| TRANS("cancel"))) | |||||
| { | |||||
| return userCancelledSave; | |||||
| } | |||||
| } | |||||
| if (warnAboutOverwritingExistingFiles | |||||
| && newFile.exists() | |||||
| && ! askToOverwriteFile (newFile)) | |||||
| return userCancelledSave; | |||||
| MouseCursor::showWaitCursor(); | MouseCursor::showWaitCursor(); | ||||
| @@ -180,10 +183,9 @@ FileBasedDocument::SaveResult FileBasedDocument::saveAs (const File& newFile, | |||||
| { | { | ||||
| AlertWindow::showMessageBox (AlertWindow::WarningIcon, | AlertWindow::showMessageBox (AlertWindow::WarningIcon, | ||||
| TRANS("Error writing to file..."), | TRANS("Error writing to file..."), | ||||
| TRANS("An error occurred while trying to save \"") | |||||
| + getDocumentTitle() | |||||
| + TRANS("\" to the file:\n\n") | |||||
| + newFile.getFullPathName() | |||||
| TRANS("An error occurred while trying to save \"DCNM\" to the file: FLNM") | |||||
| .replace ("DCNM", getDocumentTitle()) | |||||
| .replace ("FLNM", "\n" + newFile.getFullPathName()) | |||||
| + "\n\n" | + "\n\n" | ||||
| + result.getErrorMessage()); | + result.getErrorMessage()); | ||||
| } | } | ||||
| @@ -198,11 +200,11 @@ FileBasedDocument::SaveResult FileBasedDocument::saveIfNeededAndUserAgrees() | |||||
| const int r = AlertWindow::showYesNoCancelBox (AlertWindow::QuestionIcon, | const int r = AlertWindow::showYesNoCancelBox (AlertWindow::QuestionIcon, | ||||
| TRANS("Closing document..."), | TRANS("Closing document..."), | ||||
| TRANS("Do you want to save the changes to \"") | |||||
| + getDocumentTitle() + "\"?", | |||||
| TRANS("save"), | |||||
| TRANS("discard changes"), | |||||
| TRANS("cancel")); | |||||
| TRANS("Do you want to save the changes to \"DCNM\"?") | |||||
| .replace ("DCNM", getDocumentTitle()), | |||||
| TRANS("Save"), | |||||
| TRANS("Discard changes"), | |||||
| TRANS("Cancel")); | |||||
| if (r == 1) // save changes | if (r == 1) // save changes | ||||
| return save (true, true); | return save (true, true); | ||||
| @@ -248,19 +250,8 @@ FileBasedDocument::SaveResult FileBasedDocument::saveAsInteractive (const bool w | |||||
| { | { | ||||
| chosen = chosen.withFileExtension (fileExtension); | chosen = chosen.withFileExtension (fileExtension); | ||||
| if (chosen.exists()) | |||||
| { | |||||
| if (! AlertWindow::showOkCancelBox (AlertWindow::WarningIcon, | |||||
| TRANS("File already exists"), | |||||
| TRANS("There's already a file called:") | |||||
| + "\n\n" + chosen.getFullPathName() | |||||
| + "\n\n" + TRANS("Are you sure you want to overwrite it?"), | |||||
| TRANS("overwrite"), | |||||
| TRANS("cancel"))) | |||||
| { | |||||
| return userCancelledSave; | |||||
| } | |||||
| } | |||||
| if (chosen.exists() && ! askToOverwriteFile (chosen)) | |||||
| return userCancelledSave; | |||||
| } | } | ||||
| setLastDocumentOpened (chosen); | setLastDocumentOpened (chosen); | ||||
| @@ -96,7 +96,7 @@ public: | |||||
| AlertWindow::NoIcon), | AlertWindow::NoIcon), | ||||
| owner (kec) | owner (kec) | ||||
| { | { | ||||
| addButton (TRANS("Ok"), 1); | |||||
| addButton (TRANS("OK"), 1); | |||||
| addButton (TRANS("Cancel"), 0); | addButton (TRANS("Cancel"), 0); | ||||
| // (avoid return + escape keys getting processed by the buttons..) | // (avoid return + escape keys getting processed by the buttons..) | ||||
| @@ -110,13 +110,15 @@ public: | |||||
| bool keyPressed (const KeyPress& key) | bool keyPressed (const KeyPress& key) | ||||
| { | { | ||||
| lastPress = key; | lastPress = key; | ||||
| String message (TRANS("Key: ") + owner.getDescriptionForKeyPress (key)); | |||||
| String message (TRANS("Key") + ": " + owner.getDescriptionForKeyPress (key)); | |||||
| const CommandID previousCommand = owner.getMappings().findCommandForKeyPress (key); | const CommandID previousCommand = owner.getMappings().findCommandForKeyPress (key); | ||||
| if (previousCommand != 0) | if (previousCommand != 0) | ||||
| message << "\n\n" << TRANS("(Currently assigned to \"") | |||||
| << owner.getCommandManager().getNameOfCommand (previousCommand) << "\")"; | |||||
| message << "\n\n(" | |||||
| << TRANS("Currently assigned to \"CMDN\"") | |||||
| .replace ("CMDN", owner.getCommandManager().getNameOfCommand (previousCommand)) | |||||
| << ')'; | |||||
| setMessage (message); | setMessage (message); | ||||
| return true; | return true; | ||||
| @@ -160,9 +162,10 @@ public: | |||||
| { | { | ||||
| AlertWindow::showOkCancelBox (AlertWindow::WarningIcon, | AlertWindow::showOkCancelBox (AlertWindow::WarningIcon, | ||||
| TRANS("Change key-mapping"), | TRANS("Change key-mapping"), | ||||
| TRANS("This key is already assigned to the command \"") | |||||
| + owner.getCommandManager().getNameOfCommand (previousCommand) | |||||
| + TRANS("\"\n\nDo you want to re-assign it to this new command instead?"), | |||||
| TRANS("This key is already assigned to the command \"CMDN\"") | |||||
| .replace ("CMDN", owner.getCommandManager().getNameOfCommand (previousCommand)) | |||||
| + "\n\n" | |||||
| + TRANS("Do you want to re-assign it to this new command instead?"), | |||||
| TRANS("Re-assign"), | TRANS("Re-assign"), | ||||
| TRANS("Cancel"), | TRANS("Cancel"), | ||||
| this, | this, | ||||