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

4685 langtoggle #4841

Merged
merged 44 commits into from
Aug 27, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
66d4c65
adding french bundle resource
JayanthyChengan Jun 7, 2018
ce5c7d0
new terms added related to Github issue:4680
JayanthyChengan Jun 7, 2018
c186ef6
Latest French translation - Consolidation
mhvezina Jun 19, 2018
bac5516
Added UI Toggle button
JayanthyChengan Jun 26, 2018
20f0a18
Merge pull request #1 from BibNumUMontreal/BundleProperties
JayanthyChengan Jun 26, 2018
24c131e
Merge remote-tracking branch 'remotes/origin/BundleProperties' into 4…
JayanthyChengan Jun 26, 2018
cb0b33a
removed comments
JayanthyChengan Jun 27, 2018
68c0403
Merge remote-tracking branch 'remotes/origin/develop' into 4685-UI-to…
JayanthyChengan Jun 28, 2018
f23b8d3
Cleaned up the new language dropdown in the navbar. [ref #4685]
mheppler Jul 13, 2018
cd90f29
Merge remote-tracking branch 'remotes/origin/develop' into BundleProp…
JayanthyChengan Jul 13, 2018
ec779c3
added ValidationMessages.properties
JayanthyChengan Jul 13, 2018
3b50383
Translations fixes + new file ValidationMessages
mhvezina Jul 16, 2018
c9b6a98
Merge pull request #2 from BibNumUMontreal/BundleProperties_Test
JayanthyChengan Jul 16, 2018
ac24fc7
Merge remote-tracking branch 'remotes/origin/develop' into BundleProp…
JayanthyChengan Jul 16, 2018
9cdeec3
Merge pull request #4 from scholarsportal/BundleProperties_Test
JayanthyChengan Jul 17, 2018
ebe75ba
corrected dataverse.nameIlllegalCharacters value
JayanthyChengan Jul 17, 2018
337d73a
Revert "corrected dataverse.nameIlllegalCharacters value"
JayanthyChengan Jul 17, 2018
9b392dd
corrected dataverse.nameIlllegalCharacters value
JayanthyChengan Jul 17, 2018
4d66c21
Fixes to French translation
mhvezina Jul 18, 2018
8fd25ec
Merge pull request #5 from BibNumUMontreal/4856_FrenchPropertyFiles
JayanthyChengan Jul 25, 2018
40f5276
code cleanup
oscardssmith Jul 27, 2018
2b67476
update docs
oscardssmith Jul 27, 2018
3c3762b
fixed typos #4841
pdurbin Jul 27, 2018
db815aa
now it works
oscardssmith Jul 30, 2018
4fa6636
Fixes for French translation (apostrophes escaping + hyphens to emdas…
mhvezina Jul 30, 2018
02dc9ba
Fix for em dashes
mhvezina Jul 30, 2018
9184e5e
Merge pull request #6 from BibNumUMontreal/4856_FrenchPropertyFiles
JayanthyChengan Jul 30, 2018
eeaac83
Merge remote-tracking branch 'remotes/origin/develop' into 4856_Frenc…
JayanthyChengan Jul 30, 2018
0bbd7ed
correction contact => personne-ressource
mhvezina Jul 31, 2018
a9a6add
More French translations + fixes
mhvezina Aug 1, 2018
c534f8c
Merge pull request #7 from BibNumUMontreal/4856_FrenchPropertyFiles
JayanthyChengan Aug 1, 2018
d4884b6
Merge branch 'develop' into 4685-langtoggle
oscardssmith Aug 3, 2018
f6ee5f8
now it actually works (I think)
oscardssmith Aug 3, 2018
051611a
Merge branch 'develop' into 4685-langtoggle
oscardssmith Aug 3, 2018
31853e4
Apostrophes escaped
mhvezina Aug 7, 2018
42c1bdb
Merge pull request #8 from BibNumUMontreal/4856_FrenchPropertyFiles
JayanthyChengan Aug 7, 2018
eceed4b
Revert "Apostrophes escaped"
JayanthyChengan Aug 15, 2018
cc24ba4
Merge pull request #9 from scholarsportal/revert-8-4856_FrenchPropert…
JayanthyChengan Aug 15, 2018
8ff4292
Merge remote-tracking branch 'remotes/origin/4856_FrenchPropertyFiles…
JayanthyChengan Aug 15, 2018
aa4a67c
Corrected FacesContext null instance
JayanthyChengan Aug 15, 2018
0ea4771
added comment
JayanthyChengan Aug 23, 2018
c75aeb4
Merge pull request #4963 from scholarsportal/4685-langtoggle-SP
scolapasta Aug 24, 2018
58e7a02
Merge branch 'develop' into 4685-langtoggle
sekmiller Aug 27, 2018
7f892ba
#4685 remove extraneous @ignore
sekmiller Aug 27, 2018
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
8 changes: 8 additions & 0 deletions doc/sphinx-guides/source/installation/config.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1297,3 +1297,11 @@ Enable the collection of provenance metadata on Dataverse via the provenance pop
Sets how long a cached metrics result is used before re-running the query for a request. Note this only effects queries on the current month, previous months queries are cached indefinitely. The default timeout is 7 days (10080 minutes).

``curl -X PUT -d 10080 http://localhost:8080/api/admin/settings/:MetricsCacheTimeoutMinutes``

:Languages
++++++++++

Sets which languages should be available. If there is more than one, a dropdown is displayed
in the header. This should be formated as a JSON array as shown below.

``curl http://localhost:8080/api/admin/settings/:Languages -X PUT -d '[{ "locale":"en", "title":"English"}, { "locale":"fr", "title":"Français"}]'``
1 change: 1 addition & 0 deletions src/main/java/Bundle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ restricted=Restricted
restrictedaccess=Restricted Access
find=Find
search=Search
language=Language
unpublished=Unpublished
cancel=Cancel
ok=OK
Expand Down
2,036 changes: 2,036 additions & 0 deletions src/main/java/Bundle_fr.properties

Large diffs are not rendered by default.

49 changes: 49 additions & 0 deletions src/main/java/ValidationMessages_fr.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
user.firstName=Veuillez entrer votre pr�nom.
user.lastName=Veuillez entrer votre nom de famille.
user.invalidEmail=Veuillez entrer une adresse courriel valide.
user.enterUsername=Veuillez entrer un nom d'utilisateur.
user.usernameLength=Le nom d'utilisateur doit comporter entre 2 et 60 caract�res.
user.illegalCharacters=Caract�re(s) non valide(s) utilis�(s). Les caract�res valides sont a-Z, 0-9, '_', '-' et '.'.

user.enterNickname=Veuillez entrer un pseudonyme.
user.nicknameLength=Le pseudonyme ne peut exc�der 30 caract�res.
user.nicknameNotnumber=Le pseudonyme ne devrait pas �tre un nombre

dataset.templatename=Veuillez ajouter un nom pour le mod�le d'ensemble de donn�es.
dataset.nameLength=Le nom ne peut exc�der 255 caract�res.

dataverse.name=Veuillez entrer un nom.
dataverse.alias=Veuillez entrer un alias.
dataverse.aliasLength=L'alias ne peut exc�der 60 caract�res.
dataverse.aliasNotnumber=L'alias ne devrait pas �tre un nombre.
dataverse.nameIllegalCharacters=Caract�re(s) non valide(s) utilis�(s). Les caract�res valides sont a-Z, 0-9, '_', '-'.
dataverse.category=Veuillez s�lectionner une cat�gorie pour votre dataverse.
contenttype.slash=Le type de contenu doit contenir une barre oblique.
setspec.notNumber=Le nom (Setspec) ne devrait pas �tre un nombre.
setspec.maxLength=Le nom (Setspec) ne peut exc�der 30 caract�res.

role.name=Un r�le doit avoir un nom.
desc.maxLength=Le description ne peut exc�der 255 caract�res.
alias.maxLength=L'alias ne peut exc�der 26 caract�res.
alias.illegalCharacters=L'alias ne peut �tre vide. Les caract�res valides sont a-Z, 0-9, '_', '-'.

custom.response=Veuillez entrer la r�ponse.
custom.questiontext=Veuillez entrer le texte de la question.
filename.illegalCharacters=Le nom du fichier ne peut contenir aucun des caract�res suivants\u00A0: \ / : * ? " < > | ; # .
directoryname.illegalCharacters=Le nom du r�pertoire ne peut pas �tre suivi ni pr�c�d� d'un caract�re s�parateur de fichiers.
filename.blank=Veuillez sp�cifier un nom de fichier.


map.layername=Veuillez sp�cifier un nom de couche cartographique.
map.layerlink=Veuillez sp�cifier un lien de couche cartographique.
map.link=Veuillez sp�cifier un lien de carte int�gr�e.
map.imagelink=Veuillez sp�cifier un lien d'image de carte.
map.username=Veuillez sp�cifier un nom d'utilisateur WorldMap.

oauth.username=Veuillez entrer votre nom d'utilisateur.

password.retype=Le nouveau mot de passe est vide\u00A0: veuillez le retaper � nouveau.
password.current=Veuillez entrer votre mot de passe actuel.
password.validate=Page de r�initialisation du mot de passe par d�faut.

guestbook.name=Saisir un nom pour le registre de visiteurs.
116 changes: 116 additions & 0 deletions src/main/java/edu/harvard/iq/dataverse/DataverseLocaleBean.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
package edu.harvard.iq.dataverse;

import edu.harvard.iq.dataverse.settings.SettingsServiceBean;
import java.io.IOException;
import java.io.Serializable;
import java.util.*;
import java.util.logging.Logger;

import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import javax.servlet.http.HttpServletRequest;

import org.json.*;

@Named
@javax.enterprise.context.SessionScoped
public class DataverseLocaleBean implements Serializable {

private static final Logger logger = Logger.getLogger(DataverseLocaleBean.class.getCanonicalName());

@Inject
SettingsWrapper settingsWrapper;

{
//Noticed that the NullPointerException was thrown from FacesContext.getCurrentInstance() while running the testcases(mvn:package).
//Reason: the FacesContext is not initialized until the app starts. So, added the below if-condition
if(FacesContext.getCurrentInstance() == null)
{
localeCode = "en";
}
else {
if (FacesContext.getCurrentInstance().getViewRoot().getLocale().getLanguage() == "en_US") {
localeCode = "en";
} else {
localeCode = FacesContext.getCurrentInstance().getViewRoot().getLocale().getLanguage();
}
}
}

// Map from locale to display name eg en -> English
private Map<String, String> dataverseLocales;

private String localeCode;

public void init() {
dataverseLocales = new LinkedHashMap<>();
try {
JSONArray entries = new JSONArray(settingsWrapper.getValueForKey(SettingsServiceBean.Key.Languages, "[]"));
for (Object obj : entries) {
JSONObject entry = (JSONObject) obj;
String locale = entry.getString("locale");
String title = entry.getString("title");

dataverseLocales.put(locale, title);
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//localeCode = dataverseLocales.keySet().iterator().next();
/*if (FacesContext.getCurrentInstance().getViewRoot().getLocale().getLanguage() == "en_US") {
localeCode = "en";
} else {
localeCode = FacesContext.getCurrentInstance().getViewRoot().getLocale().getLanguage();
}*/
}

public Map<String, String> getDataverseLocales(){
return dataverseLocales;
}

public boolean useLocale() {
if (dataverseLocales == null) {
init();
}
return dataverseLocales.size() > 1;
}

public String getLocaleCode() {
if (localeCode == null) {
init();
}
return localeCode;
}

public void setLocaleCode(String localeCode) {
this.localeCode = localeCode;
}

public String getLocaleTitle() {
if (dataverseLocales == null) {
init();
}
return dataverseLocales.get(localeCode);
}

public void countryLocaleCodeChanged(String code) {
if (dataverseLocales == null) {
init();
}
localeCode = code;
FacesContext.getCurrentInstance()
.getViewRoot().setLocale(new Locale(dataverseLocales.get(code)));
try {
String url = ((HttpServletRequest) FacesContext.getCurrentInstance()
.getExternalContext().getRequest()).getHeader("referer");
FacesContext.getCurrentInstance().getExternalContext().redirect(url);

} catch (IOException ioe) {
ioe.printStackTrace();
}

}

}
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,5 @@ public String getSupportTeamName() {
public boolean isRootDataverseThemeDisabled() {
return isTrueForKey(Key.DisableRootDataverseTheme, false);
}

}

Original file line number Diff line number Diff line change
Expand Up @@ -355,6 +355,9 @@ Whether Harvesting (OAI) service is enabled
'INDEPENDENT' means a new global id, completely independent from the dataset-level global id.
*/
DataFilePIDFormat,
/* Json array of supported languages
*/
Languages,
Copy link
Member

Choose a reason for hiding this comment

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

This new :Languages setting needs to be documented. This is where we document them: http://guides.dataverse.org/en/4.9.1/installation/config.html#database-settings

/*
Number for the minimum number of files to send PID registration to asynchronous workflow
*/
Expand Down
9 changes: 6 additions & 3 deletions src/main/java/edu/harvard/iq/dataverse/util/BundleUtil.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package edu.harvard.iq.dataverse.util;

import edu.harvard.iq.dataverse.DataverseLocaleBean;

import java.text.MessageFormat;
import java.util.List;
import java.util.Locale;
Expand All @@ -12,16 +14,17 @@ public class BundleUtil {
private static final Logger logger = Logger.getLogger(BundleUtil.class.getCanonicalName());

private static final String defaultBundleFile = "Bundle";
private static final Locale defaultLocale = Locale.US;
private static Locale bundle_locale;

public static String getStringFromBundle(String key) {
return getStringFromBundle(key, null);
}

public static String getStringFromBundle(String key, List<String> arguments) {
ResourceBundle bundle = ResourceBundle.getBundle(defaultBundleFile, defaultLocale);
DataverseLocaleBean d = new DataverseLocaleBean();
bundle_locale= new Locale(d.getLocaleCode());
ResourceBundle bundle = ResourceBundle.getBundle(defaultBundleFile, bundle_locale);
return getStringFromBundle(key, arguments, bundle);

}

public static String getStringFromBundle(String key, List<String> arguments, ResourceBundle bundle) {
Expand Down
1 change: 1 addition & 0 deletions src/main/webapp/WEB-INF/faces-config.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
</resource-bundle>
<locale-config>
<default-locale>en</default-locale>
<supported-locale>fr</supported-locale>
<supported-locale>zh_CN</supported-locale>
</locale-config>
</application>
Expand Down
96 changes: 60 additions & 36 deletions src/main/webapp/dataverse_header.xhtml
Original file line number Diff line number Diff line change
Expand Up @@ -38,58 +38,75 @@
</div>
<div class="collapse navbar-collapse" id="topNavBar">
<ul class="nav navbar-nav navbar-right">
<li>
<a href="#" id="navbar-search-toggle" title="#{bundle['header.search.title']}">
<span class="glyphicon glyphicon-search"></span>
</a>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">#{bundle.search} <b class="caret"></b></a>
<ul class="dropdown-menu" style="padding:12px;min-width:350px;">
<form class="form-inline" role="search">
<label class="sr-only" for="navbarsearch">#{bundle.search}</label>
<div class="input-group">
<input id="navbarsearch" type="text" class="form-control" size="28" value="" placeholder="#{bundle['header.search.title']}"/>
<span class="input-group-btn">
<button type="submit" class="btn btn-default" onclick="window.location = '/dataverse/#{dataverseServiceBean.findRootDataverse().alias}&#63;q=' + document.getElementById('navbarsearch').value;
return false;">
<span class="glyphicon glyphicon-search"/> #{bundle.find}
</button>
</span>
</div>
</form>
</ul>
</li>
<form class="navbar-form navbar-left" role="search" style="display:none;">
<div class="form-group">
<label class="sr-only" for="navbarsearch">#{bundle.search}</label>
<input id="navbarsearch" type="text" class="search-input ui-inputfield ui-inputtext ui-widget ui-state-default ui-corner-all" size="28" value="" placeholder="#{bundle['header.search.title']}"/>
</div>
<button type="submit" class="btn btn-default" onclick="window.location = '/dataverse/#{dataverseServiceBean.findRootDataverse().alias}&#63;q=' + document.getElementById('navbarsearch').value;
return false;">
<span class="glyphicon glyphicon-search"/> #{bundle.find}
</button>
</form>
<ui:fragment rendered="#{!empty settingsWrapper.get(':NavbarAboutUrl')}">
<li>

<li jsf:rendered="#{!empty settingsWrapper.get(':NavbarAboutUrl')}">
<h:outputLink value="#{settingsWrapper.get(':NavbarAboutUrl')}" target="_blank">
#{bundle['header.about']}
</h:outputLink>
<h:outputText value="#{bundle['header.about']}"/>
</h:outputLink>
</li>
</ui:fragment>

<li>
<h:outputLink value="#{settingsWrapper.guidesBaseUrl}/#{systemConfig.guidesVersion}/user" target="_blank">
#{bundle['header.guides.user']}
<h:outputText value="#{bundle['header.guides.user']}"/>
</h:outputLink>
</li>

<ui:fragment rendered="#{!empty settingsWrapper.get(':NavbarSupportUrl')}">
<li>
<h:outputLink value="#{settingsWrapper.get(':NavbarSupportUrl')}" target="_blank">
#{bundle['header.support']}
</h:outputLink>
</li>
</ui:fragment>

<li jsf:rendered="#{!empty settingsWrapper.get(':NavbarSupportUrl')}">
<h:outputLink value="#{settingsWrapper.get(':NavbarSupportUrl')}" target="_blank">
<h:outputText value="#{bundle['header.support']}"/>
</h:outputLink>
</li>

<ui:fragment rendered="#{empty settingsWrapper.get(':NavbarSupportUrl')}">
<o:form useRequestURI="true" class="navbar-form navbar-left navbar-form-link">
<p:commandLink value="#{bundle['header.support']}" oncomplete="PF('contactForm').show()" update=":contactDialog" actionListener="#{sendFeedbackDialog.initUserInput}">
<p:commandLink oncomplete="PF('contactForm').show()" update=":contactDialog" actionListener="#{sendFeedbackDialog.initUserInput}">
<f:setPropertyActionListener target="#{sendFeedbackDialog.messageSubject}" value=""/>
<f:setPropertyActionListener target="#{sendFeedbackDialog.recipient}" value="#{null}"/>
<f:setPropertyActionListener target="#{sendFeedbackDialog.userMessage}" value=""/>
<f:setPropertyActionListener target="#{sendFeedbackDialog.userEmail}" value=""/>
<h:outputText value="#{bundle['header.support']}"/>
</p:commandLink>
</o:form>
</ui:fragment>

<li jsf:rendered="#{dataverseSession.user.superuser}">
<h:outputLink value="/dashboard.xhtml?dataverseId=#{dataverseServiceBean.findRootDataverse().id}">
<h:outputText value="#{bundle['header.dashboard']}" />
</h:outputLink>

<li class="dropdown" jsf:rendered="#{dataverseLocaleBean.useLocale()}">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" title="#{bundle.language}">#{dataverseLocaleBean.localeTitle} <b class="caret"></b></a>
<ul class="dropdown-menu">
<h:form class="form-inline">
<ui:repeat value="#{dataverseLocaleBean.dataverseLocales.entrySet().toArray()}" var="language">
<li class="#{dataverseLocaleBean.localeTitle == language.value ? 'active' : ''}">
<h:commandLink value="#{language.value}" actionListener="#{dataverseLocaleBean.countryLocaleCodeChanged(language.key)}" action="submit()"
style="padding: 3px 20px;
clear: both;
font-weight: 400;
line-height: 1.42857143;
color: rgb(51, 51, 51);
white-space: nowrap;
text-decoration: none;
display: block;"/>
</li>
</ui:repeat>
</h:form>
</ul>
</li>

<ui:fragment rendered="#{!dataverseSession.user.authenticated}">
<li>
<h:outputLink rendered="#{dataverseHeaderFragment.signupAllowed}"
Expand All @@ -103,6 +120,7 @@
</h:outputLink>
</li>
</ui:fragment>

<ui:fragment rendered="#{dataverseSession.user.authenticated}">
<li class="dropdown accountName">
<a href="#" id="lnk_header_account_dropdown" class="dropdown-toggle" data-toggle="dropdown" role="menu" aria-haspopup="true" aria-expanded="false">
Expand Down Expand Up @@ -148,9 +166,15 @@
<h:outputText value="#{bundle['header.user.selectTab.apiToken']}" />
</h:outputLink>
</li>
<li class="divider" tabindex="-1"></li>
<li class="divider"></li>
<li jsf:rendered="#{dataverseSession.user.superuser}" tabindex="-1">
<h:outputLink value="/dashboard.xhtml?dataverseId=#{dataverseServiceBean.findRootDataverse().id}">
<h:outputText value="#{bundle['header.dashboard']}" />
</h:outputLink>
</li>
<li class="divider" jsf:rendered="#{dataverseSession.user.superuser}"></li>
<li class="logout" tabindex="-1">
<o:form useRequestURI="true" styleClass="navbar-form navbar-left" pt:role="logout">
<o:form useRequestURI="true" pt:role="logout">
<h:commandLink action="#{dataverseHeaderFragment.logout}" id="lnk_header_logout">
<h:outputText value="#{bundle['header.logOut']}" />
</h:commandLink>
Expand Down