From 4f4d18ec1ac156fffa66994bc4a72e8a44ef2afb Mon Sep 17 00:00:00 2001 From: qqmyers Date: Wed, 27 Jan 2021 16:58:26 -0500 Subject: [PATCH 01/24] fix for local issue in date test --- .../java/edu/harvard/iq/dataverse/FileMetadataTest.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/test/java/edu/harvard/iq/dataverse/FileMetadataTest.java b/src/test/java/edu/harvard/iq/dataverse/FileMetadataTest.java index e9e9ea4a051..69de7a2900d 100644 --- a/src/test/java/edu/harvard/iq/dataverse/FileMetadataTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/FileMetadataTest.java @@ -1,10 +1,15 @@ package edu.harvard.iq.dataverse; import java.sql.Timestamp; +import java.text.DateFormat; +import java.time.Instant; +import java.util.Date; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import edu.harvard.iq.dataverse.util.BundleUtil; + import static org.junit.jupiter.api.Assertions.assertEquals; public class FileMetadataTest { @@ -35,7 +40,7 @@ void testGetFileDateToDisplay_fileWithoutPublicationDate() { datafile.setPublicationDate(null); datafile.setCreateDate(Timestamp.valueOf("2019-01-01 00:00:00")); metadata.setDataFile(datafile); - assertEquals("Jan 1, 2019", metadata.getFileDateToDisplay()); + assertEquals(DateFormat.getDateInstance(DateFormat.DEFAULT, BundleUtil.getCurrentLocale()).format(Date.from(Instant.parse("2019-01-01T00:00:00.00Z"))), metadata.getFileDateToDisplay()); } @Test @@ -44,6 +49,6 @@ void testGetFileDateToDisplay_fileWithPublicationDate() { datafile.setPublicationDate(Timestamp.valueOf("2019-02-02 00:00:00")); datafile.setCreateDate(Timestamp.valueOf("2019-01-02 00:00:00")); metadata.setDataFile(datafile); - assertEquals("Feb 2, 2019", metadata.getFileDateToDisplay()); + assertEquals(DateFormat.getDateInstance(DateFormat.DEFAULT, BundleUtil.getCurrentLocale()).format(Date.from(Instant.parse("2019-02-02T00:00:00.00Z"))), metadata.getFileDateToDisplay()); } } From f78e7116cff0ce2bcacf1aeb03a8c110872404f2 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Mon, 21 Jun 2021 12:57:09 -0400 Subject: [PATCH 02/24] #6751 - use i18n CVV values --- .../dataverse/export/ddi/DdiExportUtil.java | 104 +++++++++++++++--- 1 file changed, 88 insertions(+), 16 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java b/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java index 6e83d9515c5..20b2d3f9b00 100644 --- a/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java @@ -1,6 +1,8 @@ package edu.harvard.iq.dataverse.export.ddi; import com.google.gson.Gson; + +import edu.harvard.iq.dataverse.ControlledVocabularyValue; import edu.harvard.iq.dataverse.DataFile; import edu.harvard.iq.dataverse.DataTable; import edu.harvard.iq.dataverse.DatasetFieldConstant; @@ -241,14 +243,14 @@ private static void createStdyDscr(XMLStreamWriter xmlw, DatasetDTO datasetDto) // Study Info xmlw.writeStartElement("stdyInfo"); - writeSubjectElement(xmlw, version); //Subject and Keywords + writeSubjectElement(xmlw, version, datasetDto.getMetadataLanguage()); //Subject and Keywords writeAbstractElement(xmlw, version, datasetDto.getMetadataLanguage()); // Description - writeSummaryDescriptionElement(xmlw, version); + writeSummaryDescriptionElement(xmlw, version, datasetDto.getMetadataLanguage()); writeFullElement(xmlw, "notes", dto2Primitive(version, DatasetFieldConstant.notesText)); //////// xmlw.writeEndElement(); // stdyInfo - writeMethodElement(xmlw, version); + writeMethodElement(xmlw, version, datasetDto.getMetadataLanguage()); writeDataAccess(xmlw , version); writeOtherStudyMaterial(xmlw , version); @@ -361,7 +363,7 @@ private static void writeVersionStatement(XMLStreamWriter xmlw, DatasetVersionDT xmlw.writeEndElement(); // verStmt } - private static void writeSummaryDescriptionElement(XMLStreamWriter xmlw, DatasetVersionDTO datasetVersionDTO) throws XMLStreamException { + private static void writeSummaryDescriptionElement(XMLStreamWriter xmlw, DatasetVersionDTO datasetVersionDTO, String lang) throws XMLStreamException { xmlw.writeStartElement("sumDscr"); for (Map.Entry entry : datasetVersionDTO.getMetadataBlocks().entrySet()) { String key = entry.getKey(); @@ -491,7 +493,8 @@ private static void writeSummaryDescriptionElement(XMLStreamWriter xmlw, Dataset writeMultipleElement(xmlw, "universe", fieldDTO); } if (DatasetFieldConstant.unitOfAnalysis.equals(fieldDTO.getTypeName())) { - writeMultipleElement(xmlw, "anlyUnit", fieldDTO); + writeMultipleElement(xmlw, "anlyUnit", fieldDTO); + writeI18NElementList(xmlw, "anlyUnit", fieldDTO.getMultipleVocab(), "unitOfAnalysis", fieldDTO.getTypeClass(), "socialscience", lang); } } } @@ -516,14 +519,14 @@ private static void writeDateElement(XMLStreamWriter xmlw, String element, Strin } - private static void writeMethodElement(XMLStreamWriter xmlw , DatasetVersionDTO version) throws XMLStreamException{ + private static void writeMethodElement(XMLStreamWriter xmlw , DatasetVersionDTO version, String lang) throws XMLStreamException{ xmlw.writeStartElement("method"); xmlw.writeStartElement("dataColl"); - writeFullElement(xmlw, "timeMeth", dto2Primitive(version, DatasetFieldConstant.timeMethod)); + writeI18NElement(xmlw, "timeMeth", version, DatasetFieldConstant.timeMethod,lang); writeFullElement(xmlw, "dataCollector", dto2Primitive(version, DatasetFieldConstant.dataCollector)); writeFullElement(xmlw, "collectorTraining", dto2Primitive(version, DatasetFieldConstant.collectorTraining)); writeFullElement(xmlw, "frequenc", dto2Primitive(version, DatasetFieldConstant.frequencyOfDataCollection)); - writeFullElement(xmlw, "sampProc", dto2Primitive(version, DatasetFieldConstant.samplingProcedure)); + writeI18NElement(xmlw, "sampProc", version, DatasetFieldConstant.samplingProcedure, lang); writeTargetSampleElement(xmlw, version); @@ -536,8 +539,8 @@ private static void writeMethodElement(XMLStreamWriter xmlw , DatasetVersionDTO writeFullElement(xmlw, "srcDocu", dto2Primitive(version, DatasetFieldConstant.accessToSources)); xmlw.writeEndElement(); //sources - writeFullElement(xmlw, "collMode", dto2Primitive(version, DatasetFieldConstant.collectionMode)); - writeFullElement(xmlw, "resInstru", dto2Primitive(version, DatasetFieldConstant.researchInstrument)); + writeI18NElement(xmlw, "collMode", version, DatasetFieldConstant.collectionMode, lang); + writeI18NElement(xmlw, "resInstru", version, DatasetFieldConstant.researchInstrument, lang); writeFullElement(xmlw, "collSitu", dto2Primitive(version, DatasetFieldConstant.dataCollectionSituation)); writeFullElement(xmlw, "actMin", dto2Primitive(version, DatasetFieldConstant.actionsToMinimizeLoss)); writeFullElement(xmlw, "conOps", dto2Primitive(version, DatasetFieldConstant.controlOperations)); @@ -556,7 +559,7 @@ private static void writeMethodElement(XMLStreamWriter xmlw , DatasetVersionDTO xmlw.writeEndElement();//method } - private static void writeSubjectElement(XMLStreamWriter xmlw, DatasetVersionDTO datasetVersionDTO) throws XMLStreamException{ + private static void writeSubjectElement(XMLStreamWriter xmlw, DatasetVersionDTO datasetVersionDTO, String lang) throws XMLStreamException{ //Key Words and Topic Classification @@ -567,11 +570,7 @@ private static void writeSubjectElement(XMLStreamWriter xmlw, DatasetVersionDTO if ("citation".equals(key)) { for (FieldDTO fieldDTO : value.getFields()) { if (DatasetFieldConstant.subject.equals(fieldDTO.getTypeName())){ - for ( String subject : fieldDTO.getMultipleVocab()){ - xmlw.writeStartElement("keyword"); - xmlw.writeCharacters(subject); - xmlw.writeEndElement(); //Keyword - } + writeI18NElementList(xmlw, "keyword", fieldDTO.getMultipleVocab(), "subject", fieldDTO.getTypeClass(), "citation", lang); } if (DatasetFieldConstant.keyword.equals(fieldDTO.getTypeName())) { @@ -1314,6 +1313,26 @@ private static String dto2Primitive(DatasetVersionDTO datasetVersionDTO, String return null; } + private static String dto2Primitive(DatasetVersionDTO datasetVersionDTO, String datasetFieldTypeName, Locale locale) { + for (Map.Entry entry : datasetVersionDTO.getMetadataBlocks().entrySet()) { + MetadataBlockDTO value = entry.getValue(); + for (FieldDTO fieldDTO : value.getFields()) { + if (datasetFieldTypeName.equals(fieldDTO.getTypeName())) { + String rawVal = fieldDTO.getSinglePrimitive(); + if (fieldDTO.getTypeClass().equals("controlledVocabulary")) { + String localeVal = ControlledVocabularyValue.getLocaleStrValue(rawVal, datasetFieldTypeName, value.getName(), + locale, false); + if (localeVal != null) { + rawVal = localeVal; + } + } + return rawVal; + } + } + } + return null; + } + private static List dto2PrimitiveList(DatasetVersionDTO datasetVersionDTO, String datasetFieldTypeName) { for (Map.Entry entry : datasetVersionDTO.getMetadataBlocks().entrySet()) { MetadataBlockDTO value = entry.getValue(); @@ -1336,6 +1355,59 @@ private static void writeFullElementList(XMLStreamWriter xmlw, String name, List } } } + + private static void writeI18NElementList(XMLStreamWriter xmlw, String name, List values, + String fieldTypeName, String fieldTypeClass, String metadataBlockName, String lang) + throws XMLStreamException { + + if (values != null && !values.isEmpty()) { + Locale defaultLocale = Locale.getDefault(); + for (String value : values) { + if (fieldTypeClass.equals("controlledVocabulary")) { + String localeVal = ControlledVocabularyValue.getLocaleStrValue(value, fieldTypeName, metadataBlockName, defaultLocale, false); + if (localeVal != null) { + + value = localeVal; + writeFullElement(xmlw, name, value, defaultLocale.getLanguage()); + } else { + writeFullElement(xmlw, name, value); + } + } else { + writeFullElement(xmlw, name, value); + } + } + if (lang != null && !defaultLocale.getLanguage().equals(lang)) { + // Get values in dataset metadata language + // Loop before testing fieldTypeClass to be ready for external CVV + for (String value : values) { + if (fieldTypeClass.equals("controlledVocabulary")) { + String localeVal = ControlledVocabularyValue.getLocaleStrValue(value, fieldTypeName, metadataBlockName, new Locale(lang), false); + if (localeVal != null) { + writeFullElement(xmlw, name, localeVal, lang); + } + } + } + } + } + } + + private static void writeI18NElement(XMLStreamWriter xmlw, String name, DatasetVersionDTO version, String fieldTypeName, + String lang) throws XMLStreamException { + String val = dto2Primitive(version, fieldTypeName); + Locale defaultLocale = Locale.getDefault(); + String localeVal = dto2Primitive(version, fieldTypeName, defaultLocale); + if (localeVal == null) { + writeFullElement(xmlw, name, val); + } else { + writeFullElement(xmlw, name, localeVal, defaultLocale.getLanguage()); + } + if (lang != null && !defaultLocale.getLanguage().equals(lang)) { + localeVal = dto2Primitive(version, fieldTypeName, new Locale(lang)); + if (localeVal != null) { + writeFullElement(xmlw, name, localeVal, lang); + } + } + } private static void writeFullElement(XMLStreamWriter xmlw, String name, String value) throws XMLStreamException { writeFullElement(xmlw, name, value, null); From ca5f3e44e5fb49ca1ac6e0ae65d088a13283f6c7 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Mon, 21 Jun 2021 13:02:04 -0400 Subject: [PATCH 03/24] remove original write for anlyUnit --- .../java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java b/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java index 20b2d3f9b00..98ada769987 100644 --- a/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java @@ -493,7 +493,6 @@ private static void writeSummaryDescriptionElement(XMLStreamWriter xmlw, Dataset writeMultipleElement(xmlw, "universe", fieldDTO); } if (DatasetFieldConstant.unitOfAnalysis.equals(fieldDTO.getTypeName())) { - writeMultipleElement(xmlw, "anlyUnit", fieldDTO); writeI18NElementList(xmlw, "anlyUnit", fieldDTO.getMultipleVocab(), "unitOfAnalysis", fieldDTO.getTypeClass(), "socialscience", lang); } } From b9177b25886137b6c07d4b01308746252e951b77 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Mon, 21 Jun 2021 14:29:40 -0400 Subject: [PATCH 04/24] fix old formatting --- .../edu/harvard/iq/dataverse/ControlledVocabularyValue.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/ControlledVocabularyValue.java b/src/main/java/edu/harvard/iq/dataverse/ControlledVocabularyValue.java index 96133eeb631..4f481426b49 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ControlledVocabularyValue.java +++ b/src/main/java/edu/harvard/iq/dataverse/ControlledVocabularyValue.java @@ -114,13 +114,11 @@ public void setControlledVocabAlternates(Collection co this.controlledVocabAlternates = controlledVocabAlternates; } - public String getLocaleStrValue() - { + public String getLocaleStrValue() { return getLocaleStrValue(strValue, this.datasetFieldType.getName(),getDatasetFieldType().getMetadataBlock().getName(),null, true); } - public String getLocaleStrValue(String language) - { + public String getLocaleStrValue(String language) { return getLocaleStrValue(strValue, this.datasetFieldType.getName(),getDatasetFieldType().getMetadataBlock().getName(),language == null ? null : new Locale(language), true); } From 1c1fa3bf3abe94e4a06915c38910a3bc49e15ece Mon Sep 17 00:00:00 2001 From: qqmyers Date: Mon, 21 Jun 2021 15:33:22 -0400 Subject: [PATCH 05/24] match metadataLanguage in example data --- .../java/edu/harvard/iq/dataverse/export/ddi/dataset-finch1.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/edu/harvard/iq/dataverse/export/ddi/dataset-finch1.xml b/src/test/java/edu/harvard/iq/dataverse/export/ddi/dataset-finch1.xml index 70a2e139929..b58457a4305 100644 --- a/src/test/java/edu/harvard/iq/dataverse/export/ddi/dataset-finch1.xml +++ b/src/test/java/edu/harvard/iq/dataverse/export/ddi/dataset-finch1.xml @@ -33,7 +33,7 @@ - Medicine, Health and Life Sciences + Medicine, Health and Life Sciences Keyword Value 1 Keyword Value Two TC Value 1 From 8b424656aa0071c5560e56e7285b4d1db28e1c0d Mon Sep 17 00:00:00 2001 From: qqmyers Date: Mon, 21 Jun 2021 15:29:08 -0400 Subject: [PATCH 06/24] update test data with metadataLanguage value --- .../java/edu/harvard/iq/dataverse/export/ddi/dataset-finch1.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/java/edu/harvard/iq/dataverse/export/ddi/dataset-finch1.json b/src/test/java/edu/harvard/iq/dataverse/export/ddi/dataset-finch1.json index da4fe5555af..066222a5017 100644 --- a/src/test/java/edu/harvard/iq/dataverse/export/ddi/dataset-finch1.json +++ b/src/test/java/edu/harvard/iq/dataverse/export/ddi/dataset-finch1.json @@ -4,6 +4,7 @@ "persistentUrl": "https://doi.org/10.5072/FK2/PCA2E3", "protocol": "doi", "authority": "10.5072/FK2", + "metadataLanguage": "en", "datasetVersion": { "id": 2, "versionNumber": 1, From 120f0b13ea6b86ab7e2c3a0010fd5740c7535f99 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Tue, 22 Jun 2021 13:51:38 -0400 Subject: [PATCH 07/24] use default locale language if no metadata lang is set --- .../harvard/iq/dataverse/export/ddi/DdiExportUtil.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java b/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java index 98ada769987..fc19a2bbc2d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java @@ -126,9 +126,10 @@ private static void dtoddi(DatasetDTO datasetDto, OutputStream outputStream) thr xmlw.writeAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance"); xmlw.writeAttribute("xsi:schemaLocation", DDIExporter.DEFAULT_XML_NAMESPACE + " " + DDIExporter.DEFAULT_XML_SCHEMALOCATION); writeAttribute(xmlw, "version", DDIExporter.DEFAULT_XML_VERSION); - if(datasetDto.getMetadataLanguage()!=null) { - writeAttribute(xmlw, "xml:lang", datasetDto.getMetadataLanguage()); + if(datasetDto.getMetadataLanguage()==null) { + datasetDto.setMetadataLanguage(Locale.getDefault().getLanguage()); } + writeAttribute(xmlw, "xml:lang", datasetDto.getMetadataLanguage()); createStdyDscr(xmlw, datasetDto); createOtherMats(xmlw, datasetDto.getDatasetVersion().getFiles()); xmlw.writeEndElement(); // codeBook @@ -148,9 +149,10 @@ public static void datasetJson2ddi(JsonObject datasetDtoAsJson, DatasetVersion v xmlw.writeAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance"); xmlw.writeAttribute("xsi:schemaLocation", DDIExporter.DEFAULT_XML_NAMESPACE + " " + DDIExporter.DEFAULT_XML_SCHEMALOCATION); writeAttribute(xmlw, "version", DDIExporter.DEFAULT_XML_VERSION); - if(datasetDto.getMetadataLanguage()!=null) { - writeAttribute(xmlw, "xml:lang", datasetDto.getMetadataLanguage()); + if(datasetDto.getMetadataLanguage()==null) { + datasetDto.setMetadataLanguage(Locale.getDefault().getLanguage()); } + writeAttribute(xmlw, "xml:lang", datasetDto.getMetadataLanguage()); createStdyDscr(xmlw, datasetDto); createFileDscr(xmlw, version); createDataDscr(xmlw, version); From c95199a692ccc8e1815adc4bf6eb49c401f24ea8 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Tue, 22 Jun 2021 13:52:38 -0400 Subject: [PATCH 08/24] add name in toString (for debug) --- .../java/edu/harvard/iq/dataverse/api/dto/MetadataBlockDTO.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/api/dto/MetadataBlockDTO.java b/src/main/java/edu/harvard/iq/dataverse/api/dto/MetadataBlockDTO.java index 4805ca9be09..71eca470e75 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/dto/MetadataBlockDTO.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/dto/MetadataBlockDTO.java @@ -71,7 +71,7 @@ public void setFields(List fields) { @Override public String toString() { - return "MetadataBlockDTO{" + "displayName=" + displayName + ", fields=" + fields + '}'; + return "MetadataBlockDTO{" + "displayName=" + displayName + ", name=" + name + ", fields=" + fields + '}'; } public String getName() { From 0731df3c01d87116b06ecc2ddce41f4f16c3b3f8 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Tue, 22 Jun 2021 13:53:17 -0400 Subject: [PATCH 09/24] update tests --- .../iq/dataverse/DatasetFieldType.java | 1 + .../harvard/iq/dataverse/MetadataBlock.java | 11 +++++++ .../iq/dataverse/export/DDIExporterTest.java | 1 + .../export/SchemaDotOrgExporterTest.java | 1 + .../dataverse/export/ddi/dataset-finch1.json | 2 ++ .../dataverse/export/ddi/dataset-finch1.xml | 10 +++---- .../iq/dataverse/export/ddi/exportfull.xml | 30 +++++++++---------- .../dataverse/feedback/FeedbackUtilTest.java | 1 + .../dataverse/mocks/MockDatasetFieldSvc.java | 10 +++++++ .../dataverse/util/json/JsonParserTest.java | 1 + .../dataverse/util/json/JsonPrinterTest.java | 1 + src/test/resources/json/dataset-finch1.json | 3 +- src/test/resources/json/dataset-finch2.json | 4 ++- 13 files changed, 54 insertions(+), 22 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetFieldType.java b/src/main/java/edu/harvard/iq/dataverse/DatasetFieldType.java index 842b9490784..a092cdad784 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetFieldType.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetFieldType.java @@ -140,6 +140,7 @@ public void setOptionSelectItems(List optionSelectItems) { public DatasetFieldType() {} + //For use in tests public DatasetFieldType(String name, FieldType fieldType, boolean allowMultiples) { // use the name for both default name and title this.name = name; diff --git a/src/main/java/edu/harvard/iq/dataverse/MetadataBlock.java b/src/main/java/edu/harvard/iq/dataverse/MetadataBlock.java index 1a1a87b1b87..ddcdf35dd75 100644 --- a/src/main/java/edu/harvard/iq/dataverse/MetadataBlock.java +++ b/src/main/java/edu/harvard/iq/dataverse/MetadataBlock.java @@ -1,8 +1,10 @@ package edu.harvard.iq.dataverse; +import edu.harvard.iq.dataverse.DatasetFieldType.FieldType; import edu.harvard.iq.dataverse.util.BundleUtil; import java.io.Serializable; +import java.util.LinkedList; import java.util.List; import java.util.MissingResourceException; import java.util.Objects; @@ -49,6 +51,15 @@ public class MetadataBlock implements Serializable { @Column( name = "namespaceuri", columnDefinition = "TEXT") private String namespaceUri; + + public MetadataBlock() { + } + + //For use in tests + public MetadataBlock(String name) { + this.name = name; + } + public Long getId() { return id; } diff --git a/src/test/java/edu/harvard/iq/dataverse/export/DDIExporterTest.java b/src/test/java/edu/harvard/iq/dataverse/export/DDIExporterTest.java index 3a5ef60a0e4..71be6a9e714 100644 --- a/src/test/java/edu/harvard/iq/dataverse/export/DDIExporterTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/export/DDIExporterTest.java @@ -34,6 +34,7 @@ public class DDIExporterTest { @Before public void setUp() { datasetFieldTypeSvc = new MockDatasetFieldSvc(); + datasetFieldTypeSvc.setMetadataBlock("citation"); DatasetFieldType titleType = datasetFieldTypeSvc.add(new DatasetFieldType("title", FieldType.TEXTBOX, false)); DatasetFieldType authorType = datasetFieldTypeSvc.add(new DatasetFieldType("author", FieldType.TEXT, true)); diff --git a/src/test/java/edu/harvard/iq/dataverse/export/SchemaDotOrgExporterTest.java b/src/test/java/edu/harvard/iq/dataverse/export/SchemaDotOrgExporterTest.java index 1ae0b9b12ca..09d0577a282 100644 --- a/src/test/java/edu/harvard/iq/dataverse/export/SchemaDotOrgExporterTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/export/SchemaDotOrgExporterTest.java @@ -61,6 +61,7 @@ public static void tearDownClass() { @Before public void setUp() { datasetFieldTypeSvc = new MockDatasetFieldSvc(); + datasetFieldTypeSvc.setMetadataBlock("citation"); DatasetFieldType titleType = datasetFieldTypeSvc.add(new DatasetFieldType("title", DatasetFieldType.FieldType.TEXTBOX, false)); DatasetFieldType authorType = datasetFieldTypeSvc.add(new DatasetFieldType("author", DatasetFieldType.FieldType.TEXT, true)); diff --git a/src/test/java/edu/harvard/iq/dataverse/export/ddi/dataset-finch1.json b/src/test/java/edu/harvard/iq/dataverse/export/ddi/dataset-finch1.json index 066222a5017..bffbf9717a8 100644 --- a/src/test/java/edu/harvard/iq/dataverse/export/ddi/dataset-finch1.json +++ b/src/test/java/edu/harvard/iq/dataverse/export/ddi/dataset-finch1.json @@ -17,6 +17,7 @@ "metadataBlocks": { "citation": { "displayName": "Citation Metadata", + "name":"citation", "fields": [ { "typeName": "title", @@ -307,6 +308,7 @@ }, "geospatial": { "displayName": "Geospatial", + "name":"geospatial", "fields": [ { "typeName": "geographicCoverage", diff --git a/src/test/java/edu/harvard/iq/dataverse/export/ddi/dataset-finch1.xml b/src/test/java/edu/harvard/iq/dataverse/export/ddi/dataset-finch1.xml index b58457a4305..36566eaa715 100644 --- a/src/test/java/edu/harvard/iq/dataverse/export/ddi/dataset-finch1.xml +++ b/src/test/java/edu/harvard/iq/dataverse/export/ddi/dataset-finch1.xml @@ -1,9 +1,9 @@ - + - Darwin's Finches + Darwin's Finches doi:10.5072/FK2/PCA2E3 @@ -16,7 +16,7 @@ - Darwin's Finches + Darwin's Finches doi:10.5072/FK2/PCA2E3 @@ -26,7 +26,7 @@ Johnny Hawk - Odin Raven + Odin Raven Jimmy Finch Added, Depositor @@ -38,7 +38,7 @@ Keyword Value Two TC Value 1 - Darwin's finches (also known as the Galápagos finches) are a group of about fifteen species of passerine birds. + Darwin's finches (also known as the Galápagos finches) are a group of about fifteen species of passerine birds. 20020816 20160630 diff --git a/src/test/java/edu/harvard/iq/dataverse/export/ddi/exportfull.xml b/src/test/java/edu/harvard/iq/dataverse/export/ddi/exportfull.xml index 9b803c9f1bb..d1892109564 100644 --- a/src/test/java/edu/harvard/iq/dataverse/export/ddi/exportfull.xml +++ b/src/test/java/edu/harvard/iq/dataverse/export/ddi/exportfull.xml @@ -1,9 +1,9 @@ - + - Replication Data for: Title + Replication Data for: Title doi:10.5072/FK2/WKUKGV @@ -19,7 +19,7 @@ - Replication Data for: Title + Replication Data for: Title Subtitle Alternative Title doi:10.5072/FK2/WKUKGV @@ -44,8 +44,8 @@ Root - LastDistributor1, FirstDistributor1 - LastDistributor2, FirstDistributor2 + LastDistributor1, FirstDistributor1 + LastDistributor2, FirstDistributor2 LastContact1, FirstContact1 LastContact2, FirstContact2 1004-01-01 @@ -59,15 +59,15 @@ - Agricultural Sciences - Business and Management - Engineering - Law + Agricultural Sciences + Business and Management + Engineering + Law KeywordTerm1 KeywordTerm2 - DescriptionText 1 - DescriptionText2 + DescriptionText 1 + DescriptionText2 1005-01-01 1005-01-02 @@ -110,11 +110,11 @@ - TimeMethod + TimeMethod LastDataCollector1, FirstDataCollector1 CollectorTraining Frequency - SamplingProcedure + SamplingProcedure TargetSampleSizeFormula 100 @@ -127,8 +127,8 @@ CharacteristicOfSourcesNoted DocumentationAndAccessToSources - CollectionMode - TypeOfResearchInstrument + CollectionMode + TypeOfResearchInstrument CharacteristicsOfDataCollectionSituation ActionsToMinimizeLosses ControlOperations diff --git a/src/test/java/edu/harvard/iq/dataverse/feedback/FeedbackUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/feedback/FeedbackUtilTest.java index 07aff9d5836..5488f9c4403 100644 --- a/src/test/java/edu/harvard/iq/dataverse/feedback/FeedbackUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/feedback/FeedbackUtilTest.java @@ -69,6 +69,7 @@ public static void setUpClass() throws IOException, JsonParseException, AddressE systemAddress = new InternetAddress(systemEmail, supportTeamName); datasetFieldTypeSvc = new MockDatasetFieldSvc(); + datasetFieldTypeSvc.setMetadataBlock("citation"); DatasetFieldType titleType = datasetFieldTypeSvc.add(new DatasetFieldType("title", DatasetFieldType.FieldType.TEXTBOX, false)); DatasetFieldType authorType = datasetFieldTypeSvc.add(new DatasetFieldType("author", DatasetFieldType.FieldType.TEXT, true)); Set authorChildTypes = new HashSet<>(); diff --git a/src/test/java/edu/harvard/iq/dataverse/mocks/MockDatasetFieldSvc.java b/src/test/java/edu/harvard/iq/dataverse/mocks/MockDatasetFieldSvc.java index 8ba99cfd747..1cb0c32b722 100644 --- a/src/test/java/edu/harvard/iq/dataverse/mocks/MockDatasetFieldSvc.java +++ b/src/test/java/edu/harvard/iq/dataverse/mocks/MockDatasetFieldSvc.java @@ -6,16 +6,26 @@ import edu.harvard.iq.dataverse.ControlledVocabularyValue; import edu.harvard.iq.dataverse.DatasetFieldServiceBean; import edu.harvard.iq.dataverse.DatasetFieldType; +import edu.harvard.iq.dataverse.MetadataBlock; public class MockDatasetFieldSvc extends DatasetFieldServiceBean { Map fieldTypes = new HashMap<>(); long nextId = 1; + + static MetadataBlock test = null; + public void setMetadataBlock(String name) { + test = new MetadataBlock(); + test.setName(name); + } + public DatasetFieldType add(DatasetFieldType t) { if (t.getId() == null) { t.setId(nextId++); } + //Assure it has a metadatablock (used in ControlledVocabularValue for i18n) + t.setMetadataBlock(test); fieldTypes.put(t.getName(), t); return t; } diff --git a/src/test/java/edu/harvard/iq/dataverse/util/json/JsonParserTest.java b/src/test/java/edu/harvard/iq/dataverse/util/json/JsonParserTest.java index bf4c96201dc..72218b12ced 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/json/JsonParserTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/json/JsonParserTest.java @@ -89,6 +89,7 @@ public static void tearDownClass() { @Before public void setUp() { datasetFieldTypeSvc = new MockDatasetFieldSvc(); + datasetFieldTypeSvc.setMetadataBlock("citation"); keywordType = datasetFieldTypeSvc.add(new DatasetFieldType("keyword", FieldType.TEXT, true)); descriptionType = datasetFieldTypeSvc.add( new DatasetFieldType("description", FieldType.TEXTBOX, false) ); diff --git a/src/test/java/edu/harvard/iq/dataverse/util/json/JsonPrinterTest.java b/src/test/java/edu/harvard/iq/dataverse/util/json/JsonPrinterTest.java index 32f7b86a9c9..26d761639e6 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/json/JsonPrinterTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/json/JsonPrinterTest.java @@ -45,6 +45,7 @@ public class JsonPrinterTest { @Before public void setUp() { datasetFieldTypeSvc = new MockDatasetFieldSvc(); + datasetFieldTypeSvc.setMetadataBlock("citation"); DatasetFieldType titleType = datasetFieldTypeSvc.add(new DatasetFieldType("title", FieldType.TEXTBOX, false)); DatasetFieldType authorType = datasetFieldTypeSvc.add(new DatasetFieldType("author", FieldType.TEXT, true)); diff --git a/src/test/resources/json/dataset-finch1.json b/src/test/resources/json/dataset-finch1.json index c8a7f429e6e..290e800a9ef 100644 --- a/src/test/resources/json/dataset-finch1.json +++ b/src/test/resources/json/dataset-finch1.json @@ -64,7 +64,8 @@ "typeName": "subject" } ], - "displayName": "Citation Metadata" + "displayName": "Citation Metadata", + "name":"citation" } } } diff --git a/src/test/resources/json/dataset-finch2.json b/src/test/resources/json/dataset-finch2.json index d37438cc881..4bd6f33eb42 100644 --- a/src/test/resources/json/dataset-finch2.json +++ b/src/test/resources/json/dataset-finch2.json @@ -309,10 +309,12 @@ ] } ], - "displayName": "Citation Metadata" + "displayName": "Citation Metadata", + "name": "citation" }, "geospatial": { "displayName": "Geospatial Metadata", + "name": "geospatial", "fields": [ { "typeName": "geographicCoverage", From e775f8771293b47289ab6132846fc6ffd4a264d7 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Tue, 22 Jun 2021 13:56:10 -0400 Subject: [PATCH 10/24] remove unnecessary constructors --- .../java/edu/harvard/iq/dataverse/MetadataBlock.java | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/MetadataBlock.java b/src/main/java/edu/harvard/iq/dataverse/MetadataBlock.java index ddcdf35dd75..c98d93b9c14 100644 --- a/src/main/java/edu/harvard/iq/dataverse/MetadataBlock.java +++ b/src/main/java/edu/harvard/iq/dataverse/MetadataBlock.java @@ -51,15 +51,6 @@ public class MetadataBlock implements Serializable { @Column( name = "namespaceuri", columnDefinition = "TEXT") private String namespaceUri; - - public MetadataBlock() { - } - - //For use in tests - public MetadataBlock(String name) { - this.name = name; - } - public Long getId() { return id; } From ff7f7e48f7fa2ab4baba145a1babaf515c7422fa Mon Sep 17 00:00:00 2001 From: qqmyers Date: Tue, 20 Jul 2021 14:55:08 -0400 Subject: [PATCH 11/24] remove unused imports --- src/main/java/edu/harvard/iq/dataverse/MetadataBlock.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/MetadataBlock.java b/src/main/java/edu/harvard/iq/dataverse/MetadataBlock.java index c98d93b9c14..1a1a87b1b87 100644 --- a/src/main/java/edu/harvard/iq/dataverse/MetadataBlock.java +++ b/src/main/java/edu/harvard/iq/dataverse/MetadataBlock.java @@ -1,10 +1,8 @@ package edu.harvard.iq.dataverse; -import edu.harvard.iq.dataverse.DatasetFieldType.FieldType; import edu.harvard.iq.dataverse.util.BundleUtil; import java.io.Serializable; -import java.util.LinkedList; import java.util.List; import java.util.MissingResourceException; import java.util.Objects; From d230d7dac5e57941c6e575d200321763c9a2a44f Mon Sep 17 00:00:00 2001 From: qqmyers Date: Tue, 20 Jul 2021 14:55:29 -0400 Subject: [PATCH 12/24] remove lang tags from fields that aren't cvv in standard social block --- .../edu/harvard/iq/dataverse/export/ddi/exportfull.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/test/java/edu/harvard/iq/dataverse/export/ddi/exportfull.xml b/src/test/java/edu/harvard/iq/dataverse/export/ddi/exportfull.xml index d1892109564..0cf3ce1e947 100644 --- a/src/test/java/edu/harvard/iq/dataverse/export/ddi/exportfull.xml +++ b/src/test/java/edu/harvard/iq/dataverse/export/ddi/exportfull.xml @@ -110,11 +110,11 @@ - TimeMethod + TimeMethod LastDataCollector1, FirstDataCollector1 CollectorTraining Frequency - SamplingProcedure + SamplingProcedure TargetSampleSizeFormula 100 @@ -127,8 +127,8 @@ CharacteristicOfSourcesNoted DocumentationAndAccessToSources - CollectionMode - TypeOfResearchInstrument + CollectionMode + TypeOfResearchInstrument CharacteristicsOfDataCollectionSituation ActionsToMinimizeLosses ControlOperations From 2f76745c391a359f47bfbb2f033915a2914e1dcf Mon Sep 17 00:00:00 2001 From: qqmyers Date: Thu, 22 Jul 2021 15:02:18 -0400 Subject: [PATCH 13/24] update logic to not add a lang tag when there are no translations --- .../dataverse/export/ddi/DdiExportUtil.java | 34 ++++++++++++------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java b/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java index 32dba128af8..f35bafcd4a6 100644 --- a/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java @@ -1331,13 +1331,9 @@ private static String dto2Primitive(DatasetVersionDTO datasetVersionDTO, String if (datasetFieldTypeName.equals(fieldDTO.getTypeName())) { String rawVal = fieldDTO.getSinglePrimitive(); if (fieldDTO.getTypeClass().equals("controlledVocabulary")) { - String localeVal = ControlledVocabularyValue.getLocaleStrValue(rawVal, datasetFieldTypeName, value.getName(), + return ControlledVocabularyValue.getLocaleStrValue(rawVal, datasetFieldTypeName, value.getName(), locale, false); - if (localeVal != null) { - rawVal = localeVal; - } } - return rawVal; } } } @@ -1402,20 +1398,32 @@ private static void writeI18NElementList(XMLStreamWriter xmlw, String name, List } } - private static void writeI18NElement(XMLStreamWriter xmlw, String name, DatasetVersionDTO version, String fieldTypeName, - String lang) throws XMLStreamException { + private static void writeI18NElement(XMLStreamWriter xmlw, String name, DatasetVersionDTO version, + String fieldTypeName, String lang) throws XMLStreamException { + // Get the default value String val = dto2Primitive(version, fieldTypeName); Locale defaultLocale = Locale.getDefault(); + // Get the language-specific value for the default language String localeVal = dto2Primitive(version, fieldTypeName, defaultLocale); - if (localeVal == null) { + String requestedLocaleVal = null; + if (lang != null && !defaultLocale.getLanguage().equals(lang)) { + // Also get the value in the requested locale/lang if that's not the default + // lang. + requestedLocaleVal = dto2Primitive(version, fieldTypeName, new Locale(lang)); + } + // FWIW locale-specific vals will only be non-null for CVV values (at present) + if (localeVal == null && requestedLocaleVal == null) { + // Not CVV/no translations so print without lang tag writeFullElement(xmlw, name, val); } else { - writeFullElement(xmlw, name, localeVal, defaultLocale.getLanguage()); - } - if (lang != null && !defaultLocale.getLanguage().equals(lang)) { - localeVal = dto2Primitive(version, fieldTypeName, new Locale(lang)); + // Print in either/both languages if we have values if (localeVal != null) { - writeFullElement(xmlw, name, localeVal, lang); + // Print the value for the default locale with it's own lang tag + writeFullElement(xmlw, name, localeVal, defaultLocale.getLanguage()); + } + // Also print in the request lang (i.e. the metadata language for the dataset) if a value exists, print it with a lang tag + if (requestedLocaleVal != null) { + writeFullElement(xmlw, name, requestedLocaleVal, lang); } } } From 6e26292648cfa9708371f08afef049314793f22e Mon Sep 17 00:00:00 2001 From: qqmyers Date: Fri, 23 Jul 2021 11:08:42 -0400 Subject: [PATCH 14/24] handle Sword N/A controoled vocab value --- .../dataverse/ControlledVocabularyValue.java | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/ControlledVocabularyValue.java b/src/main/java/edu/harvard/iq/dataverse/ControlledVocabularyValue.java index 4f481426b49..6a0f6728246 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ControlledVocabularyValue.java +++ b/src/main/java/edu/harvard/iq/dataverse/ControlledVocabularyValue.java @@ -115,23 +115,30 @@ public void setControlledVocabAlternates(Collection co } public String getLocaleStrValue() { - return getLocaleStrValue(strValue, this.datasetFieldType.getName(),getDatasetFieldType().getMetadataBlock().getName(),null, true); + return getLocaleStrValue(null); } public String getLocaleStrValue(String language) { + //Sword input uses a special controlled vacab value ("N/A" that does not have a datasetFieldType / is not part of any metadata block, so handle it specially + if(strValue.equals(DatasetField.NA_VALUE) && this.datasetFieldType == null) { + return strValue; + } + if(this.datasetFieldType == null) { + logger.warning("Null datasetFieldType for value: " + strValue); + } return getLocaleStrValue(strValue, this.datasetFieldType.getName(),getDatasetFieldType().getMetadataBlock().getName(),language == null ? null : new Locale(language), true); } - public static String getLocaleStrValue(String strValue, String fieldTypeName, String metadataBlockName, Locale locale, boolean sendDefault) - { - String key = strValue.toLowerCase().replace(" " , "_"); + public static String getLocaleStrValue(String strValue, String fieldTypeName, String metadataBlockName, + Locale locale, boolean sendDefault) { + String key = strValue.toLowerCase().replace(" ", "_"); key = StringUtils.stripAccents(key); try { - logger.fine("Looking for : " + "controlledvocabulary." + fieldTypeName + "." + key + " in " + metadataBlockName + " : " + locale.getLanguage()); - String val = BundleUtil.getStringFromPropertyFile("controlledvocabulary." + fieldTypeName + "." + key, metadataBlockName, locale); - logger.fine("Found : " + val); - if(!val.isBlank()) { - return val; + String val = BundleUtil.getStringFromPropertyFile("controlledvocabulary." + fieldTypeName + "." + key, + metadataBlockName, locale); + if (!val.isBlank()) { + logger.fine("Found : " + val); + return val; } else { return sendDefault ? strValue : null; } From 402b84c9e6997b7b53d19989815acb0606243858 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Fri, 23 Jul 2021 15:46:43 -0400 Subject: [PATCH 15/24] fix script name --- ....5.0.1_7388_i18n_metadata => V5.5.0.6__7388_i18n_metadata.sql} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/main/resources/db/migration/{V5.5.0.1_7388_i18n_metadata => V5.5.0.6__7388_i18n_metadata.sql} (100%) diff --git a/src/main/resources/db/migration/V5.5.0.1_7388_i18n_metadata b/src/main/resources/db/migration/V5.5.0.6__7388_i18n_metadata.sql similarity index 100% rename from src/main/resources/db/migration/V5.5.0.1_7388_i18n_metadata rename to src/main/resources/db/migration/V5.5.0.6__7388_i18n_metadata.sql From 771191ff1e9bd7b9b2d82e2a5075d6207d4636b5 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Fri, 23 Jul 2021 15:52:40 -0400 Subject: [PATCH 16/24] add same column in dataset --- .../resources/db/migration/V5.5.0.6__7388_i18n_metadata.sql | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/resources/db/migration/V5.5.0.6__7388_i18n_metadata.sql b/src/main/resources/db/migration/V5.5.0.6__7388_i18n_metadata.sql index 67ea380c926..0b4ee97c78d 100644 --- a/src/main/resources/db/migration/V5.5.0.6__7388_i18n_metadata.sql +++ b/src/main/resources/db/migration/V5.5.0.6__7388_i18n_metadata.sql @@ -1,2 +1,4 @@ ALTER TABLE dataverse +ADD COLUMN IF NOT EXISTS metadatalanguage TEXT; +ALTER TABLE dataset ADD COLUMN IF NOT EXISTS metadatalanguage TEXT; \ No newline at end of file From 7479112ef4f7bf003457f6a73c1a0c118972fa38 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Thu, 29 Jul 2021 09:36:49 -0400 Subject: [PATCH 17/24] starting docs --- doc/sphinx-guides/source/installation/config.rst | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/doc/sphinx-guides/source/installation/config.rst b/doc/sphinx-guides/source/installation/config.rst index 072a8df0183..ecb77d152d7 100644 --- a/doc/sphinx-guides/source/installation/config.rst +++ b/doc/sphinx-guides/source/installation/config.rst @@ -675,6 +675,17 @@ The presence of the :ref:`:Languages` database setting adds a dropdown in the he ``curl http://localhost:8080/api/admin/settings/:Languages -X PUT -d '[{"locale":"en","title":"English"},{"locale":"fr","title":"Français"}]'`` +When a user selects one of the available choices, the Dataverse user interfaces will be translated into that language (assuming you also configure the "lang" directory and populate it with translations as described below). + +Allowing the Language Used for Dataset Metadata to be Specified ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +Since users only enter dataset metadata in one language, Dataverse also offers a separate setting that indicates the language used to enter that metadata. +The presence of the :ref:`:MetadataLanguages` database setting identifies the available options (which can be different from those in the :Languages setting above). +Dataverse collection admins can select from these options to indicate which language should be used for new Datasets created with that collection. When creating or editing a dataset, users will be asked to enter the metadata in that langauge. : + +``curl http://localhost:8080/api/admin/settings/:MetadataLanguages -X PUT -d '{"English":"en","Français":"fr"}'`` + Configuring the "lang" Directory ++++++++++++++++++++++++++++++++ @@ -1595,7 +1606,7 @@ By default this setting is absent and the Dataverse Software assumes it to be fa .. _:HandleAuthHandle: :HandleAuthHandle -+++++++++++++++++++++++++ ++++++++++++++++++ Specific for Handle PIDs. Set this setting to / to be used on a global handle service when the public key is NOT stored in the default handle. By default this setting is absent and the Dataverse Software assumes it to be not set. If the public key for instance is stored in handle: 21.T12996/USER01. From 005341afe2ab7e476d8a687c2654da44f181a14f Mon Sep 17 00:00:00 2001 From: qqmyers Date: Fri, 6 Aug 2021 13:10:31 -0400 Subject: [PATCH 18/24] doc update --- doc/sphinx-guides/source/installation/config.rst | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/doc/sphinx-guides/source/installation/config.rst b/doc/sphinx-guides/source/installation/config.rst index ecb77d152d7..96fed850e85 100644 --- a/doc/sphinx-guides/source/installation/config.rst +++ b/doc/sphinx-guides/source/installation/config.rst @@ -675,16 +675,7 @@ The presence of the :ref:`:Languages` database setting adds a dropdown in the he ``curl http://localhost:8080/api/admin/settings/:Languages -X PUT -d '[{"locale":"en","title":"English"},{"locale":"fr","title":"Français"}]'`` -When a user selects one of the available choices, the Dataverse user interfaces will be translated into that language (assuming you also configure the "lang" directory and populate it with translations as described below). - -Allowing the Language Used for Dataset Metadata to be Specified -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -Since users only enter dataset metadata in one language, Dataverse also offers a separate setting that indicates the language used to enter that metadata. -The presence of the :ref:`:MetadataLanguages` database setting identifies the available options (which can be different from those in the :Languages setting above). -Dataverse collection admins can select from these options to indicate which language should be used for new Datasets created with that collection. When creating or editing a dataset, users will be asked to enter the metadata in that langauge. : - -``curl http://localhost:8080/api/admin/settings/:MetadataLanguages -X PUT -d '{"English":"en","Français":"fr"}'`` +Note that metadata selected from Controlled Vocabularies will still display in the language selected by the viewer (via the Languages dropdown in the header). In metadata export files, controlled vocabulary values will be included in the Dataverse installations default language and in the metadata language of the dataset (if specified). Configuring the "lang" Directory ++++++++++++++++++++++++++++++++ From f374f2c13ef3d555155fa416681641797dda60f8 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Fri, 6 Aug 2021 16:18:38 -0400 Subject: [PATCH 19/24] typo --- src/main/java/edu/harvard/iq/dataverse/util/SystemConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/util/SystemConfig.java b/src/main/java/edu/harvard/iq/dataverse/util/SystemConfig.java index 3579459b27e..f11a76d39fb 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/SystemConfig.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/SystemConfig.java @@ -1096,7 +1096,7 @@ public Map getBaseMetadataLanguageMap(boolean refresh) { if(mlString.isEmpty()) { if(settingsService.get(SettingsServiceBean.Key.Languages.toString(),"").isEmpty()) { - mlString="[{\"locale\':\"" + BundleUtil.getCurrentLocale().getLanguage() + "\"},{\"title\":\"" + mlString="[{\"locale\":\"" + BundleUtil.getCurrentLocale().getLanguage() + "\"},{\"title\":\"" + BundleUtil.getCurrentLocale().getDisplayLanguage() + "\"}]"; } else { mlString="[]"; From 289d0bbe621e533bb8d25c66b12d39adc4025aea Mon Sep 17 00:00:00 2001 From: qqmyers Date: Fri, 6 Aug 2021 16:41:35 -0400 Subject: [PATCH 20/24] missing setting entry in docs --- doc/sphinx-guides/source/installation/config.rst | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/doc/sphinx-guides/source/installation/config.rst b/doc/sphinx-guides/source/installation/config.rst index 4f6ffa72c5c..5bcfb98f57e 100644 --- a/doc/sphinx-guides/source/installation/config.rst +++ b/doc/sphinx-guides/source/installation/config.rst @@ -2224,6 +2224,16 @@ in the header. See :ref:`i18n` for a curl example and related settings. +.. _:MetadataLanguages: + +:MetadataLanguages +++++++++++++++++++ + +Sets which languages can be used when entering dataset metadata. + +See :ref:`i18n` for further discussion, a curl example, and related settings. + + :InheritParentRoleAssignments +++++++++++++++++++++++++++++ From e0f03351d2ae5a47daca693eda89c8250373522d Mon Sep 17 00:00:00 2001 From: qqmyers Date: Fri, 6 Aug 2021 16:54:49 -0400 Subject: [PATCH 21/24] fix default with effect md lang --- src/main/java/edu/harvard/iq/dataverse/util/SystemConfig.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/edu/harvard/iq/dataverse/util/SystemConfig.java b/src/main/java/edu/harvard/iq/dataverse/util/SystemConfig.java index f11a76d39fb..56a49dc0090 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/SystemConfig.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/SystemConfig.java @@ -1134,6 +1134,9 @@ private String getDefaultMetadataLanguageLabel(DvObjectContainer target) { parent=parent.getOwner(); } } + if(mlLabel.equals(DvObjectContainer.UNDEFINED_METADATA_LANGUAGE_CODE)) { + mlLabel = getDefaultMetadataLanguage(); + } if(fromAncestor) { mlLabel = mlLabel + " " + BundleUtil.getStringFromBundle("dataverse.inherited"); } else { From 224d1f94a35503e6f81775e78a233b8a82be3f1f Mon Sep 17 00:00:00 2001 From: qqmyers Date: Fri, 6 Aug 2021 17:32:04 -0400 Subject: [PATCH 22/24] fix default label in dv selection --- src/main/java/edu/harvard/iq/dataverse/util/SystemConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/util/SystemConfig.java b/src/main/java/edu/harvard/iq/dataverse/util/SystemConfig.java index 56a49dc0090..8365c673649 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/SystemConfig.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/SystemConfig.java @@ -1135,7 +1135,7 @@ private String getDefaultMetadataLanguageLabel(DvObjectContainer target) { } } if(mlLabel.equals(DvObjectContainer.UNDEFINED_METADATA_LANGUAGE_CODE)) { - mlLabel = getDefaultMetadataLanguage(); + mlLabel = getBaseMetadataLanguageMap(false).get(getDefaultMetadataLanguage()); } if(fromAncestor) { mlLabel = mlLabel + " " + BundleUtil.getStringFromBundle("dataverse.inherited"); From fc09fd5a98528bbb9987dbef0f86d7b8362b8878 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Fri, 6 Aug 2021 17:34:18 -0400 Subject: [PATCH 23/24] CVV functionlity update tracks mdLang if set, otherwise UI lang --- doc/sphinx-guides/source/installation/config.rst | 2 +- .../iq/dataverse/ControlledVocabularyValue.java | 4 ++++ .../java/edu/harvard/iq/dataverse/DatasetField.java | 8 ++++++++ src/main/webapp/metadataFragment.xhtml | 10 +++++----- 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/doc/sphinx-guides/source/installation/config.rst b/doc/sphinx-guides/source/installation/config.rst index 5bcfb98f57e..835f286d2b1 100644 --- a/doc/sphinx-guides/source/installation/config.rst +++ b/doc/sphinx-guides/source/installation/config.rst @@ -688,7 +688,7 @@ When creating or editing a dataset, users will be asked to enter the metadata in ``curl http://localhost:8080/api/admin/settings/:MetadataLanguages -X PUT -d '[{"locale":"en","title":"English"},{"locale":"fr","title":"Français"}]'`` -Note that metadata selected from Controlled Vocabularies will still display in the language selected by the viewer (via the Languages dropdown in the header). In metadata export files, controlled vocabulary values will be included in the Dataverse installations default language and in the metadata language of the dataset (if specified). +Note that metadata selected from Controlled Vocabularies will also display in the metadata language of the dataset, but only if translations have been configured, i.e. you configure the "lang" directory and populate it with translations as described below). In metadata export files, controlled vocabulary values will be included in the Dataverse installations default language and in the metadata language of the dataset (if specified). Configuring the "lang" Directory ++++++++++++++++++++++++++++++++ diff --git a/src/main/java/edu/harvard/iq/dataverse/ControlledVocabularyValue.java b/src/main/java/edu/harvard/iq/dataverse/ControlledVocabularyValue.java index 6a0f6728246..4a792a12e83 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ControlledVocabularyValue.java +++ b/src/main/java/edu/harvard/iq/dataverse/ControlledVocabularyValue.java @@ -118,6 +118,10 @@ public String getLocaleStrValue() { return getLocaleStrValue(null); } + public String getLocaleStrValue(String preferredLang, String altLang) { + return (preferredLang==null) ? getLocaleStrValue(altLang): getLocaleStrValue(preferredLang); + } + public String getLocaleStrValue(String language) { //Sword input uses a special controlled vacab value ("N/A" that does not have a datasetFieldType / is not part of any metadata block, so handle it specially if(strValue.equals(DatasetField.NA_VALUE) && this.datasetFieldType == null) { diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetField.java b/src/main/java/edu/harvard/iq/dataverse/DatasetField.java index 54af54dbfc7..51b26901a94 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetField.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetField.java @@ -251,6 +251,10 @@ public String getDisplayValue() { return getDisplayValue(null); } + public String getDisplayValue(String preferredLang, String altLang) { + return (preferredLang==null) ? getDisplayValue(altLang): getDisplayValue(preferredLang); + } + public String getDisplayValue(String lang) { String returnString = ""; for (String value : getValues(lang)) { @@ -308,6 +312,10 @@ public List getValues() { return getValues(null); } + public List getValues(String preferredLang, String altLang) { + return (preferredLang==null) ? getValues(altLang): getValues(preferredLang); + } + public List getValues(String langCode) { List returnList = new ArrayList<>(); if (!datasetFieldValues.isEmpty()) { diff --git a/src/main/webapp/metadataFragment.xhtml b/src/main/webapp/metadataFragment.xhtml index 23d82fba8e0..b8084b46083 100755 --- a/src/main/webapp/metadataFragment.xhtml +++ b/src/main/webapp/metadataFragment.xhtml @@ -60,9 +60,9 @@ - - + @@ -163,13 +163,13 @@ - +
- + - - + @@ -169,7 +169,7 @@ - +