Author: echatellier Date: 2017-03-09 16:47:27 +0100 (Thu, 09 Mar 2017) New Revision: 4399 Url: http://forge.codelutin.com/projects/isis-fish/repository/revisions/4399 Log: fixes #429: Pouvoir copier/coller une partie de base dans une autre base fixes #8737: Export / Import des ?\195?\169l?\195?\169ments d'une r?\195?\169gion, soit pour import dans une autre r?\195?\169gion, soit pour fusion de deux r?\195?\169gions. Modified: trunk/src/main/java/fr/ifremer/isisfish/entities/PopulationImpl.java trunk/src/main/java/fr/ifremer/isisfish/entities/RegionImportJson.java trunk/src/main/java/fr/ifremer/isisfish/entities/StrategyMonthInfoImpl.java trunk/src/main/java/fr/ifremer/isisfish/ui/input/InputHandler.java trunk/src/main/java/fr/ifremer/isisfish/ui/input/InputSaveVerifier.java trunk/src/main/resources/i18n/isis-fish_en_GB.properties trunk/src/main/resources/i18n/isis-fish_fr_FR.properties Modified: trunk/src/main/java/fr/ifremer/isisfish/entities/PopulationImpl.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/entities/PopulationImpl.java 2017-03-08 14:24:23 UTC (rev 4398) +++ trunk/src/main/java/fr/ifremer/isisfish/entities/PopulationImpl.java 2017-03-09 15:47:27 UTC (rev 4399) @@ -82,7 +82,6 @@ * la collection, mais vider celle qui existe et y mettre les nouveaux elements * sinon hibernate perd la tete et leve des exceptions (detecter lors de l'implantation * de l'import json) - * @param populationGroup */ @Override public void setPopulationGroup(List<PopulationGroup> populationGroup) { @@ -103,6 +102,18 @@ } /** + * Surcharge car avec une aggregation (lien fort) il ne faut pas remplacer + * la collection, mais vider celle qui existe et y mettre les nouveaux elements + * sinon hibernate perd la tete et leve des exceptions (detecter lors de l'implantation + * de l'import json) + */ + @Override + public void setPopulationZone(List<Zone> populationZone) { + clearPopulationZone(); + addAllPopulationZone(populationZone); + } + + /** * Overwrite delete. * @throws TopiaException */ Modified: trunk/src/main/java/fr/ifremer/isisfish/entities/RegionImportJson.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/entities/RegionImportJson.java 2017-03-08 14:24:23 UTC (rev 4398) +++ trunk/src/main/java/fr/ifremer/isisfish/entities/RegionImportJson.java 2017-03-09 15:47:27 UTC (rev 4399) @@ -48,7 +48,7 @@ import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JRadioButton; -import java.awt.GridLayout; +import java.awt.FlowLayout; import java.io.IOException; import java.io.Reader; import java.util.ArrayList; @@ -65,6 +65,8 @@ import java.util.Map.Entry; import java.util.Set; +import static org.nuiton.i18n.I18n.t; + /** * Classe permettant d'importer des données dans une region a partir d'un * export Json. @@ -85,21 +87,21 @@ protected RegionMerge merge; protected JsonNode json; - protected LinkedHashMap<String, TopiaEntity> entities; + protected Map<String, TopiaEntity> entities; protected JsonNode jsonEntities; - protected TopiaEntity currentEntity; /** * * @param r reader contains json * @param merge use to choice entity in Json or entity in current region, - * if no merge object is passed in arguement "import all" object in reader + * if no merge object is passed in argument "import all" object in reader */ public RegionImportJson(Reader r, RegionMerge merge) { try { this.merge = merge != null ? merge : new RegionMergeImportAll(); - + entities = new LinkedHashMap<>(); + this.merge.setEntities(entities); ObjectMapper m = new ObjectMapper(); json = m.readTree(r); @@ -152,13 +154,13 @@ protected TopiaEntity parentEntity; protected String propertyName; protected TopiaEntity currentEntity; - protected LinkedHashMap<String, TopiaEntity> entities; + protected Map<String, TopiaEntity> entities; protected JsonNode jsonEntities; public RegionVisitor(RegionMerge merge, TopiaEntity parentEntity, String propertyName, String idEntity, - LinkedHashMap<String, TopiaEntity> entities, JsonNode jsonEntities) { + Map<String, TopiaEntity> entities, JsonNode jsonEntities) { this.merge = merge; this.parentEntity = parentEntity; this.propertyName = propertyName; @@ -331,6 +333,7 @@ } else { c = new ArrayList(); } + for (JsonNode currentValue : jsonValue) { Object v = readValue(propertyName, type, currentValue); if (v != null) { @@ -358,10 +361,12 @@ * Use during import to merge imported data in existing Region */ static public interface RegionMerge { + void setEntities(Map<String, TopiaEntity> entities); + static public enum AutoAnswerType { - ONCE("Reply only for this awnser"), - TYPE("Reply all time same thing for this type"), - ALL("Reply all time same thing for all type"); + ONCE(t("isisfish.import.json.merge.autoanswer.once")), + TYPE(t("isisfish.import.json.merge.autoanswer.type")), + ALL(t("isisfish.import.json.merge.autoanswer.all")); private final String toString; private AutoAnswerType(String toString) { @@ -376,11 +381,11 @@ } static public enum AnswerType { - NONE("None", "don't import nor reuse an object."), - USE("Use", "use (don't import) object already in current Region (make your choice in next combobox)."), - REPLACE("Replace", "replace object in current Region with imported object from file (make your choice in next combobox"), - CREATE("Create", "create new object from file."), - ABORT("Abort", "cancel this import (import nothing)."); + NONE(t("isisfish.import.json.merge.option.none"), t("isisfish.import.json.merge.option.none.desc")), + USE(t("isisfish.import.json.merge.option.use"), t("isisfish.import.json.merge.option.use.desc")), + REPLACE(t("isisfish.import.json.merge.option.replace"), t("isisfish.import.json.merge.option.replace.desc")), + CREATE(t("isisfish.import.json.merge.option.create"), t("isisfish.import.json.merge.option.create.desc")), + ABORT(t("isisfish.import.json.merge.option.abort"), t("isisfish.import.json.merge.option.abort.desc")); private final String toString; private final String description; @@ -565,6 +570,7 @@ protected TopiaContext tx; protected RegionMergeContext context; protected Answer lastAnswer; + protected Map<String, TopiaEntity> entities; public RegionMergeDatabase(TopiaContext tx) { this.tx = tx; @@ -576,6 +582,11 @@ } @Override + public void setEntities(Map<String, TopiaEntity> entities) { + this.entities = entities; + } + + @Override public Answer choice(String id, String toString, Map<String, Object> details, AnswerType ... disallow) { Class type = TopiaId.getClassName(id); if (context == null) { @@ -585,9 +596,21 @@ if (!isAcceptableAnswer(context.initAnswer(type), disallow)) { TopiaDAO<TopiaEntity> dao = IsisFishDAOHelper.getDAO(tx, type); + // order matters here Set<TopiaEntity> possible = new LinkedHashSet<>(); - possible.add(dao.findByTopiaId(id)); + // from context (most match) + for (TopiaEntity entity : entities.values()) { + if (type.isAssignableFrom(entity.getClass())) { + possible.add(entity); + } + } + + // from db with same id + TopiaEntity byTopiaIdFromDatabase = dao.findByTopiaId(id); + if (byTopiaIdFromDatabase != null) { + possible.add(byTopiaIdFromDatabase); + } if (Equation.class.isAssignableFrom(context.getCurrentType())) { if (details.containsKey("name") && details.containsKey("category")) { possible.addAll(dao.findAllByProperties("name", details.get("name"), "category", details.get("category"))); @@ -618,7 +641,7 @@ Map<String, Object> details, Collection<TopiaEntity> possible, AnswerType ... disallow) { - JPanel radioPanel = new JPanel(new GridLayout(1, 0)); + JPanel radioPanel = new JPanel(new FlowLayout()); ButtonGroup group = new ButtonGroup(); for (AutoAnswerType auto : AutoAnswerType.values()) { JRadioButton radio = new JRadioButton(auto.toString); @@ -628,7 +651,7 @@ radioPanel.add(radio); } - JComboBox select = new JComboBox(possible.toArray()); + JComboBox<TopiaEntity> select = new JComboBox<>(possible.toArray(new TopiaEntity[0])); List<AnswerType> allowedOptions = new ArrayList<>(Arrays.asList(AnswerType.values())); for (AnswerType t : disallow) { @@ -636,10 +659,9 @@ } Object[] options = allowedOptions.toArray(); - List descriptions = new ArrayList(); - descriptions.add(String.format("You try to import '%s' (%s)", toString, - ClassUtils.getShortClassName(context.getCurrentType()))); - descriptions.add("Possible answer are:"); + List<Object> descriptions = new ArrayList<>(); + descriptions.add(t("isisfish.import.json.merge.info", toString, ClassUtils.getShortClassName(context.getCurrentType()))); + descriptions.add(t("isisfish.import.json.merge.possibleanswers")); for (AnswerType t : allowedOptions) { descriptions.add(t.toString() + ": " + t.getDescription()); } @@ -651,7 +673,7 @@ int result = JOptionPane.showOptionDialog(null, descriptions.toArray(), - "Make a choice", + t("isisfish.import.json.merge.title"), JOptionPane.DEFAULT_OPTION, JOptionPane.QUESTION_MESSAGE, null, @@ -679,6 +701,7 @@ static public class RegionMergeImportAll implements RegionMerge { protected Answer lastAnswer; + protected Map<String, TopiaEntity> entities; @Override public boolean isAbort() { @@ -686,6 +709,11 @@ } @Override + public void setEntities(Map<String, TopiaEntity> entities) { + this.entities = entities; + } + + @Override public Answer choice(String id, String toString, Map<String, Object> details, AnswerType ... disallow) { return lastAnswer = new Answer(AnswerType.CREATE, null); } Modified: trunk/src/main/java/fr/ifremer/isisfish/entities/StrategyMonthInfoImpl.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/entities/StrategyMonthInfoImpl.java 2017-03-08 14:24:23 UTC (rev 4398) +++ trunk/src/main/java/fr/ifremer/isisfish/entities/StrategyMonthInfoImpl.java 2017-03-09 15:47:27 UTC (rev 4399) @@ -166,13 +166,15 @@ // remplace un simple getMinInactivityDays(), pour pouvoir utiliser une // equation si besoin (tout est pret, il ne manque que l'interface // graphique pour saisir l'equation dans strategie - double inactivity = getStrategy().getInactivityDays(getMonth()); - if (tripType != null && tripType.getTripDuration() != null - && inactivity >= 0) { - int nbDayMonth = getMonth().getNumbersOfDays(); - double result = (nbDayMonth - inactivity) - / tripType.getTripDuration().getDay(); - setNumberOfTrips(result); + if (getStrategy() != null) { // json import error + double inactivity = getStrategy().getInactivityDays(getMonth()); + if (tripType != null && tripType.getTripDuration() != null + && inactivity >= 0) { + int nbDayMonth = getMonth().getNumbersOfDays(); + double result = (nbDayMonth - inactivity) + / tripType.getTripDuration().getDay(); + setNumberOfTrips(result); + } } } Modified: trunk/src/main/java/fr/ifremer/isisfish/ui/input/InputHandler.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/ui/input/InputHandler.java 2017-03-08 14:24:23 UTC (rev 4398) +++ trunk/src/main/java/fr/ifremer/isisfish/ui/input/InputHandler.java 2017-03-09 15:47:27 UTC (rev 4399) @@ -93,16 +93,16 @@ /** * Main handler for fishery edition action. * Next, each ui as his own handler. - * + * * In context : * <ul> * <li>FisheryRegion * <li>RegionStorage * </ul> - * + * * @author chatellier * @version $Revision$ - * + * * Last update : $Date$ * By : $Author$ */ @@ -126,9 +126,9 @@ /** * Load region by region name, set it into jaxx context and refresh ui. - * + * * Before loading region, try to close old one. - * + * * @param name region name to load */ protected void loadRegion(String name) { @@ -187,7 +187,7 @@ inputUI.setContextValue(regionChangeLogger); // just to keep reference (totally useless) inputUI.getCardlayoutPrincipal().show(inputUI.getInputPanePrincipal(),"normale"); - + // autoselect root node (fire some event) fisheryTreeHelper.selectNode((FisheryTreeNode)fisheryTreeModel.getRoot()); } @@ -204,7 +204,7 @@ /** * Main ui fishery region selection changed. - * + * * @param e event */ public void regionChange(ItemEvent e) { @@ -235,7 +235,7 @@ public void createNewRegion() { String name = inputUI.getFieldNewRegion().getText(); setStatusMessage(inputUI, t("isisfish.message.creating.region", name), true); - + if (RegionStorage.getRegionNames().contains(name)) { JOptionPane.showMessageDialog(inputUI, t("isisfish.error.region.already.exists")); } else { @@ -253,7 +253,7 @@ /** * Rafraichit la liste des regions. - * + * * @param selectedItem region to select */ protected void refreshRegionList(String selectedItem) { @@ -279,7 +279,7 @@ t("isisfish.message.import.region.zipped")); if (file != null) { RegionStorage.importZip(file); - + refreshRegionList(null); } @@ -286,7 +286,7 @@ } catch (Exception eee) { throw new IsisFishRuntimeException(t("isisfish.error.region.import"), eee); } - + setStatusMessage(inputUI, t("isisfish.message.import.finished")); } @@ -304,13 +304,13 @@ String newName = JOptionPane .showInputDialog(t("isisfish.message.name.imported.region")); RegionStorage.importAndRenameZip(file, newName); - + refreshRegionList(null); } } catch (Exception eee) { throw new IsisFishRuntimeException(t("isisfish.error.region.import"), eee); } - + setStatusMessage(inputUI, t("isisfish.message.import.finished")); } @@ -363,7 +363,7 @@ try { File file = FileUtil.getFile(".*.zip$", t("isisfish.message.import.region.zipped")); - + if (file != null) { // add .zip extension is not set if (!file.getAbsolutePath().endsWith(".zip")) { @@ -384,14 +384,14 @@ throw new IsisFishRuntimeException("Can't export region", eee); } } - + /** * Exporter une entite json gzip */ protected void exportJson(TopiaEntity e) { try { - File file = FileUtil.getFile(".*" + RegionExportJson.FORMAT_EXTENSION + "$", - t("isisfish.message.import.region.zipped")); + File file = FileUtil.getFile(t("isisfish.input.menu.exportJson"), t("isisfish.common.export"), (Component)null, + ".*" + RegionExportJson.FORMAT_EXTENSION + "$", t("isisfish.message.import.json.zipped")); if (file != null) { if (!file.getAbsolutePath().endsWith(RegionExportJson.FORMAT_EXTENSION)) { @@ -437,8 +437,8 @@ try { InputSaveVerifier inputSaveVerifier = inputUI.getContextValue(InputSaveVerifier.class); if (inputSaveVerifier.checkEdit() != JOptionPane.CANCEL_OPTION) { - File file = FileUtil.getFile(".*" + RegionExportJson.FORMAT_EXTENSION + "$", - t("isisfish.message.import.region.zipped")); + File file = FileUtil.getFile(t("isisfish.input.menu.importJson"), t("isisfish.common.import"), (Component)null, + ".*" + RegionExportJson.FORMAT_EXTENSION + "$", t("isisfish.message.import.json.zipped")); if (file != null) { if (!file.getAbsolutePath().endsWith(RegionExportJson.FORMAT_EXTENSION)) { file = new File(file.getAbsolutePath() + RegionExportJson.FORMAT_EXTENSION); @@ -447,12 +447,11 @@ TopiaContext tx = fisheryRegion.getTopiaContext(); RegionImportJson.RegionMergeDatabase merge = new RegionImportJson.RegionMergeDatabase(tx); - try (InputStream in = new BufferedInputStream( - new GZIPInputStream(new FileInputStream(file)))) { + try (InputStream in = new BufferedInputStream(new GZIPInputStream(new FileInputStream(file)))) { RegionImportJson json = new RegionImportJson(new InputStreamReader(in, "UTF-8"), merge); Collection<TopiaEntity> entities = json.getEntities(); - log.info("Entities to importe: " + entities.size()); + log.info("Entities to import: " + entities.size()); for (TopiaEntity e : entities) { tx.add(e); } @@ -495,7 +494,7 @@ throw new IsisFishRuntimeException("Can't delete region", eee); } } - + /** * Copy la region avec un autre nom. */ @@ -514,7 +513,7 @@ throw new IsisFishRuntimeException("Can't copy region", eee); } } - + /** * Commit region. */ @@ -536,14 +535,12 @@ } else { setStatusMessage(inputUI, t("isisfish.message.commit.region.canceled")); } - } catch (VCSException eee) { + } catch (VCSException | IOException eee) { throw new IsisFishRuntimeException("Can't commit region", eee); - } catch (IOException eee) { - throw new IsisFishRuntimeException("Can't commit region", eee); } setStatusMessage(inputUI, t("isisfish.message.export.done")); } - + /** * Explore region and export any enabled sensitivity factor name with value. */ @@ -576,7 +573,7 @@ /** * Changement de selection dans l'arbre de la pecherie. - * + * * @param event */ public void nodeSelectionChanged(TreeSelectionEvent event) { @@ -626,7 +623,7 @@ /** * Delete tree node referenced by parent, and auto select parent node. - * + * * @param topiaId node id to delete */ public void deleteTreeNode(String topiaId) { @@ -640,7 +637,7 @@ /** * Insert new tree node and select it. - * + * * @param nodeClass node type to create * @param topiaEntity node to insert */ @@ -681,7 +678,7 @@ /** * Update tree node for topiaId. - * + * * @param topiaId node id to update */ public void updateTreeNode(String topiaId) { @@ -694,7 +691,7 @@ /** * Dans le cas d'une creation de population, on doit la creer dans * une espèce. On doit rechercher celle qui est sélectionnée dans l'arbre. - * + * * @return selected species */ public Species findSpecies() { @@ -729,7 +726,7 @@ } catch (TopiaException e) { throw new IsisFishRuntimeException("Can't find "); } - + return result; } } Modified: trunk/src/main/java/fr/ifremer/isisfish/ui/input/InputSaveVerifier.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/ui/input/InputSaveVerifier.java 2017-03-08 14:24:23 UTC (rev 4398) +++ trunk/src/main/java/fr/ifremer/isisfish/ui/input/InputSaveVerifier.java 2017-03-09 15:47:27 UTC (rev 4399) @@ -292,6 +292,12 @@ public void cancel() { TopiaContext topiaContext = inputContentUI.getTopiaContext(); TopiaEntityContextable topiaEntity = inputContentUI.getBean(); + + // cas possible si pas appelé par les boutons d'action, mais par les imports par exemple + if (topiaEntity == null) { + return; + } + try { topiaContext.rollbackTransaction(); noModif(); Modified: trunk/src/main/resources/i18n/isis-fish_en_GB.properties =================================================================== --- trunk/src/main/resources/i18n/isis-fish_en_GB.properties 2017-03-08 14:24:23 UTC (rev 4398) +++ trunk/src/main/resources/i18n/isis-fish_en_GB.properties 2017-03-09 15:47:27 UTC (rev 4399) @@ -119,11 +119,13 @@ isisfish.common.emigration=Emigration isisfish.common.equation=Equation isisfish.common.error=error +isisfish.common.export=Export isisfish.common.file=File isisfish.common.filter=Filter isisfish.common.finish=Finish isisfish.common.gear=Gear isisfish.common.immigration=Immigration +isisfish.common.import=Import isisfish.common.info=info isisfish.common.ko=KO isisfish.common.loadMatrix=Load file @@ -444,6 +446,22 @@ isisfish.gear.standardisationFactor=Standardisation factor isisfish.gear.technicalParameter=Technical parameter isisfish.gear.title=Gear +isisfish.import.json.merge.autoanswer.all=Reply all time same thing for all type +isisfish.import.json.merge.autoanswer.once=Reply only for this answer +isisfish.import.json.merge.autoanswer.type=Reply all time same thing for this type +isisfish.import.json.merge.info=You try to import '%s' (%s) +isisfish.import.json.merge.option.abort=Abort +isisfish.import.json.merge.option.abort.desc=Cancel this import (import nothing). +isisfish.import.json.merge.option.create=Create +isisfish.import.json.merge.option.create.desc=Create new object from file. +isisfish.import.json.merge.option.none=None +isisfish.import.json.merge.option.none.desc=Don't import nor reuse an object. +isisfish.import.json.merge.option.replace=Replace +isisfish.import.json.merge.option.replace.desc=Replace object in current Region with imported object from file (make your choice in next combobox +isisfish.import.json.merge.option.use=Use +isisfish.import.json.merge.option.use.desc=Use (don't import) object already in current Region (make your choice in next combobox). +isisfish.import.json.merge.possibleanswers=Possible answer are \: +isisfish.import.json.merge.title=Select an option isisfish.input.continueCells=Continue to cells isisfish.input.continueGears=Continue to gears isisfish.input.continueMetiers=Continue to metiers @@ -545,6 +563,7 @@ isisfish.message.file.overwrite=File exists, do you want overwrite it ? isisfish.message.import.equation.convert=Manual equation convertion isisfish.message.import.finished=Import finished +isisfish.message.import.json.zipped=Zipped JSON isisfish.message.import.region.zipped=Zipped Region isisfish.message.import.zip=Import zip file isisfish.message.launchui.notlaunch=User interface not started Modified: trunk/src/main/resources/i18n/isis-fish_fr_FR.properties =================================================================== --- trunk/src/main/resources/i18n/isis-fish_fr_FR.properties 2017-03-08 14:24:23 UTC (rev 4398) +++ trunk/src/main/resources/i18n/isis-fish_fr_FR.properties 2017-03-09 15:47:27 UTC (rev 4399) @@ -119,11 +119,13 @@ isisfish.common.emigration=émigration isisfish.common.equation=Equation isisfish.common.error=Erreur +isisfish.common.export=Exporter isisfish.common.file=Fichier isisfish.common.filter=Filtrer isisfish.common.finish=Terminer isisfish.common.gear=Engin isisfish.common.immigration=immigration +isisfish.common.import=Importer isisfish.common.info=Info isisfish.common.ko=KO isisfish.common.loadMatrix=Charger un fichier @@ -444,6 +446,22 @@ isisfish.gear.standardisationFactor=Facteur de standardisation isisfish.gear.technicalParameter=Paramètre technique isisfish.gear.title=Engin +isisfish.import.json.merge.autoanswer.all=Faire la même chose pour tous les objets +isisfish.import.json.merge.autoanswer.once=Seulement pour l'objet courant +isisfish.import.json.merge.autoanswer.type=Faire la même chose pour tous les objets de ce type +isisfish.import.json.merge.info=Vous êtes un train d'importer '%s' (%s) +isisfish.import.json.merge.option.abort=Annuler +isisfish.import.json.merge.option.abort.desc=Annuler cet import (n'importe rien) +isisfish.import.json.merge.option.create=Créer +isisfish.import.json.merge.option.create.desc=Créer un nouvel objet depuis le fichier +isisfish.import.json.merge.option.none=Aucun +isisfish.import.json.merge.option.none.desc=Ne pas importer ou réutliser un objet +isisfish.import.json.merge.option.replace=Remplacer +isisfish.import.json.merge.option.replace.desc=Remplacer l'object dans la region courante par celui du fichier d'import (sélectionner l'object dans la liste) +isisfish.import.json.merge.option.use=Utiliser +isisfish.import.json.merge.option.use.desc=Utiliser (ne pas importer) un objet déjà présent dans la région courante (sélectionner l'object dans la liste) +isisfish.import.json.merge.possibleanswers=Les options possibles sont \: +isisfish.import.json.merge.title=Sélectionner une option isisfish.input.continueCells=Continuer vers les mailles isisfish.input.continueGears=Continuer vers les engins isisfish.input.continueMetiers=Continuer vers les metiers @@ -461,7 +479,7 @@ isisfish.input.menu.addRegion=Ajouter une région isisfish.input.menu.commit=Sauvegarder les changements isisfish.input.menu.copyRegion=Copier région -isisfish.input.menu.exportJson=Exporter l'object courant en JSON +isisfish.input.menu.exportJson=Exporter l'objet courant en JSON isisfish.input.menu.exportRegion=Exporter la région isisfish.input.menu.importJson=Importer des objets JSON isisfish.input.menu.importRegion=Importer une région @@ -545,8 +563,9 @@ isisfish.message.file.overwrite=Le fichier existe, voulez-vous l'écraser ? isisfish.message.import.equation.convert=Conversion manuelle de l'équation isisfish.message.import.finished=Import terminé -isisfish.message.import.region.zipped=Zipped Region -isisfish.message.import.zip=Import zip file +isisfish.message.import.json.zipped=JSON Compressé +isisfish.message.import.region.zipped=Region compressée +isisfish.message.import.zip=Import d'un fichier compressé isisfish.message.launchui.notlaunch=Interface utilisateur non lancée isisfish.message.load.finished=Chargement terminé isisfish.message.load.map=Chargement de la carte \: %1$s