From chatellier@users.labs.libre-entreprise.org Mon Jun 15 04:19:39 2026 From: chatellier@users.labs.libre-entreprise.org To: coser-commits@list.forge.codelutin.com Subject: [Coser-commits] r417 - in trunk: coser-business/src/main/java/fr/ifremer/coser/services coser-business/src/main/resources/i18n coser-business/src/test/java/fr/ifremer/coser/services coser-ui/src/main/java/fr/ifremer/coser/ui/control coser-ui/src/main/java/fr/ifremer/coser/ui/selection coser-ui/src/main/resources/i18n Date: Wed, 15 Dec 2010 16:35:37 +0100 Message-ID: <20101215153537.CC5DC2F259@labs.libre-entreprise.org> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============2079777532117617832==" --===============2079777532117617832== Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Author: chatellier Date: 2010-12-15 15:35:37 +0000 (Wed, 15 Dec 2010) New Revision: 417 Log: Modification des rapports (controle/selection) Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/services/PublicationSe= rvice.java trunk/coser-business/src/main/resources/i18n/coser-business_en_GB.properti= es trunk/coser-business/src/main/resources/i18n/coser-business_fr_FR.properti= es trunk/coser-business/src/test/java/fr/ifremer/coser/services/PublicationSe= rviceTest.java trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlHandler.ja= va trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlView.jaxx trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionDetail= sView.jaxx trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionHandle= r.java trunk/coser-ui/src/main/resources/i18n/coser-ui_en_GB.properties trunk/coser-ui/src/main/resources/i18n/coser-ui_fr_FR.properties Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/services/Public= ationService.java =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- trunk/coser-business/src/main/java/fr/ifremer/coser/services/PublicationS= ervice.java 2010-12-15 15:01:13 UTC (rev 416) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/services/PublicationS= ervice.java 2010-12-15 15:35:37 UTC (rev 417) @@ -65,7 +65,9 @@ import fr.ifremer.coser.CoserBusinessException; import fr.ifremer.coser.CoserConstants.Category; import fr.ifremer.coser.bean.AbstractDataContainer; +import fr.ifremer.coser.bean.Control; import fr.ifremer.coser.bean.Project; +import fr.ifremer.coser.bean.Selection; import fr.ifremer.coser.command.Command; import fr.ifremer.coser.control.ControlError; import fr.ifremer.coser.control.ControlErrorGroup; @@ -417,7 +419,7 @@ } =20 /** - * Extrait les logs des modifications faites sur un conteneur au format = html. + * Extrait les logs des modifications faites sur un control au format ht= ml. *=20 * @param project project * @param container data container @@ -426,7 +428,7 @@ *=20 * @see AbstractDataContainer#getHistoryCommand() */ - public File extractLogAsHTML(Project project, AbstractDataContainer cont= ainer) throws CoserBusinessException { + public File extractControlLogAsHTML(Project project, Control container) = throws CoserBusinessException { File exportHtmlFile =3D null; PrintStream out =3D null; try { @@ -438,13 +440,15 @@ out =3D new PrintStream(exportHtmlFile, "utf-8"); =20 out.println(""); - out.println("" + _("coser.business.publication.logexportt= itle", project.getName())+ ""); + out.println("" + _("coser.business.publication.controllog= exporttitle", project.getName())+ ""); out.println(""); out.println(""); =20 - out.println("

" + _("coser.busine= ss.publication.logexporttitle", project.getName()) + "

"); + // header + out.println("

" + _("coser.busine= ss.publication.controllogexporttitle", project.getName()) + "

"); =20 // partie specific : commandes + out.println("

" + _("coser.business.publication.datamodificat= ion") + "

"); out.println("
    "); for (Command command : container.getHistoryCommand()) { out.println("
  1. " + command.getLogString(container) + ""); @@ -460,4 +464,59 @@ } return exportHtmlFile; } + =20 + /** + * Extrait les logs des modifications faites sur une selection au format= html. + *=20 + * @param project project + * @param selection data container + * @return extractedFile + * @throws CoserBusinessException=20 + *=20 + * @see AbstractDataContainer#getHistoryCommand() + */ + public File extractSelectionLogAsHTML(Project project, Selection selecti= on) throws CoserBusinessException { + File exportHtmlFile =3D null; + PrintStream out =3D null; + try { + exportHtmlFile =3D File.createTempFile("log-", ".html"); + if (log.isInfoEnabled()) { + log.info("Generating HTML report to " + exportHtmlFile.getAb= solutePath()); + } + + out =3D new PrintStream(exportHtmlFile, "utf-8"); + + out.println(""); + out.println("" + _("coser.business.publication.selectionl= ogexporttitle", selection.getName(), project.getName())+ ""); + out.println(""); + out.println(""); + =20 + // header + out.println("

    " + _("coser.busine= ss.publication.selectionlogexporttitle", selection.getName(), project.getName= ()) + "

    "); + + // partie resum=C3=A9 de selection + out.println("

    " + _("coser.business.publication.selectionchoi= ces") + "

    "); + out.println(""); + =20 + // partie specific : commandes + out.println("

    " + _("coser.business.publication.datamodificat= ion") + "

    "); + out.println("
      "); + for (Command command : selection.getHistoryCommand()) { + out.println("
    1. " + command.getLogString(selection) + ""); + } + out.println("
    "); + out.println(""); + } + catch (IOException ex) { + throw new CoserBusinessException("Can't export logs", ex); + } + finally { + IOUtils.closeQuietly(out); + } + return exportHtmlFile; + } } Modified: trunk/coser-business/src/main/resources/i18n/coser-business_en_GB.p= roperties =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- trunk/coser-business/src/main/resources/i18n/coser-business_en_GB.propert= ies 2010-12-15 15:01:13 UTC (rev 416) +++ trunk/coser-business/src/main/resources/i18n/coser-business_en_GB.propert= ies 2010-12-15 15:35:37 UTC (rev 417) @@ -71,11 +71,14 @@ coser.business.matrix.lengthstructure=3DLength structures coser.business.matrix.occurrence=3DOccurrence coser.business.matrix.samplingeffort=3DSampling effort +coser.business.publication.controllogexporttitle=3DSelection report for %s (= project %s) +coser.business.publication.datamodification=3DData modifications coser.business.publication.errorexportlines=3DLines coser.business.publication.errorexporttitle=3DError report for project %s coser.business.publication.errorgraph=3DGraph coser.business.publication.errorgraphs=3DGraphs -coser.business.publication.logexporttitle=3DModifications list for project %s +coser.business.publication.selectionchoices=3DSelection choices +coser.business.publication.selectionlogexporttitle=3D coser.business.result.rsufiResultAlreadyExists=3DResult %s already exists \! coser.business.selection.notValidatedControl=3DNot validated control \! coser.config.control.diffcatchlength.description=3DPercentage difference all= owed between catch and length (in percent, for example 5% set 5.0) Modified: trunk/coser-business/src/main/resources/i18n/coser-business_fr_FR.p= roperties =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- trunk/coser-business/src/main/resources/i18n/coser-business_fr_FR.propert= ies 2010-12-15 15:01:13 UTC (rev 416) +++ trunk/coser-business/src/main/resources/i18n/coser-business_fr_FR.propert= ies 2010-12-15 15:35:37 UTC (rev 417) @@ -71,11 +71,14 @@ coser.business.matrix.lengthstructure=3DStructures en taille coser.business.matrix.occurrence=3DOccurrence coser.business.matrix.samplingeffort=3DEffort d'\u00E9chantillonnage +coser.business.publication.controllogexporttitle=3DRapport de contr\u00F4le = (projet %s) +coser.business.publication.datamodification=3DModifications sur les donn\u00= E9es coser.business.publication.errorexportlines=3DLignes coser.business.publication.errorexporttitle=3DRapport d'erreur pour le proje= t %s coser.business.publication.errorgraph=3DGraphique coser.business.publication.errorgraphs=3DGraphiques -coser.business.publication.logexporttitle=3DListe des modifications pour le = projet %s +coser.business.publication.selectionchoices=3DChoix de s\u00E9lections +coser.business.publication.selectionlogexporttitle=3DRapport de la s\u00E9le= ction %s (projet %s) coser.business.result.rsufiResultAlreadyExists=3DLe r\u00E9sultat %D existe = d\u00E9j\u00E0 \! coser.business.selection.notValidatedControl=3DContr\u00F4le non valid\u00E9= \! coser.config.control.diffcatchlength.description=3DPourcentage d'\u00E9cart = tol\u00E9r\u00E9 entre les captures et les tailles (en pourcent, par exemple = pour 5% mettre 5.0) Modified: trunk/coser-business/src/test/java/fr/ifremer/coser/services/Public= ationServiceTest.java =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- trunk/coser-business/src/test/java/fr/ifremer/coser/services/PublicationS= erviceTest.java 2010-12-15 15:01:13 UTC (rev 416) +++ trunk/coser-business/src/test/java/fr/ifremer/coser/services/PublicationS= erviceTest.java 2010-12-15 15:35:37 UTC (rev 417) @@ -30,6 +30,7 @@ import java.io.File; import java.io.IOException; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Map; =20 @@ -47,7 +48,9 @@ import fr.ifremer.coser.CoserConstants.Category; import fr.ifremer.coser.CoserConstants.ValidationLevel; import fr.ifremer.coser.bean.Project; +import fr.ifremer.coser.bean.Selection; import fr.ifremer.coser.command.DeleteLineCommand; +import fr.ifremer.coser.command.MergeSpeciesCommand; import fr.ifremer.coser.command.ModifyFieldCommand; import fr.ifremer.coser.control.DiffCatchLengthControlError; import fr.ifremer.coser.control.ControlError; @@ -140,16 +143,15 @@ } =20 /** - * Test le rapport de log en html. + * Test le rapport de control en html. *=20 * @throws CoserBusinessException * @throws IOException */ @Test - public void testLogExportHtml() throws CoserBusinessException, IOExcepti= on { + public void testControlLogExportHtml() throws CoserBusinessException, IO= Exception { =20 Project project =3D createTestProject(projectService, false); - Assert.assertEquals(30, project.getControl().getLength().size()); =20 // delete line 2 DeleteLineCommand command =3D new DeleteLineCommand(); @@ -166,7 +168,7 @@ =20 commandService.doAction(command2, project, project.getControl()); =20 - File htmlExport =3D publicationService.extractLogAsHTML(project, pro= ject.getControl()); + File htmlExport =3D publicationService.extractControlLogAsHTML(proje= ct, project.getControl()); =20 // some asserts String fileContent =3D FileUtils.readFileToString(htmlExport); @@ -175,6 +177,45 @@ Assert.assertTrue(fileContent.indexOf("from \"251.86\" to \"392.98\"= ") > 0); =20 // clean all + //htmlExport.delete(); + } + =20 + /** + * Test le rapport de selection en html. + *=20 + * @throws CoserBusinessException + * @throws IOException + */ + @Test + public void testSelectionLogExportHtml() throws CoserBusinessException, = IOException { + =20 + Project project =3D createTestProject(projectService, true); + Selection selection =3D projectService.initProjectSelection(project); + selection.setSelectedYears(Collections.singletonList("2010")); + selection.setSelectedStrata(Collections.singletonList("EG34EB")); + selection.setSelectedSpecies(Collections.singletonList("COSER_SPECIE= S1")); + + // merge species + MergeSpeciesCommand command =3D new MergeSpeciesCommand(); + command.setComment("marged because i wanted to !"); + command.setNewSpecyName("TESTMERGE"); + command.setSpeciesNames(new String[]{"COSER_SPECIES2","COSER_SPECIES= 3"}); + commandService.doAction(command, project, selection); + + commandService.doAction(command, project, selection); + =20 + File htmlExport =3D publicationService.extractSelectionLogAsHTML(pro= ject, selection); + + // some asserts + String fileContent =3D FileUtils.readFileToString(htmlExport); + Assert.assertTrue(fileContent.indexOf("COSER_SPECIES1") > 0); + Assert.assertTrue(fileContent.indexOf("2010") > 0); + Assert.assertTrue(fileContent.indexOf("EG34EB") > 0); + Assert.assertTrue(fileContent.indexOf("TESTMERGE") > 0); + Assert.assertTrue(fileContent.indexOf("COSER_SPECIES2") > 0); + Assert.assertTrue(fileContent.indexOf("COSER_SPECIES3") > 0); + + // clean all htmlExport.delete(); } } Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlHan= dler.java =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlHandler.j= ava 2010-12-15 15:01:13 UTC (rev 416) +++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlHandler.j= ava 2010-12-15 15:35:37 UTC (rev 417) @@ -1045,7 +1045,7 @@ =20 File htmlFile =3D null; try { - htmlFile =3D publicationService.extractLogAsHTML(project, projec= t.getControl()); + htmlFile =3D publicationService.extractControlLogAsHTML(project,= project.getControl()); browseFile(controlView, htmlFile); } catch (CoserBusinessException ex) { throw new CoserException("Can't generate html report", ex); Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlVie= w.jaxx =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlView.jaxx= 2010-12-15 15:01:13 UTC (rev 416) +++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlView.jaxx= 2010-12-15 15:35:37 UTC (rev 417) @@ -60,7 +60,7 @@ onActionPerformed=3D"getHandler().displayLengthStructure= Graph(this)"/> + text=3D"coser.ui.control.controlreport" /> + text=3D"coser.ui.selection.selectionreport" /> Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/Selectio= nHandler.java =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionHandl= er.java 2010-12-15 15:01:13 UTC (rev 416) +++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionHandl= er.java 2010-12-15 15:35:37 UTC (rev 417) @@ -1180,7 +1180,7 @@ =20 File htmlFile =3D null; try { - htmlFile =3D publicationService.extractLogAsHTML(project, select= ion); + htmlFile =3D publicationService.extractSelectionLogAsHTML(projec= t, selection); browseFile(view, htmlFile); } catch (CoserBusinessException ex) { throw new CoserException("Can't generate html report", ex); Modified: trunk/coser-ui/src/main/resources/i18n/coser-ui_en_GB.properties =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- trunk/coser-ui/src/main/resources/i18n/coser-ui_en_GB.properties 2010-12-= 15 15:01:13 UTC (rev 416) +++ trunk/coser-ui/src/main/resources/i18n/coser-ui_en_GB.properties 2010-12-= 15 15:35:37 UTC (rev 417) @@ -28,6 +28,7 @@ coser.ui.control.controlSaved=3DControl saved. coser.ui.control.controlTitle=3DControl coser.ui.control.controlValidated=3DControl validated and saved. +coser.ui.control.controlreport=3DControl report coser.ui.control.dataMenuDeleteSelected=3DDeleted selected lines coser.ui.control.dataMenuLabel=3DData menu coser.ui.control.dataMenuReplace=3DReplace in %s for selection @@ -39,7 +40,6 @@ coser.ui.control.globalErrorMenuGenerateHTML=3DExport as HTML coser.ui.control.globalErrorMenuSelectAll=3DSelect all lines coser.ui.control.graph.species=3DSpecies \: -coser.ui.control.logreport=3DModification report coser.ui.control.progressStep=3DStep %d/%d \: %s coser.ui.control.project.requiredauthor=3DAuthor field is required coser.ui.control.project.requiredcatchFile=3DCatch file is required @@ -184,7 +184,6 @@ coser.ui.selection.fusion.title=3DMerge coser.ui.selection.fusionError=3DMerge error coser.ui.selection.invalidFusionName=3DSelection fusion name not found in re= ferential \! -coser.ui.selection.logreport=3DModification report coser.ui.selection.maturitySpecies=3DL4 \: Species with maturity (%d/%d) coser.ui.selection.nonJustifiedMaturity=3DMaturity species list is not all s= elected.\nYou must justify this selection with a comment. coser.ui.selection.nonJustifiedOccurenceDensity=3DFiltered list selection do= esn't match filter selection.\nYou must justify this selection with a comment. @@ -203,6 +202,7 @@ coser.ui.selection.selectionSaved=3DSelection saved. coser.ui.selection.selectionTitle=3DSelection coser.ui.selection.selectionValidated=3DSelection validated and saved. +coser.ui.selection.selectionreport=3DSelection report coser.ui.selection.sizeAllYearSpecies=3DL3 \: Species with size all year (%d= /%d) coser.ui.selection.speciesMenuFusion=3DMerge coser.ui.selection.speciesMerged=3DSpecies merged. Modified: trunk/coser-ui/src/main/resources/i18n/coser-ui_fr_FR.properties =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- trunk/coser-ui/src/main/resources/i18n/coser-ui_fr_FR.properties 2010-12-= 15 15:01:13 UTC (rev 416) +++ trunk/coser-ui/src/main/resources/i18n/coser-ui_fr_FR.properties 2010-12-= 15 15:35:37 UTC (rev 417) @@ -28,6 +28,7 @@ coser.ui.control.controlSaved=3DContr\u00F4le sauv\u00E9. coser.ui.control.controlTitle=3DContr\u00F4le coser.ui.control.controlValidated=3DContr\u00F4le valid\u00E9 et sauv\u00E9. +coser.ui.control.controlreport=3DRapport de contr\u00F4le coser.ui.control.dataMenuDeleteSelected=3DSupprimer les lignes s\u00E9lectio= nn\u00E9es coser.ui.control.dataMenuLabel=3DMenu des donn\u00E9es coser.ui.control.dataMenuReplace=3DRemplacer dans %s pour la s\u00E9lection @@ -39,7 +40,6 @@ coser.ui.control.globalErrorMenuGenerateHTML=3DExporter en HTML coser.ui.control.globalErrorMenuSelectAll=3DS\u00E9lectionner toutes les lig= nes coser.ui.control.graph.species=3DEsp\u00E8ces \: -coser.ui.control.logreport=3DRapport des modifications coser.ui.control.progressStep=3D\u00C9tape %d/%d \: %s coser.ui.control.project.requiredauthor=3DLe champ 'auteur' est requis coser.ui.control.project.requiredcatchFile=3DLe fichier 'capture' est requis @@ -184,7 +184,6 @@ coser.ui.selection.fusion.title=3DFusion coser.ui.selection.fusionError=3DErreur de fusion coser.ui.selection.invalidFusionName=3DLe nom de fusion choisit n'est pas pr= \u00E9sent de le r\u00E9f\u00E9rentiel \! -coser.ui.selection.logreport=3DRapport des modifications coser.ui.selection.maturitySpecies=3DL4 \: Esp\u00E8ces avec maturit\u00E9 (= %d/%d) coser.ui.selection.nonJustifiedMaturity=3DLa liste esp\u00E8ces avec maturit= \u00E9 n'est pas enti\u00E8rement s\u00E9lectionn\u00E9e.\nVous devez justifi= er cette s\u00E9lection par un commentaire. coser.ui.selection.nonJustifiedOccurenceDensity=3DLa s\u00E9lection de la li= ste filtr\u00E9e ne correspond pas \u00E0 la s\u00E9lection op\u00E9r\u00E9e = par le filtre.\nVous devez justifier cette s\u00E9lection par un commentaire. @@ -203,6 +202,7 @@ coser.ui.selection.selectionSaved=3DS\u00E9lection sauv\u00E9e. coser.ui.selection.selectionTitle=3DS\u00E9lection coser.ui.selection.selectionValidated=3DS\u00E9lection valid\u00E9e et sauv\= u00E9e. +coser.ui.selection.selectionreport=3DRapport de la s\u00E9lection coser.ui.selection.sizeAllYearSpecies=3DL3 \: Esp\u00E8ces avec taille pour = toutes les ann\u00E9es (%d/%d) coser.ui.selection.speciesMenuFusion=3DFusion coser.ui.selection.speciesMerged=3DEsp\u00E8ces fusionn\u00E9es. --===============2079777532117617832==--