Merge remote-tracking branch 'origin/master'

Conflicts:
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TrackedRacesListComposite.java
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties
This commit is contained in:
Axel Uhl committed 2013-01-23 11:51:38 +01:00
commit 923f633a5e
27 files changed
+2297 -2112

No files matched your search

@@ -21,10 +21,8 @@ public enum DetailType implements Serializable {
RACE_AVERAGE_SPEED_OVER_GROUND_IN_KNOTS(2, DESCENDING), RACE_GAP_TO_LEADER_IN_SECONDS(0, ASCENDING),
RACE_DISTANCE_TO_LEADER_IN_METERS(0, ASCENDING), RACE_AVERAGE_CROSS_TRACK_ERROR_IN_METERS(0, ASCENDING),
WINDWARD_DISTANCE_TO_OVERALL_LEADER(0, ASCENDING),
HEAD_UP(0, ASCENDING), BEAR_AWAY(0, ASCENDING),
TACK(0, ASCENDING), JIBE(0, ASCENDING), PENALTY_CIRCLE(0, ASCENDING), AVERAGE_MANEUVER_LOSS_IN_METERS(1, ASCENDING),
AVERAGE_TACK_LOSS_IN_METERS(1, ASCENDING), AVERAGE_JIBE_LOSS_IN_METERS(1, ASCENDING),
MARK_PASSING(0, ASCENDING), CURRENT_LEG(0, ASCENDING),
AVERAGE_TACK_LOSS_IN_METERS(1, ASCENDING), AVERAGE_JIBE_LOSS_IN_METERS(1, ASCENDING), CURRENT_LEG(0, ASCENDING),
DISPLAY_LEGS(0, NONE), TIME_TRAVELED(0, ASCENDING),
TOTAL_TIME_SAILED_DOWNWIND_IN_SECONDS(1, ASCENDING),
TOTAL_TIME_SAILED_UPWIND_IN_SECONDS(1, ASCENDING),
@@ -0,0 +1,27 @@
package com.sap.sailing.gwt.ui.test;
import static org.junit.Assert.*;
import org.junit.Test;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.sap.sailing.gwt.ui.leaderboard.SafeHtmlHeaderWithTooltip;
public class SafeHtmlHeaderWithTooltipTest {
@Test
public void textCreation() {
SafeHtmlBuilder titleBuilder = new SafeHtmlBuilder().appendEscaped("Title Text");
SafeHtmlHeaderWithTooltip header = new SafeHtmlHeaderWithTooltip(titleBuilder.toSafeHtml(), "Tooltip");
assertEquals("<span title=\"Tooltip\">Title Text</ span>", header.getValue().asString());
titleBuilder = new SafeHtmlBuilder().appendEscapedLines("Title\nText");
header = new SafeHtmlHeaderWithTooltip(titleBuilder.toSafeHtml(), "Tooltip");
assertEquals("<span title=\"Tooltip\">Title<br>Text</ span>", header.getValue().asString());
titleBuilder = new SafeHtmlBuilder().appendEscaped("Title Text");
header = new SafeHtmlHeaderWithTooltip(titleBuilder.toSafeHtml(), "Tooltip with\nline break.");
assertEquals("<span title=\"Tooltip with\nline break.\">Title Text</ span>", header.getValue().asString());
}
}
@@ -0,0 +1,562 @@
package com.sap.sailing.gwt.ui.adminconsole;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import com.google.gwt.cell.client.AbstractCell;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.i18n.client.DateTimeFormat.PredefinedFormat;
import com.google.gwt.safehtml.client.SafeHtmlTemplates;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.safehtml.shared.SafeHtmlUtils;
import com.google.gwt.text.client.DateTimeFormatRenderer;
import com.google.gwt.user.cellview.client.CellTable;
import com.google.gwt.user.cellview.client.Column;
import com.google.gwt.user.cellview.client.ColumnSortEvent;
import com.google.gwt.user.cellview.client.ColumnSortList;
import com.google.gwt.user.cellview.client.TextColumn;
import com.google.gwt.user.cellview.client.ColumnSortEvent.ListHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.view.client.ListDataProvider;
import com.google.gwt.view.client.MultiSelectionModel;
import com.google.gwt.view.client.SelectionChangeEvent;
import com.google.gwt.view.client.SelectionModel;
import com.google.gwt.view.client.SingleSelectionModel;
import com.google.gwt.view.client.SelectionChangeEvent.Handler;
import com.sap.sailing.domain.common.RaceIdentifier;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.common.RegattaNameAndRaceName;
import com.sap.sailing.gwt.ui.client.ErrorReporter;
import com.sap.sailing.gwt.ui.client.RaceSelectionChangeListener;
import com.sap.sailing.gwt.ui.client.RaceSelectionProvider;
import com.sap.sailing.gwt.ui.client.RegattaDisplayer;
import com.sap.sailing.gwt.ui.client.RegattaRefresher;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.URLFactory;
import com.sap.sailing.gwt.ui.shared.RaceDTO;
import com.sap.sailing.gwt.ui.shared.RegattaDTO;
import com.sap.sailing.gwt.ui.shared.components.Component;
import com.sap.sailing.gwt.ui.shared.components.SettingsDialogComponent;
public abstract class AbstractTrackedRacesListComposite extends SimplePanel implements Component<TrackedRacesSettings>,
RegattaDisplayer, RaceSelectionChangeListener {
protected final long DEFAULT_LIVE_DELAY_IN_MILLISECONDS = 5000;
private final boolean multiSelection;
private boolean dontFireNextSelectionChangeEvent;
private final SelectionModel<RaceDTO> selectionModel;
private final CellTable<RaceDTO> raceTable;
private ListDataProvider<RaceDTO> raceList;
private Iterable<RaceDTO> allRaces;
private final VerticalPanel panel;
private DateTimeFormatRenderer dateFormatter = new DateTimeFormatRenderer(
DateTimeFormat.getFormat(PredefinedFormat.DATE_SHORT));
private DateTimeFormatRenderer timeFormatter = new DateTimeFormatRenderer(
DateTimeFormat.getFormat(PredefinedFormat.TIME_LONG));
private final Label noTrackedRacesLabel;
protected final SailingServiceAsync sailingService;
protected final ErrorReporter errorReporter;
protected final RegattaRefresher regattaRefresher;
private final RaceSelectionProvider raceSelectionProvider;
protected final StringMessages stringMessages;
private final Button btnRefresh;
private final TextBox filterRacesTextbox;
protected final TrackedRacesSettings settings;
public static class AnchorCell extends AbstractCell<SafeHtml> {
@Override
public void render(com.google.gwt.cell.client.Cell.Context context, SafeHtml safeHtml, SafeHtmlBuilder sb) {
sb.append(safeHtml);
}
}
interface AnchorTemplates extends SafeHtmlTemplates {
@SafeHtmlTemplates.Template("<a href=\"{0}\">{1}</a>")
SafeHtml cell(String url, String displayName);
}
private static AnchorTemplates ANCHORTEMPLATE = GWT.create(AnchorTemplates.class);
public AbstractTrackedRacesListComposite(final SailingServiceAsync sailingService,
final ErrorReporter errorReporter, final RegattaRefresher regattaRefresher,
RaceSelectionProvider raceSelectionProvider, final StringMessages stringMessages, boolean hasMultiSelection) {
this.sailingService = sailingService;
this.errorReporter = errorReporter;
this.regattaRefresher = regattaRefresher;
this.multiSelection = hasMultiSelection;
this.raceSelectionProvider = raceSelectionProvider;
this.stringMessages = stringMessages;
raceList = new ListDataProvider<RaceDTO>();
selectionModel = multiSelection ? new MultiSelectionModel<RaceDTO>() : new SingleSelectionModel<RaceDTO>();
settings = new TrackedRacesSettings();
settings.setDelayToLiveInSeconds(DEFAULT_LIVE_DELAY_IN_MILLISECONDS / 1000l);
panel = new VerticalPanel();
setWidget(panel);
HorizontalPanel filterPanel = new HorizontalPanel();
panel.add(filterPanel);
Label lblFilterRaces = new Label(stringMessages.filterRacesByName() + ":");
lblFilterRaces.setWordWrap(false);
filterPanel.setSpacing(5);
filterPanel.add(lblFilterRaces);
filterPanel.setCellVerticalAlignment(lblFilterRaces, HasVerticalAlignment.ALIGN_MIDDLE);
filterRacesTextbox = new TextBox();
filterRacesTextbox.addKeyUpHandler(new KeyUpHandler() {
@Override
public void onKeyUp(KeyUpEvent event) {
fillRaceListFromAvailableRacesApplyingFilter();
}
});
filterPanel.add(filterRacesTextbox);
noTrackedRacesLabel = new Label(stringMessages.noRacesYet());
noTrackedRacesLabel.setWordWrap(false);
panel.add(noTrackedRacesLabel);
AdminConsoleTableResources tableRes = GWT.create(AdminConsoleTableResources.class);
raceTable = new CellTable<RaceDTO>(/* pageSize */10000, tableRes);
raceTable.ensureDebugId("TrackedRaces");
ListHandler<RaceDTO> columnSortHandler = setupTableColumns(stringMessages);
raceTable.setWidth("300px");
raceTable.setSelectionModel(selectionModel);
raceTable.setVisible(false);
panel.add(raceTable);
raceList.addDataDisplay(raceTable);
raceTable.addColumnSortHandler(columnSortHandler);
raceTable.getSelectionModel().addSelectionChangeHandler(new Handler() {
@Override
public void onSelectionChange(SelectionChangeEvent event) {
List<RaceDTO> selectedRaces = getSelectedRaces();
makeControlsReactToSelectionChange(selectedRaces);
if (dontFireNextSelectionChangeEvent) {
dontFireNextSelectionChangeEvent = false;
} else {
List<RegattaAndRaceIdentifier> selectedRaceIdentifiers = new ArrayList<RegattaAndRaceIdentifier>();
for (RaceDTO selectedRace : selectedRaces) {
selectedRaceIdentifiers.add(selectedRace.getRaceIdentifier());
}
AbstractTrackedRacesListComposite.this.raceSelectionProvider.setSelection(selectedRaceIdentifiers,
AbstractTrackedRacesListComposite.this);
}
}
});
HorizontalPanel trackedRacesButtonPanel = new HorizontalPanel();
trackedRacesButtonPanel.setSpacing(10);
panel.add(trackedRacesButtonPanel);
btnRefresh = new Button(stringMessages.refresh());
btnRefresh.ensureDebugId("Refresh");
btnRefresh.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
regattaRefresher.fillRegattas();
}
});
trackedRacesButtonPanel.add(btnRefresh);
addControlButtons(trackedRacesButtonPanel);
}
abstract protected void makeControlsReactToSelectionChange(List<RaceDTO> selectedRaces);
abstract protected void addControlButtons(HorizontalPanel trackedRacesButtonPanel);
private ListHandler<RaceDTO> setupTableColumns(final StringMessages stringMessages) {
ListHandler<RaceDTO> columnSortHandler = new ListHandler<RaceDTO>(raceList.getList());
TextColumn<RaceDTO> regattaNameColumn = new TextColumn<RaceDTO>() {
@Override
public String getValue(RaceDTO raceDTO) {
return raceDTO.getRegattaName();
}
};
regattaNameColumn.setSortable(true);
columnSortHandler.setComparator(regattaNameColumn, new Comparator<RaceDTO>() {
@Override
public int compare(RaceDTO t1, RaceDTO t2) {
String regatta1Name = t1.getRegattaName();
String regatta2Name = t2.getRegattaName();
boolean ascending = isSortedAscending();
if (regatta1Name.equals(regatta2Name)) {
return 0;
}
int val = ascending ? regatta1Name.compareTo(regatta2Name) : -(regatta2Name.compareTo(regatta1Name));
return val;
}
private boolean isSortedAscending() {
ColumnSortList sortList = raceTable.getColumnSortList();
return sortList.size() > 0 & sortList.get(0).isAscending();
}
});
TextColumn<RaceDTO> boatClassNameColumn = new TextColumn<RaceDTO>() {
@Override
public String getValue(RaceDTO raceDTO) {
return raceDTO.boatClass == null ? "" : raceDTO.boatClass;
}
};
boatClassNameColumn.setSortable(true);
columnSortHandler.setComparator(boatClassNameColumn, new Comparator<RaceDTO>() {
@Override
public int compare(RaceDTO t1, RaceDTO t2) {
String boatClass1 = t1.boatClass;
String boatClass2 = t2.boatClass;
boolean ascending = isSortedAscending();
if (boatClass1.equals(boatClass2)) {
return 0;
}
int val = ascending ? boatClass1.compareTo(boatClass2) : -(boatClass2.compareTo(boatClass1));
return val;
}
private boolean isSortedAscending() {
ColumnSortList sortList = raceTable.getColumnSortList();
return sortList.size() > 0 & sortList.get(0).isAscending();
}
});
AnchorCell anchorCell = new AnchorCell();
Column<RaceDTO, SafeHtml> raceNameColumn = new Column<RaceDTO, SafeHtml>(anchorCell) {
@Override
public SafeHtml getValue(RaceDTO raceDTO) {
if (raceDTO.isTracked == true) {
RegattaNameAndRaceName raceIdentifier = (RegattaNameAndRaceName) raceDTO.getRaceIdentifier();
String debugParam = Window.Location.getParameter("gwt.codesvr");
String link = URLFactory.INSTANCE.encode("/gwt/RaceBoard.html?raceName="
+ raceIdentifier.getRaceName() + "&regattaName=" + raceIdentifier.getRegattaName()
+ ((debugParam != null && !debugParam.isEmpty()) ? "&gwt.codesvr=" + debugParam : ""));
return ANCHORTEMPLATE.cell(link, raceDTO.name);
} else {
return SafeHtmlUtils.fromString(raceDTO.name);
}
}
};
raceNameColumn.setSortable(true);
columnSortHandler.setComparator(raceNameColumn, new Comparator<RaceDTO>() {
@Override
public int compare(RaceDTO t1, RaceDTO t2) {
boolean ascending = isSortedAscending();
if (t1.name.equals(t2.name)) {
return 0;
}
int val = -1;
val = (t1 != null && t2 != null && ascending) ? (t1.name.compareTo(t2.name)) : -(t2.name
.compareTo(t1.name));
return val;
}
private boolean isSortedAscending() {
ColumnSortList sortList = raceTable.getColumnSortList();
return sortList.size() > 0 & sortList.get(0).isAscending();
}
});
TextColumn<RaceDTO> raceStartColumn = new TextColumn<RaceDTO>() {
@Override
public String getValue(RaceDTO raceDTO) {
if (raceDTO.startOfRace != null) {
return dateFormatter.render(raceDTO.startOfRace) + " " + timeFormatter.render(raceDTO.startOfRace);
}
return "";
}
};
raceStartColumn.setSortable(true);
columnSortHandler.setComparator(raceStartColumn, new Comparator<RaceDTO>() {
@Override
public int compare(RaceDTO t1, RaceDTO t2) {
if (t1.startOfRace != null && t2.startOfRace != null) {
boolean ascending = isSortedAscending();
int val = -1;
val = (t1.startOfRace.after(t2.startOfRace) && ascending) ? 1 : -1;
return val;
}
return 0;
}
private boolean isSortedAscending() {
ColumnSortList sortList = raceTable.getColumnSortList();
return sortList.size() > 0 & sortList.get(0).isAscending();
}
});
TextColumn<RaceDTO> raceTrackedColumn = new TextColumn<RaceDTO>() {
@Override
public String getValue(RaceDTO raceDTO) {
if (raceDTO.isTracked == true)
return stringMessages.tracked();
return "";
}
};
TextColumn<RaceDTO> hasWindDataColumn = new TextColumn<RaceDTO>() {
@Override
public String getValue(RaceDTO raceDTO) {
if (raceDTO.trackedRace != null && raceDTO.trackedRace.hasWindData == true)
return stringMessages.yes();
else
return stringMessages.no();
}
};
TextColumn<RaceDTO> hasGPSDataColumn = new TextColumn<RaceDTO>() {
@Override
public String getValue(RaceDTO raceDTO) {
if (raceDTO.trackedRace != null && raceDTO.trackedRace.hasGPSData == true) {
return stringMessages.yes();
} else {
return stringMessages.no();
}
}
};
TextColumn<RaceDTO> raceLiveDelayColumn = new TextColumn<RaceDTO>() {
@Override
public String getValue(RaceDTO raceDTO) {
if (raceDTO.isTracked && raceDTO.trackedRace != null && raceDTO.trackedRace.delayToLiveInMs > 0) {
return "" + raceDTO.trackedRace.delayToLiveInMs / 1000;
}
return "";
}
};
raceTable.addColumn(regattaNameColumn, stringMessages.regatta());
raceTable.addColumn(boatClassNameColumn, stringMessages.boatClass());
raceTable.addColumn(raceNameColumn, stringMessages.race());
raceTable.addColumn(raceStartColumn, stringMessages.startTime());
raceTable.addColumn(raceTrackedColumn, stringMessages.tracked());
raceTable.addColumn(hasWindDataColumn, "Wind data");
raceTable.addColumn(hasGPSDataColumn, "GPS data");
raceTable.addColumn(raceLiveDelayColumn, stringMessages.delayInSeconds());
return columnSortHandler;
}
private void fillRaceListFromAvailableRacesApplyingFilter() {
String text = filterRacesTextbox.getText();
List<String> wordsToFilter = Arrays.asList(text.split(" "));
raceList.getList().clear();
if (text != null && !text.isEmpty()) {
for (RaceDTO raceDTO : getAllRaces()) {
boolean failed = false;
for (String word : wordsToFilter) {
String textAsUppercase = word.toUpperCase().trim();
if (!raceDTO.getRegattaName().toUpperCase().contains(textAsUppercase)
&& !raceDTO.boatClass.toUpperCase().contains(textAsUppercase)
&& !raceDTO.name.toUpperCase().contains(textAsUppercase)) {
failed = true;
break;
}
}
if (!failed) {
raceList.getList().add(raceDTO);
}
}
} else {
for (RaceDTO raceFromAllRaces : getAllRaces()) {
raceList.getList().add(raceFromAllRaces);
}
}
// now sort again according to selected criterion
ColumnSortEvent.fire(raceTable, raceTable.getColumnSortList());
onRaceSelectionChange(raceSelectionProvider.getSelectedRaces()); // update selection based on underlying domain
// race selection model
}
@Override
public void onRaceSelectionChange(List<RegattaAndRaceIdentifier> selectedRaces) {
for (RaceDTO raceFromAllRaces : raceList.getList()) {
selectionModel.setSelected(raceFromAllRaces, selectedRaces.contains(raceFromAllRaces.getRaceIdentifier()));
}
}
private Iterable<RaceDTO> getAllRaces() {
return allRaces;
}
@Override
public boolean hasSettings() {
return true;
}
@Override
public SettingsDialogComponent<TrackedRacesSettings> getSettingsDialogComponent() {
return new TrackedRacesSettingsDialogComponent<TrackedRacesSettings>(settings, stringMessages);
}
@Override
public void updateSettings(TrackedRacesSettings newSettings) {
settings.setDelayToLiveInSeconds(newSettings.getDelayToLiveInSeconds());
// set the new delay to all selected races
List<RegattaAndRaceIdentifier> raceIdentifiersToUpdate = new ArrayList<RegattaAndRaceIdentifier>();
for (RaceDTO raceDTO : getSelectedRaces()) {
raceIdentifiersToUpdate.add(raceDTO.getRaceIdentifier());
}
if (raceIdentifiersToUpdate != null && !raceIdentifiersToUpdate.isEmpty()) {
sailingService.updateRacesDelayToLive(raceIdentifiersToUpdate, settings.getDelayToLiveInSeconds() * 1000l,
new AsyncCallback<Void>() {
@Override
public void onFailure(Throwable caught) {
errorReporter
.reportError("Exception trying to set the delay to live for the selected tracked races: "
+ caught.getMessage());
}
@Override
public void onSuccess(Void result) {
regattaRefresher.fillRegattas();
}
});
}
}
@Override
public String getLocalizedShortName() {
return "Tracked races";
}
@Override
public Widget getEntryWidget() {
return this;
}
public void addRaceSelectionChangeListener(RaceSelectionChangeListener listener) {
this.raceSelectionProvider.addRaceSelectionChangeListener(listener);
}
public RaceDTO getRaceByIdentifier(RaceIdentifier raceIdentifier) {
RaceDTO result = null;
if (raceList != null) {
for (RaceDTO race : raceList.getList()) {
if (race.getRaceIdentifier().equals(raceIdentifier)) {
result = race;
break;
}
}
}
return result;
}
List<RaceDTO> getSelectedRaces() {
List<RaceDTO> result = new ArrayList<RaceDTO>();
if (raceList != null) {
for (RaceDTO race : raceList.getList()) {
if (selectionModel.isSelected(race)) {
result.add(race);
}
}
}
return result;
}
public void selectRaceByIdentifier(RegattaAndRaceIdentifier raceIdentifier) {
if (raceList != null) {
for (RaceDTO race : raceList.getList()) {
String regattaName = race.getRegattaName();
if (regattaName.equals(raceIdentifier.getRegattaName())
&& race.name.equals(raceIdentifier.getRaceName())) {
dontFireNextSelectionChangeEvent = true;
selectionModel.setSelected(race, true);
break;
}
}
}
}
public void clearSelection() {
List<RegattaAndRaceIdentifier> emptySelection = Collections.emptyList();
raceSelectionProvider.setSelection(emptySelection, /* listenersNotToNotify */this);
if (raceList != null) {
for (RaceDTO race : raceList.getList()) {
selectionModel.setSelected(race, false);
}
}
}
@Override
public void fillRegattas(List<RegattaDTO> regattas) {
makeControlsReactToFillRegattas(regattas);
if (regattas.isEmpty()) {
raceTable.setVisible(false);
noTrackedRacesLabel.setVisible(true);
} else {
raceTable.setVisible(true);
noTrackedRacesLabel.setVisible(false);
}
List<RaceDTO> newAllRaces = new ArrayList<RaceDTO>();
List<RegattaDTO> newAllRegattas = new ArrayList<RegattaDTO>();
List<RegattaAndRaceIdentifier> newAllRaceIdentifiers = new ArrayList<RegattaAndRaceIdentifier>();
for (RegattaDTO regatta : regattas) {
newAllRegattas.add(regatta);
for (RaceDTO race : regatta.races) {
if (race != null) {
if (raceIsToBeAddedToList(race)) {
newAllRaces.add(race);
newAllRaceIdentifiers.add(race.getRaceIdentifier());
}
}
}
}
allRaces = newAllRaces;
fillRaceListFromAvailableRacesApplyingFilter();
raceSelectionProvider.setAllRaces(newAllRaceIdentifiers); // have this object be notified; triggers
// onRaceSelectionChange
}
/**
* Allows applying some sort of filter to the process of adding races.
* Defaults to true in standard implementation. Override for custom behavior
* @param race
* @return
*/
protected boolean raceIsToBeAddedToList(RaceDTO race) {
return true;
}
abstract protected void makeControlsReactToFillRegattas(List<RegattaDTO> regattas);
}
@@ -1,419 +1,44 @@
package com.sap.sailing.gwt.ui.adminconsole;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.google.gwt.cell.client.AbstractCell;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.i18n.client.DateTimeFormat.PredefinedFormat;
import com.google.gwt.safehtml.client.SafeHtmlTemplates;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.safehtml.shared.SafeHtmlUtils;
import com.google.gwt.text.client.DateTimeFormatRenderer;
import com.google.gwt.user.cellview.client.CellTable;
import com.google.gwt.user.cellview.client.Column;
import com.google.gwt.user.cellview.client.ColumnSortEvent;
import com.google.gwt.user.cellview.client.ColumnSortEvent.ListHandler;
import com.google.gwt.user.cellview.client.ColumnSortList;
import com.google.gwt.user.cellview.client.TextColumn;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.view.client.ListDataProvider;
import com.google.gwt.view.client.MultiSelectionModel;
import com.google.gwt.view.client.SelectionChangeEvent;
import com.google.gwt.view.client.SelectionChangeEvent.Handler;
import com.google.gwt.view.client.SelectionModel;
import com.google.gwt.view.client.SingleSelectionModel;
import com.sap.sailing.domain.common.RaceIdentifier;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.common.RegattaNameAndRaceName;
import com.sap.sailing.gwt.ui.client.ErrorReporter;
import com.sap.sailing.gwt.ui.client.RaceSelectionChangeListener;
import com.sap.sailing.gwt.ui.client.RaceSelectionProvider;
import com.sap.sailing.gwt.ui.client.RegattaDisplayer;
import com.sap.sailing.gwt.ui.client.RegattaRefresher;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.URLFactory;
import com.sap.sailing.gwt.ui.shared.RaceDTO;
import com.sap.sailing.gwt.ui.shared.RegattaDTO;
import com.sap.sailing.gwt.ui.shared.components.Component;
import com.sap.sailing.gwt.ui.shared.components.SettingsDialog;
import com.sap.sailing.gwt.ui.shared.components.SettingsDialogComponent;
/**
* Shows the currently tracked events/races in a table. Updated if subscribed as an {@link RegattaDisplayer}, e.g., with
* the {@link AdminConsoleEntryPoint}.
*/
public class TrackedRacesListComposite extends SimplePanel implements Component<TrackedRacesSettings>, RegattaDisplayer, RaceSelectionChangeListener {
private final long DEFAULT_LIVE_DELAY_IN_MILLISECONDS = 5000;
public class TrackedRacesListComposite extends AbstractTrackedRacesListComposite {
private final Set<TrackedRaceChangedListener> raceIsTrackedRaceChangeListener;
private final boolean multiSelection;
private Button btnUntrack;
private Button btnRemoveRace;
private boolean dontFireNextSelectionChangeEvent;
private final SelectionModel<RaceDTO> selectionModel;
private final CellTable<RaceDTO> raceTable;
private ListDataProvider<RaceDTO> raceList;
private Iterable<RaceDTO> allRaces;
private final VerticalPanel panel;
private DateTimeFormatRenderer dateFormatter = new DateTimeFormatRenderer(
DateTimeFormat.getFormat(PredefinedFormat.DATE_SHORT));
private DateTimeFormatRenderer timeFormatter = new DateTimeFormatRenderer(
DateTimeFormat.getFormat(PredefinedFormat.TIME_LONG));
private final Label noTrackedRacesLabel;
private final SailingServiceAsync sailingService;
private final ErrorReporter errorReporter;
private final RegattaRefresher regattaRefresher;
private final RaceSelectionProvider raceSelectionProvider;
private final StringMessages stringMessages;
private final Button btnUntrack;
private final Button btnRefresh;
private final Button btnRemoveRace;
private final Button btnSetDelayToLive;
private final TextBox filterRacesTextbox;
private final TrackedRacesSettings settings;
public static class AnchorCell extends AbstractCell<SafeHtml> {
@Override
public void render(com.google.gwt.cell.client.Cell.Context context, SafeHtml safeHtml, SafeHtmlBuilder sb) {
sb.append(safeHtml);
}
}
interface AnchorTemplates extends SafeHtmlTemplates {
@SafeHtmlTemplates.Template("<a href=\"{0}\">{1}</a>")
SafeHtml cell(String url, String displayName);
}
private static AnchorTemplates ANCHORTEMPLATE = GWT.create(AnchorTemplates.class);
private Button btnSetDelayToLive;
public TrackedRacesListComposite(final SailingServiceAsync sailingService, final ErrorReporter errorReporter,
final RegattaRefresher regattaRefresher, RaceSelectionProvider raceSelectionProvider,
final StringMessages stringMessages, boolean hasMultiSelection) {
this.sailingService = sailingService;
this.errorReporter = errorReporter;
this.regattaRefresher = regattaRefresher;
this.multiSelection = hasMultiSelection;
this.raceSelectionProvider = raceSelectionProvider;
this.stringMessages = stringMessages;
super(sailingService, errorReporter, regattaRefresher, raceSelectionProvider, stringMessages, hasMultiSelection);
this.raceIsTrackedRaceChangeListener = new HashSet<TrackedRaceChangedListener>();
raceList = new ListDataProvider<RaceDTO>();
selectionModel = multiSelection ? new MultiSelectionModel<RaceDTO>() : new SingleSelectionModel<RaceDTO>();
settings = new TrackedRacesSettings();
settings.setDelayToLiveInSeconds(DEFAULT_LIVE_DELAY_IN_MILLISECONDS / 1000l);
panel = new VerticalPanel();
setWidget(panel);
HorizontalPanel filterPanel = new HorizontalPanel();
panel.add(filterPanel);
Label lblFilterRaces = new Label(stringMessages.filterRacesByName() + ":");
lblFilterRaces.setWordWrap(false);
filterPanel.setSpacing(5);
filterPanel.add(lblFilterRaces);
filterPanel.setCellVerticalAlignment(lblFilterRaces, HasVerticalAlignment.ALIGN_MIDDLE);
filterRacesTextbox = new TextBox();
filterRacesTextbox.addKeyUpHandler(new KeyUpHandler() {
@Override
public void onKeyUp(KeyUpEvent event) {
fillRaceListFromAvailableRacesApplyingFilter();
}
});
filterPanel.add(filterRacesTextbox);
noTrackedRacesLabel = new Label(stringMessages.noRacesYet());
noTrackedRacesLabel.setWordWrap(false);
panel.add(noTrackedRacesLabel);
AdminConsoleTableResources tableRes = GWT.create(AdminConsoleTableResources.class);
raceTable = new CellTable<RaceDTO>(/* pageSize */10000, tableRes);
raceTable.ensureDebugId("TrackedRaces");
ListHandler<RaceDTO> columnSortHandler = new ListHandler<RaceDTO>(
raceList.getList());
TextColumn<RaceDTO> regattaNameColumn = new TextColumn<RaceDTO>() {
@Override
public String getValue(RaceDTO raceDTO) {
return raceDTO.getRegattaName();
}
};
regattaNameColumn.setSortable(true);
columnSortHandler.setComparator(regattaNameColumn, new Comparator<RaceDTO>() {
@Override
public int compare(RaceDTO t1, RaceDTO t2) {
String regatta1Name = t1.getRegattaName();
String regatta2Name = t2.getRegattaName();
boolean ascending = isSortedAscending();
if (regatta1Name.equals(regatta2Name)) {
return 0;
}
int val = ascending ? regatta1Name.compareTo(regatta2Name) : -(regatta2Name.compareTo(regatta1Name));
return val;
}
private boolean isSortedAscending() {
ColumnSortList sortList = raceTable.getColumnSortList();
return sortList.size() > 0 & sortList.get(0).isAscending();
}
});
TextColumn<RaceDTO> boatClassNameColumn = new TextColumn<RaceDTO>() {
@Override
public String getValue(RaceDTO raceDTO) {
return raceDTO.boatClass == null ? "" : raceDTO.boatClass;
}
};
boatClassNameColumn.setSortable(true);
columnSortHandler.setComparator(boatClassNameColumn, new Comparator<RaceDTO>() {
@Override
public int compare(RaceDTO t1, RaceDTO t2) {
String boatClass1 = t1.boatClass;
String boatClass2 = t2.boatClass;
boolean ascending = isSortedAscending();
if (boatClass1.equals(boatClass2)) {
return 0;
}
int val = ascending ? boatClass1.compareTo(boatClass2) : -(boatClass2.compareTo(boatClass1));
return val;
}
private boolean isSortedAscending() {
ColumnSortList sortList = raceTable.getColumnSortList();
return sortList.size() > 0 & sortList.get(0).isAscending();
}
});
AnchorCell anchorCell = new AnchorCell();
Column<RaceDTO, SafeHtml> raceNameColumn = new Column<RaceDTO, SafeHtml>(anchorCell) {
@Override
public SafeHtml getValue(RaceDTO raceDTO) {
if (raceDTO.isTracked == true) {
RegattaNameAndRaceName raceIdentifier = (RegattaNameAndRaceName) raceDTO.getRaceIdentifier();
String debugParam = Window.Location.getParameter("gwt.codesvr");
String link = URLFactory.INSTANCE.encode("/gwt/RaceBoard.html?raceName="
+ raceIdentifier.getRaceName() + "&regattaName=" + raceIdentifier.getRegattaName()
+ ((debugParam != null && !debugParam.isEmpty()) ? "&gwt.codesvr=" + debugParam : ""));
return ANCHORTEMPLATE.cell(link, raceDTO.name);
} else {
return SafeHtmlUtils.fromString(raceDTO.name);
}
}
};
raceNameColumn.setSortable(true);
columnSortHandler.setComparator(raceNameColumn, new Comparator<RaceDTO>() {
@Override
public int compare(RaceDTO t1, RaceDTO t2) {
boolean ascending = isSortedAscending();
if (t1.name.equals(t2.name)) {
return 0;
}
int val = -1;
val = (t1 != null && t2 != null && ascending) ? (t1.name.compareTo(t2.name)) : -(t2.name.compareTo(t1.name));
return val;
}
private boolean isSortedAscending() {
ColumnSortList sortList = raceTable.getColumnSortList();
return sortList.size() > 0 & sortList.get(0).isAscending();
}
});
TextColumn<RaceDTO> raceStartColumn = new TextColumn<RaceDTO>() {
@Override
public String getValue(RaceDTO raceDTO) {
if (raceDTO.startOfRace != null) {
return dateFormatter.render(raceDTO.startOfRace) + " "
+ timeFormatter.render(raceDTO.startOfRace);
}
return "";
}
};
raceStartColumn.setSortable(true);
columnSortHandler.setComparator(raceStartColumn, new Comparator<RaceDTO>() {
@Override
public int compare(RaceDTO t1, RaceDTO t2) {
if (t1.startOfRace != null && t2.startOfRace != null) {
boolean ascending = isSortedAscending();
int val = -1;
val = (t1.startOfRace.after(t2.startOfRace) && ascending) ? 1 : -1;
return val;
}
return 0;
}
private boolean isSortedAscending() {
ColumnSortList sortList = raceTable.getColumnSortList();
return sortList.size() > 0 & sortList.get(0).isAscending();
}
});
TextColumn<RaceDTO> raceTrackedColumn = new TextColumn<RaceDTO>() {
@Override
public String getValue(RaceDTO raceDTO) {
if (raceDTO.isTracked == true) {
return stringMessages.tracked();
}
return "";
}
};
TextColumn<RaceDTO> hasWindDataColumn = new TextColumn<RaceDTO>() {
@Override
public String getValue(RaceDTO raceDTO) {
if (raceDTO.trackedRace != null && raceDTO.trackedRace.hasWindData == true) {
return stringMessages.yes();
} else {
return stringMessages.no();
}
}
};
TextColumn<RaceDTO> hasGPSDataColumn = new TextColumn<RaceDTO>() {
@Override
public String getValue(RaceDTO raceDTO) {
if (raceDTO.trackedRace != null && raceDTO.trackedRace.hasGPSData == true) {
return stringMessages.yes();
} else {
return stringMessages.no();
}
}
};
TextColumn<RaceDTO> raceLiveDelayColumn = new TextColumn<RaceDTO>() {
@Override
public String getValue(RaceDTO raceDTO) {
if (raceDTO.isTracked && raceDTO.trackedRace != null && raceDTO.trackedRace.delayToLiveInMs > 0) {
return "" + raceDTO.trackedRace.delayToLiveInMs / 1000;
}
return "";
}
};
raceTable.addColumn(regattaNameColumn, stringMessages.regatta());
raceTable.addColumn(boatClassNameColumn, stringMessages.boatClass());
raceTable.addColumn(raceNameColumn, stringMessages.race());
raceTable.addColumn(raceStartColumn, stringMessages.startTime());
raceTable.addColumn(raceTrackedColumn, stringMessages.tracked());
raceTable.addColumn(hasWindDataColumn, "Wind data");
raceTable.addColumn(hasGPSDataColumn, "GPS data");
raceTable.addColumn(raceLiveDelayColumn, stringMessages.delayInSeconds());
raceTable.setWidth("300px");
raceTable.setSelectionModel(selectionModel);
raceTable.setVisible(false);
panel.add(raceTable);
raceList.addDataDisplay(raceTable);
raceTable.addColumnSortHandler(columnSortHandler);
raceTable.getSelectionModel().addSelectionChangeHandler(new Handler() {
@Override
public void onSelectionChange(SelectionChangeEvent event) {
List<RaceDTO> selectedRaces = getSelectedRaces();
if (selectedRaces.isEmpty()) {
btnRemoveRace.setEnabled(false);
btnUntrack.setEnabled(false);
} else {
btnRemoveRace.setEnabled(true);
btnUntrack.setEnabled(true);
}
if (dontFireNextSelectionChangeEvent) {
dontFireNextSelectionChangeEvent = false;
} else {
List<RegattaAndRaceIdentifier> selectedRaceIdentifiers = new ArrayList<RegattaAndRaceIdentifier>();
for (RaceDTO selectedRace : selectedRaces) {
selectedRaceIdentifiers.add(selectedRace.getRaceIdentifier());
}
TrackedRacesListComposite.this.raceSelectionProvider.setSelection(selectedRaceIdentifiers, TrackedRacesListComposite.this);
}
}
});
HorizontalPanel trackedRacesButtonPanel = new HorizontalPanel();
trackedRacesButtonPanel.setSpacing(10);
panel.add(trackedRacesButtonPanel);
btnRemoveRace = new Button(stringMessages.remove());
btnRemoveRace.ensureDebugId("RemoveRave");
btnRemoveRace.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
for (RaceDTO selectedRace : getSelectedRaces()) {
removeAndUntrackRace(selectedRace);
}
}
});
btnRemoveRace.setEnabled(false);
trackedRacesButtonPanel.add(btnRemoveRace);
btnUntrack = new Button(stringMessages.stopTracking());
btnUntrack.ensureDebugId("UntrackRace");
btnUntrack.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent click) {
for (RaceDTO selectedRace : getSelectedRaces()) {
if (selectedRace.isTracked) {
stopTrackingRace(selectedRace);
}
}
}
});
btnUntrack.setEnabled(false);
trackedRacesButtonPanel.add(btnUntrack);
btnRefresh = new Button(stringMessages.refresh());
btnRefresh.ensureDebugId("Refresh");
btnRefresh.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
regattaRefresher.fillRegattas();
}
});
trackedRacesButtonPanel.add(btnRefresh);
btnSetDelayToLive = new Button(stringMessages.setDelayToLive() + "...");
btnSetDelayToLive.ensureDebugId("SetDelayToLive");
btnSetDelayToLive.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
showSetDelayToLiveDialog();
}
});
trackedRacesButtonPanel.add(btnSetDelayToLive);
}
private void showSetDelayToLiveDialog() {
@@ -424,91 +49,9 @@ public class TrackedRacesListComposite extends SimplePanel implements Component<
settingsDialog.show();
}
public RaceDTO getRaceByIdentifier(RaceIdentifier raceIdentifier) {
RaceDTO result = null;
if (raceList != null) {
for (RaceDTO race : raceList.getList()) {
if(race.getRaceIdentifier().equals(raceIdentifier)) {
result = race;
break;
}
}
}
return result;
}
private List<RaceDTO> getSelectedRaces() {
List<RaceDTO> result = new ArrayList<RaceDTO>();
if (raceList != null) {
for (RaceDTO race : raceList.getList()) {
if (selectionModel.isSelected(race)) {
result.add(race);
}
}
}
return result;
}
public void selectRaceByIdentifier(RegattaAndRaceIdentifier raceIdentifier) {
if (raceList != null) {
for (RaceDTO race : raceList.getList()) {
String regattaName = race.getRegattaName();
if (regattaName.equals(raceIdentifier.getRegattaName()) && race.name.equals(raceIdentifier.getRaceName())) {
dontFireNextSelectionChangeEvent = true;
selectionModel.setSelected(race, true);
break;
}
}
}
}
public void clearSelection() {
List<RegattaAndRaceIdentifier> emptySelection = Collections.emptyList();
raceSelectionProvider.setSelection(emptySelection, /* listenersNotToNotify */ this);
if (raceList != null) {
for (RaceDTO race : raceList.getList()) {
selectionModel.setSelected(race, false);
}
}
}
@Override
public void fillRegattas(List<RegattaDTO> regattas) {
if (regattas.isEmpty()) {
raceTable.setVisible(false);
btnUntrack.setVisible(false);
btnRemoveRace.setVisible(false);
btnSetDelayToLive.setVisible(false);
noTrackedRacesLabel.setVisible(true);
} else {
raceTable.setVisible(true);
btnUntrack.setVisible(true);
btnUntrack.setEnabled(false);
btnRemoveRace.setVisible(true);
btnRemoveRace.setEnabled(false);
noTrackedRacesLabel.setVisible(false);
btnSetDelayToLive.setVisible(true);
}
List<RaceDTO> newAllRaces = new ArrayList<RaceDTO>();
List<RegattaDTO> newAllRegattas = new ArrayList<RegattaDTO>();
List<RegattaAndRaceIdentifier> newAllRaceIdentifiers = new ArrayList<RegattaAndRaceIdentifier>();
for (RegattaDTO regatta : regattas) {
newAllRegattas.add(regatta);
for (RaceDTO race : regatta.races) {
if (race != null) {
newAllRaces.add(race);
newAllRaceIdentifiers.add(race.getRaceIdentifier());
}
}
}
allRaces = newAllRaces;
fillRaceListFromAvailableRacesApplyingFilter();
raceSelectionProvider.setAllRaces(newAllRaceIdentifiers); // have this object be notified; triggers onRaceSelectionChange
}
public void addRaceSelectionChangeListener(RaceSelectionChangeListener listener) {
this.raceSelectionProvider.addRaceSelectionChangeListener(listener);
}
public void addTrackedRaceChangeListener(TrackedRaceChangedListener listener) {
this.raceIsTrackedRaceChangeListener.add(listener);
@@ -541,6 +84,7 @@ public class TrackedRacesListComposite extends SimplePanel implements Component<
public void onFailure(Throwable caught) {
errorReporter.reportError("Exception trying to stop tracking race " + race.name + "in regatta "
+ race.getRegattaName() + ": " + caught.getMessage());
}
}
@Override
@@ -553,92 +97,72 @@ public class TrackedRacesListComposite extends SimplePanel implements Component<
});
}
private void fillRaceListFromAvailableRacesApplyingFilter() {
String text = filterRacesTextbox.getText();
List<String> wordsToFilter = Arrays.asList(text.split(" "));
raceList.getList().clear();
if (text != null && !text.isEmpty()) {
for (RaceDTO raceDTO : getAllRaces()) {
boolean failed = false;
for (String word : wordsToFilter) {
String textAsUppercase = word.toUpperCase().trim();
if (!raceDTO.getRegattaName().toUpperCase().contains(textAsUppercase)
&& !raceDTO.boatClass.toUpperCase().contains(textAsUppercase)
&& !raceDTO.name.toUpperCase().contains(textAsUppercase)) {
failed = true;
break;
@Override
protected void addControlButtons(HorizontalPanel trackedRacesButtonPanel) {
btnRemoveRace = new Button(stringMessages.remove());
btnRemoveRace.ensureDebugId("RemoveRave");
btnRemoveRace.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
for (RaceDTO selectedRace : getSelectedRaces()) {
removeAndUntrackRace(selectedRace);
}
}
});
btnRemoveRace.setEnabled(false);
trackedRacesButtonPanel.add(btnRemoveRace);
btnUntrack = new Button(stringMessages.stopTracking());
btnUntrack.ensureDebugId("UntrackRace");
btnUntrack.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent click) {
for (RaceDTO selectedRace : getSelectedRaces()) {
if (selectedRace.isTracked) {
stopTrackingRace(selectedRace);
}
}
if (!failed) {
raceList.getList().add(raceDTO);
}
}
});
btnUntrack.setEnabled(false);
trackedRacesButtonPanel.add(btnUntrack);
btnSetDelayToLive = new Button(stringMessages.setDelayToLive() + "...");
btnSetDelayToLive.ensureDebugId("SetDelayToLive");
btnSetDelayToLive.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
showSetDelayToLiveDialog();
}
});
trackedRacesButtonPanel.add(btnSetDelayToLive);
}
@Override
protected void makeControlsReactToSelectionChange(List<RaceDTO> selectedRaces) {
if (selectedRaces.isEmpty()) {
btnRemoveRace.setEnabled(false);
btnUntrack.setEnabled(false);
} else {
for (RaceDTO raceFromAllRaces : getAllRaces()) {
raceList.getList().add(raceFromAllRaces);
}
}
// now sort again according to selected criterion
ColumnSortEvent.fire(raceTable, raceTable.getColumnSortList());
onRaceSelectionChange(raceSelectionProvider.getSelectedRaces()); // update selection based on underlying domain race selection model
}
@Override
public void onRaceSelectionChange(List<RegattaAndRaceIdentifier> selectedRaces) {
for (RaceDTO raceFromAllRaces : raceList.getList()) {
selectionModel.setSelected(raceFromAllRaces, selectedRaces.contains(raceFromAllRaces.getRaceIdentifier()));
btnRemoveRace.setEnabled(true);
btnUntrack.setEnabled(true);
}
}
private Iterable<RaceDTO> getAllRaces() {
return allRaces;
@Override
protected void makeControlsReactToFillRegattas(List<RegattaDTO> regattas) {
if (regattas.isEmpty()) {
btnUntrack.setVisible(false);
btnRemoveRace.setVisible(false);
btnSetDelayToLive.setVisible(false);
} else {
btnUntrack.setVisible(true);
btnUntrack.setEnabled(false);
btnRemoveRace.setVisible(true);
btnRemoveRace.setEnabled(false);
btnSetDelayToLive.setVisible(true);
}
}
@Override
public boolean hasSettings() {
return true;
}
@Override
public SettingsDialogComponent<TrackedRacesSettings> getSettingsDialogComponent() {
return new TrackedRacesSettingsDialogComponent<TrackedRacesSettings>(settings, stringMessages);
}
@Override
public void updateSettings(TrackedRacesSettings newSettings) {
settings.setDelayToLiveInSeconds(newSettings.getDelayToLiveInSeconds());
// set the new delay to all selected races
List<RegattaAndRaceIdentifier> raceIdentifiersToUpdate = new ArrayList<RegattaAndRaceIdentifier>();
for (RaceDTO raceDTO : getSelectedRaces()) {
raceIdentifiersToUpdate.add(raceDTO.getRaceIdentifier());
}
if (raceIdentifiersToUpdate != null && !raceIdentifiersToUpdate.isEmpty()) {
sailingService.updateRacesDelayToLive(raceIdentifiersToUpdate, settings.getDelayToLiveInSeconds() * 1000l,
new AsyncCallback<Void>() {
@Override
public void onFailure(Throwable caught) {
errorReporter
.reportError("Exception trying to set the delay to live for the selected tracked races: "
+ caught.getMessage());
}
@Override
public void onSuccess(Void result) {
regattaRefresher.fillRegattas();
}
});
}
}
@Override
public String getLocalizedShortName() {
return "Tracked races";
}
@Override
public Widget getEntryWidget() {
return this;
}
}
@@ -5,8 +5,10 @@ import com.google.gwt.i18n.client.NumberFormat;
import com.sap.sailing.domain.common.DetailType;
public class DetailTypeFormatter {
private DetailTypeFormatter() { }
private static final StringMessages stringMessages = GWT.create(StringMessages.class);
private static final StringMessages stringMessages = GWT.create(StringMessages.class);
public static String format(DetailType detailType) {
switch (detailType) {
@@ -46,19 +48,13 @@ public class DetailTypeFormatter {
case RACE_AVERAGE_CROSS_TRACK_ERROR_IN_METERS:
return stringMessages.averageCrossTrackErrorInMeters();
case WINDWARD_DISTANCE_TO_OVERALL_LEADER:
return stringMessages.windwardDistanceToLeader();
case HEAD_UP:
return stringMessages.headUp();
case BEAR_AWAY:
return stringMessages.bearAway();
return stringMessages.windwardDistanceToLeaderInMeters();
case TACK:
return stringMessages.tack();
case JIBE:
return stringMessages.jibe();
case PENALTY_CIRCLE:
return stringMessages.penaltyCircle();
case MARK_PASSING:
return stringMessages.markPassing();
case DISPLAY_LEGS:
return stringMessages.legs();
case CURRENT_LEG:
@@ -90,35 +86,7 @@ public class DetailTypeFormatter {
/**
* Returns the unit of the given {@link DetailType}, like 'm', 'kts' or an empty string, if the detail type has no
* unit.<br>
* Throws an UnsupportedOperationException if the given detail type isn't supported.<br>
* Currently supported are:<br>
* <ul>
* <li>CURRENT_SPEED_OVER_GROUND_IN_KNOTS</li>
* <li>MAXIMUM_SPEED_OVER_GROUND_IN_KNOTS</li>
* <li>DISTANCE_TRAVELED</li>
* <li>GAP_TO_LEADER_IN_SECONDS</li>
* <li>VELOCITY_MADE_GOOD_IN_KNOTS</li>
* <li>WINDWARD_DISTANCE_TO_OVERALL_LEADER</li>
* <li>AVERAGE_SPEED_OVER_GROUND_IN_KNOTS</li>
* <li>ESTIMATED_TIME_TO_NEXT_WAYPOINT_IN_SECONDS</li>
* <li>GAP_CHANGE_SINCE_LEG_START_IN_SECONDS</li>
* <li>AVERAGE_CROSS_TRACK_ERROR_IN_METERS</li>
* <li>RACE_DISTANCE_TRAVELED</li>
* <li>RACE_AVERAGE_SPEED_OVER_GROUND_IN_KNOTS</li>
* <li>RACE_GAP_TO_LEADER_IN_SECONDS</li>
* <li>RACE_CURRENT_SPEED_OVER_GROUND_IN_KNOTS</li>
* <li>RACE_DISTANCE_TO_LEADER_IN_METERS</li>
* <li>RACE_AVERAGE_CROSS_TRACK_ERROR_IN_METERS</li>
* <li>AVERAGE_TACK_LOSS_IN_METERS</li>
* <li>AVERAGE_JIBE_LOSS_IN_METERS</li>
* <li>TOTAL_TIME_SAILED_IN_SECONDS</li>
*
* <li>RACE_RANK (no unit)</li>
* <li>CURRENT_LEG (no unit)</li>
* <li>TACK (no unit)</li>
* <li>JIBE (no unit)</li>
* <li>PENALTY_CIRCLE (no unit)</li>
* </ul>
* Throws an UnsupportedOperationException if the given detail type isn't supported.
*
* @param detailType
* @return The unit of the detail type as string.
@@ -128,55 +96,48 @@ public class DetailTypeFormatter {
case CURRENT_SPEED_OVER_GROUND_IN_KNOTS:
case RACE_CURRENT_SPEED_OVER_GROUND_IN_KNOTS:
case MAXIMUM_SPEED_OVER_GROUND_IN_KNOTS:
return stringMessages.currentSpeedOverGroundInKnotsUnit();
case RACE_AVERAGE_SPEED_OVER_GROUND_IN_KNOTS:
case VELOCITY_MADE_GOOD_IN_KNOTS:
case AVERAGE_SPEED_OVER_GROUND_IN_KNOTS:
return stringMessages.knotsUnit();
case WINDWARD_DISTANCE_TO_OVERALL_LEADER:
case WINDWARD_DISTANCE_TO_GO_IN_METERS:
case DISTANCE_TRAVELED:
case RACE_DISTANCE_TO_LEADER_IN_METERS:
case RACE_DISTANCE_TRAVELED:
case AVERAGE_TACK_LOSS_IN_METERS:
case AVERAGE_JIBE_LOSS_IN_METERS:
case AVERAGE_MANEUVER_LOSS_IN_METERS:
return stringMessages.distanceInMetersUnit();
case GAP_TO_LEADER_IN_SECONDS:
case GAP_CHANGE_SINCE_LEG_START_IN_SECONDS:
case RACE_GAP_TO_LEADER_IN_SECONDS:
return stringMessages.gapToLeaderInSecondsUnit();
case VELOCITY_MADE_GOOD_IN_KNOTS:
return stringMessages.velocityMadeGoodInKnotsUnit();
case WINDWARD_DISTANCE_TO_OVERALL_LEADER:
case WINDWARD_DISTANCE_TO_GO_IN_METERS:
return stringMessages.windwardDistanceToGoInMetersUnit();
case AVERAGE_SPEED_OVER_GROUND_IN_KNOTS:
return stringMessages.averageSpeedInKnotsUnit();
case ESTIMATED_TIME_TO_NEXT_WAYPOINT_IN_SECONDS:
return stringMessages.estimatedTimeToNextWaypointInSecondsUnit();
case AVERAGE_CROSS_TRACK_ERROR_IN_METERS:
case RACE_AVERAGE_CROSS_TRACK_ERROR_IN_METERS:
return stringMessages.metersUnit();
case GAP_TO_LEADER_IN_SECONDS:
case GAP_CHANGE_SINCE_LEG_START_IN_SECONDS:
case RACE_GAP_TO_LEADER_IN_SECONDS:
case ESTIMATED_TIME_TO_NEXT_WAYPOINT_IN_SECONDS:
case TIME_TRAVELED:
return stringMessages.secondsUnit();
case TOTAL_TIME_SAILED_IN_SECONDS:
case TOTAL_TIME_SAILED_DOWNWIND_IN_SECONDS:
case TOTAL_TIME_SAILED_UPWIND_IN_SECONDS:
case TOTAL_TIME_SAILED_REACHING_IN_SECONDS:
return stringMessages.hhmmssUnit();
case RACE_AVERAGE_SPEED_OVER_GROUND_IN_KNOTS:
return stringMessages.averageSpeedInKnotsUnit();
// Case for detail types without unit, so that an empty string is returned.
// Cases for detail types without unit, so that an empty string is returned.
case RACE_RANK:
case CURRENT_LEG:
case TACK:
case JIBE:
case PENALTY_CIRCLE:
case RANK_GAIN:
case NUMBER_OF_MANEUVERS:
case DISPLAY_LEGS:
case SIDE_TO_WHICH_MARK_AT_LEG_START_WAS_ROUNDED:
return "";
default:
// Throwing an exception to get notificated if an implementation of
// an detail type is missing.
@@ -184,6 +145,86 @@ public class DetailTypeFormatter {
+ "' in this method.");
}
}
/**
* Returns a tooltip text for the given detail type or an empty string, if there's none.
* @param detailType
* @return A tooltip string for the given detail type.
*/
public static String getTooltip(DetailType detailType) {
switch (detailType) {
case AVERAGE_CROSS_TRACK_ERROR_IN_METERS:
return stringMessages.averageCrossTrackErrorInMetersTooltip();
case GAP_CHANGE_SINCE_LEG_START_IN_SECONDS:
return stringMessages.gapChangeSinceLegStartInSecondsTooltip();
case RACE_AVERAGE_CROSS_TRACK_ERROR_IN_METERS:
return stringMessages.raceAverageCrossTrackErrorInMetersTooltip();
case SIDE_TO_WHICH_MARK_AT_LEG_START_WAS_ROUNDED:
return stringMessages.sideToWhichMarkAtLegStartWasRoundedTooltip();
case VELOCITY_MADE_GOOD_IN_KNOTS:
return stringMessages.velocityMadeGoodInKnotsTooltip();
case AVERAGE_JIBE_LOSS_IN_METERS:
return stringMessages.averageJibeLossInMetersTooltip();
case AVERAGE_MANEUVER_LOSS_IN_METERS:
return stringMessages.averageManeuverLossInMetersTooltip();
case AVERAGE_TACK_LOSS_IN_METERS:
return stringMessages.averageTackLossInMetersTooltip();
case CURRENT_LEG:
return stringMessages.currentLegTooltip();
case DISPLAY_LEGS:
return "";
case DISTANCE_TRAVELED:
return stringMessages.distanceTraveledTooltip();
case AVERAGE_SPEED_OVER_GROUND_IN_KNOTS:
return stringMessages.averageSpeedInKnotsTooltip();
case ESTIMATED_TIME_TO_NEXT_WAYPOINT_IN_SECONDS:
return stringMessages.estimatedTimeToNextWaypointInSecondsTooltip();
case GAP_TO_LEADER_IN_SECONDS:
return stringMessages.gapToLeaderInSecondsTooltip();
case JIBE:
return stringMessages.jibeTooltip();
case MAXIMUM_SPEED_OVER_GROUND_IN_KNOTS:
return stringMessages.maximumSpeedOverGroundInKnotsTooltip();
case NUMBER_OF_MANEUVERS:
return stringMessages.numberOfManeuversTooltip();
case PENALTY_CIRCLE:
return stringMessages.penaltyCircleTooltip();
case RACE_AVERAGE_SPEED_OVER_GROUND_IN_KNOTS:
return stringMessages.raceAverageSpeedInKnotsTooltip();
case CURRENT_SPEED_OVER_GROUND_IN_KNOTS:
return stringMessages.currentSpeedOverGroundInKnotsTooltip();
case RACE_CURRENT_SPEED_OVER_GROUND_IN_KNOTS:
return stringMessages.currentSpeedOverGroundInKnotsTooltip();
case RACE_DISTANCE_TO_LEADER_IN_METERS:
return stringMessages.windwardDistanceToLeaderInMetersTooltip();
case WINDWARD_DISTANCE_TO_OVERALL_LEADER:
return stringMessages.windwardDistanceToLeaderInMetersTooltip();
case RACE_DISTANCE_TRAVELED:
return stringMessages.raceDistanceTraveledTooltip();
case RACE_GAP_TO_LEADER_IN_SECONDS:
return stringMessages.gapToLeaderInSecondsTooltip();
case RACE_RANK:
return stringMessages.rankTooltip();
case RANK_GAIN:
return stringMessages.rankGainTooltip();
case TACK:
return stringMessages.tackTooltip();
case TIME_TRAVELED:
return stringMessages.timeTooltip();
case TOTAL_TIME_SAILED_DOWNWIND_IN_SECONDS:
return stringMessages.totalTimeSailedDownwindInSecondsTooltip();
case TOTAL_TIME_SAILED_IN_SECONDS:
return stringMessages.totalTimeSailedInSecondsTooltip();
case TOTAL_TIME_SAILED_REACHING_IN_SECONDS:
return stringMessages.totalTimeSailedReachingInSecondsTooltip();
case TOTAL_TIME_SAILED_UPWIND_IN_SECONDS:
return stringMessages.totalTimeSailedUpwindInSecondsTooltip();
case WINDWARD_DISTANCE_TO_GO_IN_METERS:
return stringMessages.windwardDistanceToGoInMetersTooltip();
}
return "";
}
public static NumberFormat getNumberFormat(DetailType detailType) {
String decimalPlaces = "";
@@ -1,462 +1,485 @@
package com.sap.sailing.gwt.ui.client;
import com.google.gwt.i18n.client.Messages;
public interface StringMessages extends Messages {
String helloWorld();
String kielWeel2011();
String stgAccount();
String tracTracEvents();
String swissTimingEvents();
String trackedBefore();
String listRaces();
String wind();
String windPanelLabel();
String refresh();
String remove();
String windSource();
String dampeningInterval();
String map();
String race();
String races();
String tracked();
String time();
String playSpeed();
String playSpeedHelp();
String playModeLive();
String playModeReplay();
String timeDelay();
String timeDelayHelp();
String speedInKnots();
String fromDeg();
String noRacesYet();
String total();
String carry();
String competitor();
String competitors();
String defaultLeaderboard();
String noSuchLeaderboard();
String leaderboardConfiguration();
String newDotDotDot();
String editScores();
String columnNamesInSelectedLeaderboard();
String addDotDotDot();
String renameDotDotDot();
String trackedRaceConnectedToSelectedRaceName();
String linkToColumn();
String unlink();
String leaderboardName();
String cancel();
String pleaseEnterAName();
String discardRacesFromHowManyStartedRacesOn();
String leaderboardWithThisNameAlreadyExists();
String discardThresholdsMustBeNumeric();
String discardThresholdsMustBeAscending();
String discarding();
String startingFromNumberOfRaces();
String renameLeaderboard();
String addColumnToLeaderboard();
String pleaseEnterNameForNewRaceColumn();
String ok();
String medalRace();
String renameRace();
String openSelectedLeaderboard();
String rank();
String totalRank();
String collapse();
String expand();
String leg();
String distanceInMeters();
String distanceInMetersUnit();
String averageSpeedInKnots();
String averageSpeedInKnotsUnit();
String rankGain();
String sapSailingAnalytics();
String leaderboard();
String leaderboards();
String leaderboardSettings();
String settings();
String selectAtLeastOneLegDetail();
String currentSpeedOverGroundInKnots();
String currentSpeedOverGroundInKnotsUnit();
String estimatedTimeToNextWaypointInSeconds();
String estimatedTimeToNextWaypointInSecondsUnit();
String gapToLeaderInSeconds();
String gapToLeaderInSecondsUnit();
String velocityMadeGoodInKnots();
String velocityMadeGoodInKnotsUnit();
String windwardDistanceToGoInMeters();
String windwardDistanceToLeaderInMeters();
String windwardDistanceToGoInMetersUnit();
String name();
String leaveEmptyForDefault();
String trackNewEvent();
String trackableRaces();
String trackWind();
String regattaName();
String eventName();
String event();
String startTime();
String regatta();
String regattas();
String startTracking();
String stopTracking();
String connections();
String historyOfConnections();
String defineNewConnection();
String trackedRaces();
String canSendRequests();
String connectAndReadRaces();
String trackSettings();
String ports();
String liveData();
String storedData();
String uris();
String jsonUrl();
String livePort();
String storedPort();
String liveUri();
String storedUri();
String eventsConnectedTo();
String hostname();
String declinationCheckbox();
String raceStartTrackingColumn();
String pauseAutomaticRefresh();
String autoRefresh();
String delayInSeconds();
String delayBetweenAutoAdvances();
String delayMustBeNonNegative();
String chooseUpdateIntervalOfAtLeastOneSecond();
String errorSettingWindForRace();
String errorFetchingWindInformationForRace();
String errorWhileTryingToSetWindSourceForRace();
String inEvent();
String to();
String showEstimatedWind();
String timing();
String raceDetailsToShow();
String legDetailsToShow();
String columnMoveUp();
String columnMoveDown();
String port();
String raceStartTimeColumn();
String showOnlySelectedCompetitors();
String showSelectedCompetitorsInfo();
String lengthInSeconds();
String selectedRaces();
String stressTest();
String numberOfManeuvers();
String tacks();
String jibes();
String penaltyCircles();
String medalRaceIsNull();
String maneuverTypes();
String configuration();
String chooseChart();
String distanceTraveled();
String velocityMadeGoodLong();
String speedOverGroundLong();
String gapToLeaderLong();
String pointsToLoad();
String speed();
String distance();
String in();
String secondsUnit();
String metersUnit();
String failedToLoadRaceData();
String close();
String compareCompetitors();
String description();
String sailNumber();
String country();
String no3LetterCodes();
String add();
String delete();
String showCharts();
String raceWithThisNameAlreadyExists();
String raceWithThisNameAlreadyExistsInRegatta();
String headUp();
String bearAway();
String tack();
String jibe();
String penaltyCircle();
String markPassing();
String mark();
String otherManeuver();
String douglasPeuckerPoints();
String filterRacesByName();
String actionEdit();
String actionEditScores();
String actionOpenBrowser();
String actionRemove();
String actionEditRaces();
String actionRaceEdit();
String actionRaceUnlink();
String actionRaceRemove();
String filterLeaderboardsByName();
String windwardDistanceToLeader();
String actions();
String islinked();
String yes();
String no();
String hoverOverAPoint();
String noSelection();
String raceIsKnownToStartUpwind();
String events();
String settingsForComponent(String localizedComponentName);
String noEventsFound();
String noEventSelected();
String noLeaderboardsFound();
String searchEvents();
String location();
String from();
String until();
String onlyLiveEvents();
String locationNotAvailable();
String startDateNotAvailable();
String startDate();
String unknownManeuver();
String tailLengthMustBePositive();
String failedToLoadRaceInformation(String message);
String competitorPassedMarkAtDate(String competitorName, String markName, String dateTime);
String valueForCompetitorAt(String competitorName, String dateTime, String valueWithUnit);
String reallyRemoveRace(String string);
String showDetails();
String hideLeaderboard();
String hideLeaderboards();
String showLeaderboard();
String hideRaces();
String showMap();
String hideMap();
String noLeaderboardSelected();
String leaderboardGroups();
String filterLeaderboardGroupsByName();
String createNewLeaderboardGroup();
String leaderboardGroupConfiguration();
String legs();
String currentLeg();
String leaderboardGroup();
String pleaseEnterNonEmptyDescription();
String groupWithThisNameAlreadyExists();
String detailsOfLeaderboardGroup();
String edit();
String save();
String abort();
String noLeaderboardGroupWithNameFound(String groupName);
String overview();
String welcomeToSailingAnalytics();
String welcomeToSailingAnalyticsBody();
String home();
String clickAndDragToZoomIn();
String windSpeed();
String allTimesInUTC();
String autoZoomTo();
String autoZoomToBoats();
String autoZoomToBuoys();
String autoZoomOff();
String autoZoomToTails();
String autoZoomToWindSensors();
String autoZoomSelectedCompetitors();
String bearing();
String zoom();
String stepSizeMustBeGreaterThanNull();
String stepSizeInSeconds();
String refreshInterval();
String refreshIntervalMustBeGreaterThanXSeconds(String seconds);
String competitorCharts();
String selectAtLeastOneCompetitor();
String directionChange();
String speedChange();
String degreesShort();
String untracked();
String delayForLiveMode();
String notAvailable();
String details();
String noGroupSelected();
String combinedWindSourceTypeName();
String courseBasedWindSourceTypeName();
String trackBasedEstimationWindSourceTypeName();
String expeditionWindSourceTypeName();
String webWindSourceTypeName();
String clickChartToSetTime();
String position();
String windSourcesUsed();
String errorTryingToUpdateWindSourcesToExclude(String raceName, String message);
String feedback();
String startStopPlaying();
String backToLive();
String slowPlaySpeedDown();
String speedPlaySpeedUp();
String showHideComponent(String localizedShortName);
String degreesBoatToTheWind();
String racesInLeaderboard();
String leaderboardsInGroup();
String replication();
String errorFetchingReplicaData(String message);
String averageCrossTrackErrorInMeters();
String enterMaster();
String errorStartingReplication(String hostname, String exchangeName, String message);
String helpLines();
String startLine();
String finishLine();
String advantageLine();
String courseMiddleLine();
String messagingPortNumber();
String servletPortNumber();
String registeredAt(String string);
String replicatingFromMaster(String hostname, int jmsPort, int servletPort);
String showWindSpeedSeries();
String showWindDirectionSeries();
String fleet();
String boatClass();
String setDelayToLive();
String pleaseEnterNonEmptyVenue();
String eventWithThisNameAlreadyExists();
String venue();
String pleaseSelectABoatClass();
String regattaWithThisNameAlreadyExists();
String seriesWithThisNameAlreadyExists();
String fleetWithThisNameAlreadyExists();
String fleets();
String series();
String splitFleet();
String color();
String medalSeries();
String noColor();
String pleaseSelectARegatta();
String addFleet();
String doYouReallyWantToRemoveRegatta(String name);
String errorLoadingScoreCorrectionProviders(String message);
String selectResultListToImportFrom();
String of();
String errorObtainingScoreCorrections(String scoreCorrectionProviderName, String eventName, String boatClassName,
String string, String message);
String assignRaceNumbersToRaceColumns();
String importOfficialResults();
String selectAll();
String apply();
String successfullyUpdatedScores();
String errorUpdatingScoresForLeaderboard(String leaderboardName, String message);
String maneuverTypesToShowWhenCompetitorIsClicked();
String simulateWithStartTimeNow();
String boatClassDoesNotMatchSelectedRegatta(String boatClass, String regattaName);
String regattaExistForSelectedBoatClass();
String reload();
String addRegatta();
String exchangeName();
String course();
String courseLayout();
String buoy();
String gate();
String buoys();
String waypoint();
String showAllCompetitors();
String boatTails();
String maximalCount();
String maxVisibleCompetitorsCountMustBePositive();
String fregResultImportUrls();
String errorRefreshingFregUrlList(String message);
String successfullyUpdatedFregUrls();
String errorRemovingFregUrls(String message);
String pleaseEnterNonEmptyUrl();
String addFragUrl();
String errorAddingFragUrl(String message);
String errorTryingToObtainLeaderboardContents(String message);
String lastScoreUpdate();
String warningBrowserUnsupported();
String newMark();
String controlPoint();
String errorUpdatingRaceCourse(String message);
String successfullyUpdatedCourse();
String selectOneMarkOrTwoMarksForGate();
String errorTryingToObtainTheMarksOfTheRace(String message);
String errorTryingToObtainRaceCourse(String message);
String insertWaypointBeforeSelected();
String insertWaypointAfterSelected();
String scoringSchemeLowPointSystem();
String scoringSchemeHighPointSystem();
String scoringSystem();
String createFlexibleLeaderboard();
String createRegattaLeaderboard();
String editFlexibleLeaderboard();
String editRegattaLeaderboard();
String noRegatta();
String useOverallLeaderboard();
String overallStandings();
String scoringSchemeHighPointEssOverall();
String scoringSchemeHighPointLastBreaksTie();
String type();
String actionAddRaces();
String racesWithNamePrefix();
String maximumSpeedOverGroundInKnots();
String totalTimeSailedDownwindInSeconds();
String totalTimeSailedUpwindInSeconds();
String totalTimeSailedReachingInSeconds();
String totalTimeSailedInSeconds();
String overallDetailsToShow();
String hhmmssUnit();
String actionAddWindData();
String valueMustBeBetweenMinMax(String name, String minValue, String maxValue);
String optional();
String pleaseEnterAValue();
String latitude();
String longitude();
String actionAddEvent();
String publicationUrl();
String suppress();
String isPublic();
String unsuppress();
String suppressedCompetitors();
String pleaseSelectASeries();
String pleaseSelectARace();
String displayGroupsInReverseOrder();
String actionConfigureUrl();
String configureLeaderboardUrlDescription();
String embedded();
String mediaPanel();
String url();
String mimeType();
String title();
String reallyRemoveMediaTrack(String mediaTrackTitle);
String duration();
String addMediaTrack();
String addYoutubeTrack();
String youtubeId();
String additionalUrlSettings();
String restrictToSingleSelectedRace();
String expandSelectedRace();
String showRaceDetails();
String numberOfRaces();
String numberOfRacesMustBeNonNegativeNumber();
String chooseTheWayYouSelectRaces();
String selectFromAllRaces();
String selectANumberOfRaces();
String numberOfLastNRaces();
String expandLastRace();
String factor();
String errorUpdatingIsMedalRace(String message);
String maneuverLoss();
String averageManeuverLossInMeters();
String averageTackLossInMeters();
String averageJibeLossInMeters();
String shape();
String pattern();
String legend();
String live();
String swissTimingArchiveConnector();
String errorFetchingRankingChartData(String message);
String loadingCompetitorData();
String rankNAfterRace(long l, String string);
String afterRace();
String showRankChart();
String overallLeaderboardSelection();
String showOverallLeaderboardOnSamePage();
String errorTryingToObtainOverallLeaderboards(String message);
String finished();
String passedTo(String name);
String gapChangeSinceLegStartInSeconds();
String sideToWhichMarkAtLegStartWasRounded();
String raceIsLive(String raceName);
String racesAreLive(String raceNames);
String scoringSchemeHighPointFirstGetsTen();
}
package com.sap.sailing.gwt.ui.client;
import com.google.gwt.i18n.client.Messages;
public interface StringMessages extends Messages {
String helloWorld();
String kielWeel2011();
String stgAccount();
String tracTracEvents();
String swissTimingEvents();
String trackedBefore();
String listRaces();
String wind();
String windPanelLabel();
String refresh();
String remove();
String windSource();
String dampeningInterval();
String map();
String race();
String races();
String tracked();
String time();
String playSpeed();
String playSpeedHelp();
String playModeLive();
String playModeReplay();
String timeDelay();
String timeDelayHelp();
String speedInKnots();
String fromDeg();
String noRacesYet();
String total();
String carry();
String competitor();
String competitors();
String defaultLeaderboard();
String noSuchLeaderboard();
String leaderboardConfiguration();
String newDotDotDot();
String editScores();
String columnNamesInSelectedLeaderboard();
String addDotDotDot();
String renameDotDotDot();
String trackedRaceConnectedToSelectedRaceName();
String linkToColumn();
String unlink();
String leaderboardName();
String cancel();
String pleaseEnterAName();
String discardRacesFromHowManyStartedRacesOn();
String leaderboardWithThisNameAlreadyExists();
String discardThresholdsMustBeNumeric();
String discardThresholdsMustBeAscending();
String discarding();
String startingFromNumberOfRaces();
String renameLeaderboard();
String addColumnToLeaderboard();
String pleaseEnterNameForNewRaceColumn();
String ok();
String medalRace();
String renameRace();
String openSelectedLeaderboard();
String rank();
String totalRank();
String collapse();
String expand();
String leg();
String distanceInMeters();
String averageSpeedInKnots();
String rankGain();
String sapSailingAnalytics();
String leaderboard();
String leaderboards();
String leaderboardSettings();
String settings();
String selectAtLeastOneLegDetail();
String currentSpeedOverGroundInKnots();
String estimatedTimeToNextWaypointInSeconds();
String gapToLeaderInSeconds();
String velocityMadeGoodInKnots();
String windwardDistanceToGoInMeters();
String windwardDistanceToLeaderInMeters();
String name();
String leaveEmptyForDefault();
String trackNewEvent();
String trackableRaces();
String trackWind();
String regattaName();
String eventName();
String event();
String startTime();
String regatta();
String regattas();
String startTracking();
String stopTracking();
String connections();
String historyOfConnections();
String defineNewConnection();
String trackedRaces();
String canSendRequests();
String connectAndReadRaces();
String trackSettings();
String ports();
String liveData();
String storedData();
String uris();
String jsonUrl();
String livePort();
String storedPort();
String liveUri();
String storedUri();
String eventsConnectedTo();
String hostname();
String declinationCheckbox();
String raceStartTrackingColumn();
String pauseAutomaticRefresh();
String autoRefresh();
String delayInSeconds();
String delayBetweenAutoAdvances();
String delayMustBeNonNegative();
String chooseUpdateIntervalOfAtLeastOneSecond();
String errorSettingWindForRace();
String errorFetchingWindInformationForRace();
String errorWhileTryingToSetWindSourceForRace();
String inEvent();
String to();
String showEstimatedWind();
String timing();
String raceDetailsToShow();
String legDetailsToShow();
String columnMoveUp();
String columnMoveDown();
String port();
String raceStartTimeColumn();
String showOnlySelectedCompetitors();
String showSelectedCompetitorsInfo();
String lengthInSeconds();
String selectedRaces();
String stressTest();
String numberOfManeuvers();
String tacks();
String jibes();
String penaltyCircles();
String medalRaceIsNull();
String maneuverTypes();
String configuration();
String chooseChart();
String distanceTraveled();
String velocityMadeGoodLong();
String speedOverGroundLong();
String gapToLeaderLong();
String pointsToLoad();
String speed();
String distance();
String in();
String secondsUnit();
String metersUnit();
String failedToLoadRaceData();
String close();
String compareCompetitors();
String description();
String sailNumber();
String country();
String no3LetterCodes();
String add();
String delete();
String showCharts();
String raceWithThisNameAlreadyExists();
String raceWithThisNameAlreadyExistsInRegatta();
String headUp();
String bearAway();
String tack();
String jibe();
String penaltyCircle();
String markPassing();
String mark();
String otherManeuver();
String douglasPeuckerPoints();
String filterRacesByName();
String actionEdit();
String actionEditScores();
String actionOpenBrowser();
String actionRemove();
String actionEditRaces();
String actionRaceEdit();
String actionRaceUnlink();
String actionRaceRemove();
String filterLeaderboardsByName();
String actions();
String islinked();
String yes();
String no();
String hoverOverAPoint();
String noSelection();
String raceIsKnownToStartUpwind();
String events();
String settingsForComponent(String localizedComponentName);
String noEventsFound();
String noEventSelected();
String noLeaderboardsFound();
String searchEvents();
String location();
String from();
String until();
String onlyLiveEvents();
String locationNotAvailable();
String startDateNotAvailable();
String startDate();
String unknownManeuver();
String tailLengthMustBePositive();
String failedToLoadRaceInformation(String message);
String competitorPassedMarkAtDate(String competitorName, String markName, String dateTime);
String valueForCompetitorAt(String competitorName, String dateTime, String valueWithUnit);
String reallyRemoveRace(String string);
String showDetails();
String hideLeaderboard();
String hideLeaderboards();
String showLeaderboard();
String hideRaces();
String showMap();
String hideMap();
String noLeaderboardSelected();
String leaderboardGroups();
String filterLeaderboardGroupsByName();
String createNewLeaderboardGroup();
String leaderboardGroupConfiguration();
String legs();
String currentLeg();
String leaderboardGroup();
String pleaseEnterNonEmptyDescription();
String groupWithThisNameAlreadyExists();
String detailsOfLeaderboardGroup();
String edit();
String save();
String abort();
String noLeaderboardGroupWithNameFound(String groupName);
String overview();
String welcomeToSailingAnalytics();
String welcomeToSailingAnalyticsBody();
String home();
String clickAndDragToZoomIn();
String windSpeed();
String allTimesInUTC();
String autoZoomTo();
String autoZoomToBoats();
String autoZoomToBuoys();
String autoZoomOff();
String autoZoomToTails();
String autoZoomToWindSensors();
String autoZoomSelectedCompetitors();
String bearing();
String zoom();
String stepSizeMustBeGreaterThanNull();
String stepSizeInSeconds();
String refreshInterval();
String refreshIntervalMustBeGreaterThanXSeconds(String seconds);
String competitorCharts();
String selectAtLeastOneCompetitor();
String directionChange();
String speedChange();
String degreesShort();
String untracked();
String delayForLiveMode();
String notAvailable();
String details();
String noGroupSelected();
String combinedWindSourceTypeName();
String courseBasedWindSourceTypeName();
String trackBasedEstimationWindSourceTypeName();
String expeditionWindSourceTypeName();
String webWindSourceTypeName();
String clickChartToSetTime();
String position();
String windSourcesUsed();
String errorTryingToUpdateWindSourcesToExclude(String raceName, String message);
String feedback();
String startStopPlaying();
String backToLive();
String slowPlaySpeedDown();
String speedPlaySpeedUp();
String showHideComponent(String localizedShortName);
String degreesBoatToTheWind();
String racesInLeaderboard();
String leaderboardsInGroup();
String replication();
String errorFetchingReplicaData(String message);
String averageCrossTrackErrorInMeters();
String enterMaster();
String errorStartingReplication(String hostname, String exchangeName, String message);
String helpLines();
String startLine();
String finishLine();
String advantageLine();
String courseMiddleLine();
String messagingPortNumber();
String servletPortNumber();
String registeredAt(String string);
String replicatingFromMaster(String hostname, int jmsPort, int servletPort);
String showWindSpeedSeries();
String showWindDirectionSeries();
String fleet();
String boatClass();
String setDelayToLive();
String pleaseEnterNonEmptyVenue();
String eventWithThisNameAlreadyExists();
String venue();
String pleaseSelectABoatClass();
String regattaWithThisNameAlreadyExists();
String seriesWithThisNameAlreadyExists();
String fleetWithThisNameAlreadyExists();
String fleets();
String series();
String splitFleet();
String color();
String medalSeries();
String noColor();
String pleaseSelectARegatta();
String addFleet();
String doYouReallyWantToRemoveRegatta(String name);
String errorLoadingScoreCorrectionProviders(String message);
String selectResultListToImportFrom();
String of();
String errorObtainingScoreCorrections(String scoreCorrectionProviderName, String eventName, String boatClassName,
String string, String message);
String assignRaceNumbersToRaceColumns();
String importOfficialResults();
String selectAll();
String apply();
String successfullyUpdatedScores();
String errorUpdatingScoresForLeaderboard(String leaderboardName, String message);
String maneuverTypesToShowWhenCompetitorIsClicked();
String simulateWithStartTimeNow();
String boatClassDoesNotMatchSelectedRegatta(String boatClass, String regattaName);
String regattaExistForSelectedBoatClass();
String reload();
String addRegatta();
String exchangeName();
String course();
String courseLayout();
String buoy();
String gate();
String buoys();
String waypoint();
String showAllCompetitors();
String boatTails();
String maximalCount();
String maxVisibleCompetitorsCountMustBePositive();
String fregResultImportUrls();
String errorRefreshingFregUrlList(String message);
String successfullyUpdatedFregUrls();
String errorRemovingFregUrls(String message);
String pleaseEnterNonEmptyUrl();
String addFragUrl();
String errorAddingFragUrl(String message);
String errorTryingToObtainLeaderboardContents(String message);
String lastScoreUpdate();
String warningBrowserUnsupported();
String newMark();
String controlPoint();
String errorUpdatingRaceCourse(String message);
String successfullyUpdatedCourse();
String selectOneMarkOrTwoMarksForGate();
String errorTryingToObtainTheMarksOfTheRace(String message);
String errorTryingToObtainRaceCourse(String message);
String insertWaypointBeforeSelected();
String insertWaypointAfterSelected();
String scoringSchemeLowPointSystem();
String scoringSchemeHighPointSystem();
String scoringSystem();
String createFlexibleLeaderboard();
String createRegattaLeaderboard();
String editFlexibleLeaderboard();
String editRegattaLeaderboard();
String noRegatta();
String useOverallLeaderboard();
String overallStandings();
String scoringSchemeHighPointEssOverall();
String scoringSchemeHighPointLastBreaksTie();
String type();
String actionAddRaces();
String racesWithNamePrefix();
String maximumSpeedOverGroundInKnots();
String totalTimeSailedDownwindInSeconds();
String totalTimeSailedUpwindInSeconds();
String totalTimeSailedReachingInSeconds();
String totalTimeSailedInSeconds();
String overallDetailsToShow();
String hhmmssUnit();
String actionAddWindData();
String valueMustBeBetweenMinMax(String name, String minValue, String maxValue);
String optional();
String pleaseEnterAValue();
String latitude();
String longitude();
String actionAddEvent();
String publicationUrl();
String suppress();
String isPublic();
String unsuppress();
String suppressedCompetitors();
String pleaseSelectASeries();
String pleaseSelectARace();
String displayGroupsInReverseOrder();
String actionConfigureUrl();
String configureLeaderboardUrlDescription();
String embedded();
String mediaPanel();
String url();
String mimeType();
String title();
String reallyRemoveMediaTrack(String mediaTrackTitle);
String duration();
String addMediaTrack();
String addYoutubeTrack();
String youtubeId();
String additionalUrlSettings();
String restrictToSingleSelectedRace();
String expandSelectedRace();
String showRaceDetails();
String numberOfRaces();
String numberOfRacesMustBeNonNegativeNumber();
String chooseTheWayYouSelectRaces();
String selectFromAllRaces();
String selectANumberOfRaces();
String numberOfLastNRaces();
String expandLastRace();
String factor();
String errorUpdatingIsMedalRace(String message);
String maneuverLoss();
String averageManeuverLossInMeters();
String averageTackLossInMeters();
String averageJibeLossInMeters();
String shape();
String pattern();
String legend();
String live();
String swissTimingArchiveConnector();
String errorFetchingRankingChartData(String message);
String loadingCompetitorData();
String rankNAfterRace(long l, String string);
String afterRace();
String showRankChart();
String overallLeaderboardSelection();
String showOverallLeaderboardOnSamePage();
String errorTryingToObtainOverallLeaderboards(String message);
String finished();
String passedTo(String name);
String gapChangeSinceLegStartInSeconds();
String sideToWhichMarkAtLegStartWasRounded();
String raceIsLive(String raceName);
String racesAreLive(String raceNames);
String scoringSchemeHighPointFirstGetsTen();
String knotsUnit();
String averageJibeLossInMetersTooltip();
String averageManeuverLossInMetersTooltip();
String averageTackLossInMetersTooltip();
String currentLegTooltip();
String distanceTraveledTooltip();
String estimatedTimeToNextWaypointInSecondsTooltip();
String gapToLeaderInSecondsTooltip();
String averageSpeedInKnotsTooltip();
String jibeTooltip();
String maximumSpeedOverGroundInKnotsTooltip();
String numberOfManeuversTooltip();
String penaltyCircleTooltip();
String raceAverageSpeedInKnotsTooltip();
String currentSpeedOverGroundInKnotsTooltip();
String windwardDistanceToLeaderInMetersTooltip();
String raceDistanceTraveledTooltip();
String rankTooltip();
String rankGainTooltip();
String tackTooltip();
String timeTooltip();
String totalTimeSailedDownwindInSecondsTooltip();
String totalTimeSailedInSecondsTooltip();
String totalTimeSailedReachingInSecondsTooltip();
String totalTimeSailedUpwindInSecondsTooltip();
String windwardDistanceToGoInMetersTooltip();
String averageCrossTrackErrorInMetersTooltip();
String raceAverageCrossTrackErrorInMetersTooltip();
String gapChangeSinceLegStartInSecondsTooltip();
String velocityMadeGoodInKnotsTooltip();
String sideToWhichMarkAtLegStartWasRoundedTooltip();
}
@@ -1,462 +1,486 @@
helloWorld=Hello World
kielWeel2011=Kiel Week 2011
stgAccount=STG Account
tracTracEvents=TracTrac Events
swissTimingEvents=SwissTiming Events
trackedBefore=History of tracked events
listRaces=List Races
wind=Wind
windPanelLabel=This is the Wind Panel which so far is completely empty.
refresh=Refresh
remove=Remove
windSource=Wind Source
dampeningInterval=Dampening Interval
map=Map
race=Race
races=Races
tracked=tracked
time=Time
playSpeed=Play speed
playSpeedHelp=Use "1" for regular play-back speed, "2" for double-speed playback and so on
playModeLive=Live
playModeReplay=Replay Mode
timeDelay=Delay
timeDelayHelp=Leave empty to replay at arbitrary times; enter seconds (e.g., "60" for one minute or "0" for none) of delay before live data feed
speedInKnots=Speed (kn)
fromDeg=From (deg)
noRacesYet=No Races Yet
total=\u03A3
carry=Accumulated
competitor=Competitor
competitors=Competitors
defaultLeaderboard=Default Leaderboard
noSuchLeaderboard=No such leaderboard
leaderboardConfiguration=Leaderboard Configuration
newDotDotDot=New...
editScores=Edit Scores...
columnNamesInSelectedLeaderboard=Race Names in Selected Leaderboard
addDotDotDot=Add...
renameDotDotDot=Rename...
trackedRaceConnectedToSelectedRaceName=Tracked Race Connected to Selected Race Name
linkToColumn=Link to Column
unlink=Unlink
leaderboardName=Leaderboard Name
cancel=Cancel
pleaseEnterAName=Please enter a name
discardRacesFromHowManyStartedRacesOn=Discard one more race starting with how many started races
leaderboardWithThisNameAlreadyExists=Leaderboard with this name already exists
discardThresholdsMustBeNumeric=Discard thresholds must be numeric
discardThresholdsMustBeAscending=Discard thresholds must be ascending
discarding=Discarding
startingFromNumberOfRaces=Starting from how many races
renameLeaderboard=Rename Leaderboard
addColumnToLeaderboard=Add Column to Leaderboard
pleaseEnterNameForNewRaceColumn=Please enter a name for new race column
ok=OK
medalRace=Medal Race
renameRace=Rename Race
openSelectedLeaderboard=Open Selected Leaderboard
rank=Rank
totalRank=Total rank
collapse=-
expand=+
leg=L
distanceInMeters=Distance
distanceInMetersUnit=m
averageSpeedInKnots=\u2205 Speed
averageSpeedInKnotsUnit=kts
rankGain=Rank Gain
sapSailingAnalytics=Sailing Analytics
leaderboard=Leaderboard
leaderboards=Leaderboards
leaderboardSettings=Leaderboard Settings
settings=Settings (e.g., leg detail selection)
selectAtLeastOneLegDetail=Select at least one leg detail
currentSpeedOverGroundInKnots=SOG
currentSpeedOverGroundInKnotsUnit=kts
estimatedTimeToNextWaypointInSeconds=ETA
estimatedTimeToNextWaypointInSecondsUnit=s
gapToLeaderInSeconds=Gap to leader
gapToLeaderInSecondsUnit=s
velocityMadeGoodInKnots=VMG
velocityMadeGoodInKnotsUnit=kts
windwardDistanceToGoInMeters=Windward distance to go
windwardDistanceToLeaderInMeters=Windward Distance To Leader
windwardDistanceToGoInMetersUnit=m
name=Name
leaveEmptyForDefault=Leave empty for default
trackNewEvent=Track New event
trackableRaces=Trackable Races
trackWind=Track Wind
regattaName=Regatta name
eventName=Event name
event=Event
startTime=Start time
regatta=Regatta
regattas=Regattas
startTracking=Start tracking
stopTracking=Stop tracking
connections=Connections
historyOfConnections=History of connections
defineNewConnection=Define a new connection
trackedRaces=Tracked races
canSendRequests=Can send requests
connectAndReadRaces=Connect and read races
ports=Ports
liveData=Live data
storedData=Stored data
uris=URIs
jsonUrl=JSON URL
livePort=Port Live Data
storedPort=Port Stored Data
liveUri=Live URI
storedUri=Stored URI
eventsConnectedTo=Events Currently Tracked
hostname=Hostname
declinationCheckbox=Correct Wind Bearing by Declination
raceStartTrackingColumn=Tracking Started
pauseAutomaticRefresh=Pause automatic refresh
autoRefresh=Refresh automatically
delayInSeconds=Delay (s)
delayBetweenAutoAdvances=Delay between auto-updates in seconds:
delayMustBeNonNegative=The delay must be greater than zero
chooseUpdateIntervalOfAtLeastOneSecond=Choose update interval of at least one second
errorSettingWindForRace=Error setting wind for race
errorFetchingWindInformationForRace=Error fetching wind information for race
errorWhileTryingToSetWindSourceForRace=Error while trying to set "wind starts upwind" flag
inEvent=in event
to=to
showEstimatedWind=Show estimated wind
timing=Timing
raceDetailsToShow=Race Details
overallDetailsToShow=Overall Details
legDetailsToShow=Leg Details
columnMoveUp=Up
columnMoveDown=Down
port=Port
raceStartTimeColumn=Race Started
showOnlySelectedCompetitors=Show only selected competitors
showSelectedCompetitorsInfo=Show info box for selected competitors
tailLength=Tail length (s)
selectedRaces=Which races would you like to display?
lengthInSeconds=Length (s)
stressTest=Stress Test
numberOfManeuvers=Maneuvers
tacks=Tacks
jibes=Jibes
penaltyCircles=Penalty Circles
medalRaceIsNull=Medalrace value not allowed
configuration=Configuration
maneuverTypes=Maneuvers
chooseChart=Choose chart
distanceTraveled=Distance Traveled
velocityMadeGoodLong=Velocity Made Good
speedOverGroundLong=Speed Over Ground
gapToLeaderLong=Gap To Leader
pointsToLoad=Points to load
speed=Speed
distance=Distance
in=in
secondsUnit=s
metersUnit=m
failedToLoadRaceData=Failed to laod race data.
close=Close
compareCompetitors=Compare competitors
description=Description
sailNumber=Sail number
country=Country
no3LetterCodes=Unable to find the IOC 3-letter-codes.
add=Add
delete=Delete
showCharts=Show charts
raceWithThisNameAlreadyExists=A race with that name already exists.
raceWithThisNameAlreadyExistsInRegatta=A race with that name already exists in this regatta.
headUp=Head up
bearAway=Bear away
tack=Tack
jibe=Jibe
penaltyCircle=Penalty circle
markPassing=Mark passing
mark=Mark
otherManeuver=Unknown maneuver
douglasPeuckerPoints=Douglas peucker points
filterRacesByName=Filter races by name
trackSettings=Track settings
actionEdit=Edit
actionEditScores=Edit scores
actionOpenBrowser=Open in Browser
actionRemove=Remove
actionEditRaces=Edit races
actionRaceEdit=Edit or rename race
actionRaceUnlink=Unlink race
actionRaceRemove=Remove race
filterLeaderboardsByName=Filter leaderboards by name
windwardDistanceToLeader=Windward distance to leader
actions=Actions
islinked=Is linked
yes=Yes
no=No
hoverOverAPoint=Hover over a point for details
noSelection=No selection
raceIsKnownToStartUpwind=Race starts with upwind leg
events=Events
settingsForComponent=Settings for {0}
noEventsFound=No events were found
noEventSelected=No event selected
noLeaderboardsFound=No leaderboards were found
searchEvents=Search for events
location=Location
from=From
until=Until
onlyLiveEvents=Only live events
locationNotAvailable=Location not available
startDateNotAvailable=Start date not available
startDate=Start date
unknownManeuver=Unknown maneuver
tailLengthMustBePositive=the tail length must be a number greater than zero.
failedToLoadRaceInformation=Failed to load race information: {0}
competitorPassedMarkAtDate={0} passed {1} at {2}
valueForCompetitorAt={0} at {1}: {2}
reallyRemoveRace=Do you really want to remove the race ''{0}''?
showDetails=Show details
hideLeaderboard=Hide leaderboard
hideLeaderboards=Hide leaderboards
showLeaderboard=Show leaderboard
hideRaces=Hide races
showMap=Show map
hideMap=Hide map
noLeaderboardSelected=No leaderboard selected
leaderboardGroups=Leaderboard groups
filterLeaderboardGroupsByName=Filter leaderboard groups by name
createNewLeaderboardGroup=Create leaderboard group
leaderboardGroupConfiguration=Leaderboard Group Configuration
legs=Legs
currentLeg=On Leg
leaderboardGroup=Leaderboard Group
pleaseEnterNonEmptyDescription=Please enter a non-empty description
groupWithThisNameAlreadyExists=A leaderboard group with this name already exists.
detailsOfLeaderboardGroup=Details of leaderboard group
edit=Edit
save=Save
abort=Abort
noLeaderboardGroupWithNameFound=No leaderboard group with the name {0} found
overview=Overview
welcomeToSailingAnalytics=Welcome to SAP Sailing Analytics
welcomeToSailingAnalyticsBody=Understanding what happens out on the race course isn''t always easy. To help solve this challenge and bring the excitement of sailing to the fans, we have developed a leader board based on SAP analytics.\
Through analyzing GPS data together with integrated wind measurements from sensors out on the race course, the leader board displays information such as in-race ranking, average speeds, distance travelled, ETA (estimated time of arrival at the next mark rounding), gaps to leader, gains and losses per leg.\
\
Check out the results for yourself to see who triumphed - and how they did it.
home=Home
clickAndDragToZoomIn=Click and drag in the plot area to zoom in
windSpeed=Wind speed (kts)
allTimesInUTC=All times in UTC
autoZoomTo=Auto zoom to
autoZoomToBoats=Boats
autoZoomToBuoys=Buoys
autoZoomToWindSensors=Wind sensors
autoZoomOff=Off
autoZoomToTails=Tails
autoZoomSelectedCompetitors=Zoom only to selected competitors
bearing=Bearing
zoom=Zoom
stepSizeMustBeGreaterThanNull=Step size must be greater than 0
stepSizeInSeconds=Step size in seconds
refreshInterval=Refresh interval (s)
refreshIntervalMustBeGreaterThanXSeconds=Refresh interval must be greater than {0} seconds
competitorCharts=Competitor charts
selectAtLeastOneCompetitor=To show the competitor charts, select at least one competitor
directionChange=Direction change
speedChange=Speed change
degreesShort=deg
untracked=Untracked
delayForLiveMode=Delay for live mode:
notAvailable=Not available
details=Details
noGroupSelected=No group selected
combinedWindSourceTypeName=Combined
courseBasedWindSourceTypeName=Course Layout
trackBasedEstimationWindSourceTypeName=Estimation
expeditionWindSourceTypeName=Measured
webWindSourceTypeName=Manual
clickChartToSetTime=Click on the chart to set the time
position=Position
windSourcesUsed=Wind Sources Used
errorTryingToUpdateWindSourcesToExclude=Error trying to update wind sources to exclude for race {0}: {1}
feedback=Feedback
startStopPlaying=Start/Stop playing
backToLive=Jump back to live time point
slowPlaySpeedDown=Slow play speed down
speedPlaySpeedUp=Speed play speed up
showHideComponent=Show/Hide {0}
degreesBoatToTheWind=Angle to wind
racesInLeaderboard=Races in leaderboard
leaderboardsInGroup=Leaderboards in group
replication=Replication
errorFetchingReplicaData=Error fetching replica data: {0}
averageCrossTrackErrorInMeters=\u2205 XTE
enterMaster=Hostname of Master Instance
errorStartingReplication=Error starting replication from host {0} / exchange {1}: {2}
helpLines=Help lines
startLine=Start line
finishLine=Finish line
advantageLine=Advantage line
courseMiddleLine=Course middle line
messagingPortNumber=Messaging port number (0 for default)
servletPortNumber=Servlet port number
registeredAt=Registered at {0}
replicatingFromMaster=Replicating from master {0}, messaging port {1}, servlet port {2}
showWindSpeedSeries=Show wind speed data
showWindDirectionSeries=Show wind directions data
fleet=Fleet
boatClass=Boat Class
setDelayToLive=Set delay to live
pleaseEnterNonEmptyVenue=Please enter a venue.
eventWithThisNameAlreadyExists=An event with this name already exists.
venue=Venue
pleaseSelectABoatClass=Please select a boat class.
regattaWithThisNameAlreadyExists=A regatta with this name already exists.
seriesWithThisNameAlreadyExists=A series with this name already exists.
fleetWithThisNameAlreadyExists=A fleet with this name already exists.
fleets=Fleets
series=Series
splitFleet=Split fleet
color=Color
medalSeries=Medal Series
noColor=No color
pleaseSelectARegatta=Please select a regatta.
addFleet=Add fleet
doYouReallyWantToRemoveRegatta=Do you really want to remove the regatta "{0}"?
errorLoadingScoreCorrectionProviders=Error loading score correction providers: {0}
selectResultListToImportFrom=Select result list to import from
of=of
errorObtainingScoreCorrections=Error obtaining score corrections from provider {0} and event {1} for boat class {2} published on {3}: {4}
assignRaceNumbersToRaceColumns=Assign race numbers of official results to leaderboard race columns
importOfficialResults=Import official results...
selectAll=Select all
apply=Apply
successfullyUpdatedScores=Successfully updated scores
errorUpdatingScoresForLeaderboard=Error updating scores for leaderboard {0}: {1}
maneuverTypesToShowWhenCompetitorIsClicked=Maneuver types to show when competitor is clicked
simulateWithStartTimeNow=Simulate with "now" as start time
boatClassDoesNotMatchSelectedRegatta=The selected races contain boat classes which are not the same as the boat class ''{0}'' of the selected regatta.\
Do you really want to use the regatta ''{1}''?
regattaExistForSelectedBoatClass=There is at least one regatta for the selected boat classes.\
Do you really want to use the ''no regatta'' selection?
reload=Reload
addRegatta=Add Regatta...
exchangeName=Exchange Name
course=Course
courseLayout=Course layout
buoy=Buoy
gate=Gate
buoys=Buoys
waypoint=Waypoint
showAllCompetitors=Show all competitors
boatTails=Boat tails
maximalCount=Maximal count
maxVisibleCompetitorsCountMustBePositive=The maximal amount of visible competitors must be greater than zero.
fregResultImportUrls=FREG URLs
errorRefreshingFregUrlList=Error refreshing FREG URL list: {0}
successfullyUpdatedFregUrls=Successfully updated FREG URL list
errorRemovingFregUrls=Error removing FREG URLs: {0}
pleaseEnterNonEmptyUrl=Please enter a non-empty URL
addFragUrl=Add FRAG Result URL
errorAddingFragUrl=Error adding FRAG URL: {0}
errorTryingToObtainLeaderboardContents=Error trying to obtain leaderboard contents: {0}
lastScoreUpdate=Last Score Update
warningBrowserUnsupported=This website is not optimized for your browser. Please switch to a newer one like Firefox or Chrome.
newMark=New Mark
controlPoint=Mark/Gate
errorUpdatingRaceCourse=Error updating race course: {0}
successfullyUpdatedCourse=Successfully updated race course
selectOneMarkOrTwoMarksForGate=Select a single mark or two marks to create a gate
errorTryingToObtainTheMarksOfTheRace=Error trying to obtain the marks of the race course: {0}
errorTryingToObtainRaceCourse=Error trying to obtain the race course: {0}
insertWaypointBeforeSelected=Insert waypoint before selected
insertWaypointAfterSelected=Insert waypoint after selected
scoringSchemeLowPointSystem=Low Point System
scoringSchemeHighPointSystem=High Point System
scoringSchemeHighPointEssOverall=High Point System ESS Overall
scoringSchemeHighPointLastBreaksTie=High Point System, Last Race Breaks Tie
scoringSystem=Scoring system
createFlexibleLeaderboard=Create flexible leaderboard
createRegattaLeaderboard=Create regatta leaderboard
editFlexibleLeaderboard=Edit flexible leaderboard
editRegattaLeaderboard=Edit regatta leaderboard
noRegatta=No regatta
useOverallLeaderboard=Use Overall leaderboard
overallStandings=Overall Standings
type=Type
actionAddRaces=Add races
racesWithNamePrefix=races with name prefix
maximumSpeedOverGroundInKnots=Max SOG
totalTimeSailedDownwindInSeconds=Total time downwind
totalTimeSailedUpwindInSeconds=Total time upwind
totalTimeSailedReachingInSeconds=Total time reaching
totalTimeSailedInSeconds=Total time
hhmmssUnit=hh:mm:ss
actionAddWindData=Add wind data
valueMustBeBetweenMinMax=The value of ''{0}'' must be between {1} and {2}.
optional=optional
pleaseEnterAValue=Please enter a value.
latitude=Latitude
longitude=Longitude
actionAddEvent=Add Event
publicationUrl=Publication URL
suppress=Suppress
isPublic=Is public
suppress=Suppress
unsuppress=Unsuppress
suppressedCompetitors=Suppressed Competitors
mediaPanel=Audio & Video
url=URL
mimeType=MIME Type
title=Title
duration=Duration (h:mm:ss.ms)
addMediaTrack=Add Audio/Video
addYoutubeTrack=Add Youtube
youtubeId=Youtube Id
reallyRemoveMediaTrack=Do you really want to remove media track ''{0}''?
pleaseSelectASeries=Please select a series
pleaseSelectARace=Please select a race
displayGroupsInReverseOrder=Display groups in reverse order
actionConfigureUrl=Configure URL
configureLeaderboardUrlDescription=Configure a leaderboard and obtain the resulting URL from the link
embedded=Embedded
additionalUrlSettings=Additional URL Settings
restrictToSingleSelectedRace=Restrict to single selected race
expandSelectedRace=Expand selected race
showRaceDetails=Allow for race details
numberOfRaces=Number of races
numberOfRacesMustBeNonNegativeNumber=Please enter the number of last races to be displayed
chooseTheWayYouSelectRaces=Choose the way you select races
selectFromAllRaces=Select from all races
selectANumberOfRaces=Select a number of races
numberOfLastNRaces=Number of most current races to show
expandLastRace=Always expand last race shown
factor=Factor
errorUpdatingIsMedalRace=Error updating the medal race setting: {0}
maneuverLoss=Maneuver loss
averageManeuverLossInMeters=\u2205 Maneuver Loss
averageTackLossInMeters=\u2205 Tack Loss
averageJibeLossInMeters=\u2205 Jibe Loss
shape=Shape
pattern=Pattern
legend=Legend
live=live
swissTimingArchiveConnector=SwissTiming Archived Events
errorFetchingRankingChartData=Error fetching ranking chart data: {0}
loadingCompetitorData=Loading competitor data...
rankNAfterRace=Rank {0} after race {1}
afterRace=after race
showRankChart=Show rank chart
overallLeaderboardSelection=Overall Leaderboard
showOverallLeaderboardOnSamePage=Show overall leaderboard on same page
errorTryingToObtainOverallLeaderboards=Error trying to obtain overall leaderboards: {0}
finished=finished
passedTo=passed to {0}
gapChangeSinceLegStartInSeconds=Gap Change
sideToWhichMarkAtLegStartWasRounded=Mark rounded to
raceIsLive=Race {0} is live
helloWorld=Hello World
kielWeel2011=Kiel Week 2011
stgAccount=STG Account
tracTracEvents=TracTrac Events
swissTimingEvents=SwissTiming Events
trackedBefore=History of tracked events
listRaces=List Races
wind=Wind
windPanelLabel=This is the Wind Panel which so far is completely empty.
refresh=Refresh
remove=Remove
windSource=Wind Source
dampeningInterval=Dampening Interval
map=Map
race=Race
races=Races
tracked=tracked
time=Time
timeTooltip=Time the competitor sailed on this leg.
playSpeed=Play speed
playSpeedHelp=Use "1" for regular play-back speed, "2" for double-speed playback and so on
playModeLive=Live
playModeReplay=Replay Mode
timeDelay=Delay
timeDelayHelp=Leave empty to replay at arbitrary times; enter seconds (e.g., "60" for one minute or "0" for none) of delay before live data feed
speedInKnots=Speed (kn)
fromDeg=From (deg)
noRacesYet=No Races Yet
total=\u03A3
carry=Accumulated
competitor=Competitor
competitors=Competitors
defaultLeaderboard=Default Leaderboard
noSuchLeaderboard=No such leaderboard
leaderboardConfiguration=Leaderboard Configuration
newDotDotDot=New...
editScores=Edit Scores...
columnNamesInSelectedLeaderboard=Race Names in Selected Leaderboard
addDotDotDot=Add...
renameDotDotDot=Rename...
trackedRaceConnectedToSelectedRaceName=Tracked Race Connected to Selected Race Name
linkToColumn=Link to Column
unlink=Unlink
leaderboardName=Leaderboard Name
cancel=Cancel
pleaseEnterAName=Please enter a name
discardRacesFromHowManyStartedRacesOn=Discard one more race starting with how many started races
leaderboardWithThisNameAlreadyExists=Leaderboard with this name already exists
discardThresholdsMustBeNumeric=Discard thresholds must be numeric
discardThresholdsMustBeAscending=Discard thresholds must be ascending
discarding=Discarding
startingFromNumberOfRaces=Starting from how many races
renameLeaderboard=Rename Leaderboard
addColumnToLeaderboard=Add Column to Leaderboard
pleaseEnterNameForNewRaceColumn=Please enter a name for new race column
ok=OK
medalRace=Medal Race
renameRace=Rename Race
openSelectedLeaderboard=Open Selected Leaderboard
rank=Rank
rankTooltip=The position of the competitor.
totalRank=Total rank
collapse=-
expand=+
leg=L
distanceInMeters=Distance
averageSpeedInKnots=\u2205 Speed
averageSpeedInKnotsTooltip=The average speed over ground during this leg,\ncalculated with the division of the traveled distance and the needed time.
raceAverageSpeedInKnotsTooltip=The average speed over ground during this race,\ncalculated with the division of the traveled distance and the needed time.
rankGain=Rank Gain
rankGainTooltip=The difference of the position from the current and the past leg.
sapSailingAnalytics=Sailing Analytics
leaderboard=Leaderboard
leaderboards=Leaderboards
leaderboardSettings=Leaderboard Settings
settings=Settings (e.g., leg detail selection)
selectAtLeastOneLegDetail=Select at least one leg detail
currentSpeedOverGroundInKnots=SOG
currentSpeedOverGroundInKnotsTooltip=The current speed over ground.
estimatedTimeToNextWaypointInSeconds=ETA
estimatedTimeToNextWaypointInSecondsTooltip=The estimated time that the competitor needs to reach the next waypoint.
gapToLeaderInSeconds=Gap to leader
gapToLeaderInSecondsTooltip=The time a competitor would need to reach the leader.
velocityMadeGoodInKnots=VMG
velocityMadeGoodInKnotsTooltip=The velocity made good, which is the speed towards the rhumb line.
windwardDistanceToGoInMeters=Windward distance to go
windwardDistanceToGoInMetersTooltip=Windward distance from the positon of the competitor, to the end of the leg.
windwardDistanceToLeaderInMeters=Windward Distance To Leader
windwardDistanceToLeaderInMetersTooltip=Windward distance of the competitor to the leader.
name=Name
leaveEmptyForDefault=Leave empty for default
trackNewEvent=Track New event
trackableRaces=Trackable Races
trackWind=Track Wind
regattaName=Regatta name
eventName=Event name
event=Event
startTime=Start time
regatta=Regatta
regattas=Regattas
startTracking=Start tracking
stopTracking=Stop tracking
connections=Connections
historyOfConnections=History of connections
defineNewConnection=Define a new connection
trackedRaces=Tracked races
canSendRequests=Can send requests
connectAndReadRaces=Connect and read races
ports=Ports
liveData=Live data
storedData=Stored data
uris=URIs
jsonUrl=JSON URL
livePort=Port Live Data
storedPort=Port Stored Data
liveUri=Live URI
storedUri=Stored URI
eventsConnectedTo=Events Currently Tracked
hostname=Hostname
declinationCheckbox=Correct Wind Bearing by Declination
raceStartTrackingColumn=Tracking Started
pauseAutomaticRefresh=Pause automatic refresh
autoRefresh=Refresh automatically
delayInSeconds=Delay (s)
delayBetweenAutoAdvances=Delay between auto-updates in seconds:
delayMustBeNonNegative=The delay must be greater than zero
chooseUpdateIntervalOfAtLeastOneSecond=Choose update interval of at least one second
errorSettingWindForRace=Error setting wind for race
errorFetchingWindInformationForRace=Error fetching wind information for race
errorWhileTryingToSetWindSourceForRace=Error while trying to set "wind starts upwind" flag
inEvent=in event
to=to
showEstimatedWind=Show estimated wind
timing=Timing
raceDetailsToShow=Race Details
overallDetailsToShow=Overall Details
legDetailsToShow=Leg Details
columnMoveUp=Up
columnMoveDown=Down
port=Port
raceStartTimeColumn=Race Started
showOnlySelectedCompetitors=Show only selected competitors
showSelectedCompetitorsInfo=Show info box for selected competitors
tailLength=Tail length (s)
selectedRaces=Which races would you like to display?
lengthInSeconds=Length (s)
stressTest=Stress Test
numberOfManeuvers=Maneuvers
numberOfManeuversTooltip=The amount of the sailed maneuvers in this leg.
tacks=Tacks
jibes=Jibes
penaltyCircles=Penalty Circles
medalRaceIsNull=Medalrace value not allowed
configuration=Configuration
maneuverTypes=Maneuvers
chooseChart=Choose chart
distanceTraveled=Distance Traveled
distanceTraveledTooltip=The distance traveled from the leg start to the end\nor to the current time point, if the leg isn''t finished.
raceDistanceTraveledTooltip=The distance traveled from the race start to the end\nor to the current time point, if the race isn''t finished.
velocityMadeGoodLong=Velocity Made Good
speedOverGroundLong=Speed Over Ground
gapToLeaderLong=Gap To Leader
pointsToLoad=Points to load
speed=Speed
distance=Distance
in=in
secondsUnit=s
metersUnit=m
failedToLoadRaceData=Failed to laod race data.
close=Close
compareCompetitors=Compare competitors
description=Description
sailNumber=Sail number
country=Country
no3LetterCodes=Unable to find the IOC 3-letter-codes.
add=Add
delete=Delete
showCharts=Show charts
raceWithThisNameAlreadyExists=A race with that name already exists.
raceWithThisNameAlreadyExistsInRegatta=A race with that name already exists in this regatta.
headUp=Head up
bearAway=Bear away
tack=Tack
tackTooltip=The amount of the sailed tacks in this race.
jibe=Jibe
jibeTooltip=The amount of the sailed jibes in this race.
penaltyCircle=Penalty circle
penaltyCircleTooltip=The amount of the sailed penalty circles in this race.
markPassing=Mark passing
mark=Mark
otherManeuver=Unknown maneuver
douglasPeuckerPoints=Douglas peucker points
filterRacesByName=Filter races by name
trackSettings=Track settings
actionEdit=Edit
actionEditScores=Edit scores
actionOpenBrowser=Open in Browser
actionRemove=Remove
actionEditRaces=Edit races
actionRaceEdit=Edit or rename race
actionRaceUnlink=Unlink race
actionRaceRemove=Remove race
filterLeaderboardsByName=Filter leaderboards by name
actions=Actions
islinked=Is linked
yes=Yes
no=No
hoverOverAPoint=Hover over a point for details
noSelection=No selection
raceIsKnownToStartUpwind=Race starts with upwind leg
events=Events
settingsForComponent=Settings for {0}
noEventsFound=No events were found
noEventSelected=No event selected
noLeaderboardsFound=No leaderboards were found
searchEvents=Search for events
location=Location
from=From
until=Until
onlyLiveEvents=Only live events
locationNotAvailable=Location not available
startDateNotAvailable=Start date not available
startDate=Start date
unknownManeuver=Unknown maneuver
tailLengthMustBePositive=the tail length must be a number greater than zero.
failedToLoadRaceInformation=Failed to load race information: {0}
competitorPassedMarkAtDate={0} passed {1} at {2}
valueForCompetitorAt={0} at {1}: {2}
reallyRemoveRace=Do you really want to remove the race ''{0}''?
showDetails=Show details
hideLeaderboard=Hide leaderboard
hideLeaderboards=Hide leaderboards
showLeaderboard=Show leaderboard
hideRaces=Hide races
showMap=Show map
hideMap=Hide map
noLeaderboardSelected=No leaderboard selected
leaderboardGroups=Leaderboard groups
filterLeaderboardGroupsByName=Filter leaderboard groups by name
createNewLeaderboardGroup=Create leaderboard group
leaderboardGroupConfiguration=Leaderboard Group Configuration
legs=Legs
currentLeg=On Leg
currentLegTooltip=The leg, on which the competitor currently is.
leaderboardGroup=Leaderboard Group
pleaseEnterNonEmptyDescription=Please enter a non-empty description
groupWithThisNameAlreadyExists=A leaderboard group with this name already exists.
detailsOfLeaderboardGroup=Details of leaderboard group
edit=Edit
save=Save
abort=Abort
noLeaderboardGroupWithNameFound=No leaderboard group with the name {0} found
overview=Overview
welcomeToSailingAnalytics=Welcome to SAP Sailing Analytics
welcomeToSailingAnalyticsBody=Understanding what happens out on the race course isn''t always easy. To help solve this challenge and bring the excitement of sailing to the fans, we have developed a leader board based on SAP analytics.\
Through analyzing GPS data together with integrated wind measurements from sensors out on the race course, the leader board displays information such as in-race ranking, average speeds, distance travelled, ETA (estimated time of arrival at the next mark rounding), gaps to leader, gains and losses per leg.\
\
Check out the results for yourself to see who triumphed - and how they did it.
home=Home
clickAndDragToZoomIn=Click and drag in the plot area to zoom in
windSpeed=Wind speed (kts)
allTimesInUTC=All times in UTC
autoZoomTo=Auto zoom to
autoZoomToBoats=Boats
autoZoomToBuoys=Buoys
autoZoomToWindSensors=Wind sensors
autoZoomOff=Off
autoZoomToTails=Tails
autoZoomSelectedCompetitors=Zoom only to selected competitors
bearing=Bearing
zoom=Zoom
stepSizeMustBeGreaterThanNull=Step size must be greater than 0
stepSizeInSeconds=Step size in seconds
refreshInterval=Refresh interval (s)
refreshIntervalMustBeGreaterThanXSeconds=Refresh interval must be greater than {0} seconds
competitorCharts=Competitor charts
selectAtLeastOneCompetitor=To show the competitor charts, select at least one competitor
directionChange=Direction change
speedChange=Speed change
degreesShort=deg
untracked=Untracked
delayForLiveMode=Delay for live mode:
notAvailable=Not available
details=Details
noGroupSelected=No group selected
combinedWindSourceTypeName=Combined
courseBasedWindSourceTypeName=Course Layout
trackBasedEstimationWindSourceTypeName=Estimation
expeditionWindSourceTypeName=Measured
webWindSourceTypeName=Manual
clickChartToSetTime=Click on the chart to set the time
position=Position
windSourcesUsed=Wind Sources Used
errorTryingToUpdateWindSourcesToExclude=Error trying to update wind sources to exclude for race {0}: {1}
feedback=Feedback
startStopPlaying=Start/Stop playing
backToLive=Jump back to live time point
slowPlaySpeedDown=Slow play speed down
speedPlaySpeedUp=Speed play speed up
showHideComponent=Show/Hide {0}
degreesBoatToTheWind=Angle to wind
racesInLeaderboard=Races in leaderboard
leaderboardsInGroup=Leaderboards in group
replication=Replication
errorFetchingReplicaData=Error fetching replica data: {0}
averageCrossTrackErrorInMeters=\u2205 XTE
averageCrossTrackErrorInMetersTooltip=The average cross track error to the rhumb line during this leg.
raceAverageCrossTrackErrorInMetersTooltip=The average cross track error to the rhumb line during this race.
enterMaster=Hostname of Master Instance
errorStartingReplication=Error starting replication from host {0} / exchange {1}: {2}
helpLines=Help lines
startLine=Start line
finishLine=Finish line
advantageLine=Advantage line
courseMiddleLine=Course middle line
messagingPortNumber=Messaging port number (0 for default)
servletPortNumber=Servlet port number
registeredAt=Registered at {0}
replicatingFromMaster=Replicating from master {0}, messaging port {1}, servlet port {2}
showWindSpeedSeries=Show wind speed data
showWindDirectionSeries=Show wind directions data
fleet=Fleet
boatClass=Boat Class
setDelayToLive=Set delay to live
pleaseEnterNonEmptyVenue=Please enter a venue.
eventWithThisNameAlreadyExists=An event with this name already exists.
venue=Venue
pleaseSelectABoatClass=Please select a boat class.
regattaWithThisNameAlreadyExists=A regatta with this name already exists.
seriesWithThisNameAlreadyExists=A series with this name already exists.
fleetWithThisNameAlreadyExists=A fleet with this name already exists.
fleets=Fleets
series=Series
splitFleet=Split fleet
color=Color
medalSeries=Medal Series
noColor=No color
pleaseSelectARegatta=Please select a regatta.
addFleet=Add fleet
doYouReallyWantToRemoveRegatta=Do you really want to remove the regatta "{0}"?
errorLoadingScoreCorrectionProviders=Error loading score correction providers: {0}
selectResultListToImportFrom=Select result list to import from
of=of
errorObtainingScoreCorrections=Error obtaining score corrections from provider {0} and event {1} for boat class {2} published on {3}: {4}
assignRaceNumbersToRaceColumns=Assign race numbers of official results to leaderboard race columns
importOfficialResults=Import official results...
selectAll=Select all
apply=Apply
successfullyUpdatedScores=Successfully updated scores
errorUpdatingScoresForLeaderboard=Error updating scores for leaderboard {0}: {1}
maneuverTypesToShowWhenCompetitorIsClicked=Maneuver types to show when competitor is clicked
simulateWithStartTimeNow=Simulate with "now" as start time
boatClassDoesNotMatchSelectedRegatta=The selected races contain boat classes which are not the same as the boat class ''{0}'' of the selected regatta.\
Do you really want to use the regatta ''{1}''?
regattaExistForSelectedBoatClass=There is at least one regatta for the selected boat classes.\
Do you really want to use the ''no regatta'' selection?
reload=Reload
addRegatta=Add Regatta...
exchangeName=Exchange Name
course=Course
courseLayout=Course layout
buoy=Buoy
gate=Gate
buoys=Buoys
waypoint=Waypoint
showAllCompetitors=Show all competitors
boatTails=Boat tails
maximalCount=Maximal count
maxVisibleCompetitorsCountMustBePositive=The maximal amount of visible competitors must be greater than zero.
fregResultImportUrls=FREG URLs
errorRefreshingFregUrlList=Error refreshing FREG URL list: {0}
successfullyUpdatedFregUrls=Successfully updated FREG URL list
errorRemovingFregUrls=Error removing FREG URLs: {0}
pleaseEnterNonEmptyUrl=Please enter a non-empty URL
addFragUrl=Add FRAG Result URL
errorAddingFragUrl=Error adding FRAG URL: {0}
errorTryingToObtainLeaderboardContents=Error trying to obtain leaderboard contents: {0}
lastScoreUpdate=Last Score Update
warningBrowserUnsupported=This website is not optimized for your browser. Please switch to a newer one like Firefox or Chrome.
newMark=New Mark
controlPoint=Mark/Gate
errorUpdatingRaceCourse=Error updating race course: {0}
successfullyUpdatedCourse=Successfully updated race course
selectOneMarkOrTwoMarksForGate=Select a single mark or two marks to create a gate
errorTryingToObtainTheMarksOfTheRace=Error trying to obtain the marks of the race course: {0}
errorTryingToObtainRaceCourse=Error trying to obtain the race course: {0}
insertWaypointBeforeSelected=Insert waypoint before selected
insertWaypointAfterSelected=Insert waypoint after selected
scoringSchemeLowPointSystem=Low Point System
scoringSchemeHighPointSystem=High Point System
scoringSchemeHighPointEssOverall=High Point System ESS Overall
scoringSchemeHighPointLastBreaksTie=High Point System, Last Race Breaks Tie
scoringSystem=Scoring system
createFlexibleLeaderboard=Create flexible leaderboard
createRegattaLeaderboard=Create regatta leaderboard
editFlexibleLeaderboard=Edit flexible leaderboard
editRegattaLeaderboard=Edit regatta leaderboard
noRegatta=No regatta
useOverallLeaderboard=Use Overall leaderboard
overallStandings=Overall Standings
type=Type
actionAddRaces=Add races
racesWithNamePrefix=races with name prefix
maximumSpeedOverGroundInKnots=Max SOG
maximumSpeedOverGroundInKnotsTooltip=The biggest speed over ground measured in the regatta.
totalTimeSailedDownwindInSeconds=Total time downwind
totalTimeSailedDownwindInSecondsTooltip=The total time, the competitor sailed on downwind in the regatta.
totalTimeSailedUpwindInSeconds=Total time upwind
totalTimeSailedUpwindInSecondsTooltip=The total time, the competitor sailed on upwind in the regatta.
totalTimeSailedReachingInSeconds=Total time reaching
totalTimeSailedReachingInSecondsTooltip=The total time, the competitor sailed on reaching in the regatta.
totalTimeSailedInSeconds=Total time
totalTimeSailedInSecondsTooltip=The total time, the competitor needed for the regatta.
hhmmssUnit=hh:mm:ss
actionAddWindData=Add wind data
valueMustBeBetweenMinMax=The value of ''{0}'' must be between {1} and {2}.
optional=optional
pleaseEnterAValue=Please enter a value.
latitude=Latitude
longitude=Longitude
actionAddEvent=Add Event
publicationUrl=Publication URL
suppress=Suppress
isPublic=Is public
suppress=Suppress
unsuppress=Unsuppress
suppressedCompetitors=Suppressed Competitors
mediaPanel=Audio & Video
url=URL
mimeType=MIME Type
title=Title
duration=Duration (h:mm:ss.ms)
addMediaTrack=Add Audio/Video
addYoutubeTrack=Add Youtube
youtubeId=Youtube Id
reallyRemoveMediaTrack=Do you really want to remove media track ''{0}''?
pleaseSelectASeries=Please select a series
pleaseSelectARace=Please select a race
displayGroupsInReverseOrder=Display groups in reverse order
actionConfigureUrl=Configure URL
configureLeaderboardUrlDescription=Configure a leaderboard and obtain the resulting URL from the link
embedded=Embedded
additionalUrlSettings=Additional URL Settings
restrictToSingleSelectedRace=Restrict to single selected race
expandSelectedRace=Expand selected race
showRaceDetails=Allow for race details
numberOfRaces=Number of races
numberOfRacesMustBeNonNegativeNumber=Please enter the number of last races to be displayed
chooseTheWayYouSelectRaces=Choose the way you select races
selectFromAllRaces=Select from all races
selectANumberOfRaces=Select a number of races
numberOfLastNRaces=Number of most current races to show
expandLastRace=Always expand last race shown
factor=Factor
errorUpdatingIsMedalRace=Error updating the medal race setting: {0}
maneuverLoss=Maneuver loss
averageManeuverLossInMeters=\u2205 Maneuver Loss
averageManeuverLossInMetersTooltip=The average distance loss during any meneuver.
averageTackLossInMeters=\u2205 Tack Loss
averageTackLossInMetersTooltip=The average distance loss during tacks.
averageJibeLossInMeters=\u2205 Jibe Loss
averageJibeLossInMetersTooltip=The average distance loss during jibes.
shape=Shape
pattern=Pattern
legend=Legend
live=live
swissTimingArchiveConnector=SwissTiming Archived Events
errorFetchingRankingChartData=Error fetching ranking chart data: {0}
loadingCompetitorData=Loading competitor data...
rankNAfterRace=Rank {0} after race {1}
afterRace=after race
showRankChart=Show rank chart
overallLeaderboardSelection=Overall Leaderboard
showOverallLeaderboardOnSamePage=Show overall leaderboard on same page
errorTryingToObtainOverallLeaderboards=Error trying to obtain overall leaderboards: {0}
finished=finished
passedTo=passed to {0}
gapChangeSinceLegStartInSeconds=Gap Change
gapChangeSinceLegStartInSecondsTooltip=The change of the gap to the leader since the last leg start.\nA negative number means, that the gap was decreased and \
a positive number means, that it was increased.
sideToWhichMarkAtLegStartWasRounded=Mark rounded to
sideToWhichMarkAtLegStartWasRoundedTooltip=Side to which the mark at leg start was rounded.
raceIsLive=Race {0} is live
racesAreLive=Races {0} are live
scoringSchemeHighPointFirstGetsTen=High Point, winner gets 10 points
scoringSchemeHighPointFirstGetsTen=High Point, winner gets 10 points
knotsUnit=kts
@@ -1,463 +1,487 @@
helloWorld=Hello World
kielWeel2011=Kiel Week 2011
stgAccount=STG Account
tracTracEvents=TracTrac Events
swissTimingEvents=SwissTiming Events
trackedBefore=Historie verfolgter Events
listRaces=Rennen anzeigen
wind=Wind
windPanelLabel=This is the Wind Panel which so far is completely empty.
refresh=Aktualisieren
remove=Löschen
windSource=Windquelle
dampeningInterval=Mittelungsintervall
map=Karte
race=Wettfahrt
races=Wettfahrten
tracked=verfolgt
time=Zeit
playSpeed=Abspielgeschwindigkeit
playSpeedHelp="1" für normale Abspielgeschwindigkeit, "2" für doppelte Geschwindigkeit usw.
playModeLive=Live
playModeReplay=Wiederholung
timeDelay=Verzögerung
timeDelayHelp=Leer für Wiedergabe zu beliebigen Zeitpunkten; Verzögerung des Datenstroms in Sekunden eingeben (z.B. "60" für eine Minute oder "0" für keine)
speedInKnots=Geschwindigkeit (sm/h)
fromDeg=aus (Grad)
noRacesYet=Bisher keine Wettfahrten
total=Gesamt
carry=übertr.
competitor=Wettkampfteilnehmner
competitors=Wettkampfteilnehmner
defaultLeaderboard=Alle Ergebnisse
noSuchLeaderboard=Rangliste nicht gefunden
leaderboardConfiguration=Ranglisten-Konfiguration
newDotDotDot=Neu...
editScores=Punktestand bearbeiten...
columnNamesInSelectedLeaderboard=Wettfahrten-Namen in der selektierten Rangliste
addDotDotDot=Hinzufügen...
renameDotDotDot=Umbenennen...
trackedRaceConnectedToSelectedRaceName=Wettfahrt verbunden mit dem selektierten Wettfahrt-Namen
linkToColumn=Verbindung mit Spalte
unlink=Unlink
leaderboardName=Name Rangliste
cancel=Abbrechen
pleaseEnterAName=Bitte geben Sie einen Namen ein.
discardRacesFromHowManyStartedRacesOn=Discard one more race starting with how many started races
leaderboardWithThisNameAlreadyExists=Eine Rangliste mit diesem Namen existiert bereits.
discardThresholdsMustBeNumeric=Discard thresholds must be numeric
discardThresholdsMustBeAscending=Discard thresholds must be ascending
discarding=Discarding
startingFromNumberOfRaces=Ab wievielen Rennen
renameLeaderboard=Rangliste umbenennen
addColumnToLeaderboard=Spalte zu Rangliste hinzufügen
pleaseEnterNameForNewRaceColumn=Namen für Renn-Spalten eingeben
ok=OK
medalRace=Medal Race
renameRace=Rennen umbenennen
openSelectedLeaderboard=Ausgewählte Rangliste öffnen
rank=Platz
totalRank=Gesamtplatz
collapse=-
expand=+
leg=L
distanceInMeters=Distanz
distanceInMetersUnit=m
averageSpeedInKnots=\u2205 FüG
averageSpeedInKnotsUnit=kn
rankGain=Platz +/-
sapSailingAnalytics=Sailing Analytics
leaderboard=Ergebnisse
leaderboards=Ranglistenlisten
leaderboardSettings=Einstellungen Rangliste
settings=Einstellungen (z.B. Abschnittdetails auswählen)
selectAtLeastOneLegDetail=Mindestens ein Detail auswählen
currentSpeedOverGroundInKnots=FüG
currentSpeedOverGroundInKnotsUnit=kn
estimatedTimeToNextWaypointInSeconds=ETA
estimatedTimeToNextWaypointInSecondsUnit=s
gapToLeaderInSeconds=Abstand zum Führenden
gapToLeaderInSecondsUnit=s
velocityMadeGoodInKnots=VMG
velocityMadeGoodInKnotsUnit=kn
windwardDistanceToGoInMeters=Abstand in Windrichtung zur nächsten Tonne
windwardDistanceToLeaderInMeters=Abstand zum führenden Boot
windwardDistanceToGoInMetersUnit=m
name=Name
leaveEmptyForDefault=Leer für Standardeinstellung
trackNewEvent=Track New event
trackableRaces=Trackable Races
trackWind=Track Wind
regattaName=Name der Regatta
eventName=Event-Name
event=Rennen
startTime=Startzeit
regatta=Regatta
regattas=Regatten
startTracking=Tracking starten
stopTracking=Tracking stoppen
connections=Verbindungen
historyOfConnections=History of connections
defineNewConnection=Definiere eine neue Verbindung
trackedRaces=Tracked races
canSendRequests=Kann Anfragen senden
connectAndReadRaces=Verbinde und hole Wettfahrten
trackSettings=Track Einstellungen
ports=Ports
liveData=Live data
storedData=Stored data
uris=URIs
jsonUrl=JSON URL
livePort=Port Live Data
storedPort=Port Stored Data
liveUri=Live URI
storedUri=Stored URI
eventsConnectedTo=Momentan verfolgte Events
hostname=Hostname
declinationCheckbox=Windrichtung mit Missweisung korrigieren
raceStartTrackingColumn=Tracking Started
pauseAutomaticRefresh=Keine automatische Aktualisierung
autoRefresh=Automatisch aktualisieren
delayInSeconds=Verzögerung (s)
delayMustBeNonNegative=Die Verzögerung muß größer als 0 sein
delayBetweenAutoAdvances=Intervall zwischen Auto-Updates in Sekunden:
chooseUpdateIntervalOfAtLeastOneSecond=Update-Intervall mindestens eine Sekunde
errorSettingWindForRace=Error setting wind for race
errorFetchingWindInformationForRace=Error fetching wind information for race
errorWhileTryingToSetWindSourceForRace=Error while trying to set "wind starts upwind" flag
inEvent=in event
to=to
showEstimatedWind=Zeige den geschätzten Wind
timing=Timing
raceDetailsToShow=Renndetails
overallDetailsToShow=Regatta-Details
legDetailsToShow=Schenkeldetails
columnMoveUp=Hoch
columnMoveDown=Runter
port=Port
raceStartTimeColumn=Rennstart
showOnlySelectedCompetitors=Nur ausgewählte Segler anzeigen
showSelectedCompetitorsInfo=Infobox für ausgewählte Segler anzeigen
tailLength=Schweiflänge (s)
selectedRaces=Welche Rennen möchten Sie angezeigt bekommen?
lengthInSeconds=Länge (s)
stressTest=Stresstest
numberOfManeuvers=Manöver
tacks=Wenden
jibes=Halsen
penaltyCircles=Strafkreise
medalRaceIsNull=Medaillenrennen nicht erlaubt
maneuverTypes=Manöver
configuration=Konfiguration
chooseChart=Diagramm wählen
raceNameEmpty=Rennname leer
distanceTraveled=Zurückgelegte Strecke
velocityMadeGoodLong=Velocity Made Good
speedOverGroundLong=Speed Over Ground
gapToLeaderLong=Abstand zum führenden Boot
pointsToLoad=Zu ladende Punkte
speed=Geschwindigkeit
distance=Strecke
in=in
secondsUnit=s
metersUnit=m
failedToLoadRaceData=Renndaten konnten nicht geladen werden.
close=Schließen
compareCompetitors=Segler vergleichen
description=Beschreibung
sailNumber=Segelnummer
country=Land
no3LetterCodes=IOC 3-Buchstaben-Codes können nicht gefunden werden.
add=Hinzufügen
delete=Löschen
showCharts=Grafische Ansicht
raceWithThisNameAlreadyExists=Ein Rennen mit diesem Namen existiert schon.
raceWithThisNameAlreadyExistsInRegatta=Ein Rennen mit diesem Namen existiert schon in der Regatta.
headUp=anluven
bearAway=abfallen
tack=Wende
jibe=Halse
penaltyCircle=Strafkreis
markPassing=Tonnenpassierung
mark=Tonne
otherManeuver=Manövertyp unbekannt
douglasPeuckerPoints=Douglas-Peucker-Punkte
filterRacesByName=Rennen nach Name filtern
actionEdit=Ändern
actionEditScores=Punkte ändern
actionOpenBrowser=Im Browser öffnen
actionRemove=Entfernen
actionEditRaces=Rennen ändern
actionRaceEdit=Rennen ändern oder umbenennen
actionRaceUnlink=Rennverknüpfung entfernen
actionRaceRemove=Rennen entfernen
filterLeaderboardsByName=Ranglisten nach Name filtern
windwardDistanceToLeader=Windward distance to leader
actions=Aktionen
islinked=Verknüpft
yes=Ja
no=Nein
hoverOverAPoint=Für Details Maus über dem Graph positionieren
noSelection=Keine Selektion
raceIsKnownToStartUpwind=Rennen beginnt mit Kreuz
events=Rennen
settingsForComponent=Einstellungen für {0}
noEventsFound=Es wurden keine Rennen gefunden
noEventSelected=Kein Rennen ausgewählt
noLeaderboardsFound=Es wurden keine Ranglisten gefunden
searchEvents=Suche nach Rennen
location=Ort
from=Von
until=Bis
onlyLiveEvents=Nur Live-Rennen
locationNotAvailable=Ort nicht verfügbar
startDateNotAvailable=Startdatum nicht verfügbar
startDate=Startdatum
unknownManeuver=Unbekanntes Manöver
tailLengthMustBePositive=Die Schweiflänge muss größer als Null sein.
failedToLoadRaceInformation=Daten zur Wettfahrt konnten nicht geladen werden: {0}
competitorPassedMarkAtDate={0} passierte {1} um {2}
valueForCompetitorAt={0} um {1}: {2}
reallyRemoveRace=Möchten Sie das Rennen ''{0}'' wirklich entfernen?
showDetails=Details zeigen
hideLeaderboard=Rangliste ausblenden
hideLeaderboards=Ranglisten ausblenden
showLeaderboard=Rangliste zeigen
hideRaces=Rennen ausblenden
showMap=Karte zeigen
hideMap=Karte ausblenden
noLeaderboardSelected=Keine Rangliste ausgewählt
leaderboardGroups=Ranglisten-Gruppen
filterLeaderboardGroupsByName=Ranglisten-Gruppen nach Name filtern
createNewLeaderboardGroup=Neue Ranglisten-Gruppe erstellen
leaderboardGroupConfiguration=Ranglistengruppen-Konfiguration
legs=Schenkel
currentLeg=Aktueller Schenkel
leaderboardGroup=Ranglisten-Gruppe
pleaseEnterNonEmptyDescription=Bitte eine nicht-leere Beschreibung eingeben
groupWithThisNameAlreadyExists=Ranglisten-Gruppe mit diesem Namen existiert bereits
detailsOfLeaderboardGroup=Details der Ranglisten-Gruppe
edit=Bearbeiten
save=Speichern
abort=Abbrechen
noLeaderboardGroupWithNameFound=Keine Ranglisten-Gruppe mit dem Namen {0} gefunden
overview=Übersicht
welcomeToSailingAnalytics=Willkommen bei SAP Sailing Analytics
welcomeToSailingAnalyticsBody=Understanding what happens out on the race course isn''t always easy. To help solve this challenge and bring the excitement of sailing to the fans, we have developed a leader board based on SAP analytics.\
Through analyzing GPS data together with integrated wind measurements from sensors out on the race course, the leader board displays information such as in-race ranking, average speeds, distance travelled, ETA (estimated time of arrival at the next mark rounding), gaps to leader, gains and losses per leg.\
\
Check out the results for yourself to see who triumphed - and how they did it.
home=Startseite
clickAndDragToZoomIn=Anklicken und ziehen zum Hineinzoomen
windSpeed=Wind speed (sm/h)
allTimesInUTC=Alle Zeiten in UTC
autoZoomTo=Auto-Zoom nach
autoZoomToBoats=Booten
autoZoomToBuoys=Tonnen
autoZoomToWindSensors=Windsensoren
autoZoomOff=Aus
autoZoomToTails=Schweife
autoZoomSelectedCompetitors=Nur zu ausgewählten Seglern zoomen
bearing=Kurs über Grund
zoom=Zoom
stepSizeMustBeGreaterThanNull=Die Schrittweite muss größer als 0 sein
stepSizeInSeconds=Schrittweite in Sekunden
refreshInterval=Aktualisierungs-Interval (s)
refreshIntervalMustBeGreaterThanXSeconds=Aktualisierungs-Interval muss größer als {0} Sekunden sein
competitorCharts=Competitor charts
selectAtLeastOneCompetitor=Um die Segler-Diagramme anzeigen zu lassen, wähle mindestens einen Segler aus
directionChange=Richtungsänderung
speedChange=Geschwindigkeitsänderung
degreesShort=deg
untracked=Nicht verfolgt
delayForLiveMode=Verzögerung im Live-Modus:
notAvailable=Nicht verfügbar
details=Details
noGroupSelected=Keine Gruppe ausgewählt
combinedWindSourceTypeName=Kombiniert
courseBasedWindSourceTypeName=Kurslayout
trackBasedEstimationWindSourceTypeName=Schätzung
expeditionWindSourceTypeName=Messung
webWindSourceTypeName=Manuell
clickChartToSetTime=Klicke auf das Diagramm um die Zeit zu setzen
position=Position
windSourcesUsed=Benutzte Windquellen
errorTryingToUpdateWindSourcesToExclude=Fehler beim Aktualisieren der auszuschließenden Windquellen für Rennen {0}: {1}
feedback=Feedback
startStopPlaying=Starten/Stoppen des abspielens
backToLive=Zum Live-Zeitpunkte springen
slowPlaySpeedDown=Abspielgeschwindigkeit verlangsamen
speedPlaySpeedUp=Abspielgeschwindigkeit erhöhen
showHideComponent={0} anzeigen/verstecken
degreesBoatToTheWind=Winkel zum Wind
racesInLeaderboard=Rennen im Leaderboard
leaderboardsInGroup=Leaderboards in der Gruppe
replication=Replikation
errorFetchingReplicaData=Fehler beim Beschaffen der Replikationsdaten: {0}
averageCrossTrackErrorInMeters=\u2205 XTE
enterMaster=Hostname der Master-Instanz
errorStartingReplication=Fehler beim Starten der Replikation von Host {0} / Exchange {1}: {2}
helpLines=Hilfslinien
startLine=Startlinie
finishLine=Ziellinie
advantageLine=Führungslinie
courseMiddleLine=Kursmittellinie
messagingPortNumber=Messaging-Portnummer (0 für Default)
servletPortNumber=Servlet Portnummer
registeredAt=Registriert {0}
replicatingFromMaster=Repliziert von master {0}, Messaging Port {1}, Servlet Port {2}
showWindSpeedSeries=Daten für Windgeschwindigkeit zeigen
showWindDirectionSeries=Daten für Windrichtung zeigen
fleet=Flotte
boatClass=Bootsklasse
setDelayToLive=Verzögerung zu 'Live' setzen
pleaseEnterNonEmptyVenue=Bitte geben sie einen Veranstaltungsort ein.
eventWithThisNameAlreadyExists=Eine Veranstaltung mit diesem Namen existiert bereits.
venue=Veranstaltungsort
pleaseSelectABoatClass=Bitte wählen Sie eine Bootsklasse aus.
regattaWithThisNameAlreadyExists=Eine Regatta mit diesem Namen existiert bereits.
seriesWithThisNameAlreadyExists=Eine Serie mit diesem Namen existiert bereits.
series=Serie
fleetWithThisNameAlreadyExists=Eine Flotte mit diesem Namen existiert bereits.
fleets=Flotten
splitFleet=Aufteilung in Gruppen
color=Farbe
medalSeries=Medal Series
noColor=Keine Farbe
pleaseSelectARegatta=Bitte wählen Sie eine Regatta aus.
addFleet=Gruppe hinzufügen
doYouReallyWantToRemoveRegatta=Möchten Sie wirklich Regatta "{0}" löschen?
errorLoadingScoreCorrectionProviders=Fehler beim Laden der offiziellen Ergebnis-Dienste: {0}
selectResultListToImportFrom=Ergebnisliste auswählen
of=von
errorObtainingScoreCorrections=Fehler beim Laden der offiziellen Ergebnisse von Dienst {0} zu Veranstaltung {1} und Bootsklasse {2} veröffentlicht {3}: {4}
assignRaceNumbersToRaceColumns=Renn-Nummern den Ergebnisspalten zuordnen
importOfficialResults=Offizielle Ergebnisse importieren...
selectAll=Alle auswählen
apply=Übernehmen
successfullyUpdatedScores=Ergebnisse erfolgreich aktualisiert
errorUpdatingScoresForLeaderboard=Fehler beim Aktualisieren der Ergebnisse für {0}: {1}
maneuverTypesToShowWhenCompetitorIsClicked=Anzuzeigende Manövertypen für angeklickte Segler
simulateWithStartTimeNow=Simulieren mit "jetzt" als Startzeit
boatClassDoesNotMatchSelectedRegatta=Die ausgewählten Rennen enthalten eine Bootsklasse, die nicht der Bootsklasse der ausgewählten Regatta ''{0}'' entspricht.\n\
Willst du wirklich diese Regatta benutzen ''{1}''?
regattaExistForSelectedBoatClass=Es gibt mindestens eine Regatta zu den ausgewählten Bootsklassen.\
Willst du wirklich die Auswahl ''keine Regatta'' benutzen?
reload=Neu laden
addRegatta=Regatta hinzufügen...
exchangeName=Exchange Name
course=Kurs
courseLayout=Kursdefinition
buoy=Boje
gate=Tor
buoys=Bojen
waypoint=Wegpunkt
showAllCompetitors=Zeige alle Wettkampfteilnehmer
boatTails=Bootsschweif
maximalCount=Maximale Anzahl
maxVisibleCompetitorsCountMustBePositive=Die maximale Anzahl der sichtbaren Wettkampfteilnehmer muß größer als Null sein.
fregResultImportUrls=FREG URLs
errorRefreshingFregUrlList=Fehler beim Aktualisieren derFREG URL-Liste: {0}
successfullyUpdatedFregUrls=FREG URL-Liste erfolgreich aktualisiert
errorRemovingFregUrls=Fehler beim Löschen von FREG URLs: {0}
pleaseEnterNonEmptyUrl=Bitte eine nicht-leere URL eingeben
addFragUrl=FRAG Ergebnis-URL hinzufügen
errorAddingFragUrl=Fehler beim Hinzufügen einer FREG URL: {0}
errorTryingToObtainLeaderboardContents=Fehler beim Berechnen der Ergebnisliste: {0}
lastScoreUpdate=Letzte Ergebnisänderung
warningBrowserUnsupported=Diese Webseite ist für Ihren Browser nicht optimiert. Wir empfehlen den Firefox oder Chrome in der neuesten Version.
newMark=Neue Marke
controlPoint=Einzelmarke/Gate
errorUpdatingRaceCourse=Fehler beim Aktualisieren des neuen Kurses: {0}
successfullyUpdatedCourse=Kurs erfolgreich aktualisiert
selectOneMarkOrTwoMarksForGate=Eine einzelne Marke auswählen oder zwei Marken, um ein Gate zu erstellen
errorTryingToObtainTheMarksOfTheRace=Fehler beim Ermitteln der Marken des Regattakurses: {0}
errorTryingToObtainRaceCourse=Fehler beim Ermitteln des Rennkurses: {0}
insertWaypointBeforeSelected=Wegpunkt nach dem selektierten einfügen
insertWaypointAfterSelected=Wegpunkt vor dem selektierten einfügen
scoringSchemeLowPointSystem=Low Point System
scoringSchemeHighPointSystem=High Point System
scoringSchemeHighPointEssOverall=High Point System ESS Gesamtwertung
scoringSchemeHighPointLastBreaksTie=High Point System, letztes Rennen entscheidet bei Gleichstand
scoringSystem=Bepunktungssystem
createFlexibleLeaderboard=Flexible Rangliste anlegen
createRegattaLeaderboard=Rangliste für Regatta anlegen
editFlexibleLeaderboard=Flexible Rangliste ändern
editRegattaLeaderboard=Rangliste für Regatta ändern
noRegatta=Keine Regatta
useOverallLeaderboard=Overall-Ergebnisse anzeigen
overallStandings=Gesamtstand
type=Typ
actionAddRaces=Rennen hinzuf�gen
racesWithNamePrefix=Rennen mit Namens-Pr�fix
maximumSpeedOverGroundInKnots=Max FüG
totalTimeSailedDownwindInSeconds=Gesamtzeit Vorwind
totalTimeSailedUpwindInSeconds=Gesamtzeit Kreuz
totalTimeSailedReachingInSeconds=Gesamtzeit Holeschlag
totalTimeSailedInSeconds=Gesamtzeit
hhmmssUnit=hh:mm:ss
actionAddWindData=Winddaten hinzufügen
valueMustBeBetweenMinMax=Der Wert von ''{0}'' muß zwischen {1} und {2} sein.
optional=optional
pleaseEnterAValue=Bitte geben Sie einen Wert ein.
latitude=Breite
longitude=Länge
actionAddEvent=Veranstaltung hinzufügen
publicationUrl=URL für die Veröffentlichung
suppress=Entfernen
isPublic=Öffentlich zugänglich
suppress=Entfernen
unsuppress=Wieder hinzufügen
suppressedCompetitors=Unterdrückte Wettkampfteilnehmer
mediaPanel=Audio & Video
url=URL
mimeType=MIME Type
title=Titel
duration=Dauer (h:mm:ss.ms)
addMediaTrack=Audio/Video hinzufügen
addYoutubeTrack=Youtube hinzufügen
youtubeId=Youtube Id
reallyRemoveMediaTrack=Möchten Sie ''{0}'' wirklich entfernen?
pleaseSelectASeries=Bitte wählen Sie eine Serie aus
pleaseSelectARace=Bitte wählen Sie ein Rennen aus
displayGroupsInReverseOrder=Zeige die Gruppen in umgekehrter Reihenfolge
actionConfigureUrl=URL konfigurieren
configureLeaderboardUrlDescription=Ergebnisansicht konfigurieren. Die fertige URL kann dem Link entnommen werden.
embedded=Eingebettet
additionalUrlSettings=Weitere URL-relevante Einstellungen
restrictToSingleSelectedRace=Nur einzelnes ausgewähltes Rennen zeigen
expandSelectedRace=Details des ausgewähltes Rennens zeigen
showRaceDetails=Details anbieten
numberOfRaces=Anzahl Rennen
numberOfRacesMustBeNonNegativeNumber=Bitte Anzahl der anzuzeigenden letzten Rennen eingeben
chooseTheWayYouSelectRaces=Wie wollen die anzuzeigenden Rennen ausgewählt werden?
selectFromAllRaces=Aus allen Rennen auswählen
selectANumberOfRaces=Eine Anzahl anzuzeigender Rennen auswählen
numberOfLastNRaces=Anzahl der zu zeigenden aktuellsten Rennen
expandLastRace=Immer letztes gezeigtes Rennen expandieren
factor=Faktor
errorUpdatingIsMedalRace=Fehler beim Ändern der Medaillenrennen-Einstellung: {0}
maneuverLoss=Manöververlust
averageManeuverLossInMeters=\u2205 Manöververlust
averageTackLossInMeters=\u2205 Wendeverlust
averageJibeLossInMeters=\u2205 Halseverlust
shape=Form
pattern=Muster
legend=Legende
live=live
swissTimingArchiveConnector=SwissTiming Historische Veranstaltungen
errorFetchingRankingChartData=Fehler beim Laden der Daten für das Ranglisten-Chart: {0}
loadingCompetitorData=Lade Teilnehmer-Daten
rankNAfterRace=Rang {0} nach Rennen {1}
afterRace=nach Rennen
showRankChart=Rang-Diagramm anzeigen
overallLeaderboardSelection=Gesamtergebnisse
showOverallLeaderboardOnSamePage=Gesamtergebnisse auf derselben Seite anzeigen
errorTryingToObtainOverallLeaderboards=Fehler beim Laden der Gesamtergebnisse: {0}
finished=beendet
passedTo=an {0} gerundet
gapChangeSinceLegStartInSeconds=Gap Änderung
sideToWhichMarkAtLegStartWasRounded=Tonne gerundet an
raceIsLive=Rennen {0} ist live
helloWorld=Hello World
kielWeel2011=Kiel Week 2011
stgAccount=STG Account
tracTracEvents=TracTrac Events
swissTimingEvents=SwissTiming Events
trackedBefore=Historie verfolgter Events
listRaces=Rennen anzeigen
wind=Wind
windPanelLabel=This is the Wind Panel which so far is completely empty.
refresh=Aktualisieren
remove=Löschen
windSource=Windquelle
dampeningInterval=Mittelungsintervall
map=Karte
race=Wettfahrt
races=Wettfahrten
tracked=verfolgt
time=Zeit
timeTooltip=Zeit die der Teilnehmer auf diesem Schenkel gesegelt ist.
playSpeed=Abspielgeschwindigkeit
playSpeedHelp="1" für normale Abspielgeschwindigkeit, "2" für doppelte Geschwindigkeit usw.
playModeLive=Live
playModeReplay=Wiederholung
timeDelay=Verzögerung
timeDelayHelp=Leer für Wiedergabe zu beliebigen Zeitpunkten; Verzögerung des Datenstroms in Sekunden eingeben (z.B. "60" für eine Minute oder "0" für keine)
speedInKnots=Geschwindigkeit (sm/h)
fromDeg=aus (Grad)
noRacesYet=Bisher keine Wettfahrten
total=Gesamt
carry=übertr.
competitor=Wettkampfteilnehmner
competitors=Wettkampfteilnehmner
defaultLeaderboard=Alle Ergebnisse
noSuchLeaderboard=Rangliste nicht gefunden
leaderboardConfiguration=Ranglisten-Konfiguration
newDotDotDot=Neu...
editScores=Punktestand bearbeiten...
columnNamesInSelectedLeaderboard=Wettfahrten-Namen in der selektierten Rangliste
addDotDotDot=Hinzufügen...
renameDotDotDot=Umbenennen...
trackedRaceConnectedToSelectedRaceName=Wettfahrt verbunden mit dem selektierten Wettfahrt-Namen
linkToColumn=Verbindung mit Spalte
unlink=Unlink
leaderboardName=Name Rangliste
cancel=Abbrechen
pleaseEnterAName=Bitte geben Sie einen Namen ein.
discardRacesFromHowManyStartedRacesOn=Discard one more race starting with how many started races
leaderboardWithThisNameAlreadyExists=Eine Rangliste mit diesem Namen existiert bereits.
discardThresholdsMustBeNumeric=Discard thresholds must be numeric
discardThresholdsMustBeAscending=Discard thresholds must be ascending
discarding=Discarding
startingFromNumberOfRaces=Ab wievielen Rennen
renameLeaderboard=Rangliste umbenennen
addColumnToLeaderboard=Spalte zu Rangliste hinzufügen
pleaseEnterNameForNewRaceColumn=Namen für Renn-Spalten eingeben
ok=OK
medalRace=Medal Race
renameRace=Rennen umbenennen
openSelectedLeaderboard=Ausgewählte Rangliste öffnen
rank=Platz
rankTooltip=Platzierung des Teilnehmers.
totalRank=Gesamtplatz
collapse=-
expand=+
leg=L
distanceInMeters=Distanz
averageSpeedInKnots=\u2205 FüG
averageSpeedInKnotsTooltip=Die durchschnittliche Fahrt über Grund in diesem Schenkel,\berechnet durch die Division der gefahren Distanz und der benötigten Zeit.
raceAverageSpeedInKnotsTooltip=Die durchschnittliche Fahrt über Grund in diesem Rennen,\berechnet durch die Division der gefahren Distanz und der benötigten Zeit.
rankGain=Platz +/-
rankGainTooltip=Die Differenz zwischen der Platzierung des aktuellen und des letzten Schenkels.
sapSailingAnalytics=Sailing Analytics
leaderboard=Ergebnisse
leaderboards=Ranglistenlisten
leaderboardSettings=Einstellungen Rangliste
settings=Einstellungen (z.B. Abschnittdetails auswählen)
selectAtLeastOneLegDetail=Mindestens ein Detail auswählen
currentSpeedOverGroundInKnots=FüG
currentSpeedOverGroundInKnotsTooltip=Die aktuelle Fahrt über Grund.
estimatedTimeToNextWaypointInSeconds=ETA
estimatedTimeToNextWaypointInSecondsTooltip=Die vorraussichtliche Zeit, die der Teilnehmer benötigt,\num den nächsten Wegpunkt zu erreichen.
gapToLeaderInSeconds=Abstand zum Führenden
gapToLeaderInSecondsTooltip=Die Zeit die ein Teilnehmer bräuchte, um de Führenden zu erreichen.
velocityMadeGoodInKnots=VMG
velocityMadeGoodInKnotsTooltip=Die effektive Geschwindigkeit zum Ziel.
windwardDistanceToGoInMeters=Abstand in Windrichtung zur nächsten Tonne
windwardDistanceToGoInMetersTooltip=Windwärtige Distanz des Teilnehmerns zum Ende des Schenkels.
windwardDistanceToLeaderInMeters=Abstand zum führenden Boot
windwardDistanceToLeaderInMetersTooltip=Windwärtige Distanz des Teilnehmers zum Führenden.
name=Name
leaveEmptyForDefault=Leer für Standardeinstellung
trackNewEvent=Track New event
trackableRaces=Trackable Races
trackWind=Track Wind
regattaName=Name der Regatta
eventName=Event-Name
event=Rennen
startTime=Startzeit
regatta=Regatta
regattas=Regatten
startTracking=Tracking starten
stopTracking=Tracking stoppen
connections=Verbindungen
historyOfConnections=History of connections
defineNewConnection=Definiere eine neue Verbindung
trackedRaces=Tracked races
canSendRequests=Kann Anfragen senden
connectAndReadRaces=Verbinde und hole Wettfahrten
trackSettings=Track Einstellungen
ports=Ports
liveData=Live data
storedData=Stored data
uris=URIs
jsonUrl=JSON URL
livePort=Port Live Data
storedPort=Port Stored Data
liveUri=Live URI
storedUri=Stored URI
eventsConnectedTo=Momentan verfolgte Events
hostname=Hostname
declinationCheckbox=Windrichtung mit Missweisung korrigieren
raceStartTrackingColumn=Tracking Started
pauseAutomaticRefresh=Keine automatische Aktualisierung
autoRefresh=Automatisch aktualisieren
delayInSeconds=Verzögerung (s)
delayMustBeNonNegative=Die Verzögerung muß größer als 0 sein
delayBetweenAutoAdvances=Intervall zwischen Auto-Updates in Sekunden:
chooseUpdateIntervalOfAtLeastOneSecond=Update-Intervall mindestens eine Sekunde
errorSettingWindForRace=Error setting wind for race
errorFetchingWindInformationForRace=Error fetching wind information for race
errorWhileTryingToSetWindSourceForRace=Error while trying to set "wind starts upwind" flag
inEvent=in event
to=to
showEstimatedWind=Zeige den geschätzten Wind
timing=Timing
raceDetailsToShow=Renndetails
overallDetailsToShow=Regatta-Details
legDetailsToShow=Schenkeldetails
columnMoveUp=Hoch
columnMoveDown=Runter
port=Port
raceStartTimeColumn=Rennstart
showOnlySelectedCompetitors=Nur ausgewählte Teilnehmer anzeigen
showSelectedCompetitorsInfo=Infobox für ausgewählte Teilnehmer anzeigen
tailLength=Schweiflänge (s)
selectedRaces=Welche Rennen möchten Sie angezeigt bekommen?
lengthInSeconds=Länge (s)
stressTest=Stresstest
numberOfManeuvers=Manöver
numberOfManeuversTooltip=Die Anzahl der gesegelten Manöver in diesem Schenkel.
tacks=Wenden
jibes=Halsen
penaltyCircles=Strafkreise
medalRaceIsNull=Medaillenrennen nicht erlaubt
maneuverTypes=Manöver
configuration=Konfiguration
chooseChart=Diagramm wählen
raceNameEmpty=Rennname leer
distanceTraveled=Zurückgelegte Strecke
distanceTraveledTooltip=Die zurückgelegt Strecke vom Start des Schenkel, bis zum Ende\noder bis zum aktuellen Zeitpunkt, falls der Schenkel noch nicht beendet ist.
raceDistanceTraveledTooltip=Die zurückgelegt Strecke vom Start des Rennens, bis zum Ende\noder bis zum aktuellen Zeitpunkt, falls das Rennen noch nicht beendet ist.
velocityMadeGoodLong=Velocity Made Good
speedOverGroundLong=Speed Over Ground
gapToLeaderLong=Abstand zum führenden Boot
pointsToLoad=Zu ladende Punkte
speed=Geschwindigkeit
distance=Strecke
in=in
secondsUnit=s
metersUnit=m
failedToLoadRaceData=Renndaten konnten nicht geladen werden.
close=Schließen
compareCompetitors=Teilnehmer vergleichen
description=Beschreibung
sailNumber=Segelnummer
country=Land
no3LetterCodes=IOC 3-Buchstaben-Codes können nicht gefunden werden.
add=Hinzufügen
delete=Löschen
showCharts=Grafische Ansicht
raceWithThisNameAlreadyExists=Ein Rennen mit diesem Namen existiert schon.
raceWithThisNameAlreadyExistsInRegatta=Ein Rennen mit diesem Namen existiert schon in der Regatta.
headUp=anluven
bearAway=abfallen
tack=Wende
tackTooltip=Die Anzahl der gesegelten Wenden in diesem Rennen.
jibe=Halse
jibeTooltip=Die Anzahl der gesegelten Halsen in diesem Rennen.
penaltyCircle=Strafkreis
penaltyCircleTooltip=Die Anzahl der zu fahrenden Strafkreise in diesem Rennen.
markPassing=Tonnenpassierung
mark=Tonne
otherManeuver=Manövertyp unbekannt
douglasPeuckerPoints=Douglas-Peucker-Punkte
filterRacesByName=Rennen nach Name filtern
actionEdit=Ändern
actionEditScores=Punkte ändern
actionOpenBrowser=Im Browser öffnen
actionRemove=Entfernen
actionEditRaces=Rennen ändern
actionRaceEdit=Rennen ändern oder umbenennen
actionRaceUnlink=Rennverknüpfung entfernen
actionRaceRemove=Rennen entfernen
filterLeaderboardsByName=Ranglisten nach Name filtern
actions=Aktionen
islinked=Verknüpft
yes=Ja
no=Nein
hoverOverAPoint=Für Details Maus über dem Graph positionieren
noSelection=Keine Selektion
raceIsKnownToStartUpwind=Rennen beginnt mit Kreuz
events=Rennen
settingsForComponent=Einstellungen für {0}
noEventsFound=Es wurden keine Rennen gefunden
noEventSelected=Kein Rennen ausgewählt
noLeaderboardsFound=Es wurden keine Ranglisten gefunden
searchEvents=Suche nach Rennen
location=Ort
from=Von
until=Bis
onlyLiveEvents=Nur Live-Rennen
locationNotAvailable=Ort nicht verfügbar
startDateNotAvailable=Startdatum nicht verfügbar
startDate=Startdatum
unknownManeuver=Unbekanntes Manöver
tailLengthMustBePositive=Die Schweiflänge muss größer als Null sein.
failedToLoadRaceInformation=Daten zur Wettfahrt konnten nicht geladen werden: {0}
competitorPassedMarkAtDate={0} passierte {1} um {2}
valueForCompetitorAt={0} um {1}: {2}
reallyRemoveRace=Möchten Sie das Rennen ''{0}'' wirklich entfernen?
showDetails=Details zeigen
hideLeaderboard=Rangliste ausblenden
hideLeaderboards=Ranglisten ausblenden
showLeaderboard=Rangliste zeigen
hideRaces=Rennen ausblenden
showMap=Karte zeigen
hideMap=Karte ausblenden
noLeaderboardSelected=Keine Rangliste ausgewählt
leaderboardGroups=Ranglisten-Gruppen
filterLeaderboardGroupsByName=Ranglisten-Gruppen nach Name filtern
createNewLeaderboardGroup=Neue Ranglisten-Gruppe erstellen
leaderboardGroupConfiguration=Ranglistengruppen-Konfiguration
legs=Schenkel
currentLeg=Aktueller Schenkel
currentLegTooltip=Schenkel auf dem sich der Teilnehmer aktuell befindet.
leaderboardGroup=Ranglisten-Gruppe
pleaseEnterNonEmptyDescription=Bitte eine nicht-leere Beschreibung eingeben
groupWithThisNameAlreadyExists=Ranglisten-Gruppe mit diesem Namen existiert bereits
detailsOfLeaderboardGroup=Details der Ranglisten-Gruppe
edit=Bearbeiten
save=Speichern
abort=Abbrechen
noLeaderboardGroupWithNameFound=Keine Ranglisten-Gruppe mit dem Namen {0} gefunden
overview=Übersicht
welcomeToSailingAnalytics=Willkommen bei SAP Sailing Analytics
welcomeToSailingAnalyticsBody=Understanding what happens out on the race course isn''t always easy. To help solve this challenge and bring the excitement of sailing to the fans, we have developed a leader board based on SAP analytics.\
Through analyzing GPS data together with integrated wind measurements from sensors out on the race course, the leader board displays information such as in-race ranking, average speeds, distance travelled, ETA (estimated time of arrival at the next mark rounding), gaps to leader, gains and losses per leg.\
\
Check out the results for yourself to see who triumphed - and how they did it.
home=Startseite
clickAndDragToZoomIn=Anklicken und ziehen zum Hineinzoomen
windSpeed=Wind speed (sm/h)
allTimesInUTC=Alle Zeiten in UTC
autoZoomTo=Auto-Zoom nach
autoZoomToBoats=Booten
autoZoomToBuoys=Tonnen
autoZoomToWindSensors=Windsensoren
autoZoomOff=Aus
autoZoomToTails=Schweife
autoZoomSelectedCompetitors=Nur zu ausgewählten Teilnehmern zoomen
bearing=Kurs über Grund
zoom=Zoom
stepSizeMustBeGreaterThanNull=Die Schrittweite muss größer als 0 sein
stepSizeInSeconds=Schrittweite in Sekunden
refreshInterval=Aktualisierungs-Interval (s)
refreshIntervalMustBeGreaterThanXSeconds=Aktualisierungs-Interval muss größer als {0} Sekunden sein
competitorCharts=Competitor charts
selectAtLeastOneCompetitor=Um die Teilnehmer-Diagramme anzeigen zu lassen, wähle mindestens einen Teilnehmer aus
directionChange=Richtungsänderung
speedChange=Geschwindigkeitsänderung
degreesShort=deg
untracked=Nicht verfolgt
delayForLiveMode=Verzögerung im Live-Modus:
notAvailable=Nicht verfügbar
details=Details
noGroupSelected=Keine Gruppe ausgewählt
combinedWindSourceTypeName=Kombiniert
courseBasedWindSourceTypeName=Kurslayout
trackBasedEstimationWindSourceTypeName=Schätzung
expeditionWindSourceTypeName=Messung
webWindSourceTypeName=Manuell
clickChartToSetTime=Klicke auf das Diagramm um die Zeit zu setzen
position=Position
windSourcesUsed=Benutzte Windquellen
errorTryingToUpdateWindSourcesToExclude=Fehler beim Aktualisieren der auszuschließenden Windquellen für Rennen {0}: {1}
feedback=Feedback
startStopPlaying=Starten/Stoppen des abspielens
backToLive=Zum Live-Zeitpunkte springen
slowPlaySpeedDown=Abspielgeschwindigkeit verlangsamen
speedPlaySpeedUp=Abspielgeschwindigkeit erhöhen
showHideComponent={0} anzeigen/verstecken
degreesBoatToTheWind=Winkel zum Wind
racesInLeaderboard=Rennen im Leaderboard
leaderboardsInGroup=Leaderboards in der Gruppe
replication=Replikation
errorFetchingReplicaData=Fehler beim Beschaffen der Replikationsdaten: {0}
averageCrossTrackErrorInMeters=\u2205 XTE
averageCrossTrackErrorInMetersTooltip=Die durchschnittliche Querabweichung zur Kursmittellinie in diesem Schenkel.
raceAverageCrossTrackErrorInMetersTooltip=Die durchschnittliche Querabweichung zur Kursmittellinie in diesem Rennen.
enterMaster=Hostname der Master-Instanz
errorStartingReplication=Fehler beim Starten der Replikation von Host {0} / Exchange {1}: {2}
helpLines=Hilfslinien
startLine=Startlinie
finishLine=Ziellinie
advantageLine=Führungslinie
courseMiddleLine=Kursmittellinie
messagingPortNumber=Messaging-Portnummer (0 für Default)
servletPortNumber=Servlet Portnummer
registeredAt=Registriert {0}
replicatingFromMaster=Repliziert von master {0}, Messaging Port {1}, Servlet Port {2}
showWindSpeedSeries=Daten für Windgeschwindigkeit zeigen
showWindDirectionSeries=Daten für Windrichtung zeigen
fleet=Flotte
boatClass=Bootsklasse
setDelayToLive=Verzögerung zu 'Live' setzen
pleaseEnterNonEmptyVenue=Bitte geben sie einen Veranstaltungsort ein.
eventWithThisNameAlreadyExists=Eine Veranstaltung mit diesem Namen existiert bereits.
venue=Veranstaltungsort
pleaseSelectABoatClass=Bitte wählen Sie eine Bootsklasse aus.
regattaWithThisNameAlreadyExists=Eine Regatta mit diesem Namen existiert bereits.
seriesWithThisNameAlreadyExists=Eine Serie mit diesem Namen existiert bereits.
series=Serie
fleetWithThisNameAlreadyExists=Eine Flotte mit diesem Namen existiert bereits.
fleets=Flotten
splitFleet=Aufteilung in Gruppen
color=Farbe
medalSeries=Medal Series
noColor=Keine Farbe
pleaseSelectARegatta=Bitte wählen Sie eine Regatta aus.
addFleet=Gruppe hinzufügen
doYouReallyWantToRemoveRegatta=Möchten Sie wirklich Regatta "{0}" löschen?
errorLoadingScoreCorrectionProviders=Fehler beim Laden der offiziellen Ergebnis-Dienste: {0}
selectResultListToImportFrom=Ergebnisliste auswählen
of=von
errorObtainingScoreCorrections=Fehler beim Laden der offiziellen Ergebnisse von Dienst {0} zu Veranstaltung {1} und Bootsklasse {2} veröffentlicht {3}: {4}
assignRaceNumbersToRaceColumns=Renn-Nummern den Ergebnisspalten zuordnen
importOfficialResults=Offizielle Ergebnisse importieren...
selectAll=Alle auswählen
apply=Übernehmen
successfullyUpdatedScores=Ergebnisse erfolgreich aktualisiert
errorUpdatingScoresForLeaderboard=Fehler beim Aktualisieren der Ergebnisse für {0}: {1}
maneuverTypesToShowWhenCompetitorIsClicked=Anzuzeigende Manövertypen für angeklickte Teilnehmer
simulateWithStartTimeNow=Simulieren mit "jetzt" als Startzeit
boatClassDoesNotMatchSelectedRegatta=Die ausgewählten Rennen enthalten eine Bootsklasse, die nicht der Bootsklasse der ausgewählten Regatta ''{0}'' entspricht.\n\
Willst du wirklich diese Regatta benutzen ''{1}''?
regattaExistForSelectedBoatClass=Es gibt mindestens eine Regatta zu den ausgewählten Bootsklassen.\
Willst du wirklich die Auswahl ''keine Regatta'' benutzen?
reload=Neu laden
addRegatta=Regatta hinzufügen...
exchangeName=Exchange Name
course=Kurs
courseLayout=Kursdefinition
buoy=Boje
gate=Tor
buoys=Bojen
waypoint=Wegpunkt
showAllCompetitors=Zeige alle Wettkampfteilnehmer
boatTails=Bootsschweif
maximalCount=Maximale Anzahl
maxVisibleCompetitorsCountMustBePositive=Die maximale Anzahl der sichtbaren Wettkampfteilnehmer muß größer als Null sein.
fregResultImportUrls=FREG URLs
errorRefreshingFregUrlList=Fehler beim Aktualisieren derFREG URL-Liste: {0}
successfullyUpdatedFregUrls=FREG URL-Liste erfolgreich aktualisiert
errorRemovingFregUrls=Fehler beim Löschen von FREG URLs: {0}
pleaseEnterNonEmptyUrl=Bitte eine nicht-leere URL eingeben
addFragUrl=FRAG Ergebnis-URL hinzufügen
errorAddingFragUrl=Fehler beim Hinzufügen einer FREG URL: {0}
errorTryingToObtainLeaderboardContents=Fehler beim Berechnen der Ergebnisliste: {0}
lastScoreUpdate=Letzte Ergebnisänderung
warningBrowserUnsupported=Diese Webseite ist für Ihren Browser nicht optimiert. Wir empfehlen den Firefox oder Chrome in der neuesten Version.
newMark=Neue Marke
controlPoint=Einzelmarke/Gate
errorUpdatingRaceCourse=Fehler beim Aktualisieren des neuen Kurses: {0}
successfullyUpdatedCourse=Kurs erfolgreich aktualisiert
selectOneMarkOrTwoMarksForGate=Eine einzelne Marke auswählen oder zwei Marken, um ein Gate zu erstellen
errorTryingToObtainTheMarksOfTheRace=Fehler beim Ermitteln der Marken des Regattakurses: {0}
errorTryingToObtainRaceCourse=Fehler beim Ermitteln des Rennkurses: {0}
insertWaypointBeforeSelected=Wegpunkt nach dem selektierten einfügen
insertWaypointAfterSelected=Wegpunkt vor dem selektierten einfügen
scoringSchemeLowPointSystem=Low Point System
scoringSchemeHighPointSystem=High Point System
scoringSchemeHighPointEssOverall=High Point System ESS Gesamtwertung
scoringSchemeHighPointLastBreaksTie=High Point System, letztes Rennen entscheidet bei Gleichstand
scoringSystem=Bepunktungssystem
createFlexibleLeaderboard=Flexible Rangliste anlegen
createRegattaLeaderboard=Rangliste für Regatta anlegen
editFlexibleLeaderboard=Flexible Rangliste ändern
editRegattaLeaderboard=Rangliste für Regatta ändern
noRegatta=Keine Regatta
useOverallLeaderboard=Overall-Ergebnisse anzeigen
overallStandings=Gesamtstand
type=Typ
actionAddRaces=Rennen hinzuf�gen
racesWithNamePrefix=Rennen mit Namens-Pr�fix
maximumSpeedOverGroundInKnots=Max FüG
maximumSpeedOverGroundInKnotsTooltip=Die größte Fahrt über Grund, die in der Regatta gemessen wurde.
totalTimeSailedDownwindInSeconds=Gesamtzeit Vorwind
totalTimeSailedDownwindInSecondsTooltip=Gesamtzeit, die der Teilnehmer in der Regatta auf Vorwind gesegelt ist.
totalTimeSailedUpwindInSeconds=Gesamtzeit Kreuz
totalTimeSailedUpwindInSecondsTooltip=Gesamtzeit, die der Teilnehmer in der Regatta auf Kreuz gesegelt ist.
totalTimeSailedReachingInSeconds=Gesamtzeit Holeschlag
totalTimeSailedReachingInSecondsTooltip=Gesamtzeit, die der Teilnehmer in der Regatta auf Hohlschlägen gesegelt ist.
totalTimeSailedInSeconds=Gesamtzeit
totalTimeSailedInSecondsTooltip=Gesamtzeit, die der Teilnehmer für die Regatta gebraucht hat.
hhmmssUnit=hh:mm:ss
actionAddWindData=Winddaten hinzufügen
valueMustBeBetweenMinMax=Der Wert von ''{0}'' muß zwischen {1} und {2} sein.
optional=optional
pleaseEnterAValue=Bitte geben Sie einen Wert ein.
latitude=Breite
longitude=Länge
actionAddEvent=Veranstaltung hinzufügen
publicationUrl=URL für die Veröffentlichung
suppress=Entfernen
isPublic=Öffentlich zugänglich
suppress=Entfernen
unsuppress=Wieder hinzufügen
suppressedCompetitors=Unterdrückte Wettkampfteilnehmer
mediaPanel=Audio & Video
url=URL
mimeType=MIME Type
title=Titel
duration=Dauer (h:mm:ss.ms)
addMediaTrack=Audio/Video hinzufügen
addYoutubeTrack=Youtube hinzufügen
youtubeId=Youtube Id
reallyRemoveMediaTrack=Möchten Sie ''{0}'' wirklich entfernen?
pleaseSelectASeries=Bitte wählen Sie eine Serie aus
pleaseSelectARace=Bitte wählen Sie ein Rennen aus
displayGroupsInReverseOrder=Zeige die Gruppen in umgekehrter Reihenfolge
actionConfigureUrl=URL konfigurieren
configureLeaderboardUrlDescription=Ergebnisansicht konfigurieren. Die fertige URL kann dem Link entnommen werden.
embedded=Eingebettet
additionalUrlSettings=Weitere URL-relevante Einstellungen
restrictToSingleSelectedRace=Nur einzelnes ausgewähltes Rennen zeigen
expandSelectedRace=Details des ausgewähltes Rennens zeigen
showRaceDetails=Details anbieten
numberOfRaces=Anzahl Rennen
numberOfRacesMustBeNonNegativeNumber=Bitte Anzahl der anzuzeigenden letzten Rennen eingeben
chooseTheWayYouSelectRaces=Wie wollen die anzuzeigenden Rennen ausgewählt werden?
selectFromAllRaces=Aus allen Rennen auswählen
selectANumberOfRaces=Eine Anzahl anzuzeigender Rennen auswählen
numberOfLastNRaces=Anzahl der zu zeigenden aktuellsten Rennen
expandLastRace=Immer letztes gezeigtes Rennen expandieren
factor=Faktor
errorUpdatingIsMedalRace=Fehler beim Ändern der Medaillenrennen-Einstellung: {0}
maneuverLoss=Manöververlust
averageManeuverLossInMeters=\u2205 Manöververlust
averageManeuverLossInMetersTooltip=Der durchschnittliche Distanzverlust durch Manöver.
averageTackLossInMeters=\u2205 Wendeverlust
averageTackLossInMetersTooltip=Der durchschnittliche Distanzverlust durch Wenden.
averageJibeLossInMeters=\u2205 Halseverlust
averageJibeLossInMetersTooltip=Der durchschnittliche Distanzverlust durch Halsen.
shape=Form
pattern=Muster
legend=Legende
live=live
swissTimingArchiveConnector=SwissTiming Historische Veranstaltungen
errorFetchingRankingChartData=Fehler beim Laden der Daten für das Ranglisten-Chart: {0}
loadingCompetitorData=Lade Teilnehmer-Daten
rankNAfterRace=Rang {0} nach Rennen {1}
afterRace=nach Rennen
showRankChart=Rang-Diagramm anzeigen
overallLeaderboardSelection=Gesamtergebnisse
showOverallLeaderboardOnSamePage=Gesamtergebnisse auf derselben Seite anzeigen
errorTryingToObtainOverallLeaderboards=Fehler beim Laden der Gesamtergebnisse: {0}
finished=beendet
passedTo=an {0} gerundet
gapChangeSinceLegStartInSeconds=Gap Änderung
gapChangeSinceLegStartInSecondsTooltip=Die Änderung des Abstands zum Führenden seit dem letzten Schenkelstart.\nEine negative Zahl bedeutet, \
dass sich der Abstand verringert hat und eine positive Zahl bedeutet, dass er sich vergrößert hat.
sideToWhichMarkAtLegStartWasRounded=Tonne gerundet an
sideToWhichMarkAtLegStartWasRoundedTooltip=Seite zu der die Tonne am Schenkelsart gerundet wurde.
raceIsLive=Rennen {0} ist live
racesAreLive=Rennen {0} sind live
scoringSchemeHighPointFirstGetsTen=High Point System, Gewinner erhält 10 Punkte
scoringSchemeHighPointFirstGetsTen=High Point System, Gewinner erhält 10 Punkte
knotsUnit=kn
@@ -1,16 +1,14 @@
package com.sap.sailing.gwt.ui.leaderboard;
import com.google.gwt.i18n.client.NumberFormat;
import com.sap.sailing.domain.common.SortingOrder;
import com.sap.sailing.domain.common.DetailType;
import com.sap.sailing.gwt.ui.client.NumberFormatterFactory;
import com.sap.sailing.gwt.ui.shared.LeaderboardRowDTO;
public class AbstractTimeInHoursMinutesSecondsColumn extends FormattedDoubleLegDetailColumn {
public abstract class AbstractTimeInHoursMinutesSecondsColumn extends FormattedDoubleLegDetailColumn {
public AbstractTimeInHoursMinutesSecondsColumn(String title, String unit,
com.sap.sailing.gwt.ui.leaderboard.LegDetailColumn.LegDetailField<Double> field, int decimals, SortingOrder preferredSortingOrder,
String headerStyle, String columnStyle) {
super(title, unit, field, decimals, preferredSortingOrder, headerStyle, columnStyle);
protected AbstractTimeInHoursMinutesSecondsColumn(DetailType detailType, LegDetailField<Double> field, String headerStyle, String columnStyle) {
super(detailType, field, headerStyle, columnStyle);
}
@Override
@@ -5,7 +5,6 @@ import com.google.gwt.cell.client.TextCell;
import com.google.gwt.i18n.client.NumberFormat;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.sap.sailing.domain.common.DetailType;
import com.sap.sailing.domain.common.SortingOrder;
import com.sap.sailing.gwt.ui.client.DetailTypeFormatter;
import com.sap.sailing.gwt.ui.client.NumberFormatterFactory;
import com.sap.sailing.gwt.ui.shared.LeaderboardDTO;
@@ -25,15 +24,8 @@ public class FormattedDoubleLegDetailColumn extends LegDetailColumn<Double, Stri
* @param columnStyle
*/
public FormattedDoubleLegDetailColumn(DetailType detailType, LegDetailField<Double> field, String headerStyle, String columnStyle) {
this(DetailTypeFormatter.format(detailType), DetailTypeFormatter.getUnit(detailType).isEmpty() ? "" : "[" + DetailTypeFormatter.getUnit(detailType) + "]",
field, detailType.getPrecision(), detailType.getDefaultSortingOrder(), headerStyle, columnStyle);
}
public FormattedDoubleLegDetailColumn(String title, String unit,
com.sap.sailing.gwt.ui.leaderboard.LegDetailColumn.LegDetailField<Double> field, int decimals, SortingOrder preferredSortingOrder,
String headerStyle, String columnStyle) {
super(title, unit, field, new TextCell(), preferredSortingOrder, headerStyle, columnStyle);
formatter = NumberFormatterFactory.getDecimalFormat(decimals);
super(detailType, field, new TextCell(), headerStyle, columnStyle);
formatter = NumberFormatterFactory.getDecimalFormat(detailType.getPrecision());
this.minMaxRenderer = new MinMaxRenderer(this, getComparator());
}
@@ -20,11 +20,7 @@ public class KingOfTheDownwindColumn extends AbstractTimeInHoursMinutesSecondsCo
}
public KingOfTheDownwindColumn(StringMessages stringMessages, String headerStyle, String columnStyle) {
super(stringMessages.totalTimeSailedDownwindInSeconds(), "[" + stringMessages.hhmmssUnit() + "]",
new KingOfTheDownwindField(),
DetailType.TOTAL_TIME_SAILED_DOWNWIND_IN_SECONDS.getPrecision(),
DetailType.TOTAL_TIME_SAILED_DOWNWIND_IN_SECONDS.getDefaultSortingOrder(),
headerStyle, columnStyle);
super(DetailType.TOTAL_TIME_SAILED_DOWNWIND_IN_SECONDS, new KingOfTheDownwindField(), headerStyle, columnStyle);
}
}
@@ -20,10 +20,6 @@ public class KingOfTheReachingColumn extends AbstractTimeInHoursMinutesSecondsCo
}
public KingOfTheReachingColumn(StringMessages stringMessages, String headerStyle, String columnStyle) {
super(stringMessages.totalTimeSailedReachingInSeconds(), "[" + stringMessages.hhmmssUnit() + "]",
new KingOfTheReachingField(),
DetailType.TOTAL_TIME_SAILED_REACHING_IN_SECONDS.getPrecision(),
DetailType.TOTAL_TIME_SAILED_REACHING_IN_SECONDS.getDefaultSortingOrder(),
headerStyle, columnStyle);
super(DetailType.TOTAL_TIME_SAILED_REACHING_IN_SECONDS, new KingOfTheReachingField(), headerStyle, columnStyle);
}
}
@@ -20,11 +20,7 @@ public class KingOfTheUpwindColumn extends AbstractTimeInHoursMinutesSecondsColu
}
public KingOfTheUpwindColumn(StringMessages stringMessages, String headerStyle, String columnStyle) {
super(stringMessages.totalTimeSailedUpwindInSeconds(), "[" + stringMessages.hhmmssUnit() + "]",
new KingOfTheUpwindField(),
DetailType.TOTAL_TIME_SAILED_UPWIND_IN_SECONDS.getPrecision(),
DetailType.TOTAL_TIME_SAILED_UPWIND_IN_SECONDS.getDefaultSortingOrder(),
headerStyle, columnStyle);
super(DetailType.TOTAL_TIME_SAILED_UPWIND_IN_SECONDS, new KingOfTheUpwindField(), headerStyle, columnStyle);
}
}
@@ -138,9 +138,8 @@ public class LegColumn extends ExpandableSortableColumn<String> {
}
private class ManeuverCountLegDetailsColumn extends FormattedDoubleLegDetailColumn {
public ManeuverCountLegDetailsColumn(String title, String headerStyle, String columnStyle) {
super(title, /*unit*/null, /* field */ null, /* decimals */ 0, DetailType.NUMBER_OF_MANEUVERS.getDefaultSortingOrder(),
headerStyle, columnStyle);
public ManeuverCountLegDetailsColumn(String headerStyle, String columnStyle) {
super(DetailType.NUMBER_OF_MANEUVERS, null, headerStyle, columnStyle);
}
@Override
@@ -272,7 +271,7 @@ public class LegColumn extends ExpandableSortableColumn<String> {
result.put(DetailType.RANK_GAIN, new RankGainColumn(stringMessages.rankGain(), new RankGain(), detailHeaderStyle, detailColumnStyle));
result.put(DetailType.NUMBER_OF_MANEUVERS, new ManeuverCountLegDetailsColumn(stringMessages.numberOfManeuvers(), detailHeaderStyle, detailColumnStyle));
result.put(DetailType.NUMBER_OF_MANEUVERS, new ManeuverCountLegDetailsColumn(detailHeaderStyle, detailColumnStyle));
result.put(DetailType.TIME_TRAVELED,
new FormattedDoubleLegDetailColumn(DetailType.TIME_TRAVELED, new TimeTraveledInSeconds(), detailHeaderStyle, detailColumnStyle));
@@ -4,18 +4,23 @@ import com.google.gwt.cell.client.Cell;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.user.cellview.client.Header;
import com.google.gwt.user.cellview.client.SafeHtmlHeader;
import com.sap.sailing.domain.common.DetailType;
import com.sap.sailing.domain.common.InvertibleComparator;
import com.sap.sailing.domain.common.SortingOrder;
import com.sap.sailing.domain.common.impl.InvertibleComparatorAdapter;
import com.sap.sailing.gwt.ui.client.DetailTypeFormatter;
import com.sap.sailing.gwt.ui.shared.LeaderboardRowDTO;
public abstract class LegDetailColumn<FieldType extends Comparable<?>, RenderingType> extends
SortableColumn<LeaderboardRowDTO, RenderingType> {
private static final String HtmlConstantToInlineHeadersWithAndWithoutUnit = "&nbsp;";
private final String title;
private final LegDetailField<FieldType> field;
private final String headerStyle;
private final String columnStyle;
private final String unit;
private final String tooltip;
private SafeHtmlHeader header;
@@ -23,12 +28,12 @@ public abstract class LegDetailColumn<FieldType extends Comparable<?>, Rendering
T get(LeaderboardRowDTO row);
}
protected LegDetailColumn(String title, String unit, LegDetailField<FieldType> field, Cell<RenderingType> cell,
SortingOrder preferredSortingOrder, String headerStyle, String columnStyle) {
super(cell, preferredSortingOrder);
protected LegDetailColumn(DetailType detailType, LegDetailField<FieldType> field, Cell<RenderingType> cell, String headerStyle, String columnStyle) {
super(cell, detailType.getDefaultSortingOrder());
setHorizontalAlignment(ALIGN_CENTER);
this.title = title;
this.unit = unit;
this.title = DetailTypeFormatter.format(detailType);
this.unit = DetailTypeFormatter.getUnit(detailType).isEmpty() ? "" : "[" + DetailTypeFormatter.getUnit(detailType) + "]";
tooltip = DetailTypeFormatter.getTooltip(detailType);
this.field = field;
this.headerStyle = headerStyle;
this.columnStyle = columnStyle;
@@ -36,21 +41,16 @@ public abstract class LegDetailColumn<FieldType extends Comparable<?>, Rendering
}
private void InitializeHeader() {
//Code to add a tooltip to the title. Do NOT delete. This is saved to use it, after some refactorings are done.
// SafeHtmlBuilder builder = new SafeHtmlBuilder().appendHtmlConstant("<div title=\"Tooltip text.\">");
// builder.appendEscaped(title).appendHtmlConstant("<br>");
SafeHtmlBuilder builder = new SafeHtmlBuilder().appendEscaped(title).appendHtmlConstant("<br>");
if (unit == null) {
builder.appendHtmlConstant("&nbsp;");
SafeHtmlBuilder titleBuilder = new SafeHtmlBuilder().appendEscaped(title).appendHtmlConstant("<br>");
if (unit == null || unit.isEmpty()) {
titleBuilder.appendHtmlConstant(HtmlConstantToInlineHeadersWithAndWithoutUnit);
} else {
builder.appendEscaped(unit);
titleBuilder.appendEscaped(unit);
}
header = new SafeHtmlHeader(builder.toSafeHtml());
}
header = new SafeHtmlHeaderWithTooltip(titleBuilder.toSafeHtml(), tooltip);
}
protected String getTitle() {
protected String getTitle() {
return title;
}
@@ -13,7 +13,7 @@ public class RankGainColumn extends LegDetailColumn<Integer, Integer> {
private static final LeaderboardResources leaderboardResources = GWT.create(LeaderboardResources.class);
public RankGainColumn(String title, LegDetailField<Integer> field, String headerStyle, String columnStyle) {
super(title, null, field, new RankGainCell(), DetailType.RANK_GAIN.getDefaultSortingOrder(), headerStyle, columnStyle);
super(DetailType.RANK_GAIN, field, new RankGainCell(), headerStyle, columnStyle);
}
@Override
@@ -0,0 +1,27 @@
package com.sap.sailing.gwt.ui.leaderboard;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.user.cellview.client.SafeHtmlHeader;
public class SafeHtmlHeaderWithTooltip extends SafeHtmlHeader {
private static SafeHtml buildHeader(SafeHtml title, String tooltip) {
//Escaping the tooltip to be able, to add it in the div safely with standard string concatenation.
//If you try to append it with the SafeHtmlBuilder methods, an exception will be thrown (because of the unclosed div).
String safeTooltip = new SafeHtmlBuilder().appendEscaped(tooltip).toSafeHtml().asString();
return new SafeHtmlBuilder().appendHtmlConstant("<span title=\"" + safeTooltip + "\">")
.append(title).appendHtmlConstant("</ span>").toSafeHtml();
}
/**
* Creates a new html header with the given title and tooltip.<br>
* Use '\n', if you want a line break in the tooltip.
* @param title
* @param tooltip
*/
public SafeHtmlHeaderWithTooltip(SafeHtml title, String tooltip) {
super(buildHeader(title, tooltip));
}
}
@@ -7,8 +7,7 @@ import com.sap.sailing.gwt.ui.shared.LeaderboardRowDTO;
public class SideToWhichMarkAtLegStartWasRoundedColumn extends LegDetailColumn<Tack, String> {
public SideToWhichMarkAtLegStartWasRoundedColumn(String title, LegDetailField<Tack> field, String headerStyle, String columnStyle) {
super(title, null, field, new TextCell(), DetailType.SIDE_TO_WHICH_MARK_AT_LEG_START_WAS_ROUNDED.getDefaultSortingOrder(),
headerStyle, columnStyle);
super(DetailType.SIDE_TO_WHICH_MARK_AT_LEG_START_WAS_ROUNDED, field, new TextCell(), headerStyle, columnStyle);
}
@Override
@@ -52,9 +52,9 @@ public class ManeuverDTO implements IsSerializable {
+ ((int) this.directionChangeInDegrees) + " "+stringMessages.degreesShort()+" ("
+ ((int) before.bearingInDegrees) + " deg -> " + ((int) after.bearingInDegrees) + " "+stringMessages.degreesShort()+")";
String speedChange = stringMessages.speedChange() + ": "
+ NumberFormat.getDecimalFormat().format(after.speedInKnots - before.speedInKnots) + " "+stringMessages.averageSpeedInKnotsUnit()+" ("
+ NumberFormat.getDecimalFormat().format(before.speedInKnots) + " "+stringMessages.averageSpeedInKnotsUnit()+" -> "
+ NumberFormat.getDecimalFormat().format(after.speedInKnots) + " "+stringMessages.averageSpeedInKnotsUnit()+")";
+ NumberFormat.getDecimalFormat().format(after.speedInKnots - before.speedInKnots) + " "+stringMessages.knotsUnit()+" ("
+ NumberFormat.getDecimalFormat().format(before.speedInKnots) + " "+stringMessages.knotsUnit()+" -> "
+ NumberFormat.getDecimalFormat().format(after.speedInKnots) + " "+stringMessages.knotsUnit()+")";
String maneuverLoss = this.maneuverLossInMeters == null ? "" : ("; "+stringMessages.maneuverLoss()+": "+
NumberFormat.getDecimalFormat().format(this.maneuverLossInMeters)+"m");
String maneuverTitle = timeAndManeuver + "; " + directionChange + "; " + speedChange + maneuverLoss;
@@ -134,7 +134,7 @@ public class WindChart extends RaceChart implements Component<WindChartSettings>
return "<b>" + seriesName + (toolTipData.getPointName() != null ? " "+toolTipData.getPointName() : "")
+ "</b><br/>" +
dateFormat.format(new Date(toolTipData.getXAsLong())) + ": " +
numberFormat.format(toolTipData.getYAsDouble()) + stringMessages.averageSpeedInKnotsUnit();
numberFormat.format(toolTipData.getYAsDouble()) + stringMessages.knotsUnit();
}
}
}));
@@ -172,7 +172,7 @@ public class WindChart extends RaceChart implements Component<WindChartSettings>
}
}));
chart.getYAxis(1).setOpposite(true).setAxisTitleText(stringMessages.speed()+" ("+stringMessages.averageSpeedInKnotsUnit()+")")
chart.getYAxis(1).setOpposite(true).setAxisTitleText(stringMessages.speed()+" ("+stringMessages.knotsUnit()+")")
.setStartOnTick(false).setShowFirstLabel(false).setGridLineWidth(0).setMinorGridLineWidth(0);
if (compactChart) {
@@ -341,7 +341,7 @@ public class WindChart extends RaceChart implements Component<WindChartSettings>
timeOfLatestRequestInMillis == null || wind.requestTimepoint > timeOfLatestRequestInMillis) {
Point newDirectionPoint = new Point(wind.requestTimepoint, wind.dampenedTrueWindFromDeg);
if (wind.dampenedTrueWindSpeedInKnots != null) {
String name = numberFormat.format(wind.dampenedTrueWindSpeedInKnots)+ stringMessages.averageSpeedInKnotsUnit();
String name = numberFormat.format(wind.dampenedTrueWindSpeedInKnots)+ stringMessages.knotsUnit();
// name += " Confidence:" + wind.confidence;
newDirectionPoint.setName(name);
}
@@ -54,7 +54,7 @@ public class CombinedWindPanel extends FlowPanel {
String title = stringMessages.wind() + ": " + Math.round(windFromDeg) + " "
+ stringMessages.degreesShort() + " (" + WindSourceTypeFormatter.format(windSource, stringMessages) + ")";
canvas.setTitle(title);
textLabel.setText(numberFormat.format(speedInKnots) + " " + stringMessages.averageSpeedInKnotsUnit());
textLabel.setText(numberFormat.format(speedInKnots) + " " + stringMessages.knotsUnit());
if (!isVisible()) {
setVisible(true);
}
@@ -1096,7 +1096,7 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe
vPanel.add(createInfoWindowLabelAndValue(stringMessages.rank(), String.valueOf(rank)));
}
vPanel.add(createInfoWindowLabelAndValue(stringMessages.speed(),
NumberFormatterFactory.getDecimalFormat(1).format(lastFix.speedWithBearing.speedInKnots) + " "+stringMessages.averageSpeedInKnotsUnit()));
NumberFormatterFactory.getDecimalFormat(1).format(lastFix.speedWithBearing.speedInKnots) + " "+stringMessages.knotsUnit()));
vPanel.add(createInfoWindowLabelAndValue(stringMessages.bearing(), (int) lastFix.speedWithBearing.bearingInDegrees + " "+stringMessages.degreesShort()));
if (lastFix.wind != null) {
vPanel.add(createInfoWindowLabelAndValue(stringMessages.degreesBoatToTheWind(), (int) Math.abs(
@@ -73,7 +73,7 @@ public class WindSensorOverlay extends CanvasOverlay {
getPane().setWidgetPosition(getCanvas(), sensorPositionInPx.getX() - canvasWidth / 2, sensorPositionInPx.getY() - canvasHeight / 2);
String title = stringMessages.wind() + " ("+ WindSourceTypeFormatter.format(windSource, stringMessages) + "): ";
title += Math.round(windDTO.dampenedTrueWindFromDeg) + " " + stringMessages.degreesShort()+ ", ";
title += numberFormat.format(windDTO.dampenedTrueWindSpeedInKnots) + " " + stringMessages.averageSpeedInKnotsUnit();
title += numberFormat.format(windDTO.dampenedTrueWindSpeedInKnots) + " " + stringMessages.knotsUnit();
getCanvas().setTitle(title);
hasValidWind = true;
@@ -9,7 +9,7 @@ import org.openqa.selenium.WebDriver;
* @author
* D049941
*/
public class AbstractEntryPoint extends PageObject {
public class HostPage extends PageObject {
/**
* <p>Creates a new page object with the given web driver. In GWT an entry point is connected to a HTML page in
* which the code for the application is executed, whereby the page is represented by the web driver.</p>
@@ -17,7 +17,7 @@ public class AbstractEntryPoint extends PageObject {
* @param driver
* The web driver to use.
*/
public AbstractEntryPoint(WebDriver driver) {
public HostPage(WebDriver driver) {
super(driver);
}
@@ -59,22 +59,22 @@ public class PageObject {
/**
* <p>Creates a new page object with the given web driver. This constructor is equivalent to the two argument
* constructor whereby the web driver is also used as the search context for the page object.</p>
* constructor whereby the web driver is also used as the context for the page object.</p>
*
* @param driver
* The web driver which also acts as the search context to use.
* The web driver which also acts as the context to use.
*/
public PageObject(WebDriver driver) {
this(driver, driver);
}
/**
* <p>Creates a new page object with the given web driver and search context.</p>
* <p>Creates a new page object with the given web driver and context.</p>
*
* @param driver
* The web driver to use.
* @param context
* The search context to use.
* The context to use.
*/
public PageObject(WebDriver driver, SearchContext context) {
this.driver = driver;
@@ -86,14 +86,14 @@ public class PageObject {
/**
* <p>Verifies the page object. This method can be overwritten to check that the browser is on the correct page or
* that the provided search context represents the right element. The default implementation does nothing.</p>
* that the provided context represents the right element. The default implementation does nothing.</p>
*/
protected void verify() {
}
/**
* <p>Initialize the page object. The default implementation use a factory to lazily initialize the elements
* (annotated fields) of the page object using the timeout duration returned by {@link #initElements}. To get a
* (annotated fields) of the page object using the timeout duration returned by {@link #getTimeOut()}. To get a
* field lazily initialized you have to annotate the field either with {@link FindBy} or with {@link FindBys}.
* If the element never changes (that is, that the same instance in the DOM can always be used) it is also
* possible to use a cache for the lookup by using the annotation {@code CacheLookup} in addition.</p>
@@ -1,41 +0,0 @@
(function() {
function createNamespace(namespace) {
parts = namespace.split('.');
var base = window;
for(var i = 0; i < namespace.length; i++) {
base[parts[i]] = base[parts[i]] || {};
base = base[parts[i]];
}
return base; //return resulting namespace object
}
var namespace = createNamespace("org.openqa.selenium");
if(namespace.pendingCalls)
return;
namespace.pendingCalls = 0;
XMLHttpRequest.prototype.oldSend = XMLHttpRequest.prototype.send;
var newSend = function(data) {
var xhr = this;
namespace.pendingCalls++;
var callFinished = function() {
namespace.pendingCalls--;
};
xhr.addEventListener("abort", callFinished, false);
xhr.addEventListener("load", callFinished, false);
xhr.addEventListener("error", callFinished, false);
xhr.addEventListener("timeout", callFinished, false);
xhr.oldSend(data);
}
XMLHttpRequest.prototype.send = newSend;
}());
@@ -14,7 +14,7 @@ import com.sap.sailing.selenium.core.BySeleniumId;
import com.sap.sailing.selenium.core.ElementSearchConditions;
import com.sap.sailing.selenium.core.FindBy;
import com.sap.sailing.selenium.test.AbstractEntryPoint;
import com.sap.sailing.selenium.test.HostPage;
/**
* <p>The page object representing the administration console. The console consists of multiple tabs with its content
@@ -23,7 +23,7 @@ import com.sap.sailing.selenium.test.AbstractEntryPoint;
* @author
* D049941
*/
public class AdminConsolePage extends AbstractEntryPoint {
public class AdminConsolePage extends HostPage {
private static final String PAGE_TITLE = "SAP Sailing Analytics Administration Console"; //$NON-NLS-1$
private static final MessageFormat TAB_EXPRESSION = new MessageFormat(