mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-11-07 19:42:17 +00:00
Merge branch 'master' into bug4483
This commit is contained in:
commit
0169e373eb
27 files changed
+670
-66
No files matched your search
+2
-5
@@ -19,7 +19,6 @@ import com.sap.sse.gwt.dispatch.shared.exceptions.DispatchException;
|
||||
import com.sap.sse.gwt.dispatch.shared.exceptions.ServerDispatchException;
|
||||
import com.sap.sse.security.SecurityService;
|
||||
import com.sap.sse.security.User;
|
||||
import com.sap.sse.security.UserStore;
|
||||
|
||||
@GwtIncompatible
|
||||
public class SailingDispatchContextImpl implements SailingDispatchContext {
|
||||
@@ -30,20 +29,18 @@ public class SailingDispatchContextImpl implements SailingDispatchContext {
|
||||
private String clientLocaleName;
|
||||
private final HttpServletRequest request;
|
||||
private final SecurityService securityService;
|
||||
private final UserStore userStore;
|
||||
private final TrackedRaceStatisticsCache trackedRaceStatisticsCache;
|
||||
private final WindFinderTrackerFactory windFinderTrackerFactory;
|
||||
|
||||
public SailingDispatchContextImpl(Date currentClientTime, RacingEventService racingEventService,
|
||||
WindFinderTrackerFactory windFinderTrackerFactory, EventNewsService eventNewsService,
|
||||
SecurityService securityService, UserStore userStore, TrackedRaceStatisticsCache trackedRaceStatisticsCache,
|
||||
SecurityService securityService, TrackedRaceStatisticsCache trackedRaceStatisticsCache,
|
||||
String clientLocaleName, HttpServletRequest request) {
|
||||
this.currentClientTime = currentClientTime;
|
||||
this.racingEventService = racingEventService;
|
||||
this.windFinderTrackerFactory = windFinderTrackerFactory;
|
||||
this.eventNewsService = eventNewsService;
|
||||
this.securityService = securityService;
|
||||
this.userStore = userStore;
|
||||
this.trackedRaceStatisticsCache = trackedRaceStatisticsCache;
|
||||
this.clientLocaleName = clientLocaleName;
|
||||
this.request = request;
|
||||
@@ -96,7 +93,7 @@ public class SailingDispatchContextImpl implements SailingDispatchContext {
|
||||
public <T> T getPreferenceForCurrentUser(String preferenceKey) {
|
||||
User currentUser = securityService.getCurrentUser();
|
||||
if (currentUser != null) {
|
||||
return userStore.getPreferenceObject(currentUser.getName(), preferenceKey);
|
||||
return securityService.getPreferenceObject(currentUser.getName(), preferenceKey);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
+1
-4
@@ -24,7 +24,6 @@ import com.sap.sse.gwt.dispatch.servlets.AbstractDispatchServlet;
|
||||
import com.sap.sse.gwt.dispatch.shared.commands.Action;
|
||||
import com.sap.sse.gwt.dispatch.shared.commands.Result;
|
||||
import com.sap.sse.security.SecurityService;
|
||||
import com.sap.sse.security.UserStore;
|
||||
import com.sap.sse.util.ServiceTrackerFactory;
|
||||
|
||||
public class SailingDispatchServlet extends AbstractDispatchServlet<SailingDispatchContext> {
|
||||
@@ -34,7 +33,6 @@ public class SailingDispatchServlet extends AbstractDispatchServlet<SailingDispa
|
||||
private final ServiceTracker<WindFinderTrackerFactory, WindFinderTrackerFactory> windFinderTrackerFactory;
|
||||
private final ServiceTracker<EventNewsService, EventNewsService> eventNewsServiceTracker;
|
||||
private final ServiceTracker<SecurityService, SecurityService> securityServiceTracker;
|
||||
private final ServiceTracker<UserStore, UserStore> userStoreTracker;
|
||||
private final ServiceTracker<TrackedRaceStatisticsCache, TrackedRaceStatisticsCache> trackedRaceStatisticsCacheTracker;
|
||||
|
||||
public SailingDispatchServlet() {
|
||||
@@ -43,7 +41,6 @@ public class SailingDispatchServlet extends AbstractDispatchServlet<SailingDispa
|
||||
windFinderTrackerFactory = ServiceTrackerFactory.createAndOpen(context, WindFinderTrackerFactory.class);
|
||||
eventNewsServiceTracker = ServiceTrackerFactory.createAndOpen(context, EventNewsService.class);
|
||||
securityServiceTracker = ServiceTrackerFactory.createAndOpen(context, SecurityService.class);
|
||||
userStoreTracker = ServiceTrackerFactory.createAndOpen(context, UserStore.class);
|
||||
trackedRaceStatisticsCacheTracker = ServiceTrackerFactory.createAndOpen(context, TrackedRaceStatisticsCache.class);
|
||||
}
|
||||
|
||||
@@ -53,7 +50,7 @@ public class SailingDispatchServlet extends AbstractDispatchServlet<SailingDispa
|
||||
return new SailingDispatchContextImpl(request.getCurrentClientTime(), racingEventServiceTracker.getService(),
|
||||
windFinderTrackerFactory.getService(),
|
||||
eventNewsServiceTracker.getService(), securityServiceTracker.getService(),
|
||||
userStoreTracker.getService(), trackedRaceStatisticsCacheTracker.getService(),
|
||||
trackedRaceStatisticsCacheTracker.getService(),
|
||||
request.getClientLocaleName(), getThreadLocalRequest());
|
||||
}
|
||||
|
||||
|
||||
+3
-1
@@ -2,7 +2,7 @@
|
||||
left: 50% !important;
|
||||
top: 50% !important;
|
||||
position: absolute !important;
|
||||
background-color: #f2f2f2;
|
||||
background-color: #ffffff;
|
||||
padding: 1em;
|
||||
border: 1px solid #ccc;
|
||||
border-radius: 3px;
|
||||
@@ -38,6 +38,7 @@
|
||||
|
||||
.buttonPanel {
|
||||
text-align: center;
|
||||
font-size: 0;
|
||||
}
|
||||
|
||||
.backgroundPanel {
|
||||
@@ -64,5 +65,6 @@
|
||||
|
||||
.buttonAdjustments {
|
||||
min-width: 100%;
|
||||
margin: .5em 0 0;
|
||||
}
|
||||
}
|
||||
+89
@@ -2096,3 +2096,92 @@ resizeSuccessfull=Ajuste de tamaño finalizado correctamente
|
||||
resizeUnsuccessfull=No es posible el ajuste de tamaño
|
||||
setUpStorageService=Configure primero un servicio de almacenamiento de ficheros
|
||||
automaticResizeNeedsStorageService=Ajuste de tamaño automático requiere un FileStorageService que funcione.
|
||||
qrCodeTitle=Bienvenido {0} a {1}
|
||||
qrCodeSubtitle={0} - {1}
|
||||
qrCodeInfoMessage=Escanee este código QR con su smartphone para participar en el evento.
|
||||
qrCodeErrorMessage=Lo sentimos, esta función no está disponible actualmente.
|
||||
qrCodeTitleBouy=Bienvenido como buque balizador de {0}
|
||||
tag=Etiqueta
|
||||
tagButtons=Botones de etiqueta
|
||||
tagPanel=Etiquetas
|
||||
tagCreated=({1}, creado por {0})
|
||||
tagNoTagsFound=No existen etiquetas
|
||||
tagAddTag=Añadir etiqueta
|
||||
tagEditTag=Tratar etiqueta
|
||||
tagDeleteTag=Borrar etiqueta
|
||||
tagShareTag=Compartir etiqueta
|
||||
tagAddTags=Añadir etiquetas
|
||||
tagSavedSuccessfully=Etiqueta grabada correctamente
|
||||
tagNotSaved=No se ha podido grabar etiqueta
|
||||
tagNotSavedReason=No se ha podido grabar etiqueta. Motivo: {0}
|
||||
tagAlreadyExists=Ya existe etiqueta
|
||||
tagNotLoaded=No se han podido cargar etiquetas
|
||||
tagNotLoggedIn=Inicie sesión para añadir etiquetas nuevas
|
||||
tagNotRemoved=No se ha podido eliminar etiqueta
|
||||
tagRemovedSuccessfully=Etiqueta eliminada correctamente
|
||||
tagFilterExplanation=El filtro mostrará todas las etiquetas que coincidan con los siguientes criterios. Los filtros distinguen entre mayúsculas/minúsculas
|
||||
tagSelectedTags=Etiquetas seleccionadas
|
||||
tagsFilter=Filtro de etiqueta
|
||||
tagSearchTags=Buscar
|
||||
tagLabelTag=Etiqueta
|
||||
tagLabelComment=Comentario
|
||||
tagLabelImage=Imagen
|
||||
tagLabelAction=Acción
|
||||
tagLabelVisibility=Visibilidad
|
||||
tagCreateTag=Crear etiqueta
|
||||
tagEditCustomTagButtons=Tratar botones de selección de etiqueta
|
||||
tagAddCustomTagButton=Añadir botón de selección
|
||||
tagNotSpecified=La etiqueta no puede estár en blanco
|
||||
tagEditFilter=Tratar etiqueta
|
||||
tagEditCustomTagButton=Tratar botón de etiqueta
|
||||
tagSaveCustomTagButton=Grabar
|
||||
tagPreview=Vista previa de etiqueta:
|
||||
tagVisibleForPublicCheckBox=Visible para público
|
||||
tagVisibility=Visibilidad
|
||||
tagConfirmDeletionHeading=Borrar etiqueta
|
||||
tagConfirmDeletion=Esto borrará la etiqueta "{0}". ¿Desea realmente continuar?
|
||||
tagButtonConfirmDeletionHeading=Borrar botón de etiqueta
|
||||
tagButtonConfirmDeletion=Esto borrará el botón de la etiqueta "{0}". ¿Desea realmente continuar?
|
||||
tagDiscardChangesHeading=Descartar cambios
|
||||
tagDiscardChanges=¿Está seguro de que desea descartar los cambios?
|
||||
tagFilterNotSavable=No se han podido grabar las opciones de filtro en el servidor
|
||||
tagCurrentFilter=Filtro actual:
|
||||
tagCreateFilterNotLoggedIn=No ha iniciado sesión por tanto no se grabarán los filtros.
|
||||
tagCreateFilterHint=Crear un conjunto de filtros para filtrar la lista de etiquetas.
|
||||
tagButtonNotSavable=No se ha podido grabar el botón de la etiqueta en el servidor
|
||||
tagNotEditable=No puede tratar esta etiqueta
|
||||
tagPublicModificationPermissionMissing=No dispone de permiso para crear etiquetas públicas, pero sí tiene permiso para crear etiquetas privadas.
|
||||
tagNotFound=No se ha podido encontrar la etiqueta
|
||||
tagInvalidURL=Parámetro de URL no válido
|
||||
tagSharedDialog=Etiqueta compartida
|
||||
tagSharedURL=Puede compartir esta etiqueta mediante el URL siguiente:
|
||||
tagCopyToClipBoard=Copiar en el portapapeles
|
||||
tagBrowseAndUploadImage=Navegar y cargar
|
||||
tagCopiedLinkSuccessfully=Enlace copiado correctamente en el portapapeles
|
||||
tagCopiedLinkNotSuccessfully=Su navegador no soporta la copia en el portapapeles; copie el enlace manualmente
|
||||
username=Nombre de usuario
|
||||
confirm=Confirmar
|
||||
cancel=Cancelar
|
||||
close=Cerrar
|
||||
boatClasses=Clases de embarcación
|
||||
sailorProfiles=Perfiles de navegante
|
||||
unknownSailorProfile=No se ha podido cargar el perfil {0}, ¿ha iniciado sesión como usuario correcto?
|
||||
profileName=Nombre de perfil
|
||||
addSailorProfileMessage=Añadir un perfil de navegante nuevo
|
||||
badges=Identificaciones
|
||||
newSailorProfileName=Perfil de navegante nuevo
|
||||
maxSpeedTitle=Velocidad máxima
|
||||
maxStartLineSpeed=Velocidad máxima al cruzar la línea de salida
|
||||
shortestDistanceToStartline=Distancia mínima a la línea de salida en el inicio de la carrera
|
||||
averageDistanceToStartLine=Distancia media a la línea de salida en el inicio de la carrera
|
||||
metersValue={0,number,#0.0} m
|
||||
showInRaceboard=Mostrar en Raceboard
|
||||
showInDataMining=Mostrar en minería de datos
|
||||
couldNotDetermineStatistic=No se ha podido calcular la estadística
|
||||
noEventsFoundForCompetitors=No existen eventos disponibles para los competidores seleccionados.
|
||||
noStatisticsFoundForCompetitors=No existen estadísticas disponibles para los competidores seleccionados.
|
||||
pleaseSelectCompetitorFirst=Seleccione primero un competidor.
|
||||
sailorProfileRemoveMessage=¿Está seguro de que desea eliminar este perfil de navegante?
|
||||
moreLoginInformationSectionSailorProfilesDescription=Después de iniciar sesión, ahora puede buscar una nueva área bajo su perfil de usuario, que se llama Perfiles de navegante. Puede añadir algunos competidores a tal perfil de navegante y obtener más información sobre estos competidores. En un perfil de navegante, puede visualizar todos los eventos en los que sus competidores favoritos han participado y comparar sus posiciones entre sí. Además, obtendrás un resumen de las estadísticas más importantes, como la velocidad máxima o la distancia media a la línea de salida con enlaces directos al mapa de la carrera para visualizar el punto exacto en el tiempo, donde, por ejemplo, el competidor más rápido ha alcanzado su récord. Para estadísticas agregativas como la distancia media a la línea de salida en el inicio de la carrera, puede hacer clic en la flecha y pasará a la minería de datos donde podrá visualizar el promedio de los valores.
|
||||
moreLoginInformationSectionSailorProfilesHeading=Perfiles de navegante
|
||||
confirmDeletion=Confirmar borrado
|
||||
+94
-5
@@ -755,7 +755,7 @@ replay=Relecture
|
||||
display=Afficher
|
||||
simulatorPolarHeader=Diagramme polaire
|
||||
show=Afficher
|
||||
hide=masquer
|
||||
hide=Masquer
|
||||
leftWind=Vent de gauche
|
||||
rightWind=Vent de droite
|
||||
strategyOption1=Option de stratégie 1
|
||||
@@ -813,7 +813,7 @@ raceAbandoned=Abandonné
|
||||
stopAllReplicas=Supprimer la connexion à tous les réplicas (dangereux !)
|
||||
warningServerIsReplica=ATTENTION : ce serveur est configuré pour être un réplica. Ne modifiez rien, sinon des erreurs inattendues peuvent se produire.
|
||||
dropReplicaConnection=Supprimer connexion
|
||||
timePanelName=Contrôles des temps
|
||||
timePanelName=Contrôle des temps
|
||||
competitorFilterExplanation=Ce filtre affichera tous les concurrents qui correspondent aux critères :
|
||||
protestTime=Heure de réclamation
|
||||
protestTimeFinishesAt=se termine
|
||||
@@ -912,7 +912,7 @@ cleanedOverallTime=Durée globale de nettoyage
|
||||
statisticToCalculate=Calculer statistiques
|
||||
noQuerySelected=Aucune requête sélectionnée
|
||||
windImport_Upload=Charger
|
||||
windImport_Title=Importer vent à partir de Expedition
|
||||
windImport_Title=Importer vent à partir de l''outil Expedition
|
||||
windImport_BoatId=N° du bateau :
|
||||
windImport_SelectedRacesWarning=Voulez-vous réellement importer les données de vent dans les {0} courses ?\nNotez que seules les courses dont l''intervalle est pertinent seront prises en compte.
|
||||
windImport_AllRacesWarning=Voulez-vous réellement importer les données de vent dans toutes les courses ?\nNotez que seules les courses dont l''intervalle est pertinent seront prises en compte.
|
||||
@@ -1786,7 +1786,7 @@ couldNotFindRaceInRegatta=Impossible de trouver une course nommée {0} pour une
|
||||
algorithmTimeOutText=Hors portée
|
||||
mixedLegText=Vent ambigu
|
||||
pathCanvasOverlayTitle=Chemin à {0} points. {1} NM dans {2}
|
||||
windSpeedInKnots=Vitesse du vent en noeuds
|
||||
windSpeedInKnots=Vitesse du vent en nœuds
|
||||
activeFilters=Filtre(s) actif(s) : {0}
|
||||
errorLoadingRegattasForLeaderboardGroup=Erreur lors de la tentative de chargement des régates correspondantes pour le groupe de palmarès {0} : {1}
|
||||
errorLoadingLeaderBoardGroup=Erreur lors de la tentative de chargement du groupe de palmarès {0} : {1}
|
||||
@@ -1860,7 +1860,7 @@ moreLoginInformationSectionUserSettingsHeading=Options utilisateur
|
||||
moreLoginInformationSectionUserSettingsDescription=Certains éléments de l''interface utilisateur peuvent être personnalisés. Les fonctionnalités de base sont accessibles à tous les utilisateurs, mais les utilisateurs authentifiés ont la possibilité de modifier leurs options. Celles-ci sont conservées dans leur profil utilisateur et disponibles sur n''importe quel appareil dès que l''utilisateur se connecte.
|
||||
moreLoginInformationSectionStrategySimulatorDescription=Le simulateur permet aux navigateurs de simuler des stratégies sur des portions de parcours grâce à des conditions de vent configurables. Le simulateur se base sur l''ensemble des données historiques disponibles dans SAP Sailing Analytics pour fournir des simulations de comportements de catégories de bateaux spécifiques les plus précises possibles.
|
||||
moreLoginInformationSectionUserNotificationsHeading=Notifications utilisateur
|
||||
moreLoginInformationSectionUserNotificationsDescription=Grâce aux notifications utilisateur, vous pouvez rester informé sur votre catégorie de bateau, votre équipe ou votre concurrent favoris. Vous avez la possibilité de vous abonner afin de recevoir des notifications par e-mail sur votre catégorie de bateau, votre équipe ou votre concurrent favoris, ainsi que sur les différentes courses à venir.
|
||||
moreLoginInformationSectionUserNotificationsDescription=Grâce aux notifications utilisateur, vous pouvez rester informé(e) sur votre catégorie de bateau, votre équipe ou votre concurrent préféré(e). Vous avez la possibilité de vous abonner afin de recevoir des notifications par e-mail sur votre catégorie de bateau, votre équipe ou votre concurrent préféré(e), ainsi que sur les différentes courses à venir.
|
||||
moreLoginInformationRegisterControlText=S''inscrire maintenant
|
||||
anniversaryUnitText=Courses
|
||||
anniversaryUnitText[one]=Course
|
||||
@@ -2096,3 +2096,92 @@ resizeSuccessfull=Redimensionnement correctement terminé
|
||||
resizeUnsuccessfull=Redimensionnement impossible
|
||||
setUpStorageService=Veuillez d''abord configurer un service de stockage de fichier.
|
||||
automaticResizeNeedsStorageService=Pour pouvoir utiliser le redimensionnement automatique, un service de stockage de fichier doit être configuré.
|
||||
qrCodeTitle=Bienvenue {0} dans {1} !
|
||||
qrCodeSubtitle={0} - {1}
|
||||
qrCodeInfoMessage=Veuillez scanner ce code QR avec votre smartphone pour participer à cet événement.
|
||||
qrCodeErrorMessage=Désolé, cette fonctionnalité n''est pas disponible actuellement.
|
||||
qrCodeTitleBouy=Bienvenue en tant que navire baliseur pour {0}.
|
||||
tag=Balise
|
||||
tagButtons=Boutons de balises
|
||||
tagPanel=Balises
|
||||
tagCreated=({1}, création par {0})
|
||||
tagNoTagsFound=Aucune balise trouvée.
|
||||
tagAddTag=Ajouter une balise
|
||||
tagEditTag=Modifier une balise
|
||||
tagDeleteTag=Supprimer une balise
|
||||
tagShareTag=Partager une balise
|
||||
tagAddTags=Ajouter des balises
|
||||
tagSavedSuccessfully=Balise correctement sauvegardée
|
||||
tagNotSaved=Impossible de sauvegarder la balise
|
||||
tagNotSavedReason=Impossible de sauvegarder la balise. Motif : {0}
|
||||
tagAlreadyExists=La balise existe déjà.
|
||||
tagNotLoaded=Impossible de charger les balises
|
||||
tagNotLoggedIn=Connectez-vous pour ajouter de nouvelles balises.
|
||||
tagNotRemoved=Impossible de supprimer la balise
|
||||
tagRemovedSuccessfully=Balise correctement supprimée
|
||||
tagFilterExplanation=Le filtre montre toutes les balises correspondant aux critères suivants. Notez que les filtres sont sensibles à la casse.
|
||||
tagSelectedTags=Balises sélectionnées
|
||||
tagsFilter=Filtre de balises
|
||||
tagSearchTags=Rechercher
|
||||
tagLabelTag=Balise
|
||||
tagLabelComment=Commentaire
|
||||
tagLabelImage=Image
|
||||
tagLabelAction=Action
|
||||
tagLabelVisibility=Visibilité
|
||||
tagCreateTag=Créer balise
|
||||
tagEditCustomTagButtons=Modifier les boutons de balises
|
||||
tagAddCustomTagButton=Ajouter bouton de balise
|
||||
tagNotSpecified=La balise ne doit pas être vide.
|
||||
tagEditFilter=Modifier filtre
|
||||
tagEditCustomTagButton=Modifier bouton de balise
|
||||
tagSaveCustomTagButton=Sauvegarder
|
||||
tagPreview=Aperçu de balise :
|
||||
tagVisibleForPublicCheckBox=Visible au public
|
||||
tagVisibility=Visibilité
|
||||
tagConfirmDeletionHeading=Supprimer la balise
|
||||
tagConfirmDeletion=Cette action va supprimer la balise "{0}". Voulez-vous vraiment continuer ?
|
||||
tagButtonConfirmDeletionHeading=Supprimer le bouton de balise
|
||||
tagButtonConfirmDeletion=Cette action va supprimer le bouton de balise "{0}". Voulez-vous vraiment continuer ?
|
||||
tagDiscardChangesHeading=Ignorer les modifications
|
||||
tagDiscardChanges=Voulez-vous vraiment ignorer les modifications ?
|
||||
tagFilterNotSavable=Impossible de sauvegarder les options de filtres sur le serveur.
|
||||
tagCurrentFilter=Filtre actuel :
|
||||
tagCreateFilterNotLoggedIn=Vous n''êtes pas connecté(e). Les filtres ne seront pas sauvegardés.
|
||||
tagCreateFilterHint=Créer un ensemble de filtres pour filtrer la liste de balises
|
||||
tagButtonNotSavable=Impossible de sauvegarder le bouton de balise sur le serveur.
|
||||
tagNotEditable=Vous ne devez pas modifier cette balise.
|
||||
tagPublicModificationPermissionMissing=Vous n''avez pas l''autorisation pour créer des balises publiques, mais vous avez l''autorisation pour créer des balises privées.
|
||||
tagNotFound=Balise introuvable
|
||||
tagInvalidURL=Paramètre URL non valide
|
||||
tagSharedDialog=Balise partagée
|
||||
tagSharedURL=Vous pouvez partager cette balise à l''aide de cette URL :
|
||||
tagCopyToClipBoard=Copier dans le presse-papiers
|
||||
tagBrowseAndUploadImage=Naviguer et charger
|
||||
tagCopiedLinkSuccessfully=Lien correctement copié dans le presse-papiers
|
||||
tagCopiedLinkNotSuccessfully=Votre navigateur ne prend pas la copie vers le presse-papiers en charge. Veuillez copier le lien manuellement.
|
||||
username=Nom d''utilisateur
|
||||
confirm=Confirmer
|
||||
cancel=Annuler
|
||||
close=Fermer
|
||||
boatClasses=Catégories de bateaux
|
||||
sailorProfiles=Profils de sportifs
|
||||
unknownSailorProfile=Impossible de charger le profil {0}. Êtes-vous connecté avec l''utilisateur approprié ?
|
||||
profileName=Nom du profil
|
||||
addSailorProfileMessage=Ajouter un nouveau profil de sportif
|
||||
badges=Badges
|
||||
newSailorProfileName=Nouveau profil de sportif
|
||||
maxSpeedTitle=Vitesse maximale
|
||||
maxStartLineSpeed=Vitesse maximale lors du passage de la ligne de départ
|
||||
shortestDistanceToStartline=Distance minimale de la ligne de départ au début de la course
|
||||
averageDistanceToStartLine=Distance moyenne de la ligne de départ au début de la course
|
||||
metersValue={0,number,#0.0} m
|
||||
showInRaceboard=Afficher sur le tableau des courses
|
||||
showInDataMining=Afficher dans Exploration de données
|
||||
couldNotDetermineStatistic=Impossible de calculer les statistiques
|
||||
noEventsFoundForCompetitors=Aucun événement n''est disponible pour les concurrents sélectionnés.
|
||||
noStatisticsFoundForCompetitors=Aucune statistique n''est disponible pour les concurrents sélectionnés.
|
||||
pleaseSelectCompetitorFirst=Veuillez d''abord sélectionner un concurrent.
|
||||
sailorProfileRemoveMessage=Voulez-vous vraiment supprimer ce profil de sportif ?
|
||||
moreLoginInformationSectionSailorProfilesDescription=Une fois connecté(e), vous trouverez désormais un nouvel espace dans votre profil utilisateur, appelé Profils de sportifs. Vous pouvez ajouter des concurrents à un profil de sportif et accéder à des analyses approfondies de ces concurrents. Dans un profil de sportif, vous pouvez afficher tous les événements auxquels vos concurrents préférés ont participé et comparer leur positionnement les uns par rapport aux autres. De plus, vous pouvez accéder à une synthèse des statistiques les plus importantes, telles que la vitesse maximale ou la distance moyenne de la ligne de départ avec des liens vers la carte de la course afin de déterminer le moment exact où, par exemple, le concurrent le plus rapide a atteint son record. Pour accéder à des statistiques agrégées comme la distance moyenne de la ligne de départ au début de la course, vous pouvez cliquer sur la flèche et allez être guidé vers l''écran Exploration des données où vous pourrez explorer en avant jusqu''aux moyennes.
|
||||
moreLoginInformationSectionSailorProfilesHeading=Profils de sportifs
|
||||
confirmDeletion=Confirmer la suppression
|
||||
+89
@@ -2096,3 +2096,92 @@ resizeSuccessfull=リサイズが正常に終了しました
|
||||
resizeUnsuccessfull=リサイズが可能でありません
|
||||
setUpStorageService=最初にファイルストレージサービスを設定してください
|
||||
automaticResizeNeedsStorageService=自動リサイズには機能している FileStorageService が必要です。
|
||||
qrCodeTitle={0} さん、{1} へようこそ
|
||||
qrCodeSubtitle={0} - {1}
|
||||
qrCodeInfoMessage=スマートフォンでこの QR コードをスキャンしてイベントに参加してください
|
||||
qrCodeErrorMessage=この機能は現在使用できません
|
||||
qrCodeTitleBouy={0} のブイテンダーとしてようこそ
|
||||
tag=タグ
|
||||
tagButtons=タグボタン
|
||||
tagPanel=タグ
|
||||
tagCreated=({1}、{0} が登録)
|
||||
tagNoTagsFound=タグが見つかりません
|
||||
tagAddTag=タグ追加
|
||||
tagEditTag=タグ編集
|
||||
tagDeleteTag=タグ削除
|
||||
tagShareTag=タグ共有
|
||||
tagAddTags=タグ追加
|
||||
tagSavedSuccessfully=タグが保存されました
|
||||
tagNotSaved=タグを保存できませんでした
|
||||
tagNotSavedReason=タグを保存できませんでした。原因: {0}
|
||||
tagAlreadyExists=タグがすでに存在します
|
||||
tagNotLoaded=タグをロードできませんでした
|
||||
tagNotLoggedIn=ログインして新しいタグを追加してください
|
||||
tagNotRemoved=タグを削除できませんでした
|
||||
tagRemovedSuccessfully=タグが削除されました
|
||||
tagFilterExplanation=フィルタは以下の基準に一致するすべてのタグを表示します。フィルタは大文字/小文字を区別します
|
||||
tagSelectedTags=選択されたタグ
|
||||
tagsFilter=タグフィルタ
|
||||
tagSearchTags=検索
|
||||
tagLabelTag=タグ
|
||||
tagLabelComment=コメント
|
||||
tagLabelImage=画像
|
||||
tagLabelAction=アクション
|
||||
tagLabelVisibility=可視性
|
||||
tagCreateTag=タグ登録
|
||||
tagEditCustomTagButtons=タグボタン編集
|
||||
tagAddCustomTagButton=タグボタン追加
|
||||
tagNotSpecified=タグは空にできません
|
||||
tagEditFilter=フィルタ編集
|
||||
tagEditCustomTagButton=タグボタン編集
|
||||
tagSaveCustomTagButton=保存
|
||||
tagPreview=タグプレビュー:
|
||||
tagVisibleForPublicCheckBox=公開表示
|
||||
tagVisibility=可視性
|
||||
tagConfirmDeletionHeading=タグ削除
|
||||
tagConfirmDeletion=これはタグ "{0}" を削除します。続行しますか
|
||||
tagButtonConfirmDeletionHeading=タグボタン削除
|
||||
tagButtonConfirmDeletion=これはタグボタン "{0}" を削除します。続行しますか
|
||||
tagDiscardChangesHeading=変更内容の取消
|
||||
tagDiscardChanges=変更内容を取り消しますか
|
||||
tagFilterNotSavable=サーバでフィルタ設定を保存できませんでした
|
||||
tagCurrentFilter=現在のフィルタ:
|
||||
tagCreateFilterNotLoggedIn=ログインしていないため、フィルタは保存されません
|
||||
tagCreateFilterHint=タグの一覧をフィルタリングするフィルタセットを登録してください。
|
||||
tagButtonNotSavable=サーバでタグボタンを保存できませんでした
|
||||
tagNotEditable=このタグは編集しないでください
|
||||
tagPublicModificationPermissionMissing=公開タグを登録する権限はありませんが、非公開タグの登録は許可されています
|
||||
tagNotFound=タグが見つかりませんでした
|
||||
tagInvalidURL=URL パラメータが無効です
|
||||
tagSharedDialog=共有タグ
|
||||
tagSharedURL=以下の URL を渡すことによってこのタグを共有できます:
|
||||
tagCopyToClipBoard=クリップボードにコピー
|
||||
tagBrowseAndUploadImage=ブラウズしてアップロード
|
||||
tagCopiedLinkSuccessfully=クリップボードにリンクがコピーされました
|
||||
tagCopiedLinkNotSuccessfully=ブラウザがクリップボードへのコピーをサポートしていません。マニュアルでリンクをコピーしてください
|
||||
username=ユーザ名
|
||||
confirm=確認
|
||||
cancel=取消
|
||||
close=終了
|
||||
boatClasses=艇種
|
||||
sailorProfiles=セーラープロファイル
|
||||
unknownSailorProfile=プロファイル {0} をロードできませんでした。適切なユーザとしてログインしていますか
|
||||
profileName=プロファイル名
|
||||
addSailorProfileMessage=新規セーラープロファイル追加
|
||||
badges=バッジ
|
||||
newSailorProfileName=新規セーラープロファイル
|
||||
maxSpeedTitle=最大速度
|
||||
maxStartLineSpeed=スタートライン横断時の最大速度
|
||||
shortestDistanceToStartline=レーススタート時のスタートラインまでの最小距離
|
||||
averageDistanceToStartLine=レーススタート時のスタートラインまでの平均距離
|
||||
metersValue={0,number,#0.0} m
|
||||
showInRaceboard=レースボードに表示
|
||||
showInDataMining=データマイニングで表示
|
||||
couldNotDetermineStatistic=統計を計算できませんでした
|
||||
noEventsFoundForCompetitors=選択された競技者に利用可能なイベントがありません。
|
||||
noStatisticsFoundForCompetitors=選択された競技者に利用可能な統計がありません。
|
||||
pleaseSelectCompetitorFirst=最初に競技者を選択してください。
|
||||
sailorProfileRemoveMessage=このセーラープロファイルを削除しますか
|
||||
moreLoginInformationSectionSailorProfilesDescription=ログインすると、セーラープロファイルと呼ばれるユーザプロファイルの下に新しい領域が表示されます。そうしたセーラープロファイルに競技者を追加して、これらの競技者についてさらにインサイトを得ることができます。セーラープロファイルでは、お気に入りの競技者が参加しているすべてのイベントを表示でき、競技者間で順位を比較できます。さらに、たとえば最速の競技者がその記録に達するなどした正確な時点を表示するレースマップへの直接のリンクとともに、最大速度やスタートラインまでの距離など、最も重要な統計についての概要が得られます。レーススタート時のスタートラインまでの平均距離といった集約的な統計について、矢印をクリックして、平均値をドリルダウンできるデータマイニングに進むことができます。
|
||||
moreLoginInformationSectionSailorProfilesHeading=セーラープロファイル
|
||||
confirmDeletion=削除確認
|
||||
+89
@@ -2096,3 +2096,92 @@ resizeSuccessfull=Redimensionamento concluído com êxito
|
||||
resizeUnsuccessfull=Redimensionamento não possível
|
||||
setUpStorageService=Configure primeiro um serviço de armazenamento de arquivo
|
||||
automaticResizeNeedsStorageService=O redimensionamento automático precisa de um FileStorageService que funcione.
|
||||
qrCodeTitle=Bem-vindo(a) {0} a {1}!
|
||||
qrCodeSubtitle={0} - {1}
|
||||
qrCodeInfoMessage=Digitalize este código QR com seu smartphone para participar do evento!
|
||||
qrCodeErrorMessage=Esta funcionalidade não está disponível no momento!
|
||||
qrCodeTitleBouy=Bem-vindo(a) como um navio-balizador para {0}
|
||||
tag=Etiqueta
|
||||
tagButtons=Botões de etiqueta
|
||||
tagPanel=Etiquetas
|
||||
tagCreated=({1}, criado por {0})
|
||||
tagNoTagsFound=Nenhuma etiqueta encontrada.
|
||||
tagAddTag=Adicionar etiqueta
|
||||
tagEditTag=Processar etiqueta
|
||||
tagDeleteTag=Eliminar etiqueta
|
||||
tagShareTag=Compartilhar etiqueta
|
||||
tagAddTags=Adicionar etiquetas
|
||||
tagSavedSuccessfully=Etiqueta gravada com êxito
|
||||
tagNotSaved=Não foi possível gravar etiqueta.
|
||||
tagNotSavedReason=Não foi possível gravar etiqueta. Motivo: {0}
|
||||
tagAlreadyExists=A etiqueta já existe
|
||||
tagNotLoaded=Não foi possível carregar etiquetas.
|
||||
tagNotLoggedIn=Efetue o logon para adicionar etiquetas novas.
|
||||
tagNotRemoved=Não foi possível remover etiqueta.
|
||||
tagRemovedSuccessfully=Etiqueta removida com êxito
|
||||
tagFilterExplanation=O filtro exibirá todas as etiquetas correspondentes aos critérios seguintes. Os filtros diferenciam maiúsculas de minúsculas.
|
||||
tagSelectedTags=Etiquetas selecionadas
|
||||
tagsFilter=Filtro de etiquetas
|
||||
tagSearchTags=Procurar
|
||||
tagLabelTag=Etiqueta
|
||||
tagLabelComment=Comentário
|
||||
tagLabelImage=Imagem
|
||||
tagLabelAction=Ação
|
||||
tagLabelVisibility=Visibilidade
|
||||
tagCreateTag=Criar etiqueta
|
||||
tagEditCustomTagButtons=Processar botões de etiqueta
|
||||
tagAddCustomTagButton=Adicionar botão de etiqueta
|
||||
tagNotSpecified=A etiqueta não deve estar em branco.
|
||||
tagEditFilter=Processar filtro
|
||||
tagEditCustomTagButton=Processar botão de etiqueta
|
||||
tagSaveCustomTagButton=Gravar
|
||||
tagPreview=Visualização de etiqueta
|
||||
tagVisibleForPublicCheckBox=Visível para público
|
||||
tagVisibility=Visibilidade
|
||||
tagConfirmDeletionHeading=Eliminar etiqueta
|
||||
tagConfirmDeletion=Isso irá eliminar a etiqueta "{0}". Continuar?
|
||||
tagButtonConfirmDeletionHeading=Eliminar botão de etiqueta
|
||||
tagButtonConfirmDeletion=Isso irá eliminar o botão de etiqueta "{0}". Continuar?
|
||||
tagDiscardChangesHeading=Rejeitar modificações
|
||||
tagDiscardChanges=Rejeitar as modificações?
|
||||
tagFilterNotSavable=Não foi possível gravar as configurações do filtro no servidor.
|
||||
tagCurrentFilter=Filtro atual:
|
||||
tagCreateFilterNotLoggedIn=Você não tem o logon efetuado, por isso os filtros não serão gravados.
|
||||
tagCreateFilterHint=Criar um filtro definido para filtrar a lista de etiquetas.
|
||||
tagButtonNotSavable=Não foi possível gravar o botão de etiqueta no servidor.
|
||||
tagNotEditable=Você não pode processar esta etiqueta.
|
||||
tagPublicModificationPermissionMissing=Você não pode criar etiquetas públicas, mas pode criar etiquetas privadas.
|
||||
tagNotFound=Não foi possível encontrar etiqueta.
|
||||
tagInvalidURL=Parâmetro de URL inválido
|
||||
tagSharedDialog=Etiqueta compartilhada
|
||||
tagSharedURL=Você pode compartilhar esta etiqueta, transferindo o seguinte URL:
|
||||
tagCopyToClipBoard=Copiar para o clipboard
|
||||
tagBrowseAndUploadImage=Navegar e carregar
|
||||
tagCopiedLinkSuccessfully=Link copiado com êxito para o clipboard.
|
||||
tagCopiedLinkNotSuccessfully=Seu browser não suporta a cópia para o clipboard. Copie o link manualmente.
|
||||
username=Nome do usuário
|
||||
confirm=Confirmar
|
||||
cancel=Cancelar
|
||||
close=Fechar
|
||||
boatClasses=Classes de barcos
|
||||
sailorProfiles=Perfis de velejadores
|
||||
unknownSailorProfile=Não foi possível carregar perfil {0}, você tem o logon efetuado com o usuário correto?
|
||||
profileName=Nome do perfil
|
||||
addSailorProfileMessage=Adicionar um novo perfil de velejador
|
||||
badges=Emblemas
|
||||
newSailorProfileName=Novo perfil de velejador
|
||||
maxSpeedTitle=Velocidade máxima
|
||||
maxStartLineSpeed=Velocidade máxima ao passar a linha de partida
|
||||
shortestDistanceToStartline=Distância mínima para linha de partida no início da corrida
|
||||
averageDistanceToStartLine=Distância média para linha de partida no início da corrida
|
||||
metersValue={0,number,#0.0} m
|
||||
showInRaceboard=Exibir no painel de corridas
|
||||
showInDataMining=Exibir no data mining
|
||||
couldNotDetermineStatistic=Não foi possível calcular estatística
|
||||
noEventsFoundForCompetitors=Não existem eventos disponíveis para os competidores selecionados.
|
||||
noStatisticsFoundForCompetitors=Não existem estatísticas disponíveis para os competidores selecionados.
|
||||
pleaseSelectCompetitorFirst=Selecione primeiro um competidor.
|
||||
sailorProfileRemoveMessage=Remover este perfil de velejador?
|
||||
moreLoginInformationSectionSailorProfilesDescription=Após o logon, você pode agora encontrar uma nova área no seu perfil de usuário, chamada Perfis de velejadores. Você pode adicionar alguns competidores a um perfil de velejador e obter mais informações sobre esses competidores. Em um perfil de velejador, você pode ver todos os eventos dos quais seus competidores favoritos participaram e comparar seus posicionamentos. Adicionalmente, você obtém uma síntese das estatísticas mais importantes, como a velocidade máxima ou a distância média para a linha de partida com links diretos para o mapa da corrida de modo a ver o momento exato em que, por exemplo, o competidor mais rápido atingiu seu recorde. Para estatísticas coletivas, como a distância média para a linha de partida no início da corrida, você pode clicar na seta e é encaminhado para o data mining onde pode pesquisar os valores médios.
|
||||
moreLoginInformationSectionSailorProfilesHeading=Perfis de velejadores
|
||||
confirmDeletion=Confirmar eliminação
|
||||
+89
@@ -2096,3 +2096,92 @@ resizeSuccessfull=Изменение размера завершено
|
||||
resizeUnsuccessfull=Изменение размера невозможно
|
||||
setUpStorageService=Сначала настройте сервис памяти файлов
|
||||
automaticResizeNeedsStorageService=Для автоматического изменения размера требуется работающий сервис памяти файлов (FileStorageService).
|
||||
qrCodeTitle={0}, добро пожаловать в {1}!
|
||||
qrCodeSubtitle={0} - {1}
|
||||
qrCodeInfoMessage=Отсканируйте этот QR-код с помощью смартфона, чтобы участвовать в событии!
|
||||
qrCodeErrorMessage=Приносим извинения, эта функция сейчас недоступна!
|
||||
qrCodeTitleBouy=Добро пожаловать в качестве лоцмейстерского судна на {0}
|
||||
tag=Тег
|
||||
tagButtons=Кнопки тегирования
|
||||
tagPanel=Теги
|
||||
tagCreated=({1}, создал {0})
|
||||
tagNoTagsFound=Теги не найдены!
|
||||
tagAddTag=Добавить тег
|
||||
tagEditTag=Редактировать тег
|
||||
tagDeleteTag=Удалить тег
|
||||
tagShareTag=Поделиться тегом
|
||||
tagAddTags=Добавить теги
|
||||
tagSavedSuccessfully=Тег сохранен
|
||||
tagNotSaved=Не удалось сохранить тег.
|
||||
tagNotSavedReason=Не удалось сохранить тег. Причина: {0}
|
||||
tagAlreadyExists=Тег уже существует
|
||||
tagNotLoaded=Не удалось загрузить теги.
|
||||
tagNotLoggedIn=Выполните вход, чтобы добавить новые теги.
|
||||
tagNotRemoved=Не удалось удалить тег.
|
||||
tagRemovedSuccessfully=Тег удален
|
||||
tagFilterExplanation=После применения фильтра будут показаны все теги, соответствующие следующим критериям. Фильтры чувствительны к прописным/строчным буквам!
|
||||
tagSelectedTags=Выбранные теги
|
||||
tagsFilter=Фильтр тегов
|
||||
tagSearchTags=Поиск
|
||||
tagLabelTag=Тег
|
||||
tagLabelComment=Комментарий
|
||||
tagLabelImage=Изображение
|
||||
tagLabelAction=Действие
|
||||
tagLabelVisibility=Видимость
|
||||
tagCreateTag=Создать тег
|
||||
tagEditCustomTagButtons=Кнопки редактирования тега
|
||||
tagAddCustomTagButton=Кнопка добавления тега
|
||||
tagNotSpecified=Тег не должен быть пустым!
|
||||
tagEditFilter=Изменить фильтр
|
||||
tagEditCustomTagButton=Кнопка редактирования тега
|
||||
tagSaveCustomTagButton=Сохранить
|
||||
tagPreview=Предпросмотр тега:
|
||||
tagVisibleForPublicCheckBox=Видимый для всех
|
||||
tagVisibility=Видимость
|
||||
tagConfirmDeletionHeading=Удалить тег
|
||||
tagConfirmDeletion=При этом будет удален тег "{0}". Продолжить?
|
||||
tagButtonConfirmDeletionHeading=Кнопка удаления тега
|
||||
tagButtonConfirmDeletion=При этом будет удалена кнопка тега "{0}". Продолжить?
|
||||
tagDiscardChangesHeading=Отменить изменения
|
||||
tagDiscardChanges=Действительно отменить изменения?
|
||||
tagFilterNotSavable=Не удалось сохранить на сервере настройки фильтра.
|
||||
tagCurrentFilter=Текущий фильтр:
|
||||
tagCreateFilterNotLoggedIn=Вы не вошли в систему, поэтому фильтры не будут сохранены.
|
||||
tagCreateFilterHint=Создание набора фильтров для фильтрации списка тегов.
|
||||
tagButtonNotSavable=Не удалось сохранить на сервере кнопку тега.
|
||||
tagNotEditable=Вы не можете редактировать этот тег!
|
||||
tagPublicModificationPermissionMissing=У вас нет разрешения создавать общедоступные теги, но вы можете создавать личные теги.
|
||||
tagNotFound=Не удалось найти тег.
|
||||
tagInvalidURL=Недействительный параметр URL
|
||||
tagSharedDialog=Общий тег
|
||||
tagSharedURL=Вы можете поделиться этим тегом, отправив следующий URL-адрес:
|
||||
tagCopyToClipBoard=Копировать в буфер обмена
|
||||
tagBrowseAndUploadImage=Найти и загрузить
|
||||
tagCopiedLinkSuccessfully=Ссылка скопирована в буфер обмена.
|
||||
tagCopiedLinkNotSuccessfully=Ваш браузер не поддерживает копирование в буфер обмена, скопируйте ссылку вручную.
|
||||
username=Имя пользователя
|
||||
confirm=Подтвердить
|
||||
cancel=Отменить
|
||||
close=Закрыть
|
||||
boatClasses=Классы лодок
|
||||
sailorProfiles=Профили участников гонки
|
||||
unknownSailorProfile=Не удалось загрузить профиль {0}, вы выполнили вход, используя правильного пользователя?
|
||||
profileName=Имя профиля
|
||||
addSailorProfileMessage=Добавить новый профиль участника
|
||||
badges=Значки
|
||||
newSailorProfileName=Новый профиль участника
|
||||
maxSpeedTitle=Максимальная скорость
|
||||
maxStartLineSpeed=Максимальная скорость при пересечении линии старта
|
||||
shortestDistanceToStartline=Минимальное расстояние до линии старта на старте гонки
|
||||
averageDistanceToStartLine=Среднее расстояние до линии старта на старте гонки
|
||||
metersValue={0,number,#0.0} м
|
||||
showInRaceboard=Показать в таблице гонки
|
||||
showInDataMining=Показать в добыче данных
|
||||
couldNotDetermineStatistic=Не удалось рассчитать статистику
|
||||
noEventsFoundForCompetitors=Нет событий, доступных для выбранных участников.
|
||||
noStatisticsFoundForCompetitors=Нет статистики, доступной для выбранных участников.
|
||||
pleaseSelectCompetitorFirst=Сначала выберите участника.
|
||||
sailorProfileRemoveMessage=Действительно удалить этот профиль участника?
|
||||
moreLoginInformationSectionSailorProfilesDescription=После входа в приложение в области профиля вашего пользователя вы увидите область, называемую "Профили участников". В этот профиль можно добавить участников и узнать о них подробнее. В профиле участника можно просмотреть все события, в которых участвовали ваши выбранные участники, и сравнить их результаты. Также здесь представлен обзор важных статистик, как например максимальная скорость или среднее расстояние до линии старта, с прямыми ссылками на карту гонки, где можно узнать точное время, например рекорд самого быстрого участника. Для получения агрегированной статистики, например среднего расстояния до линии старта на старте гонки, можно щелкнуть значок стрелки, будет выполнен переход в добычу данных, где можно просмотреть средние значения.
|
||||
moreLoginInformationSectionSailorProfilesHeading=Профили участников гонки
|
||||
confirmDeletion=Подтвердить удаление
|
||||
+89
@@ -2096,3 +2096,92 @@ resizeSuccessfull=重新调整大小已成功完成
|
||||
resizeUnsuccessfull=无法重新调整大小
|
||||
setUpStorageService=请先设置文件存储服务
|
||||
automaticResizeNeedsStorageService=自动重新调整大小需要正常运行的 FileStorageService。
|
||||
qrCodeTitle=欢迎{0}使用{1}!
|
||||
qrCodeSubtitle={0} - {1}
|
||||
qrCodeInfoMessage=请用智能手机扫描此二维码,参与此活动!
|
||||
qrCodeErrorMessage=抱歉,此功能目前无法使用!
|
||||
qrCodeTitleBouy=欢迎{0}的浮标供应船
|
||||
tag=标记
|
||||
tagButtons=标记按钮
|
||||
tagPanel=标记
|
||||
tagCreated=({1},创建人:{0})
|
||||
tagNoTagsFound=未找到标记!
|
||||
tagAddTag=添加标记
|
||||
tagEditTag=编辑标记
|
||||
tagDeleteTag=删除标记
|
||||
tagShareTag=共享标记
|
||||
tagAddTags=添加标记
|
||||
tagSavedSuccessfully=已成功保存标记
|
||||
tagNotSaved=无法保存标记!
|
||||
tagNotSavedReason=无法保存标记!原因:{0}
|
||||
tagAlreadyExists=标记已存在
|
||||
tagNotLoaded=无法加载标记!
|
||||
tagNotLoggedIn=请登录以添加新标记!
|
||||
tagNotRemoved=无法移除标记!
|
||||
tagRemovedSuccessfully=已成功移除标记
|
||||
tagFilterExplanation=筛选器将显示符合以下条件的所有标记。筛选器区分大小写!
|
||||
tagSelectedTags=已选标记
|
||||
tagsFilter=标记筛选器
|
||||
tagSearchTags=搜索
|
||||
tagLabelTag=标记
|
||||
tagLabelComment=评论
|
||||
tagLabelImage=图像
|
||||
tagLabelAction=操作
|
||||
tagLabelVisibility=可见性
|
||||
tagCreateTag=创建标记
|
||||
tagEditCustomTagButtons=创建标记按钮
|
||||
tagAddCustomTagButton=添加标记按钮
|
||||
tagNotSpecified=标记不得为空!
|
||||
tagEditFilter=编辑筛选器
|
||||
tagEditCustomTagButton=编辑标记按钮
|
||||
tagSaveCustomTagButton=保存
|
||||
tagPreview=标记预览:
|
||||
tagVisibleForPublicCheckBox=对公众可见
|
||||
tagVisibility=可见性
|
||||
tagConfirmDeletionHeading=删除标记
|
||||
tagConfirmDeletion=将删除标记 "{0}"。是否确定继续?
|
||||
tagButtonConfirmDeletionHeading=删除标记按钮
|
||||
tagButtonConfirmDeletion=将删除标记按钮 "{0}"。是否确定继续?
|
||||
tagDiscardChangesHeading=放弃更改
|
||||
tagDiscardChanges=是否确定要放弃您的更改?
|
||||
tagFilterNotSavable=无法在服务器中保存筛选器设置!
|
||||
tagCurrentFilter=当前筛选器:
|
||||
tagCreateFilterNotLoggedIn=您尚未登录,因此无法保存筛选器!
|
||||
tagCreateFilterHint=创建筛选器集,筛选标记清单。
|
||||
tagButtonNotSavable=无法在服务器中保存标记按钮!
|
||||
tagNotEditable=不能编辑此标记!
|
||||
tagPublicModificationPermissionMissing=不允许创建公共标记,但是允许创建个人标记。
|
||||
tagNotFound=无法找到标记!
|
||||
tagInvalidURL=URL 参数无效
|
||||
tagSharedDialog=已共享标记
|
||||
tagSharedURL=您可以通过传递以下 URL 来共享此标记:
|
||||
tagCopyToClipBoard=复制到剪贴板
|
||||
tagBrowseAndUploadImage=浏览并上传
|
||||
tagCopiedLinkSuccessfully=已将链接成功复制到剪贴板!
|
||||
tagCopiedLinkNotSuccessfully=您的浏览器不支持复制到剪贴板,请手动复制链接!
|
||||
username=用户名
|
||||
confirm=确认
|
||||
cancel=取消
|
||||
close=关闭
|
||||
boatClasses=船只级别
|
||||
sailorProfiles=水手资料
|
||||
unknownSailorProfile=无法加载资料{0},您是否以正确的用户登录?
|
||||
profileName=资料名称
|
||||
addSailorProfileMessage=添加新水手资料
|
||||
badges=徽章
|
||||
newSailorProfileName=新水手资料
|
||||
maxSpeedTitle=最大速度
|
||||
maxStartLineSpeed=越过起航线时的最大速度
|
||||
shortestDistanceToStartline=比赛轮次开始时与起航线的最小距离
|
||||
averageDistanceToStartLine=比赛轮次开始时与起航线的平均距离
|
||||
metersValue={0,number,#0.0} m
|
||||
showInRaceboard=在比赛板中显示
|
||||
showInDataMining=在数据挖掘中显示
|
||||
couldNotDetermineStatistic=无法计算统计
|
||||
noEventsFoundForCompetitors=所选参赛队没有可用的活动。
|
||||
noStatisticsFoundForCompetitors=所选参赛队没有可用的统计。
|
||||
pleaseSelectCompetitorFirst=请先选择参赛队。
|
||||
sailorProfileRemoveMessage=是否确定要移除此水手资料?
|
||||
moreLoginInformationSectionSailorProfilesDescription=登录后,您现在可以在用户资料下找到一个新区域,即“水手资料”。您可以将一些参赛队添加到此“水手资料”,并获得有关这些参赛队的更多全面信息。在“水手资料”中,您可以看到收藏的参赛队参与的所有活动,并对其布置进行相互比较。此外,您可以获得最重要统计的总览,例如最大速度或与起航线的平均距离及到比赛轮次地图的直接链接,以查看确切的时间点,如最快的参赛队达到其记录。对于比赛轮次开始时与起航线的平均距离等汇总统计,您可以点击箭头,转到数据挖掘,您可以在其中细分平均值。
|
||||
moreLoginInformationSectionSailorProfilesHeading=水手资料
|
||||
confirmDeletion=确认删除
|
||||
+30
-23
@@ -7,6 +7,7 @@ import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import com.google.gwt.core.shared.GWT;
|
||||
import com.google.gwt.dom.client.BrowserEvents;
|
||||
import com.google.gwt.user.cellview.client.CellList;
|
||||
import com.google.gwt.user.cellview.client.HasKeyboardSelectionPolicy.KeyboardSelectionPolicy;
|
||||
import com.google.gwt.user.client.rpc.AsyncCallback;
|
||||
@@ -16,6 +17,8 @@ import com.google.gwt.user.client.ui.HeaderPanel;
|
||||
import com.google.gwt.user.client.ui.Label;
|
||||
import com.google.gwt.user.client.ui.Panel;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.google.gwt.view.client.CellPreviewEvent;
|
||||
import com.google.gwt.view.client.CellPreviewEvent.Handler;
|
||||
import com.google.gwt.view.client.NoSelectionModel;
|
||||
import com.google.gwt.view.client.SingleSelectionModel;
|
||||
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
|
||||
@@ -116,8 +119,8 @@ public class TaggingPanel extends ComponentWithoutSettings
|
||||
* 3) another user adds/deletes/changes any tag between the latest received tag and the current timer position<br/>
|
||||
* consecutively, the timer would jump to this new tag as the selection would change automatically as the latest tag
|
||||
* changed. This selection change would also trigger the timer to jump to the latest tag, which is not intended in
|
||||
* this case. Therefor any received changes on any tags will set this boolen to true which will ignore the time jump
|
||||
* at the selection change event and prevent this wrong behaviour.
|
||||
* this case. Therefor any received changes on any tags will set this boolean to true which will ignore the time jump
|
||||
* at the selection change event and prevent this wrong behavior.
|
||||
*
|
||||
* @see #raceTimesInfosReceived(Map, long, Date, long)
|
||||
*/
|
||||
@@ -181,26 +184,31 @@ public class TaggingPanel extends ComponentWithoutSettings
|
||||
tagCellList.setEmptyListWidget(new Label(stringMessages.tagNoTagsFound()));
|
||||
tagCellList.setKeyboardSelectionPolicy(KeyboardSelectionPolicy.DISABLED);
|
||||
tagCellList.setSelectionModel(tagSelectionModel);
|
||||
tagSelectionModel.addSelectionChangeHandler(event -> {
|
||||
// set time slider to corresponding position
|
||||
TagDTO selectedTag = tagSelectionModel.getSelectedObject();
|
||||
if (selectedTag != null) {
|
||||
/**
|
||||
* Do not set time of timer when {@link #preventTimeJumpAtSelectionChangeForOnce} is set to
|
||||
* <code>true</code>. In this case set {@link #preventTimeJumpAtSelectionChangeForOnce} to
|
||||
* <code>false</code> as selection change is ignored once.
|
||||
*
|
||||
* @see #preventTimeJumpAtSelectionChangeForOnce
|
||||
*/
|
||||
if (preventTimeJumpAtSelectionChangeForOnce) {
|
||||
preventTimeJumpAtSelectionChangeForOnce = false;
|
||||
} else {
|
||||
// remove time change listener when manual selecting tag cells as this could end in an infinite loop
|
||||
// of timer change -> automatic selection change -> timer change -> ...
|
||||
timer.removeTimeListener(this);
|
||||
timer.setTime(selectedTag.getRaceTimepoint().asMillis());
|
||||
// adding time change listener again
|
||||
timer.addTimeListener(this);
|
||||
tagCellList.addCellPreviewHandler(new Handler<TagDTO>() {
|
||||
@Override
|
||||
public void onCellPreview(CellPreviewEvent<TagDTO> event) {
|
||||
if (BrowserEvents.CLICK.equals(event.getNativeEvent().getType())) {
|
||||
// set time slider to corresponding position
|
||||
TagDTO selectedTag = event.getValue();
|
||||
if (selectedTag != null) {
|
||||
/**
|
||||
* Do not set time of timer when {@link #preventTimeJumpAtSelectionChangeForOnce} is set to
|
||||
* <code>true</code>. In this case set {@link #preventTimeJumpAtSelectionChangeForOnce} to
|
||||
* <code>false</code> as selection change is ignored once.
|
||||
*
|
||||
* @see #preventTimeJumpAtSelectionChangeForOnce
|
||||
*/
|
||||
if (preventTimeJumpAtSelectionChangeForOnce) {
|
||||
preventTimeJumpAtSelectionChangeForOnce = false;
|
||||
} else {
|
||||
// remove time change listener when manually selecting tag cells as this could end in an infinite loop
|
||||
// of timer change -> automatic selection change -> timer change -> ...
|
||||
timer.removeTimeListener(TaggingPanel.this);
|
||||
timer.setTime(selectedTag.getRaceTimepoint().asMillis());
|
||||
// adding time change listener again
|
||||
timer.addTimeListener(TaggingPanel.this);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -210,7 +218,6 @@ public class TaggingPanel extends ComponentWithoutSettings
|
||||
createTagsButton.addClickHandler(event -> {
|
||||
setCurrentState(State.CREATE_TAG);
|
||||
});
|
||||
|
||||
taggingPanel.setContentWidget(contentPanel);
|
||||
updateContent();
|
||||
}
|
||||
|
||||
+1
@@ -87,6 +87,7 @@
|
||||
padding: 5px 5px 0;
|
||||
border: 1px solid lightgrey;
|
||||
border-radius: 3px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.tagCellHeading {
|
||||
|
||||
+1
-5
@@ -54,7 +54,6 @@ import com.sap.sse.datamining.shared.impl.dto.ReducedDimensionsDTO;
|
||||
import com.sap.sse.datamining.ui.client.DataMiningService;
|
||||
import com.sap.sse.i18n.ResourceBundleStringMessages;
|
||||
import com.sap.sse.security.SecurityService;
|
||||
import com.sap.sse.security.UserStore;
|
||||
import com.sap.sse.util.ServiceTrackerFactory;
|
||||
|
||||
public class DataMiningServiceImpl extends RemoteServiceServlet implements DataMiningService {
|
||||
@@ -64,7 +63,6 @@ public class DataMiningServiceImpl extends RemoteServiceServlet implements DataM
|
||||
|
||||
private final ServiceTracker<DataMiningServer, DataMiningServer> dataMiningServerTracker;
|
||||
private final ServiceTracker<SecurityService, SecurityService> securityServiceTracker;
|
||||
private final ServiceTracker<UserStore, UserStore> userStoreServiceTracker;
|
||||
|
||||
private final StoredDataMiningQueryPersister storedDataMiningQueryPersistor;
|
||||
|
||||
@@ -74,10 +72,8 @@ public class DataMiningServiceImpl extends RemoteServiceServlet implements DataM
|
||||
context = Activator.getDefault();
|
||||
dataMiningServerTracker = createAndOpenDataMiningServerTracker(context);
|
||||
securityServiceTracker = ServiceTrackerFactory.createAndOpen(context, SecurityService.class);
|
||||
userStoreServiceTracker = ServiceTrackerFactory.createAndOpen(context, UserStore.class);
|
||||
|
||||
storedDataMiningQueryPersistor = new StoredDataMiningQueryPersisterImpl(securityServiceTracker.getService(),
|
||||
userStoreServiceTracker.getService());
|
||||
storedDataMiningQueryPersistor = new StoredDataMiningQueryPersisterImpl(securityServiceTracker.getService());
|
||||
dtoFactory = new DataMiningDTOFactory();
|
||||
}
|
||||
|
||||
|
||||
+3
-8
@@ -18,18 +18,14 @@ import com.sap.sse.datamining.shared.impl.dto.StoredDataMiningQueryDTOImpl;
|
||||
import com.sap.sse.gwt.dispatch.shared.exceptions.ServerDispatchException;
|
||||
import com.sap.sse.security.SecurityService;
|
||||
import com.sap.sse.security.User;
|
||||
import com.sap.sse.security.UserStore;
|
||||
|
||||
/** Implementation of {@link StoredDataMiningQueryPersister}. */
|
||||
public class StoredDataMiningQueryPersisterImpl implements StoredDataMiningQueryPersister {
|
||||
|
||||
private final SecurityService securityService;
|
||||
private final UserStore userStore;
|
||||
|
||||
public StoredDataMiningQueryPersisterImpl(SecurityService securityService, UserStore userStore) {
|
||||
public StoredDataMiningQueryPersisterImpl(SecurityService securityService) {
|
||||
this.securityService = securityService;
|
||||
this.userStore = userStore;
|
||||
|
||||
}
|
||||
|
||||
/** @return all {@link StoredDataMiningQueryDTO}s the user has stored in his user store. */
|
||||
@@ -101,7 +97,7 @@ public class StoredDataMiningQueryPersisterImpl implements StoredDataMiningQuery
|
||||
User currentUser = securityService.getCurrentUser();
|
||||
if (currentUser != null) {
|
||||
try {
|
||||
userStore.setPreferenceObject(currentUser.getName(), preferenceKey, preference);
|
||||
securityService.setPreferenceObject(currentUser.getName(), preferenceKey, preference);
|
||||
} catch (AuthorizationException e) {
|
||||
throw new ServerDispatchException(e);
|
||||
}
|
||||
@@ -124,9 +120,8 @@ public class StoredDataMiningQueryPersisterImpl implements StoredDataMiningQuery
|
||||
private <T> T getPreferenceForCurrentUser(String preferenceKey) {
|
||||
User currentUser = securityService.getCurrentUser();
|
||||
if (currentUser != null) {
|
||||
return userStore.getPreferenceObject(currentUser.getName(), preferenceKey);
|
||||
return securityService.getPreferenceObject(currentUser.getName(), preferenceKey);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
+7
@@ -3,3 +3,10 @@ slicingRaceColumnAlreadyUsedThe=El nombre de la columna Carrera ya se está util
|
||||
slicingTimeRangeOutOfBounds=El intervalo de tiempo para la división no forma parte de la carrera
|
||||
slicingCouldNotObtainRace=No se ha podido obtener la carrera dividida
|
||||
slicingError=Error al dividir la carrera
|
||||
unknownError=Error desconocido
|
||||
missingAuthorization=No ha iniciado la sesión o no dispone del permiso requerido
|
||||
securityServiceNotFound=No existe servicio de seguridad
|
||||
raceLogNotFound=No existe el registro de carrera
|
||||
tagNotRevokable=Esta etiqueta no se puede revocar
|
||||
tagAlreadyExists=Ya existe la etiqueta, no se permiten etiquetas duplicadas
|
||||
invalidParameters=Uno de los parámetros indicados no tiene un valor válido
|
||||
+7
@@ -3,3 +3,10 @@ slicingRaceColumnAlreadyUsedThe=Le nom de colonne de la course est déjà utilis
|
||||
slicingTimeRangeOutOfBounds=L''intervalle de temps à segmenter n''est pas compris dans la course.
|
||||
slicingCouldNotObtainRace=Impossible d''accéder à la course segmentée
|
||||
slicingError=Erreur lors de la segmentation de la course.
|
||||
unknownError=Erreur inconnue
|
||||
missingAuthorization=Vous n''êtes pas connecté(e) ou vous ne disposez pas des autorisations requises.
|
||||
securityServiceNotFound=Service de sécurité introuvable
|
||||
raceLogNotFound=Journal de la course introuvable
|
||||
tagNotRevokable=Cette balise ne peut pas être annulée.
|
||||
tagAlreadyExists=La balise existe déjà. Les balises en double ne sont pas autorisées.
|
||||
invalidParameters=L''un des paramètres donnés a une valeur non valide.
|
||||
+7
@@ -3,3 +3,10 @@ slicingRaceColumnAlreadyUsedThe=指定したレガッタでレース列名がす
|
||||
slicingTimeRangeOutOfBounds=スライスしようとしている TimeRange はレースの一部ではありません
|
||||
slicingCouldNotObtainRace=スライスされたレースを取得できませんでした
|
||||
slicingError=レースのスライスでエラーが発生しました
|
||||
unknownError=不明なエラー
|
||||
missingAuthorization=ログインしていないか、必要な権限がありません
|
||||
securityServiceNotFound=セキュリティサービスが見つかりません
|
||||
raceLogNotFound=レースログが見つかりません
|
||||
tagNotRevokable=このタグは取消ができません
|
||||
tagAlreadyExists=タグがすでに存在しています。タグの重複は許されていません
|
||||
invalidParameters=指定されたパラメータの 1 つに有効な値がありません
|
||||
+7
@@ -3,3 +3,10 @@ slicingRaceColumnAlreadyUsedThe=O nome da coluna da corrida já é utilizado na
|
||||
slicingTimeRangeOutOfBounds=O intervalo de tempo para a divisão não faz parte da corrida
|
||||
slicingCouldNotObtainRace=Não foi possível obter corrida dividida
|
||||
slicingError=Erro ao dividir corrida
|
||||
unknownError=Erro desconhecido
|
||||
missingAuthorization=Você não tem o logon efetuado ou não tem a autorização necessária.
|
||||
securityServiceNotFound=Serviço de segurança não encontrado.
|
||||
raceLogNotFound=RaceLog não encontrado.
|
||||
tagNotRevokable=Esta etiqueta não pode ser anulada.
|
||||
tagAlreadyExists=A etiqueta já existe, não são permitidas etiquetas duplicadas.
|
||||
invalidParameters=Um dos parâmetros indicados não tem um valor válido.
|
||||
+7
@@ -3,3 +3,10 @@ slicingRaceColumnAlreadyUsedThe=Имя столбца гонки уже испо
|
||||
slicingTimeRangeOutOfBounds=Диапазон времени для среза не является частью гонки
|
||||
slicingCouldNotObtainRace=Не удалось получить данные гонки, по которой делаются срезы
|
||||
slicingError=Ошибка среза гонки
|
||||
unknownError=Неизвестная ошибка
|
||||
missingAuthorization=Вы не зарегистрированы, или у вас нет требуемого разрешения!
|
||||
securityServiceNotFound=Сервис безопасности не найден!
|
||||
raceLogNotFound=Журнал гонки не найден!
|
||||
tagNotRevokable=Этот тег невозможно отозвать!
|
||||
tagAlreadyExists=Тег уже существует, дубликаты тегов не разрешены!
|
||||
invalidParameters=Один из указанных параметров не имеет действительного значения!
|
||||
+7
@@ -3,3 +3,10 @@ slicingRaceColumnAlreadyUsedThe=比赛轮次列名称已在给定比赛中使用
|
||||
slicingTimeRangeOutOfBounds=用于划分的时间范围不是比赛轮次的一部分
|
||||
slicingCouldNotObtainRace=无法获取划分的比赛轮次
|
||||
slicingError=划分比赛轮次出错
|
||||
unknownError=未知错误
|
||||
missingAuthorization=您尚未登录或缺少所需的权限!
|
||||
securityServiceNotFound=未找到安全服务!
|
||||
raceLogNotFound=未找到比赛轮次日志!
|
||||
tagNotRevokable=无法撤销此标记!
|
||||
tagAlreadyExists=标记已存在,不允许重复的标记!
|
||||
invalidParameters=其中一个给定参数没有有效值!
|
||||
+4
@@ -56,6 +56,10 @@ public class FileUploadServlet extends AbstractFileUploadServlet {
|
||||
fileExtension = ".jpg";
|
||||
} else if (fileType.equals("image/png")) {
|
||||
fileExtension = ".png";
|
||||
} else if (fileType.equals("image/gif")) {
|
||||
fileExtension = ".gif";
|
||||
} else if (fileType.startsWith("video/")) {
|
||||
fileExtension = fileType.substring(fileType.indexOf('/')+1);
|
||||
} else {
|
||||
int lastDot = fileName.lastIndexOf(".");
|
||||
if (lastDot > 0) {
|
||||
|
||||
+7
-7
@@ -15,7 +15,7 @@ import org.json.simple.parser.ParseException;
|
||||
|
||||
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
|
||||
import com.sap.sailing.server.gateway.jaxrs.AbstractSailingServerResource;
|
||||
import com.sap.sse.security.UserStore;
|
||||
import com.sap.sse.security.SecurityService;
|
||||
|
||||
@Path("/v1/preferences")
|
||||
public class PreferencesResource extends AbstractSailingServerResource {
|
||||
@@ -27,8 +27,8 @@ public class PreferencesResource extends AbstractSailingServerResource {
|
||||
Response response = null;
|
||||
if (SecurityUtils.getSubject().isAuthenticated()) {
|
||||
String username = SecurityUtils.getSubject().getPrincipal().toString();
|
||||
UserStore userStore = getService(UserStore.class);
|
||||
String settings = userStore.getPreference(username, settingsKey);
|
||||
SecurityService securityService = getService(SecurityService.class);
|
||||
String settings = securityService.getPreference(username, settingsKey);
|
||||
if (settings == null) {
|
||||
response = Response.noContent().build();
|
||||
} else {
|
||||
@@ -48,8 +48,8 @@ public class PreferencesResource extends AbstractSailingServerResource {
|
||||
Response response = null;
|
||||
if (SecurityUtils.getSubject().isAuthenticated()) {
|
||||
String username = SecurityUtils.getSubject().getPrincipal().toString();
|
||||
UserStore userStore = getService(UserStore.class);
|
||||
userStore.setPreference(username, settingsKey, json);
|
||||
SecurityService securityService = getService(SecurityService.class);
|
||||
securityService.setPreference(username, settingsKey, json);
|
||||
response = Response.ok().build();
|
||||
} else {
|
||||
response = Response.status(401).build();
|
||||
@@ -65,8 +65,8 @@ public class PreferencesResource extends AbstractSailingServerResource {
|
||||
Response response = null;
|
||||
if (SecurityUtils.getSubject().isAuthenticated()) {
|
||||
String username = SecurityUtils.getSubject().getPrincipal().toString();
|
||||
UserStore userStore = getService(UserStore.class);
|
||||
userStore.unsetPreference(username, settingsKey);
|
||||
SecurityService securityService = getService(SecurityService.class);
|
||||
securityService.unsetPreference(username, settingsKey);
|
||||
response = Response.ok().build();
|
||||
} else {
|
||||
response = Response.status(401).build();
|
||||
|
||||
@@ -15,11 +15,6 @@ import com.sap.sse.common.TypeBasedServiceFinder;
|
||||
* servers. Implementations of this service are announced via the OSGi service registry. They should provide their name
|
||||
* as the OSGi property {@link TypeBasedServiceFinder#TYPE type};
|
||||
*
|
||||
* TODO The storage service to use should be configured via the AdminConsole. Upon auto-discovering the available
|
||||
* services, the AdminConsole should allow to edit properties for each service (e.g. access credentials for AWS S3). We
|
||||
* probably need a generic property discovery mechanism (key-value based?), and to survive server restarts these
|
||||
* properties should be saved to the MongoDB.
|
||||
*
|
||||
* @author Fredrik Teschke
|
||||
*
|
||||
*/
|
||||
|
||||
@@ -158,6 +158,12 @@ public interface SecurityService extends ReplicableWithObjectInputStream<Replica
|
||||
*/
|
||||
String getPreference(String username, String key);
|
||||
|
||||
/**
|
||||
* Gets a preference object. Always returns null if there is no converter associated with the given key -> see
|
||||
* {@link #registerPreferenceConverter(String, PreferenceConverter)}.
|
||||
*/
|
||||
<T> T getPreferenceObject(String username, String key);
|
||||
|
||||
/**
|
||||
* @return all preferences of the given user
|
||||
*/
|
||||
@@ -195,5 +201,4 @@ public interface SecurityService extends ReplicableWithObjectInputStream<Replica
|
||||
void removeAccessToken(String username);
|
||||
|
||||
User loginByAccessToken(String accessToken);
|
||||
|
||||
}
|
||||
@@ -1096,4 +1096,10 @@ public class SecurityServiceImpl implements ReplicableSecurityService, ClearStat
|
||||
((ReplicatingCacheManager) cm).clear();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> T getPreferenceObject(String username, String key) {
|
||||
ensureThatUserInQuestionIsLoggedInOrCurrentUserIsAdmin(username);
|
||||
return store.getPreferenceObject(username, key);
|
||||
}
|
||||
}
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
package com.sap.sse.shared.android.test;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
import java.util.Comparator;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import com.sap.sse.util.impl.ArrayListNavigableSet;
|
||||
|
||||
public class ArrayListNavigableSetTest {
|
||||
@Test
|
||||
public void testEqualityOfArrayListNavigableSet() {
|
||||
ArrayListNavigableSet<Integer> a = new ArrayListNavigableSet<>(Comparator.naturalOrder());
|
||||
ArrayListNavigableSet<Integer> b = new ArrayListNavigableSet<>(Comparator.naturalOrder());
|
||||
a.add(1);
|
||||
a.add(42);
|
||||
b.add(42);
|
||||
b.add(1);
|
||||
assertEquals(a, b);
|
||||
}
|
||||
}
|
||||
+2
-1
@@ -1,6 +1,7 @@
|
||||
package com.sap.sse.util.impl;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.AbstractSet;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
@@ -38,7 +39,7 @@ import com.sap.sse.common.ReverseRandomAccessList;
|
||||
*
|
||||
* @author Axel Uhl (d043530)
|
||||
*/
|
||||
public class ArrayListNavigableSet<E> implements NavigableSet<E>, Serializable {
|
||||
public class ArrayListNavigableSet<E> extends AbstractSet<E> implements NavigableSet<E>, Serializable {
|
||||
private static final long serialVersionUID = 6923963699509907975L;
|
||||
private final List<E> list;
|
||||
private final Comparator<? super E> comparator;
|
||||
|
||||
Reference in new issue
Block a user