Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Export pdf/linked files #3147

Merged
merged 36 commits into from
Nov 1, 2017
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
9d38d12
First approach for implementing PDF Exporter
Siedlerchr Apr 2, 2017
00eccc7
First approach for implementing PDF Exporter
Siedlerchr Oct 7, 2017
50e9716
Add to File menu and context menu
Siedlerchr Oct 7, 2017
26a7e1f
Remove separator from tools menu
Siedlerchr Oct 7, 2017
ec7c44b
fix fileUtil and localzation from rebase
Siedlerchr Oct 7, 2017
68e1562
Remove empty line
Siedlerchr Oct 7, 2017
d1b53eb
Move service to new class
Siedlerchr Oct 8, 2017
7021371
Fix translation
Siedlerchr Oct 8, 2017
6b02e9c
Add idea for list view dialog
Siedlerchr Oct 8, 2017
edec73d
Merge remote-tracking branch 'upstream/master' into exportPdf
Siedlerchr Oct 11, 2017
95474ea
Merge remote-tracking branch 'upstream/master' into exportPdf
Siedlerchr Oct 19, 2017
bed0a54
Add TableView to show log message
Siedlerchr Oct 19, 2017
e347bc9
Add class for table view data
Siedlerchr Oct 19, 2017
090a4cd
Add Green/Red icons for status
Siedlerchr Oct 19, 2017
93f72b2
fix checkstyle and make cancel button close button
Siedlerchr Oct 19, 2017
353e9ad
fix codacy
Siedlerchr Oct 20, 2017
f29066c
Merge remote-tracking branch 'upstream/master' into exportPdf
Siedlerchr Oct 20, 2017
aa10731
Renamings
Siedlerchr Oct 20, 2017
9e6cffc
Remove setter
Siedlerchr Oct 20, 2017
b61082c
Add fxml and move to package
Siedlerchr Oct 20, 2017
713ecec
fix controller
Siedlerchr Oct 20, 2017
cfa74e5
Merge remote-tracking branch 'upstream/master' into exportPdf
Siedlerchr Oct 21, 2017
4c01181
add button data
Siedlerchr Oct 21, 2017
cc30b98
Add new wrapper class for injection
Siedlerchr Oct 21, 2017
a67cd4e
Add todos hinting at empty
Siedlerchr Oct 21, 2017
5d96526
Fix injection of data
Siedlerchr Oct 21, 2017
8011e6e
rebame and fix checkstyle
Siedlerchr Oct 21, 2017
bb1a304
Make variables private
Siedlerchr Oct 21, 2017
5e1117a
Merge remote-tracking branch 'upstream/master' into exportPdf
Siedlerchr Oct 22, 2017
8dabe6d
Merge remote-tracking branch 'upstream/master' into exportPdf
Siedlerchr Oct 25, 2017
fc7a2a1
fix merge error in lang files
Siedlerchr Oct 25, 2017
ba35360
Fix some coday warnings
Siedlerchr Oct 25, 2017
88faa7c
Rename l10n
Siedlerchr Oct 26, 2017
658d97e
Merge remote-tracking branch 'upstream/master' into exportPdf
Siedlerchr Oct 31, 2017
8f14cc7
fix showing of progress bar
Siedlerchr Oct 31, 2017
07ee6ea
Merge branch 'exportPdf' of https://github.com/JabRef/jabref into exp…
Siedlerchr Oct 31, 2017
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion src/main/java/org/jabref/gui/JabRefFrame.java
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@
import org.jabref.gui.actions.AutoLinkFilesAction;
import org.jabref.gui.actions.ConnectToSharedDatabaseAction;
import org.jabref.gui.actions.ErrorConsoleAction;
import org.jabref.gui.actions.ExportLinkedFilesAction;
import org.jabref.gui.actions.IntegrityCheckAction;
import org.jabref.gui.actions.LookupIdentifierAction;
import org.jabref.gui.actions.ManageKeywordsAction;
Expand Down Expand Up @@ -389,6 +390,7 @@ public void actionPerformed(ActionEvent e) {
Localization.menuTitle("Unabbreviate journal names"),
Localization.lang("Unabbreviate journal names of the selected entries"),
Globals.getKeyPrefs().getKey(KeyBinding.UNABBREVIATE));
private final AbstractAction exportLinkedFiles = new ExportLinkedFilesAction();
private final AbstractAction manageJournals = new ManageJournalsAction();
private final AbstractAction databaseProperties = new DatabasePropertiesAction();
private final AbstractAction bibtexKeyPattern = new BibtexKeyPatternAction();
Expand Down Expand Up @@ -1059,6 +1061,7 @@ private void fillMenu() {
file.add(importCurrent);
file.add(exportAll);
file.add(exportSelected);
file.add(exportLinkedFiles);
file.addSeparator();
file.add(connectToSharedDatabaseAction);
file.add(pullChangesFromSharedDatabase);
Expand Down Expand Up @@ -1440,7 +1443,7 @@ dupliCheck, autoSetFile, newEntryAction, newSpec, customizeAction, plainTextImpo
twoEntriesOnlyActions.addAll(Arrays.asList(mergeEntries));

atLeastOneEntryActions.clear();
atLeastOneEntryActions.addAll(Arrays.asList(downloadFullText, lookupIdentifiers));
atLeastOneEntryActions.addAll(Arrays.asList(downloadFullText, lookupIdentifiers, exportLinkedFiles));

tabbedPane.addChangeListener(event -> updateEnabledState());

Expand Down
169 changes: 169 additions & 0 deletions src/main/java/org/jabref/gui/actions/ExportLinkedFilesAction.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
package org.jabref.gui.actions;

import java.awt.event.ActionEvent;
import java.io.BufferedWriter;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Optional;
import java.util.function.BiFunction;

import javax.swing.AbstractAction;

import javafx.concurrent.Service;
import javafx.concurrent.Task;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonType;
import javafx.scene.control.DialogPane;

import org.jabref.Globals;
import org.jabref.JabRefGUI;
import org.jabref.gui.DialogService;
import org.jabref.gui.FXDialogService;
import org.jabref.gui.util.DefaultTaskExecutor;
import org.jabref.gui.util.DirectoryDialogConfiguration;
import org.jabref.logic.l10n.Localization;
import org.jabref.logic.util.OS;
import org.jabref.logic.util.io.FileUtil;
import org.jabref.model.database.BibDatabaseContext;
import org.jabref.model.entry.BibEntry;
import org.jabref.model.entry.LinkedFile;
import org.jabref.model.util.FileHelper;
import org.jabref.model.util.OptionalUtil;
import org.jabref.preferences.JabRefPreferences;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.controlsfx.dialog.ProgressDialog;

public class ExportLinkedFilesAction extends AbstractAction {

private static final Log LOGGER = LogFactory.getLog(ExportLinkedFilesAction.class);
private final BiFunction<Path, Path, Path> resolvePathFilename = (path, file) -> {
return path.resolve(file.getFileName());
};
private final DialogService ds = new FXDialogService();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here, better name please.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not fixed.

private long totalFilesCount;
private BibDatabaseContext databaseContext;
private Optional<Path> exportPath = Optional.empty();
private List<BibEntry> entries;

public ExportLinkedFilesAction() {
super(Localization.lang("Copy attached files to folder..."));
}

@Override
public void actionPerformed(ActionEvent e) {

DirectoryDialogConfiguration dirDialogConfiguration = new DirectoryDialogConfiguration.Builder()
.withInitialDirectory(Paths.get(Globals.prefs.get(JabRefPreferences.EXPORT_WORKING_DIRECTORY)))
.build();
entries = JabRefGUI.getMainFrame().getCurrentBasePanel().getSelectedEntries();
exportPath = DefaultTaskExecutor
.runInJavaFXThread(() -> ds.showDirectorySelectionDialog(dirDialogConfiguration));

exportPath.ifPresent(path -> {
databaseContext = JabRefGUI.getMainFrame().getCurrentBasePanel().getDatabaseContext();
totalFilesCount = entries.stream().flatMap(entry -> entry.getFiles().stream()).count();

Service<Void> exportService = new ExportService();
startServiceAndshowProgessDialog(exportService);
});
}

private <V> void startServiceAndshowProgessDialog(Service<V> service) {
DefaultTaskExecutor.runInJavaFXThread(() -> {
service.start();

ProgressDialog progressDialog = new ProgressDialog(service);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you please extract the "show progress dialog" part of this method to the DialogService class.

progressDialog.setOnCloseRequest(evt -> service.cancel());
DialogPane dialogPane = progressDialog.getDialogPane();
dialogPane.getButtonTypes().add(ButtonType.CANCEL);
Button cancelButton = (Button) dialogPane.lookupButton(ButtonType.CANCEL);
cancelButton.setOnAction(evt -> {
service.cancel();
progressDialog.close();
});
progressDialog.showAndWait();
});
}

private class ExportService extends Service<Void> {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is rather nitpicky, but what about extracting this into a separate class file in the same package with default visibility? You could also extract parts of call() into separate private methods. All this wouldn't change anything about the functionality, but it would make the code a little less chunky and more readable.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see no reason why I should extract that in a new class. It's just a single Service for one purpose.
But I think I can surely extract some private methods

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One reason is that you could (and should) write tests for the ExportService.


private static final String LOGFILE = "exportLog.log";
private final String localizedSucessMessage = Localization.lang("Copied file successfully");
private final String localizedErrorMessage = Localization.lang("Could not copy file") + ": " + Localization.lang("File exists");

@Override
protected Task<Void> createTask() {
return new Task<Void>() {

int totalFilesCounter;
int numberSucessful;
int numberError;
Optional<Path> newPath;

@Override
protected Void call()
throws InterruptedException, IOException {
updateMessage(Localization.lang("Copying files..."));
updateProgress(0, totalFilesCount);

try (BufferedWriter bw = Files.newBufferedWriter(exportPath.get().resolve(LOGFILE), StandardCharsets.UTF_8)) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In my opinion, a log file is an inconvenient solution for the user. Why don't log all the errors to an internal list and display this list at the end in a new dialog?


for (int i = 0; i < entries.size(); i++) {

List<LinkedFile> files = entries.get(i).getFiles();

for (int j = 0; j < files.size(); j++) {
updateMessage(Localization.lang("Copying file %0 of BibEntry %1", Integer.toString(j + 1), Integer.toString(i + 1)));
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we never used BibEntry before in the user interface (it is the class name...). What about only "entry" or "item"?

Thread.sleep(500); //TODO: Adjust/leave/any other idea?
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This sleep makes the whole progress of copying files really slow. I would remove it even through then the user has no chance to actually read the message for small files (but that is ok in my opinion).


String fileName = files.get(j).getLink();
Optional<Path> fileToExport = FileHelper.expandFilenameAsPath(fileName,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use

public Optional<Path> findIn(BibDatabaseContext databaseContext, FileDirectoryPreferences fileDirectoryPreferences) {

databaseContext.getFileDirectoriesAsPaths(Globals.prefs.getFileDirectoryPreferences()));

newPath = OptionalUtil.combine(exportPath, fileToExport, resolvePathFilename);

newPath.ifPresent(newFile -> {
boolean success = FileUtil.copyFile(fileToExport.get(), newFile, false);
updateProgress(totalFilesCounter++, totalFilesCount);
if (success) {
updateMessage(localizedSucessMessage);
numberSucessful++;
writeLogMessage(newFile, bw, localizedSucessMessage);

} else {

updateMessage(localizedErrorMessage);
numberError++;
writeLogMessage(newFile, bw, localizedErrorMessage);
}
});
}
}
updateMessage(Localization.lang("Finished copying"));
String sucessMessage = Localization.lang("Copied %0 files of %1 sucessfully to %2", Integer.toString(numberSucessful), Integer.toString(totalFilesCounter), newPath.map(Path::getParent).map(Path::toString).orElse(""));
updateMessage(sucessMessage);
bw.write(sucessMessage);
return null;
}
}
};
}

private void writeLogMessage(Path newFile, BufferedWriter bw, String logMessage) {
try {
bw.write(logMessage + ": " + newFile);
bw.write(OS.NEWLINE);
} catch (IOException e) {
LOGGER.error("error writing log file", e);
}
}

}

}
2 changes: 2 additions & 0 deletions src/main/java/org/jabref/gui/menus/RightClickMenu.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import org.jabref.gui.IconTheme;
import org.jabref.gui.JabRefFrame;
import org.jabref.gui.actions.Actions;
import org.jabref.gui.actions.ExportLinkedFilesAction;
import org.jabref.gui.filelist.FileListTableModel;
import org.jabref.gui.keyboard.KeyBinding;
import org.jabref.gui.mergeentries.FetchAndMergeEntry;
Expand Down Expand Up @@ -102,6 +103,7 @@ public RightClickMenu(JabRefFrame frame, BasePanel panel) {

add(new GeneralAction(Actions.SEND_AS_EMAIL, Localization.lang("Send as email"), IconTheme.JabRefIcon.EMAIL.getSmallIcon()));
addSeparator();
add(new ExportLinkedFilesAction());
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you really think that this export functionality is used that often that we should add it to the right click menu?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It was requested by @koppor And I think it makes sense to have it in the context menu


JMenu markSpecific = JabRefFrame.subMenu(Localization.menuTitle("Mark specific color"));
markSpecific.setIcon(IconTheme.JabRefIcon.MARK_ENTRIES.getSmallIcon());
Expand Down
6 changes: 0 additions & 6 deletions src/main/java/org/jabref/logic/exporter/ExportFormat.java
Original file line number Diff line number Diff line change
Expand Up @@ -313,12 +313,6 @@ public void performExport(final BibDatabaseContext databaseContext, final String

}

@Override
public void performExport(final BibDatabaseContext databaseContext, Path file, final Charset encoding,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please don't delete this path based methods. I know they are not yet used but they are actually preferable to the string or file-based methods (these should actually be deprecated).

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I deleted it on purpose because it is not working at all as I explained in my other PR or earlier.
It always lead to an exception.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ok...

List<BibEntry> entries) throws Exception {
performExport(databaseContext, file.getFileName().toString(), encoding, entries);
}

/**
* See if there is a name formatter file bundled with this export format. If so, read
* all the name formatters so they can be used by the filter layouts.
Expand Down
15 changes: 0 additions & 15 deletions src/main/java/org/jabref/logic/exporter/IExportFormat.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package org.jabref.logic.exporter;

import java.nio.charset.Charset;
import java.nio.file.Path;
import java.util.List;

import org.jabref.model.database.BibDatabaseContext;
Expand Down Expand Up @@ -38,18 +37,4 @@ public interface IExportFormat {
void performExport(BibDatabaseContext databaseContext, String file, Charset encoding, List<BibEntry> entries)
throws Exception;

/**
* Perform the Export.
* Gets the path as a java.nio.path instead of a string.
*
* @param databaseContext the database to export from.
* @param file the Path to the file to write to.The path should be an java.nio.Path
* @param encoding The encoding to use.
* @param entries A list containing all entries that
* should be exported. The list of entries must be non null
* @throws Exception
*/
void performExport(BibDatabaseContext databaseContext, Path file, Charset encoding, List<BibEntry> entries)
throws Exception;

}
2 changes: 1 addition & 1 deletion src/main/java/org/jabref/logic/l10n/Localization.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import org.apache.commons.logging.LogFactory;

public class Localization {

public static final String RESOURCE_PREFIX = "l10n/JabRef";
public static final String MENU_RESOURCE_PREFIX = "l10n/Menu";
public static final String BIBTEX = "BibTeX";
Expand Down Expand Up @@ -98,4 +99,3 @@ public static String menuTitle(String key, String... params) {
}

}

3 changes: 2 additions & 1 deletion src/main/java/org/jabref/logic/util/io/FileUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import org.apache.commons.logging.LogFactory;

public class FileUtil {

public static final boolean IS_POSIX_COMPILANT = FileSystems.getDefault().supportedFileAttributeViews().contains("posix");
public static final int MAXIMUM_FILE_NAME_LENGTH = 255;
private static final Log LOGGER = LogFactory.getLog(FileUtil.class);
Expand Down Expand Up @@ -260,7 +261,7 @@ public static List<Path> getListOfLinkedFiles(List<BibEntry> bes, List<Path> fil
*/
@Deprecated
public static String createFileNameFromPattern(BibDatabase database, BibEntry entry, String fileNamePattern,
LayoutFormatterPreferences prefs) {
LayoutFormatterPreferences prefs) {
String targetName = null;

StringReader sr = new StringReader(fileNamePattern);
Expand Down
8 changes: 8 additions & 0 deletions src/main/resources/l10n/JabRef_da.properties
Original file line number Diff line number Diff line change
Expand Up @@ -2342,6 +2342,14 @@ Delete_from_disk=
Remove_from_entry=
The_group_name_contains_the_keyword_separator_"%0"_and_thus_probably_does_not_work_as_expected.=
There_exists_already_a_group_with_the_same_name.=

Copy_attached_files_to_folder...=
Copied_file_successfully=
Copying_file_%0_of_BibEntry_%1=
Copying_files...=
Finished_copying=
Could_not_copy_file=
Copied_%0_files_of_%1_sucessfully_to_%2=
Rename_failed=
JabRef_cannot_access_the_file_because_it_is_being_used_by_another_process.=
Show_console_output_(only_necessary_when_the_launcher_is_used)=
8 changes: 8 additions & 0 deletions src/main/resources/l10n/JabRef_de.properties
Original file line number Diff line number Diff line change
Expand Up @@ -2342,6 +2342,14 @@ Delete_from_disk=Auf_der_Festplatte_löschen
Remove_from_entry=Vom_Eintrag_entfernen
The_group_name_contains_the_keyword_separator_"%0"_and_thus_probably_does_not_work_as_expected.=Der_Gruppename_enthält_das_Trennzeichen_"%0"_und_wird_deswegen_möglicherweise_nicht_wie_erwartet_funktionieren.
There_exists_already_a_group_with_the_same_name.=Es_existiert_bereits_eine_Gruppe_mit_demselben_Namen.

Copy_attached_files_to_folder...=
Copied_file_successfully=
Copying_file_%0_of_BibEntry_%1=
Copying_files...=Copying_files...
Finished_copying=Finished_copying
Could_not_copy_file=Could_not_copy_file
Copied_%0_files_of_%1_sucessfully_to_%2=
Rename_failed=
JabRef_cannot_access_the_file_because_it_is_being_used_by_another_process.=
Show_console_output_(only_necessary_when_the_launcher_is_used)=
8 changes: 8 additions & 0 deletions src/main/resources/l10n/JabRef_el.properties
Original file line number Diff line number Diff line change
Expand Up @@ -2342,6 +2342,14 @@ Delete_from_disk=
Remove_from_entry=
The_group_name_contains_the_keyword_separator_"%0"_and_thus_probably_does_not_work_as_expected.=
There_exists_already_a_group_with_the_same_name.=

Copy_attached_files_to_folder...=
Copied_file_successfully=
Copying_file_%0_of_BibEntry_%1=
Copying_files...=
Finished_copying=
Could_not_copy_file=
Copied_%0_files_of_%1_sucessfully_to_%2=
Rename_failed=
JabRef_cannot_access_the_file_because_it_is_being_used_by_another_process.=
Show_console_output_(only_necessary_when_the_launcher_is_used)=
8 changes: 8 additions & 0 deletions src/main/resources/l10n/JabRef_en.properties
Original file line number Diff line number Diff line change
Expand Up @@ -2342,6 +2342,14 @@ Delete_from_disk=Delete_from_disk
Remove_from_entry=Remove_from_entry
The_group_name_contains_the_keyword_separator_"%0"_and_thus_probably_does_not_work_as_expected.=The_group_name_contains_the_keyword_separator_"%0"_and_thus_probably_does_not_work_as_expected.
There_exists_already_a_group_with_the_same_name.=There_exists_already_a_group_with_the_same_name.

Copy_attached_files_to_folder...=Copy_attached_files_to_folder...
Copied_file_successfully=Copied_file_successfully
Copying_file_%0_of_BibEntry_%1=Copying_file_%0_of_BibEntry_%1
Copying_files...=Copying_files...
Finished_copying=Finished_copying
Could_not_copy_file=Could_not_copy_file
Copied_%0_files_of_%1_sucessfully_to_%2=Copied_%0_files_of_%1_sucessfully_to_%2
Rename_failed=Rename_failed
JabRef_cannot_access_the_file_because_it_is_being_used_by_another_process.=JabRef_cannot_access_the_file_because_it_is_being_used_by_another_process.
Show_console_output_(only_necessary_when_the_launcher_is_used)=Show_console_output_(only_necessary_when_the_launcher_is_used)
8 changes: 8 additions & 0 deletions src/main/resources/l10n/JabRef_es.properties
Original file line number Diff line number Diff line change
Expand Up @@ -2342,6 +2342,14 @@ Delete_from_disk=
Remove_from_entry=
The_group_name_contains_the_keyword_separator_"%0"_and_thus_probably_does_not_work_as_expected.=
There_exists_already_a_group_with_the_same_name.=

Copy_attached_files_to_folder...=
Copied_file_successfully=
Copying_file_%0_of_BibEntry_%1=
Copying_files...=
Finished_copying=
Could_not_copy_file=
Copied_%0_files_of_%1_sucessfully_to_%2=
Rename_failed=
JabRef_cannot_access_the_file_because_it_is_being_used_by_another_process.=
Show_console_output_(only_necessary_when_the_launcher_is_used)=
8 changes: 8 additions & 0 deletions src/main/resources/l10n/JabRef_fa.properties
Original file line number Diff line number Diff line change
Expand Up @@ -2342,6 +2342,14 @@ Delete_from_disk=
Remove_from_entry=
The_group_name_contains_the_keyword_separator_"%0"_and_thus_probably_does_not_work_as_expected.=
There_exists_already_a_group_with_the_same_name.=

Copy_attached_files_to_folder...=
Copied_file_successfully=
Copying_file_%0_of_BibEntry_%1=
Copying_files...=
Finished_copying=
Could_not_copy_file=
Copied_%0_files_of_%1_sucessfully_to_%2=
Rename_failed=
JabRef_cannot_access_the_file_because_it_is_being_used_by_another_process.=
Show_console_output_(only_necessary_when_the_launcher_is_used)=
8 changes: 8 additions & 0 deletions src/main/resources/l10n/JabRef_fr.properties
Original file line number Diff line number Diff line change
Expand Up @@ -2342,6 +2342,14 @@ Delete_from_disk=Supprimer_du_disque
Remove_from_entry=Effacer_de_l'entrée
The_group_name_contains_the_keyword_separator_"%0"_and_thus_probably_does_not_work_as_expected.=Le_nom_du_groupe_contient_le_séparateur_de_mot-clef_"%0"_et_ne_fonctionnera_probablement_donc_pas_comme_attendu.
There_exists_already_a_group_with_the_same_name.=Un_groupe_portant_ce_nom_existe_déjà.

Copy_attached_files_to_folder...=
Copied_file_successfully=
Copying_file_%0_of_BibEntry_%1=
Copying_files...=
Finished_copying=
Could_not_copy_file=
Copied_%0_files_of_%1_sucessfully_to_%2=
Rename_failed=
JabRef_cannot_access_the_file_because_it_is_being_used_by_another_process.=
Show_console_output_(only_necessary_when_the_launcher_is_used)=
Loading