Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

IQSS/8422 default to allow dataset level choice of metadatalanguage #8440

Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
5 changes: 3 additions & 2 deletions doc/sphinx-guides/source/installation/config.rst
Original file line number Diff line number Diff line change
Expand Up @@ -241,7 +241,7 @@ As for the "Remote only" authentication mode, it means that:
- The "builtin" authentication provider has been disabled (:ref:`api-toggle-auth-provider`). Note that disabling the "builtin" authentication provider means that the API endpoint for converting an account from a remote auth provider will not work. Converting directly from one remote authentication provider to another (i.e. from GitHub to Google) is not supported. Conversion from remote is always to "builtin". Then the user initiates a conversion from "builtin" to remote. Note that longer term, the plan is to permit multiple login options to the same Dataverse installation account per https://github.com/IQSS/dataverse/issues/3487 (so all this talk of conversion will be moot) but for now users can only use a single login option, as explained in the :doc:`/user/account` section of the User Guide. In short, "remote only" might work for you if you only plan to use a single remote authentication provider such that no conversion between remote authentication providers will be necessary.

File Storage: Using a Local Filesystem and/or Swift and/or object stores
---------------------------------------------------------------------------
------------------------------------------------------------------------

By default, a Dataverse installation stores all data files (files uploaded by end users) on the filesystem at ``/usr/local/payara5/glassfish/domains/domain1/files``. This path can vary based on answers you gave to the installer (see the :ref:`dataverse-installer` section of the Installation Guide) or afterward by reconfiguring the ``dataverse.files.\<id\>.directory`` JVM option described below.

Expand Down Expand Up @@ -731,7 +731,8 @@ Allowing the Language Used for Dataset Metadata to be Specified

Since dataset metadata can only be entered in one language, and administrators may wish to limit which languages metadata can be entered in, Dataverse also offers a separate setting defining allowed metadata languages.
The presence of the :ref:`:MetadataLanguages` database setting identifies the available options (which can be different from those in the :Languages setting above, with fewer or more options).
Dataverse collection admins can select from these options to indicate which language should be used for new Datasets created with that specific collection.

Dataverse collection admins can select from these options to indicate which language should be used for new Datasets created with that specific collection. If they do not, users will be asked when creating a dataset to select the language they want to use when entering metadata.

When creating or editing a dataset, users will be asked to enter the metadata in that language. The metadata language selected will also be shown when dataset metadata is viewed and will be included in metadata exports (as appropriate for each format) for published datasets:

Expand Down
11 changes: 9 additions & 2 deletions src/main/java/edu/harvard/iq/dataverse/DatasetPage.java
Original file line number Diff line number Diff line change
Expand Up @@ -5609,7 +5609,10 @@ public boolean isFileDeleted (DataFile dataFile) {
}

public String getEffectiveMetadataLanguage() {
String mdLang = dataset.getEffectiveMetadataLanguage();
return getEffectiveMetadataLanguage(false);
}
public String getEffectiveMetadataLanguage(boolean ofParent) {
String mdLang = ofParent ? dataset.getOwner().getEffectiveMetadataLanguage() : dataset.getEffectiveMetadataLanguage();
if (mdLang.equals(DvObjectContainer.UNDEFINED_METADATA_LANGUAGE_CODE)) {
mdLang = settingsWrapper.getDefaultMetadataLanguage();
}
Expand All @@ -5618,13 +5621,17 @@ public String getEffectiveMetadataLanguage() {

public String getLocaleDisplayName(String code) {
String displayName = settingsWrapper.getBaseMetadataLanguageMap(false).get(code);
if(displayName==null) {
if(displayName==null && !code.equals(DvObjectContainer.UNDEFINED_METADATA_LANGUAGE_CODE)) {
//Default (for cases such as :when a Dataset has a metadatalanguage code but :MetadataLanguages is no longer defined).
displayName = new Locale(code).getDisplayName();
}
return displayName;
}

public Set<Entry<String, String>> getMetadataLanguages() {
return settingsWrapper.getBaseMetadataLanguageMap(false).entrySet();
}

public List<String> getVocabScripts() {
return fieldService.getVocabScripts(settingsWrapper.getCVocConf());
}
Expand Down
2 changes: 0 additions & 2 deletions src/main/java/edu/harvard/iq/dataverse/DvObjectContainer.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,6 @@ public abstract class DvObjectContainer extends DvObject {


//Default to "file" is for tests only
public static final String DEFAULT_METADATA_LANGUAGE = Locale.getDefault().getDisplayLanguage();
public static final String DEFAULT_METADATA_LANGUAGE_CODE = Locale.getDefault().getLanguage();
public static final String UNDEFINED_METADATA_LANGUAGE_CODE = "undefined"; //Used in dataverse.xhtml as a non-null selection option value (indicating inheriting the default)


Expand Down
27 changes: 7 additions & 20 deletions src/main/java/edu/harvard/iq/dataverse/SettingsWrapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -488,7 +488,7 @@ public void validateEmbargoDate(FacesContext context, UIComponent component, Obj

Map<String,String> languageMap = null;

Map<String, String> getBaseMetadataLanguageMap(boolean refresh) {
public Map<String, String> getBaseMetadataLanguageMap(boolean refresh) {
if (languageMap == null || refresh) {
languageMap = new HashMap<String, String>();

Expand Down Expand Up @@ -518,26 +518,13 @@ public Map<String, String> getMetadataLanguages(DvObjectContainer target) {
}

private String getDefaultMetadataLanguageLabel(DvObjectContainer target) {
String mlLabel = Locale.getDefault().getDisplayLanguage();
Dataverse parent = target.getOwner();
boolean fromAncestor=false;
if (parent != null) {
fromAncestor=true;
String mlCode = parent.getEffectiveMetadataLanguage();
// If it's 'undefined', it's the global default
if (mlCode.equals(DvObjectContainer.UNDEFINED_METADATA_LANGUAGE_CODE)) {
//so it's not from an ancestor
fromAncestor=false;
//and we need to lookup the global default
mlCode = getDefaultMetadataLanguage();
}
String mlLabel = BundleUtil.getStringFromBundle("dataverse.metadatalanguage.setatdatasetcreation");
String mlCode = target.getEffectiveMetadataLanguage();
// If it's 'undefined', it's the global default
if (!mlCode.equals(DvObjectContainer.UNDEFINED_METADATA_LANGUAGE_CODE)) {
// Get the label for the language code found
mlLabel = getBaseMetadataLanguageMap(false).get(mlCode);
}
if(fromAncestor) {
mlLabel = mlLabel + " " + BundleUtil.getStringFromBundle("dataverse.inherited");
} else {
mlLabel = mlLabel + " " + BundleUtil.getStringFromBundle("dataverse.default");
}
return mlLabel;
}
Expand All @@ -549,8 +536,8 @@ public String getDefaultMetadataLanguage() {
//One entry - it's the default
return (String) mdMap.keySet().toArray()[0];
} else {
//More than one - :MetadataLanguages is set so we use the default
return DvObjectContainer.DEFAULT_METADATA_LANGUAGE_CODE;
//More than one - :MetadataLanguages is set and the default is undefined (users must choose if the collection doesn't override the default)
return DvObjectContainer.UNDEFINED_METADATA_LANGUAGE_CODE;
}
} else {
// None - :MetadataLanguages is not set so return null to turn off the display (backward compatibility)
Expand Down
3 changes: 3 additions & 0 deletions src/main/java/propertyFiles/Bundle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -856,6 +856,7 @@ dataverse.datasize=Total size of the files stored in this dataverse: {0} bytes
dataverse.datasize.ioerror=Fatal IO error while trying to determine the total size of the files stored in the dataverse. Please report this error to the Dataverse administrator.
dataverse.inherited=(inherited from enclosing Dataverse)
dataverse.default=(Default)
dataverse.metadatalanguage.setatdatasetcreation=Chosen at Dataset Creation
# rolesAndPermissionsFragment.xhtml

# advanced.xhtml
Expand Down Expand Up @@ -1167,6 +1168,8 @@ dataset.anonymized.withheld=withheld

dataset.metadatalanguage.create.guidance=Please enter metadata in the <b>{0}</b> language, or change the metadata language choice in the parent dataverse before proceeding.
dataset.metadatalanguage.view.guidance=This dataset has been configured to use <b>{0}</b> as the language for all metadata entries.
dataset.metadatalanguage.title=Metadata entered for this dataset will be assumed to be in the selected language. Cannot be changed after dataset is created.
dataset.metadatalanguage.tip=Select the language you wish to use when entering metadata.

# template.xhtml
dataset.template.name.tip=The name of the dataset template.
Expand Down
8 changes: 3 additions & 5 deletions src/main/webapp/dataset.xhtml
Original file line number Diff line number Diff line change
Expand Up @@ -730,9 +730,7 @@
</p:commandButton>
</div>
</div>
<div class="form-group">
<span class="glyphicon glyphicon-asterisk text-danger"/> <h:outputText value="#{bundle['dataset.asterisk.tip']}"/>
</div>

</ui:fragment>
<ui:fragment rendered="#{DatasetPage.editMode == 'CREATE'}">
<ui:include src="metadataFragment.xhtml">
Expand All @@ -741,8 +739,8 @@
<ui:param name="metadataBlocks" value="#{!empty DatasetPage.editMode ? DatasetPage.datasetVersionUI.metadataBlocksForEdit.entrySet().toArray(): DatasetPage.datasetVersionUI.metadataBlocksForView.entrySet().toArray()}"/>
<!-- ui:param name="publicationDate" value="#{DatasetPage.dataset.publicationDateFormattedYYYYMMDD}"/-->
<ui:param name="globalId" value="#{DatasetPage.dataset.globalIdString}"/>
<ui:param name="mdLang" value="#{DatasetPage.getLocaleDisplayName(DatasetPage.effectiveMetadataLanguage)}"/>
<ui:param name="mdLangCode" value="#{DatasetPage.effectiveMetadataLanguage}"/>
<ui:param name="mdLang" value="#{DatasetPage.getLocaleDisplayName(DatasetPage.getEffectiveMetadataLanguage(true))}"/>
<ui:param name="mdLangCode" value="#{DatasetPage.getEffectiveMetadataLanguage(true)}"/>
</ui:include>
</ui:fragment>
<!-- Create/Save Dataset Button Panel TOP editMode -->
Expand Down
42 changes: 35 additions & 7 deletions src/main/webapp/metadataFragment.xhtml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
<div class="panel-group" jsf:rendered="${empty editMode or managePage}">
<o:importFunctions type="edu.harvard.iq.dataverse.util.MarkupChecker" />
<p>
<h:outputFormat rendered="#{!(empty mdLang)}" value="#{bundle['dataset.metadatalanguage.view.guidance']}" escape="false">
<h:outputFormat rendered="#{!(empty mdLang and mdlangCode!='undefined')}" value="#{bundle['dataset.metadatalanguage.view.guidance']}" escape="false">
<f:param value="#{mdLang}"/>
</h:outputFormat>
</p>
Expand Down Expand Up @@ -156,12 +156,40 @@
<p:fragment id="editMetadataFragement">
<o:importFunctions type="java.util.Collections" />
<div class="panel-group">
<p>
<h:outputFormat rendered="#{(not empty mdLangCode) and ((editMode == 'CREATE') or (editMode == 'METADATA'))}" value="#{bundle['dataset.metadatalanguage.create.guidance']}" escape="false">
<f:param value="#{mdLang}"/>
</h:outputFormat>
</p>
<ui:repeat value="#{metadataBlocks}" var="metadataBlockVal" varStatus="block">
<p>
<h:outputFormat
rendered="#{(mdLangCode!='undefined') and ((editMode == 'CREATE') or (editMode == 'METADATA'))}"
value="#{bundle['dataset.metadatalanguage.create.guidance']}"
escape="false">
<f:param value="#{mdLang}" />
</h:outputFormat>
</p>
<div class="form-group"
jsf:rendered="#{(empty mdLang and mdLangCode=='undefined')}">
<h:outputLabel for="dsMetadataLanguage"
styleClass="col-md-3 control-label">
#{bundle.metadataLanguage}
<span
class="glyphicon glyphicon-question-sign tooltip-icon"
data-toggle="tooltip" data-placement="auto right"
data-original-title="#{bundle['dataset.metadatalanguage.title']}"></span>
</h:outputLabel>
<div class="col-md-7 form-col-container">
<p class="help-block">
#{bundle['dataset.metadatalanguage.tip']}</p>
<p:selectOneMenu id="dsMetadataLanguage" styleClass="form-control"
value="#{DatasetPage.dataset.metadataLanguage}">
<f:selectItems value="#{DatasetPage.getMetadataLanguages()}"
var="lang" itemLabel="#{lang.getValue()}"
itemValue="#{lang.getKey()}" />
</p:selectOneMenu>
<p:message for="dsMetadataLanguage" display="text" />
</div>
</div>
<div class="form-group">
<span class="glyphicon glyphicon-asterisk text-danger"/> <h:outputText value="#{bundle['dataset.asterisk.tip']}"/>
</div>
<ui:repeat value="#{metadataBlocks}" var="metadataBlockVal" varStatus="block">
<div class="panel panel-default" jsf:rendered="#{(editMode == 'METADATA' or metadataBlockVal.key.displayOnCreate or !metadataBlockVal.key.isEmpty()
or metadataBlockVal.key.isHasRequired())
or (!datasetPage)}">
Expand Down